use set as a suffix (matches operators)
[blender.git] / release / scripts / op / io_shape_mdd / export_mdd.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 # Contributors: Bill L.Nieuwendorp
22
23 """
24 This script Exports Lightwaves MotionDesigner format.
25
26 The .mdd format has become quite a popular Pipeline format<br>
27 for moving animations from package to package.
28
29 Be sure not to use modifiers that change the number or order of verts in the mesh
30 """
31
32 import bpy
33 import mathutils
34 from struct import pack
35
36
37 def zero_file(filepath):
38     '''
39     If a file fails, this replaces it with 1 char, better not remove it?
40     '''
41     file = open(filepath, 'w')
42     file.write('\n') # apparently macosx needs some data in a blank file?
43     file.close()
44
45
46 def check_vertcount(mesh, vertcount):
47     '''
48     check and make sure the vertcount is consistent throughout the frame range
49     '''
50     if len(mesh.vertices) != vertcount:
51         raise Exception('Error, number of verts has changed during animation, cannot export')
52         f.close()
53         zero_file(filepath)
54         return
55
56
57 def save(operator, context, filepath="", frame_start=1, frame_end=300, fps=25):
58     """
59     Blender.Window.WaitCursor(1)
60
61     mesh_orig = Mesh.New()
62     mesh_orig.getFromObject(obj.name)
63     """
64
65     scene = context.scene
66     obj = context.object
67
68     if bpy.ops.object.mode_set.poll():
69         bpy.ops.object.mode_set(mode='OBJECT')
70
71     orig_frame = scene.frame_current
72     scene.frame_set(frame_start)
73     me = obj.create_mesh(scene, True, 'PREVIEW')
74
75     #Flip y and z
76     mat_flip = mathutils.Matrix(\
77     [1.0, 0.0, 0.0, 0.0],\
78     [0.0, 0.0, 1.0, 0.0],\
79     [0.0, 1.0, 0.0, 0.0],\
80     [0.0, 0.0, 0.0, 1.0],\
81     )
82
83     numverts = len(me.vertices)
84
85     numframes = frame_end - frame_start + 1
86     fps = float(fps)
87     f = open(filepath, 'wb') #no Errors yet:Safe to create file
88
89     # Write the header
90     f.write(pack(">2i", numframes, numverts))
91
92     # Write the frame times (should we use the time IPO??)
93     f.write(pack(">%df" % (numframes), *[frame / fps for frame in range(numframes)])) # seconds
94
95     #rest frame needed to keep frames in sync
96     """
97     Blender.Set('curframe', frame_start)
98     me_tmp.getFromObject(obj.name)
99     """
100
101     check_vertcount(me, numverts)
102     me.transform(mat_flip * obj.matrix_world)
103     f.write(pack(">%df" % (numverts * 3), *[axis for v in me.vertices for axis in v.co]))
104
105     for frame in range(frame_start, frame_end + 1):#in order to start at desired frame
106         """
107         Blender.Set('curframe', frame)
108         me_tmp.getFromObject(obj.name)
109         """
110
111         scene.frame_set(frame)
112         me = obj.create_mesh(scene, True, 'PREVIEW')
113         check_vertcount(me, numverts)
114         me.transform(mat_flip * obj.matrix_world)
115
116         # Write the vertex data
117         f.write(pack(">%df" % (numverts * 3), *[axis for v in me.vertices for axis in v.co]))
118
119     """
120     me_tmp.vertices= None
121     """
122     f.close()
123
124     print('MDD Exported: %r frames:%d\n' % (filepath, numframes - 1))
125     """
126     Blender.Window.WaitCursor(0)
127     Blender.Set('curframe', orig_frame)
128     """
129     scene.frame_set(orig_frame)
130     
131     return {'FINISHED'}