diff --git a/Resource/CMaterial.cpp b/Resource/CMaterial.cpp index 7741fa92..cfcb8dfc 100644 --- a/Resource/CMaterial.cpp +++ b/Resource/CMaterial.cpp @@ -146,11 +146,22 @@ bool CMaterial::SetCurrent(ERenderOptions Options) for (u32 iPass = 0; iPass < mPasses.size(); iPass++) mPasses[iPass]->SetAnimCurrent(Options, iPass); - CGraphics::UpdateVertexBlock(); - CGraphics::UpdatePixelBlock(); sCurrentMaterial = HashParameters(); } + // If the passes are otherwise the same, update UV anims that use the model matrix + else + { + for (u32 iPass = 0; iPass < mPasses.size(); iPass++) + { + EUVAnimMode mode = mPasses[iPass]->AnimMode(); + + if ((mode == eInverseMV) || (mode == eInverseMVTranslated) || + (mode == eModelMatrix) || (mode == eSimpleMode)) + mPasses[iPass]->SetAnimCurrent(Options, iPass); + } + } + // Bind textures CShader *pShader = CShader::CurrentShader(); @@ -164,6 +175,11 @@ bool CMaterial::SetCurrent(ERenderOptions Options) // Bind num lights GLuint NumLightsLoc = pShader->GetUniformLocation("NumLights"); glUniform1i(NumLightsLoc, CGraphics::sNumLights); + + // Update shader blocks + CGraphics::UpdateVertexBlock(); + CGraphics::UpdatePixelBlock(); + return true; } diff --git a/Scene/CScriptNode.cpp b/Scene/CScriptNode.cpp index 291386da..1cb124b9 100644 --- a/Scene/CScriptNode.cpp +++ b/Scene/CScriptNode.cpp @@ -115,26 +115,29 @@ void CScriptNode::Draw(ERenderOptions Options) { if (!mpInstance) return; - if (!mpActiveModel) - { - glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ZERO, GL_ZERO); - glDepthMask(GL_TRUE); - - LoadModelMatrix(); - CGraphics::SetDefaultLighting(); - CGraphics::UpdateLightBlock(); - CDrawUtil::DrawShadedCube(CColor::skTransparentPurple); - return; - } + // Set lighting + LoadModelMatrix(); + LoadLights(); if (CGraphics::sLightMode == CGraphics::WorldLighting) CGraphics::sVertexBlock.COLOR0_Amb = CGraphics::sAreaAmbientColor.ToVector4f() * CGraphics::sWorldLightMultiplier; else CGraphics::sVertexBlock.COLOR0_Amb = CGraphics::skDefaultAmbientColor.ToVector4f(); - LoadModelMatrix(); - LoadLights(); + // Default to drawing purple box if no model + if (!mpActiveModel) + { + glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ZERO, GL_ZERO); + glDepthMask(GL_TRUE); + LoadModelMatrix(); + CGraphics::UpdateVertexBlock(); + CGraphics::UpdateLightBlock(); + CDrawUtil::DrawShadedCube(CColor::skTransparentPurple); + return; + } + + // Set tev color (used rarely) CGraphics::sPixelBlock.TevColor = mpInstance->GetTevColor().ToVector4f(); mpActiveModel->Draw(Options, 0);