Continued changes to storing of retargeted animation data, making it possible to easily switch between all retargeted clips, and stitch them with the future operator

This commit is contained in:
Benjy Cook 2011-08-10 18:40:14 +00:00
parent 11d4cfaa71
commit 8afad10f98
3 changed files with 57 additions and 24 deletions

@ -186,6 +186,8 @@ def setConstraint(m_constraint, context):
bone = bones[m_constraint.constrained_bone]
cons_obj = getConsObj(bone)
real_constraint = cons_obj.constraints[m_constraint.real_constraint]
NLATracks = obj.data.mocapNLATracks[obj.data.active_mocap]
obj.animation_data.action = bpy.data.actions[NLATracks.auto_fix_track]
#frame changing section
setConstraintFraming(m_constraint, context)
@ -364,8 +366,9 @@ def bakeAllConstraints(obj, s_frame, e_frame, bones):
simpleBake += [end_bone]
for bone in selectedBones:
bone.bone.select = True
tracks = [track for track in obj.data.mocapNLATracks if track.active][0]
constraintTrack = obj.animation_data.nla_tracks[tracks.auto_fix_track]
NLATracks = obj.data.mocapNLATracks[obj.data.active_mocap]
obj.animation_data.action = bpy.data.actions[NLATracks.auto_fix_track]
constraintTrack = obj.animation_data.nla_tracks[NLATracks.auto_fix_track]
constraintStrip = constraintTrack.strips[0]
constraintStrip.action_frame_start = s_frame
constraintStrip.action_frame_end = e_frame
@ -404,8 +407,9 @@ def unbakeConstraints(context):
obj = context.active_object
bones = obj.pose.bones
scene = bpy.context.scene
tracks = obj.data.mocapNLATracks[obj.animation_data.action]
constraintTrack = obj.animation_data.nla_tracks[tracks.auto_fix_track]
NLATracks = obj.data.mocapNLATracks[obj.data.active_mocap]
obj.animation_data.action = bpy.data.actions[NLATracks.auto_fix_track]
constraintTrack = obj.animation_data.nla_tracks[NLATracks.auto_fix_track]
constraintStrip = constraintTrack.strips[0]
action = constraintStrip.action
# delete the fcurves on the strip

@ -52,7 +52,6 @@ def createDictionary(perf_arm, end_arm):
feetBones = [bone.name for bone in perf_arm.bones if bone.foot]
return feetBones, root
def loadMapping(perf_arm, end_arm):
for end_bone in end_arm.bones:
@ -273,8 +272,8 @@ def copyTranslation(performer_obj, enduser_obj, perfFeet, root, s_frame, e_frame
linearAvg.append(hipV.length / endV.length)
action_name = performer_obj.animation_data.action.name
#if you have a parent, and that parent is a previously created stride bone
if enduser_obj.parent:
#is there a stride_bone?
if "stride_bone" in bpy.data.objects:
stride_action = bpy.data.actions.new("Stride Bone " + action_name)
stride_bone = enduser_obj.parent
stride_bone.animation_data.action = stride_action
@ -386,17 +385,17 @@ def originalLocationTarget(end_bone, enduser_obj):
#create the specified NLA setup for base animation, constraints and tweak layer.
def NLASystemInitialize(enduser_obj, s_frame, name):
def NLASystemInitialize(enduser_arm, context):#enduser_obj, name):
enduser_obj = context.active_object
NLATracks = enduser_arm.mocapNLATracks[enduser_obj.data.active_mocap]
name = NLATracks.name
anim_data = enduser_obj.animation_data
if not name in enduser_obj.data.mocapNLATracks:
NLATracks = enduser_obj.data.mocapNLATracks.add()
NLATracks.name = name
s_frame = 0
print(name)
if ("Base " + name) in bpy.data.actions:
mocapAction = bpy.data.actions[("Base " + name)]
else:
NLATracks = enduser_obj.data.mocapNLATracks[name]
for track in enduser_obj.data.mocapNLATracks:
track.active = False
mocapAction = anim_data.action
mocapAction.name = "Base " + name
print("That retargeted anim has no base action")
anim_data.use_nla = True
for track in anim_data.nla_tracks:
anim_data.nla_tracks.remove(track)
@ -407,28 +406,46 @@ def NLASystemInitialize(enduser_obj, s_frame, name):
constraintTrack = anim_data.nla_tracks.new()
constraintTrack.name = "Auto fixes " + name
NLATracks.auto_fix_track = constraintTrack.name
constraintAction = bpy.data.actions.new("Auto fixes " + name)
if ("Auto fixes " + name) in bpy.data.actions:
constraintAction = bpy.data.actions[("Auto fixes " + name)]
else:
constraintAction = bpy.data.actions.new("Auto fixes " + name)
constraintStrip = constraintTrack.strips.new("Auto fixes " + name, s_frame, constraintAction)
constraintStrip.extrapolation = "NOTHING"
userTrack = anim_data.nla_tracks.new()
userTrack.name = "Manual fixes " + name
NLATracks.manual_fix_track = userTrack.name
if enduser_obj.parent.animation_data:
NLATracks.stride_action = enduser_obj.parent.animation_data.action.name
userAction = bpy.data.actions.new("Manual fixes " + name)
if ("Manual fixes " + name) in bpy.data.actions:
userAction = bpy.data.actions[("Manual fixes " + name)]
else:
userAction = bpy.data.actions.new("Manual fixes " + name)
userStrip = userTrack.strips.new("Manual fixes " + name, s_frame, userAction)
userStrip.extrapolation = "HOLD"
#userStrip.blend_type = "MULITPLY" - doesn't work due to work, will be activated soon
anim_data.nla_tracks.active = constraintTrack
NLATracks.active = True
#anim_data.action = constraintAction
anim_data.action_extrapolation = "NOTHING"
#set the stride_bone's action
if "stride_bone" in bpy.data.objects:
stride_bone = bpy.data.objects["stride_bone"]
if NLATracks.stride_action:
stride_bone.animation_data.action = bpy.data.actions[NLATracks.stride_action]
else:
NLATracks.stride_action = stride_bone.animation_data.action.name
anim_data.action = None
#Main function that runs the retargeting sequence.
def totalRetarget(performer_obj, enduser_obj, scene, s_frame, e_frame):
perf_arm = performer_obj.data
end_arm = enduser_obj.data
try:
enduser_obj.animation_data.action = bpy.data.actions.new("temp")
except:
print("no need to create new action")
print("creating Dictionary")
feetBones, root = createDictionary(perf_arm, end_arm)
print("cleaning stuff up")
@ -437,7 +454,11 @@ def totalRetarget(performer_obj, enduser_obj, scene, s_frame, e_frame):
print("Creating intermediate armature (for first pass)")
inter_obj = createIntermediate(performer_obj, enduser_obj, root, s_frame, e_frame, scene)
print("First pass: retargeting from intermediate to end user")
retargetEnduser(inter_obj, enduser_obj, root, s_frame, e_frame, scene)
name = performer_obj.animation_data.action.name
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)
IKRetarget(performer_obj, enduser_obj, s_frame, e_frame, scene)
@ -445,7 +466,14 @@ def totalRetarget(performer_obj, enduser_obj, scene, s_frame, e_frame):
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.select_name(name=inter_obj.name, extend=False)
bpy.ops.object.delete()
NLASystemInitialize(enduser_obj, s_frame, performer_obj.animation_data.action.name)
bpy.ops.object.select_name(name=enduser_obj.name, extend=False)
if not name in [tracks.name for tracks in end_arm.mocapNLATracks]:
NLATracks = end_arm.mocapNLATracks.add()
NLATracks.name = name
else:
NLATracks = end_arm.mocapNLATracks[name]
end_arm.active_mocap = name
print("retargeting done!")
if __name__ == "__main__":

@ -127,7 +127,6 @@ bpy.utils.register_class(AnimationStitchSettings)
class MocapNLATracks(bpy.types.PropertyGroup):
name = bpy.props.StringProperty()
active = bpy.props.BoolProperty()
base_track = bpy.props.StringProperty()
auto_fix_track = bpy.props.StringProperty()
manual_fix_track = bpy.props.StringProperty()
@ -136,7 +135,7 @@ class MocapNLATracks(bpy.types.PropertyGroup):
bpy.utils.register_class(MocapNLATracks)
bpy.types.Armature.stitch_settings = bpy.props.PointerProperty(type=AnimationStitchSettings)
bpy.types.Armature.active_mocap = bpy.props.StringProperty(update=retarget.NLASystemInitialize)
bpy.types.Armature.mocapNLATracks = bpy.props.CollectionProperty(type=MocapNLATracks)
#Update function for IK functionality. Is called when IK prop checkboxes are toggled.
@ -349,6 +348,8 @@ class ExtraToolsPanel(bpy.types.Panel):
activeIsArmature = isinstance(context.active_object.data, bpy.types.Armature)
if activeIsArmature:
enduser_arm = context.active_object.data
layout.label("Retargeted Animations:")
layout.prop_search(enduser_arm, "active_mocap",enduser_arm, "mocapNLATracks")
settings = enduser_arm.stitch_settings
layout.prop_search(settings, "first_action", enduser_arm, "mocapNLATracks")
layout.prop_search(settings, "second_action", enduser_arm, "mocapNLATracks")