From 3d53e4bcc6a76a2d84ee1a06cebf514dee5f7e62 Mon Sep 17 00:00:00 2001 From: Nokaubure Date: Mon, 16 Dec 2024 17:30:16 +0100 Subject: [PATCH] feature to import all animations when importing an OoT skeleton --- .../oot/skeleton/importer/functions.py | 25 ++++++++++++++++--- fast64_internal/oot/skeleton/properties.py | 2 ++ fast64_internal/oot/skeleton/utility.py | 7 ++++++ fast64_internal/oot/tools/quick_import.py | 8 ++++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/fast64_internal/oot/skeleton/importer/functions.py b/fast64_internal/oot/skeleton/importer/functions.py index 84699c009..3e92a6dec 100644 --- a/fast64_internal/oot/skeleton/importer/functions.py +++ b/fast64_internal/oot/skeleton/importer/functions.py @@ -10,8 +10,8 @@ from ...oot_texture_array import ootReadTextureArrays from ..constants import ootSkeletonImportDict from ..properties import OOTSkeletonImportSettings -from ..utility import ootGetLimb, ootGetLimbs, ootGetSkeleton, applySkeletonRestPose - +from ..utility import ootGetLimb, ootGetLimbs, ootGetSkeleton, applySkeletonRestPose, ootGetAnimNames +from ...tools.quick_import import quick_import_exec class OOTDLEntry: def __init__(self, dlName, limbIndex): @@ -264,6 +264,7 @@ def ootImportSkeletonC(basePath: str, importSettings: OOTSkeletonImportSettings) removeDoubles = importSettings.removeDoubles importNormals = importSettings.importNormals + importAnimations = importSettings.importAnimations drawLayer = importSettings.drawLayer skeletonData = getImportData(filepaths) @@ -284,8 +285,7 @@ def ootImportSkeletonC(basePath: str, importSettings: OOTSkeletonImportSettings) actorScale = ootReadActorScale(basePath, overlayName, isLink) else: actorScale = getOOTScale(importSettings.actorScale) - - # print(limbList) + isLOD, armatureObj = ootBuildSkeleton( skeletonName, overlayName, @@ -324,3 +324,20 @@ def ootImportSkeletonC(basePath: str, importSettings: OOTSkeletonImportSettings) applySkeletonRestPose(restPoseData, armatureObj) if isLOD: applySkeletonRestPose(restPoseData, LODArmatureObj) + + + if importAnimations: + + if armatureObj: + bpy.ops.object.select_all(action='DESELECT') + + armatureObj.select_set(True) + + bpy.context.view_layer.objects.active = armatureObj + + animation_names = ootGetAnimNames(skeletonData) + animation_names = list(dict.fromkeys(animation_names)) + #print(animation_names) + # Call quick_import_exec for each animation name + for animation_name in animation_names: + quick_import_exec(bpy.context, animation_name) diff --git a/fast64_internal/oot/skeleton/properties.py b/fast64_internal/oot/skeleton/properties.py index daa0e9c43..72da692c3 100644 --- a/fast64_internal/oot/skeleton/properties.py +++ b/fast64_internal/oot/skeleton/properties.py @@ -117,6 +117,7 @@ class OOTSkeletonImportSettings(PropertyGroup): isCustom: BoolProperty(name="Use Custom Path") removeDoubles: BoolProperty(name="Remove Doubles On Import", default=True) importNormals: BoolProperty(name="Import Normals", default=True) + importAnimations: BoolProperty(name="Import Animations", default=False) drawLayer: EnumProperty(name="Import Draw Layer", items=ootEnumDrawLayers) actorOverlayName: StringProperty(name="Overlay", default="ovl_En_GeldB") flipbookUses2DArray: BoolProperty(name="Has 2D Flipbook Array", default=False) @@ -128,6 +129,7 @@ def draw_props(self, layout: UILayout): prop_split(layout, self, "drawLayer", "Import Draw Layer") layout.prop(self, "removeDoubles") layout.prop(self, "importNormals") + layout.prop(self, "importAnimations") layout.prop(self, "isCustom") if self.isCustom: prop_split(layout, self, "name", "Skeleton") diff --git a/fast64_internal/oot/skeleton/utility.py b/fast64_internal/oot/skeleton/utility.py index 0a565c355..cc5e39ef9 100644 --- a/fast64_internal/oot/skeleton/utility.py +++ b/fast64_internal/oot/skeleton/utility.py @@ -79,6 +79,13 @@ def ootGetLimb(skeletonData, limbName, continueOnError): raise PluginError("Cannot handle skeleton limb named " + limbName + " of type " + limbType) return matchResult +def ootGetAnimNames(skeleton_data): + #Extracts all animation names that start with 'AnimationHeader' from the given skeleton data. + + pattern = r"AnimationHeader\s+(\w+)" + animation_names = re.findall(pattern, skeleton_data) + + return animation_names def getGroupIndexOfVert(vert, armatureObj, obj, rootGroupIndex): actualGroups = [] diff --git a/fast64_internal/oot/tools/quick_import.py b/fast64_internal/oot/tools/quick_import.py index 0a51344ee..1106fd590 100644 --- a/fast64_internal/oot/tools/quick_import.py +++ b/fast64_internal/oot/tools/quick_import.py @@ -144,6 +144,14 @@ def raise_only_from_object(type: str): settings.animName = sym_name settings.folderName = folder_name bpy.ops.object.oot_import_anim() + elif sym_def_type == "LinkAnimationHeader" and not is_array: + raise_only_from_object(sym_def_type) + settings: OOTAnimImportSettingsProperty = context.scene.fast64.oot.animImportSettings + settings.isCustom = False + settings.isLink = True + settings.animName = sym_name + settings.folderName = folder_name + bpy.ops.object.oot_import_anim() elif sym_def_type == "CutsceneData" and is_array: bpy.context.scene.ootCSNumber = importCutsceneData(f"{sym_file_p}", None, sym_name) else: