diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index 6d29972f63..7f0d630be1 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -305,8 +305,11 @@ namespace Nif { "BSPSysInheritVelocityModifier", &construct }, { "BSPSysLODModifier", &construct }, + { "BSPSysRecycleBoundModifier", &construct }, { "BSPSysScaleModifier", &construct }, { "BSPSysSimpleColorModifier", &construct }, + { "BSPSysStripUpdateModifier", &construct }, + { "BSPSysSubTexModifier", &construct }, // Emitters { "NiPSysBoxEmitter", &construct }, @@ -347,6 +350,11 @@ namespace Nif { "NiPlanarCollider", &construct }, { "NiSphericalCollider", &construct }, + // Colliders, Gamebryo + { "NiPSysColliderManager", &construct }, + { "NiPSysPlanarCollider", &construct }, + { "NiPSysSphericalCollider", &construct }, + // Particle system controllers, 4.0.0.2 { "NiParticleSystemController", &construct }, diff --git a/components/nif/particle.cpp b/components/nif/particle.cpp index 42ce8b57f9..289210662e 100644 --- a/components/nif/particle.cpp +++ b/components/nif/particle.cpp @@ -364,6 +364,22 @@ namespace Nif nif->read(mEndSize); } + void BSPSysRecycleBoundModifier::read(NIFStream* nif) + { + NiPSysModifier::read(nif); + + nif->read(mBoundOffset); + nif->read(mBoundExtents); + mBoundObject.read(nif); + } + + void BSPSysRecycleBoundModifier::post(Reader& nif) + { + NiPSysModifier::post(nif); + + mBoundObject.post(nif); + } + void BSPSysScaleModifier::read(NIFStream* nif) { NiPSysModifier::read(nif); @@ -386,6 +402,26 @@ namespace Nif nif->skip(52); // Unknown } + void BSPSysStripUpdateModifier::read(NIFStream* nif) + { + NiPSysModifier::read(nif); + + nif->read(mUpdateDeltaTime); + } + + void BSPSysSubTexModifier::read(NIFStream* nif) + { + NiPSysModifier::read(nif); + + nif->read(mStartFrame); + nif->read(mStartFrameFudge); + nif->read(mEndFrame); + nif->read(mLoopStartFrame); + nif->read(mLoopStartFrameFudge); + nif->read(mFrameCount); + nif->read(mFrameCountFudge); + } + void NiPSysEmitter::read(NIFStream* nif) { NiPSysModifier::read(nif); @@ -496,4 +532,54 @@ namespace Nif mVisKeyList->mKeys[nif->get()].mValue = nif->get() != 0; } + void NiPSysCollider::read(NIFStream* nif) + { + nif->read(mBounce); + nif->read(mCollideSpawn); + nif->read(mCollideDie); + mSpawnModifier.read(nif); + mParent.read(nif); + mNextCollider.read(nif); + mColliderObject.read(nif); + } + + void NiPSysCollider::post(Reader& nif) + { + mSpawnModifier.post(nif); + mParent.post(nif); + mNextCollider.post(nif); + mColliderObject.post(nif); + } + + void NiPSysColliderManager::read(NIFStream* nif) + { + NiPSysModifier::read(nif); + + mCollider.read(nif); + } + + void NiPSysColliderManager::post(Reader& nif) + { + NiPSysModifier::post(nif); + + mCollider.post(nif); + } + + void NiPSysSphericalCollider::read(NIFStream* nif) + { + NiPSysCollider::read(nif); + + nif->read(mRadius); + } + + void NiPSysPlanarCollider::read(NIFStream* nif) + { + NiPSysCollider::read(nif); + + nif->read(mWidth); + nif->read(mHeight); + nif->read(mXAxis); + nif->read(mYAxis); + } + } diff --git a/components/nif/particle.hpp b/components/nif/particle.hpp index 0c9379f0f9..876c1c6a75 100644 --- a/components/nif/particle.hpp +++ b/components/nif/particle.hpp @@ -268,6 +268,16 @@ namespace Nif void read(NIFStream* nif) override; }; + struct BSPSysRecycleBoundModifier : NiPSysModifier + { + osg::Vec3f mBoundOffset; + osg::Vec3f mBoundExtents; + NiAVObjectPtr mBoundObject; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + struct BSPSysScaleModifier : public NiPSysModifier { std::vector mScales; @@ -288,6 +298,26 @@ namespace Nif void read(NIFStream* nif) override; }; + struct BSPSysStripUpdateModifier : NiPSysModifier + { + float mUpdateDeltaTime; + + void read(NIFStream* nif) override; + }; + + struct BSPSysSubTexModifier : public NiPSysModifier + { + float mStartFrame; + float mStartFrameFudge; + float mEndFrame; + float mLoopStartFrame; + float mLoopStartFrameFudge; + float mFrameCount; + float mFrameCountFudge; + + void read(NIFStream* nif) override; + }; + // Abstract struct NiPSysEmitter : public NiPSysModifier { @@ -399,5 +429,44 @@ namespace Nif void read(NIFStream* nif) override; }; + struct NiPSysCollider : Record + { + float mBounce; + bool mCollideSpawn; + bool mCollideDie; + NiPSysSpawnModifierPtr mSpawnModifier; + NiPSysColliderManagerPtr mParent; + NiPSysColliderPtr mNextCollider; + NiAVObjectPtr mColliderObject; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + + struct NiPSysColliderManager : NiPSysModifier + { + NiPSysColliderPtr mCollider; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + + struct NiPSysPlanarCollider : NiPSysCollider + { + float mWidth; + float mHeight; + osg::Vec3f mXAxis; + osg::Vec3f mYAxis; + + void read(NIFStream* nif) override; + }; + + struct NiPSysSphericalCollider : NiPSysCollider + { + float mRadius; + + void read(NIFStream* nif) override; + }; + } #endif diff --git a/components/nif/record.hpp b/components/nif/record.hpp index 3d5ec01bc3..6b59465a14 100644 --- a/components/nif/record.hpp +++ b/components/nif/record.hpp @@ -96,8 +96,11 @@ namespace Nif RC_BSPackedAdditionalGeometryData, RC_BSPSysInheritVelocityModifier, RC_BSPSysLODModifier, + RC_BSPSysRecycleBoundModifier, RC_BSPSysScaleModifier, RC_BSPSysSimpleColorModifier, + RC_BSPSysStripUpdateModifier, + RC_BSPSysSubTexModifier, RC_BSStripParticleSystem, RC_BSStripPSysData, RC_BSRefractionFirePeriodController, @@ -192,6 +195,7 @@ namespace Nif RC_NiPSysAirFieldSpreadCtlr, RC_NiPSysBoxEmitter, RC_NiPSysBoundUpdateModifier, + RC_NiPSysColliderManager, RC_NiPSysCylinderEmitter, RC_NiPSysData, RC_NiPSysDragModifier, @@ -215,10 +219,12 @@ namespace Nif RC_NiPSysInitialRotAngleVarCtlr, RC_NiPSysMeshEmitter, RC_NiPSysModifierActiveCtlr, + RC_NiPSysPlanarCollider, RC_NiPSysPositionModifier, RC_NiPSysRotationModifier, RC_NiPSysResetOnLoopCtlr, RC_NiPSysSpawnModifier, + RC_NiPSysSphericalCollider, RC_NiPSysSphereEmitter, RC_NiPSysUpdateCtlr, RC_NiRollController, diff --git a/components/nif/recordptr.hpp b/components/nif/recordptr.hpp index 6223740e31..b2168d9f1f 100644 --- a/components/nif/recordptr.hpp +++ b/components/nif/recordptr.hpp @@ -130,6 +130,8 @@ namespace Nif struct NiPalette; struct NiParticleModifier; struct NiParticleSystem; + struct NiPSysCollider; + struct NiPSysColliderManager; struct NiPSysEmitterCtlrData; struct NiPSysModifier; struct NiPSysSpawnModifier; @@ -175,6 +177,8 @@ namespace Nif using NiPalettePtr = RecordPtrT; using NiParticleModifierPtr = RecordPtrT; using NiParticleSystemPtr = RecordPtrT; + using NiPSysColliderPtr = RecordPtrT; + using NiPSysColliderManagerPtr = RecordPtrT; using NiPSysEmitterCtlrDataPtr = RecordPtrT; using NiPSysSpawnModifierPtr = RecordPtrT; using NiBoolDataPtr = RecordPtrT;