diff --git a/components/nif/controller.cpp b/components/nif/controller.cpp index a3033357ec..3f4d5a6380 100644 --- a/components/nif/controller.cpp +++ b/components/nif/controller.cpp @@ -600,6 +600,26 @@ namespace Nif mPercentData.post(nif); } + void NiLookAtInterpolator::read(NIFStream* nif) + { + nif->read(mLookAtFlags); + mLookAt.read(nif); + nif->read(mLookAtName); + if (nif->getVersion() <= NIFStream::generateVersion(20, 4, 0, 12)) + nif->read(mTransform); + mTranslation.read(nif); + mRoll.read(nif); + mScale.read(nif); + } + + void NiLookAtInterpolator::post(Reader& nif) + { + mLookAt.post(nif); + mTranslation.post(nif); + mRoll.post(nif); + mScale.post(nif); + } + 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 8a7d306a85..97f948167b 100644 --- a/components/nif/controller.hpp +++ b/components/nif/controller.hpp @@ -419,6 +419,21 @@ namespace Nif void post(Reader& nif) override; }; + struct NiLookAtInterpolator : NiInterpolator + { + // Uses the same flags as NiLookAtController + uint16_t mLookAtFlags{ 0 }; + NiAVObjectPtr mLookAt; + std::string mLookAtName; + NiQuatTransform mTransform; + NiInterpolatorPtr mTranslation; + NiInterpolatorPtr mRoll; + NiInterpolatorPtr mScale; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + // Abstract struct NiBlendInterpolator : public NiInterpolator { diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index f526c1e3d4..10a53234f1 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -72,6 +72,7 @@ namespace Nif { "BSDebrisNode", &construct }, { "BSFadeNode", &construct }, { "BSLeafAnimNode", &construct }, + { "BSMasterParticleSystem", &construct }, { "BSMultiBoundNode", &construct }, { "BSOrderedNode", &construct }, { "BSRangeNode", &construct }, @@ -164,6 +165,7 @@ namespace Nif { "NiBoolTimelineInterpolator", &construct }, { "NiColorInterpolator", &construct }, { "NiFloatInterpolator", &construct }, + { "NiLookAtInterpolator", &construct }, { "NiPathInterpolator", &construct }, { "NiPoint3Interpolator", &construct }, { "NiTransformInterpolator", &construct }, @@ -305,6 +307,7 @@ namespace Nif { "NiPSysSpawnModifier", &construct }, // Modifiers, Bethesda + { "BSParentVelocityModifier", &construct }, { "BSPSysInheritVelocityModifier", &construct }, { "BSPSysLODModifier", &construct }, diff --git a/components/nif/particle.cpp b/components/nif/particle.cpp index 0d3545acd5..63eff520b3 100644 --- a/components/nif/particle.cpp +++ b/components/nif/particle.cpp @@ -150,6 +150,21 @@ namespace Nif nif->readVector(mRotations, mNumVertices); } + void BSMasterParticleSystem::read(NIFStream* nif) + { + NiNode::read(nif); + + nif->read(mMaxEmitters); + readRecordList(nif, mParticleSystems); + } + + void BSMasterParticleSystem::post(Reader& nif) + { + NiNode::post(nif); + + postRecordList(nif, mParticleSystems); + } + void NiParticleSystem::read(NIFStream* nif) { // Weird loading to account for inheritance differences starting from SSE @@ -383,6 +398,13 @@ namespace Nif nif->read(mLifespanVariation); } + void BSParentVelocityModifier::read(NIFStream* nif) + { + NiPSysModifier::read(nif); + + nif->read(mDamping); + } + void BSPSysInheritVelocityModifier::read(NIFStream* nif) { NiPSysModifier::read(nif); diff --git a/components/nif/particle.hpp b/components/nif/particle.hpp index 8fc24ee407..732649fabe 100644 --- a/components/nif/particle.hpp +++ b/components/nif/particle.hpp @@ -115,6 +115,15 @@ namespace Nif void read(NIFStream* nif) override; }; + struct BSMasterParticleSystem : NiNode + { + uint16_t mMaxEmitters; + NiAVObjectList mParticleSystems; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + struct NiParticleSystem : NiParticles { osg::BoundingSpheref mBoundingSphere; @@ -279,6 +288,13 @@ namespace Nif void read(NIFStream* nif) override; }; + struct BSParentVelocityModifier : NiPSysModifier + { + float mDamping; + + void read(NIFStream* nif) override; + }; + struct BSPSysInheritVelocityModifier : NiPSysModifier { NiAVObjectPtr mInheritObject; diff --git a/components/nif/record.hpp b/components/nif/record.hpp index f7bb4fa648..d0a51581c4 100644 --- a/components/nif/record.hpp +++ b/components/nif/record.hpp @@ -94,6 +94,7 @@ namespace Nif RC_BSMultiBoundSphere, RC_BSNiAlphaPropertyTestRefController, RC_BSPackedAdditionalGeometryData, + RC_BSParentVelocityModifier, RC_BSPSysArrayEmitter, RC_BSPSysInheritVelocityModifier, RC_BSPSysLODModifier, @@ -172,6 +173,7 @@ namespace Nif RC_NiLinesData, RC_NiLODNode, RC_NiLookAtController, + RC_NiLookAtInterpolator, RC_NiMaterialColorController, RC_NiMaterialProperty, RC_NiMorphData,