From 3b1c9e9b41b6819df00037c666e6d2da2eacfe6a Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sun, 15 Oct 2023 19:56:46 -0700 Subject: [PATCH] d_drawlist work --- include/d/d_drawlist.h | 32 +++- include/m_Do/m_Do_lib.h | 3 +- src/d/d_drawlist.cpp | 326 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 331 insertions(+), 30 deletions(-) diff --git a/include/d/d_drawlist.h b/include/d/d_drawlist.h index 875735ab5..e8492e9c4 100644 --- a/include/d/d_drawlist.h +++ b/include/d/d_drawlist.h @@ -66,6 +66,26 @@ public: void setScale(f32, f32); void setScroll(int, s16, s16); virtual void draw(); + +public: + struct TexEntry { + /* 0x00 */ GXTexObj mTexObj; + /* 0x20 */ GXTlutObj mTlutObj; + /* 0x2C */ s16 mScrollX; + /* 0x2E */ s16 mScrollY; + /* 0x30 */ u8 mbHasTlut; + /* 0x31 */ u8 pad[3]; + }; + + /* 0x04 */ s16 mX0; + /* 0x06 */ s16 mY0; + /* 0x08 */ s16 mX1; + /* 0x0A */ s16 mY1; + /* 0x0C */ f32 mScaleX; + /* 0x10 */ f32 mScaleY; + /* 0x14 */ GXColor mC0; + /* 0x18 */ GXColor mC1; + /* 0x1C */ TexEntry mTex[2]; }; class dDlst_2DMt_c : public dDlst_base_c { @@ -173,7 +193,10 @@ public: u32 set2(u32, s8, J3DModel*, cXyz*, f32, f32, dKy_tevstr_c*); bool add(J3DModel*); void init(); - ~dDlst_shadowReal_c() {} + ~dDlst_shadowReal_c() { + delete mpTexData; + delete mpDrawBuffer; + } dDlst_shadowReal_c() { mState = 0; } bool isNoUse() { return mState == 0; } @@ -251,6 +274,11 @@ public: ~dDlst_alphaModelData_c(); void set(u8, Mtx, u8); void draw(Mtx); + +public: + /* 0x00 */ u8 mType; + /* 0x01 */ u8 mAlpha; + /* 0x04 */ MtxP mpMtx; }; struct dDlst_alphaModel_c { @@ -267,7 +295,7 @@ public: dDlst_alphaModel_c(); static dDlst_alphaModel_c * create(int); BOOL set(u8 type, Mtx mtx, u8 alpha); - void draw(MtxP); + BOOL draw(Mtx); s32 getNum() { return mNum; } public: diff --git a/include/m_Do/m_Do_lib.h b/include/m_Do/m_Do_lib.h index 171e9b5c1..0a397ee14 100644 --- a/include/m_Do/m_Do_lib.h +++ b/include/m_Do/m_Do_lib.h @@ -40,8 +40,7 @@ struct mDoLib_clipper { }; void mDoLib_project(Vec* src, Vec* dst); -u8 mDoLib_setResTimgObj(ResTIMG const* res, GXTexObj* o_texObj, u32 tlut_name, - GXTlutObj* o_tlutObj); +u8 mDoLib_setResTimgObj(ResTIMG* res, GXTexObj* o_texObj, u32 tlut_name, GXTlutObj* o_tlutObj); void mDoLib_pos2camera(Vec* src, Vec* dst); #endif /* M_DO_M_DO_LIB_H */ diff --git a/src/d/d_drawlist.cpp b/src/d/d_drawlist.cpp index 6aa97874a..ffd3901ad 100644 --- a/src/d/d_drawlist.cpp +++ b/src/d/d_drawlist.cpp @@ -5,6 +5,8 @@ #include "d/d_drawlist.h" #include "d/d_com_inf_game.h" +#include "m_Do/m_Do_lib.h" +#include "m_Do/m_Do_mtx.h" #include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JUtility/JUTAssert.h" #include "SSystem/SComponent/c_rnd.h" @@ -59,28 +61,112 @@ void dDlst_2DM_c::draw() { } /* 800817CC-80081850 .text init__11dDlst_2Dm_cFP7ResTIMGP7ResTIMGff */ -void dDlst_2Dm_c::init(ResTIMG*, ResTIMG*, f32, f32) { - /* Nonmatching */ +void dDlst_2Dm_c::init(ResTIMG* t0, ResTIMG* t1, f32 sx, f32 sy) { + mTex[0].mbHasTlut = mDoLib_setResTimgObj(t0, &mTex[0].mTexObj, 0, &mTex[0].mTlutObj); + mTex[1].mbHasTlut = mDoLib_setResTimgObj(t1, &mTex[1].mTexObj, 1, &mTex[1].mTlutObj); + mScaleX = sx; + mScaleY = sy; } /* 80081850-80081864 .text setPos__11dDlst_2Dm_cFssss */ -void dDlst_2Dm_c::setPos(s16, s16, s16, s16) { - /* Nonmatching */ +void dDlst_2Dm_c::setPos(s16 x0, s16 y0, s16 x1, s16 y1) { + mX0 = x0; + mY0 = y0; + mX1 = x1; + mY1 = y1; } /* 80081864-80081870 .text setScale__11dDlst_2Dm_cFff */ -void dDlst_2Dm_c::setScale(f32, f32) { - /* Nonmatching */ +void dDlst_2Dm_c::setScale(f32 sx, f32 sy) { + mScaleX = sx; + mScaleY = sy; } /* 80081870-80081888 .text setScroll__11dDlst_2Dm_cFiss */ -void dDlst_2Dm_c::setScroll(int, s16, s16) { - /* Nonmatching */ +void dDlst_2Dm_c::setScroll(int idx, s16 x, s16 y) { + TexEntry * pTex = &mTex[idx]; + pTex->mScrollX = x; + pTex->mScrollY = y; } /* 80081888-80081DA4 .text draw__11dDlst_2Dm_cFv */ void dDlst_2Dm_c::draw() { - /* Nonmatching */ + /* Nonmatching - scroll math isn't right */ + + GXVtxAttrFmtList fmtList[GX_VA_MAX_ATTR + 1]; + + s16 tex0_s0 = mTex[0].mScrollX; + s16 tex0_s1 = (tex0_s0 + 256.0f); + s16 tex0_t0 = mTex[0].mScrollY; + s16 tex0_t1 = (tex0_t0 + 256.0f); + + s16 tex1_s0 = mTex[1].mScrollX; + s16 tex1_s1 = (tex1_s0 + 256.0f); + s16 tex1_t0 = mTex[1].mScrollY; + s16 tex1_t1 = (tex1_t0 + 256.0f); + + GXGetVtxAttrFmtv(GX_VTXFMT0, fmtList); + + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S16, 8); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_TEX_ST, GX_S16, 8); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX1, GX_DIRECT); + GXLoadTexObj(&this->mTex[0].mTexObj, GX_TEXMAP0); + if (this->mTex[0].mbHasTlut) + GXLoadTlut(&this->mTex[0].mTlutObj, GXGetTexObjTlut(&mTex[0].mTexObj)); + GXLoadTexObj(&this->mTex[1].mTexObj, GX_TEXMAP1); + if (this->mTex[1].mbHasTlut != 0) + GXLoadTlut(&this->mTex[1].mTlutObj, GXGetTexObjTlut(&mTex[1].mTexObj)); + + GXSetNumChans(0); + GXSetTevColor(GX_TEVREG0, mC0); + GXSetTevColor(GX_TEVREG1, mC1); + + GXSetNumTexGens(2); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_FALSE, GX_PTIDENTITY); + GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, GX_IDENTITY, GX_FALSE, GX_PTIDENTITY); + + GXSetNumTevStages(2); + + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_A1, GX_CA_A0, GX_CA_TEXA, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXC, GX_CC_CPREV, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_TEXA, GX_CA_APREV, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + + GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_SET); + GXLoadPosMtxImm(mDoMtx_getIdentity(), GX_PNMTX0); + GXSetCurrentMtx(GX_PNMTX0); + + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition3f32(mX0, mY0, 0.0f); + GXTexCoord2s16(tex0_s0, tex0_t0); + GXTexCoord2s16(tex1_s0, tex1_t0); + + GXPosition3f32(mX1, mY0, 0.0f); + GXTexCoord2s16(tex0_s1, tex0_t0); + GXTexCoord2s16(tex1_s1, tex1_t0); + + GXPosition3f32(mX1, mY1, 0.0f); + GXTexCoord2s16(tex0_s1, tex0_t1); + GXTexCoord2s16(tex1_s1, tex1_t1); + + GXPosition3f32(mX0, mY1, 0.0f); + GXTexCoord2s16(tex0_s0, tex0_t1); + GXTexCoord2s16(tex1_s0, tex1_t1); + GXEnd(); + + GXSetVtxAttrFmtv(GX_VTXFMT0, fmtList); } /* 80081DA4-80082130 .text draw__12dDlst_2DMt_cFv */ @@ -113,23 +199,165 @@ void dDlst_effectLine_c::update(cXyz&, _GXColor&, u16, u16, u16, u16, f32, f32, } /* 80082828-80082838 .text set__22dDlst_alphaModelData_cFUcPA4_fUc */ -void dDlst_alphaModelData_c::set(u8, Mtx, u8) { - /* Nonmatching */ +void dDlst_alphaModelData_c::set(u8 type, Mtx mtx, u8 alpha) { + mType = type; + mpMtx = mtx; + mAlpha = alpha; } +extern void GFLoadPosMtxImm(MtxP, GXPosNrmMtx); +extern void GFSetCurrentMtx(u32, u32, u32, u32, u32, u32, u32, u32, u32); +extern void GFSetChanMatColor(GXChannelID, GXColor); +extern void GFSetVtxDescv(GXVtxDescList*); +extern void GFSetVtxAttrFmtv(GXVtxFmt, GXVtxAttrFmtList*); +extern void GFSetBlendModeEtc(GXBlendMode, GXBlendFactor, GXBlendFactor, GXLogicOp, u8, u8, u8); +extern void GFSetArray(GXAttr, void*, u8); + +char l_backRevZMat[0x40] = {}; +char l_frontZMat[0x20] = {}; +char l_frontNoZSubMat[0x20] = {}; + +Vec l_bonboriPos[0x2a] = {}; +char l_bonboriDL[0xa0] = {}; + +Vec l_beam_checkPos[0x10] = {}; +char l_beam_checkDL[0xe0] = {}; + +Vec l_cubePos[0x10] = {}; +char l_cubeDL[0xe0] = {}; + +Vec l_bonbori2Pos[0x2a] = {}; +char l_bonbori2DL[0xa0] = {}; + /* 80082838-80082E44 .text draw__22dDlst_alphaModelData_cFPA4_f */ -void dDlst_alphaModelData_c::draw(Mtx) { - /* Nonmatching */ +void dDlst_alphaModelData_c::draw(Mtx viewMtx) { + /* Nonmatching - color and data order */ + Mtx mtx; + MTXConcat(viewMtx, mpMtx, mtx); + GFLoadPosMtxImm(mtx, GX_PNMTX0); + GFSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + + GXColor color = { 0, 0, 0, 0 }; + color.a = mAlpha; + GFSetChanMatColor(GX_ALPHA0, color); + + if (mType == 0) { + /* Bonbori */ + GFSetArray(GX_VA_POS, l_bonboriPos, sizeof(*l_bonboriPos)); + GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + } else if (mType == 1) { + /* Bonborix2 */ + GFSetArray(GX_VA_POS, l_bonboriPos, sizeof(*l_bonboriPos)); + Mtx tmp; + MTXScale(tmp, 0.8f, 0.8f, 0.8f); + MTXConcat(mtx, tmp, tmp); + GFLoadPosMtxImm(tmp, GX_PNMTX1); + + GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + + GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); + GFSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + + GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); + GFSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + } else if (mType == 5) { + /* Bonborix3 */ + GFSetArray(GX_VA_POS, l_bonboriPos, sizeof(*l_bonboriPos)); + Mtx tmp; + MTXScale(tmp, 0.8f, 0.8f, 0.8f); + MTXConcat(mtx, tmp, tmp); + GFLoadPosMtxImm(tmp, GX_PNMTX1); + + MTXScale(tmp, 0.6f, 0.6f, 0.6f); + MTXConcat(mtx, tmp, tmp); + GFLoadPosMtxImm(tmp, GX_PNMTX2); + + GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GFSetCurrentMtx(GX_PNMTX2, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + + GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); + GFSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GFSetCurrentMtx(GX_PNMTX2, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + + GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); + GFSetCurrentMtx(GX_PNMTX0, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GFSetCurrentMtx(GX_PNMTX1, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + GFSetCurrentMtx(GX_PNMTX2, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY, GX_IDENTITY); + GXCallDisplayList(l_bonboriDL, sizeof(l_bonboriDL)); + } else if (mType == 2) { + /* BeamCheck */ + GFSetArray(GX_VA_POS, l_beam_checkPos, sizeof(*l_beam_checkPos)); + GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); + GXCallDisplayList(l_beam_checkDL, sizeof(l_beam_checkDL)); + GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); + GXCallDisplayList(l_beam_checkDL, sizeof(l_beam_checkDL)); + GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); + GXCallDisplayList(l_beam_checkDL, sizeof(l_beam_checkDL)); + } else if (mType == 3) { + /* Cube */ + /* BeamCheck */ + GFSetArray(GX_VA_POS, l_cubePos, sizeof(*l_cubePos)); + GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); + GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); + GXCallDisplayList(l_cubeDL, sizeof(l_cubeDL)); + } else if (mType == 4) { + /* Bonbori2 */ + GFSetArray(GX_VA_POS, l_bonbori2Pos, sizeof(*l_bonbori2Pos)); + GXCallDisplayList(l_backRevZMat, sizeof(l_backRevZMat)); + GXCallDisplayList(l_bonbori2DL, sizeof(l_bonbori2DL)); + GXCallDisplayList(l_frontZMat, sizeof(l_frontZMat)); + GXCallDisplayList(l_bonbori2DL, sizeof(l_bonbori2DL)); + GXCallDisplayList(l_frontNoZSubMat, sizeof(l_frontNoZSubMat)); + GXCallDisplayList(l_bonbori2DL, sizeof(l_bonbori2DL)); + } } /* 80082E44-80082E58 .text __ct__18dDlst_alphaModel_cFv */ dDlst_alphaModel_c::dDlst_alphaModel_c() { - /* Nonmatching */ + mCapacity = 0; + mpData = NULL; + mNum = 0; } /* 80082E58-80082EFC .text create__18dDlst_alphaModel_cFi */ -dDlst_alphaModel_c * dDlst_alphaModel_c::create(int) { - /* Nonmatching */ +dDlst_alphaModel_c * dDlst_alphaModel_c::create(int num) { + dDlst_alphaModel_c * i_this = new dDlst_alphaModel_c(); + if (i_this != NULL) { + dDlst_alphaModelData_c * pData = new dDlst_alphaModelData_c[num]; + if (pData != NULL) { + i_this->mpData = pData; + i_this->mCapacity = num; + return i_this; + } + + if (i_this != NULL) + delete i_this; + } + return NULL; } /* 80082EFC-80082F38 .text __dt__22dDlst_alphaModelData_cFv */ @@ -148,8 +376,29 @@ BOOL dDlst_alphaModel_c::set(u8 type, Mtx mtx, u8 alpha) { } /* 80082F9C-80083064 .text draw__18dDlst_alphaModel_cFPA4_f */ -void dDlst_alphaModel_c::draw(Mtx) { - /* Nonmatching */ +BOOL dDlst_alphaModel_c::draw(Mtx mtx) { + if (mNum == 0) + return FALSE; + + static char l_matDL[0x60] = {}; + + static GXVtxDescList l_vtxDescList[2] = { + }; + + static GXVtxAttrFmtList l_vtxAttrFmtList[2] = { + }; + + GXCallDisplayList(l_matDL, sizeof(l_matDL)); + GFSetVtxDescv(l_vtxDescList); + GFSetVtxAttrFmtv(GX_VTXFMT0, l_vtxAttrFmtList); + GXSetClipMode(GX_CLIP_ENABLE); + + dDlst_alphaModelData_c * pData = &mpData[0]; + for (s32 i = 0; i < mNum; pData++, i++) + pData->draw(mtx); + + GFSetBlendModeEtc(GX_BM_NONE, GX_BL_ZERO, GX_BL_ZERO, GX_LO_CLEAR, 1, 0, 1); + return TRUE; } /* 80083064-800832C4 .text draw__22dDlst_alphaModelPacketFv */ @@ -265,17 +514,36 @@ void dDlst_shadowSimple_c::set(cXyz*, f32, f32, cXyz*, s16, f32, _GXTexObj*) { /* 80084D48-80084D94 .text init__21dDlst_shadowControl_cFv */ void dDlst_shadowControl_c::init() { - /* Nonmatching */ + dDlst_shadowReal_c * pReal = &mReal[0]; + for (s32 i = 0; i < (s32)ARRAY_SIZE(mReal); i++, pReal++) + pReal->init(); } /* 80084D94-80084DEC .text reset__21dDlst_shadowControl_cFv */ void dDlst_shadowControl_c::reset() { - /* Nonmatching */ + dDlst_shadowReal_c * pReal = &mReal[0]; + for (s32 i = 0; i < (s32)ARRAY_SIZE(mReal); i++, pReal++) + pReal->reset(); + mSimpleNum = 0; } /* 80084DEC-80084EF0 .text imageDraw__21dDlst_shadowControl_cFPA4_f */ -void dDlst_shadowControl_c::imageDraw(Mtx) { - /* Nonmatching */ +void dDlst_shadowControl_c::imageDraw(Mtx mtx) { + static char l_matDL[0x80] = {}; + + GXSetViewport(0.0f, 0.0f, 256.0f, 256.0f, 0.0f, 1.0f); + GXSetScissor(0, 0, 0x100, 0x100); + GXCallDisplayList(l_matDL, sizeof(l_matDL)); + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); + GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_CLEAR); + GXSetClipMode(GX_CLIP_DISABLE); + GXSetTexCopySrc(0, 0, 256, 256); + GXSetTexCopyDst(128, 128, GX_TF_I4, GX_TRUE); + j3dSys.setDrawModeOpaTexEdge(); + dDlst_shadowReal_c * pReal = &mReal[0]; + for (s32 i = 0; i < (s32)ARRAY_SIZE(mReal); i++, pReal++) + pReal->imageDraw(mtx); + GXSetClipMode(GX_CLIP_ENABLE); } /* 80084EF0-800850D4 .text draw__21dDlst_shadowControl_cFPA4_f */ @@ -303,9 +571,12 @@ int dDlst_shadowControl_c::setSimple(cXyz*, f32, f32, cXyz*, s16, f32, _GXTexObj /* Nonmatching */ } +GXTexObj dDlst_shadowControl_c::mSimpleTexObj; + /* 800852D8-80085348 .text setSimpleTex__21dDlst_shadowControl_cFPv */ -void dDlst_shadowControl_c::setSimpleTex(void*) { - /* Nonmatching */ +void dDlst_shadowControl_c::setSimpleTex(void* pImg) { + GXInitTexObj(&mSimpleTexObj, pImg, 128, 128, GX_TF_I4, GX_CLAMP, GX_CLAMP, GX_FALSE); + GXInitTexObjLOD(&mSimpleTexObj, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1); } /* 80085348-800855B4 .text draw__18dDlst_mirrorPacketFv */ @@ -314,8 +585,11 @@ void dDlst_mirrorPacket::draw() { } /* 800855B4-80085624 .text init__18dDlst_mirrorPacketFP7ResTIMG */ -void dDlst_mirrorPacket::init(ResTIMG*) { - /* Nonmatching */ +void dDlst_mirrorPacket::init(ResTIMG* pImg) { + if (pImg == NULL) + pImg = (ResTIMG*) dComIfG_getObjectRes("Always", ALWAYS_BTI_SHMREF); + + mDoLib_setResTimgObj(pImg, &mTexObj, 0, NULL); } /* 80085624-80085808 .text mirrorPolygonCheck__FP4cXyzP4cXyzfP18dDlst_shadowPoly_c */