mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
592 lines
14 KiB
C++
592 lines
14 KiB
C++
#ifndef OPENMW_COMPONENTS_NIF_PARTICLE_HPP
|
|
#define OPENMW_COMPONENTS_NIF_PARTICLE_HPP
|
|
|
|
#include "base.hpp"
|
|
#include "controller.hpp"
|
|
#include "data.hpp"
|
|
#include "node.hpp"
|
|
|
|
namespace Nif
|
|
{
|
|
|
|
struct NiParticleModifier : Record
|
|
{
|
|
NiParticleModifierPtr mNext;
|
|
NiTimeControllerPtr mController;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiParticleGrowFade : NiParticleModifier
|
|
{
|
|
float mGrowTime;
|
|
float mFadeTime;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiParticleColorModifier : NiParticleModifier
|
|
{
|
|
NiColorDataPtr mData;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
enum class ForceType : uint32_t
|
|
{
|
|
Wind = 0, // Fixed direction
|
|
Point = 1, // Fixed origin
|
|
};
|
|
|
|
enum class DecayType : uint32_t
|
|
{
|
|
None = 0, // f(Distance) = 1.0
|
|
Linear = 1, // f(Distance) = (Range - Distance) / Range
|
|
Exponential = 2, // f(Distance) = exp(-Distance / Range)
|
|
};
|
|
|
|
enum class SymmetryType : uint32_t
|
|
{
|
|
Spherical = 0,
|
|
Cylindrical = 1, // Perpendicular to direction axis
|
|
Planar = 2, // Parallel to direction axis
|
|
};
|
|
|
|
struct NiGravity : NiParticleModifier
|
|
{
|
|
float mDecay{ 0.f };
|
|
float mForce;
|
|
ForceType mType;
|
|
osg::Vec3f mPosition;
|
|
osg::Vec3f mDirection;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiParticleBomb : NiParticleModifier
|
|
{
|
|
float mRange;
|
|
float mDuration;
|
|
float mStrength;
|
|
float mStartTime;
|
|
DecayType mDecayType;
|
|
SymmetryType mSymmetryType;
|
|
osg::Vec3f mPosition;
|
|
osg::Vec3f mDirection;
|
|
|
|
void read(NIFStream* nif);
|
|
};
|
|
|
|
struct NiParticleCollider : NiParticleModifier
|
|
{
|
|
float mBounceFactor;
|
|
bool mSpawnOnCollision{ false };
|
|
bool mDieOnCollision{ false };
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
// NiPinaColada
|
|
struct NiPlanarCollider : NiParticleCollider
|
|
{
|
|
osg::Vec2f mExtents;
|
|
osg::Vec3f mPosition;
|
|
osg::Vec3f mXVector, mYVector;
|
|
osg::Vec3f mPlaneNormal;
|
|
float mPlaneDistance;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiSphericalCollider : NiParticleCollider
|
|
{
|
|
float mRadius;
|
|
osg::Vec3f mCenter;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiParticleRotation : NiParticleModifier
|
|
{
|
|
uint8_t mRandomInitialAxis;
|
|
osg::Vec3f mInitialAxis;
|
|
float mRotationSpeed;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiParticlesData : NiGeometryData
|
|
{
|
|
uint16_t mNumParticles{ 0 };
|
|
uint16_t mActiveCount;
|
|
|
|
std::vector<float> mRadii;
|
|
std::vector<float> mSizes;
|
|
std::vector<osg::Quat> mRotations;
|
|
std::vector<float> mRotationAngles;
|
|
std::vector<osg::Vec3f> mRotationAxes;
|
|
|
|
bool mHasTextureIndices{ false };
|
|
std::vector<osg::Vec4f> mSubtextureOffsets;
|
|
float mAspectRatio{ 1.f };
|
|
uint16_t mAspectFlags{ 0 };
|
|
float mAspectRatio2;
|
|
float mAspectSpeed, mAspectSpeed2;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiRotatingParticlesData : NiParticlesData
|
|
{
|
|
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;
|
|
std::array<float, 6> mBoundMinMax;
|
|
BSVertexDesc mVertDesc;
|
|
std::array<uint16_t, 4> mNearFar;
|
|
bool mWorldSpace{ true };
|
|
NiPSysModifierList mModifiers;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysData : NiParticlesData
|
|
{
|
|
std::vector<NiParticleInfo> mParticles;
|
|
std::vector<float> mRotationSpeeds;
|
|
uint16_t mNumAddedParticles;
|
|
uint16_t mAddedParticlesBase;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiMeshPSysData : NiPSysData
|
|
{
|
|
uint32_t mDefaultPoolSize;
|
|
bool mFillPoolsOnLoad;
|
|
std::vector<uint32_t> mGenerations;
|
|
NiAVObjectPtr mParticleMeshes;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct BSStripPSysData : NiPSysData
|
|
{
|
|
uint16_t mMaxPointCount;
|
|
float mStartCapSize;
|
|
float mEndCapSize;
|
|
bool mDoZPrepass;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
// Abstract
|
|
struct NiPSysModifier : Record
|
|
{
|
|
enum class NiPSysModifierOrder : uint32_t
|
|
{
|
|
KillOldParticles = 0,
|
|
BSLOD = 1,
|
|
Emitter = 1000,
|
|
Spawn = 2000,
|
|
BSStripUpdateFO3 = 2500,
|
|
General = 3000,
|
|
Force = 4000,
|
|
Collider = 5000,
|
|
PosUpdate = 6000,
|
|
PostPosUpdate = 6500,
|
|
WorldshiftPartspawn = 6600,
|
|
BoundUpdate = 7000,
|
|
BSStripUpdateSK = 8000,
|
|
};
|
|
|
|
std::string mName;
|
|
NiPSysModifierOrder mOrder;
|
|
NiParticleSystemPtr mTarget;
|
|
bool mActive;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysAgeDeathModifier : NiPSysModifier
|
|
{
|
|
bool mSpawnOnDeath;
|
|
NiPSysSpawnModifierPtr mSpawnModifier;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysBombModifier : NiPSysModifier
|
|
{
|
|
NiAVObjectPtr mBombObject;
|
|
osg::Vec3f mBombAxis;
|
|
float mRange;
|
|
float mStrength;
|
|
DecayType mDecayType;
|
|
SymmetryType mSymmetryType;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysBoundUpdateModifier : NiPSysModifier
|
|
{
|
|
uint16_t mUpdateSkip;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiPSysColorModifier : NiPSysModifier
|
|
{
|
|
NiColorDataPtr mData;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysDragModifier : NiPSysModifier
|
|
{
|
|
NiAVObjectPtr mDragObject;
|
|
osg::Vec3f mDragAxis;
|
|
float mPercentage;
|
|
float mRange;
|
|
float mRangeFalloff;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysGravityModifier : NiPSysModifier
|
|
{
|
|
NiAVObjectPtr mGravityObject;
|
|
osg::Vec3f mGravityAxis;
|
|
float mDecay;
|
|
float mStrength;
|
|
ForceType mForceType;
|
|
float mTurbulence;
|
|
float mTurbulenceScale;
|
|
bool mWorldAligned;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysGrowFadeModifier : NiPSysModifier
|
|
{
|
|
float mGrowTime;
|
|
uint16_t mGrowGeneration;
|
|
float mFadeTime;
|
|
uint16_t mFadeGeneration;
|
|
float mBaseScale;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiPSysMeshUpdateModifier : NiPSysModifier
|
|
{
|
|
NiAVObjectList mMeshes;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysRotationModifier : NiPSysModifier
|
|
{
|
|
float mRotationSpeed;
|
|
float mRotationSpeedVariation;
|
|
float mRotationAngle;
|
|
float mRotationAngleVariation;
|
|
bool mRandomRotSpeedSign;
|
|
bool mRandomAxis;
|
|
osg::Vec3f mAxis;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiPSysSpawnModifier : NiPSysModifier
|
|
{
|
|
uint16_t mNumSpawnGenerations;
|
|
float mPercentageSpawned;
|
|
uint16_t mMinNumToSpawn;
|
|
uint16_t mMaxNumToSpawn;
|
|
float mSpawnSpeedVariation;
|
|
float mSpawnDirVariation;
|
|
float mLifespan;
|
|
float mLifespanVariation;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct BSParentVelocityModifier : NiPSysModifier
|
|
{
|
|
float mDamping;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct BSPSysHavokUpdateModifier : NiPSysMeshUpdateModifier
|
|
{
|
|
NiPSysModifierPtr mModifier;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct BSPSysInheritVelocityModifier : NiPSysModifier
|
|
{
|
|
NiAVObjectPtr mInheritObject;
|
|
float mInheritChance;
|
|
float mVelocityMult;
|
|
float mVelcoityVariation;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct BSPSysLODModifier : NiPSysModifier
|
|
{
|
|
float mLODStartDistance;
|
|
float mLODEndDistance;
|
|
float mEndEmitScale;
|
|
float mEndSize;
|
|
|
|
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 : NiPSysModifier
|
|
{
|
|
std::vector<float> mScales;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct BSPSysSimpleColorModifier : NiPSysModifier
|
|
{
|
|
float mFadeInPercent;
|
|
float mFadeOutPercent;
|
|
float mColor1EndPercent;
|
|
float mColor1StartPercent;
|
|
float mColor2EndPercent;
|
|
float mColor2StartPercent;
|
|
std::vector<osg::Vec4f> mColors;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct BSPSysStripUpdateModifier : NiPSysModifier
|
|
{
|
|
float mUpdateDeltaTime;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct BSPSysSubTexModifier : NiPSysModifier
|
|
{
|
|
float mStartFrame;
|
|
float mStartFrameFudge;
|
|
float mEndFrame;
|
|
float mLoopStartFrame;
|
|
float mLoopStartFrameFudge;
|
|
float mFrameCount;
|
|
float mFrameCountFudge;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct BSWindModifier : NiPSysModifier
|
|
{
|
|
float mStrength;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
// Abstract
|
|
struct NiPSysEmitter : NiPSysModifier
|
|
{
|
|
float mSpeed;
|
|
float mSpeedVariation;
|
|
float mDeclination;
|
|
float mDeclinationVariation;
|
|
float mPlanarAngle;
|
|
float mPlanarAngleVariation;
|
|
osg::Vec4f mInitialColor;
|
|
float mInitialRadius;
|
|
float mRadiusVariation;
|
|
float mLifespan;
|
|
float mLifespanVariation;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
// Abstract
|
|
struct NiPSysVolumeEmitter : NiPSysEmitter
|
|
{
|
|
NiAVObjectPtr mEmitterObject;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysBoxEmitter : NiPSysVolumeEmitter
|
|
{
|
|
float mWidth;
|
|
float mHeight;
|
|
float mDepth;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiPSysCylinderEmitter : NiPSysVolumeEmitter
|
|
{
|
|
float mRadius;
|
|
float mHeight;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
struct NiPSysMeshEmitter : NiPSysEmitter
|
|
{
|
|
NiAVObjectList mEmitterMeshes;
|
|
uint32_t mInitialVelocityType;
|
|
uint32_t mEmissionType;
|
|
osg::Vec3f mEmissionAxis;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysSphereEmitter : NiPSysVolumeEmitter
|
|
{
|
|
float mRadius;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
// Abstract
|
|
struct NiPSysModifierCtlr : NiSingleInterpController
|
|
{
|
|
std::string mModifierName;
|
|
|
|
void read(NIFStream* nif) override;
|
|
};
|
|
|
|
template <class DataPtr>
|
|
struct TypedNiPSysModifierCtlr : NiPSysModifierCtlr
|
|
{
|
|
DataPtr mData;
|
|
|
|
void read(NIFStream* nif) override
|
|
{
|
|
NiPSysModifierCtlr::read(nif);
|
|
|
|
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103))
|
|
mData.read(nif);
|
|
}
|
|
|
|
void post(Reader& nif) override
|
|
{
|
|
NiPSysModifierCtlr::post(nif);
|
|
|
|
mData.post(nif);
|
|
}
|
|
};
|
|
|
|
using NiPSysModifierBoolCtlr = TypedNiPSysModifierCtlr<NiVisDataPtr>;
|
|
using NiPSysModifierFloatCtlr = TypedNiPSysModifierCtlr<NiFloatDataPtr>;
|
|
|
|
struct NiPSysEmitterCtlr : NiPSysModifierCtlr
|
|
{
|
|
NiPSysEmitterCtlrDataPtr mData;
|
|
NiInterpolatorPtr mVisInterpolator;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct BSPSysMultiTargetEmitterCtlr : NiPSysEmitterCtlr
|
|
{
|
|
uint16_t mMaxEmitters;
|
|
BSMasterParticleSystemPtr mMasterPSys;
|
|
|
|
void read(NIFStream* nif) override;
|
|
void post(Reader& nif) override;
|
|
};
|
|
|
|
struct NiPSysEmitterCtlrData : Record
|
|
{
|
|
FloatKeyMapPtr mFloatKeyList;
|
|
BoolKeyMapPtr mVisKeyList;
|
|
|
|
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
|