Files
tww/src/JSystem/JParticle/JPADraw.cpp
T
LagoLunatic d5a3227301 misc matches
2024-02-02 01:24:11 -05:00

1028 lines
40 KiB
C++

//
// Generated by dtk
// Translation Unit: JPADraw.cpp
//
#include "JSystem/JParticle/JPADraw.h"
#include "JSystem/JParticle/JPABaseShape.h"
#include "JSystem/JParticle/JPAExtraShape.h"
#include "JSystem/JParticle/JPASweepShape.h"
#include "JSystem/JParticle/JPAResourceManager.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "dolphin/types.h"
JPADrawVisitorContainer JPADraw::vc;
JPADrawClipBoard JPADraw::cb;
/* 80267F40-80268634 .text initialize__7JPADrawFP14JPABaseEmitterP18JPATextureResource */
bool JPADraw::initialize(JPABaseEmitter* emtr, JPATextureResource* texRes) {
JPADrawContext::pcb = &cb;
dc.pbe = emtr;
dc.pbsp = dc.pbe->getEmitterDataBlockInfoPtr()->getBaseShape();
dc.pesp = dc.pbe->getEmitterDataBlockInfoPtr()->getExtraShape();
dc.pssp = dc.pbe->getEmitterDataBlockInfoPtr()->getSweepShape();
dc.petx = dc.pbe->getEmitterDataBlockInfoPtr()->getExTexShape();
dc.mpDraw = this;
dc.mpTextureResource = texRes;
dc.pTexIdx = dc.pbe->getEmitterDataBlockInfoPtr()->getTextureDataBase();
dc.mpActiveParticles = &dc.pbe->mActiveParticles;
field_0xc2 = 0;
mScaleOut = 1.0f;
GXColor white = { 0xFF, 0xFF, 0xFF, 0xFF };
if (dc.pbsp->isEnablePrm()) {
if (!dc.pbsp->isEnablePrmAnm()) {
mPrmColor = dc.pbsp->getPrmColor();
}
} else {
mPrmColor = white;
}
if (dc.pbsp->isEnableEnv()) {
if (!dc.pbsp->isEnableEnvAnm()) {
mEnvColor = dc.pbsp->getEnvColor();
}
} else {
mEnvColor = white;
}
calcChldVisNum = 0;
calcPtclVisNum = 0;
execChldVisNum = 0;
execPtclVisNum = 0;
calcEmtrVisNum = 0;
execEmtrCVisNum = 0;
execEmtrPVisNum = 0;
execEmtrVisNum = 0;
for (u32 i = 0; i < ARRAY_SIZE(mpExecEmtrVis); i++)
mpExecEmtrVis[i] = NULL;
for (u32 i = 0; i < ARRAY_SIZE(mpExecEmtrPVis); i++)
mpExecEmtrPVis[i] = NULL;
for (u32 i = 0; i < ARRAY_SIZE(mpExecEmtrCVis); i++)
mpExecEmtrCVis[i] = NULL;
for (u32 i = 0; i < ARRAY_SIZE(mpCalcEmtrVis); i++)
mpCalcEmtrVis[i] = NULL;
for (u32 i = 0; i < ARRAY_SIZE(mpExecPtclVis); i++)
mpExecPtclVis[i] = NULL;
for (u32 i = 0; i < ARRAY_SIZE(mpExecChldVis); i++)
mpExecChldVis[i] = NULL;
for (u32 i = 0; i < ARRAY_SIZE(mpCalcPtclVis); i++)
mpCalcPtclVis[i] = NULL;
for (u32 i = 0; i < ARRAY_SIZE(mpCalcChldVis); i++)
mpCalcChldVis[i] = NULL;
JPADrawVisitorDefFlags flags;
flags.mbIsEnableDrawParent = dc.pssp == NULL || dc.pssp->isEnableDrawParent();
flags.mbHasPrmAnm = dc.pbsp->isEnablePrm() && dc.pbsp->isEnablePrmAnm();
flags.mbHasEnvAnm = dc.pbsp->isEnableEnv() && dc.pbsp->isEnableEnvAnm();
flags.mbIsStripe = dc.pbsp->getType() == JPABaseShape::JPAType_Stripe || dc.pbsp->getType() == JPABaseShape::JPAType_StripeCross;
flags.mbIsPointOrLine = dc.pbsp->getType() == JPABaseShape::JPAType_Point || dc.pbsp->getType() == JPABaseShape::JPAType_Line;
flags.mbIsEnableAlpha = dc.pesp != NULL && dc.pesp->isEnableAlpha();
setDrawExecVisitorsBeforeCB(flags);
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mExecCallBack;
mpExecEmtrCVis[execEmtrCVisNum++] = &vc.mExecCallBack;
mpExecPtclVis[execPtclVisNum++] = &vc.mExecCallBack;
mpExecChldVis[execChldVisNum++] = &vc.mExecCallBack;
setDrawExecVisitorsAfterCB(flags);
setDrawCalcVisitors(flags);
JUT_ASSERT(0x65, execEmtrVisNum <= 1);
JUT_ASSERT(0x66, execEmtrPVisNum <= 5);
JUT_ASSERT(0x67, execEmtrCVisNum <= 3);
JUT_ASSERT(0x68, calcEmtrVisNum <= 4);
JUT_ASSERT(0x69, execPtclVisNum <= 5);
JUT_ASSERT(0x6a, execChldVisNum <= 4);
JUT_ASSERT(0x6b, calcPtclVisNum <= 10);
JUT_ASSERT(0x6c, calcChldVisNum <= 2);
return true;
}
/* 80268634-802688D4 .text draw__7JPADrawFPA4_f */
void JPADraw::draw(MtxP drawMtx) {
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXSetCurrentMtx(0);
GXSetNumChans(0);
GXSetTevDirect(GX_TEVSTAGE0);
GXSetTevDirect(GX_TEVSTAGE1);
GXSetTevDirect(GX_TEVSTAGE2);
GXSetCoPlanar(GX_DISABLE);
GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE);
GXSetChanCtrl(GX_COLOR1A1, GX_DISABLE, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE);
GXSetBlendMode(dc.pbsp->getBlendMode1(), dc.pbsp->getSrcBlendFactor1(), dc.pbsp->getDstBlendFactor1(), dc.pbsp->getBlendOp1());
cb.mPrmColor = dc.pbe->mGlobalPrmColor;
cb.mEnvColor = dc.pbe->mGlobalEnvColor;
cb.mDrawMtxPtr = drawMtx;
cb.mSetupTev.setupTev(dc.pbsp, dc.petx);
for (int i = 0; i < execEmtrVisNum; i++) {
mpExecEmtrVis[i]->exec(&dc);
}
if (dc.pbsp->isEnableAnmTone()) {
zDraw();
}
field_0xc2 &= ~0x01;
if (dc.pbsp->getChildOrder() && dc.pssp) {
drawChild();
}
drawParticle();
if (!dc.pbsp->getChildOrder() && dc.pssp) {
drawChild();
}
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
}
/* 802688D4-80268940 .text calc__7JPADrawFv */
void JPADraw::calc() {
for (s32 i = 0; i < calcEmtrVisNum; i++)
mpCalcEmtrVis[i]->calc(&dc);
}
/* 80268940-802689C4 .text calcParticle__7JPADrawFP15JPABaseParticle */
void JPADraw::calcParticle(JPABaseParticle* ptcl) {
ptcl->mRotateAngle += ptcl->mRotateSpeed;
for (s32 i = 0; i < calcPtclVisNum; i++)
mpCalcPtclVis[i]->calc(&dc, ptcl);
}
/* 802689C4-80268A48 .text calcChild__7JPADrawFP15JPABaseParticle */
void JPADraw::calcChild(JPABaseParticle* ptcl) {
ptcl->mRotateAngle += ptcl->mRotateSpeed;
for (s32 i = 0; i < calcChldVisNum; i++)
mpCalcChldVis[i]->calc(&dc, ptcl);
}
/* 80268A48-80268F28 .text initParticle__7JPADrawFP15JPABaseParticle */
void JPADraw::initParticle(JPABaseParticle* ptcl) {
ptcl->mAxis.set(JPABaseEmitter::emtrInfo.mEmitterGlobalRot[0][1], JPABaseEmitter::emtrInfo.mEmitterGlobalRot[1][1], JPABaseEmitter::emtrInfo.mEmitterGlobalRot[2][1]);
ptcl->mPrmColor = mPrmColor;
ptcl->mEnvColor = mEnvColor;
ptcl->mAlphaOut = 1.0f;
ptcl->mLoopOffset = dc.pbe->getRandomF() * dc.pbsp->getLoopOffset();
if (dc.pesp != NULL) {
if (dc.pesp->isEnableRotate()) {
ptcl->mRotateAngle = (dc.pesp->getRotateAngle() * 32768.0f) + (dc.pbe->getRandomSF() * dc.pesp->getRotateRandomAngle() * 65536.0f);
s16 rotateSpeed;
if (dc.pbe->getRandomRF() < dc.pesp->getRotateDirection()) {
rotateSpeed = dc.pesp->getRotateSpeed() * (dc.pesp->getRotateRandomSpeed() * dc.pbe->getRandomRF() + 1.0f) * 32768.0f;
} else {
rotateSpeed = -dc.pesp->getRotateSpeed() * (dc.pesp->getRotateRandomSpeed() * dc.pbe->getRandomRF() + 1.0f) * 32768.0f;
}
ptcl->mRotateSpeed = rotateSpeed;
} else {
ptcl->mRotateAngle = 0;
ptcl->mRotateSpeed = 0;
}
if (dc.pesp->isEnableScale()) {
ptcl->mScaleX = ptcl->mScaleY = ptcl->mScaleOut = (dc.pbe->getRandomRF() * dc.pesp->getRandomScale() + 1.0f) * mScaleOut;
} else {
ptcl->mScaleX = ptcl->mScaleY = ptcl->mScaleOut = mScaleOut;
}
if (dc.pesp->isEnableAlpha()) {
ptcl->mAlphaWaveRandom = (dc.pbe->getRandomRF() * dc.pesp->getAlphaWaveRandom() + 1.0f);
} else {
ptcl->mAlphaWaveRandom = 1.0f;
}
} else {
ptcl->mRotateAngle = 0;
ptcl->mRotateSpeed = 0;
ptcl->mScaleOut = ptcl->mScaleX = ptcl->mScaleY = mScaleOut;
ptcl->mAlphaWaveRandom = 1.0f;
}
}
/* 80268F28-802692A4 .text initChild__7JPADrawFP15JPABaseParticleP15JPABaseParticle */
void JPADraw::initChild(JPABaseParticle* ptcl, JPABaseParticle* chld) {
chld->mAxis.set(ptcl->mAxis);
chld->mAlphaOut = 1.0f;
if (dc.pssp->isInheritedRGB()) {
f32 ratio = dc.pssp->getInheritRGB();
chld->mPrmColor.r = ptcl->mPrmColor.r * ratio;
chld->mPrmColor.g = ptcl->mPrmColor.g * ratio;
chld->mPrmColor.b = ptcl->mPrmColor.b * ratio;
chld->mEnvColor.r = ptcl->mEnvColor.r * ratio;
chld->mEnvColor.g = ptcl->mEnvColor.g * ratio;
chld->mEnvColor.b = ptcl->mEnvColor.b * ratio;
} else {
chld->mPrmColor = dc.pssp->getPrm();
chld->mEnvColor = dc.pssp->getEnv();
}
if (dc.pssp->isInheritedAlpha()) {
f32 ratio = dc.pssp->getInheritAlpha() * ptcl->mAlphaOut;
chld->mPrmColor.a = ptcl->mPrmColor.a * ratio;
chld->mEnvColor.a = ptcl->mEnvColor.a * ratio;
} else {
chld->mPrmColor.a = dc.pssp->getPrmAlpha();
chld->mEnvColor.a = dc.pssp->getEnvAlpha();
}
if (dc.pssp->isInheritedScale()) {
f32 ratio = dc.pssp->getInheritScale();
chld->mScaleX = chld->mScaleOut = ratio * ptcl->mScaleX;
chld->mScaleY = chld->mAlphaWaveRandom = ratio * ptcl->mScaleY;
} else {
chld->mAlphaWaveRandom = 1.0f;
chld->mScaleY = 1.0f;
chld->mScaleOut = 1.0f;
chld->mScaleX = 1.0f;
}
chld->mRotateAngle = ptcl->mRotateAngle;
if (dc.pssp->isEnableRotate()) {
chld->mRotateSpeed = dc.pssp->getRotateSpeed() * 32768.0f;
} else {
chld->mRotateSpeed = 0;
}
}
/* 802692A4-80269358 .text loadTexture__7JPADrawFUc11_GXTexMapID */
bool JPADraw::loadTexture(u8 tex_no, GXTexMapID texMap) {
JUT_ASSERT(0x17e, dc.pbe->getEmitterDataBlockInfoPtr()->getTextureNum() > tex_no);
dc.mpTextureResource->load(dc.pTexIdx[tex_no], texMap);
return true;
}
/* 80269358-80269C08 .text setDrawExecVisitorsBeforeCB__7JPADrawFRCQ27JPADraw22JPADrawVisitorDefFlags */
void JPADraw::setDrawExecVisitorsBeforeCB(const JPADrawVisitorDefFlags& flags) {
if (dc.petx) {
mpExecEmtrVis[execEmtrVisNum++] = &vc.mLoadExTexture;
}
if (flags.mbIsPointOrLine) {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mGenIdtMtx;
} else if (dc.pbsp->isEnableProjection()) {
if (dc.pbsp->isEnableTexScrollAnm()) {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mGenPrjTexMtx;
} else {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mGenPrjMtx;
}
} else if (dc.pbsp->isEnableTexScrollAnm()) {
if (flags.mbIsStripe) {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mSetTexMtx;
} else {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mGenTexMtx0;
}
} else {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mGenIdtMtx;
}
if (dc.pbsp->isEnableGlobalColAnm()) {
if (flags.mbIsStripe || flags.mbIsEnableAlpha == 0) {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mRegisterColorPrmEnv;
} else if (flags.mbIsEnableAlpha) {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mRegisterColorEnv;
}
} else if ((!dc.pbsp->isEnablePrm() || !dc.pbsp->isEnablePrmAnm()) && flags.mbIsEnableAlpha == 0) {
if (!dc.pbsp->isEnableEnv() || !dc.pbsp->isEnableEnvAnm()) {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mRegisterColorPrmEnv;
} else {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mRegisterColorPrm;
}
} else if (!dc.pbsp->isEnableEnv() || !dc.pbsp->isEnableEnvAnm()) {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mRegisterColorEnv;
}
if (!dc.pbsp->textureIsEmpty() && (!dc.pbsp->isEnableTextureAnm() || dc.pbsp->isEnableGlobalTexAnm())) {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mLoadTexture;
} else if (dc.pbsp->textureIsEmpty()) {
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mLoadDefaultTexture;
}
if (dc.pssp && !dc.pssp->isEnableAlphaOut() && !dc.pssp->isInheritedAlpha() && !dc.pssp->isInheritedRGB()) {
mpExecEmtrCVis[execEmtrCVisNum++] = &vc.mRegisterColorChildPrmEnv;
}
if (!dc.pbsp->isEnableGlobalColAnm()) {
if (flags.mbHasPrmAnm) {
if (flags.mbHasEnvAnm) {
mpExecPtclVis[execPtclVisNum++] = &vc.mRegisterPrmColor;
} else {
mpExecPtclVis[execPtclVisNum++] = &vc.mRegisterPrmColorAnm;
}
} else if (flags.mbIsEnableAlpha) {
if (flags.mbHasEnvAnm) {
mpExecPtclVis[execPtclVisNum++] = &vc.mRegisterPrmAlpha;
} else {
mpExecPtclVis[execPtclVisNum++] = &vc.mRegisterPrmAlphaAnm;
}
} else if (flags.mbHasEnvAnm) {
mpExecPtclVis[execPtclVisNum++] = &vc.mRegisterEnvColorAnm;
}
} else if (flags.mbIsEnableAlpha && !flags.mbIsStripe) {
mpExecPtclVis[execPtclVisNum++] = &vc.mRegisterPrmAlphaAnm;
}
if (!dc.pbsp->textureIsEmpty() && dc.pbsp->isEnableTextureAnm() && !dc.pbsp->isEnableGlobalTexAnm()) {
mpExecPtclVis[execPtclVisNum++] = &vc.mLoadTexture;
}
switch (dc.pbsp->getType()) {
case JPABaseShape::JPAType_Point:
if (dc.pesp && dc.pesp->isEnableScale()) {
mpExecPtclVis[execPtclVisNum++] = &vc.mSetPointSize;
}
break;
case JPABaseShape::JPAType_Line:
if (dc.pesp && dc.pesp->isEnableScale()) {
mpExecPtclVis[execPtclVisNum++] = &vc.mSetLineWidth;
}
break;
case JPABaseShape::JPAType_Stripe:
case JPABaseShape::JPAType_StripeCross:
break;
case JPABaseShape::JPAType_Billboard:
case JPABaseShape::JPAType_Direction:
case JPABaseShape::JPAType_DirectionCross:
case JPABaseShape::JPAType_Rotation:
case JPABaseShape::JPAType_RotationCross:
case JPABaseShape::JPAType_DirBillboard:
case JPABaseShape::JPAType_YBillboard:
if (dc.pbsp->isEnableTexScrollAnm() && !dc.pbsp->isEnableProjection()) {
mpExecPtclVis[execPtclVisNum++] = &vc.mSetTexMtx;
}
break;
}
if (dc.pssp) {
if (dc.pssp->isEnableAlphaOut() || dc.pssp->isInheritedAlpha() || dc.pssp->isInheritedRGB()) {
mpExecChldVis[execChldVisNum++] = &vc.mRegisterPrmColor;
}
switch (dc.pssp->getType()) {
case JPABaseShape::JPAType_Point:
mpExecChldVis[execChldVisNum++] = &vc.mSetPointSize;
break;
case JPABaseShape::JPAType_Line:
mpExecChldVis[execChldVisNum++] = &vc.mSetLineWidth;
break;
}
}
}
/* 80269C08-8026A2EC .text setDrawExecVisitorsAfterCB__7JPADrawFRCQ27JPADraw22JPADrawVisitorDefFlags */
void JPADraw::setDrawExecVisitorsAfterCB(const JPADrawVisitorDefFlags& flags) {
if (flags.mbIsEnableDrawParent) {
switch (dc.pbsp->getType()) {
case JPABaseShape::JPAType_Point:
mpExecPtclVis[execPtclVisNum++] = &vc.mExecPoint;
break;
case JPABaseShape::JPAType_Line:
mpExecPtclVis[execPtclVisNum++] = &vc.mExecLine;
break;
case JPABaseShape::JPAType_Billboard:
if (dc.pesp && dc.pesp->isEnableRotate()) {
mpExecPtclVis[execPtclVisNum++] = &vc.mExecRotBillBoard;
} else {
mpExecPtclVis[execPtclVisNum++] = &vc.mExecBillBoard;
}
break;
case JPABaseShape::JPAType_Direction:
if (dc.pesp && dc.pesp->isEnableRotate()) {
mpExecPtclVis[execPtclVisNum++] = &vc.mExecRotDirectional;
} else {
mpExecPtclVis[execPtclVisNum++] = &vc.mExecDirectional;
}
break;
case JPABaseShape::JPAType_DirectionCross:
if (dc.pesp && dc.pesp->isEnableRotate()) {
mpExecPtclVis[execPtclVisNum++] = &vc.mExecRotDirectionalCross;
} else {
mpExecPtclVis[execPtclVisNum++] = &vc.mExecDirectionalCross;
}
break;
case JPABaseShape::JPAType_YBillboard:
if (dc.pesp && dc.pesp->isEnableRotate()) {
mpExecPtclVis[execPtclVisNum++] = &vc.mExecRotYBillBoard;
} else {
mpExecPtclVis[execPtclVisNum++] = &vc.mExecYBillBoard;
}
break;
case JPABaseShape::JPAType_Rotation:
mpExecPtclVis[execPtclVisNum++] = &vc.mExecRotation;
break;
case JPABaseShape::JPAType_RotationCross:
mpExecPtclVis[execPtclVisNum++] = &vc.mExecRotationCross;
break;
case JPABaseShape::JPAType_DirBillboard:
mpExecPtclVis[execPtclVisNum++] = &vc.mExecDirBillBoard;
break;
case JPABaseShape::JPAType_Stripe:
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mExecStripe;
break;
case JPABaseShape::JPAType_StripeCross:
mpExecEmtrPVis[execEmtrPVisNum++] = &vc.mExecStripeCross;
break;
}
}
if (dc.pssp) {
switch (dc.pssp->getType()) {
case JPABaseShape::JPAType_Point:
mpExecChldVis[execChldVisNum++] = &vc.mExecPoint;
break;
case JPABaseShape::JPAType_Line:
mpExecChldVis[execChldVisNum++] = &vc.mExecLine;
break;
case JPABaseShape::JPAType_Billboard:
if ((dc.pesp && dc.pesp->isEnableRotate()) || dc.pssp->isEnableRotate()) {
mpExecChldVis[execChldVisNum++] = &vc.mExecRotBillBoard;
} else {
mpExecChldVis[execChldVisNum++] = &vc.mExecBillBoard;
}
break;
case JPABaseShape::JPAType_Direction:
if ((dc.pesp && dc.pesp->isEnableRotate()) || dc.pssp->isEnableRotate()) {
mpExecChldVis[execChldVisNum++] = &vc.mExecRotDirectional;
} else {
mpExecChldVis[execChldVisNum++] = &vc.mExecDirectional;
}
break;
case JPABaseShape::JPAType_DirectionCross:
if ((dc.pesp && dc.pesp->isEnableRotate()) || dc.pssp->isEnableRotate()) {
mpExecChldVis[execChldVisNum++] = &vc.mExecRotDirectionalCross;
} else {
mpExecChldVis[execChldVisNum++] = &vc.mExecDirectionalCross;
}
break;
case JPABaseShape::JPAType_YBillboard:
if ((dc.pesp && dc.pesp->isEnableRotate()) || dc.pssp->isEnableRotate()) {
mpExecChldVis[execChldVisNum++] = &vc.mExecRotYBillBoard;
} else {
mpExecChldVis[execChldVisNum++] = &vc.mExecYBillBoard;
}
break;
case JPABaseShape::JPAType_Rotation:
mpExecChldVis[execChldVisNum++] = &vc.mExecRotation;
break;
case JPABaseShape::JPAType_RotationCross:
mpExecChldVis[execChldVisNum++] = &vc.mExecRotationCross;
break;
case JPABaseShape::JPAType_DirBillboard:
mpExecChldVis[execChldVisNum++] = &vc.mExecDirBillBoard;
break;
case JPABaseShape::JPAType_Stripe:
mpExecEmtrCVis[execEmtrCVisNum++] = &vc.mExecStripe;
break;
case JPABaseShape::JPAType_StripeCross:
mpExecEmtrCVis[execEmtrCVisNum++] = &vc.mExecStripeCross;
break;
}
}
}
enum {
JPACalcType_Normal,
JPACalcType_Repeat,
JPACalcType_Reverse,
JPACalcType_Merge,
JPACalcType_Random,
};
enum {
JPAAlphaWaveType_Nrm,
JPAAlphaWaveType_Add,
JPAAlphaWaveType_Mult,
};
/* 8026A2EC-8026ADB0 .text setDrawCalcVisitors__7JPADrawFRCQ27JPADraw22JPADrawVisitorDefFlags */
void JPADraw::setDrawCalcVisitors(const JPADraw::JPADrawVisitorDefFlags& flags) {
if (dc.pbsp->isEnableGlobalColAnm() && (flags.mbHasPrmAnm || flags.mbHasEnvAnm)) {
switch (dc.pbsp->getColorRegAnmType()) {
case JPACalcType_Normal:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcColorAnmFrameNormal;
break;
case JPACalcType_Repeat:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcColorAnmFrameRepeat;
break;
case JPACalcType_Reverse:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcColorAnmFrameReverse;
break;
case JPACalcType_Merge:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcColorAnmFrameMerge;
break;
case JPACalcType_Random:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcColorAnmFrameRandom;
break;
}
if (flags.mbHasPrmAnm) {
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcColorPrm;
}
if (flags.mbHasEnvAnm) {
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcColorEnv;
}
}
if (!dc.pbsp->textureIsEmpty() && dc.pbsp->isEnableTextureAnm() && dc.pbsp->isEnableGlobalTexAnm()) {
switch (dc.pbsp->getTextureAnmType()) {
case JPACalcType_Normal:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcTextureAnmIndexNormal;
break;
case JPACalcType_Repeat:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcTextureAnmIndexRepeat;
break;
case JPACalcType_Reverse:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcTextureAnmIndexReverse;
break;
case JPACalcType_Merge:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcTextureAnmIndexMerge;
break;
case JPACalcType_Random:
mpCalcEmtrVis[calcEmtrVisNum++] = &vc.mCalcTextureAnmIndexRandom;
break;
}
}
if (dc.pesp && dc.pesp->isEnableScale()) {
if (dc.pesp->isEnableScaleAnmX()) {
if (dc.pesp->getAnmTypeX()) {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleAnmTimingReverseX;
} else {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleAnmTimingRepeatX;
}
} else {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleAnmTimingNormal;
}
if (dc.pesp->isEnableScaleBySpeedX() && dc.pbsp->getType() != JPABaseShape::JPAType_Line) {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleXBySpeed;
} else {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleX;
}
if (dc.pbsp->getType() != JPABaseShape::JPAType_Point) {
if (!dc.pesp->isDiffXY()) {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleCopyX2Y;
} else {
if (dc.pesp->isEnableScaleAnmY()) {
if (dc.pesp->getAnmTypeY()) {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleAnmTimingReverseY;
} else {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleAnmTimingRepeatY;
}
} else if (dc.pesp->isEnableScaleAnmX()) {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleAnmTimingNormal;
}
if (dc.pesp->isEnableScaleBySpeedY()) {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleYBySpeed;
} else {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcScaleY;
}
}
}
}
if (!dc.pbsp->isEnableGlobalColAnm()) {
if (flags.mbHasPrmAnm || flags.mbHasEnvAnm) {
switch (dc.pbsp->getColorRegAnmType()) {
case JPACalcType_Normal:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcColorAnmFrameNormal;
break;
case JPACalcType_Repeat:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcColorAnmFrameRepeat;
break;
case JPACalcType_Reverse:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcColorAnmFrameReverse;
break;
case JPACalcType_Merge:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcColorAnmFrameMerge;
break;
case JPACalcType_Random:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcColorAnmFrameRandom;
break;
}
if (flags.mbHasPrmAnm) {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcColorPrm;
}
if (flags.mbHasEnvAnm) {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcColorEnv;
}
}
} else {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcColorCopyFromEmitter;
}
if (flags.mbIsEnableAlpha && !flags.mbIsStripe) {
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcAlpha;
if (dc.pesp->isEnableSinWave()) {
switch (dc.pesp->getAlphaWaveType()) {
case JPAAlphaWaveType_Nrm:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcAlphaFlickNrmSin;
break;
case JPAAlphaWaveType_Add:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcAlphaFlickAddSin;
break;
case JPAAlphaWaveType_Mult:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcAlphaFlickMultSin;
break;
}
}
}
if (!dc.pbsp->textureIsEmpty() && dc.pbsp->isEnableTextureAnm() && !dc.pbsp->isEnableGlobalTexAnm()) {
switch (dc.pbsp->getTextureAnmType()) {
case JPACalcType_Normal:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcTextureAnmIndexNormal;
break;
case JPACalcType_Repeat:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcTextureAnmIndexRepeat;
break;
case JPACalcType_Reverse:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcTextureAnmIndexReverse;
break;
case JPACalcType_Merge:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcTextureAnmIndexMerge;
break;
case JPACalcType_Random:
mpCalcPtclVis[calcPtclVisNum++] = &vc.mCalcTextureAnmIndexRandom;
break;
}
}
if (dc.pssp) {
if (dc.pssp->isEnableAlphaOut()) {
mpCalcChldVis[calcChldVisNum++] = &vc.mCalcChildAlphaOut;
}
if (dc.pssp->isEnableScaleOut()) {
mpCalcChldVis[calcChldVisNum++] = &vc.mCalcChildScaleOut;
}
}
}
/* 8026ADB0-8026B3DC .text setParticleClipBoard__7JPADrawFv */
void JPADraw::setParticleClipBoard() {
switch (dc.pbsp->getType()) {
case JPABaseShape::JPAType_Billboard:
case JPABaseShape::JPAType_DirBillboard:
MTXIdentity(cb.mDrawMtx);
break;
case JPABaseShape::JPAType_YBillboard:
loadYBBMtx(cb.mDrawMtxPtr);
break;
default:
MTXCopy(cb.mDrawMtxPtr, cb.mDrawMtx);
break;
}
GXLoadPosMtxImm(cb.mDrawMtx, GX_PNMTX0);
JPABaseEmitter* emtr = dc.pbe;
f32 scaleX = emtr->mGlobalParticleScale.x;
f32 scaleY = emtr->mGlobalParticleScale.y;
cb.mGlobalScaleX = 25.0f * dc.pbsp->getBaseSizeX() * scaleX;
cb.mGlobalScaleY = 25.0f * dc.pbsp->getBaseSizeY() * scaleY;
if (dc.pbsp->getType() == JPABaseShape::JPAType_Point) {
cb.mGlobalScaleX *= 1.02f;
cb.mGlobalScaleY *= 1.02f;
} else if (dc.pbsp->getType() == JPABaseShape::JPAType_Line) {
cb.mGlobalScaleX *= 1.02f;
cb.mGlobalScaleY *= 0.4f;
}
if (dc.pesp != NULL && dc.pesp->isEnableScale()) {
cb.mPivotX = cb.mGlobalScaleX * (dc.pesp->getPivotX() - 1.0f);
cb.mPivotY = cb.mGlobalScaleY * (dc.pesp->getPivotY() - 1.0f);
} else {
cb.mPivotX = cb.mPivotY = 0.0f;
}
f32 tilingX = dc.pbsp->getTilingX();
f32 tilingY = dc.pbsp->getTilingY();
cb.field_0x14[0].x = 0.0f;
cb.field_0x14[0].y = 0.0f;
cb.field_0x14[1].x = tilingX;
cb.field_0x14[1].y = 0.0f;
cb.field_0x14[2].x = tilingX;
cb.field_0x14[2].y = tilingY;
cb.field_0x14[3].x = 0.0f;
cb.field_0x14[3].y = tilingY;
if (!dc.pbsp->textureIsEmpty() && !dc.pbsp->isEnableTextureAnm())
mTexIdx = dc.pTexIdx[dc.pbsp->getTextureIndex()], GX_TEXMAP0;
cb.mDirTypeFunc = NULL;
cb.mRotTypeFunc = NULL;
cb.mBasePlaneTypeFunc = NULL;
if (dc.pbsp->getType() == JPABaseShape::JPAType_Direction || dc.pbsp->getType() == JPABaseShape::JPAType_DirectionCross || dc.pbsp->getType() == JPABaseShape::JPAType_DirBillboard || dc.pbsp->getType() == JPABaseShape::JPAType_Stripe || dc.pbsp->getType() == JPABaseShape::JPAType_StripeCross) {
switch (dc.pbsp->getDirType()) {
case 0: cb.mDirTypeFunc = dirTypeVel; break;
case 1: cb.mDirTypeFunc = dirTypePos; break;
case 2: cb.mDirTypeFunc = dirTypePosInv; break;
case 3: cb.mDirTypeFunc = dirTypeEmtrDir; break;
case 4: cb.mDirTypeFunc = dirTypePrevPtcl; break;
}
}
if (dc.pbsp->getType() == JPABaseShape::JPAType_Direction || dc.pbsp->getType() == JPABaseShape::JPAType_DirectionCross || dc.pbsp->getType() == JPABaseShape::JPAType_Rotation || dc.pbsp->getType() == JPABaseShape::JPAType_RotationCross) {
switch (dc.pbsp->getRotType()) {
case 0: cb.mRotTypeFunc = rotTypeY; break;
case 1: cb.mRotTypeFunc = rotTypeX; break;
case 2: cb.mRotTypeFunc = rotTypeZ; break;
case 3: cb.mRotTypeFunc = rotTypeXYZ; break;
case 4: cb.mRotTypeFunc = rotTypeYJiggle; break;
}
}
if (dc.pbsp->getType() == JPABaseShape::JPAType_Direction || dc.pbsp->getType() == JPABaseShape::JPAType_Rotation) {
switch (dc.pbsp->getBasePlaneType()) {
case 0: cb.mBasePlaneTypeFunc = basePlaneTypeXY; break;
case 1: cb.mBasePlaneTypeFunc = basePlaneTypeXZ; break;
}
}
}
/* 8026B3DC-8026B938 .text setChildClipBoard__7JPADrawFv */
void JPADraw::setChildClipBoard() {
switch (dc.pssp->getType()) {
case JPABaseShape::JPAType_Billboard:
case JPABaseShape::JPAType_DirBillboard:
MTXIdentity(cb.mDrawMtx);
break;
case JPABaseShape::JPAType_YBillboard:
loadYBBMtx(cb.mDrawMtxPtr);
break;
default:
MTXCopy(cb.mDrawMtxPtr, cb.mDrawMtx);
break;
}
GXLoadPosMtxImm(cb.mDrawMtx, GX_PNMTX0);
JPABaseEmitter* emtr = dc.pbe;
f32 scaleX = emtr->mGlobalParticleScale.x;
f32 scaleY = emtr->mGlobalParticleScale.y;
if (!dc.pssp->isInheritedScale()) {
cb.mGlobalScaleX = 25.0f * dc.pssp->getScaleX() * scaleX;
cb.mGlobalScaleY = 25.0f * dc.pssp->getScaleY() * scaleY;
} else {
cb.mGlobalScaleX = 25.0f * dc.pbsp->getBaseSizeX() * scaleX;
cb.mGlobalScaleY = 25.0f * dc.pbsp->getBaseSizeY() * scaleY;
}
if (dc.pssp->getType() == JPABaseShape::JPAType_Point) {
cb.mGlobalScaleX *= 1.02f;
cb.mGlobalScaleY *= 1.02f;
} else if (dc.pssp->getType() == JPABaseShape::JPAType_Line) {
cb.mGlobalScaleX *= 1.02f;
cb.mGlobalScaleY *= 0.4f;
}
cb.mPivotX = cb.mPivotY = 0.0f;
cb.field_0x14[1].y = 0.0f;
cb.field_0x14[0].y = 0.0f;
cb.field_0x14[3].x = 0.0f;
cb.field_0x14[0].x = 0.0f;
cb.field_0x14[3].y = 1.0f;
cb.field_0x14[2].y = 1.0f;
cb.field_0x14[2].x = 1.0f;
cb.field_0x14[1].x = 1.0f;
cb.mDirTypeFunc = NULL;
cb.mRotTypeFunc = NULL;
cb.mBasePlaneTypeFunc = NULL;
if (dc.pssp->getType() == JPABaseShape::JPAType_Direction || dc.pssp->getType() == JPABaseShape::JPAType_DirectionCross || dc.pssp->getType() == JPABaseShape::JPAType_DirBillboard || dc.pssp->getType() == JPABaseShape::JPAType_Stripe || dc.pssp->getType() == JPABaseShape::JPAType_StripeCross) {
switch (dc.pssp->getDirType()) {
case 0: cb.mDirTypeFunc = dirTypeVel; break;
case 1: cb.mDirTypeFunc = dirTypePos; break;
case 2: cb.mDirTypeFunc = dirTypePosInv; break;
case 3: cb.mDirTypeFunc = dirTypeEmtrDir; break;
case 4: cb.mDirTypeFunc = dirTypePrevPtcl; break;
}
}
if (dc.pssp->getType() == JPABaseShape::JPAType_Direction || dc.pssp->getType() == JPABaseShape::JPAType_DirectionCross || dc.pssp->getType() == JPABaseShape::JPAType_Rotation || dc.pssp->getType() == JPABaseShape::JPAType_RotationCross) {
switch (dc.pssp->getRotType()) {
case 0: cb.mRotTypeFunc = rotTypeY; break;
case 1: cb.mRotTypeFunc = rotTypeX; break;
case 2: cb.mRotTypeFunc = rotTypeZ; break;
case 3: cb.mRotTypeFunc = rotTypeXYZ; break;
case 4: cb.mRotTypeFunc = rotTypeYJiggle; break;
}
}
if (dc.pssp->getType() == JPABaseShape::JPAType_Direction || dc.pssp->getType() == JPABaseShape::JPAType_Rotation) {
switch (dc.pssp->getBasePlaneType()) {
case 0: cb.mBasePlaneTypeFunc = basePlaneTypeXY; break;
case 1: cb.mBasePlaneTypeFunc = basePlaneTypeXZ; break;
}
}
}
/* 8026B938-8026BC2C .text drawParticle__7JPADrawFv */
void JPADraw::drawParticle() {
/* Nonmatching - regalloc */
field_0xc2 &= ~0x02;
setParticleClipBoard();
dc.mpActiveParticles = &dc.pbe->mActiveParticles;
GXSetPointSize(cb.mGlobalScaleX, GX_TO_ONE);
GXSetLineWidth(cb.mGlobalScaleX, GX_TO_ONE);
GXSetZMode(dc.pbsp->isEnableZCmp(), dc.pbsp->getZCmpFunction(), dc.pbsp->isEnableZCmpUpdate());
GXSetZCompLoc(dc.pbsp->getZCompLoc());
GXSetAlphaCompare(dc.pbsp->getAlphaCmpComp0(), dc.pbsp->getAlphaCmpRef0(), dc.pbsp->getAlphaCmpOp(), dc.pbsp->getAlphaCmpComp1(), dc.pbsp->getAlphaCmpRef1());
GXSetAlphaUpdate(dc.pbsp->isEnableAlphaUpdate());
GXSetColorUpdate(GX_TRUE);
GXSetCullMode(GX_CULL_NONE);
if (dc.pbsp->isClipOn()) {
GXSetClipMode(GX_CLIP_ENABLE);
GXSetMisc(1, 8);
} else {
GXSetClipMode(GX_CLIP_DISABLE);
}
for (s32 i = 0; i < execEmtrPVisNum; i++)
mpExecEmtrPVis[i]->exec(&dc);
JPABaseEmitter * emtr = dc.pbe;
if (dc.pbsp->getListOrder() == 0) {
for (JSULink<JPABaseParticle> * link = emtr->mActiveParticles.getFirst(); link != NULL; link = link->getNext()) {
JPABaseParticle * ptcl = (JPABaseParticle*)link->getObject();
for (s32 i = 0; i < execPtclVisNum; i++)
mpExecPtclVis[i]->exec(&dc, ptcl);
}
} else {
for (JSULink<JPABaseParticle> * link = emtr->mActiveParticles.getLast(); link != NULL; link = link->getPrev()) {
JPABaseParticle * ptcl = (JPABaseParticle*)link->getObject();
for (s32 i = 0; i < execPtclVisNum; i++)
mpExecPtclVis[i]->exec(&dc, ptcl);
}
}
GXSetMisc(1, 0);
}
/* 8026BC2C-8026BF88 .text drawChild__7JPADrawFv */
void JPADraw::drawChild() {
/* Nonmatching - regalloc */
field_0xc2 |= 0x02;
setChildClipBoard();
dc.mpActiveParticles = &dc.pbe->mChildParticles;
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_FALSE, GX_PTIDENTITY);
GXEnableTexOffsets(GX_TEXCOORD0, GX_TRUE, GX_TRUE);
if (dc.pbsp->textureIsEmpty()) {
dc.mpTextureResource->loadDefaultTexture(GX_TEXMAP0);
} else {
dc.mpTextureResource->load(dc.pTexIdx[dc.pssp->getTextureIndex()], GX_TEXMAP0);
}
GXSetZMode(dc.pbsp->isEnableZCmp(), dc.pbsp->getZCmpFunction(), dc.pbsp->isEnableZCmpUpdate());
GXSetZCompLoc(dc.pbsp->getZCompLoc());
GXSetAlphaCompare(dc.pbsp->getAlphaCmpComp0(), dc.pbsp->getAlphaCmpRef0(), dc.pbsp->getAlphaCmpOp(), dc.pbsp->getAlphaCmpComp1(), dc.pbsp->getAlphaCmpRef1());
GXSetAlphaUpdate(dc.pbsp->isEnableAlphaUpdate());
GXSetColorUpdate(GX_TRUE);
GXSetCullMode(GX_CULL_NONE);
if (dc.pssp->isClipOn()) {
GXSetClipMode(GX_CLIP_ENABLE);
GXSetMisc(1, 8);
} else {
GXSetClipMode(GX_CLIP_DISABLE);
}
for (s32 i = 0; i < execEmtrCVisNum; i++)
mpExecEmtrCVis[i]->exec(&dc);
JPABaseEmitter * emtr = dc.pbe;
if (dc.pbsp->getListOrder() == 0) {
for (JSULink<JPABaseParticle> * link = emtr->mChildParticles.getFirst(); link != NULL; link = link->getNext()) {
JPABaseParticle * ptcl = link->getObject();
for (s32 i = 0; i < execChldVisNum; i++)
mpExecChldVis[i]->exec(&dc, ptcl);
}
} else {
for (JSULink<JPABaseParticle> * link = emtr->mChildParticles.getLast(); link != NULL; link = link->getPrev()) {
JPABaseParticle * ptcl = link->getObject();
for (s32 i = 0; i < execChldVisNum; i++)
mpExecChldVis[i]->exec(&dc, ptcl);
}
}
GXSetMisc(1, 0);
}
/* 8026BF88-8026C024 .text zDraw__7JPADrawFv */
void JPADraw::zDraw() {
field_0xc2 |= 0x01;
if (dc.pbsp->getChildOrder() && dc.pssp != NULL)
zDrawChild();
zDrawParticle();
if (!dc.pbsp->getChildOrder() && dc.pssp != NULL)
zDrawChild();
}
/* 8026C024-8026C24C .text zDrawParticle__7JPADrawFv */
void JPADraw::zDrawParticle() {
/* Nonmatching - regalloc */
field_0xc2 &= ~0x02;
setParticleClipBoard();
dc.mpActiveParticles = &dc.pbe->mActiveParticles;
GXSetPointSize(cb.mGlobalScaleX, GX_TO_ONE);
GXSetLineWidth(cb.mGlobalScaleX, GX_TO_ONE);
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
GXSetZCompLoc(GX_FALSE);
GXSetAlphaCompare(GX_GEQUAL, dc.pbe->mGlobalPrmColor.a, GX_AOP_OR, GX_GEQUAL, dc.pbe->mGlobalPrmColor.a);
GXSetAlphaUpdate(GX_FALSE);
GXSetColorUpdate(GX_FALSE);
GXSetCullMode(GX_CULL_NONE);
if (dc.pbsp->isClipOn()) {
GXSetClipMode(GX_CLIP_ENABLE);
GXSetMisc(1, 8);
} else {
GXSetClipMode(GX_CLIP_DISABLE);
}
for (s32 i = 0; i < execEmtrPVisNum; i++)
mpExecEmtrPVis[i]->exec(&dc);
JPABaseEmitter * emtr = dc.pbe;
if (dc.pbsp->getListOrder() == 0) {
for (JSULink<JPABaseParticle> * link = emtr->mActiveParticles.getFirst(); link != NULL; link = link->getNext()) {
JPABaseParticle * ptcl = (JPABaseParticle*)link->getObject();
for (s32 i = 0; i < execPtclVisNum; i++)
mpExecPtclVis[i]->exec(&dc, ptcl);
}
} else {
for (JSULink<JPABaseParticle> * link = emtr->mActiveParticles.getLast(); link != NULL; link = link->getPrev()) {
JPABaseParticle * ptcl = (JPABaseParticle*)link->getObject();
for (s32 i = 0; i < execPtclVisNum; i++)
mpExecPtclVis[i]->exec(&dc, ptcl);
}
}
GXSetMisc(1, 0);
}
/* 8026C24C-8026C4DC .text zDrawChild__7JPADrawFv */
void JPADraw::zDrawChild() {
/* Nonmatching - regalloc */
field_0xc2 |= 0x02;
setChildClipBoard();
dc.mpActiveParticles = &dc.pbe->mChildParticles;
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_FALSE, GX_PTIDENTITY);
GXEnableTexOffsets(GX_TEXCOORD0, GX_TRUE, GX_TRUE);
if (dc.pbsp->textureIsEmpty()) {
dc.mpTextureResource->loadDefaultTexture(GX_TEXMAP0);
} else {
dc.mpTextureResource->load(dc.pTexIdx[dc.pssp->getTextureIndex()], GX_TEXMAP0);
}
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
GXSetZCompLoc(GX_FALSE);
GXSetAlphaCompare(GX_GEQUAL, dc.pbe->mGlobalPrmColor.a, GX_AOP_OR, GX_GEQUAL, dc.pbe->mGlobalPrmColor.a);
GXSetAlphaUpdate(GX_FALSE);
GXSetColorUpdate(GX_FALSE);
GXSetCullMode(GX_CULL_NONE);
if (dc.pssp->isClipOn()) {
GXSetClipMode(GX_CLIP_ENABLE);
GXSetMisc(1, 8);
} else {
GXSetClipMode(GX_CLIP_DISABLE);
}
for (s32 i = 0; i < execEmtrCVisNum; i++)
mpExecEmtrCVis[i]->exec(&dc);
JPABaseEmitter * emtr = dc.pbe;
if (dc.pbsp->getListOrder() == 0) {
for (JSULink<JPABaseParticle> * link = emtr->mChildParticles.getFirst(); link != NULL; link = link->getNext()) {
JPABaseParticle * ptcl = (JPABaseParticle*)link->getObject();
for (s32 i = 0; i < execChldVisNum; i++)
mpExecChldVis[i]->exec(&dc, ptcl);
}
} else {
for (JSULink<JPABaseParticle> * link = emtr->mChildParticles.getLast(); link != NULL; link = link->getPrev()) {
JPABaseParticle * ptcl = (JPABaseParticle*)link->getObject();
for (s32 i = 0; i < execChldVisNum; i++)
mpExecChldVis[i]->exec(&dc, ptcl);
}
}
GXSetMisc(1, 0);
}
/* 8026C4DC-8026C640 .text loadYBBMtx__7JPADrawFPA4_f */
void JPADraw::loadYBBMtx(MtxP mtx) {
/* Nonmatching */
JGeometry::TVec3<f32> v(0.0f, mtx[1][1], mtx[2][1]);
JUT_ASSERT(0x596, !v.isZero());
v.normalize();
cb.mDrawYBBMtx[0][0] = 1.0f;
cb.mDrawYBBMtx[0][1] = 0.0f;
cb.mDrawYBBMtx[0][2] = 0.0f;
cb.mDrawYBBMtx[0][3] = mtx[0][3];
cb.mDrawYBBMtx[1][0] = 0.0f;
cb.mDrawYBBMtx[1][1] = v.y;
cb.mDrawYBBMtx[1][2] = -v.z;
cb.mDrawYBBMtx[1][3] = mtx[1][3];
cb.mDrawYBBMtx[2][0] = 1.0f;
cb.mDrawYBBMtx[2][1] = v.z;
cb.mDrawYBBMtx[2][2] = v.y;
cb.mDrawYBBMtx[2][3] = mtx[2][3];
MTXIdentity(cb.mDrawMtx);
}