Revision: 16323 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16323 Author: migius Date: 2008-09-01 01:30:42 +0200 (Mon, 01 Sep 2008)
Log Message: ----------- collada 1.4 importer/exporter - some improvements: - added support for import IPOs interpolation type: LINEAR,BEZIER - include patch jointVertexWeight from Dmitri: http://projects.blender.org/tracker/index.php?func=detail&aid=17427 - non-armature-animation export/import seams to work - still buggy: armature-position and armature-animation export&import Modified Paths: -------------- trunk/blender/release/scripts/bpymodules/colladaImEx/collada.py trunk/blender/release/scripts/bpymodules/colladaImEx/helperObjects.py trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py Modified: trunk/blender/release/scripts/bpymodules/colladaImEx/collada.py =================================================================== --- trunk/blender/release/scripts/bpymodules/colladaImEx/collada.py 2008-08-31 21:53:39 UTC (rev 16322) +++ trunk/blender/release/scripts/bpymodules/colladaImEx/collada.py 2008-08-31 23:30:42 UTC (rev 16323) @@ -28,6 +28,8 @@ from cutils import * from datetime import * +debprn = 0 #False #--- print debug "print 'deb: ..." + # The number of decimals to export floats to ROUND = 5 @@ -483,11 +485,11 @@ self.target = xmlUtils.ReadAttribute(xmlNode, DaeSyntax.TARGET) def SaveToXml(self, daeDocument): -# if debprn: print 'deb:DaeChannel() self.source=', self.source #------- -# if debprn: print 'deb:DaeChannel() self.target=', self.target #------- + if debprn: print 'deb:DaeChannel() self.source=', self.source #------- + if debprn: print 'deb:DaeChannel() self.target=', self.target #------- node = super(DaeChannel, self).SaveToXml(daeDocument) -#org SetAttribute(node, DaeSyntax.SOURCE, StripString('#'+self.source.id)) - SetAttribute(node, DaeSyntax.SOURCE, StripString('#'+self.source)) + SetAttribute(node, DaeSyntax.SOURCE, StripString('#'+self.source.id)) + ##SetAttribute(node, DaeSyntax.SOURCE, StripString('#'+self.source)) SetAttribute(node, DaeSyntax.TARGET, self.target) return node @@ -3503,4 +3505,4 @@ for daeTechnique in daeExtra.techniques: if daeTechnique.profile == 'Blender': return daeTechnique - return None + return None \ No newline at end of file Modified: trunk/blender/release/scripts/bpymodules/colladaImEx/helperObjects.py =================================================================== --- trunk/blender/release/scripts/bpymodules/colladaImEx/helperObjects.py 2008-08-31 21:53:39 UTC (rev 16322) +++ trunk/blender/release/scripts/bpymodules/colladaImEx/helperObjects.py 2008-08-31 23:30:42 UTC (rev 16323) @@ -26,7 +26,7 @@ import collada from Blender.Mathutils import * -debprn = False #--- print debug "print 'deb: ..." +debprn = 0 #False #--- print debug "print 'deb: ..." class Armature(object): # static vars @@ -219,6 +219,9 @@ types.append(Blender.Object.Pose.LOC) elif ta[0] == collada.DaeSyntax.ROTATE and not Blender.Object.Pose.ROT in types: types.append(Blender.Object.Pose.ROT) + #TODO: check if scale correct implemented + elif ta[0] == collada.DaeSyntax.SCALE and not Blender.Object.Pose.SCALE in types: + types.append(Blender.Object.Pose.SCALE) return types def GetType(self, daeNode, target): @@ -237,11 +240,16 @@ targetId = targetArray[1] # Get the animationInfo object for this node (or create a new one) animation = cls._animations.setdefault(nodeId, AnimationInfo(nodeId)) + #if debprn: print 'deb:helperObj.py:class AnimationInfo CreateAnimations() dir(animation)', dir(animation) #---------- # loop trough all samplers sampler = None + if debprn: print 'deb:helperObj.py:class AnimationInfo CreateAnimations() \ndeb: channel.source= ', channel.source #---------- for s in daeAnimation.samplers: - if s.id == channel.source[1:]: + #if debprn: print 'deb: sampler.id = ', s.id #---------- + #if debprn: print 'deb: channel.source[1:]= ', channel.source[1:] #---------- +#org if s.id == channel.source[1:]: + if s.id == channel.source: sampler = s # Get the values for all the inputs @@ -249,18 +257,41 @@ input = sampler.GetInput("INPUT") inputSource = daeAnimation.GetSource(input.source) if inputSource.techniqueCommon.accessor.HasParam("TIME") and len(inputSource.techniqueCommon.accessor.params) == 1: + if debprn: print 'deb: DDDDD getting target' #---------- output = sampler.GetInput("OUTPUT") outputSource = daeAnimation.GetSource(output.source) outputAccessor = outputSource.techniqueCommon.accessor accessorCount = outputAccessor.count accessorStride = outputAccessor.stride + interpolations = sampler.GetInput("INTERPOLATION") + interpolationsSource = daeAnimation.GetSource(interpolations.source) + if 0: #because probably interpolationsAccessor is identical to outputAccessor + interpolationsAccessor = interpolationsSource.techniqueCommon.accessor + accessorCount = interpolationsAccessor.count + accessorStride = interpolationsAccessor.stride + + if debprn: print 'deb: outputSource.source.data: ', outputSource.source.data #---------- + #if debprn: print 'deb: dir(outputAccessor.params): ', dir(outputAccessor.params) #---------- + #if debprn: print 'deb: dir(outputAccessor.params[0]): ', str(outputAccessor.params[0]) #---------- times = [x*fps for x in inputSource.source.data] - + if debprn: print 'deb: times=', times #--------- for timeIndex in range(len(times)): time = animation.times.setdefault(times[timeIndex], dict()) target = time.setdefault(targetId, dict()) + #interp = time.setdefault(targetId, dict()) + #if debprn: print 'deb: accessorStride=', accessorStride #--------- + value = [] for j in range(accessorStride): - target[outputAccessor.params[j]] = outputSource.source.data[timeIndex*accessorStride + j] + #if debprn: print 'deb: timeIndex,j,data=',timeIndex, j, outputSource.source.data[timeIndex*accessorStride + j] #--------- + #if debprn: print 'deb: outputAccessor.params[j]=',outputAccessor.params[j] #--------- + #target[outputAccessor.params[j]] = outputSource.source.data[timeIndex*accessorStride + j] + value.append(outputSource.source.data[timeIndex*accessorStride + j]) + if debprn: print 'deb: value=', value #--------- + target[outputAccessor.params[0]] = value + #interp[outputAccessor.params[j]] = interpolationsSource.source.data[timeIndex*accessorStride + j] + if debprn: print 'deb: time=', time #--------- + if debprn: print 'deb: target=', target #--------- + #if debprn: print 'deb:helperObj.py: X X X X X X X X X class AnimationInfo CreateAnimations() animation=', animation #---------- CreateAnimations = classmethod(CreateAnimations) Modified: trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py =================================================================== --- trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py 2008-08-31 21:53:39 UTC (rev 16322) +++ trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py 2008-08-31 23:30:42 UTC (rev 16323) @@ -24,6 +24,11 @@ # -------------------------------------------------------------------------- # History +# 2008.08.31 by migius: +# - added support for import IPOs interpolation type: LINEAR,BEZIER +# - include patch jointVertexWeight from Dmitri: http://projects.blender.org/tracker/index.php?func=detail&aid=17427 +# - non-armature-animation export/import seams to work +# - still buggy: armatures-position and armature-animation export&import # 2008.08.04 by migius: # - bugfix/refactor localTransformMatrix usage in hierarchies: # it preserves local orientation for each child, so imported IPOs are correct working @@ -37,7 +42,8 @@ import datetime from helperObjects import * -debprn = False #--- print debug "print 'deb: ..." +debprn = 0 #--- print debug "print 'deb: ..." +dmitri = 0 #switch for testing patch from Dmitri class Translator(object): isImporter = False @@ -102,44 +108,6 @@ scenesLibrary = None fps = 25 - def CreateID(self, name, typeName=None): - if len(name) > 0 and not name[0].isalpha(): - name = "i"+name - - if not (name in self.ids): - self.ids.append(name) - return name - else: - tempName = name - if not(typeName is None) and name.rfind(typeName) >= 0: - # Check for existing number at the end? - return self.IncrementString(tempName, True) - else: - # First check if no Blender Object exists with the name 'tempName + typeName' - if (tempName + typeName) in self.allBlenderNames: - return self.IncrementString(tempName + typeName, True) - else: - return self.CreateID(tempName+typeName, typeName) - - def IncrementString(self, name, checkName): - tempName = name - if name.rfind('.') >= 0: - while tempName[-1:].isdigit(): - tempName = tempName[:-1] - digitStr = name[-(len(name)-len(tempName)):] - digit = 1 - if len(digitStr) > 0 and len(digitStr) != len(name): - digit = int(digitStr)+1 - newName = tempName+str(digit).zfill(3) - else: - newName = name+'.001' - - if not (newName in self.ids) and (not checkName or not (newName in self.allBlenderNames)): - self.ids.append(newName) - return newName - else: - return self.IncrementString(newName, checkName) - def __init__(self, fileName): global waitingControllers, armatures # Keep track of the controller that are waiting to be applied @@ -182,7 +150,45 @@ self.inverseAxisTransformMatrix = Matrix() self.orgAxiss = ["X","Y","Z"] + def CreateID(self, name, typeName=None): + if len(name) > 0 and not name[0].isalpha(): + name = "i"+name + if not (name in self.ids): + self.ids.append(name) + return name + else: + tempName = name + if not(typeName is None) and name.rfind(typeName) >= 0: + # Check for existing number at the end? + return self.IncrementString(tempName, True) + else: + # First check if no Blender Object exists with the name 'tempName + typeName' + if (tempName + typeName) in self.allBlenderNames: + return self.IncrementString(tempName + typeName, True) + else: + return self.CreateID(tempName+typeName, typeName) + + def IncrementString(self, name, checkName): + tempName = name + if name.rfind('.') >= 0: + while tempName[-1:].isdigit(): + tempName = tempName[:-1] + digitStr = name[-(len(name)-len(tempName)):] + digit = 1 + if len(digitStr) > 0 and len(digitStr) != len(name): + digit = int(digitStr)+1 + newName = tempName+str(digit).zfill(3) + else: + newName = name+'.001' + + if not (newName in self.ids) and (not checkName or not (newName in self.allBlenderNames)): + self.ids.append(newName) + return newName + else: + return self.IncrementString(newName, checkName) + + def CreateNameForObject(self, name, replace, myType): if not replace: return name @@ -274,12 +280,11 @@ self.inverseAxisTransformMatrix = Matrix(self.axisTransformMatrix).invert() - - @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs