[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3183] trunk/py/scripts/addons/ io_import_scene_mhx.py: MHX importer: worst bugs in FK/IK snap fixed.

Thomas Larsson thomas_larsson_01 at hotmail.com
Tue Mar 27 19:01:27 CEST 2012


Revision: 3183
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3183
Author:   thomasl
Date:     2012-03-27 17:01:19 +0000 (Tue, 27 Mar 2012)
Log Message:
-----------
MHX importer: worst bugs in FK/IK snap fixed.

Modified Paths:
--------------
    trunk/py/scripts/addons/io_import_scene_mhx.py

Modified: trunk/py/scripts/addons/io_import_scene_mhx.py
===================================================================
--- trunk/py/scripts/addons/io_import_scene_mhx.py	2012-03-27 09:50:45 UTC (rev 3182)
+++ trunk/py/scripts/addons/io_import_scene_mhx.py	2012-03-27 17:01:19 UTC (rev 3183)
@@ -98,7 +98,7 @@
 
 T_EnforceVersion = 0x01
 T_Clothes = 0x02
-T_Stretch = 0x04
+T_CloRig = 0x04
 
 T_Diamond = 0x10
 T_Replace = 0x20
@@ -2826,7 +2826,7 @@
     #("replace", "Replace scene", "Replace scene", T_Replace),
     ("cage", "Cage", "Load mesh deform cage", T_Cage),
     ("clothes", "Clothes", "Include clothes", T_Clothes),
-    #("stretch", "Stretchy limbs", "Stretchy limbs", T_Stretch),
+    ("clorig", "Clothes rig", "Include clothes rig", T_CloRig),
     ("face", "Face shapes", "Include facial shapekeys", T_Face),
     ("shape", "Body shapes", "Include body shapekeys", T_Shape),
     #("symm", "Symmetric shapes", "Keep shapekeys symmetric", T_Symm),
@@ -3256,7 +3256,7 @@
         else:
             setBoneLocation(context, pbones[b+'_L'], scale, loc, False, setKey, frame)
             setBoneLocation(context, pbones[b+'_R'], scale, loc, True, setKey, frame)
-    updatePose(context.scene)
+    updatePose(context)
     return
 
 def setBoneLocation(context, pb, scale, loc, mirror, setKey, frame):
@@ -3305,7 +3305,7 @@
             setViseme(context, vis, True, int(words[0])+offs)
     fp.close()
     setInterpolation(rig)
-    updatePose(context.scene)
+    updatePose(context)
     print("Moho file %s loaded" % filepath)
     return
 
@@ -3323,7 +3323,7 @@
             setViseme(context, vis, True, int(words[0])+offs)
     fp.close()
     setInterpolation(rig)
-    updatePose(context.scene)
+    updatePose(context)
     print("Magpie file %s loaded" % filepath)
     return
 
@@ -3405,14 +3405,15 @@
         return
         
 #
-#   updatePose(scn):
+#   updatePose(context):
 #   class VIEW3D_OT_MhxUpdateButton(bpy.types.Operator):
 #
 
-def updatePose(scn):
-    scn = bpy.context.scene
+def updatePose(context):
+    scn = context.scene
     scn.frame_current = scn.frame_current
-    #scn.frame_current -= 1
+    bpy.ops.object.posemode_toggle()
+    bpy.ops.object.posemode_toggle()
     return
 
 class VIEW3D_OT_MhxUpdateButton(bpy.types.Operator):
@@ -3420,7 +3421,7 @@
     bl_label = "Update"
 
     def execute(self, context):
-        updatePose(context.scene)
+        updatePose(context)
         return{'FINISHED'}    
         
 
@@ -3442,7 +3443,7 @@
         props = getShapeProps(rig)
         for (prop, name) in props:
             rig[prop] = 0.0
-        updatePose(context.scene)
+        updatePose(context)
         return{'FINISHED'}    
 
 #
@@ -3459,7 +3460,7 @@
         frame = context.scene.frame_current
         for (prop, name) in props:
             rig.keyframe_insert('["%s"]' % prop, frame=frame)
-        updatePose(context.scene)
+        updatePose(context)
         return{'FINISHED'}    
 #
 #    class VIEW3D_OT_MhxPinExpressionButton(bpy.types.Operator):
@@ -3489,7 +3490,7 @@
                     rig[prop] = 1.0
                 else:
                     rig[prop] = 0.0
-        updatePose(context.scene)
+        updatePose(context)
         return{'FINISHED'}    
 
 #
@@ -3545,13 +3546,25 @@
 #
 #########################################
 
+def getParent(pb):
+    if pb.parent:
+        return pb.parent
+    #return None
+    for cns in pb.constraints:
+        if cns.type == 'CHILD_OF' and cns.influence > 0.5:
+            ob = cns.target
+            parent = ob.pose.bones[cns.subtarget]
+            return parent
+    return None            
+    
 def getPoseMatrixInOtherSpace(mat, pb):
     rest = pb.bone.matrix_local.copy()
     restInv = rest.inverted()
-    if pb.parent:
-        parMat = pb.parent.matrix.copy()
+    parent = getParent(pb)
+    if parent:
+        parMat = parent.matrix.copy()
         parInv = parMat.inverted()
-        parRest = pb.parent.bone.matrix_local.copy()
+        parRest = parent.bone.matrix_local.copy()
     else:
         parMat = Matrix()
         parInv = Matrix()
@@ -3573,8 +3586,9 @@
         loc = mat.to_translation()
 
         rest = pb.bone.matrix_local.copy()
-        if pb.bone.parent:
-            parRest = pb.bone.parent.matrix_local.copy()
+        parent = getParent(pb)
+        if parent:
+            parRest = parent.bone.matrix_local.copy()
         else:
             parRest = Matrix()
 
@@ -3688,7 +3702,7 @@
 
 def fk2ikArm(context, suffix):
     rig = context.object
-    print("FK -> IK Arm")
+    print("Snap FK Arm")
     (uparmIk, loarmIk, elbowPt, wrist) = getSnapBones(rig, "ArmIK", suffix)
     (uparmFk, loarmFk, handFk) = getSnapBones(rig, "ArmFK", suffix)
 
@@ -3706,6 +3720,7 @@
 
 def ik2fkArm(context, suffix):
     rig = context.object
+    print("Snap IK Arm")
     (uparmIk, loarmIk, elbowPt, wrist) = getSnapBones(rig, "ArmIK", suffix)
     (uparmFk, loarmFk, handFk) = getSnapBones(rig, "ArmFK", suffix)
 
@@ -3719,6 +3734,7 @@
 
 def fk2ikLeg(context, suffix):
     rig = context.object
+    print("Snap FK Leg%s" % suffix)
     (uplegIk, lolegIk, kneePt, ankleIk, legIk, legFk) = getSnapBones(rig, "LegIK", suffix)
     (uplegFk, lolegFk, footFk) = getSnapBones(rig, "LegFK", suffix)
 
@@ -3734,41 +3750,30 @@
 
 def ik2fkLeg(context, suffix):
     rig = context.object
+    print("Snap IK Leg%s" % suffix)
     (uplegIk, lolegIk, kneePt, ankleIk, legIk, legFk) = getSnapBones(rig, "LegIK", suffix)
     (uplegFk, lolegFk, footFk) = getSnapBones(rig, "LegFK", suffix)
 
     legIkToAngle = "&LegIkToAnkle" + suffix
     oldLegIkToAnkle = rig[legIkToAngle]
-
-    if True or oldLegIkToAnkle > 0.9:
-        matchPoseTranslation(ankleIk, footFk)
-    else:
-        childof = None
-        for cns in ankleIk.constraints:
-            if cns.type == 'CHILD_OF':
-                childof = cns
-                print("Found Child-of constraint", childof)  
-                break
-        if not childof:
-            raise NameError("Something is wrong. Cannot find Child-of constraint")
-            
-        oldActive = rig.data.bones.active
-        rig.data.bones.active = ankleIk.bone
-        rig[legIkToAngle] = 1.0
-        bpy.ops.constraint.childof_set_inverse(constraint=childof.name, owner='BONE')
-        matchPoseTranslation(ankleIk, footFk)
+    oldActive = rig.data.bones.active
+    rig.data.bones.active = ankleIk.bone
+    rig[legIkToAngle] = 1.0
+    matchPoseTranslation(ankleIk, footFk)
+    if oldLegIkToAnkle > 0.5:
         matchPoseTranslation(legIk, legFk)
         matchPoseRotation(legIk, legFk)  
         matchPoseScale(legIk, legFk)
-        rig.data.bones.active = ankleIk.bone
-        rig[legIkToAngle] = oldLegIkToAnkle
-        halt
-        bpy.ops.constraint.childof_set_inverse(constraint=childof.name, owner='BONE')
-        rig.data.bones.active = oldActive 
+    matchPoleTarget(uplegIk, lolegIk, kneePt, uplegFk, (uplegIk.length + lolegIk.length))        
+    rig.data.bones.active = ankleIk.bone
+    rig[legIkToAngle] = oldLegIkToAnkle
 
-    matchPoleTarget(uplegIk, lolegIk, kneePt, uplegFk, (uplegIk.length + lolegIk.length))
     return
 
+#
+#
+#
+
 SnapBones = {
     "ArmFK" : ["UpArm", "LoArm", "Hand"],
     "ArmIK" : ["UpArmIK", "LoArmIK", "ElbowPT", "Wrist"],
@@ -3786,37 +3791,77 @@
 
 class VIEW3D_OT_MhxSnapFk2IkButton(bpy.types.Operator):
     bl_idname = "mhx.snap_fk_ik"
-    bl_label = "Set FK"
-    bone = StringProperty()    
+    bl_label = "Snap FK"
+    data = StringProperty()    
 
     def execute(self, context):
         bpy.ops.object.mode_set(mode='POSE')
-        if self.bone[:3] == "Arm":
-            fk2ikArm(context, self.bone[-2:])
-        elif self.bone[:3] == "Leg":
-            fk2ikLeg(context, self.bone[-2:])
+        rig = context.object
+        (prop, old) = setSnapProp(rig, self.data, 1.0, context, False)
+        if prop[:4] == "&Arm":
+            fk2ikArm(context, prop[-2:])
+        elif prop[:4] == "&Leg":
+            fk2ikLeg(context, prop[-2:])
+        restoreSnapProp(rig, prop, old, context)
         return{'FINISHED'}    
 
 class VIEW3D_OT_MhxSnapIk2FkButton(bpy.types.Operator):
     bl_idname = "mhx.snap_ik_fk"
-    bl_label = "Set IK"
-    bone = StringProperty()    
+    bl_label = "Snap IK"
+    data = StringProperty()    
 
     def execute(self, context):
         bpy.ops.object.mode_set(mode='POSE')
-        if self.bone[:3] == "Arm":
-            ik2fkArm(context, self.bone[-2:])
-        elif self.bone[:3] == "Leg":
-            ik2fkLeg(context, self.bone[-2:])
+        rig = context.object
+        (prop, old) = setSnapProp(rig, self.data, 0.0, context, True)
+        if prop[:4] == "&Arm":
+            ik2fkArm(context, prop[-2:])
+        elif prop[:4] == "&Leg":
+            ik2fkLeg(context, prop[-2:])
+        restoreSnapProp(rig, prop, old, context)
         return{'FINISHED'}    
 
+def setSnapProp(rig, data, value, context, isIk):
+    words = data.split()
+    prop = words[0]
+    oldValue = rig[prop]
+    rig[prop] = value
+    ik = int(words[1])
+    fk = int(words[2])
+    extra = int(words[3])
+    oldIk = rig.data.layers[ik]
+    oldFk = rig.data.layers[fk]
+    oldExtra = rig.data.layers[extra]
+    rig.data.layers[ik] = True
+    rig.data.layers[fk] = True
+    rig.data.layers[extra] = True
+    updatePose(context)
+    if isIk:
+        oldValue = 1.0
+        oldIk = True
+        oldFk = False
+    else:
+        oldValue = 0.0
+        oldIk = False
+        oldFk = True
+        oldExtra = False
+    return (prop, (oldValue, ik, fk, extra, oldIk, oldFk, oldExtra))
+    
+def restoreSnapProp(rig, prop, old, context):
+    updatePose(context)
+    (oldValue, ik, fk, extra, oldIk, oldFk, oldExtra) = old
+    rig[prop] = oldValue
+    rig.data.layers[ik] = oldIk
+    rig.data.layers[fk] = oldFk
+    rig.data.layers[extra] = oldExtra
+    return
+
 class VIEW3D_OT_MhxToggleFkIkButton(bpy.types.Operator):
     bl_idname = "mhx.toggle_fk_ik"
     bl_label = "FK - IK"
     toggle = StringProperty()    
 
     def execute(self, context):
-        scn = context.scene
         words = self.toggle.split()
         rig = context.object
         prop = words[0]
@@ -3826,16 +3871,67 @@
         rig.data.layers[onLayer] = True
         rig.data.layers[offLayer] = False
         rig[prop] = value
-        if context.tool_settings.use_keyframe_insert_auto:
-            rig.keyframe_insert('["%s"]' % prop, frame=scn.frame_current)        
-        updatePose(scn)

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list