resolved conflict state with HEAD r14096
[blender.git] / release / scripts / import_mdd.py
1 #!BPY
2
3 """
4  Name: 'Load MDD to Mesh RVKs'
5  Blender: 242
6  Group: 'Import'
7  Tooltip: 'baked vertex animation to active mesh object.'
8 """
9 __author__ = "Bill L.Nieuwendorp"
10 __bpydoc__ = """\
11 This script Imports Lightwaves MotionDesigner format.
12
13 The .mdd format has become quite a popular Pipeline format<br>
14 for moving animations from package to package.
15 """
16 # mdd importer  
17 #
18 # Warning if the vertex order or vertex count differs from the
19 # origonal model the mdd was Baked out from their will be Strange
20 # behavior
21
22 #
23 #vertex animation to ShapeKeys with ipo  and gives the frame a value of 1.0 
24 #A modifier to read mdd files would be Ideal but thats for another day :)
25 #
26 #Please send any fixes,updates,bugs to Slow67_at_Gmail.com
27 #Bill Niewuendorp
28
29 # ***** BEGIN GPL LICENSE BLOCK *****
30 #
31 # This program is free software; you can redistribute it and/or
32 # modify it under the terms of the GNU General Public License
33 # as published by the Free Software Foundation; either version 2
34 # of the License, or (at your option) any later version.
35 #
36 # This program is distributed in the hope that it will be useful,
37 # but WITHOUT ANY WARRANTY; without even the implied warranty of
38 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
39 # GNU General Public License for more details.
40 #
41 # You should have received a copy of the GNU General Public License
42 # along with this program; if not, write to the Free Software Foundation,
43 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
44 #
45 # ***** END GPL LICENCE BLOCK *****
46
47
48
49
50 try:
51         from struct import unpack
52 except:
53         unpack = None
54
55 import Blender
56 from Blender import Mesh, Object, Scene
57 import BPyMessages
58
59 def mdd_import(filepath, ob, PREF_IPONAME, PREF_START_FRAME, PREF_JUMP):
60         
61         print '\n\nimporting mdd "%s"' % filepath
62         
63         Blender.Window.DrawProgressBar (0.0, "Importing mdd ...")
64         Blender.Window.EditMode(0)
65         Blender.Window.WaitCursor(1)
66         
67         file = open(filepath, 'rb')
68         frames, points = unpack(">2i", file.read(8))
69         time = unpack((">%df" % frames), file.read(frames * 4))
70         
71         print '\tpoints:%d frames:%d' % (points,frames)
72
73         scn = Scene.GetCurrent()
74         ctx = scn.getRenderingContext()
75         Blender.Set("curframe", PREF_START_FRAME)
76         me = ob.getData(mesh=1)
77         
78         def UpdateMesh(me,fr):
79                 for v in me.verts:
80                         # 12 is the size of 3 floats
81                         x,y,z= unpack('>3f', file.read(12))
82                         v.co[:] = x,z,y
83                 me.update()
84         
85         Blender.Window.DrawProgressBar (0.4, "4 Importing mdd ...")
86         
87         
88         curfr = ctx.currentFrame()
89         print'\twriting mdd data...'
90         for i in xrange(frames):
91                 Blender.Set("curframe", i+PREF_START_FRAME)
92                 if len(me.verts) > 1 and (curfr >= PREF_START_FRAME) and (curfr <= PREF_START_FRAME+frames):
93                         UpdateMesh(me, i)
94                         ob.insertShapeKey()
95         
96         Blender.Window.DrawProgressBar (0.5, "5 Importing mdd ...")
97         
98         key= me.key
99         
100         # Add the key of its not there
101         if not key:
102                 me.insertKey(1, 'relative')
103                 key= me.key
104         
105         key.ipo = Blender.Ipo.New('Key', PREF_IPONAME)
106         ipo = key.ipo
107         # block = key.getBlocks() # not used.
108         all_keys = ipo.curveConsts
109
110         for i in xrange(PREF_JUMP+1, len(all_keys), PREF_JUMP):
111                 curve = ipo.getCurve(i)
112                 if curve == None:
113                         curve = ipo.addCurve(all_keys[i])
114                 
115                 curve.append((PREF_START_FRAME+i-1,1))
116                 curve.append((PREF_START_FRAME+i- PREF_JUMP -1,0))
117                 curve.append((PREF_START_FRAME+i+ PREF_JUMP-1,0))
118                 curve.setInterpolation('Linear')
119                 curve.recalc()
120         
121         print 'done'
122         Blender.Window.WaitCursor(0)
123         Blender.Window.DrawProgressBar (1.0, '')
124
125
126 def mdd_import_ui(filepath):
127         
128         if BPyMessages.Error_NoFile(filepath):
129                 return
130                 
131         scn= Scene.GetCurrent()
132         ob_act= scn.objects.active
133         
134         if ob_act == None or ob_act.type != 'Mesh':
135                 BPyMessages.Error_NoMeshActive()
136                 return
137         
138         PREF_IPONAME = Blender.Draw.Create(filepath.split('/')[-1].split('\\')[-1].split('.')[0])
139         PREF_START_FRAME = Blender.Draw.Create(1)
140         PREF_JUMP = Blender.Draw.Create(1)
141         
142         block = [\
143         ("Ipo Name: ", PREF_IPONAME, 0, 30, "Ipo name for the new shape key"),\
144         ("Start Frame: ", PREF_START_FRAME, 1, 3000, "Start frame for the animation"),\
145         ("Key Skip: ", PREF_JUMP, 1, 100, "KeyReduction, Skip every Nth Frame")\
146         ]
147
148         if not Blender.Draw.PupBlock("Import MDD", block):
149                 return
150         orig_frame = Blender.Get('curframe')
151         mdd_import(filepath, ob_act, PREF_IPONAME.val, PREF_START_FRAME.val, PREF_JUMP.val)
152         Blender.Set('curframe', orig_frame)
153
154 if __name__ == '__main__':
155         if not unpack:
156                 Draw.PupMenu('Error%t|This script requires a full python install')
157         
158         Blender.Window.FileSelector(mdd_import_ui, 'IMPORT MDD', '*.mdd')