diff --git a/Runtime/Particle/CEmitterElement.cpp b/Runtime/Particle/CEmitterElement.cpp index 9cae5edb0..9d0d46837 100644 --- a/Runtime/Particle/CEmitterElement.cpp +++ b/Runtime/Particle/CEmitterElement.cpp @@ -1,20 +1,75 @@ #include "CEmitterElement.hpp" +#include "CRandom16.hpp" namespace pshag { bool CEESimpleEmitter::GetValue(int frame, Zeus::CVector3f& pPos, Zeus::CVector3f& pVel) const { + x4_loc->GetValue(frame, pPos); + + if (x8_vec) + x8_vec->GetValue(frame, pVel); + else + pVel = Zeus::CVector3f(); + return false; } bool CVESphere::GetValue(int frame, Zeus::CVector3f& pPos, Zeus::CVector3f& pVel) const { + Zeus::CVector3f a; + x4_a->GetValue(frame, a); + float b; + x8_b->GetValue(frame, b); + CRandom16* rand = CRandom16::GetRandomNumber(); + int rand1 = rand->Range(-100, 100); + int rand2 = rand->Range(-100, 100); + int rand3 = rand->Range(-100, 100); + + Zeus::CVector3f normVec1 = Zeus::CVector3f(0.0099999998f * float(rand3), + 0.0099999998f * float(rand2), + 0.0099999998f * float(rand1)); + if (normVec1.canBeNormalized()) + normVec1.normalize(); + + pPos = b * normVec1 + a; + + Zeus::CVector3f normVec2 = (pPos - a); + if (normVec2.canBeNormalized()) + normVec2.normalize(); + + float c; + xc_c->GetValue(frame, c); + pVel = c * normVec2; + return false; } bool CVEAngleSphere::GetValue(int frame, Zeus::CVector3f& pPos, Zeus::CVector3f& pVel) const { + Zeus::CVector3f a; + x4_a->GetValue(frame, a); + + float b, d, e, f, g; + x8_b->GetValue(frame, b); + x10_d->GetValue(frame, d); + x14_e->GetValue(frame, e); + x18_f->GetValue(frame, f); + x1c_g->GetValue(frame, g); + CRandom16* rand = CRandom16::GetRandomNumber(); + d = (d + ((0.5f * (f * rand->Float())) - f)) * M_PI / 180.f; + e = (e + ((0.5f * (f * rand->Float())) - f)) * M_PI / 180.f; + + float cosD = Zeus::Math::fastCosR(d); + pPos.x = a.x + (b * (-Zeus::Math::fastSinR(e) * cosD)); + pPos.y = a.y + (b * Zeus::Math::fastSinR(d)); + pPos.z = a.z + (b * (cosD * cosD)); + Zeus::CVector3f normVec = (pPos - a).normalized(); + + float c; + xc_c->GetValue(frame, c); + pVel = c * normVec; return false; }