export matrix was wrong, cleanup import, more memory efficient and import the rest...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 28 Sep 2006 04:45:08 +0000 (04:45 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 28 Sep 2006 04:45:08 +0000 (04:45 +0000)
release/scripts/export_mdd.py
release/scripts/import_mdd.py

index 0b0baaae7bd2ac1f1280041d824c2af2f4564b2c..3c3d07a2d12d327d9f4103a6fb45dab58a3d5365 100644 (file)
@@ -1,10 +1,10 @@
 #!BPY
 
 """
- Name: 'Save Mesh RVKs as MDD'
+ Name: 'Save Mesh as MDD'
  Blender: 242
  Group: 'Animation'
- Tooltip: 'baked vertex animation fromo selected model.'
+ Tooltip: 'Animated mesh to MDD vertex keyframe file.'
 """
 
 __author__ = "Bill L.Nieuwendorp"
@@ -13,17 +13,10 @@ This script Exports Lightwaves MotionDesigner format.
 
 The .mdd format has become quite a popular Pipeline format<br>
 for moving animations from package to package.
+
+Be sure not to use modifiers that change the number or order of verts in the mesh
 """
-# mdd export  
-#
-# 
-#
-# Warning if the vertex order or vertex count differs from frame to frame
-# The script will fail because the resulting file would be an invalid mdd file.
-# 
-# mdd files should only be applied to the the origonating model with the origonal vert order
-#
-#Please send any fixes,updates,bugs to Slow67_at_Gmail.com
+#Please send any fixes,updates,bugs to Slow67_at_Gmail.com or cbarton_at_metavr.com
 #Bill Niewuendorp
 
 import Blender
@@ -34,18 +27,34 @@ try:
 except:
        pack = None
 
+
+def zero_file(filepath):
+       '''
+       If a file fails, this replaces it with 1 char, better not remove it?
+       '''
+       file = open(filepath, 'w')
+       file.write('\n') # aparently macosx needs some data in a blank file?
+       file.close()
+
 def mdd_export(filepath, ob, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS):
        
        Window.EditMode(0)
        Blender.Window.WaitCursor(1)
        mesh_orig = ob.getData(mesh=1)
-
-       #Flip y and z matrix
+       
+       #Flip y and z
+       '''
+       mat = Mathutils.Matrix()
+       mat[2][2] = -1
+       rotmat = Mathutils.RotationMatrix(90, 4, 'x')
+       mat_flip = mat*rotmat
+       '''
+       # Above results in this matrix
        mat_flip= Mathutils.Matrix(\
-       [1,0,0,0],\
-       [0,0,1,0],\
-       [0,-1,0,0],\
-       [0,0,0,1],\
+       [1.0, 0.0, 0.0, 0.0],\
+       [0.0, 0.0, 1.0, 0.0],\
+       [0.0, 1.0, 0.0, 0.0],\
+       [0.0, 0.0, 0.0, 1.0],\
        )
        
        me_tmp = Mesh.New() # container mesh
@@ -71,6 +80,7 @@ def mdd_export(filepath, ob, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS):
                        Blender.Draw.PupMenu('Error%t|Number of verts has changed during animation|cannot export')
                        Blender.Window.WaitCursor(0)
                        f.close() # should we zero?
+                       zero_file(filepath)
                        return
                
                me_tmp.transform(ob.matrixWorld * mat_flip)
index fa594fa2d30649b757226c51ad272754125a8dd6..89b2c934cdbc25993708150d5d3c19daff1351c4 100644 (file)
@@ -27,9 +27,9 @@ for moving animations from package to package.
 #Bill Niewuendorp
 
 try:
-       import struct
+       from struct import unpack
 except:
-       struct= None
+       unpack = None
 
 import Blender
 from Blender import Mesh, Object, Scene
@@ -44,48 +44,23 @@ def mdd_import(filepath, ob, PREF_IPONAME, PREF_START_FRAME, PREF_JUMP):
        Blender.Window.WaitCursor(1)
        
        file = open(filepath, 'rb')
-       toUnpack = file.read(8)
-       frames, points = struct.unpack(">2i",toUnpack)
-       floatBytes = frames * 4
-       furtherUnpack = file.read(floatBytes)
-       floatBytes2 = points * 12
-       floatBytes3 = 12 * points * frames
-       restsize = points * 3
-       pfsize = points * frames * 3
-       restPoseUnpack = file.read(floatBytes2)
-       PerFrameUnpack = file.read(floatBytes3)
-       pattern = ">%df" % frames
-       pattern2 = ">%df" % restsize
-       pattern3 = ">%df" % pfsize
-       time = struct.unpack(pattern, furtherUnpack)
-       rest_pose = struct.unpack(pattern2, restPoseUnpack)
-       PerFramexyz = struct.unpack(pattern3, PerFrameUnpack)
+       frames, points = unpack(">2i", file.read(8))
+       time = unpack((">%df" % frames), file.read(frames * 4))
        
        print '\tpoints:%d frames:%d' % (points,frames)
 
        scn = Scene.GetCurrent()
        ctx = scn.getRenderingContext()
-       #ctx.startFrame(PREF_START_FRAME)
-       #ctx.endFrame(PREF_START_FRAME+frames)
        Blender.Set("curframe", PREF_START_FRAME)
        me = ob.getData(mesh=1)
-       xyzs = PerFramexyz
-       Point_list = []
-       for i in xrange(len(xyzs)/3):
-               xpos, zpos = i*3, (i*3)+3
-               Point_list.append(xyzs[xpos:zpos])
-               Frm_points = []
-       Blender.Window.DrawProgressBar (0.2, "3 Importing mdd ...")
-       for i in xrange(len(Point_list)):
-               first, last = i*points, (i*points)+points
-               Frm_points.append(Point_list[first:last])                       
-       
        
        def UpdateMesh(me,fr):
-               for vidx, v in enumerate(me.verts):
-                       v.co[:] = Frm_points[fr][vidx][0], Frm_points[fr][vidx][2], Frm_points[fr][vidx][1]
+               for v in me.verts:
+                       # 12 is the size of 3 floats
+                       x,y,z= unpack('>3f', file.read(12))
+                       v.co[:] = x,z,y
                me.update()
-
+       
        Blender.Window.DrawProgressBar (0.4, "4 Importing mdd ...")
        
        
@@ -96,8 +71,6 @@ def mdd_import(filepath, ob, PREF_IPONAME, PREF_START_FRAME, PREF_JUMP):
                if len(me.verts) > 1 and (curfr >= PREF_START_FRAME) and (curfr <= PREF_START_FRAME+frames):
                        UpdateMesh(me, i)
                        ob.insertShapeKey()
-                       ob.makeDisplayList()
-                       Blender.Window.RedrawAll() 
        
        Blender.Window.DrawProgressBar (0.5, "5 Importing mdd ...")
        
@@ -108,24 +81,21 @@ def mdd_import(filepath, ob, PREF_IPONAME, PREF_START_FRAME, PREF_JUMP):
                me.insertKey(1, 'relative')
                key= me.key
        
-       key.ipo = Blender.Ipo.New("Key", PREF_IPONAME)
+       key.ipo = Blender.Ipo.New('Key', PREF_IPONAME)
        ipo = key.ipo
-       block = key.getBlocks()
+       # block = key.getBlocks() # not used.
        all_keys = ipo.curveConsts
 
-       for i in xrange(PREF_JUMP, len(all_keys), PREF_JUMP):
-                       curve = ipo.getCurve(i)
-                       if curve == None:
-                               ipo.addCurve(all_keys[i])
-
-       Blender.Window.DrawProgressBar (0.8, "appending to ipos")
-       for i in xrange(PREF_JUMP, len(all_keys), PREF_JUMP):# Key Reduction 
-               mkpoints = ipo.getCurve(i)
-               mkpoints.append((1+PREF_START_FRAME+i-1,1))
-               mkpoints.append((1+PREF_START_FRAME+i- PREF_JUMP -1,0))
-               mkpoints.append((1+PREF_START_FRAME+i+ PREF_JUMP-1,0))
-               mkpoints.setInterpolation('Linear')
-               mkpoints.recalc()
+       for i in xrange(PREF_JUMP+1, len(all_keys), PREF_JUMP):
+               curve = ipo.getCurve(i)
+               if curve == None:
+                       curve = ipo.addCurve(all_keys[i])
+               
+               curve.append((PREF_START_FRAME+i-1,1))
+               curve.append((PREF_START_FRAME+i- PREF_JUMP -1,0))
+               curve.append((PREF_START_FRAME+i+ PREF_JUMP-1,0))
+               curve.setInterpolation('Linear')
+               curve.recalc()
        
        print 'done'
        Blender.Window.WaitCursor(0)
@@ -161,7 +131,7 @@ def mdd_import_ui(filepath):
        Blender.Set('curframe', orig_frame)
 
 if __name__ == '__main__':
-       if not struct:
+       if not unpack:
                Draw.PupMenu('Error%t|This script requires a full python install')
        
        Blender.Window.FileSelector(mdd_import_ui, 'IMPORT MDD', '*.mdd')
\ No newline at end of file