[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