Commit e1675c83 authored by nadro's avatar nadro

- Moved setBasicRenderStates methods calls in shader based material renderers...

- Moved setBasicRenderStates methods calls in shader based material renderers to the same place as in standard fixed pipeline material renderers (first lines of OnSetMaterial method).
- Fixed bug with texture states in OpenGL.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4561 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 5cfeba46
...@@ -112,6 +112,8 @@ bool CD3D8ShaderMaterialRenderer::OnRender(IMaterialRendererServices* service, E ...@@ -112,6 +112,8 @@ bool CD3D8ShaderMaterialRenderer::OnRender(IMaterialRendererServices* service, E
void CD3D8ShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material, const video::SMaterial& lastMaterial, void CD3D8ShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material, const video::SMaterial& lastMaterial,
bool resetAllRenderstates, video::IMaterialRendererServices* services) bool resetAllRenderstates, video::IMaterialRendererServices* services)
{ {
services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
{ {
if (VertexShader) if (VertexShader)
...@@ -135,13 +137,10 @@ void CD3D8ShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material ...@@ -135,13 +137,10 @@ void CD3D8ShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material
if (BaseMaterial) if (BaseMaterial)
BaseMaterial->OnSetMaterial(material, material, true, services); BaseMaterial->OnSetMaterial(material, material, true, services);
}
//let callback know used material
if (CallBack) if (CallBack)
CallBack->OnSetMaterial(material); CallBack->OnSetMaterial(material);
}
services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
} }
void CD3D8ShaderMaterialRenderer::OnUnsetMaterial() void CD3D8ShaderMaterialRenderer::OnUnsetMaterial()
......
...@@ -75,6 +75,8 @@ bool CD3D9CgMaterialRenderer::isTransparent() const ...@@ -75,6 +75,8 @@ bool CD3D9CgMaterialRenderer::isTransparent() const
void CD3D9CgMaterialRenderer::OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates, IMaterialRendererServices* services) void CD3D9CgMaterialRenderer::OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, bool resetAllRenderstates, IMaterialRendererServices* services)
{ {
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
Material = material; Material = material;
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
...@@ -85,17 +87,12 @@ void CD3D9CgMaterialRenderer::OnSetMaterial(const SMaterial& material, const SMa ...@@ -85,17 +87,12 @@ void CD3D9CgMaterialRenderer::OnSetMaterial(const SMaterial& material, const SMa
if (FragmentProgram) if (FragmentProgram)
cgD3D9BindProgram(FragmentProgram); cgD3D9BindProgram(FragmentProgram);
/*if (GeometryProgram)
cgD3D9BindProgram(GeometryProgram);*/
if (BaseMaterial) if (BaseMaterial)
BaseMaterial->OnSetMaterial(material, material, true, this); BaseMaterial->OnSetMaterial(material, material, true, this);
}
if (CallBack) if (CallBack)
CallBack->OnSetMaterial(material); CallBack->OnSetMaterial(material);
}
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
} }
bool CD3D9CgMaterialRenderer::OnRender(IMaterialRendererServices* services, E_VERTEX_TYPE vtxtype) bool CD3D9CgMaterialRenderer::OnRender(IMaterialRendererServices* services, E_VERTEX_TYPE vtxtype)
......
...@@ -112,6 +112,8 @@ bool CD3D9ShaderMaterialRenderer::OnRender(IMaterialRendererServices* service, E ...@@ -112,6 +112,8 @@ bool CD3D9ShaderMaterialRenderer::OnRender(IMaterialRendererServices* service, E
void CD3D9ShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material, const video::SMaterial& lastMaterial, void CD3D9ShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material, const video::SMaterial& lastMaterial,
bool resetAllRenderstates, video::IMaterialRendererServices* services) bool resetAllRenderstates, video::IMaterialRendererServices* services)
{ {
services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
{ {
if (VertexShader) if (VertexShader)
...@@ -133,13 +135,10 @@ void CD3D9ShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material ...@@ -133,13 +135,10 @@ void CD3D9ShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material
if (BaseMaterial) if (BaseMaterial)
BaseMaterial->OnSetMaterial(material, material, true, services); BaseMaterial->OnSetMaterial(material, material, true, services);
}
//let callback know used material
if (CallBack) if (CallBack)
CallBack->OnSetMaterial(material); CallBack->OnSetMaterial(material);
}
services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
} }
......
...@@ -93,6 +93,8 @@ void COpenGLCgMaterialRenderer::OnSetMaterial(const SMaterial& material, const S ...@@ -93,6 +93,8 @@ void COpenGLCgMaterialRenderer::OnSetMaterial(const SMaterial& material, const S
else else
Driver->setFixedPipelineState(COpenGLDriver::EOFPS_DISABLE); Driver->setFixedPipelineState(COpenGLDriver::EOFPS_DISABLE);
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
Material = material; Material = material;
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
...@@ -121,8 +123,6 @@ void COpenGLCgMaterialRenderer::OnSetMaterial(const SMaterial& material, const S ...@@ -121,8 +123,6 @@ void COpenGLCgMaterialRenderer::OnSetMaterial(const SMaterial& material, const S
if (CallBack) if (CallBack)
CallBack->OnSetMaterial(material); CallBack->OnSetMaterial(material);
} }
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
} }
bool COpenGLCgMaterialRenderer::OnRender(IMaterialRendererServices* services, E_VERTEX_TYPE vtxtype) bool COpenGLCgMaterialRenderer::OnRender(IMaterialRendererServices* services, E_VERTEX_TYPE vtxtype)
......
...@@ -2834,16 +2834,18 @@ GLint COpenGLDriver::getTextureWrapMode(const u8 clamp) ...@@ -2834,16 +2834,18 @@ GLint COpenGLDriver::getTextureWrapMode(const u8 clamp)
} }
//! OpenGL version of setBasicRenderStates method. //! Can be called by an IMaterialRenderer to make its work easier.
void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const SMaterial& lastmaterial, void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMaterial& lastmaterial,
bool resetAllRenderStates) bool resetAllRenderStates)
{ {
// Fixed pipeline isn't important for shader based materials // Fixed pipeline isn't important for shader based materials
if (resetAllRenderStates || FixedPipelineState == EOFPS_ENABLE || FixedPipelineState == EOFPS_DISABLE_TO_ENABLE) E_OPENGL_FIXED_PIPELINE_STATE tempState = FixedPipelineState;
if (resetAllRenderStates || tempState == EOFPS_ENABLE || tempState == EOFPS_DISABLE_TO_ENABLE)
{ {
// material colors // material colors
if (resetAllRenderStates || FixedPipelineState == EOFPS_DISABLE_TO_ENABLE || if (resetAllRenderStates || tempState == EOFPS_DISABLE_TO_ENABLE ||
lastmaterial.ColorMaterial != material.ColorMaterial) lastmaterial.ColorMaterial != material.ColorMaterial)
{ {
switch (material.ColorMaterial) switch (material.ColorMaterial)
...@@ -2871,7 +2873,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const ...@@ -2871,7 +2873,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const
glEnable(GL_COLOR_MATERIAL); glEnable(GL_COLOR_MATERIAL);
} }
if (resetAllRenderStates || FixedPipelineState == EOFPS_DISABLE_TO_ENABLE || if (resetAllRenderStates || tempState == EOFPS_DISABLE_TO_ENABLE ||
lastmaterial.AmbientColor != material.AmbientColor || lastmaterial.AmbientColor != material.AmbientColor ||
lastmaterial.DiffuseColor != material.DiffuseColor || lastmaterial.DiffuseColor != material.DiffuseColor ||
lastmaterial.EmissiveColor != material.EmissiveColor || lastmaterial.EmissiveColor != material.EmissiveColor ||
...@@ -2911,7 +2913,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const ...@@ -2911,7 +2913,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const
} }
} }
if (resetAllRenderStates || FixedPipelineState == EOFPS_DISABLE_TO_ENABLE || if (resetAllRenderStates || tempState == EOFPS_DISABLE_TO_ENABLE ||
lastmaterial.SpecularColor != material.SpecularColor || lastmaterial.SpecularColor != material.SpecularColor ||
lastmaterial.Shininess != material.Shininess || lastmaterial.Shininess != material.Shininess ||
lastmaterial.ColorMaterial != material.ColorMaterial) lastmaterial.ColorMaterial != material.ColorMaterial)
...@@ -2941,7 +2943,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const ...@@ -2941,7 +2943,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const
} }
// shademode // shademode
if (resetAllRenderStates || FixedPipelineState == EOFPS_DISABLE_TO_ENABLE || if (resetAllRenderStates || tempState == EOFPS_DISABLE_TO_ENABLE ||
lastmaterial.GouraudShading != material.GouraudShading) lastmaterial.GouraudShading != material.GouraudShading)
{ {
if (material.GouraudShading) if (material.GouraudShading)
...@@ -2951,7 +2953,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const ...@@ -2951,7 +2953,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const
} }
// lighting // lighting
if (resetAllRenderStates || FixedPipelineState == EOFPS_DISABLE_TO_ENABLE || if (resetAllRenderStates || tempState == EOFPS_DISABLE_TO_ENABLE ||
lastmaterial.Lighting != material.Lighting) lastmaterial.Lighting != material.Lighting)
{ {
if (material.Lighting) if (material.Lighting)
...@@ -2961,7 +2963,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const ...@@ -2961,7 +2963,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const
} }
// fog // fog
if (resetAllRenderStates || FixedPipelineState == EOFPS_DISABLE_TO_ENABLE || if (resetAllRenderStates || tempState == EOFPS_DISABLE_TO_ENABLE ||
lastmaterial.FogEnable != material.FogEnable) lastmaterial.FogEnable != material.FogEnable)
{ {
if (material.FogEnable) if (material.FogEnable)
...@@ -2971,7 +2973,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const ...@@ -2971,7 +2973,7 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const
} }
// normalization // normalization
if (resetAllRenderStates || FixedPipelineState == EOFPS_DISABLE_TO_ENABLE || if (resetAllRenderStates || tempState == EOFPS_DISABLE_TO_ENABLE ||
lastmaterial.NormalizeNormals != material.NormalizeNormals) lastmaterial.NormalizeNormals != material.NormalizeNormals)
{ {
if (material.NormalizeNormals) if (material.NormalizeNormals)
...@@ -2981,9 +2983,9 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const ...@@ -2981,9 +2983,9 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const
} }
// Set fixed pipeline as active. // Set fixed pipeline as active.
FixedPipelineState = EOFPS_ENABLE; tempState = EOFPS_ENABLE;
} }
else if (FixedPipelineState == EOFPS_ENABLE_TO_DISABLE) else if (tempState == EOFPS_ENABLE_TO_DISABLE)
{ {
glDisable(GL_COLOR_MATERIAL); glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
...@@ -2991,10 +2993,10 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const ...@@ -2991,10 +2993,10 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const
glDisable(GL_NORMALIZE); glDisable(GL_NORMALIZE);
// Set programmable pipeline as active. // Set programmable pipeline as active.
FixedPipelineState = EOFPS_DISABLE; tempState = EOFPS_DISABLE;
} }
// FixedPipelineState == EOFPS_DISABLE - driver doesn't calls functions related to fixed pipeline. // tempState == EOFPS_DISABLE - driver doesn't calls functions related to fixed pipeline.
// fillmode - fixed pipeline call, but it emulate GL_LINES behaviour in rendering, so it stay here. // fillmode - fixed pipeline call, but it emulate GL_LINES behaviour in rendering, so it stay here.
if (resetAllRenderStates || (lastmaterial.Wireframe != material.Wireframe) || (lastmaterial.PointCloud != material.PointCloud)) if (resetAllRenderStates || (lastmaterial.Wireframe != material.Wireframe) || (lastmaterial.PointCloud != material.PointCloud))
...@@ -3270,8 +3272,10 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const ...@@ -3270,8 +3272,10 @@ void COpenGLDriver::setOpenGLBasicRenderStates(const SMaterial& material, const
} }
} }
// be sure to leave in texture stage 0 setTextureRenderStates(material, resetAllRenderStates);
BridgeCalls->setActiveTexture(GL_TEXTURE0_ARB);
// set current fixed pipeline state
FixedPipelineState = tempState;
} }
//! Compare in SMaterial doesn't check texture parameters, so we should call this on each OnRender call. //! Compare in SMaterial doesn't check texture parameters, so we should call this on each OnRender call.
...@@ -3417,6 +3421,9 @@ void COpenGLDriver::setTextureRenderStates(const SMaterial& material, bool reset ...@@ -3417,6 +3421,9 @@ void COpenGLDriver::setTextureRenderStates(const SMaterial& material, bool reset
tmpTexture->getStatesCache().IsCached = true; tmpTexture->getStatesCache().IsCached = true;
} }
// be sure to leave in texture stage 0
BridgeCalls->setActiveTexture(GL_TEXTURE0_ARB);
} }
......
...@@ -286,15 +286,7 @@ namespace video ...@@ -286,15 +286,7 @@ namespace video
//! Can be called by an IMaterialRenderer to make its work easier. //! Can be called by an IMaterialRenderer to make its work easier.
virtual void setBasicRenderStates(const SMaterial& material, const SMaterial& lastmaterial, virtual void setBasicRenderStates(const SMaterial& material, const SMaterial& lastmaterial,
bool resetAllRenderstates) _IRR_OVERRIDE_ bool resetAllRenderstates) _IRR_OVERRIDE_;
{
setOpenGLBasicRenderStates(material, lastmaterial, resetAllRenderstates);
setTextureRenderStates(material, resetAllRenderstates);
}
//! OpenGL version of setBasicRenderStates method.
void setOpenGLBasicRenderStates(const SMaterial& material, const SMaterial& lastmaterial,
bool resetAllRenderstates);
//! Compare in SMaterial doesn't check texture parameters, so we should call this on each OnRender call. //! Compare in SMaterial doesn't check texture parameters, so we should call this on each OnRender call.
virtual void setTextureRenderStates(const SMaterial& material, bool resetAllRenderstates); virtual void setTextureRenderStates(const SMaterial& material, bool resetAllRenderstates);
......
...@@ -221,6 +221,8 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material, ...@@ -221,6 +221,8 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material,
else else
Driver->setFixedPipelineState(COpenGLDriver::EOFPS_DISABLE); Driver->setFixedPipelineState(COpenGLDriver::EOFPS_DISABLE);
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
{ {
if (Program2) if (Program2)
...@@ -234,8 +236,6 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material, ...@@ -234,8 +236,6 @@ void COpenGLSLMaterialRenderer::OnSetMaterial(const video::SMaterial& material,
if (CallBack) if (CallBack)
CallBack->OnSetMaterial(material); CallBack->OnSetMaterial(material);
} }
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
} }
......
...@@ -138,6 +138,8 @@ void COpenGLShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& materi ...@@ -138,6 +138,8 @@ void COpenGLShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& materi
else else
Driver->setFixedPipelineState(COpenGLDriver::EOFPS_DISABLE); Driver->setFixedPipelineState(COpenGLDriver::EOFPS_DISABLE);
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
{ {
if (VertexShader) if (VertexShader)
...@@ -184,8 +186,6 @@ void COpenGLShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& materi ...@@ -184,8 +186,6 @@ void COpenGLShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& materi
if (CallBack) if (CallBack)
CallBack->OnSetMaterial(material); CallBack->OnSetMaterial(material);
} }
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment