Revise various NIF controller records

Mostly those that don't require external changes
macos_ci_fix
Alexei Kotov 1 year ago
parent 19d1f6f3f5
commit 05d8975ed1

@ -63,7 +63,7 @@ namespace Nif::Testing
value.phase = 0; value.phase = 0;
value.timeStart = 0; value.timeStart = 0;
value.timeStop = 0; value.timeStop = 0;
value.target = NiObjectNETPtr(nullptr); value.mTarget = NiObjectNETPtr(nullptr);
} }
} }

@ -40,7 +40,7 @@ namespace Nif
int flags; int flags;
float frequency, phase; float frequency, phase;
float timeStart, timeStop; float timeStart, timeStop;
NiObjectNETPtr target; NiObjectNETPtr mTarget;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
void post(Reader& nif) override; void post(Reader& nif) override;

@ -1,6 +1,7 @@
#include "controller.hpp" #include "controller.hpp"
#include "data.hpp" #include "data.hpp"
#include "exception.hpp"
#include "node.hpp" #include "node.hpp"
#include "particle.hpp" #include "particle.hpp"
#include "texture.hpp" #include "texture.hpp"
@ -13,20 +14,17 @@ namespace Nif
next.read(nif); next.read(nif);
flags = nif->getUShort(); flags = nif->getUShort();
frequency = nif->getFloat(); frequency = nif->getFloat();
phase = nif->getFloat(); phase = nif->getFloat();
timeStart = nif->getFloat(); timeStart = nif->getFloat();
timeStop = nif->getFloat(); timeStop = nif->getFloat();
mTarget.read(nif);
target.read(nif);
} }
void Controller::post(Reader& nif) void Controller::post(Reader& nif)
{ {
Record::post(nif);
next.post(nif); next.post(nif);
target.post(nif); mTarget.post(nif);
} }
void ControlledBlock::read(NIFStream* nif) void ControlledBlock::read(NIFStream* nif)
@ -44,28 +42,28 @@ namespace Nif
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 110)) if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 110))
{ {
mBlendInterpolator.read(nif); mBlendInterpolator.read(nif);
mBlendIndex = nif->getUShort(); nif->read(mBlendIndex);
} }
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 106) && nif->getBethVersion() > 0) if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 106) && nif->getBethVersion() > 0)
mPriority = nif->getChar(); nif->read(mPriority);
if (nif->getVersion() >= NIFStream::generateVersion(10, 2, 0, 0) if (nif->getVersion() >= NIFStream::generateVersion(10, 2, 0, 0)
&& nif->getVersion() <= NIFStream::generateVersion(20, 1, 0, 0)) && nif->getVersion() <= NIFStream::generateVersion(20, 1, 0, 0))
{ {
mStringPalette.read(nif); mStringPalette.read(nif);
mNodeNameOffset = nif->getUInt(); nif->read(mNodeNameOffset);
mPropertyTypeOffset = nif->getUInt(); nif->read(mPropertyTypeOffset);
mControllerTypeOffset = nif->getUInt(); nif->read(mControllerTypeOffset);
mControllerIdOffset = nif->getUInt(); nif->read(mControllerIdOffset);
mInterpolatorIdOffset = nif->getUInt(); nif->read(mInterpolatorIdOffset);
} }
else else
{ {
mNodeName = nif->getString(); nif->read(mNodeName);
mPropertyType = nif->getString(); nif->read(mPropertyType);
mControllerType = nif->getString(); nif->read(mControllerType);
mControllerId = nif->getString(); nif->read(mControllerId);
mInterpolatorId = nif->getString(); nif->read(mInterpolatorId);
} }
} }
@ -80,16 +78,17 @@ namespace Nif
void NiSequence::read(NIFStream* nif) void NiSequence::read(NIFStream* nif)
{ {
mName = nif->getString(); nif->read(mName);
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103)) if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103))
{ {
mAccumRootName = nif->getString(); nif->read(mAccumRootName);
mTextKeys.read(nif); mTextKeys.read(nif);
} }
size_t numControlledBlocks = nif->getUInt(); uint32_t numBlocks;
nif->read(numBlocks);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 106)) if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 106))
mArrayGrowBy = nif->getUInt(); nif->read(mArrayGrowBy);
mControlledBlocks.resize(numControlledBlocks); mControlledBlocks.resize(numBlocks);
for (ControlledBlock& block : mControlledBlocks) for (ControlledBlock& block : mControlledBlocks)
block.read(nif); block.read(nif);
} }
@ -104,28 +103,30 @@ namespace Nif
void NiControllerSequence::read(NIFStream* nif) void NiControllerSequence::read(NIFStream* nif)
{ {
NiSequence::read(nif); NiSequence::read(nif);
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103)) if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103))
return; return;
mWeight = nif->getFloat(); nif->read(mWeight);
mTextKeys.read(nif); mTextKeys.read(nif);
mExtrapolationMode = static_cast<Controller::ExtrapolationMode>(nif->getUInt()); mExtrapolationMode = static_cast<Controller::ExtrapolationMode>(nif->getUInt());
mFrequency = nif->getFloat(); mFrequency = nif->getFloat();
if (nif->getVersion() <= NIFStream::generateVersion(10, 4, 0, 1)) if (nif->getVersion() <= NIFStream::generateVersion(10, 4, 0, 1))
mPhase = nif->getFloat(); nif->read(mPhase);
mStartTime = nif->getFloat(); nif->read(mStartTime);
mStopTime = nif->getFloat(); nif->read(mStopTime);
mPlayBackwards = nif->getVersion() == NIFStream::generateVersion(10, 1, 0, 106) && nif->getBoolean(); if (nif->getVersion() == NIFStream::generateVersion(10, 1, 0, 106))
nif->read(mPlayBackwards);
mManager.read(nif); mManager.read(nif);
mAccumRootName = nif->getString(); nif->read(mAccumRootName);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 113) if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 113)
&& nif->getVersion() <= NIFStream::generateVersion(20, 1, 0, 0)) && nif->getVersion() <= NIFStream::generateVersion(20, 1, 0, 0))
mStringPalette.read(nif); mStringPalette.read(nif);
else if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS && nif->getBethVersion() >= 24) else if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS && nif->getBethVersion() >= 24)
{ {
size_t numAnimNotes = 1; uint16_t numAnimNotes = 1;
if (nif->getBethVersion() >= 29) if (nif->getBethVersion() >= 29)
numAnimNotes = nif->getUShort(); nif->read(numAnimNotes);
nif->skip(4 * numAnimNotes); // BSAnimNotes links nif->skip(4 * numAnimNotes); // BSAnimNotes links
} }
@ -134,6 +135,7 @@ namespace Nif
void NiControllerSequence::post(Reader& nif) void NiControllerSequence::post(Reader& nif)
{ {
NiSequence::post(nif); NiSequence::post(nif);
mManager.post(nif); mManager.post(nif);
mStringPalette.post(nif); mStringPalette.post(nif);
} }
@ -141,14 +143,16 @@ namespace Nif
void NiInterpController::read(NIFStream* nif) void NiInterpController::read(NIFStream* nif)
{ {
Controller::read(nif); Controller::read(nif);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 104) if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 104)
&& nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 108)) && nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 108))
mManagerControlled = nif->getBoolean(); nif->read(mManagerControlled);
} }
void NiSingleInterpController::read(NIFStream* nif) void NiSingleInterpController::read(NIFStream* nif)
{ {
NiInterpController::read(nif); NiInterpController::read(nif);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 104)) if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 104))
mInterpolator.read(nif); mInterpolator.read(nif);
} }
@ -156,6 +160,7 @@ namespace Nif
void NiSingleInterpController::post(Reader& nif) void NiSingleInterpController::post(Reader& nif)
{ {
NiInterpController::post(nif); NiInterpController::post(nif);
mInterpolator.post(nif); mInterpolator.post(nif);
} }
@ -216,6 +221,7 @@ namespace Nif
void NiParticleSystemController::post(Reader& nif) void NiParticleSystemController::post(Reader& nif)
{ {
Controller::post(nif); Controller::post(nif);
emitter.post(nif); emitter.post(nif);
affectors.post(nif); affectors.post(nif);
colliders.post(nif); colliders.post(nif);
@ -244,15 +250,17 @@ namespace Nif
void NiLookAtController::read(NIFStream* nif) void NiLookAtController::read(NIFStream* nif)
{ {
Controller::read(nif); Controller::read(nif);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0)) if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0))
lookAtFlags = nif->getUShort(); nif->read(mLookAtFlags);
target.read(nif); mLookAt.read(nif);
} }
void NiLookAtController::post(Reader& nif) void NiLookAtController::post(Reader& nif)
{ {
Controller::post(nif); Controller::post(nif);
target.post(nif);
mLookAt.post(nif);
} }
void NiPathController::read(NIFStream* nif) void NiPathController::read(NIFStream* nif)
@ -286,6 +294,7 @@ namespace Nif
void NiUVController::post(Reader& nif) void NiUVController::post(Reader& nif)
{ {
Controller::post(nif); Controller::post(nif);
data.post(nif); data.post(nif);
} }
@ -323,6 +332,7 @@ namespace Nif
void NiAlphaController::read(NIFStream* nif) void NiAlphaController::read(NIFStream* nif)
{ {
NiFloatInterpController::read(nif); NiFloatInterpController::read(nif);
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103)) if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103))
mData.read(nif); mData.read(nif);
} }
@ -330,12 +340,14 @@ namespace Nif
void NiAlphaController::post(Reader& nif) void NiAlphaController::post(Reader& nif)
{ {
NiFloatInterpController::post(nif); NiFloatInterpController::post(nif);
mData.post(nif); mData.post(nif);
} }
void NiRollController::read(NIFStream* nif) void NiRollController::read(NIFStream* nif)
{ {
NiSingleInterpController::read(nif); NiSingleInterpController::read(nif);
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103)) if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103))
mData.read(nif); mData.read(nif);
} }
@ -343,49 +355,47 @@ namespace Nif
void NiRollController::post(Reader& nif) void NiRollController::post(Reader& nif)
{ {
NiSingleInterpController::post(nif); NiSingleInterpController::post(nif);
mData.post(nif); mData.post(nif);
} }
void NiGeomMorpherController::read(NIFStream* nif) void NiGeomMorpherController::read(NIFStream* nif)
{ {
NiInterpController::read(nif); NiInterpController::read(nif);
if (nif->getVersion() >= NIFFile::NIFVersion::VER_OB_OLD) if (nif->getVersion() >= NIFFile::NIFVersion::VER_OB_OLD)
mUpdateNormals = nif->getUShort() & 1; mUpdateNormals = nif->get<uint16_t>() & 1;
mData.read(nif); mData.read(nif);
if (nif->getVersion() >= NIFFile::NIFVersion::VER_MW)
if (nif->getVersion() < NIFFile::NIFVersion::VER_MW)
return;
mAlwaysActive = nif->get<uint8_t>() != 0;
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 105))
return;
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
{ {
mAlwaysActive = nif->getChar(); readRecordList(nif, mInterpolators);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 106)) if (nif->getVersion() >= NIFStream::generateVersion(10, 2, 0, 0) && nif->getBethVersion() >= 10)
{ nif->skip(4 * nif->get<uint32_t>()); // Unknown
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB) return;
{ }
readRecordList(nif, mInterpolators);
if (nif->getVersion() >= NIFStream::generateVersion(10, 2, 0, 0) && nif->getBethVersion() > 9) mInterpolators.resize(nif->get<uint32_t>());
{ mWeights.resize(mInterpolators.size());
unsigned int numUnknown = nif->getUInt(); for (size_t i = 0; i < mInterpolators.size(); i++)
nif->skip(4 * numUnknown); {
} mInterpolators[i].read(nif);
} nif->read(mWeights[i]);
else
{
std::vector<NiInterpolatorPtr> interpolators;
size_t numInterps = nif->getUInt();
interpolators.resize(numInterps);
mWeights.resize(numInterps);
for (size_t i = 0; i < numInterps; i++)
{
interpolators[i].read(nif);
mWeights[i] = nif->getFloat();
}
mInterpolators = interpolators;
}
}
} }
} }
void NiGeomMorpherController::post(Reader& nif) void NiGeomMorpherController::post(Reader& nif)
{ {
NiInterpController::post(nif); NiInterpController::post(nif);
mData.post(nif); mData.post(nif);
postRecordList(nif, mInterpolators); postRecordList(nif, mInterpolators);
} }
@ -393,6 +403,7 @@ namespace Nif
void NiVisController::read(NIFStream* nif) void NiVisController::read(NIFStream* nif)
{ {
NiBoolInterpController::read(nif); NiBoolInterpController::read(nif);
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103)) if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103))
mData.read(nif); mData.read(nif);
} }
@ -400,17 +411,19 @@ namespace Nif
void NiVisController::post(Reader& nif) void NiVisController::post(Reader& nif)
{ {
NiBoolInterpController::post(nif); NiBoolInterpController::post(nif);
mData.post(nif); mData.post(nif);
} }
void NiFlipController::read(NIFStream* nif) void NiFlipController::read(NIFStream* nif)
{ {
NiFloatInterpController::read(nif); NiFloatInterpController::read(nif);
mTexSlot = nif->getUInt();
mTexSlot = static_cast<NiTexturingProperty::TextureType>(nif->get<uint32_t>());
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103)) if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103))
{ {
timeStart = nif->getFloat(); nif->read(timeStart);
mDelta = nif->getFloat(); nif->read(mDelta);
} }
readRecordList(nif, mSources); readRecordList(nif, mSources);
} }
@ -418,14 +431,16 @@ namespace Nif
void NiFlipController::post(Reader& nif) void NiFlipController::post(Reader& nif)
{ {
NiFloatInterpController::post(nif); NiFloatInterpController::post(nif);
postRecordList(nif, mSources); postRecordList(nif, mSources);
} }
void NiTextureTransformController::read(NIFStream* nif) void NiTextureTransformController::read(NIFStream* nif)
{ {
NiFloatInterpController::read(nif); NiFloatInterpController::read(nif);
mShaderMap = nif->getBoolean();
nif->read(mTexSlot); nif->read(mShaderMap);
mTexSlot = static_cast<NiTexturingProperty::TextureType>(nif->get<uint32_t>());
nif->read(mTransformMember); nif->read(mTransformMember);
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103)) if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103))
mData.read(nif); mData.read(nif);
@ -434,31 +449,41 @@ namespace Nif
void NiTextureTransformController::post(Reader& nif) void NiTextureTransformController::post(Reader& nif)
{ {
NiFloatInterpController::post(nif); NiFloatInterpController::post(nif);
mData.post(nif); mData.post(nif);
} }
void bhkBlendController::read(NIFStream* nif) void bhkBlendController::read(NIFStream* nif)
{ {
Controller::read(nif); Controller::read(nif);
nif->getUInt(); // Zero
uint32_t numKeys;
nif->read(numKeys);
// Is this possible?
if (numKeys != 0)
throw Nif::Exception(
"Unsupported keys in bhkBlendController " + std::to_string(recIndex), nif->getFile().getFilename());
} }
void BSEffectShaderPropertyFloatController::read(NIFStream* nif) void BSEffectShaderPropertyFloatController::read(NIFStream* nif)
{ {
NiFloatInterpController::read(nif); NiFloatInterpController::read(nif);
nif->read(mControlledVariable); nif->read(mControlledVariable);
} }
void BSEffectShaderPropertyColorController::read(NIFStream* nif) void BSEffectShaderPropertyColorController::read(NIFStream* nif)
{ {
NiPoint3InterpController::read(nif); NiPoint3InterpController::read(nif);
nif->read(mControlledColor); nif->read(mControlledColor);
} }
void NiControllerManager::read(NIFStream* nif) void NiControllerManager::read(NIFStream* nif)
{ {
Controller::read(nif); Controller::read(nif);
mCumulative = nif->getBoolean();
nif->read(mCumulative);
readRecordList(nif, mSequences); readRecordList(nif, mSequences);
mObjectPalette.read(nif); mObjectPalette.read(nif);
} }
@ -466,6 +491,7 @@ namespace Nif
void NiControllerManager::post(Reader& nif) void NiControllerManager::post(Reader& nif)
{ {
Controller::post(nif); Controller::post(nif);
postRecordList(nif, mSequences); postRecordList(nif, mSequences);
mObjectPalette.post(nif); mObjectPalette.post(nif);
} }

@ -14,14 +14,14 @@ namespace Nif
NiInterpolatorPtr mInterpolator; NiInterpolatorPtr mInterpolator;
ControllerPtr mController; ControllerPtr mController;
NiBlendInterpolatorPtr mBlendInterpolator; NiBlendInterpolatorPtr mBlendInterpolator;
unsigned short mBlendIndex; uint16_t mBlendIndex;
unsigned char mPriority; uint8_t mPriority;
NiStringPalettePtr mStringPalette; NiStringPalettePtr mStringPalette;
size_t mNodeNameOffset; uint32_t mNodeNameOffset;
size_t mPropertyTypeOffset; uint32_t mPropertyTypeOffset;
size_t mControllerTypeOffset; uint32_t mControllerTypeOffset;
size_t mControllerIdOffset; uint32_t mControllerIdOffset;
size_t mInterpolatorIdOffset; uint32_t mInterpolatorIdOffset;
std::string mNodeName; std::string mNodeName;
std::string mPropertyType; std::string mPropertyType;
std::string mControllerType; std::string mControllerType;
@ -38,7 +38,7 @@ namespace Nif
std::string mName; std::string mName;
std::string mAccumRootName; std::string mAccumRootName;
ExtraPtr mTextKeys; ExtraPtr mTextKeys;
unsigned int mArrayGrowBy; uint32_t mArrayGrowBy;
std::vector<ControlledBlock> mControlledBlocks; std::vector<ControlledBlock> mControlledBlocks;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
@ -197,8 +197,15 @@ namespace Nif
struct NiLookAtController : public Controller struct NiLookAtController : public Controller
{ {
NiAVObjectPtr target; enum Flags
unsigned short lookAtFlags{ 0 }; {
Flag_Flip = 0x1,
Flag_LookYAxis = 0x2,
Flag_LookZAxis = 0x4,
};
uint16_t mLookAtFlags{ 0 };
NiAVObjectPtr mLookAt;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
void post(Reader& nif) override; void post(Reader& nif) override;
@ -267,7 +274,7 @@ namespace Nif
struct NiFlipController : public NiFloatInterpController struct NiFlipController : public NiFloatInterpController
{ {
int mTexSlot; // NiTexturingProperty::TextureType NiTexturingProperty::TextureType mTexSlot;
float mDelta; // Time between two flips. delta = (start_time - stop_time) / num_sources float mDelta; // Time between two flips. delta = (start_time - stop_time) / num_sources
NiSourceTextureList mSources; NiSourceTextureList mSources;
@ -278,8 +285,8 @@ namespace Nif
struct NiTextureTransformController : public NiFloatInterpController struct NiTextureTransformController : public NiFloatInterpController
{ {
bool mShaderMap; bool mShaderMap;
int mTexSlot; // NiTexturingProperty::TextureType NiTexturingProperty::TextureType mTexSlot;
unsigned int mTransformMember; uint32_t mTransformMember;
NiFloatDataPtr mData; NiFloatDataPtr mData;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
@ -293,14 +300,14 @@ namespace Nif
struct BSEffectShaderPropertyFloatController : public NiFloatInterpController struct BSEffectShaderPropertyFloatController : public NiFloatInterpController
{ {
unsigned int mControlledVariable; uint32_t mControlledVariable;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
struct BSEffectShaderPropertyColorController : public NiPoint3InterpController struct BSEffectShaderPropertyColorController : public NiPoint3InterpController
{ {
unsigned int mControlledColor; uint32_t mControlledColor;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -310,10 +317,12 @@ namespace Nif
bool mCumulative; bool mCumulative;
NiControllerSequenceList mSequences; NiControllerSequenceList mSequences;
NiDefaultAVObjectPalettePtr mObjectPalette; NiDefaultAVObjectPalettePtr mObjectPalette;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
void post(Reader& nif) override; void post(Reader& nif) override;
}; };
// Abstract
struct NiInterpolator : public Record struct NiInterpolator : public Record
{ {
}; };

@ -79,7 +79,7 @@ namespace Nif
* 5 - Bump map texture * 5 - Bump map texture
* 6 - Decal texture * 6 - Decal texture
*/ */
enum TextureType enum TextureType : uint32_t
{ {
BaseTexture = 0, BaseTexture = 0,
DarkTexture = 1, DarkTexture = 1,

Loading…
Cancel
Save