[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3996] contrib/py/scripts/addons/ io_scene_ms3d: fix: IK constraint influence to pose_bone for export.

Alexander Nussbaumer alpha-beta-release at gmx.net
Thu Nov 22 19:05:06 CET 2012


Revision: 3996
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3996
Author:   beta-tester
Date:     2012-11-22 18:05:05 +0000 (Thu, 22 Nov 2012)
Log Message:
-----------
fix: IK constraint influence to pose_bone for export.

add: export option: record each frame as key frame.
add: import option: to enlarge bones to next child.

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

Modified: contrib/py/scripts/addons/io_scene_ms3d/__init__.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/__init__.py	2012-11-22 09:49:41 UTC (rev 3995)
+++ contrib/py/scripts/addons/io_scene_ms3d/__init__.py	2012-11-22 18:05:05 UTC (rev 3996)
@@ -23,7 +23,7 @@
         'description': "Import / Export MilkShape3D MS3D files"\
                 " (conform with v1.8.4)",
         'author': "Alexander Nussbaumer",
-        'version': (0, 5, 0, 5),
+        'version': (0, 5, 0, 6),
         'blender': (2, 6, 3, 0),
         'location': "File > Import & File > Export",
         #'warning': "",

Modified: contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py	2012-11-22 09:49:41 UTC (rev 3995)
+++ contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py	2012-11-22 18:05:05 UTC (rev 3996)
@@ -474,6 +474,7 @@
         frame_start = blender_scene.frame_start
         frame_end = blender_scene.frame_end
         frame_total = (frame_end - frame_start) + 1
+        frame_step = blender_scene.frame_step
         frame_offset = 0
 
         fps = blender_scene.render.fps * blender_scene.render.fps_base
@@ -503,9 +504,6 @@
                 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
 
@@ -571,22 +569,23 @@
             frames = frames.union(frames_rotation)
             frames = frames.union(frames_scale)
 
-            frames_sorted = list(
-                    frames.intersection(
-                            range(blender_scene.frame_start, blender_scene.frame_end + 1)
-                            )
-                    )
+            if not self.options.shrink_to_keys:
+                frames = frames.intersection(range(blender_scene.frame_start, blender_scene.frame_end + 1))
 
+            frames_sorted = list(frames)
             frames_sorted.sort()
 
-            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
 
+            if self.options.record_each_frame:
+                frames_sorted = range(int(frame_start), int(frame_end + 1), int(frame_step))
+
+            frame_temp = blender_scene.frame_current
+
             for current_frame in frames_sorted:
                 blender_scene.frame_set(current_frame)
 
@@ -596,8 +595,15 @@
                     blender_pose_bone = blender_pose_bones[blender_bone_name]
                     ms3d_joint = blender_to_ms3d_bones[blender_bone_name]
 
-                    loc = blender_pose_bone.location
-                    rot = blender_pose_bone.matrix_basis.to_euler('XZY')
+                    m1 = blender_bone.matrix_local.inverted()
+                    if blender_pose_bone.parent:
+                        m2 = blender_pose_bone.parent.matrix_channel.inverted()
+                    else:
+                        m2 = Matrix()
+                    m3 = blender_pose_bone.matrix.copy()
+                    m = ((m1 * m2) * m3)
+                    loc = m.to_translation()
+                    rot = m.to_euler('XZY')
 
                     ms3d_joint.translation_key_frames.append(
                             Ms3dTranslationKeyframe(
@@ -613,7 +619,7 @@
             blender_scene.frame_set(frame_temp)
 
         ms3d_model.animation_fps = fps
-        ms3d_model.number_total_frames = frame_total
+        ms3d_model.number_total_frames = int(frame_total)
         ms3d_model.current_time = ((blender_scene.frame_current - blender_scene.frame_start) + 1) * time_base
 
 
@@ -771,7 +777,7 @@
                 pass
 
             for keyframe_point in fcurve.keyframe_points:
-                frames.add(keyframe_point.co.to_tuple(0)[0] + frame_correction)
+                frames.add(int(keyframe_point.co[0] + frame_correction))
 
 
 ###############################################################################

Modified: contrib/py/scripts/addons/io_scene_ms3d/ms3d_import.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/ms3d_import.py	2012-11-22 09:49:41 UTC (rev 3995)
+++ contrib/py/scripts/addons/io_scene_ms3d/ms3d_import.py	2012-11-22 18:05:05 UTC (rev 3996)
@@ -753,6 +753,22 @@
             ms3d_joint.blender_edit_bone = blender_edit_bone
         enable_edit_mode(False)
 
+        if self.options.joint_to_bones:
+            enable_edit_mode(True)
+            for ms3d_joint in ms3d_joints_ordered:
+                blender_edit_bone = blender_armature.edit_bones[ms3d_joint.name]
+                if blender_edit_bone.children:
+                    new_length = 0.0
+                    for child_bone in blender_edit_bone.children:
+                        length = (child_bone.head - blender_edit_bone.head).length
+                        if new_length <= 0 or length < new_length:
+                            new_length = length
+                    if new_length >= 0.01:
+                        direction = blender_edit_bone.tail - blender_edit_bone.head
+                        direction.normalize()
+                        blender_edit_bone.tail = blender_edit_bone.head + (direction * new_length)
+            enable_edit_mode(False)
+
         ##########################
         # post process bones
         enable_edit_mode(False)

Modified: contrib/py/scripts/addons/io_scene_ms3d/ms3d_strings.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/ms3d_strings.py	2012-11-22 09:49:41 UTC (rev 3995)
+++ contrib/py/scripts/addons/io_scene_ms3d/ms3d_strings.py	2012-11-22 18:05:05 UTC (rev 3996)
@@ -232,7 +232,11 @@
         'PROP_DESC_NORMALIZE_WEIGHTS' : "normalize weights to 100%, weight' = weight(i) * (weight1 + weight2 + weight3) / 100.0",
         'PROP_NAME_SHRINK_TO_KEYS' : "Shrink To Keys",
         'PROP_DESC_SHRINK_TO_KEYS' : "shrinks the animation to region from first keyframe to last keyframe",
-
+        'PROP_NAME_RECORD_EACH_FRAME' : "Bake Each Frame As Key",
+        'PROP_DESC_RECORD_EACH_FRAME' : "if enabled, to each frame there will be baked a key",
+        'LABEL_NAME_JOINT_TO_BONES' : "works only with some models!",
+        'PROP_NAME_JOINT_TO_BONES' : "Joints To Bones",
+        'PROP_DESC_JOINT_TO_BONES' : "changes the length of the bones",
         'PROP_NAME_': "Name",
         'PROP_DESC_': "Description",
         # ms3d_str['']

Modified: contrib/py/scripts/addons/io_scene_ms3d/ms3d_ui.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/ms3d_ui.py	2012-11-22 09:49:41 UTC (rev 3995)
+++ contrib/py/scripts/addons/io_scene_ms3d/ms3d_ui.py	2012-11-22 18:05:05 UTC (rev 3996)
@@ -218,6 +218,7 @@
     ICON_PROCESSING = 'OBJECT_DATAMODE'
     ICON_ANIMATION = 'RENDER_ANIMATION'
     ICON_ROTATION_MODE = 'BONE_DATA'
+    ICON_ERROR = 'ERROR'
 
     ###########################################################################
     PROP_DEFAULT_VERBOSE = DEFAULT_VERBOSE
@@ -270,6 +271,8 @@
     PROP_DEFAULT_ANIMATION = True
     PROP_DEFAULT_NORMALIZE_WEIGHTS = True
     PROP_DEFAULT_SHRINK_TO_KEYS = False
+    PROP_DEFAULT_RECORD_EACH_FRAME = False
+    PROP_DEFAULT_JOINT_TO_BONES = False
 
     ###########################################################################
     PROP_ITEM_ROTATION_MODE_EULER = '0'
@@ -357,6 +360,12 @@
             #options={'HIDDEN', },
             )
 
+    prop_joint_to_bones = BoolProperty(
+            name=ms3d_str['PROP_NAME_JOINT_TO_BONES'],
+            description=ms3d_str['PROP_DESC_JOINT_TO_BONES'],
+            default=Ms3dUi.PROP_DEFAULT_JOINT_TO_BONES,
+            )
+
     @property
     def is_rotation_mode_euler(self):
         return (Ms3dUi.PROP_ITEM_ROTATION_MODE_EULER \
@@ -375,6 +384,9 @@
     def joint_length(self):
         return self.prop_joint_size
 
+    @property
+    def joint_to_bones(self):
+        return self.prop_joint_to_bones
 
     # draw the option panel
     def draw(self, context):
@@ -398,6 +410,9 @@
                 col = box.column()
                 row = col.row()
                 row.prop(self, 'prop_joint_size')
+            box.prop(self, 'prop_joint_to_bones')
+            if (self.prop_joint_to_bones):
+                box.box().label(ms3d_str['LABEL_NAME_JOINT_TO_BONES'], icon=Ms3dUi.ICON_ERROR)
 
     # entrypoint for MS3D -> blender
     def execute(self, blender_context):
@@ -487,7 +502,13 @@
             default=Ms3dUi.PROP_DEFAULT_SHRINK_TO_KEYS,
             )
 
+    prop_record_each_frame = BoolProperty(
+            name=ms3d_str['PROP_NAME_RECORD_EACH_FRAME'],
+            description=ms3d_str['PROP_DESC_RECORD_EACH_FRAME'],
+            default=Ms3dUi.PROP_DEFAULT_RECORD_EACH_FRAME,
+            )
 
+
     @property
     def handle_animation(self):
         return (Ms3dUi.PROP_ITEM_OBJECT_ANIMATION in self.prop_objects)
@@ -516,6 +537,10 @@
     def shrink_to_keys(self):
         return self.prop_shrink_to_keys
 
+    @property
+    def record_each_frame(self):
+        return self.prop_record_each_frame
+
     ##EXPORT_ACTIVE_ONLY:
     ##limit availability to only active mesh object
     @classmethod
@@ -549,6 +574,7 @@
                 icon=Ms3dUi.ICON_ANIMATION)
         box.prop(self, 'prop_normalize_weights')
         box.prop(self, 'prop_shrink_to_keys')
+        box.prop(self, 'prop_record_each_frame')
         """
         box.prop(self, 'prop_objects', icon='MESH_DATA', expand=True)
 
@@ -1543,7 +1569,6 @@
     def poll(cls, context):
         return True
 
-
     # entrypoint for option
     def execute(self, context):
         return self.set_sence_to_metric(context)



More information about the Bf-extensions-cvs mailing list