Files
Petari/source/Game/MapObj/BigBubbleDrawer.cpp

92 lines
3.7 KiB
C++

#include "Game/MapObj/BigBubbleDrawer.hpp"
BigBubbleDrawer::BigBubbleDrawer() {
mBubbleTexture = nullptr;
mRainbowTexture = nullptr;
_8 = 0.0f;
mBubbleTexture = new JUTTexture(MR::loadTexFromArc("BigBubble.arc", "Bubble.bti"), 0);
mRainbowTexture = new JUTTexture(MR::loadTexFromArc("BigBubble.arc", "Rainbow.bti"), 0);
}
void BigBubbleDrawer::setUpDraw() const {
setUpMaterial();
}
void BigBubbleDrawer::setUpVertexFormat() const {
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_POS_XY, GX_F32, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_POS_XYZ, GX_F32, 0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_NRM, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
}
void BigBubbleDrawer::setUpTexture() const {
GXSetNumTexGens(2);
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x1E, 0, 0x7D);
GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX3x4, GX_TG_NRM, 0x21, 0, 0x7D);
TMtx34f mtx;
mtx.identity();
GXLoadTexMtxImm(mtx.toMtxPtr(), 0x1E, GX_MTX2x4);
const MtxPtr cameraMtx = MR::getCameraViewMtx();
mtx.setInline(cameraMtx);
mtx.mMtx[0][3] = sEnvMatTrans.x;
mtx.mMtx[1][3] = sEnvMatTrans.y;
mtx.mMtx[2][3] = sEnvMatTrans.z;
GXLoadTexMtxImm(mtx.toMtxPtr(), 0x21, GX_MTX3x4);
mRainbowTexture->load(GX_TEXMAP0);
mBubbleTexture->load(GX_TEXMAP1);
}
void BigBubbleDrawer::setUpTevStage() const {
GXSetNumTevStages(3);
GXSetTevColor(GX_TEVREG0, (GXColor&)sTevColor0);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_TEXC, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 0, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_TEXA, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 0, GX_TEVPREV);
GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL);
GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_C0, GX_CC_TEXA, GX_CC_CPREV);
GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_TEXA, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 0, GX_TEVPREV);
GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_CPREV, GX_CC_C1, GX_CC_A1, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
GXSetTevKAlphaSel(GX_TEVSTAGE2, GX_TEV_KASEL_7_8);
GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_APREV, GX_CA_KONST, GX_CA_A1, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 0, GX_TEVPREV);
}
void BigBubbleDrawer::setUpPixelFormat() const {
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
GXSetColorUpdate(1);
GXSetAlphaUpdate(0);
GXSetCoPlanar(0);
GXSetZMode(1, GX_LEQUAL, 0);
GXSetZCompLoc(0);
GXSetCullMode(GX_CULL_BACK);
GXSetClipMode(GX_CLIP_ENABLE);
}
void BigBubbleDrawer::setUpMaterial() const {
setUpVertexFormat();
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, 0, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE);
GXSetChanCtrl(GX_COLOR1A1, 0, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE);
setUpTexture();
setUpTevStage();
setUpPixelFormat();
GXLoadPosMtxImm(MR::getCameraViewMtx(), 0);
Mtx normalMtx;
PSMTXIdentity(normalMtx);
GXLoadNrmMtxImm(normalMtx, 0);
GXSetCurrentMtx(0);
MR::loadProjectionMtx();
}