forked from bartvdbraak/blender
309 lines
9.5 KiB
Python
309 lines
9.5 KiB
Python
|
#!BPY
|
||
|
|
||
|
""" Registration info for Blender menus:
|
||
|
Name: 'DirectX(.x)...'
|
||
|
Blender: 240
|
||
|
Group: 'Import'
|
||
|
|
||
|
Tip: 'Import from DirectX text file format format.'
|
||
|
"""
|
||
|
# DirectXImporter.py version 1.2
|
||
|
# Copyright (C) 2005 Arben OMARI -- omariarben@everyday.com
|
||
|
#
|
||
|
# This program is free software; you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU General Public License as published by
|
||
|
# the Free Software Foundation; either version 2 of the License, or
|
||
|
# (at your option) any later version.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
# GNU General Public License for more details.
|
||
|
|
||
|
# This script import meshes from DirectX text file format
|
||
|
|
||
|
# Grab the latest version here :www.omariben.too.it
|
||
|
|
||
|
import Blender
|
||
|
from Blender import NMesh,Object,Material,Texture,Image,Draw
|
||
|
|
||
|
|
||
|
class xImport:
|
||
|
def __init__(self, filename):
|
||
|
global my_path
|
||
|
self.file = open(filename, "r")
|
||
|
my_path = Blender.sys.dirname(filename)
|
||
|
self.lines = self.file.readlines()
|
||
|
|
||
|
def Import(self):
|
||
|
lines = self.lines
|
||
|
print "importing into Blender ..."
|
||
|
scene = Blender.Scene.getCurrent()
|
||
|
mesh = NMesh.GetRaw()
|
||
|
#Get the line of Texture Coords
|
||
|
nr_uv_ind = 0
|
||
|
for line_uv in lines:
|
||
|
l = line_uv.strip()
|
||
|
words = line_uv.split()
|
||
|
if l and words[0] == "MeshTextureCoords" :
|
||
|
nr_uv_ind = lines.index(line_uv)
|
||
|
|
||
|
|
||
|
|
||
|
#Get Materials
|
||
|
idx = 0
|
||
|
i = -1
|
||
|
mat_list = []
|
||
|
tex_list = []
|
||
|
for line_mat in lines:
|
||
|
i += 1
|
||
|
l = line_mat.strip()
|
||
|
words = line_mat.split()
|
||
|
if l and words[0] == "Material" :
|
||
|
idx += 1
|
||
|
self.writeMaterials(i, idx, mat_list, tex_list)
|
||
|
|
||
|
|
||
|
|
||
|
nr_fac_mat = 0
|
||
|
#Assign Materials
|
||
|
for line_m in lines:
|
||
|
l = line_m.strip()
|
||
|
words = line_m.split()
|
||
|
if l and words[0] == "MeshMaterialList" :
|
||
|
nr_fac_mat = lines.index(line_m) + 2
|
||
|
|
||
|
#Create The Mesh
|
||
|
for line in lines:
|
||
|
l = line.strip()
|
||
|
words = line.split()
|
||
|
if l and words[0] == "Mesh" :
|
||
|
nr_vr_ind = lines.index(line)
|
||
|
self.writeVertices(nr_vr_ind, mesh, nr_uv_ind, nr_fac_mat, tex_list)
|
||
|
|
||
|
|
||
|
NMesh.PutRaw(mesh,"Mesh",1)
|
||
|
mesh.setMaterials(mat_list)
|
||
|
mesh.update()
|
||
|
|
||
|
if nr_fac_mat :
|
||
|
self.writeMeshMaterials(nr_fac_mat, mesh)
|
||
|
|
||
|
self.file.close()
|
||
|
print "... finished"
|
||
|
|
||
|
#------------------------------------------------------------------------------
|
||
|
# CREATE THE MESH
|
||
|
#------------------------------------------------------------------------------
|
||
|
def writeVertices(self, nr_vr_ind, mesh, nr_uv, nr_fac_mat, tex_list):
|
||
|
|
||
|
lin = self.lines[nr_vr_ind + 1]
|
||
|
if lin :
|
||
|
lin_c = self.CleanLine(lin)
|
||
|
nr_vert = int((lin_c.split()[0]))
|
||
|
v_ind = self.lines.index(lin)
|
||
|
else :
|
||
|
lin = self.lines.index(nr_vr_ind + 2)
|
||
|
lin_c = self.CleanLine(lin)
|
||
|
nr_vert = int((lin_c.split()[0]))
|
||
|
v_ind = self.lines.index(lin)
|
||
|
|
||
|
vx_array = range(v_ind + 1, (v_ind + nr_vert +1))
|
||
|
#--------------------------------------------------
|
||
|
lin_f = self.lines[v_ind + nr_vert +1]
|
||
|
if lin_f :
|
||
|
lin_fc = self.CleanLine(lin_f)
|
||
|
nr_face = int((lin_fc.split()[0]))
|
||
|
nr_fac_li = self.lines.index(lin_f)
|
||
|
else :
|
||
|
lin_f = self.lines[v_ind + nr_vert +1]
|
||
|
lin_fc = self.CleanLine(lin_f)
|
||
|
nr_face = int((lin_fc.split()[0]))
|
||
|
nr_fac_li = self.lines.index(lin_f)
|
||
|
|
||
|
|
||
|
fac_array = range(nr_fac_li + 1, (nr_fac_li + nr_face + 1))
|
||
|
#Get Coordinates
|
||
|
for l in vx_array:
|
||
|
line_v = self.lines[l]
|
||
|
lin_v = self.CleanLine(line_v)
|
||
|
words = lin_v.split()
|
||
|
if len(words)==3:
|
||
|
co_vert_x = float(words[0])
|
||
|
co_vert_y = float(words[1])
|
||
|
co_vert_z = float(words[2])
|
||
|
v=NMesh.Vert(co_vert_x,co_vert_y,co_vert_z)
|
||
|
mesh.verts.append(v)
|
||
|
|
||
|
|
||
|
|
||
|
#Make Faces
|
||
|
i = 0
|
||
|
for f in fac_array:
|
||
|
i += 1
|
||
|
line_f = self.lines[f]
|
||
|
lin_f = self.CleanLine(line_f)
|
||
|
words = lin_f.split()
|
||
|
if len(words) == 5:
|
||
|
f=NMesh.Face()
|
||
|
f.v.append(mesh.verts[int(words[1])])
|
||
|
f.v.append(mesh.verts[int(words[2])])
|
||
|
f.v.append(mesh.verts[int(words[3])])
|
||
|
f.v.append(mesh.verts[int(words[4])])
|
||
|
mesh.faces.append(f)
|
||
|
if nr_uv :
|
||
|
uv = []
|
||
|
#---------------------------------
|
||
|
l1_uv = self.lines[nr_uv + 2 + int(words[1])]
|
||
|
fixed_l1_uv = self.CleanLine(l1_uv)
|
||
|
w1 = fixed_l1_uv.split()
|
||
|
uv_1 = (float(w1[0]), -float(w1[1]))
|
||
|
uv.append(uv_1)
|
||
|
#---------------------------------
|
||
|
l2_uv = self.lines[nr_uv + 2 + int(words[2])]
|
||
|
fixed_l2_uv = self.CleanLine(l2_uv)
|
||
|
w2 = fixed_l2_uv.split()
|
||
|
uv_2 = (float(w2[0]), -float(w2[1]))
|
||
|
uv.append(uv_2)
|
||
|
#---------------------------------
|
||
|
l3_uv = self.lines[nr_uv + 2 + int(words[3])]
|
||
|
fixed_l3_uv = self.CleanLine(l3_uv)
|
||
|
w3 = fixed_l3_uv.split()
|
||
|
uv_3 = (float(w3[0]), -float(w3[1]))
|
||
|
uv.append(uv_3)
|
||
|
#---------------------------------
|
||
|
l4_uv = self.lines[nr_uv + 2 + int(words[4])]
|
||
|
fixed_l4_uv = self.CleanLine(l4_uv)
|
||
|
w4 = fixed_l4_uv.split()
|
||
|
uv_4 = (float(w4[0]), -float(w4[1]))
|
||
|
uv.append(uv_4)
|
||
|
#---------------------------------
|
||
|
f.uv = uv
|
||
|
if nr_fac_mat :
|
||
|
fac_line = self.lines[nr_fac_mat + i]
|
||
|
fixed_fac = self.CleanLine(fac_line)
|
||
|
w_tex = int(fixed_fac.split()[0])
|
||
|
name_tex = tex_list[w_tex]
|
||
|
if name_tex :
|
||
|
name_file = Blender.sys.join(my_path,name_tex)
|
||
|
try:
|
||
|
img = Image.Load(name_file)
|
||
|
f.image = img
|
||
|
except:
|
||
|
#Draw.PupMenu("No image to load")
|
||
|
#print "No image " + name_tex + " to load"
|
||
|
pass
|
||
|
|
||
|
elif len(words) == 4:
|
||
|
f=NMesh.Face()
|
||
|
f.v.append(mesh.verts[int(words[1])])
|
||
|
f.v.append(mesh.verts[int(words[2])])
|
||
|
f.v.append(mesh.verts[int(words[3])])
|
||
|
mesh.faces.append(f)
|
||
|
if nr_uv :
|
||
|
uv = []
|
||
|
#---------------------------------
|
||
|
l1_uv = self.lines[nr_uv + 2 + int(words[1])]
|
||
|
fixed_l1_uv = self.CleanLine(l1_uv)
|
||
|
w1 = fixed_l1_uv.split()
|
||
|
uv_1 = (float(w1[0]), -float(w1[1]))
|
||
|
uv.append(uv_1)
|
||
|
#---------------------------------
|
||
|
l2_uv = self.lines[nr_uv + 2 + int(words[2])]
|
||
|
fixed_l2_uv = self.CleanLine(l2_uv)
|
||
|
w2 = fixed_l2_uv.split()
|
||
|
uv_2 = (float(w2[0]), -float(w2[1]))
|
||
|
uv.append(uv_2)
|
||
|
#---------------------------------
|
||
|
l3_uv = self.lines[nr_uv + 2 + int(words[3])]
|
||
|
fixed_l3_uv = self.CleanLine(l3_uv)
|
||
|
w3 = fixed_l3_uv.split()
|
||
|
uv_3 = (float(w3[0]), -float(w3[1]))
|
||
|
uv.append(uv_3)
|
||
|
#---------------------------------
|
||
|
f.uv = uv
|
||
|
if nr_fac_mat :
|
||
|
fac_line = self.lines[nr_fac_mat + i]
|
||
|
fixed_fac = self.CleanLine(fac_line)
|
||
|
w_tex = int(fixed_fac.split()[0])
|
||
|
name_tex = tex_list[w_tex]
|
||
|
if name_tex :
|
||
|
name_file = Blender.sys.join(my_path ,name_tex)
|
||
|
try:
|
||
|
img = Image.Load(name_file)
|
||
|
f.image = img
|
||
|
except:
|
||
|
#Draw.PupMenu("No image to load")
|
||
|
#print "No image " + name_tex + " to load"
|
||
|
pass
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def CleanLine(self,line):
|
||
|
fix_line = line.replace(";", " ")
|
||
|
fix_1_line = fix_line.replace('"', ' ')
|
||
|
fix_2_line = fix_1_line.replace("{", " ")
|
||
|
fix_3_line = fix_2_line.replace("}", " ")
|
||
|
fix_4_line = fix_3_line.replace(",", " ")
|
||
|
fix_5_line = fix_4_line.replace("'", " ")
|
||
|
return fix_5_line
|
||
|
|
||
|
#------------------------------------------------------------------
|
||
|
# CREATE MATERIALS
|
||
|
#------------------------------------------------------------------
|
||
|
def writeMaterials(self, nr_mat, idx, mat_list, tex_list):
|
||
|
name = "Material_" + str(idx)
|
||
|
mat = Material.New(name)
|
||
|
line = self.lines[nr_mat + 1]
|
||
|
fixed_line = self.CleanLine(line)
|
||
|
words = fixed_line.split()
|
||
|
mat.rgbCol = [float(words[0]),float(words[1]),float(words[2])]
|
||
|
mat.setAlpha(float(words[3]))
|
||
|
mat_list.append(mat)
|
||
|
l = self.lines[nr_mat + 5]
|
||
|
fix_3_line = self.CleanLine(l)
|
||
|
tex_n = fix_3_line.split()
|
||
|
|
||
|
if tex_n and tex_n[0] == "TextureFilename" :
|
||
|
|
||
|
if len(tex_n) > 1:
|
||
|
tex_list.append(tex_n[1])
|
||
|
|
||
|
if len(tex_n) <= 1 :
|
||
|
|
||
|
l_succ = self.lines[nr_mat + 6]
|
||
|
fix_3_succ = self.CleanLine(l_succ)
|
||
|
tex_n_succ = fix_3_succ.split()
|
||
|
tex_list.append(tex_n_succ[0])
|
||
|
else :
|
||
|
tex_name = None
|
||
|
tex_list.append(tex_name)
|
||
|
|
||
|
return mat_list, tex_list
|
||
|
#------------------------------------------------------------------
|
||
|
# SET MATERIALS
|
||
|
#------------------------------------------------------------------
|
||
|
def writeMeshMaterials(self, nr_fc_mat, mesh):
|
||
|
for face in mesh.faces:
|
||
|
nr_fc_mat += 1
|
||
|
line = self.lines[nr_fc_mat]
|
||
|
fixed_line = self.CleanLine(line)
|
||
|
wrd = fixed_line.split()
|
||
|
mat_idx = int(wrd[0])
|
||
|
face.materialIndex = mat_idx
|
||
|
mesh.update()
|
||
|
|
||
|
|
||
|
|
||
|
#------------------------------------------------------------------
|
||
|
# MAIN
|
||
|
#------------------------------------------------------------------
|
||
|
def my_callback(filename):
|
||
|
if not filename.find('.x', -2): print "Not an .x file"
|
||
|
ximport = xImport(filename)
|
||
|
ximport.Import()
|
||
|
|
||
|
arg = __script__['arg']
|
||
|
Blender.Window.FileSelector(my_callback, "Import DirectX")
|
||
|
|