From 77d520861cf175efb3b76a72f2c70fa2e941ecbb Mon Sep 17 00:00:00 2001
From: Benjy Cook <benjycook@hotmail.com>
Date: Fri, 23 Sep 2011 20:39:48 +0000
Subject: [PATCH] Updated Mocap addon with fixes for latest api changes and
 some reported bugs

---
 mocap/__init__.py |  8 ++++++++
 mocap/retarget.py | 23 ++++++++++++-----------
 2 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/mocap/__init__.py b/mocap/__init__.py
index 55d8bdb74..d26937bef 100644
--- a/mocap/__init__.py
+++ b/mocap/__init__.py
@@ -53,11 +53,19 @@ else:
     from . import mocap_constraints
     from . import retarget
     from . import mocap_tools
+    
 
 # MocapConstraint class
 # Defines MocapConstraint datatype, used to add and configute mocap constraints
 # Attached to Armature data
 
+def hasIKConstraint(pose_bone):
+    #utility function / predicate, returns True if given bone has IK constraint
+    ik = [constraint for constraint in pose_bone.constraints if constraint.type == "IK"]
+    if ik:
+        return ik[0]
+    else:
+        return False
 
 class MocapConstraint(bpy.types.PropertyGroup):
     name = StringProperty(name="Name",
diff --git a/mocap/retarget.py b/mocap/retarget.py
index f59912004..e7f4bc117 100644
--- a/mocap/retarget.py
+++ b/mocap/retarget.py
@@ -21,7 +21,7 @@
 import bpy
 from mathutils import Vector, Matrix
 from math import radians
-from bl_operators import nla
+from bpy_extras.anim_utils import bake_action
 
 
 def hasIKConstraint(pose_bone):
@@ -292,15 +292,15 @@ def copyTranslation(performer_obj, enduser_obj, perfFeet, root, s_frame, e_frame
     if linearAvg:
         #determine the average change in scale needed
         avg = sum(linearAvg) / len(linearAvg)
-        scene.frame_set(s_frame)
-        initialPos = (tailLoc(perf_bones[perfRoot]) / avg)
-        for t in range(s_frame, e_frame):
-            scene.frame_set(t)
-            #calculate the new position, by dividing by the found ratio between performer and enduser
-            newTranslation = (tailLoc(perf_bones[perfRoot]) / avg)
-            stride_bone.location = enduser_obj_mat * (newTranslation - initialPos)
-            stride_bone.keyframe_insert("location")
     else:
+        avg = 1
+    scene.frame_set(s_frame)
+    initialPos = (tailLoc(perf_bones[perfRoot]) / avg)
+    for t in range(s_frame, e_frame):
+        scene.frame_set(t)
+        #calculate the new position, by dividing by the found ratio between performer and enduser
+        newTranslation = (tailLoc(perf_bones[perfRoot]) / avg)
+        stride_bone.location = enduser_obj_mat * (newTranslation - initialPos)
         stride_bone.keyframe_insert("location")
     stride_bone.animation_data.action.name = ("Stride Bone " + action_name)
 
@@ -520,8 +520,9 @@ def totalRetarget(performer_obj, enduser_obj, scene, s_frame, e_frame):
     else:
         prepareForBake(enduser_obj)
         print("Retargeting pose (Advanced Retarget)")
-        nla.bake(s_frame, e_frame, action=enduser_obj.animation_data.action, only_selected=True, do_pose=True, do_object=False, step=step)
-    name = performer_obj.animation_data.action.name
+        bake_action(s_frame, e_frame, action=enduser_obj.animation_data.action, only_selected=True, do_pose=True, do_object=False, step=step)
+    name = performer_obj.animation_data.action.name[:10]
+    #We trim the name down to 10 chars because of Action Name length maximum
     enduser_obj.animation_data.action.name = "Base " + name
     print("Second pass: retargeting root translation and clean up")
     stride_bone = copyTranslation(performer_obj, enduser_obj, feetBones, root, s_frame, e_frame, scene, enduser_obj_mat)
-- 
GitLab