mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-12-12 10:46:08 +00:00
Adds CModVectorElement, CParticleDataFactory, CParticleGlobals, CRealElement
CRealElement & CModVectorElement are very close to matching
Former-commit-id: bb99d88d3b
222 lines
6.2 KiB
C++
222 lines
6.2 KiB
C++
#include "Kyoto/Particles/CParticleDataFactory.hpp"
|
|
|
|
#include "Kyoto/Particles/CIntElement.hpp"
|
|
#include "Kyoto/Particles/CModVectorElement.hpp"
|
|
#include "Kyoto/Streams/CInputStream.hpp"
|
|
|
|
#define SBIG(v) v
|
|
|
|
FourCC CParticleDataFactory::GetClassID(CInputStream& in) { return in.ReadLong(); }
|
|
|
|
bool CParticleDataFactory::GetBool(CInputStream& in) {
|
|
GetClassID(in);
|
|
return in.ReadBool();
|
|
}
|
|
|
|
int CParticleDataFactory::GetInt(CInputStream& in) { return in.ReadInt32(); }
|
|
|
|
float CParticleDataFactory::GetReal(CInputStream& in) { return in.ReadFloat(); }
|
|
|
|
CIntElement* CParticleDataFactory::GetIntElement(CInputStream& in) {
|
|
FourCC clsId = GetClassID(in);
|
|
switch (clsId) {
|
|
case SBIG('CNST'): {
|
|
return new CIEConstant(GetInt(in));
|
|
}
|
|
case SBIG('KEYE'):
|
|
case SBIG('KEYP'): {
|
|
return new CIEKeyframeEmitter(in);
|
|
}
|
|
case SBIG('TSCL'): {
|
|
return new CIETimescale(GetRealElement(in));
|
|
}
|
|
case SBIG('DETH'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
return new CIEDeath(a, b);
|
|
}
|
|
case SBIG('CHAN'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
CIntElement* c = GetIntElement(in);
|
|
return new CIETimeChain(a, b, c);
|
|
}
|
|
case SBIG('ADD_'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
return new CIEAdd(a, b);
|
|
}
|
|
case SBIG('MULT'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
return new CIEMultiply(a, b);
|
|
}
|
|
case SBIG('MODU'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
return new CIEModulo(a, b);
|
|
}
|
|
case SBIG('RAND'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
return new CIERandom(a, b);
|
|
}
|
|
case SBIG('IMPL'): {
|
|
return new CIEImpulse(GetIntElement(in));
|
|
}
|
|
case SBIG('ILPT'): {
|
|
return new CIELifetimePercent(GetIntElement(in));
|
|
}
|
|
case SBIG('SPAH'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
CIntElement* c = GetIntElement(in);
|
|
return new CIESampleAndHold(c, a, b);
|
|
}
|
|
case SBIG('IRND'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
return new CIEInitialRandom(a, b);
|
|
}
|
|
case SBIG('CLMP'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
CIntElement* c = GetIntElement(in);
|
|
return new CIEClamp(a, b, c);
|
|
}
|
|
case SBIG('PULS'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
CIntElement* c = GetIntElement(in);
|
|
CIntElement* d = GetIntElement(in);
|
|
return new CIEPulse(a, b, c, d);
|
|
}
|
|
case SBIG('NONE'): {
|
|
return nullptr;
|
|
}
|
|
case SBIG('RTOI'): {
|
|
CRealElement* a = GetRealElement(in);
|
|
CRealElement* b = GetRealElement(in);
|
|
return new CIERealToInt(a, b);
|
|
}
|
|
case SBIG('SUB_'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
return new CIESubtract(a, b);
|
|
}
|
|
case SBIG('GTCP'): {
|
|
return new CIEGetCumulativeParticleCount();
|
|
}
|
|
case SBIG('GAPC'): {
|
|
return new CIEGetActiveParticleCount();
|
|
}
|
|
case SBIG('GEMT'): {
|
|
return new CIEGetEmitterTime();
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
CModVectorElement* CParticleDataFactory::GetModVectorElement(CInputStream& in) {
|
|
FourCC clsId = GetClassID(in);
|
|
switch (clsId) {
|
|
case SBIG('NONE'): {
|
|
return nullptr;
|
|
}
|
|
case SBIG('CNST'): {
|
|
CRealElement* a = GetRealElement(in);
|
|
CRealElement* b = GetRealElement(in);
|
|
CRealElement* c = GetRealElement(in);
|
|
if (a && b && c && a->IsConstant() && b->IsConstant() && c->IsConstant()) {
|
|
float af, bf, cf;
|
|
#if NONMATCHING
|
|
a->GetValue(0, af);
|
|
b->GetValue(0, bf);
|
|
c->GetValue(0, cf);
|
|
#else
|
|
// BUG: Fetching from the same element for each
|
|
a->GetValue(0, af);
|
|
a->GetValue(0, bf);
|
|
a->GetValue(0, cf);
|
|
#endif
|
|
CModVectorElement* result = new CMVEFastConstant(af, bf, cf);
|
|
delete a;
|
|
delete b;
|
|
delete c;
|
|
return result;
|
|
} else {
|
|
return new CMVEConstant(a, b, c);
|
|
}
|
|
}
|
|
case SBIG('GRAV'): {
|
|
return new CMVEGravity(GetVectorElement(in));
|
|
}
|
|
case SBIG('WIND'): {
|
|
CVectorElement* a = GetVectorElement(in);
|
|
CRealElement* b = GetRealElement(in);
|
|
return new CMVEWind(a, b);
|
|
}
|
|
case SBIG('EXPL'): {
|
|
CRealElement* a = GetRealElement(in);
|
|
CRealElement* b = GetRealElement(in);
|
|
return new CMVEExplode(a, b);
|
|
}
|
|
case SBIG('CHAN'): {
|
|
CModVectorElement* a = GetModVectorElement(in);
|
|
CModVectorElement* b = GetModVectorElement(in);
|
|
CIntElement* c = GetIntElement(in);
|
|
return new CMVETimeChain(a, b, c);
|
|
}
|
|
case SBIG('PULS'): {
|
|
CIntElement* a = GetIntElement(in);
|
|
CIntElement* b = GetIntElement(in);
|
|
CModVectorElement* c = GetModVectorElement(in);
|
|
CModVectorElement* d = GetModVectorElement(in);
|
|
return new CMVEPulse(a, b, c, d);
|
|
}
|
|
case SBIG('IMPL'): {
|
|
CVectorElement* a = GetVectorElement(in);
|
|
CRealElement* b = GetRealElement(in);
|
|
CRealElement* c = GetRealElement(in);
|
|
CRealElement* d = GetRealElement(in);
|
|
bool e = GetBool(in);
|
|
return new CMVEImplosion(a, b, c, d, e);
|
|
}
|
|
case SBIG('LMPL'): {
|
|
CVectorElement* a = GetVectorElement(in);
|
|
CRealElement* b = GetRealElement(in);
|
|
CRealElement* c = GetRealElement(in);
|
|
CRealElement* d = GetRealElement(in);
|
|
bool e = GetBool(in);
|
|
return new CMVELinearImplosion(a, b, c, d, e);
|
|
}
|
|
case SBIG('EMPL'): {
|
|
CVectorElement* a = GetVectorElement(in);
|
|
CRealElement* b = GetRealElement(in);
|
|
CRealElement* c = GetRealElement(in);
|
|
CRealElement* d = GetRealElement(in);
|
|
bool e = GetBool(in);
|
|
return new CMVEExponentialImplosion(a, b, c, d, e);
|
|
}
|
|
case SBIG('SWRL'): {
|
|
CVectorElement* a = GetVectorElement(in);
|
|
CVectorElement* b = GetVectorElement(in);
|
|
CRealElement* c = GetRealElement(in);
|
|
CRealElement* d = GetRealElement(in);
|
|
return new CMVESwirl(a, b, c, d);
|
|
}
|
|
case SBIG('BNCE'): {
|
|
CVectorElement* a = GetVectorElement(in);
|
|
CVectorElement* b = GetVectorElement(in);
|
|
CRealElement* c = GetRealElement(in);
|
|
CRealElement* d = GetRealElement(in);
|
|
bool e = GetBool(in);
|
|
return new CMVEBounce(a, b, c, d, e);
|
|
}
|
|
case SBIG('SPOS'): {
|
|
return new CMVESetPosition(GetVectorElement(in));
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|