Various alignments to debug + matching TUs (#2391)

This commit is contained in:
hatal175
2025-04-13 21:55:52 +03:00
committed by GitHub
parent 15248c85de
commit efc781e892
47 changed files with 759 additions and 506 deletions
+42 -35
View File
@@ -9,41 +9,42 @@
/* 8027B144-8027B220 275A84 00DC+00 1/1 0/0 0/0 .text JPAVolumePoint__FP18JPAEmitterWorkData */
void JPAVolumePoint(JPAEmitterWorkData* work) {
work->mVolumePos.zero();
work->mVelOmni.set(work->mpEmtr->get_r_zh(), work->mpEmtr->get_r_zh(),
work->mpEmtr->get_r_zh());
work->mVelAxis.set(work->mVelOmni.x, 0.0f, work->mVelOmni.z);
work->mVolumeCalcData.mVolumePos.zero();
work->mVolumeCalcData.mVelOmni.set(work->mpEmtr->get_r_zh(), work->mpEmtr->get_r_zh(),
work->mpEmtr->get_r_zh());
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVelOmni.x, 0.0f,
work->mVolumeCalcData.mVelOmni.z);
}
/* 8027B220-8027B33C 275B60 011C+00 1/1 0/0 0/0 .text JPAVolumeLine */
void JPAVolumeLine(JPAEmitterWorkData* work) {
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
work->mVolumePos.set(0.0f, 0.0f,
work->mVolumeSize *
((work->mVolumeEmitIdx / (work->mEmitCount - 1.0f) - 0.5f)));
work->mVolumeCalcData.mVolumePos.set(
0.0f, 0.0f,
work->mVolumeSize * ((work->mVolumeEmitIdx / (work->mEmitCount - 1.0f) - 0.5f)));
work->mVolumeEmitIdx++;
} else {
work->mVolumePos.set(0.0f, 0.0f, work->mVolumeSize * work->mpEmtr->get_r_zh());
work->mVolumeCalcData.mVolumePos.set(0.0f, 0.0f,
work->mVolumeSize * work->mpEmtr->get_r_zh());
}
work->mVelOmni.set(0.0f, 0.0f, work->mVolumePos.z * work->mGlobalScl.z);
work->mVelAxis.set(0.0f, 0.0f, work->mVolumePos.z);
work->mVolumeCalcData.mVelOmni.set(0.0f, 0.0f,
work->mVolumeCalcData.mVolumePos.z * work->mGlobalScl.z);
work->mVolumeCalcData.mVelAxis.set(0.0f, 0.0f, work->mVolumeCalcData.mVolumePos.z);
}
/* 8027B33C-8027B4E8 275C7C 01AC+00 1/1 0/0 0/0 .text JPAVolumeCircle */
// NONMATCHING regalloc. Could be issue with mul asm implementations
void JPAVolumeCircle(JPAEmitterWorkData* work) {
s16 thetai;
f32 theta;
s16 theta;
f32 distance;
f32 sizeXZ;
if (work->mpEmtr->checkFlag(JPADynFlag_FixedInterval)) {
theta = (s16)((work->mVolumeEmitIdx << 16) / work->mEmitCount);
thetai = theta * work->mVolumeSweep;
theta = theta * work->mVolumeSweep;
work->mVolumeEmitIdx++;
} else {
theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
thetai = theta;
}
distance = work->mpEmtr->get_r_f();
@@ -51,19 +52,21 @@ void JPAVolumeCircle(JPAEmitterWorkData* work) {
distance = 1.0f - (distance * distance);
}
sizeXZ = work->mVolumeSize * (work->mVolumeMinRad + distance * (1.0f - work->mVolumeMinRad));
work->mVolumePos.set(sizeXZ * JMASSin(thetai), 0.0f, sizeXZ * JMASCos(thetai));
work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
distance = work->mVolumeSize * (work->mVolumeMinRad + distance * (1.0f - work->mVolumeMinRad));
work->mVolumeCalcData.mVolumePos.set(distance * JMASSin(theta), 0.0f,
distance * JMASCos(theta));
work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
work->mVolumeCalcData.mVolumePos.z);
}
/* 8027B4E8-8027B5F0 275E28 0108+00 1/1 0/0 0/0 .text JPAVolumeCube */
void JPAVolumeCube(JPAEmitterWorkData* work) {
work->mVolumePos.set(work->mpEmtr->get_r_zh() * work->mVolumeSize,
work->mVolumeCalcData.mVolumePos.set(work->mpEmtr->get_r_zh() * work->mVolumeSize,
work->mpEmtr->get_r_zh() * work->mVolumeSize,
work->mpEmtr->get_r_zh() * work->mVolumeSize);
work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z);
}
/* 8027B5F0-8027B87C 275F30 028C+00 1/1 0/0 0/0 .text JPAVolumeSphere__FP18JPAEmitterWorkData */
@@ -94,10 +97,11 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) {
rnd = 1.0f - rnd * rnd * rnd;
}
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
work->mVolumePos.set(rad * JMASCos(phi) * JMASSin(theta), -rad * JMASSin(phi),
rad * JMASCos(phi) * JMASCos(theta));
work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
work->mVolumeCalcData.mVolumePos.set(rad * JMASCos(phi) * JMASSin(theta), -rad * JMASSin(phi),
rad * JMASCos(phi) * JMASCos(theta));
work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
work->mVolumeCalcData.mVolumePos.z);
}
/* 8027B87C-8027B9F8 2761BC 017C+00 1/1 0/0 0/0 .text JPAVolumeCylinder__FP18JPAEmitterWorkData */
@@ -108,10 +112,11 @@ static void JPAVolumeCylinder(JPAEmitterWorkData* work) {
rnd = 1.0f - rnd * rnd;
}
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
work->mVolumePos.set(rad * JMASSin(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(),
rad * JMASCos(theta));
work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
work->mVelAxis.set(work->mVolumePos.x, 0.0f, work->mVolumePos.z);
work->mVolumeCalcData.mVolumePos.set(
rad * JMASSin(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * JMASCos(theta));
work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
work->mVolumeCalcData.mVolumePos.z);
}
/* 8027B9F8-8027BB18 276338 0120+00 1/1 0/0 0/0 .text JPAVolumeTorus__FP18JPAEmitterWorkData */
@@ -119,11 +124,13 @@ static void JPAVolumeTorus(JPAEmitterWorkData* work) {
s16 theta = work->mVolumeSweep * work->mpEmtr->get_r_ss();
s16 phi = work->mpEmtr->get_r_ss();
f32 rad = work->mVolumeSize * work->mVolumeMinRad;
work->mVelAxis.set(rad * JMASSin(theta) * JMASCos(phi), rad * JMASSin(phi),
rad * JMASCos(theta) * JMASCos(phi));
work->mVolumePos.set(work->mVelAxis.x + work->mVolumeSize * JMASSin(theta), work->mVelAxis.y,
work->mVelAxis.z + work->mVolumeSize * JMASCos(theta));
work->mVelOmni.mul(work->mVolumePos, work->mGlobalScl);
work->mVolumeCalcData.mVelAxis.set(rad * JMASSin(theta) * JMASCos(phi), rad * JMASSin(phi),
rad * JMASCos(theta) * JMASCos(phi));
work->mVolumeCalcData.mVolumePos.set(
work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * JMASSin(theta),
work->mVolumeCalcData.mVelAxis.y,
work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * JMASCos(theta));
work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
}
/* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */
+8 -8
View File
@@ -53,7 +53,7 @@ void JPABaseEmitter::init(JPAEmitterManager* param_0, JPAResource* param_1) {
mSpread = mpRes->getDyn()->getInitVelDirSp();
mRndmDirSpeed = mpRes->getDyn()->getInitVelRndm();
mAirResist = mpRes->getDyn()->getAirRes();
mRndm.set_seed(mpEmtrMgr->mpWorkData->mRndm.get_rndm_u());
mRndm.set_seed(mpEmtrMgr->pWd->mRndm.get_rndm_u());
MTXIdentity(mGlobalRot);
mGlobalScl.set(1.0f, 1.0f, 1.0f);
mGlobalTrs.zero();
@@ -85,8 +85,8 @@ JPABaseParticle* JPABaseEmitter::createParticle() {
if (mpPtclPool->getNum() != 0) {
JPANode<JPABaseParticle>* node = mpPtclPool->pop_front();
mAlivePtclBase.push_front(node);
mpRes->getDyn()->calc(mpEmtrMgr->mpWorkData);
node->mData.init_p(mpEmtrMgr->mpWorkData);
mpRes->getDyn()->calc(mpEmtrMgr->pWd);
node->mData.init_p(mpEmtrMgr->pWd);
return &node->mData;
}
@@ -99,7 +99,7 @@ JPABaseParticle* JPABaseEmitter::createChild(JPABaseParticle* parent) {
if (mpPtclPool->getNum() != 0) {
JPANode<JPABaseParticle>* node = mpPtclPool->pop_front();
mAlivePtclChld.push_front(node);
node->mData.init_c(mpEmtrMgr->mpWorkData, parent);
node->mData.init_c(mpEmtrMgr->pWd, parent);
return &node->mData;
}
@@ -166,18 +166,18 @@ void JPABaseEmitter::calcEmitterGlobalPosition(JGeometry::TVec3<f32>* dst) const
/* 8027EF30-8027EF40 279870 0010+00 0/0 1/1 0/0 .text getCurrentCreateNumber__14JPABaseEmitterCFv
*/
u32 JPABaseEmitter::getCurrentCreateNumber() const {
return mpEmtrMgr->mpWorkData->mEmitCount;
return mpEmtrMgr->pWd->mEmitCount;
}
/* 8027EF40-8027EF50 279880 0010+00 0/0 3/3 0/0 .text getDrawCount__14JPABaseEmitterCFv
*/
u8 JPABaseEmitter::getDrawCount() const {
return mpEmtrMgr->mpWorkData->mDrawCount;
return mpEmtrMgr->pWd->mDrawCount;
}
/* 8027EF50-8027EFA4 279890 0054+00 0/0 1/1 0/0 .text
* loadTexture__14JPABaseEmitterFUc11_GXTexMapID */
bool JPABaseEmitter::loadTexture(u8 idx, GXTexMapID texMapID) {
mpEmtrMgr->mpWorkData->mpResMgr->load(mpRes->getTexIdx(idx), texMapID);
mpEmtrMgr->pWd->mpResMgr->load(mpRes->getTexIdx(idx), texMapID);
return true;
}
}
+85 -61
View File
@@ -8,53 +8,69 @@
#include "JSystem/JParticle/JPAEmitter.h"
#include "JSystem/JParticle/JPAParticle.h"
#include "JSystem/JParticle/JPAResourceManager.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "dolphin/gx.h"
/* 8027DCA0-8027DEBC 2785E0 021C+00 0/0 1/1 0/0 .text __ct__17JPAEmitterManagerFUlUlP7JKRHeapUcUc
*/
JPAEmitterManager::JPAEmitterManager(u32 ptclMax, u32 emtrMax, JKRHeap* pHeap, u8 grpMax,
u8 resMax) {
mEmtrMax = emtrMax;
mPtclMax = ptclMax;
mGrpMax = grpMax;
mResMax = resMax;
JPAEmitterManager::JPAEmitterManager(u32 i_ptclNum, u32 i_emtrNum, JKRHeap* pHeap, u8 i_gidMax,
u8 i_ridMax) {
emtrNum = i_emtrNum;
ptclNum = i_ptclNum;
gidMax = i_gidMax;
ridMax = i_ridMax;
JPABaseEmitter* emtr = new (pHeap, 0) JPABaseEmitter[mEmtrMax];
for (u32 i = 0; i < mEmtrMax; i++)
mFreeEmtrList.prepend(&emtr[i].mLink);
JUT_ASSERT(40, emtrNum && ptclNum && gidMax && ridMax);
JPANode<JPABaseParticle>* ptcl = new (pHeap, 0) JPANode<JPABaseParticle>[mPtclMax];
for (u32 i = 0; i < mPtclMax; i++)
mPtclPool.push_back(&ptcl[i]);
JPABaseEmitter* p_emtr_link = new (pHeap, 0) JPABaseEmitter[emtrNum];
JUT_ASSERT(44, p_emtr_link);
for (u32 i = 0; i < emtrNum; i++)
mFreeEmtrList.prepend(&p_emtr_link[i].mLink);
mpGrpEmtr = new (pHeap, 0) JSUList<JPABaseEmitter>[mGrpMax];
mpResMgrAry = new (pHeap, 0) JPAResourceManager*[mResMax];
for (int i = 0; i < mResMax; i++) {
mpResMgrAry[i] = NULL;
JPANode<JPABaseParticle>* p_ptcl_node = new (pHeap, 0) JPANode<JPABaseParticle>[ptclNum];
JUT_ASSERT(51, p_ptcl_node);
for (u32 i = 0; i < ptclNum; i++)
mPtclPool.push_back(&p_ptcl_node[i]);
pEmtrUseList = new (pHeap, 0) JSUList<JPABaseEmitter>[gidMax];
JUT_ASSERT(58, pEmtrUseList);
pResMgrAry = new (pHeap, 0) JPAResourceManager*[ridMax];
JUT_ASSERT(62, pResMgrAry)
for (int i = 0; i < ridMax; i++) {
pResMgrAry[i] = NULL;
}
mpWorkData = new (pHeap, 0) JPAEmitterWorkData();
pWd = new (pHeap, 0) JPAEmitterWorkData();
JUT_ASSERT(67, pWd);
}
/* 8027DEBC-8027DFA0 2787FC 00E4+00 0/0 3/3 0/0 .text
* createSimpleEmitterID__17JPAEmitterManagerFRCQ29JGeometry8TVec3<f>UsUcUcP18JPAEmitterCallBackP19JPAParticleCallBack
*/
JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(JGeometry::TVec3<f32> const& pos,
u16 resID, u8 groupID, u8 resMgrID,
u16 resID, u8 group_id, u8 res_mgr_id,
JPAEmitterCallBack* emtrCB,
JPAParticleCallBack* ptclCB) {
JPAResource* pRes = mpResMgrAry[resMgrID]->getResource(resID);
if (pRes != NULL && mFreeEmtrList.getNumLinks() != 0) {
JUT_ASSERT(88, group_id < gidMax);
JUT_ASSERT(89, res_mgr_id < ridMax);
JUT_ASSERT(90, pResMgrAry[res_mgr_id] != 0);
JPAResource* pRes = pResMgrAry[res_mgr_id]->getResource(resID);
if (pRes == NULL) {
JUT_WARN_DEVICE(94, 3, "JPA : User Index %d is NOT exist\n", resID);
} else if (mFreeEmtrList.getNumLinks() == 0) {
JUT_WARN_DEVICE(97, 3, "JPA : Can NOT create emitter more\n");
} else {
JSULink<JPABaseEmitter>* pLink = mFreeEmtrList.getFirst();
mFreeEmtrList.remove(pLink);
mpGrpEmtr[groupID].append(pLink);
pEmtrUseList[group_id].append(pLink);
JPABaseEmitter* emtr = pLink->getObject();
emtr->init(this, pRes);
emtr->mpPtclPool = &mPtclPool;
emtr->mpEmtrCallBack = emtrCB;
emtr->mpPtclCallBack = ptclCB;
emtr->mGroupID = groupID;
emtr->mResMgrID = resMgrID;
emtr->mGroupID = group_id;
emtr->mResMgrID = res_mgr_id;
emtr->mGlobalTrs.set(pos);
return emtr;
}
@@ -63,24 +79,26 @@ JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(JGeometry::TVec3<f32> c
}
/* 8027DFA0-8027E028 2788E0 0088+00 0/0 3/3 0/0 .text calc__17JPAEmitterManagerFUc */
void JPAEmitterManager::calc(u8 groupID) {
for (JSULink<JPABaseEmitter>*pLink = mpGrpEmtr[groupID].getFirst(), *pNext;
pLink != mpGrpEmtr[groupID].getEnd(); pLink = pNext) {
void JPAEmitterManager::calc(u8 group_id) {
JUT_ASSERT(154, group_id < gidMax);
JSULink<JPABaseEmitter>* pNext = NULL;
for (JSULink<JPABaseEmitter>* pLink = pEmtrUseList[group_id].getFirst();
pLink != pEmtrUseList[group_id].getEnd(); pLink = pNext) {
pNext = pLink->getNext();
JPABaseEmitter* emtr = pLink->getObject();
bool done = emtr->mpRes->calc(mpWorkData, emtr);
if (done && !emtr->checkStatus(0x200))
if (emtr->mpRes->calc(pWd, emtr) && !emtr->checkStatus(0x200))
forceDeleteEmitter(emtr);
}
}
/* 8027E028-8027E220 278968 01F8+00 0/0 1/1 0/0 .text draw__17JPAEmitterManagerFPC11JPADrawInfoUc
*/
void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 groupID) {
drawInfo->getCamMtx(&mpWorkData->mPosCamMtx);
drawInfo->getPrjMtx(&mpWorkData->mPrjMtx);
void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 group_id) {
JUT_ASSERT(192, group_id < gidMax);
drawInfo->getCamMtx(pWd->mPosCamMtx);
drawInfo->getPrjMtx(pWd->mPrjMtx);
calcYBBCam();
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
@@ -103,12 +121,12 @@ void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 groupID) {
GX_AF_NONE);
GXSetNumChans(0);
for (JSULink<JPABaseEmitter>* pLink = mpGrpEmtr[groupID].getFirst();
pLink != mpGrpEmtr[groupID].getEnd(); pLink = pLink->getNext()) {
for (JSULink<JPABaseEmitter>* pLink = pEmtrUseList[group_id].getFirst();
pLink != pEmtrUseList[group_id].getEnd(); pLink = pLink->getNext()) {
JPABaseEmitter* emtr = pLink->getObject();
if (!emtr->checkStatus(0x04)) {
mpWorkData->mpResMgr = mpResMgrAry[emtr->mResMgrID];
emtr->mpRes->draw(mpWorkData, emtr);
pWd->mpResMgr = pResMgrAry[emtr->mResMgrID];
emtr->mpRes->draw(pWd, emtr);
}
}
}
@@ -116,15 +134,16 @@ void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 groupID) {
/* 8027E220-8027E278 278B60 0058+00 0/0 1/1 0/0 .text forceDeleteAllEmitter__17JPAEmitterManagerFv
*/
void JPAEmitterManager::forceDeleteAllEmitter() {
for (u8 i = 0; i < mGrpMax; i++)
for (u8 i = 0; i < gidMax; i++)
forceDeleteGroupEmitter(i);
}
/* 8027E278-8027E2D8 278BB8 0060+00 1/1 0/0 0/0 .text
* forceDeleteGroupEmitter__17JPAEmitterManagerFUc */
void JPAEmitterManager::forceDeleteGroupEmitter(u8 groupID) {
while (mpGrpEmtr[groupID].getNumLinks())
forceDeleteEmitter(mpGrpEmtr[groupID].getLast()->getObject());
void JPAEmitterManager::forceDeleteGroupEmitter(u8 group_id) {
JUT_ASSERT(288, group_id < gidMax);
while (pEmtrUseList[group_id].getNumLinks())
forceDeleteEmitter(pEmtrUseList[group_id].getLast()->getObject());
}
/* 8027E2D8-8027E344 278C18 006C+00 3/3 1/1 0/0 .text
@@ -132,48 +151,53 @@ void JPAEmitterManager::forceDeleteGroupEmitter(u8 groupID) {
void JPAEmitterManager::forceDeleteEmitter(JPABaseEmitter* emtr) {
emtr->deleteAllParticle();
emtr->setStatus(0x300);
mpGrpEmtr[emtr->getGroupID()].remove(&emtr->mLink);
pEmtrUseList[emtr->getGroupID()].remove(&emtr->mLink);
mFreeEmtrList.prepend(&emtr->mLink);
}
/* 8027E344-8027E354 278C84 0010+00 0/0 2/2 0/0 .text
* entryResourceManager__17JPAEmitterManagerFP18JPAResourceManagerUc */
void JPAEmitterManager::entryResourceManager(JPAResourceManager* resMgr, u8 resMgrID) {
mpResMgrAry[resMgrID] = resMgr;
JUT_ASSERT_MSG_F(325, resMgrID < ridMax && (pResMgrAry[resMgrID]) == 0,
"res_id %d res_id_max %d array[%d] = %x", resMgrID, ridMax, resMgrID,
pResMgrAry[resMgrID]);
pResMgrAry[resMgrID] = resMgr;
}
/* 8027E354-8027E3F4 278C94 00A0+00 0/0 1/1 0/0 .text clearResourceManager__17JPAEmitterManagerFUc
*/
void JPAEmitterManager::clearResourceManager(u8 resMgrID) {
for (u8 i = 0; i < mGrpMax; i++) {
for (JSULink<JPABaseEmitter>*pLink = mpGrpEmtr[i].getFirst(), *pNext;
pLink != mpGrpEmtr[i].getEnd(); pLink = pNext) {
void JPAEmitterManager::clearResourceManager(u8 res_mgr_id) {
JUT_ASSERT(339, res_mgr_id < ridMax);
for (u8 i = 0; i < gidMax; i++) {
JSULink<JPABaseEmitter>* pNext = NULL;
for (JSULink<JPABaseEmitter>* pLink = pEmtrUseList[i].getFirst();
pLink != pEmtrUseList[i].getEnd(); pLink = pNext) {
pNext = pLink->getNext();
if (resMgrID == pLink->getObject()->getResourceManagerID())
if (res_mgr_id == pLink->getObject()->getResourceManagerID())
forceDeleteEmitter(pLink->getObject());
}
}
mpResMgrAry[resMgrID] = NULL;
pResMgrAry[res_mgr_id] = NULL;
}
/* 8027E3F4-8027E51C 278D34 0128+00 1/1 0/0 0/0 .text calcYBBCam__17JPAEmitterManagerFv
*/
void JPAEmitterManager::calcYBBCam() {
JGeometry::TVec3<float> v;
v.set(0.0f, mpWorkData->mPosCamMtx[1][1], mpWorkData->mPosCamMtx[2][1]);
JGeometry::TVec3<float> v(0.0f, pWd->mPosCamMtx[1][1], pWd->mPosCamMtx[2][1]);
JUT_ASSERT(367, !v.isZero());
v.normalize();
mpWorkData->mYBBCamMtx[0][0] = 1.0f;
mpWorkData->mYBBCamMtx[0][1] = 0.0f;
mpWorkData->mYBBCamMtx[0][2] = 0.0f;
mpWorkData->mYBBCamMtx[0][3] = mpWorkData->mPosCamMtx[0][3];
mpWorkData->mYBBCamMtx[1][0] = 0.0f;
mpWorkData->mYBBCamMtx[1][1] = v.y;
mpWorkData->mYBBCamMtx[1][2] = -v.z;
mpWorkData->mYBBCamMtx[1][3] = mpWorkData->mPosCamMtx[1][3];
mpWorkData->mYBBCamMtx[2][0] = 0.0f;
mpWorkData->mYBBCamMtx[2][1] = v.z;
mpWorkData->mYBBCamMtx[2][2] = v.y;
mpWorkData->mYBBCamMtx[2][3] = mpWorkData->mPosCamMtx[2][3];
pWd->mYBBCamMtx[0][0] = 1.0f;
pWd->mYBBCamMtx[0][1] = 0.0f;
pWd->mYBBCamMtx[0][2] = 0.0f;
pWd->mYBBCamMtx[0][3] = pWd->mPosCamMtx[0][3];
pWd->mYBBCamMtx[1][0] = 0.0f;
pWd->mYBBCamMtx[1][1] = v.y;
pWd->mYBBCamMtx[1][2] = -v.z;
pWd->mYBBCamMtx[1][3] = pWd->mPosCamMtx[1][3];
pWd->mYBBCamMtx[2][0] = 0.0f;
pWd->mYBBCamMtx[2][1] = v.z;
pWd->mYBBCamMtx[2][2] = v.y;
pWd->mYBBCamMtx[2][3] = pWd->mPosCamMtx[2][3];
}
-3
View File
@@ -134,7 +134,6 @@ void JPAFieldVortex::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block) {
/* 8027C674-8027C814 276FB4 01A0+00 1/0 0/0 0/0 .text
* calc__14JPAFieldVortexFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
// NONMATCHING regalloc. may need to rewrite dot in a way that doesn't break Z2Audience::calcPitchDoppler_
void JPAFieldVortex::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
JGeometry::TVec3<f32> vec;
vec.scale(field_0x10.dot(ptcl->mLocalPosition), field_0x10);
@@ -168,7 +167,6 @@ void JPAFieldConvection::prepare(JPAEmitterWorkData* work, JPAFieldBlock* block)
/* 8027CA94-8027CCCC 2773D4 0238+00 1/0 0/0 0/0 .text
* calc__18JPAFieldConvectionFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
// NONMATCHING regalloc problems with TVec3 inlines
void JPAFieldConvection::calc(JPAEmitterWorkData* work, JPAFieldBlock* block,
JPABaseParticle* ptcl) {
JGeometry::TVec3<f32> vec1, vec2, vec3;
@@ -185,7 +183,6 @@ void JPAFieldConvection::calc(JPAEmitterWorkData* work, JPAFieldBlock* block,
/* 8027CCCC-8027CDE4 27760C 0118+00 1/0 0/0 0/0 .text
* calc__14JPAFieldRandomFP18JPAEmitterWorkDataP13JPAFieldBlockP15JPABaseParticle */
// NONMATCHING missing clrlwi
void JPAFieldRandom::calc(JPAEmitterWorkData* work, JPAFieldBlock* block, JPABaseParticle* ptcl) {
if (ptcl->mAge == 0 || (block->getCycle() != 0 && ptcl->mAge % block->getCycle() == 0)) {
JPABaseEmitter* emtr = work->mpEmtr;
+8 -12
View File
@@ -17,7 +17,6 @@ JPAParticleCallBack::~JPAParticleCallBack() {
/* 8027EFEC-8027F8C8 27992C 08DC+00 0/0 1/1 0/0 .text
* init_p__15JPABaseParticleFP18JPAEmitterWorkData */
// NONMATCHING a couple problems, likely issues with setLength
void JPABaseParticle::init_p(JPAEmitterWorkData* work) {
JPABaseEmitter* emtr = work->mpEmtr;
JPAExtraShape* esp = work->mpRes->getEsp();
@@ -25,11 +24,11 @@ void JPABaseParticle::init_p(JPAEmitterWorkData* work) {
JPADynamicsBlock* dyn = work->mpRes->getDyn();
mAge = -1;
mLifeTime = (1.0f - dyn->getLifeTimeRndm() * emtr->get_r_f()) * emtr->mLifeTime;
mLifeTime = (1.0f - dyn->getLifetimeRndm() * emtr->get_r_f()) * emtr->mLifeTime;
mTime = 0.0f;
initStatus(0);
MTXMultVecSR(work->mGlobalSR, &work->mVolumePos, &mLocalPosition);
MTXMultVecSR(work->mGlobalSR, &work->mVolumeCalcData.mVolumePos, &mLocalPosition);
if (emtr->checkFlag(8)) {
setStatus(0x20);
}
@@ -41,14 +40,14 @@ void JPABaseParticle::init_p(JPAEmitterWorkData* work) {
JGeometry::TVec3<f32> velOmni;
if (emtr->mAwayFromCenterSpeed) {
velOmni.setLength(work->mVelOmni, emtr->mAwayFromCenterSpeed);
velOmni.setLength(work->mVolumeCalcData.mVelOmni, emtr->mAwayFromCenterSpeed);
} else {
velOmni.zero();
}
JGeometry::TVec3<f32> velAxis;
if (emtr->mAwayFromAxisSpeed) {
velAxis.setLength(work->mVelAxis, emtr->mAwayFromAxisSpeed);
velAxis.setLength(work->mVolumeCalcData.mVelAxis, emtr->mAwayFromAxisSpeed);
} else {
velAxis.zero();
}
@@ -56,9 +55,7 @@ void JPABaseParticle::init_p(JPAEmitterWorkData* work) {
JGeometry::TVec3<f32> velDir;
if (emtr->mDirSpeed) {
Mtx mtx;
int angleZ = emtr->get_r_ss();
f32 angleY = emtr->get_r_zp() * 0x8000 * emtr->mSpread;
JPAGetYZRotateMtx(angleY, angleZ, mtx);
JPAGetYZRotateMtx(emtr->get_r_zp() * 0x8000 * emtr->mSpread, emtr->get_r_ss(), mtx);
MTXConcat(work->mDirectionMtx, mtx, mtx);
velDir.set(emtr->mDirSpeed * mtx[0][2],
emtr->mDirSpeed * mtx[1][2],
@@ -100,8 +97,7 @@ void JPABaseParticle::init_p(JPAEmitterWorkData* work) {
mAnmRandom = emtr->get_r_f() * bsp->getLoopOfstValue();
if (esp != NULL && esp->isEnableScaleAnm()) {
f32 scale = emtr->mScaleOut * (emtr->get_r_zp() * esp->getScaleRndm() + 1.0f);
mParticleScaleX = mParticleScaleY = mScaleOut = scale;
mParticleScaleX = mParticleScaleY = mScaleOut = emtr->mScaleOut * (emtr->get_r_zp() * esp->getScaleRndm() + 1.0f);
} else {
mParticleScaleX = mParticleScaleY = mScaleOut = emtr->mScaleOut;
}
@@ -324,12 +320,12 @@ bool JPABaseParticle::canCreateChild(JPAEmitterWorkData* work) {
* getWidth__15JPABaseParticleCFPC14JPABaseEmitter */
f32 JPABaseParticle::getWidth(JPABaseEmitter const* emtr) const {
f32 scale = 2.0f * mParticleScaleX;
return scale * emtr->mpEmtrMgr->mpWorkData->mGlobalPtclScl.x;
return scale * emtr->mpEmtrMgr->pWd->mGlobalPtclScl.x;
}
/* 80280568-80280588 27AEA8 0020+00 0/0 3/3 0/0 .text
* getHeight__15JPABaseParticleCFPC14JPABaseEmitter */
f32 JPABaseParticle::getHeight(JPABaseEmitter const* emtr) const {
f32 scale = 2.0f * mParticleScaleY;
return scale * emtr->mpEmtrMgr->mpWorkData->mGlobalPtclScl.y;
return scale * emtr->mpEmtrMgr->pWd->mGlobalPtclScl.y;
}