diff --git a/Runtime/Graphics/CCubeMaterial.cpp b/Runtime/Graphics/CCubeMaterial.cpp index 87535da6f..ae2788ffe 100644 --- a/Runtime/Graphics/CCubeMaterial.cpp +++ b/Runtime/Graphics/CCubeMaterial.cpp @@ -305,7 +305,7 @@ u32 CCubeMaterial::HandleColorChannels(u32 chanCount, u32 firstChan) { CGX::SetChanMatColor(CGX::EChannelId::Channel1, zeus::skWhite); auto chan0Lights = CGraphics::g_LightActive & ~CCubeModel::sChannel0DisableLightMask; - CGX::SetChanCtrl(CGX::EChannelId::Channel0, chan0Lights); // TODO use firstChan flags + CGX::SetChanCtrl(CGX::EChannelId::Channel0, firstChan, chan0Lights); CGX::SetChanCtrl(CGX::EChannelId::Channel1, CCubeModel::sChannel1EnableLightMask); if (chan0Lights.any()) { CGX::SetChanMatColor(CGX::EChannelId::Channel0, zeus::skWhite); @@ -326,8 +326,7 @@ u32 CCubeMaterial::HandleColorChannels(u32 chanCount, u32 firstChan) { if (chanCount == 0) { CGX::SetChanCtrl(CGX::EChannelId::Channel0, {}); } else { - // TODO use firstChan flags - CGX::SetChanCtrl(CGX::EChannelId::Channel0, CGraphics::g_LightActive); + CGX::SetChanCtrl(CGX::EChannelId::Channel0, firstChan, CGraphics::g_LightActive); if (CGraphics::g_LightActive.any()) { CGX::SetChanMatColor(CGX::EChannelId::Channel0, zeus::skWhite); } else { diff --git a/Runtime/Graphics/CGX.hpp b/Runtime/Graphics/CGX.hpp index 69faa94f1..e904f9262 100644 --- a/Runtime/Graphics/CGX.hpp +++ b/Runtime/Graphics/CGX.hpp @@ -159,6 +159,13 @@ static inline void SetChanCtrl(EChannelId id, GXBool enable, GX::ColorSrc ambSrc sGXState.x4c_dirtyChans = 7; // TODO } +// Flags with lights override +static inline void SetChanCtrl(EChannelId id, u32 flags, GX::LightMask lights) noexcept { + const auto idx = std::underlying_type_t(id); + sGXState.x34_chanCtrls[idx] = lights.any() ? (flags | lights.to_ulong() << 3) : (flags & 0xFFFFFFFE); + sGXState.x4c_dirtyChans = 7; // TODO +} + // Helper function for common logic static inline void SetChanCtrl(EChannelId id, GX::LightMask lights) noexcept { const bool hasLights = lights.any();