mirror of
https://github.com/zeldaret/ss
synced 2026-07-30 16:03:22 -04:00
JPAEmitterManager OK
This commit is contained in:
@@ -4,8 +4,9 @@
|
||||
//
|
||||
|
||||
#include "JSystem/JParticle/JPADynamicsBlock.h"
|
||||
#include "JSystem/JMath/JMATrigonometric.h"
|
||||
|
||||
#include "JSystem/JParticle/JPAEmitter.h"
|
||||
#include "nw4r/math/math_triangular.h"
|
||||
|
||||
/* 8027B144-8027B220 275A84 00DC+00 1/1 0/0 0/0 .text JPAVolumePoint__FP18JPAEmitterWorkData */
|
||||
void JPAVolumePoint(JPAEmitterWorkData* work) {
|
||||
@@ -53,9 +54,10 @@ void JPAVolumeCircle(JPAEmitterWorkData* work) {
|
||||
}
|
||||
|
||||
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.mVolumePos.set(distance * nw4r::math::SinIdx(theta), 0.0f,
|
||||
distance * nw4r::math::CosIdx(theta));
|
||||
work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos;
|
||||
work->mVolumeCalcData.mVelOmni *= work->mGlobalScl;
|
||||
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
|
||||
work->mVolumeCalcData.mVolumePos.z);
|
||||
}
|
||||
@@ -65,7 +67,8 @@ void JPAVolumeCube(JPAEmitterWorkData* work) {
|
||||
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->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
|
||||
work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos;
|
||||
work->mVolumeCalcData.mVelOmni *= work->mGlobalScl;
|
||||
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f, work->mVolumeCalcData.mVolumePos.z);
|
||||
}
|
||||
|
||||
@@ -97,9 +100,10 @@ static void JPAVolumeSphere(JPAEmitterWorkData* work) {
|
||||
rnd = 1.0f - rnd * rnd * rnd;
|
||||
}
|
||||
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
|
||||
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.mVolumePos.set(rad * nw4r::math::CosIdx(phi) * nw4r::math::SinIdx(theta), -rad * nw4r::math::SinIdx(phi),
|
||||
rad * nw4r::math::CosIdx(phi) * nw4r::math::CosIdx(theta));
|
||||
work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos;
|
||||
work->mVolumeCalcData.mVelOmni *= work->mGlobalScl;
|
||||
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
|
||||
work->mVolumeCalcData.mVolumePos.z);
|
||||
}
|
||||
@@ -113,8 +117,9 @@ static void JPAVolumeCylinder(JPAEmitterWorkData* work) {
|
||||
}
|
||||
f32 rad = work->mVolumeSize * (work->mVolumeMinRad + rnd * (1.0f - work->mVolumeMinRad));
|
||||
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);
|
||||
rad * nw4r::math::SinIdx(theta), work->mVolumeSize * work->mpEmtr->get_r_zp(), rad * nw4r::math::CosIdx(theta));
|
||||
work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos;
|
||||
work->mVolumeCalcData.mVelOmni *= work->mGlobalScl;
|
||||
work->mVolumeCalcData.mVelAxis.set(work->mVolumeCalcData.mVolumePos.x, 0.0f,
|
||||
work->mVolumeCalcData.mVolumePos.z);
|
||||
}
|
||||
@@ -124,13 +129,14 @@ 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->mVolumeCalcData.mVelAxis.set(rad * JMASSin(theta) * JMASCos(phi), rad * JMASSin(phi),
|
||||
rad * JMASCos(theta) * JMASCos(phi));
|
||||
work->mVolumeCalcData.mVelAxis.set(rad * nw4r::math::SinIdx(theta) * nw4r::math::CosIdx(phi), rad * nw4r::math::SinIdx(phi),
|
||||
rad * nw4r::math::CosIdx(theta) * nw4r::math::CosIdx(phi));
|
||||
work->mVolumeCalcData.mVolumePos.set(
|
||||
work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * JMASSin(theta),
|
||||
work->mVolumeCalcData.mVelAxis.x + work->mVolumeSize * nw4r::math::SinIdx(theta),
|
||||
work->mVolumeCalcData.mVelAxis.y,
|
||||
work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * JMASCos(theta));
|
||||
// work->mVolumeCalcData.mVelOmni.mul(work->mVolumeCalcData.mVolumePos, work->mGlobalScl);
|
||||
work->mVolumeCalcData.mVelAxis.z + work->mVolumeSize * nw4r::math::CosIdx(theta));
|
||||
work->mVolumeCalcData.mVelOmni = work->mVolumeCalcData.mVolumePos;
|
||||
work->mVolumeCalcData.mVelOmni *= work->mGlobalScl;
|
||||
}
|
||||
|
||||
/* 8027BB18-8027BB4C 276458 0034+00 0/0 1/1 0/0 .text __ct__16JPADynamicsBlockFPCUc */
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
// Translation Unit: JPAEmitterManager
|
||||
//
|
||||
|
||||
#include "JSystem/JParticle/JPAList.h"
|
||||
#include "JSystem/JSupport/JSUList.h"
|
||||
#include "egg/core/eggHeap.h"
|
||||
#include "JSystem/JParticle/JPAEmitterManager.h"
|
||||
#include "JSystem/JParticle/JPAEmitter.h"
|
||||
@@ -10,6 +12,8 @@
|
||||
#include "JSystem/JParticle/JPAResourceManager.h"
|
||||
#include "JSystem/JUtility/JUTAssert.h"
|
||||
#include "egg/math/eggVector.h"
|
||||
#include "rvl/GX/GXTransform.h"
|
||||
#include "rvl/GX/GXTypes.h"
|
||||
#include "rvl/GX.h"
|
||||
|
||||
/* 8027DCA0-8027DEBC 2785E0 021C+00 0/0 1/1 0/0 .text __ct__17JPAEmitterManagerFUlUlP7EGG::HeapUcUc
|
||||
@@ -23,25 +27,25 @@ JPAEmitterManager::JPAEmitterManager(u32 i_ptclNum, u32 i_emtrNum, EGG::Heap* pH
|
||||
|
||||
JUT_ASSERT(40, emtrNum && ptclNum && gidMax && ridMax);
|
||||
|
||||
JPABaseEmitter* p_emtr_link = new (pHeap, 0) JPABaseEmitter[emtrNum];
|
||||
JPABaseEmitter* p_emtr_link = new (pHeap, 4) JPABaseEmitter[emtrNum];
|
||||
JUT_ASSERT(44, p_emtr_link);
|
||||
for (u32 i = 0; i < emtrNum; i++)
|
||||
mFreeEmtrList.prepend(&p_emtr_link[i].mLink);
|
||||
|
||||
JPANode<JPABaseParticle>* p_ptcl_node = new (pHeap, 0) JPANode<JPABaseParticle>[ptclNum];
|
||||
JPANode<JPABaseParticle>* p_ptcl_node = new (pHeap, 4) 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];
|
||||
pEmtrUseList = new (pHeap, 4) JSUList<JPABaseEmitter>[gidMax];
|
||||
JUT_ASSERT(58, pEmtrUseList);
|
||||
pResMgrAry = new (pHeap, 0) JPAResourceManager*[ridMax];
|
||||
pResMgrAry = new (pHeap, 4) JPAResourceManager*[ridMax];
|
||||
JUT_ASSERT(62, pResMgrAry)
|
||||
for (int i = 0; i < ridMax; i++) {
|
||||
pResMgrAry[i] = NULL;
|
||||
}
|
||||
|
||||
pWd = new (pHeap, 0) JPAEmitterWorkData();
|
||||
pWd = new (pHeap, 4) JPAEmitterWorkData();
|
||||
JUT_ASSERT(67, pWd);
|
||||
}
|
||||
|
||||
@@ -79,6 +83,41 @@ JPABaseEmitter* JPAEmitterManager::createSimpleEmitterID(EGG::Vector3f const& po
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// SS addition
|
||||
void JPAEmitterManager::fn_80320E20(u8 group_id, f32 of_x, f32 of_z) {
|
||||
JSULink<JPABaseEmitter> *pNext = NULL;
|
||||
for (JSULink<JPABaseEmitter> *pLink = pEmtrUseList[group_id].getFirst(); pLink != pEmtrUseList[group_id].getEnd();
|
||||
pLink = pNext) {
|
||||
pNext = pLink->getNext();
|
||||
JPABaseEmitter *pEmit = pLink->getObject();
|
||||
|
||||
EGG::Vector3f offset;
|
||||
JPANode<JPABaseParticle> *pNextBase = NULL;
|
||||
|
||||
for (JPANode<JPABaseParticle> *baseLink = pEmit->mAlivePtclBase.getFirst();
|
||||
baseLink != pEmit->mAlivePtclBase.getEnd(); baseLink = pNextBase) {
|
||||
pNextBase = baseLink->getNext();
|
||||
|
||||
JPABaseParticle *o = baseLink->getObject();
|
||||
o->getOffsetPosition(offset);
|
||||
offset.x += of_x;
|
||||
offset.z += of_z;
|
||||
o->setOffsetPosition(offset);
|
||||
}
|
||||
|
||||
for (JPANode<JPABaseParticle> *childLink = pEmit->mAlivePtclChld.getFirst();
|
||||
childLink != pEmit->mAlivePtclChld.getEnd(); childLink = pNextBase) {
|
||||
pNextBase = childLink->getNext();
|
||||
|
||||
JPABaseParticle *o = childLink->getObject();
|
||||
o->getOffsetPosition(offset);
|
||||
offset.x += of_x;
|
||||
offset.z += of_z;
|
||||
o->setOffsetPosition(offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 8027DFA0-8027E028 2788E0 0088+00 0/0 3/3 0/0 .text calc__17JPAEmitterManagerFUc */
|
||||
void JPAEmitterManager::calc(u8 group_id) {
|
||||
JUT_ASSERT(154, group_id < gidMax);
|
||||
@@ -130,6 +169,8 @@ void JPAEmitterManager::draw(JPADrawInfo const* drawInfo, u8 group_id) {
|
||||
emtr->mpRes->draw(pWd, emtr);
|
||||
}
|
||||
}
|
||||
|
||||
GXSetClipMode(GX_CLIP_ENABLE);
|
||||
}
|
||||
|
||||
/* 8027E220-8027E278 278B60 0058+00 0/0 1/1 0/0 .text forceDeleteAllEmitter__17JPAEmitterManagerFv
|
||||
|
||||
@@ -4,10 +4,9 @@
|
||||
//
|
||||
|
||||
#include "JSystem/JParticle/JPAExtraShape.h"
|
||||
#include "JSystem/JMath/JMATrigonometric.h"
|
||||
#include "JSystem/JParticle/JPAParticle.h"
|
||||
#include "JSystem/JParticle/JPAEmitter.h"
|
||||
#include "rvl/OS.h"
|
||||
#include "nw4r/math/math_triangular.h"
|
||||
|
||||
/* 8027A918-8027A990 275258 0078+00 0/0 1/1 0/0 .text
|
||||
* JPACalcScaleX__FP18JPAEmitterWorkDataP15JPABaseParticle */
|
||||
@@ -116,7 +115,7 @@ void JPACalcAlphaFlickAnm(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
alpha = esp->getAlphaBaseValue();
|
||||
}
|
||||
s32 theta = ptcl->mAlphaWaveRandom * ptcl->mAge * 16384.0f * (1.0f - esp->getAlphaFreq());
|
||||
f32 wave = JMASSin(theta);
|
||||
f32 wave = nw4r::math::SinIdx(theta);
|
||||
alpha *= (1.0f + esp->getAlphaAmp() * (wave - 1.0f) * 0.5f) * 255.0f;
|
||||
OSf32tou8(&alpha, &ptcl->mPrmColorAlphaAnm);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user