From 3744bed5ed4cb8da6885dfdf060d5cf129b3430d Mon Sep 17 00:00:00 2001 From: Briggs Baltzell Date: Sun, 8 Feb 2026 00:00:05 -0600 Subject: [PATCH] Match `dMCloth_c::draw` implementation, refactor initialization of `field_0x10`, and update associated structure definitions. --- include/d/d_menu_cloth.h | 6 +- src/d/d_menu_cloth.cpp | 184 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 173 insertions(+), 17 deletions(-) diff --git a/include/d/d_menu_cloth.h b/include/d/d_menu_cloth.h index 862ba5dc7..b0296ba3a 100644 --- a/include/d/d_menu_cloth.h +++ b/include/d/d_menu_cloth.h @@ -79,13 +79,11 @@ public: public: /* 0x0004 */ cXyz field_0x4; - /* 0x0010 */ f32 field_0x10; - /* 0x0014 */ f32 field_0x14; - /* 0x0018 */ f32 field_0x18; + /* 0x0010 */ cXyz field_0x10; /* 0x001c */ csXyz field_0x1c; /* 0x0022 */ GXColorS10 field_0x22; /* 0x002a */ GXColorS10 field_0x2a; - /* 0x0032 */ u16 field_0x32; + /* 0x0032 */ s16 field_0x32; /* 0x0034 */ s16 field_0x34; /* 0x0036 */ s16 field_0x36; /* 0x0038 */ u16 field_0x38; diff --git a/src/d/d_menu_cloth.cpp b/src/d/d_menu_cloth.cpp index 7883b3378..389cdaabb 100644 --- a/src/d/d_menu_cloth.cpp +++ b/src/d/d_menu_cloth.cpp @@ -21,9 +21,7 @@ daCLOTH_HIO_c::daCLOTH_HIO_c() { { mChildren[0].field_0x4.set(1.78f, 1.78f, 1.0f); mChildren[0].field_0x1c.setall(0); - mChildren[0].field_0x10 = 360.0f; - mChildren[0].field_0x14 = 40.0f; - mChildren[0].field_0x18 = -2400.0f; + mChildren[0].field_0x10.set(360.0f, 40.0f, -2400.0f); mChildren[0].field_0x22.r = 0x78; mChildren[0].field_0x22.g = 0xA5; mChildren[0].field_0x22.b = 0x37; @@ -50,9 +48,7 @@ daCLOTH_HIO_c::daCLOTH_HIO_c() { { mChildren[1].field_0x4.set(1.27f, 0.93f, 1.0f); mChildren[1].field_0x1c.setall(0); - mChildren[1].field_0x10 = 350.0; - mChildren[1].field_0x14 = -15.0; - mChildren[1].field_0x18 = -2400.0; + mChildren[1].field_0x10.set(350.0f, -15.0f, -2400.0f); mChildren[1].field_0x22.r = 0xbe; mChildren[1].field_0x22.g = 0xb4; mChildren[1].field_0x22.b = 0x64; @@ -79,9 +75,7 @@ daCLOTH_HIO_c::daCLOTH_HIO_c() { { mChildren[2].field_0x4.set(1.7f, 1.7f, 1.0f); mChildren[2].field_0x1c.set(0, 0, 0x4000); - mChildren[2].field_0x10 = 360.0; - mChildren[2].field_0x14 = 40.0; - mChildren[2].field_0x18 = -2400.0; + mChildren[2].field_0x10.set(360.0f, 40.0f, -2400.0f); mChildren[2].field_0x22.r = 0xbe; mChildren[2].field_0x22.g = 0xb4; mChildren[2].field_0x22.b = 0x64; @@ -480,12 +474,176 @@ void dMCloth_c::ShadowTevSetting() { } /* 8019ADD4-8019B670 .text draw__9dMCloth_cFf8_GXColor8_GXColorUc */ -void dMCloth_c::draw(float, GXColor, GXColor, unsigned char) { - /* Nonmatching */ - // TODO +void dMCloth_c::draw(float, GXColor color1, GXColor color2, unsigned char) { + cXyz* pPos = getPos(); + cXyz* pPos2 = field_0x7c50; + for (int y = 0; y < INNER_SIZE; y++) { + for (int x = 0; x < INNER_SIZE; x++) { + *pPos2 = *pPos; + pPos2->z = -3300.0f; + pPos2++; + pPos++; + } + } + + DCStoreRangeNoSync(field_0x7c50, 0x5ac); + + color1 = field_0x915e; + color2 = field_0x9162; + + if (field_0xc == 1) { + color1.a = field_0xd; + if (field_0xd > 25) { + field_0xd -= 25; + } else { + field_0xd = 0; + } + } else { + f32 f = (f32)field_0xa / l_HIO.mChildren[mClothType].field_0x34; + { + s16 uv2 = l_HIO.mChildren[mClothType].field_0x22.a; + s16 uv6 = cLib_minMaxLimit(uv2, 0, 0xFF); + color1.a = uv6; + color1.a = color1.a * f + (1.0f - f) * l_HIO.mChildren[mClothType].field_0x32; + } + { + s16 uv2 = l_HIO.mChildren[mClothType].field_0x2a.a; + s16 uv6 = cLib_minMaxLimit(uv2, 0, 0xFF); + color2.a = uv6; + color2.a = color2.a * f + (1.0f - f) * l_HIO.mChildren[mClothType].field_0x32; + } + } + + j3dSys.reinitGX(); + GXSetNumIndStages(0); + cXyz lightPos; + lightPos.set(0.0f, 0.0f, 0.0f); + + switch (mClothType) { + case 0: + case 2: { + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX16); + GXSetVtxDesc(GX_VA_NRM, GX_INDEX16); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_CLR_RGB, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_F32, 0); + GXSetChanAmbColor(GX_COLOR0, (GXColor){0x00, 0x00, 0x00, 0x00}); + GXSetChanMatColor(GX_COLOR0, (GXColor){0xff, 0xff, 0xff, 0xff}); + } break; + case 1: { + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX16); + GXSetVtxDesc(GX_VA_NRM, GX_INDEX16); + GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_CLR_RGB, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_F32, 0); + GXSetChanAmbColor(GX_COLOR0, (GXColor){0x00, 0x00, 0x00, 0xff}); + GXSetChanMatColor(GX_COLOR0, (GXColor){0xff, 0xff, 0xff, 0xff}); + } break; + } + + GXSetTevColor(GX_TEVREG0, color1); + GXSetTevColor(GX_TEVREG1, color2); + + GXTexObj tex_obj; + + ResTIMG* i_toonimage = dDlst_list_c::getToonImage(); + +#if VERSION == VERSION_DEMO + GXBool mipmap = i_toonimage->mipmapCount > 1; +#endif + + GXInitTexObj( + &tex_obj, + (u8*)i_toonimage + i_toonimage->imageOffset, + i_toonimage->width, + i_toonimage->height, + (GXTexFmt)i_toonimage->format, + (GXTexWrapMode)i_toonimage->wrapS, + (GXTexWrapMode)i_toonimage->wrapT, +#if VERSION == VERSION_DEMO + mipmap +#else + i_toonimage->mipmapCount > 1 +#endif + ); + GXInitTexObjLOD( + &tex_obj, + (GXTexFilter)i_toonimage->minFilter, + (GXTexFilter)i_toonimage->magFilter, + i_toonimage->minLOD * 0.125f, + i_toonimage->maxLOD * 0.125f, + i_toonimage->LODBias * 0.01f, + i_toonimage->biasClamp, + i_toonimage->doEdgeLOD, + (GXAnisotropy)i_toonimage->maxAnisotropy + ); + + GXLoadTexObj(&mTexObj, GX_TEXMAP0); + GXLoadTexObj(&tex_obj, GX_TEXMAP1); + GXSetNumChans(1); GXCallDisplayList(l_matDL, 0x20); - // TODO + + lightSet1(lightPos); + + switch (mClothType) { + case 1: + case 2: { + mDoMtx_stack_c::transS( + l_HIO.mChildren[mClothType].field_0x10.x + -275.0f, + l_HIO.mChildren[mClothType].field_0x10.y - 75.0f, + l_HIO.mChildren[mClothType].field_0x10.z + -3800.0f + ); + mDoMtx_stack_c::XrotM(field_0x9158.x); + mDoMtx_stack_c::YrotM(field_0x9158.y); + mDoMtx_stack_c::ZrotM(field_0x9158.z); + mDoMtx_stack_c::scaleM(field_0x9140); + mDoMtx_stack_c::transM(0.0f, 0.0f, 3400.0f); + GXLoadPosMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0); + GXLoadNrmMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0); + GXSetCullMode(GX_CULL_FRONT); + GXSetCurrentMtx(GX_PNMTX0); + GXSetArray(GX_VA_POS, getPos(), sizeof(cXyz)); + GXSetArray(GX_VA_NRM, getNrm(), sizeof(cXyz)); + ShadowTevSetting(); + plot(0.0f, 0.0f, 10.0f, 10.0f); + } break; + } + + mDoMtx_stack_c::transS( + l_HIO.mChildren[mClothType].field_0x10.x + -350.0f, l_HIO.mChildren[mClothType].field_0x10.y, l_HIO.mChildren[mClothType].field_0x10.z + -3800.0f + ); + mDoMtx_stack_c::XrotM(field_0x9158.x); + mDoMtx_stack_c::YrotM(field_0x9158.y); + mDoMtx_stack_c::ZrotM(field_0x9158.z); + mDoMtx_stack_c::scaleM(field_0x9140); + mDoMtx_stack_c::transM(0.0f, 0.0f, 3400.0f); + GXLoadPosMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0); + GXLoadNrmMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0); + GXSetCullMode(GX_CULL_FRONT); + GXSetCurrentMtx(GX_PNMTX0); + GXSetArray(GX_VA_POS, getPos(), sizeof(cXyz)); + GXSetArray(GX_VA_NRM, getNrm(), sizeof(cXyz)); + TevSetting(); + plot(0.0f, 0.0f, 10.0f, 10.0f); + + GXSetCullMode(GX_CULL_BACK); + ShadowTevSetting(); + GXSetArray(GX_VA_POS, field_0x7c50, sizeof(cXyz)); + plot_shadow(0.0f, 0.0f, 10.0f, 10.0f); + + TevSetting(); + GXSetArray(GX_VA_POS, getPos(), sizeof(cXyz)); + GXSetArray(GX_VA_NRM, getBackNrm(), sizeof(cXyz)); + plot(0.0f, 0.0f, 10.0f, 10.0f); + + j3dSys.reinitGX(); } /* 8019B670-8019B9C0 .text cloth_move_sin__9dMCloth_cFv */