particle/JGeometry progress

This commit is contained in:
LagoLunatic
2023-12-27 18:12:09 -05:00
parent f0958eab10
commit 12b821eca2
6 changed files with 101 additions and 126 deletions
+37 -73
View File
@@ -30,8 +30,8 @@ struct TVec3 {
};
template <>
struct TVec3<s16> {
s16 x, y, z;
struct TVec3<s16> : public SVec {
// s16 x, y, z;
TVec3& operator=(const TVec3& b) {
set(b.x, b.y, b.z);
@@ -49,39 +49,14 @@ struct TVec3<s16> {
}
};
inline void setTVec3f(const f32* vec_a, f32* vec_b) {
const register f32* v_a = vec_a;
register f32* v_b = vec_b;
register f32 a_x;
register f32 b_x;
asm {
psq_l a_x, 0(v_a), 0, 0
lfs b_x, 8(v_a)
psq_st a_x, 0(v_b), 0, 0
stfs b_x, 8(v_b)
};
}
// Until we figure out TVec3 ctors
inline void setTVec3f(const Vec& vec_a, Vec& vec_b) {
setTVec3f(&vec_a.x, &vec_b.x);
}
inline float fsqrt_step(float mag) {
f32 root = __frsqrte(mag);
return 0.5f * root * (3.0f - mag * (root * root));
}
template <>
struct TVec3<f32> {
f32 x;
f32 y;
f32 z;
struct TVec3<f32> : public Vec {
// f32 x;
// f32 y;
// f32 z;
inline TVec3(const Vec& i_vec) {
setTVec3f(&i_vec.x, &x);
set(i_vec);
}
TVec3() {}
@@ -148,52 +123,38 @@ struct TVec3<f32> {
f32 normalize_broken() {
f32 sq = squared();
if (sq <= 3.814697e-06f) {
if (sq <= TUtil<f32>::epsilon()) {
return 0.0f;
}
f32 norm;
if (sq <= 0.0f) {
norm = sq;
} else {
norm = fsqrt_step(sq);
}
f32 norm = TUtil<f32>::inv_sqrt(sq);
scale(norm);
return norm;
}
f32 normalize() {
f32 sq = squared();
if (sq <= 3.814697e-06f) {
if (sq <= TUtil<f32>::epsilon()) {
return 0.0f;
}
f32 norm;
if (sq <= 0.0f) {
norm = sq;
} else {
norm = fsqrt_step(sq);
}
f32 norm = TUtil<f32>::inv_sqrt(sq);
scale(1.0f / norm);
return norm;
}
f32 normalize(const TVec3<f32>& other) {
f32 sq = other.squared();
if (sq <= 3.814697e-06f) {
if (sq <= TUtil<f32>::epsilon()) {
zero();
return 0.0f;
}
f32 norm;
if (sq <= 0.0f) {
norm = sq;
} else {
norm = fsqrt_step(sq);
}
f32 norm = TUtil<f32>::inv_sqrt(sq);
scale(1.0f / norm, other);
return norm;
}
f32 length() const {
return VECMag((Vec*)this);
f32 sqr = squared();
return TUtil<f32>::sqrt(sqr);
}
void scale(register f32 sc) {
@@ -233,7 +194,7 @@ struct TVec3<f32> {
}
bool isZero() const {
return squared() <= 32.0f * 3.814697e-06f;
return squared() <= TUtil<f32>::epsilon();
}
void cross(const TVec3<f32>& a, const TVec3<f32>& b) {
@@ -242,15 +203,10 @@ struct TVec3<f32> {
void setLength(f32 len) {
f32 sq = squared();
if (sq <= 3.814697e-06f * 32.0f) {
if (sq <= TUtil<f32>::epsilon()) {
return;
}
f32 norm;
if (sq <= 0.0f) {
norm = sq;
} else {
norm = fsqrt_step(sq);
}
f32 norm = TUtil<f32>::inv_sqrt(sq);
scale(norm * len);
}
@@ -336,11 +292,7 @@ struct TVec2 {
f32 length() {
f32 sqr = squared();
if (sqr <= 0.0f) {
return sqr;
}
sqr *= fsqrt_step(sqr);
return sqr;
return TUtil<f32>::sqrt(sqr);
}
T x;
@@ -408,14 +360,26 @@ struct TBox2 : TBox<TVec2<T> > {
template<typename T>
struct TUtil {
static inline T clamp(T v, T min, T max) {
if (v < min) {
return min;
static inline f32 epsilon() {
return 3.81469727e-06f;
}
static inline f32 sqrt(f32 mag) {
if (mag <= 0.0f) {
return mag;
} else {
f32 root = __frsqrte(mag);
return 0.5f * root * (3.0f - mag * (root * root)) * mag;
}
if (v > max) {
return max;
}
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));
}
return v;
}
};
+10 -2
View File
@@ -186,6 +186,7 @@ public:
void setGlobalRotation(const JGeometry::TVec3<s16>& rot) {
JPAGetXYZRotateMtx(rot.x, rot.y, rot.z, mGlobalRotation);
}
void getGlobalTranslation(JGeometry::TVec3<f32>& out) const { out.set(mGlobalTranslation); }
void setGlobalTranslation(f32 x, f32 y, f32 z) { mGlobalTranslation.set(x, y, z); }
void setGlobalTranslation(const JGeometry::TVec3<f32>& trans) { mGlobalTranslation.set(trans); }
void setGlobalScale(const JGeometry::TVec3<f32>& scale) {
@@ -276,11 +277,9 @@ public:
void getCamMtxPtr() {}
void getChildParticleList() {}
void getCurrentCreateNumber() const {}
void getEmitterAxis(JGeometry::TVec3<f32>&, JGeometry::TVec3<f32>&, JGeometry::TVec3<f32>&) const {}
void getFovy() {}
void getFrame() {}
void getGlobalParticleScale(JGeometry::TVec3<f32>&) const {}
void getGlobalTranslation(JGeometry::TVec3<f32>&) const {}
void getParticleList() {}
void getRate() const {}
void getgReRDirection(JGeometry::TVec3<f32>&) {}
@@ -297,6 +296,15 @@ public:
static JPAEmitterInfo emtrInfo;
void getEmitterAxis(JGeometry::TVec3<f32>& vec0, JGeometry::TVec3<f32>& vec1, JGeometry::TVec3<f32>& vec2) const {
// Not sure if this implementation is correct. It does seem to match for dPa_waveEcallBack::executeAfter, but
// a non-static function (const) only referencing a static variable is unusual, and this implementation isn't
// complex enough to match the size of the inline in the demo debug map (0x128 bytes).
vec0.set(emtrInfo.mEmitterGlobalRot[0][0], emtrInfo.mEmitterGlobalRot[1][0], emtrInfo.mEmitterGlobalRot[2][0]);
vec1.set(emtrInfo.mEmitterGlobalRot[0][1], emtrInfo.mEmitterGlobalRot[1][1], emtrInfo.mEmitterGlobalRot[2][1]);
vec2.set(emtrInfo.mEmitterGlobalRot[0][2], emtrInfo.mEmitterGlobalRot[1][2], emtrInfo.mEmitterGlobalRot[2][2]);
}
/* 0x000 */ VolumeFunc mVolumeFunc;
/* 0x00C */ JGeometry::TVec3<f32> mEmitterScale;
/* 0x018 */ JGeometry::TVec3<f32> mEmitterTranslation;
+3 -3
View File
@@ -119,7 +119,7 @@ public:
/* 0x1C */ cXyz mCollapsePos[2];
/* 0x34 */ cXyz* mpPos;
/* 0x38 */ csXyz* mpRot;
/* 0x3C */ Vec mRotMtx[3];
/* 0x3C */ JGeometry::TVec3<f32> mRotMtx[3];
/* 0x60 */ JPABaseEmitter* mpBaseEmitter;
};
@@ -330,8 +330,8 @@ public:
dPa_setColorEcallBack(const GXColor& color) { mColor = color; }
virtual ~dPa_setColorEcallBack() {}
virtual void draw(JPABaseEmitter*);
virtual void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8);
virtual void draw(JPABaseEmitter*) { GXSetTevColor(GX_TEVREG1, mColor); }
virtual void setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) {}
public:
/* 0x04 */ GXColor mColor;
+3 -15
View File
@@ -40,21 +40,9 @@ inline void C_VECAdd(register const Vec* a, register const Vec* b, register Vec*
}
inline void C_VECSubtract(register const Vec* a, register const Vec* b, register Vec* ab) {
register f32 axy;
register f32 bxy;
register f32 az;
register f32 subz;
register f32 bz;
asm {
psq_l axy, 0(a), 0, 0
psq_l bxy, 0(b), 0, 0
ps_sub bxy, axy, bxy
psq_st bxy, 0(ab), 0, 0
psq_l az, 8(a), 1, 0
psq_l bz, 8(b), 1, 0
ps_sub subz, az, bz
psq_st subz, 8(ab), 1, 0
}
ab->x = a->x - b->x;
ab->y = a->y - b->y;
ab->z = a->z - b->z;
}
inline f32 C_VECSquareMag(const Vec* v) {
+2 -22
View File
@@ -643,25 +643,15 @@ void JPADraw::setDrawCalcVisitors(const JPADraw::JPADrawVisitorDefFlags& flags)
/* 8026ADB0-8026B3DC .text setParticleClipBoard__7JPADrawFv */
void JPADraw::setParticleClipBoard() {
/* Nonmatching - top switch */
switch (dc.pbsp->getType()) {
case JPABaseShape::JPAType_Billboard:
break;
case JPABaseShape::JPAType_DirBillboard:
PSMTXIdentity(cb.mDrawMtx);
break;
case JPABaseShape::JPAType_YBillboard:
loadYBBMtx(cb.mDrawMtxPtr);
break;
case JPABaseShape::JPAType_Point:
case JPABaseShape::JPAType_Line:
case JPABaseShape::JPAType_Direction:
case JPABaseShape::JPAType_DirectionCross:
case JPABaseShape::JPAType_Stripe:
case JPABaseShape::JPAType_StripeCross:
case JPABaseShape::JPAType_Rotation:
case JPABaseShape::JPAType_RotationCross:
default:
MTXCopy(cb.mDrawMtxPtr, cb.mDrawMtx);
break;
}
@@ -739,25 +729,15 @@ void JPADraw::setParticleClipBoard() {
/* 8026B3DC-8026B938 .text setChildClipBoard__7JPADrawFv */
void JPADraw::setChildClipBoard() {
/* Nonmatching - top switch */
switch (dc.pssp->getType()) {
case JPABaseShape::JPAType_Billboard:
break;
case JPABaseShape::JPAType_DirBillboard:
PSMTXIdentity(cb.mDrawMtx);
break;
case JPABaseShape::JPAType_YBillboard:
loadYBBMtx(cb.mDrawMtxPtr);
break;
case JPABaseShape::JPAType_Point:
case JPABaseShape::JPAType_Line:
case JPABaseShape::JPAType_Direction:
case JPABaseShape::JPAType_DirectionCross:
case JPABaseShape::JPAType_Stripe:
case JPABaseShape::JPAType_StripeCross:
case JPABaseShape::JPAType_Rotation:
case JPABaseShape::JPAType_RotationCross:
default:
MTXCopy(cb.mDrawMtxPtr, cb.mDrawMtx);
break;
}
+46 -11
View File
@@ -12,6 +12,11 @@
#include "SSystem/SComponent/c_malloc.h"
#include "m_Do/m_Do_lib.h"
static f32 dummy_2100[3] = {1.0f, 1.0f, 1.0f};
static f32 dummy_2080[3] = {1.0f, 1.0f, 1.0f};
static Vec dummy_3569;
/* 8007A4D8-8007A514 .text __ct__18dPa_modelEmitter_cFv */
dPa_modelEmitter_c::dPa_modelEmitter_c() {
cNd_ForcedClear(this);
@@ -557,8 +562,47 @@ void dPa_waveEcallBack::remove() {
}
/* 8007E2BC-8007E484 .text executeAfter__17dPa_waveEcallBackFP14JPABaseEmitter */
void dPa_waveEcallBack::executeAfter(JPABaseEmitter*) {
/* Nonmatching */
void dPa_waveEcallBack::executeAfter(JPABaseEmitter* emitter) {
/* Nonmatching - how to make TVec3 only exist in registers without being stored to the stack? */
emitter->getEmitterAxis(mRotMtx[0], mRotMtx[1], mRotMtx[2]);
if (mState != 0) {
emitter->setDirectionalSpeed(0.0f);
if (mFadeTimer > 0) {
mFadeTimer--;
} else {
remove();
}
return;
}
JGeometry::TVec3<f32> delta;
emitter->getGlobalTranslation(delta); // TODO
emitter->setGlobalTranslation(*mpPos);
delta.sub(*mpPos); // TODO
f32 vel = delta.length();
if (vel >= mMaxParticleVelocity) {
vel = mMaxParticleVelocity;
}
f32 speed = mVelFade1 * vel * mVelFade2;
JGeometry::TVec3<s16> rot;
rot.x = 0;
rot.y = mpRot->y;
rot.z = 0;
emitter->setGlobalRotation(rot);
if (fabsf(speed - mVel) > mVelSpeed) {
if (speed - mVel > 0.0f) {
speed = mVel + mVelSpeed;
} else {
speed = mVel - mVelSpeed;
}
}
emitter->setDirectionalSpeed(speed);
mVel = speed;
}
/* 8007E484-8007E804 .text draw__17dPa_waveEcallBackFP14JPABaseEmitter */
@@ -647,12 +691,3 @@ void dPa_stripesEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8)
/* 8007FAE8-8007FAEC .text setup__22dPa_selectTexEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */
void dPa_selectTexEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) {
}
/* 8007FF78-8007FFA8 .text draw__21dPa_setColorEcallBackFP14JPABaseEmitter */
void dPa_setColorEcallBack::draw(JPABaseEmitter*) {
GXSetTevColor(GX_TEVREG1, mColor);
}
/* 8007FFA8-8007FFAC .text setup__21dPa_setColorEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */
void dPa_setColorEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, s8) {
}