Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Musgrove <LetterRip@gmail.com>2006-03-29 10:25:07 +0400
committerTom Musgrove <LetterRip@gmail.com>2006-03-29 10:25:07 +0400
commit0d2902b1fe50cd27f0046a4c0ecf140e6e1284a8 (patch)
treef6110fbfe04a692ef9ee076d21ecb7abe0bd1dd8
parentbb85e04a7e25ad64dd37deaa1fef31bd1100ec33 (diff)
==Directx 8 importer==
addition of a direct x importer by Ben Omari
-rw-r--r--release/scripts/DirectX8Importer.py309
1 files changed, 309 insertions, 0 deletions
diff --git a/release/scripts/DirectX8Importer.py b/release/scripts/DirectX8Importer.py
new file mode 100644
index 00000000000..b8ab465b26d
--- /dev/null
+++ b/release/scripts/DirectX8Importer.py
@@ -0,0 +1,309 @@
+#!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")
+ \ No newline at end of file