JPAParticle OK, JPAField

This commit is contained in:
LagoLunatic
2025-04-14 23:22:14 -04:00
parent 70d9f5df10
commit 0d2c28e579
5 changed files with 66 additions and 27 deletions
+1 -1
View File
@@ -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"),
+7 -8
View File
@@ -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<f32> : public Vec {
void add(const TVec3<f32>& a, const TVec3<f32>& 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<f32>& b) {
@@ -173,7 +173,7 @@ struct TVec3<f32> : public Vec {
}
f32 squared() const {
return x*x + y*y + z*z;
return dot(*this);
}
f32 squared(const TVec3<f32>& b) const {
@@ -181,8 +181,7 @@ struct TVec3<f32> : public Vec {
}
f32 length() const {
f32 sqr = squared();
return TUtil<f32>::sqrt(sqr);
return TUtil<f32>::sqrt(squared());
}
f32 normalize() {
+5 -2
View File
@@ -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<JPAFieldData> mList;
/* 0x0C */ JSUList<JPAFieldData>* mVacList;
@@ -38,8 +41,8 @@ public:
/* 0x08 */ JSULink<JPAFieldData> mLink;
/* 0x18 */ JGeometry::TVec3<f32> mVel;
/* 0x24 */ JGeometry::TVec3<f32> mWork0;
/* 0x28 */ JGeometry::TVec3<f32> mWork1;
/* 0x2C */ JGeometry::TVec3<f32> mWork2;
/* 0x30 */ JGeometry::TVec3<f32> mWork1;
/* 0x3C */ JGeometry::TVec3<f32> mWork2;
/* 0x48 */ f32 mMaxDistSq;
/* 0x4C */ f32 mFadeOutRate;
/* 0x50 */ f32 mFadeInRate;
+47 -12
View File
@@ -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<f32> 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<f32> 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<f32> 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<f32> newPos;
newPos.add(axisX, axisZ);
@@ -274,8 +305,12 @@ void JPAConvectionField::calc(JPAFieldData* data, JPABaseParticle* ptcl) {
JGeometry::TVec3<f32> 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) {
+6 -4
View File
@@ -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<f32> unit;
JPAGetUnitVec(emtr->getRandomSS(), emtr->getRandomSS(), unit);
f32 rndm = posRndm * emtr->getRandomF();
unit.scale(rndm);
unit.scale(posRndm * emtr->getRandomF());
mLocalPosition.add(unit);
}