From 812b0cf246aaf1f46e9e897f71d805edf5c35f45 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Thu, 21 Sep 2023 14:59:14 +0300 Subject: [PATCH] Read NiFloatExtraDataController records --- components/nif/controller.cpp | 57 +++++++++++++++++++++++++++++++++++ components/nif/controller.hpp | 32 ++++++++++++++++++++ components/nif/niffile.cpp | 7 +++++ components/nif/record.hpp | 4 +++ 4 files changed, 100 insertions(+) diff --git a/components/nif/controller.cpp b/components/nif/controller.cpp index 73644f1541..5dcf6ef80d 100644 --- a/components/nif/controller.cpp +++ b/components/nif/controller.cpp @@ -526,6 +526,63 @@ namespace Nif mObjectPalette.post(nif); } + void NiExtraDataController::read(NIFStream* nif) + { + NiSingleInterpController::read(nif); + + if (nif->getVersion() >= NIFStream::generateVersion(10, 2, 0, 0)) + nif->read(mExtraDataName); + } + + void NiFloatExtraDataController::read(NIFStream* nif) + { + NiExtraDataController::read(nif); + + if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 104)) + return; + + // Unknown + if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 0)) + { + uint8_t numExtraBytes; + nif->read(numExtraBytes); + nif->skip(7); + nif->skip(numExtraBytes); + } + + mData.read(nif); + } + + void NiFloatExtraDataController::post(Reader& nif) + { + NiExtraDataController::post(nif); + + mData.post(nif); + } + + void NiFloatsExtraDataController::read(NIFStream* nif) + { + NiExtraDataController::read(nif); + + nif->read(mFloatsExtraDataIndex); + if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103)) + mData.read(nif); + } + + void NiFloatsExtraDataController::post(Reader& nif) + { + NiExtraDataController::post(nif); + + mData.post(nif); + } + + void NiFloatsExtraDataPoint3Controller::read(NIFStream* nif) + { + NiExtraDataController::read(nif); + + nif->read(mFloatsExtraDataIndex); + } + void NiBlendInterpolator::read(NIFStream* nif) { if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 112)) diff --git a/components/nif/controller.hpp b/components/nif/controller.hpp index 3104c29f94..31f3d19f91 100644 --- a/components/nif/controller.hpp +++ b/components/nif/controller.hpp @@ -346,6 +346,38 @@ namespace Nif void post(Reader& nif) override; }; + // Abstract + struct NiExtraDataController : NiSingleInterpController + { + std::string mExtraDataName; + + void read(NIFStream* nif) override; + }; + + struct NiFloatExtraDataController : NiExtraDataController + { + NiFloatDataPtr mData; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + + struct NiFloatsExtraDataController : NiExtraDataController + { + int32_t mFloatsExtraDataIndex; + NiFloatDataPtr mData; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + + struct NiFloatsExtraDataPoint3Controller : NiExtraDataController + { + int32_t mFloatsExtraDataIndex; + + void read(NIFStream* nif) override; + }; + // Abstract struct NiInterpolator : public Record { diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index 85ec92f2fa..3609c42fe6 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -122,6 +122,13 @@ namespace Nif { "NiMultiTargetTransformController", &construct }, + // Extra data controllers, Gamebryo + { "NiColorExtraDataController", &construct }, + { "NiFloatExtraDataController", &construct }, + { "NiFloatsExtraDataController", &construct }, + { "NiFloatsExtraDataPoint3Controller", + &construct }, + // Bethesda { "BSFrustumFOVController", &construct }, { "BSKeyframeController", &construct }, diff --git a/components/nif/record.hpp b/components/nif/record.hpp index b8cbbfe804..0b7c239442 100644 --- a/components/nif/record.hpp +++ b/components/nif/record.hpp @@ -127,6 +127,7 @@ namespace Nif RC_NiCollisionSwitch, RC_NiColorData, RC_NiColorExtraData, + RC_NiColorExtraDataController, RC_NiColorInterpolator, RC_NiControllerManager, RC_NiControllerSequence, @@ -136,8 +137,11 @@ namespace Nif RC_NiFlipController, RC_NiFloatData, RC_NiFloatExtraData, + RC_NiFloatExtraDataController, RC_NiFloatInterpolator, RC_NiFloatsExtraData, + RC_NiFloatsExtraDataController, + RC_NiFloatsExtraDataPoint3Controller, RC_NiFltAnimationNode, RC_NiFogProperty, RC_NiGeomMorpherController,