66#include " Graphics/CCubeSurface.hpp"
77#include " Graphics/CGX.hpp"
88#include " Graphics/CModel.hpp"
9+ #include " Logging.hpp"
910
1011namespace metaforce {
1112static u32 sReflectionType = 0 ;
@@ -307,16 +308,21 @@ void CCubeMaterial::EnsureViewDepStateCached(const CCubeSurface* surface) {
307308}
308309
309310u32 CCubeMaterial::HandleColorChannels (u32 chanCount, u32 firstChan) {
311+ static constexpr GXColor sGXBlack = {0 , 0 , 0 , 0 };
312+ static constexpr GXColor sGXWhite = {0xFF , 0xFF , 0xFF , 0xFF };
313+
310314 if (CCubeModel::sRenderModelShadow ) {
311315 if (chanCount != 0 ) {
312- CGX::SetChanAmbColor (CGX::EChannelId::Channel1, GX_BLACK);
313- CGX::SetChanMatColor (CGX::EChannelId::Channel1, GX_WHITE);
316+ CGX::SetChanAmbColor (CGX::EChannelId::Channel1, sGXBlack );
317+ CGX::SetChanMatColor (CGX::EChannelId::Channel1, sGXWhite );
318+
319+ CGX::SetChanCtrl (CGX::EChannelId::Channel1, true , GX_SRC_REG, GX_SRC_REG, CCubeModel::sChannel1EnableLightMask ,
320+ GX_DF_CLAMP, GX_AF_SPOT);
314321
315- auto chan0Lights = CGraphics::mLightActive & ~CCubeModel::sChannel0DisableLightMask ;
316- CGX::SetChanCtrl (CGX::EChannelId::Channel0, firstChan, chan0Lights);
317- CGX::SetChanCtrl (CGX::EChannelId::Channel1, CCubeModel::sChannel1EnableLightMask );
322+ const auto chan0Lights = CGraphics::GetLightMask () & ~CCubeModel::sChannel0DisableLightMask ;
323+ CGX::SetChanCtrl_Compressed (CGX::EChannelId::Channel0, chan0Lights, firstChan);
318324 if (chan0Lights.any ()) {
319- CGX::SetChanMatColor (CGX::EChannelId::Channel0, GX_WHITE );
325+ CGX::SetChanMatColor (CGX::EChannelId::Channel0, sGXWhite );
320326 } else {
321327 CGX::SetChanMatColor (CGX::EChannelId::Channel0, CGX::GetChanAmbColor (CGX::EChannelId::Channel0));
322328 }
@@ -325,21 +331,22 @@ u32 CCubeMaterial::HandleColorChannels(u32 chanCount, u32 firstChan) {
325331 }
326332
327333 if (chanCount == 2 ) {
328- CGX::SetChanAmbColor (CGX::EChannelId::Channel1, GX_BLACK );
329- CGX::SetChanMatColor (CGX::EChannelId::Channel1, GX_WHITE );
334+ CGX::SetChanAmbColor (CGX::EChannelId::Channel1, sGXBlack );
335+ CGX::SetChanMatColor (CGX::EChannelId::Channel1, sGXWhite );
330336 } else {
331- CGX::SetChanCtrl (CGX::EChannelId::Channel1, {} );
337+ CGX::SetChanCtrl (CGX::EChannelId::Channel1, false , GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE );
332338 }
333339
334- if (chanCount == 0 ) {
335- CGX::SetChanCtrl (CGX::EChannelId::Channel0, {});
336- } else {
337- CGX::SetChanCtrl (CGX::EChannelId::Channel0, firstChan, CGraphics::mLightActive );
338- if (CGraphics::mLightActive .any ()) {
339- CGX::SetChanMatColor (CGX::EChannelId::Channel0, GX_WHITE);
340+ if (chanCount >= 1 ) {
341+ const auto lightMask = CGraphics::GetLightMask ();
342+ CGX::SetChanCtrl_Compressed (CGX::EChannelId::Channel0, lightMask, firstChan);
343+ if (lightMask.any ()) {
344+ CGX::SetChanMatColor (CGX::EChannelId::Channel0, sGXWhite );
340345 } else {
341346 CGX::SetChanMatColor (CGX::EChannelId::Channel0, CGX::GetChanAmbColor (CGX::EChannelId::Channel0));
342347 }
348+ } else {
349+ CGX::SetChanCtrl (CGX::EChannelId::Channel0, false , GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
343350 }
344351
345352 return chanCount;
@@ -603,8 +610,29 @@ void CCubeMaterial::DoPassthru(u32 finalTevCount) {
603610}
604611
605612void CCubeMaterial::DoModelShadow (u32 texCount, u32 tcgCount) {
606- // CCubeModel::sShadowTexture->Load(texCount, EClampMode::One);
607- // TODO
613+ CCubeModel::sShadowTexture ->Load (static_cast <GXTexMapID>(texCount), EClampMode::Repeat);
614+ const auto & xf = CCubeModel::sTextureProjectionTransform ;
615+ Mtx mtx = {
616+ {xf.basis [0 ][0 ], xf.basis [1 ][0 ], xf.basis [2 ][0 ], xf.origin .x ()},
617+ {xf.basis [0 ][2 ], xf.basis [1 ][2 ], xf.basis [2 ][2 ], xf.origin .z ()},
618+ {0 .f , 0 .f , 0 .f , 1 .f },
619+ };
620+ GXLoadTexMtxImm (mtx, GX_TEXMTX5, GX_MTX3x4);
621+
622+ CGX::SetTexCoordGen (static_cast <GXTexCoordID>(tcgCount), GX_TG_MTX3x4, GX_TG_POS, GX_TEXMTX5, GX_FALSE,
623+ GX_PTIDENTITY);
624+ CGX::SetTevColorOp (GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG0);
625+ CGX::SetTevAlphaOp (GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG0);
626+ CGX::SetTevColorIn (GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_RASC, GX_CC_TEXC, GX_CC_ZERO);
627+ CGX::SetTevAlphaIn (GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_RASA);
628+ CGX::SetTevOrder (GX_TEVSTAGE0, static_cast <GXTexCoordID>(tcgCount), static_cast <GXTexMapID>(texCount), GX_COLOR1A1);
629+
630+ CGX::SetTevColorOp (GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG0);
631+ CGX::SetTevAlphaOp (GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG0);
632+ CGX::SetTevColorIn (GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_RASC, GX_CC_ONE, GX_CC_C0);
633+ CGX::SetTevAlphaIn (GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_RASA, GX_CA_KONST, GX_CA_A0);
634+ CGX::SetTevKAlphaSel (GX_TEVSTAGE1, GX_TEV_KASEL_1);
635+ CGX::SetTevOrder (GX_TEVSTAGE1, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
608636}
609637
610638static GXTevStageID sCurrentTevStage = GX_MAX_TEVSTAGE;
0 commit comments