Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
19 kB · 732 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733#include "particle.hpp"
#include "data.hpp"
namespace Nif{
void NiParticleModifier::read(NIFStream* nif) { mNext.read(nif); if (nif->getVersion() >= NIFStream::generateVersion(3, 3, 0, 13)) mController.read(nif); }
void NiParticleModifier::post(Reader& nif) { mNext.post(nif); mController.post(nif); }
void NiParticleGrowFade::read(NIFStream* nif) { NiParticleModifier::read(nif); nif->read(mGrowTime); nif->read(mFadeTime); }
void NiParticleColorModifier::read(NIFStream* nif) { NiParticleModifier::read(nif);
mData.read(nif); }
void NiParticleColorModifier::post(Reader& nif) { NiParticleModifier::post(nif);
mData.post(nif); }
void NiGravity::read(NIFStream* nif) { NiParticleModifier::read(nif);
if (nif->getVersion() >= NIFStream::generateVersion(3, 3, 0, 13)) nif->read(mDecay); nif->read(mForce); mType = static_cast<ForceType>(nif->get<uint32_t>()); nif->read(mPosition); nif->read(mDirection); }
void NiParticleBomb::read(NIFStream* nif) { NiParticleModifier::read(nif);
nif->read(mRange); nif->read(mDuration); nif->read(mStrength); nif->read(mStartTime); mDecayType = static_cast<DecayType>(nif->get<uint32_t>()); mSymmetryType = static_cast<SymmetryType>(nif->get<uint32_t>()); nif->read(mPosition); nif->read(mDirection); }
void NiParticleCollider::read(NIFStream* nif) { NiParticleModifier::read(nif);
nif->read(mBounceFactor); if (nif->getVersion() >= NIFStream::generateVersion(4, 2, 0, 2)) { nif->read(mSpawnOnCollision); nif->read(mDieOnCollision); } }
void NiPlanarCollider::read(NIFStream* nif) { NiParticleCollider::read(nif);
nif->read(mExtents); nif->read(mPosition); nif->read(mXVector); nif->read(mYVector); nif->read(mPlaneNormal); nif->read(mPlaneDistance); }
void NiSphericalCollider::read(NIFStream* nif) { NiParticleCollider::read(nif);
nif->read(mRadius); nif->read(mCenter); }
void NiParticleRotation::read(NIFStream* nif) { NiParticleModifier::read(nif);
nif->read(mRandomInitialAxis); nif->read(mInitialAxis); nif->read(mRotationSpeed); }
void NiParticlesData::read(NIFStream* nif) { NiGeometryData::read(nif);
// Should always match the number of vertices in theory, but doesn't: // see mist.nif in Mistify mod (https://www.nexusmods.com/morrowind/mods/48112). if (nif->getVersion() <= NIFFile::NIFVersion::VER_MW) nif->read(mNumParticles); bool isBs202 = nif->getVersion() == NIFFile::NIFVersion::VER_BGS && nif->getBethVersion() != 0;
uint16_t numRadii = 1; if (nif->getVersion() > NIFStream::generateVersion(10, 0, 1, 0)) numRadii = (nif->get<bool>() && !isBs202) ? mNumVertices : 0; nif->readVector(mRadii, numRadii); nif->read(mActiveCount); if (nif->get<bool>() && !isBs202) nif->readVector(mSizes, mNumVertices);
if (nif->getVersion() >= NIFStream::generateVersion(10, 0, 1, 0)) { if (nif->get<bool>() && !isBs202) nif->readVector(mRotations, mNumVertices); if (nif->getVersion() >= NIFStream::generateVersion(20, 0, 0, 4)) { if (nif->get<bool>() && !isBs202) nif->readVector(mRotationAngles, mNumVertices); if (nif->get<bool>() && !isBs202) nif->readVector(mRotationAxes, mNumVertices); if (isBs202) { nif->read(mHasTextureIndices); uint32_t numSubtextureOffsets; if (nif->getBethVersion() <= NIFFile::BethVersion::BETHVER_FO3) numSubtextureOffsets = nif->get<uint8_t>(); else nif->read(numSubtextureOffsets); nif->readVector(mSubtextureOffsets, numSubtextureOffsets); if (nif->getBethVersion() > NIFFile::BethVersion::BETHVER_FO3) { nif->read(mAspectRatio); nif->read(mAspectFlags); nif->read(mAspectRatio2); nif->read(mAspectSpeed); nif->read(mAspectSpeed2); } } } } }
void NiRotatingParticlesData::read(NIFStream* nif) { NiParticlesData::read(nif);
if (nif->getVersion() <= NIFStream::generateVersion(4, 2, 2, 0) && nif->get<bool>()) 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 if (nif->getBethVersion() < NIFFile::BethVersion::BETHVER_SSE) NiParticles::read(nif); else { NiAVObject::read(nif);
nif->read(mBoundingSphere); if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76) nif->readArray(mBoundMinMax);
mSkin.read(nif); mShaderProperty.read(nif); mAlphaProperty.read(nif); mVertDesc.read(nif); }
if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_SKY) { nif->readArray(mNearFar); if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_SSE) mData.read(nif); }
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0)) { nif->read(mWorldSpace); readRecordList(nif, mModifiers); } }
void NiParticleSystem::post(Reader& nif) { NiParticles::post(nif);
postRecordList(nif, mModifiers); }
void NiPSysData::read(NIFStream* nif) { NiParticlesData::read(nif);
bool hasData = nif->getBethVersion() < NIFFile::BethVersion::BETHVER_FO3; if (hasData) nif->readVectorOfRecords(mNumVertices, mParticles);
if (nif->getBethVersion() > NIFFile::BethVersion::BETHVER_FO4) nif->skip(12); // Unknown
if (nif->getVersion() >= NIFStream::generateVersion(20, 0, 0, 2) && nif->get<bool>() && hasData) nif->readVector(mRotationSpeeds, mNumVertices);
if (nif->getVersion() != NIFStream::generateVersion(20, 2, 0, 7) || nif->getBethVersion() == 0) { nif->read(mNumAddedParticles); nif->read(mAddedParticlesBase); } }
void NiMeshPSysData::read(NIFStream* nif) { NiPSysData::read(nif);
if (nif->getVersion() >= NIFStream::generateVersion(10, 2, 0, 0)) { nif->read(mDefaultPoolSize); nif->read(mFillPoolsOnLoad); nif->readVector(mGenerations, nif->get<uint32_t>()); } mParticleMeshes.read(nif); }
void NiMeshPSysData::post(Reader& nif) { NiPSysData::post(nif);
mParticleMeshes.post(nif); }
void BSStripPSysData::read(NIFStream* nif) { NiPSysData::read(nif);
nif->read(mMaxPointCount); nif->read(mStartCapSize); nif->read(mEndCapSize); nif->read(mDoZPrepass); }
void NiPSysModifier::read(NIFStream* nif) { nif->read(mName); mOrder = static_cast<NiPSysModifierOrder>(nif->get<uint32_t>()); mTarget.read(nif); nif->read(mActive); }
void NiPSysModifier::post(Reader& nif) { mTarget.post(nif); }
void NiPSysAgeDeathModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mSpawnOnDeath); mSpawnModifier.read(nif); }
void NiPSysAgeDeathModifier::post(Reader& nif) { NiPSysModifier::post(nif);
mSpawnModifier.post(nif); }
void NiPSysBombModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
mBombObject.read(nif); nif->read(mBombAxis); nif->read(mRange); nif->read(mStrength); mDecayType = static_cast<DecayType>(nif->get<uint32_t>()); mSymmetryType = static_cast<SymmetryType>(nif->get<uint32_t>()); }
void NiPSysBombModifier::post(Reader& nif) { NiPSysModifier::post(nif);
mBombObject.post(nif); }
void NiPSysBoundUpdateModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mUpdateSkip); }
void NiPSysColorModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
mData.read(nif); }
void NiPSysColorModifier::post(Reader& nif) { NiPSysModifier::post(nif);
mData.post(nif); }
void NiPSysDragModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
mDragObject.read(nif); nif->read(mDragAxis); nif->read(mPercentage); nif->read(mRange); nif->read(mRangeFalloff); }
void NiPSysDragModifier::post(Reader& nif) { NiPSysModifier::post(nif);
mDragObject.post(nif); }
void NiPSysGravityModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
mGravityObject.read(nif); nif->read(mGravityAxis); nif->read(mDecay); nif->read(mStrength); mForceType = static_cast<ForceType>(nif->get<uint32_t>()); nif->read(mTurbulence); nif->read(mTurbulenceScale);
if (nif->getBethVersion() >= 17) nif->read(mWorldAligned); }
void NiPSysGravityModifier::post(Reader& nif) { NiPSysModifier::post(nif);
mGravityObject.post(nif); }
void NiPSysGrowFadeModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mGrowTime); nif->read(mGrowGeneration); nif->read(mFadeTime); nif->read(mFadeGeneration); if (nif->getVersion() == NIFFile::NIFVersion::VER_BGS && nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO3) nif->read(mBaseScale); }
void NiPSysMeshUpdateModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
readRecordList(nif, mMeshes); }
void NiPSysMeshUpdateModifier::post(Reader& nif) { NiPSysModifier::post(nif);
postRecordList(nif, mMeshes); }
void NiPSysRotationModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mRotationSpeed);
if (nif->getVersion() >= NIFStream::generateVersion(20, 0, 0, 2)) { nif->read(mRotationSpeedVariation);
if (nif->getBethVersion() > NIFFile::BethVersion::BETHVER_FO4) nif->skip(17); // Unknown
nif->read(mRotationAngle); nif->read(mRotationAngleVariation); nif->read(mRandomRotSpeedSign); }
nif->read(mRandomAxis); nif->read(mAxis); }
void NiPSysSpawnModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mNumSpawnGenerations); nif->read(mPercentageSpawned); nif->read(mMinNumToSpawn); nif->read(mMaxNumToSpawn); nif->read(mSpawnSpeedVariation); nif->read(mSpawnDirVariation); nif->read(mLifespan); nif->read(mLifespanVariation); }
void BSParentVelocityModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mDamping); }
void BSPSysHavokUpdateModifier::read(NIFStream* nif) { NiPSysMeshUpdateModifier::read(nif);
mModifier.read(nif); }
void BSPSysHavokUpdateModifier::post(Reader& nif) { NiPSysMeshUpdateModifier::post(nif);
mModifier.post(nif); }
void BSPSysInheritVelocityModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
mInheritObject.read(nif); nif->read(mInheritChance); nif->read(mVelocityMult); nif->read(mVelcoityVariation); }
void BSPSysInheritVelocityModifier::post(Reader& nif) { NiPSysModifier::post(nif);
mInheritObject.post(nif); }
void BSPSysLODModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mLODStartDistance); nif->read(mLODEndDistance); nif->read(mEndEmitScale); 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);
nif->readVector(mScales, nif->get<uint32_t>()); }
void BSPSysSimpleColorModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mFadeInPercent); nif->read(mFadeOutPercent); nif->read(mColor1EndPercent); nif->read(mColor1StartPercent); nif->read(mColor2EndPercent); nif->read(mColor2StartPercent); nif->readVector(mColors, 3); if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76) 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 BSWindModifier::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mStrength); }
void NiPSysEmitter::read(NIFStream* nif) { NiPSysModifier::read(nif);
nif->read(mSpeed); nif->read(mSpeedVariation); nif->read(mDeclination); nif->read(mDeclinationVariation); nif->read(mPlanarAngle); nif->read(mPlanarAngleVariation); nif->read(mInitialColor); nif->read(mInitialRadius); if (nif->getVersion() >= NIFStream::generateVersion(10, 4, 0, 1)) nif->read(mRadiusVariation); nif->read(mLifespan); nif->read(mLifespanVariation); }
void NiPSysVolumeEmitter::read(NIFStream* nif) { NiPSysEmitter::read(nif);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0)) mEmitterObject.read(nif); }
void NiPSysVolumeEmitter::post(Reader& nif) { NiPSysEmitter::post(nif);
mEmitterObject.post(nif); }
void NiPSysBoxEmitter::read(NIFStream* nif) { NiPSysVolumeEmitter::read(nif);
nif->read(mWidth); nif->read(mHeight); nif->read(mDepth); }
void NiPSysCylinderEmitter::read(NIFStream* nif) { NiPSysVolumeEmitter::read(nif);
nif->read(mRadius); nif->read(mHeight); }
void NiPSysMeshEmitter::read(NIFStream* nif) { NiPSysEmitter::read(nif);
readRecordList(nif, mEmitterMeshes);
nif->read(mInitialVelocityType); nif->read(mEmissionType); nif->read(mEmissionAxis); }
void NiPSysMeshEmitter::post(Reader& nif) { NiPSysEmitter::post(nif);
postRecordList(nif, mEmitterMeshes); }
void NiPSysSphereEmitter::read(NIFStream* nif) { NiPSysVolumeEmitter::read(nif);
nif->read(mRadius); }
void NiPSysModifierCtlr::read(NIFStream* nif) { NiSingleInterpController::read(nif);
nif->read(mModifierName); }
void NiPSysEmitterCtlr::read(NIFStream* nif) { NiPSysModifierCtlr::read(nif);
if (nif->getVersion() <= NIFStream::generateVersion(10, 1, 0, 103)) mData.read(nif); else mVisInterpolator.read(nif); }
void NiPSysEmitterCtlr::post(Reader& nif) { NiPSysModifierCtlr::post(nif);
mData.post(nif); mVisInterpolator.post(nif); }
void BSPSysMultiTargetEmitterCtlr::read(NIFStream* nif) { NiPSysEmitterCtlr::read(nif);
nif->read(mMaxEmitters); mMasterPSys.read(nif); }
void BSPSysMultiTargetEmitterCtlr::post(Reader& nif) { NiPSysEmitterCtlr::post(nif);
mMasterPSys.post(nif); }
void NiPSysEmitterCtlrData::read(NIFStream* nif) { // TODO: this is not used in the official files and needs verification mFloatKeyList = std::make_shared<FloatKeyMap>(); mFloatKeyList->read(nif); mVisKeyList = std::make_shared<BoolKeyMap>(); nif->readVectorOfRecords<uint32_t>(readKeyMapPair<float, bool>, mVisKeyList->mKeys); }
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); }
}