[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3994] contrib/py/scripts/addons/ io_scene_ms3d: fixed blender crashed during export meshes with some special models.

Alexander Nussbaumer alpha-beta-release at gmx.net
Wed Nov 21 20:28:07 CET 2012


Revision: 3994
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3994
Author:   beta-tester
Date:     2012-11-21 19:28:06 +0000 (Wed, 21 Nov 2012)
Log Message:
-----------
fixed blender crashed during export meshes with some special models.
- to prevent crash, i changed exporter from
    bm = bmesh.from_edit_mesh(mesh)
    to
    bm = bmesh.new()
    bm.from_mesh(mesh)
  did something relevant changed from r52225 (was ok) to r52344 (crashes) ???

- added export option to shrink animation to only the region of keyframes (usable when exporting nls-track strips)
- changed (re-)initialization of add-on (F8-key)

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=52225
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=52344

Modified Paths:
--------------
    contrib/py/scripts/addons/io_scene_ms3d/__init__.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_import.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_strings.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_ui.py
    contrib/py/scripts/addons/io_scene_ms3d/ms3d_utils.py

Modified: contrib/py/scripts/addons/io_scene_ms3d/__init__.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/__init__.py	2012-11-21 02:45:43 UTC (rev 3993)
+++ contrib/py/scripts/addons/io_scene_ms3d/__init__.py	2012-11-21 19:28:06 UTC (rev 3994)
@@ -23,7 +23,7 @@
         'description': "Import / Export MilkShape3D MS3D files"\
                 " (conform with v1.8.4)",
         'author': "Alexander Nussbaumer",
-        'version': (0, 5, 0, 4),
+        'version': (0, 5, 0, 5),
         'blender': (2, 6, 3, 0),
         'location': "File > Import & File > Export",
         #'warning': "",
@@ -48,7 +48,7 @@
 
 # To support reload properly, try to access a package var,
 # if it's there, reload everything
-if ('bpy' in locals()):
+if 'bpy' in locals():
     import imp
     if 'io_scene_ms3d.ms3d_ui' in locals():
         imp.reload(io_scene_ms3d.ms3d_ui)
@@ -73,12 +73,23 @@
 ###############################################################################
 # registration
 def register():
+    ####################
+    # F8 - key
+    import imp
+    imp.reload(ms3d_ui)
+    # F8 - key
+    ####################
+
+    ms3d_ui.register()
+
     register_module(__name__)
     INFO_MT_file_export.append(Ms3dExportOperator.menu_func)
     INFO_MT_file_import.append(Ms3dImportOperator.menu_func)
 
 
 def unregister():
+    ms3d_ui.unregister()
+
     unregister_module(__name__)
     INFO_MT_file_export.remove(Ms3dExportOperator.menu_func)
     INFO_MT_file_import.remove(Ms3dImportOperator.menu_func)

Modified: contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py	2012-11-21 02:45:43 UTC (rev 3993)
+++ contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py	2012-11-21 19:28:06 UTC (rev 3994)
@@ -55,50 +55,50 @@
 
 # To support reload properly, try to access a package var,
 # if it's there, reload everything
-if ('bpy' in locals()):
-    import imp
-    if 'io_scene_ms3d.ms3d_strings' in locals():
-        imp.reload(io_scene_ms3d.ms3d_strings)
-    if 'io_scene_ms3d.ms3d_spec' in locals():
-        imp.reload(io_scene_ms3d.ms3d_spec)
-    if 'io_scene_ms3d.ms3d_utils' in locals():
-        imp.reload(io_scene_ms3d.ms3d_utils)
-    if 'io_scene_ms3d.ms3d_ui' in locals():
-        imp.reload(io_scene_ms3d.ms3d_ui)
-    pass
-else:
-    from io_scene_ms3d.ms3d_strings import (
-            ms3d_str,
-            )
-    from io_scene_ms3d.ms3d_spec import (
-            Ms3dSpec,
-            Ms3dModel,
-            Ms3dModelEx,
-            Ms3dVertex,
-            Ms3dVertexEx2,
-            Ms3dTriangle,
-            Ms3dGroup,
-            Ms3dMaterial,
-            Ms3dJoint,
-            Ms3dJointEx,
-            Ms3dRotationKeyframe,
-            Ms3dTranslationKeyframe,
-            Ms3dComment,
-            Ms3dCommentEx,
-            )
-    from io_scene_ms3d.ms3d_utils import (
-            select_all,
-            enable_pose_mode,
-            enable_edit_mode,
-            pre_setup_environment,
-            post_setup_environment,
-            rotation_matrix,
-            matrix_difference,
-            )
-    from io_scene_ms3d.ms3d_ui import (
-            Ms3dUi,
-            )
-    pass
+#if ('bpy' in locals()):
+#    import imp
+#    if 'io_scene_ms3d.ms3d_strings' in locals():
+#        imp.reload(io_scene_ms3d.ms3d_strings)
+#    if 'io_scene_ms3d.ms3d_spec' in locals():
+#        imp.reload(io_scene_ms3d.ms3d_spec)
+#    if 'io_scene_ms3d.ms3d_utils' in locals():
+#        imp.reload(io_scene_ms3d.ms3d_utils)
+#    if 'io_scene_ms3d.ms3d_ui' in locals():
+#        imp.reload(io_scene_ms3d.ms3d_ui)
+#    pass
+#else:
+from io_scene_ms3d.ms3d_strings import (
+        ms3d_str,
+        )
+from io_scene_ms3d.ms3d_spec import (
+        Ms3dSpec,
+        Ms3dModel,
+        Ms3dModelEx,
+        Ms3dVertex,
+        Ms3dVertexEx2,
+        Ms3dTriangle,
+        Ms3dGroup,
+        Ms3dMaterial,
+        Ms3dJoint,
+        Ms3dJointEx,
+        Ms3dRotationKeyframe,
+        Ms3dTranslationKeyframe,
+        Ms3dComment,
+        Ms3dCommentEx,
+        )
+from io_scene_ms3d.ms3d_utils import (
+        select_all,
+        enable_pose_mode,
+        enable_edit_mode,
+        pre_setup_environment,
+        post_setup_environment,
+        rotation_matrix,
+        matrix_difference,
+        )
+from io_scene_ms3d.ms3d_ui import (
+        Ms3dUi,
+        )
+#    pass
 
 
 #import blender stuff
@@ -261,17 +261,13 @@
             # create a complete copy of mesh and bend object data
             # to be able to apply operations to it.
 
-            # get a temporary mesh with applied modifiers
-            if self.options.prop_apply_modifier:
-                blender_mesh_temp = blender_mesh_object.to_mesh(blender_scene,
-                        self.options.prop_apply_modifier,
-                        self.options.prop_apply_modifier_mode)
-            else:
-                blender_mesh_temp = blender_mesh_object.data.copy()
+            # temporary, create a full copy of the model
+            blender_mesh_temp = blender_mesh_object.data.copy()
+            blender_mesh_object_temp = blender_mesh_object.copy()
+            blender_mesh_object_temp.data = blender_mesh_temp
+            blender_scene.objects.link(blender_mesh_object_temp)
+            blender_scene.objects.active = blender_mesh_object_temp
 
-            # assign temporary mesh as new object data
-            blender_mesh_object.data = blender_mesh_temp
-
             # convert to tris
             enable_edit_mode(True)
             select_all(True)
@@ -280,7 +276,8 @@
             enable_edit_mode(False)
 
             enable_edit_mode(True)
-            bm = bmesh.from_edit_mesh(blender_mesh_temp)
+            bm = bmesh.new()
+            bm.from_mesh(blender_mesh_temp)
 
             layer_texture = bm.faces.layers.tex.get(
                     ms3d_str['OBJECT_LAYER_TEXTURE'])
@@ -318,7 +315,7 @@
                     ms3d_vertex = Ms3dVertex()
                     ms3d_vertex.__index = index
 
-                    loc = (bmv.co + blender_mesh_object.location)
+                    loc = (bmv.co + blender_mesh_object_temp.location)
                     ms3d_vertex._vertex = self.geometry_correction(loc)
 
                     if layer_deform:
@@ -329,7 +326,7 @@
                             weights = []
                             for blender_index, blender_weight in blender_vertex_group_ids.items():
                                 ms3d_joint = blender_to_ms3d_bones.get(
-                                        blender_mesh_object.vertex_groups[blender_index].name)
+                                        blender_mesh_object_temp.vertex_groups[blender_index].name)
                                 if ms3d_joint:
                                     if count == 0:
                                         ms3d_vertex.bone_id = ms3d_joint.__index
@@ -457,26 +454,31 @@
             enable_edit_mode(False)
 
             ##########################
-            # restore original object data
-            blender_mesh_object.data = blender_mesh
-
-            ##########################
             # remove the temporary data
+            blender_scene.objects.unlink(blender_mesh_object_temp)
+            if blender_mesh_object_temp is not None:
+                blender_mesh_object_temp.user_clear()
+                blender_context.blend_data.objects.remove(blender_mesh_object_temp)
             if blender_mesh_temp is not None:
                 blender_mesh_temp.user_clear()
                 blender_context.blend_data.meshes.remove(blender_mesh_temp)
 
 
+
     ###########################################################################
     def create_animation(self, blender_context, ms3d_model, blender_mesh_objects, blender_to_ms3d_bones):
         ##########################
         # setup scene
         blender_scene = blender_context.scene
-        ms3d_model.animation_fps = blender_scene.render.fps * blender_scene.render.fps_base
-        ms3d_model.number_total_frames = (blender_scene.frame_end - blender_scene.frame_start) + 1
-        ms3d_model.current_time = ((blender_scene.frame_current - blender_scene.frame_start) + 1)\
-                / (blender_scene.render.fps * blender_scene.render.fps_base)
 
+        frame_start = blender_scene.frame_start
+        frame_end = blender_scene.frame_end
+        frame_total = (frame_end - frame_start) + 1
+        frame_offset = 0
+
+        fps = blender_scene.render.fps * blender_scene.render.fps_base
+        time_base = 1.0 / fps
+
         base_bone_correction = Matrix.Rotation(pi / 2, 4, 'Z')
 
         for blender_mesh_object in blender_mesh_objects:
@@ -494,12 +496,16 @@
 
             ##########################
             # bones
-            blender_bones_ordered = self.build_blender_bone_dependency_order(blender_bones)
+            blender_bones_ordered = []
+            self.build_blender_bone_dependency_order(blender_bones, blender_bones_ordered)
             for blender_bone_name in blender_bones_ordered:
                 blender_bone_oject = blender_bones[blender_bone_name]
                 ms3d_joint = Ms3dJoint()
                 ms3d_joint.__index = len(ms3d_model._joints)
 
+                ms3d_joint.__bone_mat = blender_bones[blender_bone_name].matrix
+                ms3d_joint.__bone_mati = blender_bones[blender_bone_name].matrix.inverted()
+
                 blender_bone_ms3d = blender_bone_oject.ms3d
                 blender_bone = blender_bone_oject
 
@@ -570,15 +576,21 @@
                             range(blender_scene.frame_start, blender_scene.frame_end + 1)
                             )
                     )
+
             frames_sorted.sort()
 
-            time_base = 1.0 / (blender_scene.render.fps / blender_scene.render.fps_base)
+            frame_temp = blender_scene.frame_current
 
-            frame_temp = blender_scene.frame_current
+            if self.options.shrink_to_keys and len(frames_sorted) >= 2:
+                frame_start = frames_sorted[0]
+                frame_end = frames_sorted[len(frames_sorted)-1]
+                frame_total = (frame_end - frame_start) + 1
+                frame_offset = frame_start - 1
+
             for current_frame in frames_sorted:
                 blender_scene.frame_set(current_frame)
 

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list