From 4a25a2ba057fd40ddeb766f776d509bbe72cbdee Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 9 Dec 2012 14:06:34 +0000 Subject: initialize start_frame/end_frame from the scene, dont transform the verts on export. --- io_shape_mdd/__init__.py | 39 ++++++++++++------------- io_shape_mdd/export_mdd.py | 23 +++------------ io_shape_mdd/import_mdd.py | 72 +++++++++++++++++++++++----------------------- 3 files changed, 59 insertions(+), 75 deletions(-) diff --git a/io_shape_mdd/__init__.py b/io_shape_mdd/__init__.py index b36bebc0..8a6450b1 100644 --- a/io_shape_mdd/__init__.py +++ b/io_shape_mdd/__init__.py @@ -40,7 +40,7 @@ if "bpy" in locals(): import bpy -from bpy.props import StringProperty, IntProperty +from bpy.props import StringProperty, IntProperty, FloatProperty from bpy_extras.io_utils import ExportHelper, ImportHelper @@ -70,16 +70,16 @@ class ImportMDD(bpy.types.Operator, ImportHelper): @classmethod def poll(cls, context): - ob = context.active_object - return (ob and ob.type == 'MESH') - - def execute(self, context): + obj = context.active_object + return (obj and obj.type == 'MESH') - # initialize from scene if unset + def invoke(self, context, event): scene = context.scene - if not self.frame_start: - self.frame_start = scene.frame_current + self.frame_start = scene.frame_start + + return super().invoke(context, event) + def execute(self, context): keywords = self.as_keywords(ignore=("filter_glob",)) from . import import_mdd @@ -98,16 +98,16 @@ class ExportMDD(bpy.types.Operator, ExportHelper): minframe = 1 maxframe = 300000 - minfps = 1 - maxfps = 120 + minfps = 1.0 + maxfps = 120.0 # List of operator properties, the attributes will be assigned # to the class instance from the operator settings before calling. - fps = IntProperty( + fps = FloatProperty( name="Frames Per Second", description="Number of frames/second", min=minfps, max=maxfps, - default=25, + default=25.0, ) frame_start = IntProperty( name="Start Frame", @@ -127,16 +127,15 @@ class ExportMDD(bpy.types.Operator, ExportHelper): obj = context.active_object return (obj and obj.type == 'MESH') - def execute(self, context): - # initialize from scene if unset + def invoke(self, context, event): scene = context.scene - if not self.frame_start: - self.frame_start = scene.frame_start - if not self.frame_end: - self.frame_end = scene.frame_end - if not self.fps: - self.fps = scene.render.fps + self.frame_start = scene.frame_start + self.frame_end = scene.frame_end + self.fps = scene.render.fps / scene.render.fps_base + return super().invoke(context, event) + + def execute(self, context): keywords = self.as_keywords(ignore=("check_existing", "filter_glob")) from . import export_mdd diff --git a/io_shape_mdd/export_mdd.py b/io_shape_mdd/export_mdd.py index d078083a..aaa2f6a9 100644 --- a/io_shape_mdd/export_mdd.py +++ b/io_shape_mdd/export_mdd.py @@ -51,7 +51,7 @@ def check_vertcount(mesh, vertcount): raise Exception('Error, number of verts has changed during animation, cannot export') -def save(operator, context, filepath="", frame_start=1, frame_end=300, fps=25): +def save(operator, context, filepath="", frame_start=1, frame_end=300, fps=25.0): """ Blender.Window.WaitCursor(1) @@ -70,16 +70,18 @@ def save(operator, context, filepath="", frame_start=1, frame_end=300, fps=25): me = obj.to_mesh(scene, True, 'PREVIEW') #Flip y and z + ''' 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), )) + ''' + mat_flip = mathutils.Matrix() numverts = len(me.vertices) numframes = frame_end - frame_start + 1 - fps = float(fps) f = open(filepath, 'wb') # no Errors yet:Safe to create file # Write the header @@ -89,21 +91,11 @@ def save(operator, context, filepath="", frame_start=1, frame_end=300, fps=25): f.write(pack(">%df" % (numframes), *[frame / fps for frame in range(numframes)])) # seconds #rest frame needed to keep frames in sync - """ - Blender.Set('curframe', frame_start) - me_tmp.getFromObject(obj.name) - """ - check_vertcount(me, numverts) me.transform(mat_flip * obj.matrix_world) f.write(pack(">%df" % (numverts * 3), *[axis for v in me.vertices for axis in v.co])) for frame in range(frame_start, frame_end + 1): # in order to start at desired frame - """ - Blender.Set('curframe', frame) - me_tmp.getFromObject(obj.name) - """ - scene.frame_set(frame) me = obj.to_mesh(scene, True, 'PREVIEW') check_vertcount(me, numverts) @@ -112,16 +104,9 @@ def save(operator, context, filepath="", frame_start=1, frame_end=300, fps=25): # Write the vertex data f.write(pack(">%df" % (numverts * 3), *[axis for v in me.vertices for axis in v.co])) - """ - me_tmp.vertices= None - """ f.close() print('MDD Exported: %r frames:%d\n' % (filepath, numframes - 1)) - """ - Blender.Window.WaitCursor(0) - Blender.Set('curframe', orig_frame) - """ scene.frame_set(orig_frame) return {'FINISHED'} diff --git a/io_shape_mdd/import_mdd.py b/io_shape_mdd/import_mdd.py index f5136856..e671e285 100644 --- a/io_shape_mdd/import_mdd.py +++ b/io_shape_mdd/import_mdd.py @@ -34,6 +34,41 @@ import bpy from struct import unpack +def obj_update_frame(file, scene, obj, fr, step): + + # Insert new shape key + new_shapekey = obj.shape_key_add() + new_shapekey.name = ("frame_%.4d" % fr) + + obj.active_shape_key_index = len(obj.data.shape_keys.key_blocks) - 1 + index = len(obj.data.shape_keys.key_blocks) - 1 + obj.show_only_shape_key = True + + verts = obj.data.shape_keys.key_blocks[len(obj.data.shape_keys.key_blocks) - 1].data + + for v in verts: # 12 is the size of 3 floats + v.co[:] = unpack('>3f', file.read(12)) + + # me.update() + obj.show_only_shape_key = False + + # insert keyframes + shape_keys = obj.data.shape_keys + + scene.frame_current -= step + obj.data.shape_keys.key_blocks[index].value = 0.0 + shape_keys.key_blocks[len(obj.data.shape_keys.key_blocks) - 1].keyframe_insert("value") + + scene.frame_current += step + obj.data.shape_keys.key_blocks[index].value = 1.0 + shape_keys.key_blocks[len(obj.data.shape_keys.key_blocks) - 1].keyframe_insert("value") + + scene.frame_current += step + obj.data.shape_keys.key_blocks[index].value = 0.0 + shape_keys.key_blocks[len(obj.data.shape_keys.key_blocks) - 1].keyframe_insert("value") + + obj.data.update() + def load(operator, context, filepath, frame_start=0, frame_step=1): @@ -60,42 +95,7 @@ def load(operator, context, filepath, frame_start=0, frame_step=1): scene.frame_current = frame_start - def UpdateMesh(ob, fr, step): - - # Insert new shape key - new_shapekey = obj.shape_key_add() - new_shapekey.name = ("frame_%.4d" % fr) - - obj.active_shape_key_index = len(obj.data.shape_keys.key_blocks) - 1 - index = len(obj.data.shape_keys.key_blocks) - 1 - obj.show_only_shape_key = True - - verts = obj.data.shape_keys.key_blocks[len(obj.data.shape_keys.key_blocks) - 1].data - - for v in verts: # 12 is the size of 3 floats - v.co[:] = unpack('>3f', file.read(12)) - - # me.update() - obj.show_only_shape_key = False - - # insert keyframes - shape_keys = obj.data.shape_keys - - scene.frame_current -= step - obj.data.shape_keys.key_blocks[index].value = 0.0 - shape_keys.key_blocks[len(obj.data.shape_keys.key_blocks) - 1].keyframe_insert("value") - - scene.frame_current += step - obj.data.shape_keys.key_blocks[index].value = 1.0 - shape_keys.key_blocks[len(obj.data.shape_keys.key_blocks) - 1].keyframe_insert("value") - - scene.frame_current += step - obj.data.shape_keys.key_blocks[index].value = 0.0 - shape_keys.key_blocks[len(obj.data.shape_keys.key_blocks) - 1].keyframe_insert("value") - - obj.data.update() - for i in range(frames): - UpdateMesh(obj, i, frame_step) + obj_update_frame(file, scene, obj, i, frame_step) return {'FINISHED'} -- cgit v1.2.3