diff --git a/configure.py b/configure.py index 906656f43..6e7450b3e 100755 --- a/configure.py +++ b/configure.py @@ -686,7 +686,7 @@ config.libs = [ Object(NonMatching, "JSystem/JParticle/JPAMath.cpp"), Object(NonMatching, "JSystem/JParticle/JPAField.cpp"), Object(NonMatching, "JSystem/JParticle/JPAEmitter.cpp"), - Object(NonMatching, "JSystem/JParticle/JPAParticle.cpp"), + Object(Matching, "JSystem/JParticle/JPAParticle.cpp"), Object(NonMatching, "JSystem/JParticle/JPAEmitterManager.cpp"), Object(NonMatching, "JSystem/JParticle/JPADrawVisitor.cpp"), Object(NonMatching, "JSystem/JParticle/JPADraw.cpp"), diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h index 6a1d20798..4860af4f9 100644 --- a/include/JSystem/JGeometry.h +++ b/include/JSystem/JGeometry.h @@ -22,10 +22,10 @@ struct TUtil { static inline f32 inv_sqrt(f32 mag) { if (mag <= 0.0f) { return mag; - } else { - f32 root = __frsqrte(mag); - return 0.5f * root * (3.0f - mag * (root * root)); } + f32 root = __frsqrte(mag); + root = 0.5f * root * (3.0f - mag * (root * root)); + return root; } }; @@ -116,8 +116,8 @@ struct TVec3 : public Vec { void add(const TVec3& a, const TVec3& b) { x = a.x + b.x; - y = a.x + b.y; - z = a.x + b.z; + y = a.y + b.y; + z = a.z + b.z; } void sub(const TVec3& b) { @@ -173,7 +173,7 @@ struct TVec3 : public Vec { } f32 squared() const { - return x*x + y*y + z*z; + return dot(*this); } f32 squared(const TVec3& b) const { @@ -181,8 +181,7 @@ struct TVec3 : public Vec { } f32 length() const { - f32 sqr = squared(); - return TUtil::sqrt(sqr); + return TUtil::sqrt(squared()); } f32 normalize() { diff --git a/include/JSystem/JParticle/JPAField.h b/include/JSystem/JParticle/JPAField.h index 65983d2da..f82dbadd7 100644 --- a/include/JSystem/JParticle/JPAField.h +++ b/include/JSystem/JParticle/JPAField.h @@ -10,6 +10,7 @@ class JPAFieldData; class JPABaseParticle; class JPABaseField; class JPAFieldBlock; +class JPAFieldContainer; class JPAFieldManager { public: @@ -20,6 +21,8 @@ public: void deleteField(JPAFieldData*); void deleteAllField(); + static JPAFieldContainer fc; + public: /* 0x00 */ JSUList mList; /* 0x0C */ JSUList* mVacList; @@ -38,8 +41,8 @@ public: /* 0x08 */ JSULink mLink; /* 0x18 */ JGeometry::TVec3 mVel; /* 0x24 */ JGeometry::TVec3 mWork0; - /* 0x28 */ JGeometry::TVec3 mWork1; - /* 0x2C */ JGeometry::TVec3 mWork2; + /* 0x30 */ JGeometry::TVec3 mWork1; + /* 0x3C */ JGeometry::TVec3 mWork2; /* 0x48 */ f32 mMaxDistSq; /* 0x4C */ f32 mFadeOutRate; /* 0x50 */ f32 mFadeInRate; diff --git a/src/JSystem/JParticle/JPAField.cpp b/src/JSystem/JParticle/JPAField.cpp index 42873bedc..27d8fbb69 100644 --- a/src/JSystem/JParticle/JPAField.cpp +++ b/src/JSystem/JParticle/JPAField.cpp @@ -11,7 +11,7 @@ #include "JSystem/JMath/JMATrigonometric.h" #include "dolphin/mtx/mtxvec.h" -JPAFieldContainer fc; +JPAFieldContainer JPAFieldManager::fc; JPAEmitterInfo * JPAFieldData::pEmtrInfo; /* 80259EE8-8025A0D8 .text loadFieldData__12JPABaseFieldFP12JPAFieldDataP13JPAFieldBlock */ @@ -119,7 +119,7 @@ void JPAAirField::preCalc(JPAFieldData* data) { data->mVel.scale(data->mMag, data->mWork2); if (data->mSttFlag & 0x01) { - data->mWork1.x = JMASCos(data->mVal1 * 0xFFFF); + data->mWork1.x = JMASCos(data->mVal1 * 0x8000); if (data->mSttFlag & 0x02) { data->mWork0.set(data->mPos); } else { @@ -130,7 +130,6 @@ void JPAAirField::preCalc(JPAFieldData* data) { /* 8025A510-8025A6EC .text calc__11JPAAirFieldFP12JPAFieldDataP15JPABaseParticle */ void JPAAirField::calc(JPAFieldData* data, JPABaseParticle* ptcl) { - /* Nonmatching */ if (data->mSttFlag & 0x01) { JGeometry::TVec3 vel; if (data->mSttFlag & 0x02) { @@ -222,8 +221,6 @@ void JPAVortexField::preCalc(JPAFieldData* data) { /* 8025ACA0-8025AE04 .text calc__14JPAVortexFieldFP12JPAFieldDataP15JPABaseParticle */ void JPAVortexField::calc(JPAFieldData* data, JPABaseParticle* ptcl) { - /* Nonmatching */ - JGeometry::TVec3 force; f32 dot = data->mWork0.dot(ptcl->mLocalPosition); force.scale(dot, data->mWork0); @@ -233,9 +230,9 @@ void JPAVortexField::calc(JPAFieldData* data, JPABaseParticle* ptcl) { f32 power = sqDist; if (sqDist > data->mVal1) power = data->mVal1; - power *= data->mVal2; + f32 temp = power * data->mVal2; - f32 speed = (1.0f - power) * data->mMag + power * data->mMagRndm; + f32 speed = (1.0f - temp) * data->mMag + temp * data->mMagRndm; force.normalize(); data->mVel.cross(force, data->mWork0); @@ -261,11 +258,45 @@ void JPAConvectionField::preCalc(JPAFieldData* data) { /* 8025B114-8025B3CC .text calc__18JPAConvectionFieldFP12JPAFieldDataP15JPABaseParticle */ void JPAConvectionField::calc(JPAFieldData* data, JPABaseParticle* ptcl) { - /* Nonmatching */ + /* Nonmatching - regalloc, maybe related to cross_hack fake inline? */ JGeometry::TVec3 axisX, axisZ; - axisX.scale(data->mWork0.dot(ptcl->mLocalPosition), data->mWork0); - axisZ.scale(data->mWork2.dot(ptcl->mLocalPosition), data->mWork2); + + // axisX.scale(data->mWork0.dot(ptcl->mLocalPosition), data->mWork0); + // axisZ.scale(data->mWork2.dot(ptcl->mLocalPosition), data->mWork2); + + f32 dot0 = data->mWork0.dot(ptcl->mLocalPosition); + + // f32 f3 = data->mWork0.x * dot0; + // f32 f4 = data->mWork0.y * dot0; + // f32 f5 = data->mWork0.z * dot0; + // axisX.set(f3, f4, f5); + + // axisX.set(data->mWork0.x * dot0, data->mWork0.y * dot0, data->mWork0.z * dot0); + + axisX.set(data->mWork0); + // axisX.set(data->mWork0.x, data->mWork0.y, data->mWork0.z); + axisX.scale(dot0); + + // axisX.scale(dot0, data->mWork0); + + // axisX.scale(data->mWork0.dot(ptcl->mLocalPosition), data->mWork0); + + f32 dot2 = data->mWork2.dot(ptcl->mLocalPosition); + + f32 f1 = data->mWork2.x * dot2; + f32 f2 = data->mWork2.y * dot2; + f32 f0 = data->mWork2.z * dot2; + axisZ.set(f1, f2, f0); + + // axisZ.set(data->mWork2.x * dot2, data->mWork2.y * dot2, data->mWork2.z * dot2); + + // axisZ.set(data->mWork2); + // axisZ.scale(dot2); + + // axisZ.scale(dot2, data->mWork2); + + // axisZ.scale(data->mWork2.dot(ptcl->mLocalPosition), data->mWork2); JGeometry::TVec3 newPos; newPos.add(axisX, axisZ); @@ -274,8 +305,12 @@ void JPAConvectionField::calc(JPAFieldData* data, JPABaseParticle* ptcl) { JGeometry::TVec3 delta, axisY; delta.sub(ptcl->mLocalPosition, newPos); - axisY.cross_hack(data->mWork1, newPos); - data->mVel.cross_hack(delta, axisY); + axisY.cross_hack(data->mWork1, newPos); // fake inline + // axisY.cross(data->mWork1, newPos); + // axisY.cross(newPos, data->mWork1); + // data->mVel.cross_hack(axisY, delta); // fake inline + data->mVel.cross(axisY, delta); + // data->mVel.cross(delta, axisY); data->mVel.setLength(data->mMag); if (data->mVal2 != 0.0f) { diff --git a/src/JSystem/JParticle/JPAParticle.cpp b/src/JSystem/JParticle/JPAParticle.cpp index dcfdeff00..d280db922 100644 --- a/src/JSystem/JParticle/JPAParticle.cpp +++ b/src/JSystem/JParticle/JPAParticle.cpp @@ -40,7 +40,11 @@ void JPABaseParticle::initParticle() { if (emtr->mInitialVelDir) { Mtx mtx; - JPAGetYZRotateMtx(emtr->mSpread * emtr->getRandomRF() * 32768.0f, emtr->getRandomSS(), mtx); + JPAGetYZRotateMtx( + emtr->getRandomRF() * 0x8000 * emtr->mSpread, + emtr->getRandomSS(), + mtx + ); MTXConcat(emtrInfo.mEmitterDirMtx, mtx, mtx); velDir.set(mtx[0][2], mtx[1][2], mtx[2][2]); velDir.scale(emtr->mInitialVelDir); @@ -95,7 +99,6 @@ void JPABaseParticle::initParticle() { /* 8025E62C-8025EB28 .text initChild__15JPABaseParticleFP15JPABaseParticle */ void JPABaseParticle::initChild(JPABaseParticle* parent) { - /* Nonmatching */ JPAEmitterInfo & emtrInfo = JPABaseEmitter::emtrInfo; JPABaseEmitter * emtr = emtrInfo.mpCurEmitter; JPASweepShape * sweep = emtr->mpDataLinkInfo->getSweepShape(); @@ -146,8 +149,7 @@ void JPABaseParticle::initChild(JPABaseParticle* parent) { if (posRndm != 0.0f) { JGeometry::TVec3 unit; JPAGetUnitVec(emtr->getRandomSS(), emtr->getRandomSS(), unit); - f32 rndm = posRndm * emtr->getRandomF(); - unit.scale(rndm); + unit.scale(posRndm * emtr->getRandomF()); mLocalPosition.add(unit); }