Files
prime/src/Kyoto/Particles/CParticleDataFactory.cpp
Luke Street 8af6095198 Add several particle classes; link CParticleGlobals
Adds CModVectorElement, CParticleDataFactory, CParticleGlobals, CRealElement
CRealElement & CModVectorElement are very close to matching


Former-commit-id: bb99d88d3b
2022-10-17 22:06:45 -04:00

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;
}