~ubuntu-branches/ubuntu/intrepid/blender/intrepid-updates

« back to all changes in this revision

Viewing changes to release/scripts/DirectX8Exporter.py

  • Committer: Bazaar Package Importer
  • Author(s): Cyril Brulebois
  • Date: 2008-08-08 02:45:40 UTC
  • mfrom: (12.1.14 intrepid)
  • Revision ID: james.westby@ubuntu.com-20080808024540-kkjp7ekfivzhuw3l
Tags: 2.46+dfsg-4
* Fix python syntax warning in import_dxf.py, which led to nasty output
  in installation/upgrade logs during byte-compilation, using a patch
  provided by the script author (Closes: #492280):
   - debian/patches/45_fix_python_syntax_warning

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!BPY
2
2
 
3
 
""" Registration info for Blender menus:
4
 
Name: 'DirectX(.x)...'
5
 
Blender: 242
6
 
Group: 'Export'
7
 
Tip: 'Export to DirectX text file format format.'
8
 
"""
9
 
__author__ = "Arben (Ben) Omari"
10
 
__url__ = ("blender", "elysiun", "Author's site, http://www.omariben.too.it")
 
3
"""
 
4
# Name: 'DirectX (.x)...'
 
5
# Blender: 242
 
6
# Group: 'Export'
 
7
# Tooltip: 'Export to DirectX text file format format for XNA Animation Component Library.'
 
8
"""
 
9
__author__ = "minahito (original:Arben (Ben) Omari)"
 
10
__url__ = ("blender", "blenderartists.org", "Adjuster's site http://sunday-lab.blogspot.com/, Author's site http://www.omariben.too.it")
11
11
__version__ = "3.0"
12
12
 
13
13
__bpydoc__ = """\
36
36
 
37
37
# Grab the latest version here :www.omariben.too.it
38
38
 
 
39
# [Notice]
 
40
# This script is the custom version of Mr.Arben Omari's great work.
 
41
# If you have a question about the adjusted part, visit http://sunday-lab.blogspot.com/.
 
42
 
39
43
import Blender
40
44
from Blender import Types, Object, NMesh, Material,Armature,Mesh
41
45
from Blender.Mathutils import *
61
65
toggle7_val = 0
62
66
anim_tick = Draw.Create(25)
63
67
 
 
68
#***********************************************
 
69
# DirectX file spec only allows letters, digits, and 
 
70
# underscore in Names.
 
71
#***********************************************
 
72
def make_legal_name(starting_name):
 
73
    new_name = starting_name.replace('.','_')
 
74
    new_name = new_name.replace(' ','_')
 
75
    if new_name[0].isdigit():
 
76
        new_name = '_' + new_name
 
77
    return new_name
64
78
 
65
79
#***********************************************
66
80
# MAIN
81
95
                        return
82
96
 
83
97
def button_event(evt): 
84
 
        global toggle_val,toggle1_val,toggle2_val,toggle3_val,toggle4_val,toggle5_val,toggle6_val,toggle7_val
 
98
        global toggle_val,toggle1_val,toggle2_val,toggle3_val,toggle4_val,toggle5_val,toggle6_val,toggle7_val
85
99
        global flip_z,swap_yz,flip_norm,anim,ticks,speed,no_light,Bl_norm,recalc_norm
86
100
        arg = __script__['arg']
87
 
        if evt == 1:
 
101
        if evt == 1:
88
102
                toggle_val = 1 - toggle_val
89
103
                anim = toggle_val
90
104
                Draw.Redraw(1)
256
270
                Draw.Text("http://www.omariben.too.it")
257
271
                glRasterPos2i(20,35)
258
272
                Draw.Text("aromar@tin.it")
259
 
                        
 
273
                
260
274
def rect(x,y,width,height):
261
275
                glBegin(GL_LINE_LOOP)
262
276
                glVertex2i(x,y)
278
292
Draw.Register(draw, event, button_event)
279
293
 
280
294
 
281
 
                
282
 
 
283
295
#***********************************************
284
296
#***********************************************
285
297
#                EXPORTER
296
308
        #***********************************************
297
309
        def analyzeScene(self):
298
310
                        parent_list = []
299
 
                        for obj in Blender.Scene.GetCurrent().getChildren(): #Object.Get():
300
 
                                mesh = obj.getData()
301
 
                                if type(mesh) == Types.ArmatureType or type(mesh) == Types.NMeshType or obj.getType() == "Empty":
302
 
                                        pare = obj.getParent()
303
 
                                        if pare == None :
 
311
                        for obj in Blender.Scene.GetCurrent().objects:
 
312
                                if obj.type in ('Mesh', 'Armature', 'Empty'):
 
313
                                        if obj.parent == None :
304
314
                                                parent_list.append(obj)
305
315
                                                
306
316
                        return parent_list
307
317
                
308
318
        def getChildren(self,obj):      
309
 
                children_list = []      
310
 
                for object in Blender.Scene.GetCurrent().getChildren(): #Object.Get():
311
 
                        pare = object.parent
312
 
                        if pare == obj :
313
 
                                children_list.append(object)
314
 
                return children_list
 
319
                obs = Blender.Scene.GetCurrent().objects
 
320
                return [ ob for ob in obs if ob.parent == obj ]
315
321
        
316
322
        def getArmChildren(self,obj):           
317
 
                for object in Blender.Scene.GetCurrent().getChildren(): #Object.Get():
318
 
                        pare = object.parent
319
 
                        if pare == obj :        
320
 
                                return object
321
 
                                
 
323
                for ob in Blender.Scene.GetCurrent().objects: #Object.Get():
 
324
                        if ob.parent == obj :
 
325
                                return ob
 
326
        
322
327
        def getLocMat(self, obj):
323
 
                pare = obj.getParent()
 
328
                pare = obj.parent
324
329
                mat = obj.matrixWorld
325
330
                mat_id = Matrix([1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1])
326
331
                if pare:
336
341
        def writeObjFrames(self,obj):
337
342
                global space,chld_obj,ch_list
338
343
                mesh = obj.getData()
339
 
                if obj.getType() == "Empty" :
 
344
                if obj.type == "Empty" :
340
345
                        mat = self.getLocMat(obj)
341
346
                        mat_c = Matrix(mat)
342
 
                        name = obj.name
343
 
                        name_f = name.replace(".","")
344
 
                        self.writeArmFrames(mat_c, name_f)
 
347
                        self.writeArmFrames(mat_c, make_legal_name(obj.name))
345
348
                if type(mesh) == Types.ArmatureType :
346
349
                        Child_obj = self.getArmChildren(obj)
347
350
                        chld_obj = obj
348
351
                        ch_list.append(Child_obj)
349
352
                        self.writeRootBone(obj, Child_obj)      
350
 
                if type(mesh) == Types.NMeshType and obj not in ch_list:
 
353
                if obj.type == 'Mesh' and obj not in ch_list:
351
354
                        self.exportMesh(obj)
352
355
                        
353
356
                        
391
394
                        self.writeObjFrames(obj)
392
395
                        ch_l = self.getChildren(obj)
393
396
                        for ch in ch_l:
394
 
                                if ch and ch.getType() == "Armature":
 
397
                        
 
398
                        
 
399
                                if ch and ch.type == "Armature":
395
400
                                        ch_list.append(ch)
396
401
                                        self.writeObjFrames(ch)
397
402
                                else :  
398
403
                                        self.writeChildObj(ch_l)
399
 
                        if obj.getType() != "Armature":
 
404
                        if obj.type != "Armature":
400
405
                                self.file.write("  }  // SI End of the Object %s \n" % (obj.name))      
401
406
                                
402
407
                                
403
408
                                
404
409
                self.file.write("}  // End of the Root Frame\n")                
405
410
                if anim :
406
 
                        self.file.write("AnimationSet {\n")
407
 
                        for obj in Blender.Scene.GetCurrent().getChildren(): #Object.Get():
408
 
                                
409
 
                                        mesh = obj.getData()
410
 
                                        if type(mesh) == Types.NMeshType or obj.getType() == "Empty":
411
 
                                                ip_list = obj.getIpo()
412
 
                                                if ip_list != None :
413
 
                                                        self.writeAnimationObj(obj)
414
 
                                        elif type(mesh) == Types.ArmatureType :
415
 
                                                act_list = obj.getAction()
416
 
                                                if act_list != None :
417
 
                                                        self.writeAnimation(obj)
418
 
                                                #ip_list = obj.getIpo()
419
 
                                                #if ip_list != None :
420
 
                                                #       self.writeAnimationObj(obj)
 
411
                        self.file.write("AnimationSet AnimationSet0 {\n")
 
412
                        for obj in Blender.Scene.GetCurrent().objects:
 
413
                                if obj.type in ('Mesh', 'Empty'):
 
414
                                        ip_list = obj.ipo
 
415
                                        if ip_list != None :
 
416
                                                self.writeAnimationObj(obj)
 
417
                                elif obj.type == 'Armature':
 
418
                                        act_list = obj.getAction()
 
419
                                        if act_list != None :
 
420
                                                self.writeAnimation(obj)
 
421
                                        #ip_list = obj.ipo
 
422
                                        #if ip_list != None :
 
423
                                        #       self.writeAnimationObj(obj)
421
424
 
422
425
                        self.file.write("} // End of Animation Set\n")
423
426
                self.writeEnd()
441
444
                self.writeMeshMaterialList(obj, mesh, tex)
442
445
                self.writeMeshNormals(obj, mesh)
443
446
                self.writeMeshTextureCoords(obj, mesh)
444
 
                self.file.write("  }  // End of the Frame %s \n" % (obj.name))
 
447
                self.file.write("  }  // End of the Mesh %s \n" % (obj.name))
445
448
                
446
449
                                        
447
450
        #***********************************************
454
457
                tex = []
455
458
                objs = Object.GetSelected()
456
459
                for obj in objs:
457
 
                        mesh = obj.getData()
458
 
                        if type(mesh) == Types.NMeshType :
 
460
                        if obj.type == 'Mesh':
 
461
                                mesh = obj.data
459
462
                                self.writeTextures(obj, tex)            
460
463
                                self.writeMeshcoordArm(obj, arm_ob = None)
461
464
                                self.writeMeshMaterialList(obj, mesh, tex)
466
469
                                ind = objs.index(obj)
467
470
                                if ind == len(objs)-1:
468
471
                                        self.file.write("}\n")
469
 
                                ip_list = obj.getIpo()
 
472
                                ip_list = obj.ipo
470
473
                                if ip_list != None :
471
 
                                        self.file.write("AnimationSet {\n")
 
474
                                        self.file.write("AnimationSet AnimationSet0 {\n")
472
475
                                        self.writeAnimationObj(obj)
473
476
                                        self.file.write("}\n")
474
477
                        else :
503
506
                                root_bon = bon
504
507
                space += 1
505
508
                mat_r = self.writeAnimCombineMatrix(root_bon,1)
506
 
                name_r = root_bon.name
507
 
                name_f = name_r.replace(".","")
508
 
                self.writeArmFrames(mat_r, name_f)
 
509
                self.writeArmFrames(mat_r, make_legal_name(root_bon.name))
 
510
                
509
511
                bon_c = root_bon.children
510
512
                self.writeChildren(bon_c)
511
513
                self.file.write("  }  // End of the Bone %s \n" % (root_bon.name))      
517
519
        def writeBon(self,bon):
518
520
                global space
519
521
                mat_r = self.writeAnimCombineMatrix(bon,1)
520
 
                name_r = bon.name
521
 
                name_f = name_r.replace(".","")
522
 
                self.writeArmFrames(mat_r, name_f)
 
522
                self.writeArmFrames(mat_r, make_legal_name(bon.name))
523
523
                
524
524
        
525
525
        def writeChildren(self,bon_c):
636
636
                        bo_list = []
637
637
                        weight_list = []
638
638
                        name = bo.name 
639
 
                        f_name = name.replace(".","")
 
639
                        f_name = make_legal_name(name)
640
640
                        try :
641
641
                                vert_list = mesh.getVertsFromGroup(name,1)
642
642
                                le = 0
780
780
                global index_list,flip_z
781
781
                #TransformMatrix
782
782
                mat = self.getLocMat(obj)
783
 
                name_f = obj.name.replace(".","")
784
 
                name_f = name_f.replace(" ","")
785
 
                self.writeArmFrames(mat, name_f)
 
783
                self.writeArmFrames(mat, make_legal_name(obj.name))
786
784
                mesh = NMesh.GetRawFromObject(obj.name)
787
785
                self.file.write("Mesh {\n")    
788
786
                numface=len(mesh.faces)
824
822
                coun,counter = 0, 0
825
823
                for face in mesh.faces :
826
824
                        coun += 1
 
825
                        separator = ','
827
826
                        if coun == numface:
828
 
                                if len(face.v) == 3:
829
 
                                        self.file.write("3; %d, %d, %d;;\n" % (counter + a3, counter + b3, counter + c3))
830
 
                                        counter += 3
831
 
                                elif len(face.v) == 4:
832
 
                                        self.file.write("4; %d, %d, %d, %d;;\n" % (counter + a4, counter + b4, counter + c4, counter + d4))
833
 
                                        counter += 4
834
 
                                elif len(face.v) < 3:
835
 
                                        print "WARNING:the mesh has faces with less then 3 vertices"
836
 
                                        print "        It my be not exported correctly."
837
 
                        else:
838
 
                                
839
 
                                if len(face.v) == 3:
840
 
                                        self.file.write("3; %d, %d, %d;,\n" % (counter + a3, counter + b3, counter + c3))
841
 
                                        counter += 3
842
 
                                elif len(face.v) == 4:
843
 
                                        self.file.write("4; %d, %d, %d, %d;,\n" % (counter + a4, counter + b4, counter + c4, counter + d4))
844
 
                                        counter += 4
845
 
                                elif len(face.v) < 3:
846
 
                                        print "WARNING:the mesh has faces with less then 3 vertices"
847
 
                                        print "        It my be not exported correctly."
 
827
                            separator = ';'
 
828
                        if len(face.v) == 3:
 
829
                                self.file.write("3; %d, %d, %d;%c\n" % (counter + a3, counter + b3, counter + c3, separator))
 
830
                                counter += 3
 
831
                        elif len(face.v) == 4:
 
832
                                self.file.write("4; %d, %d, %d, %d;%c\n" % (counter + a4, counter + b4, counter + c4, counter + d4, separator))
 
833
                                counter += 4
 
834
                        elif len(face.v) < 3:
 
835
                                print "WARNING:the mesh has faces with less then 3 vertices"
 
836
                                print "        It my be not exported correctly."
848
837
 
849
838
        
850
839
        #***********************************************
879
868
                ##MATERIAL NAME
880
869
                for mat in mesh.getMaterials():
881
870
                        self.file.write("  Material")
882
 
                        name_m = mat.name
883
 
                        name_f = name_m.replace(".","")
884
 
                        self.file.write(" %s "% (name_f))
 
871
                        self.file.write(" %s "% (make_legal_name(mat.name)))
885
872
                        self.file.write("{\n")
886
873
                        self.file.write("    %f; %f; %f;" % (mat.R, mat.G, mat.B))
887
874
                        self.file.write("%s;;\n" % (mat.alpha))
1090
1077
                for bon in arm.bones.values() :
1091
1078
                        point_list = []
1092
1079
                        name = bon.name
1093
 
                        name_f = name.replace(".", "")
 
1080
                        name_f = make_legal_name(name)
1094
1081
                        try :
1095
1082
                                ip_bon_channel = ip[bon.name]
1096
1083
                                ip_bon_name = ip_bon_channel.getName()
1142
1129
        #***********************************************
1143
1130
        def writeAnimationObj(self, obj):
1144
1131
                point_list = []
1145
 
                ip = obj.getIpo()
 
1132
                ip = obj.ipo
1146
1133
                poi = ip.getCurves()
1147
1134
                for po in poi[0].getPoints():
1148
1135
                        a = po.getPoints()
1149
1136
                        point_list.append(int(a[0]))
1150
1137
                
1151
 
                name = obj.name
1152
 
                name_f = name.replace(".", "")
1153
1138
                self.file.write(" Animation {\n")
1154
1139
                self.file.write("  { ")
1155
 
                self.file.write("%s }\n" % (name_f))
 
1140
                self.file.write("%s }\n" % (make_legal_name(obj.name)))
1156
1141
                self.file.write("   AnimationKey { \n")
1157
1142
                self.file.write("   4;\n")
1158
1143
                self.file.write("   %d; \n" % (len(point_list)))
1179
1164
 
1180
1165
 
1181
1166
        
1182
 
        
 
 
b'\\ No newline at end of file'
 
1167