metaforce/Runtime/Particle/CElementGen.hpp

219 lines
6.9 KiB
C++
Raw Normal View History

2015-08-17 23:46:41 +00:00
#ifndef __RETRO_CELEMENTGEN_HPP__
#define __RETRO_CELEMENTGEN_HPP__
2016-02-11 22:38:25 +00:00
#include "RetroTypes.hpp"
2016-02-08 03:31:05 +00:00
#include "CTransform.hpp"
2016-02-09 22:52:33 +00:00
#include "CVector3f.hpp"
2016-02-08 03:31:05 +00:00
#include "CColor.hpp"
#include "CAABox.hpp"
2016-02-08 05:10:17 +00:00
#include "CToken.hpp"
2016-02-09 22:52:33 +00:00
#include "CLight.hpp"
2016-02-12 02:36:34 +00:00
#include "CGraphics.hpp"
2016-02-09 22:52:33 +00:00
#include "CRandom16.hpp"
2015-08-21 00:06:39 +00:00
2015-08-17 23:46:41 +00:00
namespace Retro
{
2016-02-08 03:31:05 +00:00
class CWarp;
class CLight;
class IGenDescription;
2016-02-08 05:10:17 +00:00
class CGenDescription;
2016-02-11 22:38:25 +00:00
class CParticleSwoosh;
class CParticleElectric;
2015-08-17 23:46:41 +00:00
2016-02-08 03:31:05 +00:00
class CElementGen
2015-08-17 23:46:41 +00:00
{
2016-02-08 05:10:17 +00:00
public:
enum class EModelOrientationType
{
2016-02-09 22:52:33 +00:00
Normal,
One
2016-02-08 05:10:17 +00:00
};
enum class EOptionalSystemFlags
2016-02-09 22:52:33 +00:00
{
None,
One,
Two
};
class CParticleListItem
2016-02-08 05:10:17 +00:00
{
2016-02-11 02:36:21 +00:00
friend class CElementGen;
s16 x0_partIdx;
Zeus::CVector3f x4_vec;
2016-02-10 02:00:28 +00:00
public:
2016-02-11 02:36:21 +00:00
CParticleListItem(s16 idx)
: x0_partIdx(idx)
{
++g_ParticleAliveCount;
}
~CParticleListItem()
{
--g_ParticleAliveCount;
}
2016-02-10 02:00:28 +00:00
};
class CParticle
{
2016-02-11 02:36:21 +00:00
friend class CElementGen;
int x0_endFrame = 0;
Zeus::CVector3f x4_pos;
Zeus::CVector3f x10_prevPos;
Zeus::CVector3f x1c_vel;
int x28_startFrame = 0;
float x2c_lineLengthOrSize = 0.f;
float x30_lineWidthOrRota = 0.f;
Zeus::CColor x34_color = {0.f, 0.f, 0.f, 1.f};
2016-02-08 05:10:17 +00:00
};
protected:
CElementGen(const TToken<IGenDescription>& gen);
TLockedToken<IGenDescription> x1c_genDesc;
2016-02-08 05:10:17 +00:00
EModelOrientationType x28_orientType;
2016-02-09 22:52:33 +00:00
std::vector<CParticleListItem> x2c_particleLists;
std::vector<Zeus::CMatrix3f> x3c_parentMatrices;
2016-02-08 05:10:17 +00:00
u32 x4c = 0;
2016-02-10 02:00:28 +00:00
u32 x50_curFrame = 0;
double x58_curSeconds = 0.f;
float x60;
2016-02-11 22:38:25 +00:00
u32 x64_prevFrame = -1;
2016-02-08 05:10:17 +00:00
bool x68_particleEmission = true;
2016-02-11 02:36:21 +00:00
float x6c_generatorRemainder = 0.f;
2016-02-09 22:52:33 +00:00
int x70_MAXP = 0;
2016-02-08 05:10:17 +00:00
u16 x74 = 99;
float x78_generatorRate = 1.f;
2016-02-11 22:38:25 +00:00
Zeus::CVector3f x7c_translation;
2016-02-09 22:52:33 +00:00
Zeus::CVector3f x88_globalTranslation;
2016-02-11 02:36:21 +00:00
Zeus::CVector3f x94_POFS;
2016-02-11 22:38:25 +00:00
Zeus::CVector3f xa0_globalScale = {1.f, 1.f, 1.f};
2016-02-08 05:10:17 +00:00
Zeus::CTransform xac = Zeus::CTransform::Identity();
2016-02-09 22:52:33 +00:00
Zeus::CTransform xdc = Zeus::CTransform::Identity();
2016-02-11 22:38:25 +00:00
Zeus::CVector3f x10c_localScale = {1.f, 1.f, 1.f};
2016-02-09 22:52:33 +00:00
Zeus::CTransform x118 = Zeus::CTransform::Identity();
Zeus::CTransform x148 = Zeus::CTransform::Identity();
2016-02-11 22:38:25 +00:00
Zeus::CTransform x178_orientation = Zeus::CTransform::Identity();
2016-02-09 22:52:33 +00:00
Zeus::CTransform x1a8 = Zeus::CTransform::Identity();
Zeus::CTransform x1d8_globalOrientation = Zeus::CTransform::Identity();
2016-02-11 02:36:21 +00:00
u32 x208_activeParticleCount = 0;
2016-02-11 22:38:25 +00:00
u32 x20c_recursiveParticleCount = 0;
2016-02-11 02:36:21 +00:00
u32 x210_curEmitterFrame = 0;
2016-02-09 22:52:33 +00:00
int x214_PSLT = 0x7fffff;
Zeus::CVector3f x218_PSIV;
bool x224_24 = false;
bool x224_25_LIT_;
bool x224_26_AAPH;
bool x224_27_ZBUF;
bool x224_28 = true;
bool x224_29_MBLR;
bool x224_30_VMD1;
bool x224_31_VMD2;
2016-02-11 02:36:21 +00:00
bool x225_24_VMD3;
bool x225_25_VMD4;
2016-02-09 22:52:33 +00:00
bool x225_26_LINE;
bool x225_27_FXLL;
2016-02-10 02:00:28 +00:00
bool x225_28_warmedUp = false;
2016-02-09 22:52:33 +00:00
bool x225_29 = false;
bool x226;
int x228_MBSP;
2016-02-12 02:36:34 +00:00
ERglLight x22c_backupLightActive = ERglLight::None;
2016-02-11 02:36:21 +00:00
CRandom16 x230_randState;
2016-02-11 22:38:25 +00:00
std::vector<std::unique_ptr<CElementGen>> x234_activePartChildren;
2016-02-09 22:52:33 +00:00
int x244_CSSD = 0;
2016-02-11 22:38:25 +00:00
std::vector<std::unique_ptr<CElementGen>> x248_finishPartChildren;
2016-02-09 22:52:33 +00:00
int x258_SISY = 16;
int x25c_PISY = 16;
2016-02-11 22:38:25 +00:00
std::vector<std::unique_ptr<CParticleSwoosh>> x260_swhcChildren;
2016-02-09 22:52:33 +00:00
int x270_SSSD = 0;
Zeus::CVector3f x274_SSPO;
2016-02-11 22:38:25 +00:00
std::vector<std::unique_ptr<CParticleElectric>> x280_elscChildren;
2016-02-09 22:52:33 +00:00
int x290_SESD = 0;
Zeus::CVector3f x294_SEPO;
float x2a0 = 0.f;
float x2a4 = 0.f;
2016-02-11 02:36:21 +00:00
Zeus::CVector3f x2a8_aabbMin;
Zeus::CVector3f x2b4_aabbMax;
float x2c0_maxSize = 0.f;
2016-02-11 22:38:25 +00:00
Zeus::CAABox x2c4_systemBounds = Zeus::CAABox::skInvertedBox;
2016-02-09 22:52:33 +00:00
ELightType x2dc_lightType;
2016-02-11 22:38:25 +00:00
Zeus::CColor x2e0_LCLR = Zeus::CColor::skWhite;
float x2e4_LINT = 1.f;
Zeus::CVector3f x2e8_LOFF;
Zeus::CVector3f x2f4_LDIR = {1.f, 0.f, 0.f};
2016-02-09 22:52:33 +00:00
EFalloffType x300_falloffType = EFalloffType::Linear;
2016-02-11 22:38:25 +00:00
float x304_LFOR = 1.f;
float x308_LSLA = 45.f;
Zeus::CColor x30c_moduColor = {1.f, 1.f, 1.f, 1.f};
2016-02-09 22:52:33 +00:00
2016-02-11 02:36:21 +00:00
void AccumulateBounds(Zeus::CVector3f& pos, float size);
2015-08-18 05:54:43 +00:00
public:
2016-02-08 05:10:17 +00:00
CElementGen(const TToken<CGenDescription>& gen, EModelOrientationType orientType, EOptionalSystemFlags flags);
2016-02-09 22:52:33 +00:00
virtual ~CElementGen();
2016-02-08 05:10:17 +00:00
virtual const Zeus::CVector3f& GetGlobalTranslation() const
{ return x88_globalTranslation; }
virtual const Zeus::CTransform& GetGlobalOrientation() const
{ return x1d8_globalOrientation; }
virtual bool GetParticleEmission() const
{ return x68_particleEmission; }
void SetGeneratorRateScalar(float scalar)
{
if (scalar >= 0.0f)
x78_generatorRate = scalar;
else
x78_generatorRate = 0.0f;
2016-02-11 22:38:25 +00:00
for (std::unique_ptr<CElementGen>& child : x234_activePartChildren)
2016-02-09 22:52:33 +00:00
child->SetGeneratorRateScalar(x78_generatorRate);
2016-02-11 22:38:25 +00:00
for (std::unique_ptr<CElementGen>& child : x248_finishPartChildren)
2016-02-09 22:52:33 +00:00
child->SetGeneratorRateScalar(x78_generatorRate);
}
2016-02-11 02:36:21 +00:00
static s32 g_FreeIndex;
static bool g_StaticListInitialized;
2016-02-09 22:52:33 +00:00
static int g_ParticleAliveCount;
static int g_ParticleSystemAliveCount;
static void Initialize();
2016-02-10 02:00:28 +00:00
void UpdateExistingParticles();
void CreateNewParticles(int);
void UpdatePSTranslationAndOrientation();
void UpdateChildParticleSystems(double);
2016-02-11 06:58:33 +00:00
CElementGen* ConstructChildParticleSystem(const TToken<CGenDescription>&);
2016-02-10 02:00:28 +00:00
void UpdateLightParameters();
void BuildParticleSystemBounds();
2016-02-11 19:18:14 +00:00
u32 GetSystemCount();
2016-02-11 22:38:25 +00:00
u32 GetParticleCountAllInternal() const;
u32 GetParticleCountAll() const {return x20c_recursiveParticleCount;}
2016-02-08 03:31:05 +00:00
2016-02-12 02:36:34 +00:00
void RenderModels();
void RenderLines();
void RenderParticles();
2016-02-08 03:31:05 +00:00
virtual void Update(double);
2016-02-10 02:00:28 +00:00
bool InternalUpdate(double);
2016-02-08 03:31:05 +00:00
virtual void Render();
virtual void SetOrientation(const Zeus::CTransform&);
virtual void SetTranslation(const Zeus::CVector3f&);
virtual void SetGlobalOrientation(const Zeus::CTransform&);
virtual void SetGlobalTranslation(const Zeus::CVector3f&);
virtual void SetGlobalScale(const Zeus::CVector3f&);
virtual void SetLocalScale(const Zeus::CVector3f&);
virtual void SetParticleEmission(bool);
virtual void SetModulationColor(const Zeus::CColor&);
virtual const Zeus::CTransform& GetOrientation() const;
virtual const Zeus::CVector3f& GetTranslation() const;
virtual const Zeus::CVector3f& GetGlobalScale() const;
virtual const Zeus::CColor& GetModulationColor() const;
virtual bool IsSystemDeletable() const;
2016-02-11 22:38:25 +00:00
virtual std::pair<Zeus::CAABox, bool> GetBounds() const;
2016-02-08 03:31:05 +00:00
virtual u32 GetParticleCount() const;
virtual bool SystemHasLight() const;
virtual CLight GetLight() const;
virtual void DestroyParticles();
virtual void AddModifier(CWarp*);
2015-08-17 23:46:41 +00:00
};
2016-02-09 22:52:33 +00:00
ENABLE_BITWISE_ENUM(CElementGen::EOptionalSystemFlags)
2015-08-17 23:46:41 +00:00
}
#endif // __RETRO_CELEMENTGEN_HPP__