|
@@ -123,6 +123,11 @@ class DaeExporter:
|
|
|
tup = (self.vertex.x,self.vertex.y,self.vertex.z,self.normal.x,self.normal.y,self.normal.z)
|
|
|
for t in self.uv:
|
|
|
tup = tup + (t.x,t.y)
|
|
|
+ #for t in self.bones:
|
|
|
+ # tup = tup + (t)
|
|
|
+ #for t in self.weights:
|
|
|
+ # tup = tup + (t)
|
|
|
+
|
|
|
return tup
|
|
|
|
|
|
def __init__(self):
|
|
@@ -315,13 +320,127 @@ class DaeExporter:
|
|
|
return matid
|
|
|
|
|
|
|
|
|
- def export_mesh(self,node,armature=None,shapename=None):
|
|
|
+ def export_mesh(self,node,armature=None,skeyindex=-1,skel_source=None):
|
|
|
|
|
|
mesh = node.data
|
|
|
- if (node.data in self.mesh_cache) and shapename==None:
|
|
|
+
|
|
|
+
|
|
|
+ if (node.data in self.mesh_cache):
|
|
|
return self.mesh_cache[mesh]
|
|
|
|
|
|
- if (len(node.modifiers) and self.config["use_mesh_modifiers"]) or shapename!=None:
|
|
|
+ if (skeyindex==-1 and mesh.shape_keys!=None and len(mesh.shape_keys.key_blocks)):
|
|
|
+ values=[]
|
|
|
+ morph_targets=[]
|
|
|
+ md=None
|
|
|
+ for k in range(0,len(mesh.shape_keys.key_blocks)):
|
|
|
+ shape = node.data.shape_keys.key_blocks[k]
|
|
|
+ values+=[shape.value] #save value
|
|
|
+ shape.value=0
|
|
|
+
|
|
|
+ mid = self.new_id("morph")
|
|
|
+
|
|
|
+ for k in range(0,len(mesh.shape_keys.key_blocks)):
|
|
|
+
|
|
|
+ shape = node.data.shape_keys.key_blocks[k]
|
|
|
+ node.show_only_shape_key=True
|
|
|
+ node.active_shape_key_index = k
|
|
|
+ shape.value = 1.0
|
|
|
+ mesh.update()
|
|
|
+ """
|
|
|
+ oldval = shape.value
|
|
|
+ shape.value = 1.0
|
|
|
+
|
|
|
+ """
|
|
|
+ p = node.data
|
|
|
+ v = node.to_mesh(bpy.context.scene, True, "RENDER")
|
|
|
+ node.data = v
|
|
|
+# self.export_node(node,il,shape.name)
|
|
|
+ node.data.update()
|
|
|
+ if (armature and k==0):
|
|
|
+ md=self.export_mesh(node,armature,k,mid)
|
|
|
+ else:
|
|
|
+ md=self.export_mesh(node,None,k)
|
|
|
+
|
|
|
+ node.data = p
|
|
|
+ node.data.update()
|
|
|
+ shape.value = 0.0
|
|
|
+ morph_targets.append(md)
|
|
|
+
|
|
|
+ """
|
|
|
+ shape.value = oldval
|
|
|
+ """
|
|
|
+ node.show_only_shape_key=False
|
|
|
+ node.active_shape_key_index = 0
|
|
|
+
|
|
|
+
|
|
|
+ self.writel(S_CONT,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">')
|
|
|
+ #else:
|
|
|
+ self.writel(S_CONT,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)+'">')
|
|
|
+ marr=""
|
|
|
+ warr=""
|
|
|
+ for i in range(len(morph_targets)):
|
|
|
+ if (i==0):
|
|
|
+ continue
|
|
|
+ elif (i>1):
|
|
|
+ marr+=" "
|
|
|
+
|
|
|
+ if ("skin_id" in morph_targets[i]):
|
|
|
+ marr+=morph_targets[i]["skin_id"]
|
|
|
+ else:
|
|
|
+ marr+=morph_targets[i]["id"]
|
|
|
+
|
|
|
+ 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>')
|
|
|
+ if (armature!=None):
|
|
|
+
|
|
|
+ self.armature_for_morph[node]=armature
|
|
|
+
|
|
|
+ meshdata={}
|
|
|
+ if (armature):
|
|
|
+ meshdata = morph_targets[0]
|
|
|
+ meshdata["morph_id"]=mid
|
|
|
+ else:
|
|
|
+ meshdata["id"]=morph_targets[0]["id"]
|
|
|
+ meshdata["morph_id"]=mid
|
|
|
+ meshdata["material_assign"]=morph_targets[0]["material_assign"]
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ self.mesh_cache[node.data]=meshdata
|
|
|
+ return meshdata
|
|
|
+
|
|
|
+ if (len(node.modifiers) and self.config["use_mesh_modifiers"]):
|
|
|
mesh=node.to_mesh(self.scene,True,"RENDER") #is this allright?
|
|
|
else:
|
|
|
mesh=node.data
|
|
@@ -349,7 +468,6 @@ class DaeExporter:
|
|
|
for fi in range(len(mesh.tessfaces)):
|
|
|
f=mesh.tessfaces[fi]
|
|
|
|
|
|
-
|
|
|
if (not (f.material_index in surface_indices)):
|
|
|
surface_indices[f.material_index]=[]
|
|
|
print("Type: "+str(type(f.material_index)))
|
|
@@ -419,7 +537,7 @@ class DaeExporter:
|
|
|
|
|
|
tup = v.get_tup()
|
|
|
idx = 0
|
|
|
- if (tup in vertex_map):
|
|
|
+ if (skeyindex==-1 and tup in vertex_map): #do not optmize if using shapekeys
|
|
|
idx = vertex_map[tup]
|
|
|
else:
|
|
|
idx = len(vertices)
|
|
@@ -428,12 +546,9 @@ class DaeExporter:
|
|
|
|
|
|
indices.append(idx)
|
|
|
|
|
|
- if shapename != None:
|
|
|
- meshid = self.new_id("mesh_"+shapename)
|
|
|
- self.writel(S_GEOM,1,'<geometry id="'+meshid+'" name="'+mesh.name+'_'+shapename+'">')
|
|
|
- else:
|
|
|
- meshid = self.new_id("mesh")
|
|
|
- self.writel(S_GEOM,1,'<geometry id="'+meshid+'" name="'+mesh.name+'">')
|
|
|
+
|
|
|
+ meshid = self.new_id("mesh")
|
|
|
+ self.writel(S_GEOM,1,'<geometry id="'+meshid+'" name="'+mesh.name+'">')
|
|
|
|
|
|
self.writel(S_GEOM,2,'<mesh>')
|
|
|
|
|
@@ -526,20 +641,26 @@ class DaeExporter:
|
|
|
self.writel(S_GEOM,2,'</mesh>')
|
|
|
self.writel(S_GEOM,1,'</geometry>')
|
|
|
|
|
|
+
|
|
|
meshdata={}
|
|
|
meshdata["id"]=meshid
|
|
|
meshdata["material_assign"]=mat_assign
|
|
|
- self.mesh_cache[node.data]=meshdata
|
|
|
+ if (skeyindex==-1):
|
|
|
+ self.mesh_cache[node.data]=meshdata
|
|
|
|
|
|
|
|
|
# Export armature data (if armature exists)
|
|
|
|
|
|
- if (armature!=None):
|
|
|
+ if (armature!=None and (skel_source!=None or skeyindex==-1)):
|
|
|
|
|
|
contid = self.new_id("controller")
|
|
|
|
|
|
self.writel(S_CONT,1,'<controller id="'+contid+'">')
|
|
|
- self.writel(S_CONT,2,'<skin source="'+meshid+'">')
|
|
|
+ if (skel_source!=None):
|
|
|
+ self.writel(S_CONT,2,'<skin source="'+skel_source+'">')
|
|
|
+ else:
|
|
|
+ self.writel(S_CONT,2,'<skin source="'+meshid+'">')
|
|
|
+
|
|
|
self.writel(S_CONT,3,'<bind_shape_matrix>'+strmtx(node.matrix_world)+'</bind_shape_matrix>')
|
|
|
#Joint Names
|
|
|
self.writel(S_CONT,3,'<source id="'+contid+'-joints">')
|
|
@@ -614,7 +735,7 @@ class DaeExporter:
|
|
|
return meshdata
|
|
|
|
|
|
|
|
|
- def export_mesh_node(self,node,il,shapename=None):
|
|
|
+ def export_mesh_node(self,node,il):
|
|
|
|
|
|
if (node.data==None):
|
|
|
return
|
|
@@ -624,14 +745,19 @@ class DaeExporter:
|
|
|
if (node.parent.type=="ARMATURE"):
|
|
|
armature=node.parent
|
|
|
|
|
|
- meshdata = self.export_mesh(node,armature,shapename)
|
|
|
+ meshdata = self.export_mesh(node,armature)
|
|
|
+ close_controller=False
|
|
|
|
|
|
- if (armature==None):
|
|
|
- self.writel(S_NODES,il,'<instance_geometry url="#'+meshdata["id"]+'">')
|
|
|
- else:
|
|
|
+ if ("skin_id" in meshdata):
|
|
|
+ close_controller=True
|
|
|
self.writel(S_NODES,il,'<instance_controller url="#'+meshdata["skin_id"]+'">')
|
|
|
for sn in self.skeleton_info[armature]["skeleton_nodes"]:
|
|
|
self.writel(S_NODES,il+1,'<skeleton>#'+sn+'</skeleton>')
|
|
|
+ elif ("morph_id" in meshdata):
|
|
|
+ self.writel(S_NODES,il,'<instance_controller url="#'+meshdata["morph_id"]+'">')
|
|
|
+ close_controller=True
|
|
|
+ elif (armature==None):
|
|
|
+ self.writel(S_NODES,il,'<instance_geometry url="#'+meshdata["id"]+'">')
|
|
|
|
|
|
|
|
|
if (len(meshdata["material_assign"])>0):
|
|
@@ -644,17 +770,17 @@ class DaeExporter:
|
|
|
self.writel(S_NODES,il+2,'</technique_common>')
|
|
|
self.writel(S_NODES,il+1,'</bind_material>')
|
|
|
|
|
|
- if (armature==None):
|
|
|
- self.writel(S_NODES,il,'</instance_geometry>')
|
|
|
- else:
|
|
|
+ if (close_controller):
|
|
|
self.writel(S_NODES,il,'</instance_controller>')
|
|
|
+ else:
|
|
|
+ self.writel(S_NODES,il,'</instance_geometry>')
|
|
|
|
|
|
|
|
|
def export_armature_bone(self,bone,il,si):
|
|
|
boneid = self.new_id("bone")
|
|
|
boneidx = si["bone_count"]
|
|
|
si["bone_count"]+=1
|
|
|
- bonesid = si["name"]+"-"+str(boneidx)
|
|
|
+ bonesid = si["id"]+"-"+str(boneidx)
|
|
|
si["bone_index"][bone.name]=boneidx
|
|
|
si["bone_ids"][bone]=boneid
|
|
|
si["bone_names"].append(bonesid)
|
|
@@ -683,7 +809,7 @@ class DaeExporter:
|
|
|
self.skeletons.append(node)
|
|
|
|
|
|
armature = node.data
|
|
|
- self.skeleton_info[node]={ "bone_count":0, "name":node.name, "bone_index":{},"bone_ids":{},"bone_names":[],"bone_bind_poses":[],"skeleton_nodes":[],"armature_xform":node.matrix_world }
|
|
|
+ self.skeleton_info[node]={ "bone_count":0, "id":self.new_id("skelbones"),"name":node.name, "bone_index":{},"bone_ids":{},"bone_names":[],"bone_bind_poses":[],"skeleton_nodes":[],"armature_xform":node.matrix_world }
|
|
|
|
|
|
|
|
|
|
|
@@ -912,21 +1038,18 @@ class DaeExporter:
|
|
|
|
|
|
|
|
|
|
|
|
- def export_node(self,node,il,shapename=None):
|
|
|
+ def export_node(self,node,il):
|
|
|
if (not self.is_node_valid(node)):
|
|
|
return
|
|
|
bpy.context.scene.objects.active = node
|
|
|
|
|
|
- if shapename != None:
|
|
|
- self.writel(S_NODES,il,'<node id="'+self.validate_id(node.name + '_' + shapename)+'" name="'+node.name+'_'+shapename+'" type="NODE">')
|
|
|
- else:
|
|
|
- self.writel(S_NODES,il,'<node id="'+self.validate_id(node.name)+'" name="'+node.name+'" type="NODE">')
|
|
|
+ self.writel(S_NODES,il,'<node id="'+self.validate_id(node.name)+'" name="'+node.name+'" type="NODE">')
|
|
|
il+=1
|
|
|
|
|
|
self.writel(S_NODES,il,'<matrix sid="transform">'+strmtx(node.matrix_local)+'</matrix>')
|
|
|
print("NODE TYPE: "+node.type+" NAME: "+node.name)
|
|
|
if (node.type=="MESH"):
|
|
|
- self.export_mesh_node(node,il,shapename)
|
|
|
+ self.export_mesh_node(node,il)
|
|
|
elif (node.type=="CURVE"):
|
|
|
self.export_curve_node(node,il)
|
|
|
elif (node.type=="ARMATURE"):
|
|
@@ -937,22 +1060,9 @@ class DaeExporter:
|
|
|
self.export_lamp_node(node,il)
|
|
|
|
|
|
self.valid_nodes.append(node)
|
|
|
- if shapename==None:
|
|
|
- for x in node.children:
|
|
|
- self.export_node(x,il)
|
|
|
- if node.type=="MESH" and self.config["export_shapekeys"]:
|
|
|
- for k in range(0,len(node.data.shape_keys.key_blocks)):
|
|
|
- shape = node.data.shape_keys.key_blocks[k]
|
|
|
- oldval = shape.value
|
|
|
- shape.value = 1.0
|
|
|
- node.active_shape_key_index = k
|
|
|
- p = node.data
|
|
|
- v = node.to_mesh(bpy.context.scene, True, "RENDER")
|
|
|
- node.data = v
|
|
|
- self.export_node(node,il,shape.name)
|
|
|
- node.data = p
|
|
|
- node.data.update()
|
|
|
- shape.value = oldval
|
|
|
+ for x in node.children:
|
|
|
+ self.export_node(x,il)
|
|
|
+
|
|
|
il-=1
|
|
|
self.writel(S_NODES,il,'</node>')
|
|
|
|
|
@@ -1003,18 +1113,22 @@ class DaeExporter:
|
|
|
self.writel(S_ASSET,0,'</asset>')
|
|
|
|
|
|
|
|
|
- def export_animation_transform_channel(self,target,transform_keys):
|
|
|
+ def export_animation_transform_channel(self,target,keys,matrices=True):
|
|
|
|
|
|
- frame_total=len(transform_keys)
|
|
|
+ frame_total=len(keys)
|
|
|
anim_id=self.new_id("anim")
|
|
|
self.writel(S_ANIM,1,'<animation id="'+anim_id+'">')
|
|
|
source_frames = ""
|
|
|
source_transforms = ""
|
|
|
source_interps = ""
|
|
|
|
|
|
- for k in transform_keys:
|
|
|
+ for k in keys:
|
|
|
source_frames += " "+str(k[0])
|
|
|
- source_transforms += " "+strmtx(k[1])
|
|
|
+ if (matrices):
|
|
|
+ source_transforms += " "+strmtx(k[1])
|
|
|
+ else:
|
|
|
+ source_transforms += " "+str(k[1])
|
|
|
+
|
|
|
source_interps +=" LINEAR"
|
|
|
|
|
|
|
|
@@ -1028,15 +1142,26 @@ class DaeExporter:
|
|
|
self.writel(S_ANIM,3,'</technique_common>')
|
|
|
self.writel(S_ANIM,2,'</source>')
|
|
|
|
|
|
- # Transform Source
|
|
|
- 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,5,'<param name="TRANSFORM" type="float4x4"/>')
|
|
|
- self.writel(S_ANIM,4,'</accessor>')
|
|
|
- self.writel(S_ANIM,3,'</technique_common>')
|
|
|
- self.writel(S_ANIM,2,'</source>')
|
|
|
+ if (matrices):
|
|
|
+ # Transform Source
|
|
|
+ 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,5,'<param name="TRANSFORM" type="float4x4"/>')
|
|
|
+ self.writel(S_ANIM,4,'</accessor>')
|
|
|
+ self.writel(S_ANIM,3,'</technique_common>')
|
|
|
+ self.writel(S_ANIM,2,'</source>')
|
|
|
+ else:
|
|
|
+ # Value Source
|
|
|
+ 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,5,'<param name="X" type="float"/>')
|
|
|
+ self.writel(S_ANIM,4,'</accessor>')
|
|
|
+ self.writel(S_ANIM,3,'</technique_common>')
|
|
|
+ self.writel(S_ANIM,2,'</source>')
|
|
|
|
|
|
# Interpolation Source
|
|
|
self.writel(S_ANIM,2,'<source id="'+anim_id+'-interpolation-output">')
|
|
@@ -1053,7 +1178,10 @@ class DaeExporter:
|
|
|
self.writel(S_ANIM,3,'<input semantic="OUTPUT" source="#'+anim_id+'-transform-output"/>')
|
|
|
self.writel(S_ANIM,3,'<input semantic="INTERPOLATION" source="#'+anim_id+'-interpolation-output"/>')
|
|
|
self.writel(S_ANIM,2,'</sampler>')
|
|
|
- self.writel(S_ANIM,2,'<channel source="#'+anim_id+'-sampler" target="'+target+'/transform"/>')
|
|
|
+ if (matrices):
|
|
|
+ self.writel(S_ANIM,2,'<channel source="#'+anim_id+'-sampler" target="'+target+'/transform"/>')
|
|
|
+ else:
|
|
|
+ self.writel(S_ANIM,2,'<channel source="#'+anim_id+'-sampler" target="'+target+'"/>')
|
|
|
self.writel(S_ANIM,1,'</animation>')
|
|
|
|
|
|
return [anim_id]
|
|
@@ -1075,6 +1203,7 @@ class DaeExporter:
|
|
|
|
|
|
tcn = []
|
|
|
xform_cache={}
|
|
|
+ blend_cache={}
|
|
|
# Change frames first, export objects last
|
|
|
# This improves performance enormously
|
|
|
|
|
@@ -1089,9 +1218,26 @@ class DaeExporter:
|
|
|
if (not node in self.valid_nodes):
|
|
|
continue
|
|
|
if (allowed!=None and not (node in allowed)):
|
|
|
- continue
|
|
|
+ if (node.type=="MESH" and node.data!=None and (node in self.armature_for_morph) and (self.armature_for_morph[node] in allowed)):
|
|
|
+ pass #all good you pass with flying colors for morphs inside of action
|
|
|
+ else:
|
|
|
+ continue
|
|
|
+ if (node.type=="MESH" and node.data!=None and node.data.shape_keys!=None and (node.data in self.mesh_cache) and len(node.data.shape_keys.key_blocks)):
|
|
|
+ target = self.mesh_cache[node.data]["morph_id"]
|
|
|
+ for i in range(len(node.data.shape_keys.key_blocks)):
|
|
|
+
|
|
|
+ if (i==0):
|
|
|
+ continue
|
|
|
+
|
|
|
+ name=target+"-morph-weights("+str(i-1)+")"
|
|
|
+ if (not (name in blend_cache)):
|
|
|
+ blend_cache[name]=[]
|
|
|
+
|
|
|
+ blend_cache[name].append( (key,node.data.shape_keys.key_blocks[i].value) )
|
|
|
+
|
|
|
|
|
|
if (node.type=="MESH" and node.parent and node.parent.type=="ARMATURE"):
|
|
|
+
|
|
|
continue #In Collada, nodes that have skin modifier must not export animation, animate the skin instead.
|
|
|
|
|
|
if (len(node.constraints)>0 or node.animation_data!=None):
|
|
@@ -1108,6 +1254,7 @@ class DaeExporter:
|
|
|
|
|
|
if (node.type=="ARMATURE"):
|
|
|
#All bones exported for now
|
|
|
+
|
|
|
for bone in node.data.bones:
|
|
|
|
|
|
bone_name=self.skeleton_info[node]["bone_ids"][bone]
|
|
@@ -1138,7 +1285,9 @@ class DaeExporter:
|
|
|
|
|
|
#export animation xml
|
|
|
for nid in xform_cache:
|
|
|
- tcn+=self.export_animation_transform_channel(nid,xform_cache[nid])
|
|
|
+ tcn+=self.export_animation_transform_channel(nid,xform_cache[nid],True)
|
|
|
+ for nid in blend_cache:
|
|
|
+ tcn+=self.export_animation_transform_channel(nid,blend_cache[nid],False)
|
|
|
|
|
|
return tcn
|
|
|
|
|
@@ -1197,7 +1346,7 @@ class DaeExporter:
|
|
|
print("Export anim: "+x.name)
|
|
|
self.writel(S_ANIM_CLIPS,1,'<animation_clip name="'+x.name+'" start="'+str(start)+'" end="'+str(end)+'">')
|
|
|
for z in tcn:
|
|
|
- self.writel(S_ANIM_CLIPS,2,'<instance_animation url="#'+z+'">')
|
|
|
+ self.writel(S_ANIM_CLIPS,2,'<instance_animation url="#'+z+'"/>')
|
|
|
self.writel(S_ANIM_CLIPS,1,'</animation_clip>')
|
|
|
|
|
|
|
|
@@ -1276,6 +1425,7 @@ class DaeExporter:
|
|
|
self.skeleton_info={}
|
|
|
self.config=kwargs
|
|
|
self.valid_nodes=[]
|
|
|
+ self.armature_for_morph={}
|
|
|
|
|
|
|
|
|
|