forked from bartvdbraak/blender
da4c1cd8d3
* MDD export failed when using a particle-instance modifier due to the use of different ways of retrieving a mesh to count it's vertices. * MDD importer now shows up in menu of importers again
155 lines
4.5 KiB
Python
155 lines
4.5 KiB
Python
#!BPY
|
|
|
|
"""
|
|
Name: 'Vertex Keyframe Animation (.mdd)...'
|
|
Blender: 242
|
|
Group: 'Export'
|
|
Tooltip: 'Animated mesh to MDD vertex keyframe file.'
|
|
"""
|
|
|
|
__author__ = "Bill L.Nieuwendorp"
|
|
__bpydoc__ = """\
|
|
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
|
|
"""
|
|
#Please send any fixes,updates,bugs to Slow67_at_Gmail.com or cbarton_at_metavr.com
|
|
#Bill Niewuendorp
|
|
# ***** BEGIN GPL LICENSE BLOCK *****
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
#
|
|
# ***** END GPL LICENCE BLOCK *****
|
|
|
|
import bpy
|
|
import Blender
|
|
from Blender import *
|
|
import BPyMessages
|
|
try:
|
|
from struct import pack
|
|
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 = Mesh.New()
|
|
mesh_orig.getFromObject(ob.name)
|
|
|
|
#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, 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
|
|
|
|
numverts = len(mesh_orig.verts)
|
|
numframes = PREF_ENDFRAME-PREF_STARTFRAME+1
|
|
PREF_FPS= float(PREF_FPS)
|
|
f = open(filepath, 'wb') #no Errors yet:Safe to create file
|
|
|
|
# Write the header
|
|
f.write(pack(">2i", numframes-1, numverts))
|
|
|
|
# Write the frame times (should we use the time IPO??)
|
|
f.write( pack(">%df" % (numframes-1), *[frame/PREF_FPS for frame in xrange(numframes-1)]) ) # seconds
|
|
|
|
Blender.Set('curframe', PREF_STARTFRAME)
|
|
for frame in xrange(PREF_STARTFRAME,PREF_ENDFRAME+1):#in order to start at desired frame
|
|
Blender.Set('curframe', frame)
|
|
# Blender.Window.RedrawAll() # not needed
|
|
me_tmp.getFromObject(ob.name)
|
|
|
|
if len(me_tmp.verts) != numverts:
|
|
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)
|
|
|
|
# Write the vertex data
|
|
f.write(pack(">%df" % (numverts*3), *[axis for v in me_tmp.verts for axis in v.co]))
|
|
|
|
me_tmp.verts= None
|
|
f.close()
|
|
|
|
print'MDD Exported: %s frames:%d\n'% (filepath, numframes-1)
|
|
Blender.Window.WaitCursor(0)
|
|
|
|
|
|
def mdd_export_ui(filepath):
|
|
# Dont overwrite
|
|
if not BPyMessages.Warning_SaveOver(filepath):
|
|
return
|
|
|
|
scn= bpy.data.scenes.active
|
|
ob_act= scn.objects.active
|
|
if not ob_act or ob_act.type != 'Mesh':
|
|
BPyMessages.Error_NoMeshActive()
|
|
|
|
ctx = scn.getRenderingContext()
|
|
orig_frame = Blender.Get('curframe')
|
|
PREF_STARTFRAME= Blender.Draw.Create(int(ctx.startFrame()))
|
|
PREF_ENDFRAME= Blender.Draw.Create(int(ctx.endFrame()))
|
|
PREF_FPS= Blender.Draw.Create(ctx.fps)
|
|
|
|
block = [\
|
|
("Start Frame: ", PREF_STARTFRAME, 1, 30000, "Start Bake from what frame?: Default 1"),\
|
|
("End Frame: ", PREF_ENDFRAME, 1, 30000, "End Bake on what Frame?"),\
|
|
("FPS: ", PREF_FPS, 1, 100, "Frames per second")\
|
|
]
|
|
|
|
if not Blender.Draw.PupBlock("Export MDD", block):
|
|
return
|
|
|
|
PREF_STARTFRAME, PREF_ENDFRAME=\
|
|
min(PREF_STARTFRAME.val, PREF_ENDFRAME.val),\
|
|
max(PREF_STARTFRAME.val, PREF_ENDFRAME.val)
|
|
|
|
print (filepath, ob_act, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS.val)
|
|
mdd_export(filepath, ob_act, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS.val)
|
|
Blender.Set('curframe', orig_frame)
|
|
|
|
if __name__=='__main__':
|
|
if not pack:
|
|
Draw.PupMenu('Error%t|This script requires a full python install')
|
|
|
|
Blender.Window.FileSelector(mdd_export_ui, 'EXPORT MDD', sys.makename(ext='.mdd'))
|