From 4a88726abaa23d2d98348097c800fe01b3b40876 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Thu, 31 Aug 2023 18:24:36 +0300 Subject: [PATCH] Move particle modifiers into a dedicated file --- components/CMakeLists.txt | 2 +- components/nif/controlled.cpp | 86 --------------------------- components/nif/controlled.hpp | 105 +-------------------------------- components/nif/controller.cpp | 2 +- components/nif/niffile.cpp | 1 + components/nif/particle.cpp | 95 +++++++++++++++++++++++++++++ components/nif/particle.hpp | 90 ++++++++++++++++++++++++++++ components/nifosg/particle.hpp | 2 +- 8 files changed, 190 insertions(+), 193 deletions(-) create mode 100644 components/nif/particle.cpp create mode 100644 components/nif/particle.hpp diff --git a/components/CMakeLists.txt b/components/CMakeLists.txt index 9a073b5ca1..c349d9a248 100644 --- a/components/CMakeLists.txt +++ b/components/CMakeLists.txt @@ -103,7 +103,7 @@ add_component_dir (sceneutil ) add_component_dir (nif - controlled effect niftypes record controller extra node record_ptr data niffile property nifkey base nifstream physics + base controlled controller data effect extra niffile nifkey nifstream niftypes node particle physics property record record_ptr ) add_component_dir (nifosg diff --git a/components/nif/controlled.cpp b/components/nif/controlled.cpp index b2e8087ad1..fd38a4909d 100644 --- a/components/nif/controlled.cpp +++ b/components/nif/controlled.cpp @@ -53,90 +53,4 @@ namespace Nif nif->getSizedStrings(textures, nif->getUInt()); } - 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(nif->get()); - 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); - } } diff --git a/components/nif/controlled.hpp b/components/nif/controlled.hpp index 8ed7a54e07..1a5cc6db42 100644 --- a/components/nif/controlled.hpp +++ b/components/nif/controlled.hpp @@ -1,26 +1,3 @@ -/* - OpenMW - The completely unofficial reimplementation of Morrowind - Copyright (C) 2008-2010 Nicolay Korslund - Email: < korslund@gmail.com > - WWW: https://openmw.org/ - - This file (controlled.h) is part of the OpenMW package. - - OpenMW is distributed as free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License - version 3, as published by the Free Software Foundation. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - version 3 along with this program. If not, see - https://www.gnu.org/licenses/ . - - */ - #ifndef OPENMW_COMPONENTS_NIF_CONTROLLED_HPP #define OPENMW_COMPONENTS_NIF_CONTROLLED_HPP @@ -83,85 +60,5 @@ namespace Nif void read(NIFStream* nif) override; }; - struct NiParticleModifier : public Record - { - NiParticleModifierPtr mNext; - ControllerPtr mController; - - void read(NIFStream* nif) override; - void post(Reader& nif) override; - }; - - struct NiParticleGrowFade : public NiParticleModifier - { - float mGrowTime; - float mFadeTime; - - void read(NIFStream* nif) override; - }; - - struct NiParticleColorModifier : public NiParticleModifier - { - NiColorDataPtr mData; - - void read(NIFStream* nif) override; - void post(Reader& nif) override; - }; - - struct NiGravity : public NiParticleModifier - { - enum class ForceType : uint32_t - { - Wind = 0, // Fixed direction - Point = 1, // Fixed origin - }; - - float mDecay{ 0.f }; - float mForce; - ForceType mType; - osg::Vec3f mPosition; - osg::Vec3f mDirection; - - void read(NIFStream* nif) override; - }; - - struct NiParticleCollider : public NiParticleModifier - { - float mBounceFactor; - bool mSpawnOnCollision{ false }; - bool mDieOnCollision{ false }; - - void read(NIFStream* nif) override; - }; - - // NiPinaColada - struct NiPlanarCollider : public NiParticleCollider - { - osg::Vec2f mExtents; - osg::Vec3f mPosition; - osg::Vec3f mXVector, mYVector; - osg::Vec3f mPlaneNormal; - float mPlaneDistance; - - void read(NIFStream* nif) override; - }; - - struct NiSphericalCollider : public NiParticleCollider - { - float mRadius; - osg::Vec3f mCenter; - - void read(NIFStream* nif) override; - }; - - struct NiParticleRotation : public NiParticleModifier - { - uint8_t mRandomInitialAxis; - osg::Vec3f mInitialAxis; - float mRotationSpeed; - - void read(NIFStream* nif) override; - }; - -} // Namespace +} #endif diff --git a/components/nif/controller.cpp b/components/nif/controller.cpp index 9e93b31162..ba6fa025c7 100644 --- a/components/nif/controller.cpp +++ b/components/nif/controller.cpp @@ -3,7 +3,7 @@ #include "controlled.hpp" #include "data.hpp" #include "node.hpp" -#include "recordptr.hpp" +#include "particle.hpp" namespace Nif { diff --git a/components/nif/niffile.cpp b/components/nif/niffile.cpp index f806c61bc1..59e73196fb 100644 --- a/components/nif/niffile.cpp +++ b/components/nif/niffile.cpp @@ -17,6 +17,7 @@ #include "exception.hpp" #include "extra.hpp" #include "node.hpp" +#include "particle.hpp" #include "physics.hpp" #include "property.hpp" diff --git a/components/nif/particle.cpp b/components/nif/particle.cpp new file mode 100644 index 0000000000..ae391c59e4 --- /dev/null +++ b/components/nif/particle.cpp @@ -0,0 +1,95 @@ +#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(nif->get()); + 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); + } + +} diff --git a/components/nif/particle.hpp b/components/nif/particle.hpp new file mode 100644 index 0000000000..5590877294 --- /dev/null +++ b/components/nif/particle.hpp @@ -0,0 +1,90 @@ +#ifndef OPENMW_COMPONENTS_NIF_PARTICLE_HPP +#define OPENMW_COMPONENTS_NIF_PARTICLE_HPP + +#include "base.hpp" + +namespace Nif +{ + + struct NiParticleModifier : public Record + { + NiParticleModifierPtr mNext; + ControllerPtr mController; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + + struct NiParticleGrowFade : public NiParticleModifier + { + float mGrowTime; + float mFadeTime; + + void read(NIFStream* nif) override; + }; + + struct NiParticleColorModifier : public NiParticleModifier + { + NiColorDataPtr mData; + + void read(NIFStream* nif) override; + void post(Reader& nif) override; + }; + + struct NiGravity : public NiParticleModifier + { + enum class ForceType : uint32_t + { + Wind = 0, // Fixed direction + Point = 1, // Fixed origin + }; + + float mDecay{ 0.f }; + float mForce; + ForceType mType; + osg::Vec3f mPosition; + osg::Vec3f mDirection; + + void read(NIFStream* nif) override; + }; + + struct NiParticleCollider : public NiParticleModifier + { + float mBounceFactor; + bool mSpawnOnCollision{ false }; + bool mDieOnCollision{ false }; + + void read(NIFStream* nif) override; + }; + + // NiPinaColada + struct NiPlanarCollider : public NiParticleCollider + { + osg::Vec2f mExtents; + osg::Vec3f mPosition; + osg::Vec3f mXVector, mYVector; + osg::Vec3f mPlaneNormal; + float mPlaneDistance; + + void read(NIFStream* nif) override; + }; + + struct NiSphericalCollider : public NiParticleCollider + { + float mRadius; + osg::Vec3f mCenter; + + void read(NIFStream* nif) override; + }; + + struct NiParticleRotation : public NiParticleModifier + { + uint8_t mRandomInitialAxis; + osg::Vec3f mInitialAxis; + float mRotationSpeed; + + void read(NIFStream* nif) override; + }; + +} +#endif diff --git a/components/nifosg/particle.hpp b/components/nifosg/particle.hpp index fd7fa64c58..a9b628f695 100644 --- a/components/nifosg/particle.hpp +++ b/components/nifosg/particle.hpp @@ -10,7 +10,7 @@ #include #include -#include // NiGravity::ForceType +#include // NiGravity::ForceType #include