def execute(self, context): from bpy_extras import anim_utils objects = context.selected_editable_objects object_action_pairs = ( [(obj, getattr(obj.animation_data, "action", None)) for obj in objects] if self.use_current_action else [(obj, None) for obj in objects] ) actions = anim_utils.bake_action_objects( object_action_pairs, frames=range(self.frame_start, self.frame_end + 1, self.step), only_selected=self.only_selected, do_pose='POSE' in self.bake_types, do_object='OBJECT' in self.bake_types, do_visual_keying=self.visual_keying, do_constraint_clear=self.clear_constraints, do_parents_clear=self.clear_parents, do_clean=True, ) if not any(actions): self.report({'INFO'}, "Nothing to bake") return {'CANCELLED'} return {'FINISHED'}
def execute(self, context): scn = context.scene Global_Settings = scn.GRT_Action_Bakery_Global_Settings Action_Bakery = scn.GRT_Action_Bakery control_rig = Global_Settings.Source_Armature deform_rig = Global_Settings.Target_Armature NLA_Strip_Check = [] CTRL_Save_Use_NLA = None DEF_Save_Use_NLA = None CTRL_Save_Use_ACTION = None if control_rig.animation_data: CTRL_Save_Use_NLA = control_rig.animation_data.use_nla control_rig.animation_data.use_nla = False CTRL_Save_Use_ACTION = control_rig.animation_data.action if deform_rig.animation_data: DEF_Save_Use_NLA = deform_rig.animation_data.use_nla deform_rig.animation_data.use_nla = False if control_rig and deform_rig: if control_rig.type == "ARMATURE" and deform_rig.type == "ARMATURE": Control_Rig_Action_Save = None for Baker in Action_Bakery: if control_rig.animation_data: # CTRL_Save_Use_NLA = control_rig.animation_data.use_nla # DEF_Save_Use_NLA = deform_rig.animation_data.use_nla # control_rig.animation_data.use_nla = False # deform_rig.animation_data.use_nla = False # for nla_track in control_rig.animation_data.nla_tracks: # nla_track.is_solo = False # # if deform_rig.animation_data: # for nla_track in deform_rig.animation_data.nla_tracks: # nla_track.is_solo = False if Global_Settings.Pre_Unmute_Constraint: Pose_Bone = deform_rig.pose.bones for bone in Pose_Bone: for constraint in bone.constraints: constraint.mute = False if Baker.Action: if Baker.Bake_Select: action = Baker.Action # for nla_track in control_rig.animation_data.nla_tracks: # nla_track.mute = True control_rig.animation_data.action = action if Baker.use_Local_Name: if Baker.LOCAL_Baked_Name: action_name = Baker.LOCAL_Baked_Name else: action_name = "Baked_" + action.name else: if Global_Settings.GLOBAL_Baked_Name_Mode == "REPLACE": action_name = action.name.replace( Global_Settings. GLOBAL_Baked_Name_01, Global_Settings. GLOBAL_Baked_Name_02) if Global_Settings.GLOBAL_Baked_Name_Mode == "PREFIX": action_name = Global_Settings.GLOBAL_Baked_Name_01 + action.name if Global_Settings.GLOBAL_Baked_Name_Mode == "SUFFIX": action_name = action.name + Global_Settings.GLOBAL_Baked_Name_01 # else: # frame = [i for i in range(int(action.frame_range[0]), int(action.frame_range[1])+1-Global_Settings.GLOBAL_Trim_End_Frame)] if Baker.Frame_Range_Mode == "SET": start_frame = Baker.Set_FR_Start end_frame = Baker.Set_FR_End + 1 if Baker.Frame_Range_Mode == "ACTION": start_frame = int(action.frame_range[0]) end_frame = int(action.frame_range[1]) + 1 if Baker.Frame_Range_Mode == "TRIM": start_frame = int(action.frame_range[0] ) + Baker.Trim_FR_Start end_frame = int(action.frame_range[1] ) + 1 - Baker.Trim_FR_End frame = [ i for i in range(start_frame, end_frame) ] # if Baker.use_Local_Trim: # frame = [i for i in range(int(action.frame_range[0]), int(action.frame_range[1])+1-Baker.LOCAL_Trim)] # else: # frame = [i for i in range(int(action.frame_range[0]), int(action.frame_range[1])+1)] if Global_Settings.Overwrite: obj_act = [[ deform_rig, bpy.data.actions.get(action_name) ]] else: obj_act = [[deform_rig, None]] # obj_act = [[deform_rig, None]] Baked_Action = anim_utils.bake_action_objects( obj_act, frames=frame, only_selected=Global_Settings. BAKE_SETTINGS_Only_Selected, do_pose=Global_Settings. BAKE_SETTINGS_Do_Pose, do_object=Global_Settings. BAKE_SETTINGS_Do_Object, do_visual_keying=Global_Settings. BAKE_SETTINGS_Do_Visual_Keying, do_constraint_clear=Global_Settings. BAKE_SETTINGS_Do_Constraint_Clear, do_parents_clear=Global_Settings. BAKE_SETTINGS_Do_Parent_Clear, do_clean=Global_Settings. BAKE_SETTINGS_Do_Clean) # if Global_Settings.Overwrite: # duplicate_check = bpy.data.actions.get(action_name) # if duplicate_check: # # # context.view_layer.update() # bpy.data.actions.remove(duplicate_check) # context.view_layer.update() # # if Global_Settings.Clean_Empty_NLA_Strip: # for nla_track in deform_rig.animation_data.nla_tracks: # for s in nla_track.strips: # for strip in nla_track.strips: # if strip.action == None: # nla_track.strips.remove(strip) # break Baked_Action[0].name = action_name if Baker.offset_keyframe_to_frame_one: start_frame = Baked_Action[0].frame_range[ 0] for fcurve in Baked_Action[0].fcurves: for kp in fcurve.keyframe_points: kp.co.x = kp.co.x - start_frame + 1 context.view_layer.update() if Global_Settings.Push_to_NLA: deform_rig.animation_data.nla_tracks.new( ).strips.new( Baked_Action[0].name, Baked_Action[0].frame_range[0], Baked_Action[0]) # deform_rig.animation_data.nla_tracks.new().strips.new(Baked_Action[0].name, action.frame_range[0], Baked_Action[0]) # deform_rig.animation_data.nla_tracks.new().strips.new(Baked_Action[0].name, 0, Baked_Action[0]) # for nla_track_pair in nla_track_state: # print(nla_track_pair[1]) # nla_track_pair[0].mute = nla_track_pair[1] if Global_Settings.Post_Mute_Constraint: Pose_Bone = deform_rig.pose.bones for bone in Pose_Bone: for constraint in bone.constraints: constraint.mute = True if control_rig.animation_data: if control_rig.animation_data.action: control_rig.animation_data.action = CTRL_Save_Use_ACTION if deform_rig.animation_data: if deform_rig.animation_data.action: deform_rig.animation_data.action = None # control_rig.animation_data.use_nla = CTRL_Save_Use_NLA # deform_rig.animation_data.use_nla = DEF_Save_Use_NLA bpy.ops.object.mode_set(mode='OBJECT') bpy.ops.object.select_all(action='DESELECT') deform_rig.select_set(True) context.view_layer.objects.active = deform_rig if control_rig.animation_data: if CTRL_Save_Use_NLA is not None: control_rig.animation_data.use_nla = CTRL_Save_Use_NLA if deform_rig.animation_data: if DEF_Save_Use_NLA is not None: deform_rig.animation_data.use_nla = DEF_Save_Use_NLA return {'FINISHED'}