mirror of
https://github.com/zeldaret/tww.git
synced 2026-07-10 06:16:52 -04:00
JPAParticle start
This commit is contained in:
@@ -47,6 +47,31 @@ public:
|
||||
inline virtual void draw(T, U);
|
||||
};
|
||||
|
||||
struct JPAEmitterInfo {
|
||||
public:
|
||||
/* 0x000 */ JMath::TRandom_fast_ mRandom;
|
||||
/* 0x004 */ JPABaseEmitter * mpCurEmitter;
|
||||
/* 0x008 */ Mtx mEmitterGlobalSR;
|
||||
/* 0x038 */ Mtx mEmitterGlobalRot;
|
||||
/* 0x068 */ Mtx mGlobalRot;
|
||||
/* 0x098 */ Mtx mEmitterDirMtx;
|
||||
/* 0x0C8 */ JGeometry::TVec3<f32> mEmitterGlobalScale;
|
||||
/* 0x0D4 */ JGeometry::TVec3<f32> mEmitterTranslation;
|
||||
/* 0x0E0 */ JGeometry::TVec3<f32> mEmitterGlobalCenter;
|
||||
/* 0x0EC */ JGeometry::TVec3<f32> mPublicScale;
|
||||
/* 0x0F8 */ u8 field_0xf8[0x10c - 0xf8];
|
||||
/* 0x10C */ JGeometry::TVec3<f32> mVolumePos;
|
||||
/* 0x118 */ JGeometry::TVec3<f32> mVelOmni;
|
||||
/* 0x124 */ JGeometry::TVec3<f32> mVelAxis;
|
||||
/* 0x130 */ f32 mVolumeSize;
|
||||
/* 0x134 */ u32 mVolumeEmitCount;
|
||||
/* 0x138 */ u32 mVolumeEmitIdx;
|
||||
/* 0x13C */ u32 mVolumeEmitAngleCount;
|
||||
/* 0x140 */ u32 mVolumeEmitXCount;
|
||||
/* 0x144 */ u32 mVolumeEmitAngleMax;
|
||||
/* 0x148 */ u32 mDivNumber;
|
||||
};
|
||||
|
||||
class JPABaseEmitter {
|
||||
public:
|
||||
typedef void (JPABaseEmitter::*VolumeFunc)();
|
||||
@@ -123,6 +148,8 @@ public:
|
||||
mpParticleCallBack = callback;
|
||||
}
|
||||
|
||||
static JPAEmitterInfo emtrInfo;
|
||||
|
||||
/* 0x000 */ VolumeFunc mVolumeFunc;
|
||||
/* 0x00C */ cXyz mEmitterScale;
|
||||
/* 0x018 */ cXyz mEmitterTranslation;
|
||||
|
||||
@@ -34,14 +34,14 @@ public:
|
||||
|
||||
public:
|
||||
/* 0x00 */ JSUPtrLink mLink;
|
||||
/* 0x10 */ cXyz mGlobalPosition;
|
||||
/* 0x1C */ cXyz mLocalPosition;
|
||||
/* 0x28 */ cXyz mPosition;
|
||||
/* 0x34 */ cXyz mVelocity;
|
||||
/* 0x40 */ cXyz mBaseVel;
|
||||
/* 0x4C */ cXyz mAccel;
|
||||
/* 0x58 */ cXyz mFieldVel;
|
||||
/* 0x64 */ cXyz mFieldAccel;
|
||||
/* 0x10 */ JGeometry::TVec3<f32> mGlobalPosition;
|
||||
/* 0x1C */ JGeometry::TVec3<f32> mLocalPosition;
|
||||
/* 0x28 */ JGeometry::TVec3<f32> mPosition;
|
||||
/* 0x34 */ JGeometry::TVec3<f32> mVelocity;
|
||||
/* 0x40 */ JGeometry::TVec3<f32> mBaseVel;
|
||||
/* 0x4C */ JGeometry::TVec3<f32> mAccel;
|
||||
/* 0x58 */ JGeometry::TVec3<f32> mFieldVel;
|
||||
/* 0x64 */ JGeometry::TVec3<f32> mFieldAccel;
|
||||
/* 0x70 */ f32 mAirResist;
|
||||
/* 0x74 */ f32 mMoment;
|
||||
/* 0x78 */ f32 mCurFrame;
|
||||
@@ -49,7 +49,7 @@ public:
|
||||
/* 0x80 */ f32 mCurNormTime;
|
||||
/* 0x84 */ f32 mFieldDrag;
|
||||
/* 0x88 */ f32 mDrag;
|
||||
/* 0x8C */ cXyz mAxis;
|
||||
/* 0x8C */ JGeometry::TVec3<f32> mAxis;
|
||||
/* 0x98 */ f32 mScaleOut;
|
||||
/* 0x9C */ f32 mScaleX;
|
||||
/* 0xA0 */ f32 mScaleY;
|
||||
@@ -64,7 +64,7 @@ public:
|
||||
/* 0xC4 */ u8 field_0xC4[0xC6 - 0xC4];
|
||||
/* 0xC6 */ u16 mTexIdx;
|
||||
/* 0xC8 */ JPACallBackBase2<JPABaseEmitter*, JPABaseParticle*>* mpCallBack2;
|
||||
/* 0xCC */ u32 mFlags;
|
||||
/* 0xCC */ u32 mStatus;
|
||||
};
|
||||
|
||||
class JPAParticleCallBack {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
//
|
||||
|
||||
#include "JSystem/JParticle/JPAParticle.h"
|
||||
#include "JSystem/JParticle/JPAEmitter.h"
|
||||
#include "dolphin/types.h"
|
||||
|
||||
/* 8025DEF4-8025E62C .text initParticle__15JPABaseParticleFv */
|
||||
@@ -18,17 +19,62 @@ void JPABaseParticle::initChild(JPABaseParticle*) {
|
||||
|
||||
/* 8025EB28-8025EB90 .text incFrame__15JPABaseParticleFv */
|
||||
void JPABaseParticle::incFrame() {
|
||||
/* Nonmatching */
|
||||
mCurFrame += 1.0f;
|
||||
if (mCurFrame < 0.0f)
|
||||
mCurFrame = 0.0f;
|
||||
|
||||
mStatus &= ~0x01;
|
||||
|
||||
if (mCurFrame >= mLifeTime) {
|
||||
mCurNormTime = 1.0f;
|
||||
mStatus |= 0x02;
|
||||
} else {
|
||||
mCurNormTime = mCurFrame / mLifeTime;
|
||||
}
|
||||
}
|
||||
|
||||
/* 8025EB90-8025ECE8 .text calcVelocity__15JPABaseParticleFv */
|
||||
void JPABaseParticle::calcVelocity() {
|
||||
/* Nonmatching */
|
||||
mFieldVel.zero();
|
||||
if (mStatus & 0x20)
|
||||
mGlobalPosition = JPABaseEmitter::emtrInfo.mEmitterGlobalCenter;
|
||||
mBaseVel.x += mAccel.x;
|
||||
mBaseVel.y += mAccel.y;
|
||||
mBaseVel.z += mAccel.z;
|
||||
if (!(mStatus & 0x40))
|
||||
JPABaseEmitter::emtrInfo.mpCurEmitter->mFieldManager.calc(this);
|
||||
mFieldVel.x += mFieldAccel.x;
|
||||
mFieldVel.y += mFieldAccel.y;
|
||||
mFieldVel.z += mFieldAccel.z;
|
||||
|
||||
f32 airResist = mAirResist;
|
||||
mBaseVel.x *= airResist;
|
||||
mBaseVel.y *= airResist;
|
||||
mBaseVel.z *= airResist;
|
||||
|
||||
f32 velScale = mMoment * mDrag;
|
||||
JGeometry::TVec3<f32> vel;
|
||||
vel.x = (mBaseVel.x + mFieldVel.x) * velScale;
|
||||
vel.y = (mBaseVel.y + mFieldVel.y) * velScale;
|
||||
vel.z = (mBaseVel.z + mFieldVel.z) * velScale;
|
||||
|
||||
mVelocity = vel;
|
||||
}
|
||||
|
||||
/* 8025ECE8-8025ED6C .text calcPosition__15JPABaseParticleFv */
|
||||
void JPABaseParticle::calcPosition() {
|
||||
/* Nonmatching */
|
||||
mLocalPosition.x += mVelocity.x;
|
||||
mLocalPosition.y += mVelocity.y;
|
||||
mLocalPosition.z += mVelocity.z;
|
||||
|
||||
JGeometry::TVec3<f32> pos;
|
||||
pos.x = mGlobalPosition.x + JPABaseEmitter::emtrInfo.mPublicScale.x * mLocalPosition.x;
|
||||
pos.y = mGlobalPosition.y + JPABaseEmitter::emtrInfo.mPublicScale.y * mLocalPosition.y;
|
||||
pos.z = mGlobalPosition.z + JPABaseEmitter::emtrInfo.mPublicScale.z * mLocalPosition.z;
|
||||
|
||||
mPosition = pos;
|
||||
}
|
||||
|
||||
/* 8025ED6C-8025EE44 .text checkCreateChild__15JPABaseParticleFv */
|
||||
|
||||
Reference in New Issue
Block a user