diff options
author | Willian Padovani Germano <wpgermano@gmail.com> | 2006-01-29 22:17:53 +0300 |
---|---|---|
committer | Willian Padovani Germano <wpgermano@gmail.com> | 2006-01-29 22:17:53 +0300 |
commit | 4b01aa7aa57d144baf1739e4bcd65716f95dabfd (patch) | |
tree | 704a96276eab337b8be793cf1ba8679dcf7178dc /release/scripts/DirectX8Exporter.py | |
parent | 282fbcc763857cf5a6b81f65ddffd589462836b1 (diff) |
Scripts:
The orange -> HEAD merge reverted some scripts to older versions. This only
affected the ones that already existed before the orange branch.
Minor issue, easy to fix.
All in all, kudos to kaito, Hos and others for all the hard work in
bringing (coding, merging) all these changes to the main branch.
Diffstat (limited to 'release/scripts/DirectX8Exporter.py')
-rw-r--r-- | release/scripts/DirectX8Exporter.py | 307 |
1 files changed, 162 insertions, 145 deletions
diff --git a/release/scripts/DirectX8Exporter.py b/release/scripts/DirectX8Exporter.py index bfe6ccbdc88..0bb436ac86a 100644 --- a/release/scripts/DirectX8Exporter.py +++ b/release/scripts/DirectX8Exporter.py @@ -1,17 +1,16 @@ #!BPY """ Registration info for Blender menus: -Name: 'DirectX8(.x)...' -Blender: 239 +Name: 'DirectX(.x)...' +Blender: 240 Group: 'Export' Submenu: 'Export all the scene' export Submenu: 'Export selected obj' exportsel -Tip: 'Export to DirectX8 text file format format.' +Tip: 'Export to DirectX text file format format.' """ - __author__ = "Arben (Ben) Omari" __url__ = ("blender", "elysiun", "Author's site, http://www.omariben.too.it") -__version__ = "1.0" +__version__ = "2.0" __bpydoc__ = """\ This script exports a Blender mesh with armature to DirectX 8's text file @@ -21,8 +20,8 @@ Notes:<br> Check author's site or the elYsiun forum for a new beta version of the DX exporter. """ -# DirectX8Exporter.py version 1.0 -# Copyright (C) 2003 Arben OMARI -- omariarben@everyday.com +# DirectXExporter.py version 2.0 +# Copyright (C) 2006 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 @@ -42,10 +41,17 @@ DX exporter. import Blender from Blender import Types, Object, NMesh, Material,Armature from Blender.Mathutils import * +import math -global new_bon,mat_flip,index_list +global mat_flip,index_list,space,bone_list,mat_dict +bone_list =[] index_list = [] -new_bon = {} +mat_dict = {} +space = 0 +ANIM = 1 +NORMAL = 1 +TEXCOORDS = 1 +TEXTURE = 1 mat_flip = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]) @@ -64,6 +70,7 @@ class xExport: #Select Scene objects #*********************************************** def SelectObjs(self): + global chld_obj print "exporting..." self.writeHeader() for obj in Object.Get(): @@ -154,115 +161,117 @@ class xExport: #Export Root Bone #*********************************************** def writeRootBone(self,am_ob,child_obj): - global new_bon,mat_flip - space = 0 - arm = am_ob.getData() - Blender.Set('curframe',1) - mat_ob = mat_flip * am_ob.matrixWorld - self.writeArmFrames(mat_ob, "RootFrame", 0) - root_bon = arm.getBones() - mat_r = self.writeCombineMatrix(root_bon[0]) - name_r = root_bon[0].getName() - new_bon[name_r] = len(root_bon[0].getChildren()) - self.writeArmFrames(mat_r, name_r, 1) - self.writeListOfChildrens(root_bon[0],2,arm) - self.file.write("}\n") - self.exportMeshArm(arm,am_ob,child_obj) + global mat_flip,space,root_bon,mat_ob + arms = am_ob.getData() + self.writeArmFrames(mat_flip, "RootFrame") + for bon in arms.bones.values(): + if bon.hasParent(): + pass + else: + root_bon = bon + space += 1 + mat_rb = self.writeCombineMatrix(root_bon) + mat_r = mat_rb #* am_ob.matrixLocal + name_r = root_bon.name + name_f = name_r.replace(".","") + self.writeArmFrames(mat_r, name_f) + bon_c = self.findChildrens(root_bon) + self.writeChildren(bon_c) + self.file.write(" }\n") + self.exportMeshArm(arms,am_ob,child_obj) #*********************************************** - #Export Children Bones + #Create Children structure #*********************************************** - def writeListOfChildrens(self,bon,space,arm): - global new_bon - bon_c = bon.getChildren() - Blender.Set('curframe',1) - for n in range(len(bon_c)): - name_h = bon_c[n].getName() - chi_h = bon_c[n].getChildren() - new_bon[name_h] = len(chi_h) - - if bon_c == [] : - self.CloseBrackets(bon, new_bon, space, arm.getBones()[0]) + def writeBon(self,bon): + global space + mat_r = self.writeCombineMatrix(bon) + name_r = bon.name + name_f = name_r.replace(".","") + self.writeArmFrames(mat_r, name_f) - for nch in range(len(bon_c)): - mat = self.writeCombineMatrix(bon_c[nch]) - name_ch = bon_c[nch].getName() - self.writeArmFrames(mat, name_ch,space) - self.findChildrens(bon_c[nch],space,arm) + def findChildrens(self,bon): + bon_c = bon.children + return bon_c - #*********************************************** - #Create Children structure - #*********************************************** - def CloseBrackets(self, bon, new_bon, space, root_bon): + + def writeChildren(self,bon_c): + global space,bone_list + space += 1 + if bon_c: + for bo in bon_c: + if bo.name not in bone_list: + self.writeBon(bo) + bone_list.append(bo.name) + bo_c = bo.children + self.writeChildren(bo_c) + self.closeBrackets() + + + + def closeBrackets(self): + global space + space = space-1 tab = " " - self.file.write("%s" % (tab * (space -1))) + self.file.write("%s" % (tab * space)) self.file.write("}\n") - while bon.hasParent(): - if new_bon[bon.getName()] == 0: - pare = bon.getParent() - name_p = pare.getName() - if new_bon[name_p] > 0: - new_bon[name_p] = new_bon[name_p] - 1 - if new_bon[name_p] == 0 and pare != root_bon: - self.file.write("%s" % (tab * (space-2))) - self.file.write("}\n") - space = space - 1 - bon = pare - else: - break + #*********************************************** - #Create Children structure - #*********************************************** - def findChildrens(self,bon_c,space,arm): - bon_cc = bon_c - space += 1 - self.writeListOfChildrens(bon_cc,space,arm) - - - #*********************************************** #Offset Matrix #*********************************************** def writeMatrixOffset(self,bon): - Blender.Set('curframe',1) - mat_b = bon.getRestMatrix() - mat_b.invert() + global chld_obj + Blender.Set('curframe', 1) + pose = chld_obj.getPose() + pos_b = pose.bones[bon.name] + mat_b = pos_b.poseMatrix + mat_b.invert() return mat_b - - #*********************************************** #Combine Matrix #*********************************************** def writeCombineMatrix(self,bon): - Blender.Set('curframe',1) - mat_b = bon.getRestMatrix() + global chld_obj + Blender.Set('curframe', 1) + pose = chld_obj.getPose() + pos_b = pose.bones[bon.name] + mat_b = pos_b.poseMatrix if bon.hasParent(): - pare = bon.getParent() - mat_p = pare.getRestMatrix() - else : + pare = bon.parent + pos_p = pose.bones[pare.name] + mat_p = pos_p.poseMatrix + + else: mat_p = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]) mat_p.invert() - mat_rb = mat_b * mat_p - return mat_rb - + mat_f = mat_b * mat_p + + return mat_f #*********************************************** #Combine Matrix #*********************************************** - def writeCombineAnimMatrix(self,bon): - - mat_b = bon.getRestMatrix() + def writeAnimCombineMatrix(self,bon,fre): + global chld_obj + Blender.Set('curframe', fre) + pose = chld_obj.getPose() + pos_b = pose.bones[bon.name] + mat_b = pos_b.poseMatrix if bon.hasParent(): - pare = bon.getParent() - mat_p = pare.getRestMatrix() - else : + pare = bon.parent + pos_p = pose.bones[pare.name] + mat_p = pos_p.poseMatrix + + else: mat_p = Matrix([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]) mat_p.invert() - mat_rb = mat_b * mat_p - return mat_rb + mat_f = mat_b * mat_p + + return mat_f #********************************************************************************************************************************************* @@ -271,16 +280,23 @@ class xExport: #*********************************************** def writeSkinWeights(self, arm, mesh): global index_list - + v_dict = {} Blender.Set('curframe',1) self.file.write(" XSkinMeshHeader {\n") max_infl = 0 - for bo in arm.getBones() : - name = bo.getName() + #this part supply the missing getVertexInfluences(index) + for v in index_list: + v_dict[v] = [] + for bo in arm.bones.values() : + name = bo.name + try : vertx_list = mesh.getVertsFromGroup(name,1) + for vn in vertx_list: + v_dict[vn[0]].append(name) + #--------------------------------------------------- for inde in vertx_list : - vert_infl = mesh.getVertexInfluences(inde[0]) + vert_infl = v_dict[inde[0]] ln_infl = len(vert_infl) if ln_infl > max_infl : max_infl = ln_infl @@ -288,20 +304,21 @@ class xExport: except: pass - self.file.write(" %s; \n" % (max_infl)) - self.file.write(" %s; \n" % (max_infl * 3)) - self.file.write(" %s; \n" % (len(arm.getBones()))) + self.file.write(" %d; \n" % (max_infl)) + self.file.write(" %d; \n" % (max_infl * 3)) + self.file.write(" %d; \n" % (len(arm.bones.values()))) self.file.write(" }\n") - for bo in arm.getBones() : + for bo in arm.bones.values() : bo_list = [] weight_list = [] - name = bo.getName() + name = bo.name + f_name = name.replace(".","") try : vert_list = mesh.getVertsFromGroup(name,1) le = 0 for indx in vert_list: - ver_infl = mesh.getVertexInfluences(indx[0]) + ver_infl = v_dict[indx[0]] len_infl = float(len(ver_infl)) infl = 1 / len_infl i = -1 @@ -314,28 +331,27 @@ class xExport: self.file.write(" SkinWeights {\n") - self.file.write(' "%s"; \n' % (name)) - self.file.write(' %s; \n' % (le)) + self.file.write(' "%s"; \n' % (f_name)) + self.file.write(' %d; \n' % (le)) count = 0 for ind in bo_list : count += 1 if count == len(bo_list): - self.file.write(" %s; \n" % (ind)) + self.file.write(" %d; \n" % (ind)) else : - self.file.write(" %s, \n" % (ind)) + self.file.write(" %d, \n" % (ind)) cou = 0 for wegh in weight_list : cou += 1 if cou == len(weight_list): - self.file.write(" %s; \n" % (round(wegh,6))) + self.file.write(" %f; \n" % (round(wegh,6))) else : - self.file.write(" %s, \n" % (round(wegh,6))) + self.file.write(" %f, \n" % (round(wegh,6))) matx = self.writeMatrixOffset(bo) - - self.writeOffsFrames(matx, name, 1) + self.writeOffsFrames(matx, name) except : pass self.file.write(" }\n") @@ -344,7 +360,8 @@ class xExport: #*********************************************** # Write Matrices #*********************************************** - def writeArmFrames(self, matx, name, space): + def writeArmFrames(self, matx, name): + global space tab = " " self.file.write("%s" % (tab * space)) self.file.write("Frame ") @@ -352,16 +369,16 @@ class xExport: self.file.write("%s" % (tab * space)) self.file.write(" FrameTransformMatrix {\n") self.file.write("%s" % (tab * space)) - self.file.write(" %s,%s,%s,%s,\n" % + self.file.write(" %f,%f,%f,%f,\n" % (round(matx[0][0],4),round(matx[0][1],4),round(matx[0][2],4),round(matx[0][3],4))) self.file.write("%s" % (tab * space)) - self.file.write(" %s,%s,%s,%s,\n" % + self.file.write(" %f,%f,%f,%f,\n" % (round(matx[1][0],4),round(matx[1][1],4),round(matx[1][2],4),round(matx[1][3],4))) self.file.write("%s" % (tab * space)) - self.file.write(" %s,%s,%s,%s,\n" % + self.file.write(" %f,%f,%f,%f,\n" % (round(matx[2][0],4),round(matx[2][1],4),round(matx[2][2],4),round(matx[2][3],4))) self.file.write("%s" % (tab * space)) - self.file.write(" %s,%s,%s,%s;;\n" % + self.file.write(" %f,%f,%f,%f;;\n" % (round(matx[3][0],4),round(matx[3][1],4),round(matx[3][2],4),round(matx[3][3],6))) self.file.write("%s" % (tab * space)) self.file.write(" }\n") @@ -369,19 +386,20 @@ class xExport: #*********************************************** # Write Matrices #*********************************************** - def writeOffsFrames(self, matx, name, space): + def writeOffsFrames(self, matx, name): + space = 1 tab = " " self.file.write("%s" % (tab * space)) - self.file.write(" %s,%s,%s,%s,\n" % + self.file.write(" %f,%f,%f,%f,\n" % (round(matx[0][0],4),round(matx[0][1],4),round(matx[0][2],4),round(matx[0][3],4))) self.file.write("%s" % (tab * space)) - self.file.write(" %s,%s,%s,%s,\n" % + self.file.write(" %f,%f,%f,%f,\n" % (round(matx[1][0],4),round(matx[1][1],4),round(matx[1][2],4),round(matx[1][3],4))) self.file.write("%s" % (tab * space)) - self.file.write(" %s,%s,%s,%s,\n" % + self.file.write(" %f,%f,%f,%f,\n" % (round(matx[2][0],4),round(matx[2][1],4),round(matx[2][2],4),round(matx[2][3],4))) self.file.write("%s" % (tab * space)) - self.file.write(" %s,%s,%s,%s;;\n" % + self.file.write(" %f,%f,%f,%f;;\n" % (round(matx[3][0],4),round(matx[3][1],4),round(matx[3][2],4),round(matx[3][3],6))) self.file.write("%s" % (tab * space)) self.file.write(" }\n") @@ -445,7 +463,8 @@ template SkinWeights {\n\ mat_ob.invert() mat = mat_arm * mat_ob mat.invert() - self.writeArmFrames(mat, name.name, 1) + name_f = name.name.replace(".","") + self.writeArmFrames(mat, name_f) mesh = NMesh.GetRawFromObject(name.name) self.file.write("Mesh {\n") numface=len(mesh.faces) @@ -461,8 +480,8 @@ template SkinWeights {\n\ for n in range(len(face.v)): index_list.append(face.v[n].index) vec_vert = Vector([face.v[n].co[0], face.v[n].co[1], face.v[n].co[2], 1]) - f_vec_vert = VecMultMat(vec_vert, mat) - self.file.write("%s; %s; %s;" % (f_vec_vert[0], f_vec_vert[1], f_vec_vert[2])) + f_vec_vert = vec_vert * mat + self.file.write("%f; %f; %f;" % (round(f_vec_vert[0],4), round(f_vec_vert[1],4), round(f_vec_vert[2],4))) if counter == numface : if n == len(face.v)-1 : self.file.write(";\n") @@ -505,7 +524,8 @@ template SkinWeights {\n\ global index_list #ROTATION mat_ob = mat_flip * name.matrixWorld - self.writeArmFrames(mat_ob, name.name, 0) + name_f = name.name.replace(".","") + self.writeArmFrames(mat_ob, name_f) self.file.write("Mesh {\n") numface=len(mesh.faces) @@ -589,10 +609,9 @@ template SkinWeights {\n\ ##MATERIAL NAME for mat in Material.Get(): self.file.write(" Material") - for a in range(0,len(mat.name)): - if mat.name[a] == ".": - print "WARNING:the material " + mat.name + " contains '.' within.Many viewers may refuse to read the exported file" - self.file.write(" %s "% (mat.name)) + name_m = mat.name + name_f = name_m.replace(".","") + self.file.write(" %s "% (name_f)) self.file.write("{\n") self.file.write(" %s; %s; %s;" % (mat.R, mat.G, mat.B)) self.file.write("%s;;\n" % (mat.alpha)) @@ -609,7 +628,7 @@ template SkinWeights {\n\ self.file.write(" 1.0;\n") self.file.write(" 1.0; 1.0; 1.0;;\n") self.file.write(" 0.0; 0.0; 0.0;;\n") - self.file.write(" TextureFilename {\n") + self.file.write(" TextureFilename {") self.file.write(' "%s" ;'% (mat)) self.file.write(" }\n") self.file.write(" }\n") @@ -711,47 +730,45 @@ template SkinWeights {\n\ - + + #*********************************************** #WRITE ANIMATION KEYS #*********************************************** def writeAnimation(self,arm_ob): + global mat_dict arm = arm_ob.getData() act_list = arm_ob.getAction() ip = act_list.getAllChannelIpos() - for bon in arm.getBones() : + for bon in arm.bones.values() : point_list = [] + name = bon.name + name_f = name.replace(".", "") try : ip_bon_channel = ip[bon.name] ip_bon_name = ip_bon_channel.getName() - + ip_bon = Blender.Ipo.Get(ip_bon_name) poi = ip_bon.getCurves() + for po in poi[3].getPoints(): a = po.getPoints() point_list.append(int(a[0])) - point_list.pop(0) - - + #point_list.pop(0) + self.file.write(" Animation { \n") - self.file.write(" {%s}\n" %(bon.getName())) + self.file.write(" {%s}\n" %(name_f)) self.file.write(" AnimationKey { \n") self.file.write(" 4;\n") - self.file.write(" %s; \n" % (len(point_list)+1)) - - self.file.write(" %s;" % (1)) - self.file.write("16;") - mat = self.writeCombineMatrix(bon) - self.writeFrames(mat) - self.file.write(",\n") + self.file.write(" %s; \n" % (len(point_list))) for fr in point_list: + mat = self.writeAnimCombineMatrix(bon,fr) + self.file.write(" %s;" % (fr)) self.file.write("16;") - Blender.Set('curframe',fr) - mat_new = self.writeCombineAnimMatrix(bon) - self.writeFrames(mat_new) + self.writeFrames(mat) if fr == point_list[len(point_list)-1]: self.file.write(";\n") @@ -864,8 +881,8 @@ arg = __script__['arg'] if arg == 'exportsel': fname = Blender.sys.makename(ext = ".x") - Blender.Window.FileSelector(my_callback_sel, "Export DirectX8", fname) + Blender.Window.FileSelector(my_callback_sel, "Export DirectX", fname) else: fname = Blender.sys.makename(ext = ".x") - Blender.Window.FileSelector(my_callback, "Export DirectX8", fname) - + Blender.Window.FileSelector(my_callback, "Export DirectX", fname) +
\ No newline at end of file |