diff options
author | Juan Linietsky <reduzio@gmail.com> | 2014-10-09 22:41:52 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2014-10-09 22:41:52 -0300 |
commit | ede3a4dd3546d3d9d9de5570e2d68dfdf8139bab (patch) | |
tree | bea052fe017181509059f237932e564c7af581a4 /tools/export/blender25 | |
parent | 01ffe6cf89ee0ca32222f6993a2f8e3c872ce0b5 (diff) |
-compatibility fixes, Better Collada is ready for PRIME TIME!
Diffstat (limited to 'tools/export/blender25')
-rw-r--r-- | tools/export/blender25/io_scene_dae/__init__.py | 6 | ||||
-rw-r--r-- | tools/export/blender25/io_scene_dae/export_dae.py | 187 |
2 files changed, 102 insertions, 91 deletions
diff --git a/tools/export/blender25/io_scene_dae/__init__.py b/tools/export/blender25/io_scene_dae/__init__.py index 8d6f6b4976..d0d286211e 100644 --- a/tools/export/blender25/io_scene_dae/__init__.py +++ b/tools/export/blender25/io_scene_dae/__init__.py @@ -131,11 +131,7 @@ class ExportDAE(bpy.types.Operator, ExportHelper): default=True, options={'HIDDEN'}, ) - export_shapekeys = BoolProperty( - name="Export Shape Keys", - default=False, - ) - + @property def check_extension(self): return True#return self.batch_mode == 'OFF' diff --git a/tools/export/blender25/io_scene_dae/export_dae.py b/tools/export/blender25/io_scene_dae/export_dae.py index 9c104901f5..cc5865080b 100644 --- a/tools/export/blender25/io_scene_dae/export_dae.py +++ b/tools/export/blender25/io_scene_dae/export_dae.py @@ -51,12 +51,14 @@ S_IMGS=1 S_FX=2 S_MATS=3 S_GEOM=4 -S_CONT=5 -S_CAMS=6 -S_LAMPS=7 -S_ANIM_CLIPS=8 -S_NODES=9 -S_ANIM=10 +S_MORPH=5 +S_SKIN=6 +S_CONT=7 +S_CAMS=8 +S_LAMPS=9 +S_ANIM_CLIPS=10 +S_NODES=11 +S_ANIM=12 CMP_EPSILON=0.0001 @@ -286,9 +288,9 @@ class DaeExporter: self.writel(S_FX,5,'</transparency>') - self.writel(S_FX,5,'<index_of_refraction>'+str(material.specular_ior)+'</index_of_refraction>') self.writel(S_FX,4,'</'+shtype+'>') + self.writel(S_FX,4,'<index_of_refraction>'+str(material.specular_ior)+'</index_of_refraction>') self.writel(S_FX,4,'<extra>') self.writel(S_FX,5,'<technique profile="FCOLLADA">') @@ -373,14 +375,14 @@ class DaeExporter: node.active_shape_key_index = 0 - self.writel(S_CONT,1,'<controller id="'+mid+'" name="">') + self.writel(S_MORPH,1,'<controller id="'+mid+'" name="">') #if ("skin_id" in morph_targets[0]): - # self.writel(S_CONT,2,'<morph source="#'+morph_targets[0]["skin_id"]+'" method="NORMALIZED">') + # self.writel(S_MORPH,2,'<morph source="#'+morph_targets[0]["skin_id"]+'" method="NORMALIZED">') #else: - self.writel(S_CONT,2,'<morph source="#'+morph_targets[0]["id"]+'" method="NORMALIZED">') + self.writel(S_MORPH,2,'<morph source="#'+morph_targets[0]["id"]+'" method="NORMALIZED">') - self.writel(S_CONT,3,'<source id="'+mid+'-morph-targets">') - self.writel(S_CONT,4,'<IDREF_array id="'+mid+'-morph-targets-array" count="'+str(len(morph_targets)-1)+'">') + self.writel(S_MORPH,3,'<source id="'+mid+'-morph-targets">') + self.writel(S_MORPH,4,'<IDREF_array id="'+mid+'-morph-targets-array" count="'+str(len(morph_targets)-1)+'">') marr="" warr="" for i in range(len(morph_targets)): @@ -396,32 +398,32 @@ class DaeExporter: warr+=" 0" - self.writel(S_CONT,5,marr) - self.writel(S_CONT,4,'</IDREF_array>') - self.writel(S_CONT,4,'<technique_common>') - self.writel(S_CONT,5,'<accessor source="#'+mid+'-morph-targets-array" count="'+str(len(morph_targets)-1)+'" stride="1">') - self.writel(S_CONT,6,'<param name="MORPH_TARGET" type="IDREF"/>') - self.writel(S_CONT,5,'</accessor>') - self.writel(S_CONT,4,'</technique_common>') - self.writel(S_CONT,3,'</source>') - - self.writel(S_CONT,3,'<source id="'+mid+'-morph-weights">') - self.writel(S_CONT,4,'<float_array id="'+mid+'-morph-weights-array" count="'+str(len(morph_targets)-1)+'" >') - self.writel(S_CONT,5,warr) - self.writel(S_CONT,4,'</float_array>') - self.writel(S_CONT,4,'<technique_common>') - self.writel(S_CONT,5,'<accessor source="#'+mid+'-morph-weights-array" count="'+str(len(morph_targets)-1)+'" stride="1">') - self.writel(S_CONT,6,'<param name="MORPH_WEIGHT" type="float"/>') - self.writel(S_CONT,5,'</accessor>') - self.writel(S_CONT,4,'</technique_common>') - self.writel(S_CONT,3,'</source>') - - self.writel(S_CONT,3,'<targets>') - self.writel(S_CONT,4,'<input semantic="MORPH_TARGET" source="#'+mid+'-morph-targets"/>') - self.writel(S_CONT,4,'<input semantic="MORPH_WEIGHT" source="#'+mid+'-morph-weights"/>') - self.writel(S_CONT,3,'</targets>') - self.writel(S_CONT,2,'</morph>') - self.writel(S_CONT,1,'</controller>') + self.writel(S_MORPH,5,marr) + self.writel(S_MORPH,4,'</IDREF_array>') + self.writel(S_MORPH,4,'<technique_common>') + self.writel(S_MORPH,5,'<accessor source="#'+mid+'-morph-targets-array" count="'+str(len(morph_targets)-1)+'" stride="1">') + self.writel(S_MORPH,6,'<param name="MORPH_TARGET" type="IDREF"/>') + self.writel(S_MORPH,5,'</accessor>') + self.writel(S_MORPH,4,'</technique_common>') + self.writel(S_MORPH,3,'</source>') + + self.writel(S_MORPH,3,'<source id="'+mid+'-morph-weights">') + self.writel(S_MORPH,4,'<float_array id="'+mid+'-morph-weights-array" count="'+str(len(morph_targets)-1)+'" >') + self.writel(S_MORPH,5,warr) + self.writel(S_MORPH,4,'</float_array>') + self.writel(S_MORPH,4,'<technique_common>') + self.writel(S_MORPH,5,'<accessor source="#'+mid+'-morph-weights-array" count="'+str(len(morph_targets)-1)+'" stride="1">') + self.writel(S_MORPH,6,'<param name="MORPH_WEIGHT" type="float"/>') + self.writel(S_MORPH,5,'</accessor>') + self.writel(S_MORPH,4,'</technique_common>') + self.writel(S_MORPH,3,'</source>') + + self.writel(S_MORPH,3,'<targets>') + self.writel(S_MORPH,4,'<input semantic="MORPH_TARGET" source="#'+mid+'-morph-targets"/>') + self.writel(S_MORPH,4,'<input semantic="MORPH_WEIGHT" source="#'+mid+'-morph-weights"/>') + self.writel(S_MORPH,3,'</targets>') + self.writel(S_MORPH,2,'</morph>') + self.writel(S_MORPH,1,'</controller>') if (armature!=None): self.armature_for_morph[node]=armature @@ -655,41 +657,41 @@ class DaeExporter: contid = self.new_id("controller") - self.writel(S_CONT,1,'<controller id="'+contid+'">') + self.writel(S_SKIN,1,'<controller id="'+contid+'">') if (skel_source!=None): - self.writel(S_CONT,2,'<skin source="'+skel_source+'">') + self.writel(S_SKIN,2,'<skin source="#'+skel_source+'">') else: - self.writel(S_CONT,2,'<skin source="'+meshid+'">') + self.writel(S_SKIN,2,'<skin source="#'+meshid+'">') - self.writel(S_CONT,3,'<bind_shape_matrix>'+strmtx(node.matrix_world)+'</bind_shape_matrix>') + self.writel(S_SKIN,3,'<bind_shape_matrix>'+strmtx(node.matrix_world)+'</bind_shape_matrix>') #Joint Names - self.writel(S_CONT,3,'<source id="'+contid+'-joints">') + self.writel(S_SKIN,3,'<source id="'+contid+'-joints">') name_values="" for v in si["bone_names"]: name_values+=" "+v - self.writel(S_CONT,4,'<Name_array id="'+contid+'-joints-array" count="'+str(len(si["bone_names"]))+'">'+name_values+'</Name_array>') - self.writel(S_CONT,4,'<technique_common>') - self.writel(S_CONT,4,'<accessor source="#'+contid+'-joints-array" count="'+str(len(si["bone_names"]))+'" stride="1">') - self.writel(S_CONT,5,'<param name="JOINT" type="Name"/>') - self.writel(S_CONT,4,'</accessor>') - self.writel(S_CONT,4,'</technique_common>') - self.writel(S_CONT,3,'</source>') + self.writel(S_SKIN,4,'<Name_array id="'+contid+'-joints-array" count="'+str(len(si["bone_names"]))+'">'+name_values+'</Name_array>') + self.writel(S_SKIN,4,'<technique_common>') + self.writel(S_SKIN,4,'<accessor source="#'+contid+'-joints-array" count="'+str(len(si["bone_names"]))+'" stride="1">') + self.writel(S_SKIN,5,'<param name="JOINT" type="Name"/>') + self.writel(S_SKIN,4,'</accessor>') + self.writel(S_SKIN,4,'</technique_common>') + self.writel(S_SKIN,3,'</source>') #Pose Matrices! - self.writel(S_CONT,3,'<source id="'+contid+'-bind_poses">') + self.writel(S_SKIN,3,'<source id="'+contid+'-bind_poses">') pose_values="" for v in si["bone_bind_poses"]: pose_values+=" "+strmtx(v) - self.writel(S_CONT,4,'<float_array id="'+contid+'-bind_poses-array" count="'+str(len(si["bone_bind_poses"])*16)+'">'+pose_values+'</float_array>') - self.writel(S_CONT,4,'<technique_common>') - self.writel(S_CONT,4,'<accessor source="#'+contid+'-bind_poses-array" count="'+str(len(si["bone_bind_poses"]))+'" stride="16">') - self.writel(S_CONT,5,'<param name="TRANSFORM" type="float4x4"/>') - self.writel(S_CONT,4,'</accessor>') - self.writel(S_CONT,4,'</technique_common>') - self.writel(S_CONT,3,'</source>') + self.writel(S_SKIN,4,'<float_array id="'+contid+'-bind_poses-array" count="'+str(len(si["bone_bind_poses"])*16)+'">'+pose_values+'</float_array>') + self.writel(S_SKIN,4,'<technique_common>') + self.writel(S_SKIN,4,'<accessor source="#'+contid+'-bind_poses-array" count="'+str(len(si["bone_bind_poses"]))+'" stride="16">') + self.writel(S_SKIN,5,'<param name="TRANSFORM" type="float4x4"/>') + self.writel(S_SKIN,4,'</accessor>') + self.writel(S_SKIN,4,'</technique_common>') + self.writel(S_SKIN,3,'</source>') #Skin Weights! - self.writel(S_CONT,3,'<source id="'+contid+'-skin_weights">') + self.writel(S_SKIN,3,'<source id="'+contid+'-skin_weights">') skin_weights="" skin_weights_total=0 for v in vertices: @@ -697,22 +699,22 @@ class DaeExporter: for w in v.weights: skin_weights+=" "+str(w) - self.writel(S_CONT,4,'<float_array id="'+contid+'-skin_weights-array" count="'+str(skin_weights_total)+'">'+skin_weights+'</float_array>') - self.writel(S_CONT,4,'<technique_common>') - self.writel(S_CONT,4,'<accessor source="#'+contid+'-skin_weights-array" count="'+str(skin_weights_total)+'" stride="1">') - self.writel(S_CONT,5,'<param name="WEIGHT" type="float"/>') - self.writel(S_CONT,4,'</accessor>') - self.writel(S_CONT,4,'</technique_common>') - self.writel(S_CONT,3,'</source>') - - - self.writel(S_CONT,3,'<joints>') - self.writel(S_CONT,4,'<input semantic="JOINT" source="#'+contid+'-joints"/>') - self.writel(S_CONT,4,'<input semantic="INV_BIND_MATRIX" source="#'+contid+'-bind_poses"/>') - self.writel(S_CONT,3,'</joints>') - self.writel(S_CONT,3,'<vertex_weights count="'+str(len(vertices))+'">') - self.writel(S_CONT,4,'<input semantic="JOINT" source="#'+contid+'-joints" offset="0"/>') - self.writel(S_CONT,4,'<input semantic="WEIGHT" source="#'+contid+'-skin_weights" offset="1"/>') + self.writel(S_SKIN,4,'<float_array id="'+contid+'-skin_weights-array" count="'+str(skin_weights_total)+'">'+skin_weights+'</float_array>') + self.writel(S_SKIN,4,'<technique_common>') + self.writel(S_SKIN,4,'<accessor source="#'+contid+'-skin_weights-array" count="'+str(skin_weights_total)+'" stride="1">') + self.writel(S_SKIN,5,'<param name="WEIGHT" type="float"/>') + self.writel(S_SKIN,4,'</accessor>') + self.writel(S_SKIN,4,'</technique_common>') + self.writel(S_SKIN,3,'</source>') + + + self.writel(S_SKIN,3,'<joints>') + self.writel(S_SKIN,4,'<input semantic="JOINT" source="#'+contid+'-joints"/>') + self.writel(S_SKIN,4,'<input semantic="INV_BIND_MATRIX" source="#'+contid+'-bind_poses"/>') + self.writel(S_SKIN,3,'</joints>') + self.writel(S_SKIN,3,'<vertex_weights count="'+str(len(vertices))+'">') + self.writel(S_SKIN,4,'<input semantic="JOINT" source="#'+contid+'-joints" offset="0"/>') + self.writel(S_SKIN,4,'<input semantic="WEIGHT" source="#'+contid+'-skin_weights" offset="1"/>') vcounts="" vs="" vcount=0 @@ -722,13 +724,13 @@ class DaeExporter: vs+=" "+str(b) vs+=" "+str(vcount) vcount+=1 - self.writel(S_CONT,4,'<vcount>'+vcounts+'</vcount>') - self.writel(S_CONT,4,'<v>'+vs+'</v>') - self.writel(S_CONT,3,'</vertex_weights>') + self.writel(S_SKIN,4,'<vcount>'+vcounts+'</vcount>') + self.writel(S_SKIN,4,'<v>'+vs+'</v>') + self.writel(S_SKIN,3,'</vertex_weights>') - self.writel(S_CONT,2,'</skin>') - self.writel(S_CONT,1,'</controller>') + self.writel(S_SKIN,2,'</skin>') + self.writel(S_SKIN,1,'</controller>') meshdata["skin_id"]=contid @@ -865,7 +867,7 @@ class DaeExporter: light=node.data lightid=self.new_id("light") self.writel(S_LAMPS,1,'<light id="'+lightid+'" name="'+light.name+'">') - self.writel(S_LAMPS,2,'<optics>') + #self.writel(S_LAMPS,2,'<optics>') self.writel(S_LAMPS,3,'<technique_common>') if (light.type=="POINT"): @@ -893,7 +895,7 @@ class DaeExporter: self.writel(S_LAMPS,3,'</technique_common>') - self.writel(S_LAMPS,2,'</optics>') + #self.writel(S_LAMPS,2,'</optics>') self.writel(S_LAMPS,1,'</light>') @@ -1136,7 +1138,7 @@ class DaeExporter: self.writel(S_ANIM,2,'<source id="'+anim_id+'-input">') self.writel(S_ANIM,3,'<float_array id="'+anim_id+'-input-array" count="'+str(frame_total)+'">'+source_frames+'</float_array>') self.writel(S_ANIM,3,'<technique_common>') - self.writel(S_ANIM,4,'<accessor source="'+anim_id+'-input-array" count="'+str(frame_total)+'" stride="1">') + self.writel(S_ANIM,4,'<accessor source="#'+anim_id+'-input-array" count="'+str(frame_total)+'" stride="1">') self.writel(S_ANIM,5,'<param name="TIME" type="float"/>') self.writel(S_ANIM,4,'</accessor>') self.writel(S_ANIM,3,'</technique_common>') @@ -1147,7 +1149,7 @@ class DaeExporter: self.writel(S_ANIM,2,'<source id="'+anim_id+'-transform-output">') self.writel(S_ANIM,3,'<float_array id="'+anim_id+'-transform-output-array" count="'+str(frame_total*16)+'">'+source_transforms+'</float_array>') self.writel(S_ANIM,3,'<technique_common>') - self.writel(S_ANIM,4,'<accessor source="'+anim_id+'-transform-output-array" count="'+str(frame_total)+'" stride="16">') + self.writel(S_ANIM,4,'<accessor source="#'+anim_id+'-transform-output-array" count="'+str(frame_total)+'" stride="16">') self.writel(S_ANIM,5,'<param name="TRANSFORM" type="float4x4"/>') self.writel(S_ANIM,4,'</accessor>') self.writel(S_ANIM,3,'</technique_common>') @@ -1157,7 +1159,7 @@ class DaeExporter: self.writel(S_ANIM,2,'<source id="'+anim_id+'-transform-output">') self.writel(S_ANIM,3,'<float_array id="'+anim_id+'-transform-output-array" count="'+str(frame_total)+'">'+source_transforms+'</float_array>') self.writel(S_ANIM,3,'<technique_common>') - self.writel(S_ANIM,4,'<accessor source="'+anim_id+'-transform-output-array" count="'+str(frame_total)+'" stride="1">') + self.writel(S_ANIM,4,'<accessor source="#'+anim_id+'-transform-output-array" count="'+str(frame_total)+'" stride="1">') self.writel(S_ANIM,5,'<param name="X" type="float"/>') self.writel(S_ANIM,4,'</accessor>') self.writel(S_ANIM,3,'</technique_common>') @@ -1167,7 +1169,7 @@ class DaeExporter: self.writel(S_ANIM,2,'<source id="'+anim_id+'-interpolation-output">') self.writel(S_ANIM,3,'<Name_array id="'+anim_id+'-interpolation-output-array" count="'+str(frame_total)+'">'+source_interps+'</Name_array>') self.writel(S_ANIM,3,'<technique_common>') - self.writel(S_ANIM,4,'<accessor source="'+anim_id+'-interpolation-output-array" count="'+str(frame_total)+'" stride="1">') + self.writel(S_ANIM,4,'<accessor source="#'+anim_id+'-interpolation-output-array" count="'+str(frame_total)+'" stride="1">') self.writel(S_ANIM,5,'<param name="INTERPOLATION" type="Name"/>') self.writel(S_ANIM,4,'</accessor>') self.writel(S_ANIM,3,'</technique_common>') @@ -1379,6 +1381,19 @@ class DaeExporter: self.export_scene() self.writel(S_GEOM,0,'</library_geometries>') + + #morphs always go before skin controllers + if S_MORPH in self.sections: + for l in self.sections[S_MORPH]: + self.writel(S_CONT,0,l) + del self.sections[S_MORPH] + + #morphs always go before skin controllers + if S_SKIN in self.sections: + for l in self.sections[S_SKIN]: + self.writel(S_CONT,0,l) + del self.sections[S_SKIN] + self.writel(S_CONT,0,'</library_controllers>') self.writel(S_CAMS,0,'</library_cameras>') self.writel(S_LAMPS,0,'</library_lights>') |