From 5f4a0c3bf15c5dfb3cc56c268d053b111f04d7fe Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Mon, 13 May 2024 01:12:09 +0300 Subject: [PATCH] Read BSAnimNote/BSAnimNotes --- components/nif/controller.cpp | 8 +++++--- components/nif/controller.hpp | 1 + components/nif/data.cpp | 27 +++++++++++++++++++++++++++ components/nif/data.hpp | 26 ++++++++++++++++++++++++++ components/nif/niffile.cpp | 2 ++ components/nif/record.hpp | 2 ++ components/nif/recordptr.hpp | 4 ++++ 7 files changed, 67 insertions(+), 3 deletions(-) diff --git a/components/nif/controller.cpp b/components/nif/controller.cpp index c4730f233a..f6eed4fad0 100644 --- a/components/nif/controller.cpp +++ b/components/nif/controller.cpp @@ -122,11 +122,13 @@ namespace Nif mStringPalette.read(nif); else if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS && nif->getBethVersion() >= 24) { - uint16_t numAnimNotes = 1; if (nif->getBethVersion() >= 29) - nif->read(numAnimNotes); + mAnimNotesList.resize(nif->get()); + else + mAnimNotesList.resize(1); - nif->skip(4 * numAnimNotes); // BSAnimNotes links + for (auto& notes : mAnimNotesList) + notes.read(nif); } } diff --git a/components/nif/controller.hpp b/components/nif/controller.hpp index e64df1395d..7282a3627d 100644 --- a/components/nif/controller.hpp +++ b/components/nif/controller.hpp @@ -56,6 +56,7 @@ namespace Nif bool mPlayBackwards{ false }; NiControllerManagerPtr mManager; NiStringPalettePtr mStringPalette; + BSAnimNotesList mAnimNotesList; void read(NIFStream* nif) override; void post(Reader& nif) override; diff --git a/components/nif/data.cpp b/components/nif/data.cpp index 7ff5f19fc1..29b11bd806 100644 --- a/components/nif/data.cpp +++ b/components/nif/data.cpp @@ -614,4 +614,31 @@ namespace Nif nif->read(mSphere); } + void BSAnimNote::read(NIFStream* nif) + { + mType = static_cast(nif->get()); + nif->read(mTime); + if (mType == Type::GrabIK) + { + nif->read(mArm); + } + else if (mType == Type::LookIK) + { + nif->read(mGain); + nif->read(mState); + } + } + + void BSAnimNotes::read(NIFStream* nif) + { + mList.resize(nif->get()); + for (auto& note : mList) + note.read(nif); + } + + void BSAnimNotes::post(Reader& nif) + { + postRecordList(nif, mList); + } + } // Namespace diff --git a/components/nif/data.hpp b/components/nif/data.hpp index a07cab7376..1ccd2919b7 100644 --- a/components/nif/data.hpp +++ b/components/nif/data.hpp @@ -449,5 +449,31 @@ namespace Nif void read(NIFStream* nif) override; }; + struct BSAnimNote : public Record + { + enum class Type : uint32_t + { + Invalid = 0, + GrabIK = 1, + LookIK = 2, + }; + + Type mType; + float mTime; + uint32_t mArm; + float mGain; + uint32_t mState; + + void read(NIFStream* nif) override; + }; + + struct BSAnimNotes : public Record + { + BSAnimNoteList mList; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + } #endif diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index 017978e4c9..75b96736a4 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -212,6 +212,8 @@ namespace Nif { "NiTransformData", &construct }, // Bethesda + { "BSAnimNote", &construct }, + { "BSAnimNotes", &construct }, { "BSPackedAdditionalGeometryData", &construct }, { "BSShaderTextureSet", &construct }, diff --git a/components/nif/record.hpp b/components/nif/record.hpp index 50f2d0083e..b7cca7f07a 100644 --- a/components/nif/record.hpp +++ b/components/nif/record.hpp @@ -73,6 +73,8 @@ namespace Nif RC_bhkSimpleShapePhantom, RC_bhkSphereShape, RC_bhkStiffSpringConstraint, + RC_BSAnimNote, + RC_BSAnimNotes, RC_BSBehaviorGraphExtraData, RC_BSBound, RC_BSBoneLODExtraData, diff --git a/components/nif/recordptr.hpp b/components/nif/recordptr.hpp index 36b6453b03..d6311241d7 100644 --- a/components/nif/recordptr.hpp +++ b/components/nif/recordptr.hpp @@ -165,6 +165,8 @@ namespace Nif struct BSMultiBound; struct BSMultiBoundData; struct BSSkinBoneData; + struct BSAnimNote; + struct BSAnimNotes; using NiAVObjectPtr = RecordPtrT; using ExtraPtr = RecordPtrT; @@ -231,6 +233,8 @@ namespace Nif using NiControllerSequenceList = RecordListT; using NiPSysModifierList = RecordListT; using NiTriBasedGeomList = RecordListT; + using BSAnimNoteList = RecordListT; + using BSAnimNotesList = RecordListT; } // Namespace #endif