CCubeMaterial: Set color channel flags from material

This commit is contained in:
Luke Street 2022-03-15 00:04:28 -04:00
parent b403edb804
commit bbdad137af
2 changed files with 9 additions and 3 deletions

View File

@ -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 {

View File

@ -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<EChannelId>(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();