diff --git a/fast64_internal/oot/skeleton/importer/functions.py b/fast64_internal/oot/skeleton/importer/functions.py index 84699c009..9eb85f1c4 100644 --- a/fast64_internal/oot/skeleton/importer/functions.py +++ b/fast64_internal/oot/skeleton/importer/functions.py @@ -3,14 +3,15 @@ import mathutils, bpy, math from ....f3d.f3d_gbi import F3D, get_F3D_GBI from ....f3d.f3d_parser import getImportData, parseF3D -from ....utility import hexOrDecInt, applyRotation, PluginError +from ....utility import hexOrDecInt, applyRotation, PluginError, selectSingleObject from ...oot_f3d_writer import ootReadActorScale from ...oot_model_classes import OOTF3DContext, ootGetIncludedAssetData from ...oot_utility import OOTEnum, ootGetObjectPath, getOOTScale, ootGetObjectHeaderPath, ootGetEnums, ootStripComments 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: @@ -264,6 +265,7 @@ def ootImportSkeletonC(basePath: str, importSettings: OOTSkeletonImportSettings) removeDoubles = importSettings.removeDoubles importNormals = importSettings.importNormals + importAnimations = importSettings.importAnimations drawLayer = importSettings.drawLayer skeletonData = getImportData(filepaths) @@ -285,7 +287,6 @@ def ootImportSkeletonC(basePath: str, importSettings: OOTSkeletonImportSettings) else: actorScale = getOOTScale(importSettings.actorScale) - # print(limbList) isLOD, armatureObj = ootBuildSkeleton( skeletonName, overlayName, @@ -324,3 +325,13 @@ def ootImportSkeletonC(basePath: str, importSettings: OOTSkeletonImportSettings) applySkeletonRestPose(restPoseData, armatureObj) if isLOD: applySkeletonRestPose(restPoseData, LODArmatureObj) + + if importAnimations: + if armatureObj is not None: + selectSingleObject(armatureObj) + + animation_names = ootGetAnimNames(skeletonData) + animation_names = list(dict.fromkeys(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..64566389a 100644 --- a/fast64_internal/oot/skeleton/utility.py +++ b/fast64_internal/oot/skeleton/utility.py @@ -80,6 +80,15 @@ def ootGetLimb(skeletonData, limbName, continueOnError): 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 = [] nonBoneGroups = [] 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: