Commit de6df498 authored by nadro's avatar nadro

Fixed issue with wrongly enabled Z-writing for transparent shader materials....

Fixed issue with wrongly enabled Z-writing for transparent shader materials. Thanks Hendu for this fix.
Fixed issue with missing blending when transparent shader material is used with blending operation set to EBO_NONE.


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4774 dfc29bdd-3216-0410-991c-e03cc46cb475
parent ca6ff4b0
...@@ -671,14 +671,6 @@ namespace video ...@@ -671,14 +671,6 @@ namespace video
\return True if the materials are equal, else false. */ \return True if the materials are equal, else false. */
inline bool operator==(const SMaterial& b) const inline bool operator==(const SMaterial& b) const
{ return !(b!=*this); } { return !(b!=*this); }
bool isTransparent() const
{
return MaterialType==EMT_TRANSPARENT_ADD_COLOR ||
MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL ||
MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA ||
MaterialType==EMT_TRANSPARENT_REFLECTION_2_LAYER;
}
}; };
//! global const identity Material //! global const identity Material
......
...@@ -164,7 +164,7 @@ void CAnimatedMeshSceneNode::OnRegisterSceneNode() ...@@ -164,7 +164,7 @@ void CAnimatedMeshSceneNode::OnRegisterSceneNode()
video::IMaterialRenderer* rnd = video::IMaterialRenderer* rnd =
driver->getMaterialRenderer(Materials[i].MaterialType); driver->getMaterialRenderer(Materials[i].MaterialType);
if (rnd && rnd->isTransparent()) if ((rnd && rnd->isTransparent()) || Materials[i].BlendOperation != video::EBO_NONE)
++transparentCount; ++transparentCount;
else else
++solidCount; ++solidCount;
......
...@@ -1370,8 +1370,14 @@ bool CD3D8Driver::setRenderStates3DMode() ...@@ -1370,8 +1370,14 @@ bool CD3D8Driver::setRenderStates3DMode()
// set new material. // set new material.
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size()) if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
{
// force blending if necessary
if (Material.BlendOperation == EBO_NONE && MaterialRenderers[Material.MaterialType].Renderer->isTransparent())
Material.BlendOperation = EBO_ADD;
MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial( MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial(
Material, LastMaterial, ResetRenderStates, this); Material, LastMaterial, ResetRenderStates, this);
}
} }
bool shaderOK = true; bool shaderOK = true;
...@@ -1533,8 +1539,11 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -1533,8 +1539,11 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria
// zwrite // zwrite
// if (resetAllRenderstates || lastmaterial.ZWriteEnable != material.ZWriteEnable) // if (resetAllRenderstates || lastmaterial.ZWriteEnable != material.ZWriteEnable)
{ {
if (material.ZWriteEnable && (AllowZWriteOnTransparent || !material.isTransparent())) if (material.ZWriteEnable && (AllowZWriteOnTransparent || (material.BlendOperation == EBO_NONE &&
!MaterialRenderers[material.MaterialType].Renderer->isTransparent())))
{
pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE); pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE);
}
else else
pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE); pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE);
} }
......
...@@ -2076,8 +2076,14 @@ bool CD3D9Driver::setRenderStates3DMode() ...@@ -2076,8 +2076,14 @@ bool CD3D9Driver::setRenderStates3DMode()
// set new material. // set new material.
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size()) if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
{
// force blending if necessary
if (Material.BlendOperation == EBO_NONE && MaterialRenderers[Material.MaterialType].Renderer->isTransparent())
Material.BlendOperation = EBO_ADD;
MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial( MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial(
Material, LastMaterial, ResetRenderStates, this); Material, LastMaterial, ResetRenderStates, this);
}
} }
bool shaderOK = true; bool shaderOK = true;
...@@ -2244,8 +2250,11 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -2244,8 +2250,11 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
// zwrite // zwrite
// if (resetAllRenderstates || (lastmaterial.ZWriteEnable != material.ZWriteEnable)) // if (resetAllRenderstates || (lastmaterial.ZWriteEnable != material.ZWriteEnable))
{ {
if ( material.ZWriteEnable && (AllowZWriteOnTransparent || !material.isTransparent())) if (material.ZWriteEnable && (AllowZWriteOnTransparent || (material.BlendOperation == EBO_NONE &&
!MaterialRenderers[material.MaterialType].Renderer->isTransparent())))
{
pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE); pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE);
}
else else
pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE); pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE);
} }
......
...@@ -89,7 +89,7 @@ void CMeshSceneNode::OnRegisterSceneNode() ...@@ -89,7 +89,7 @@ void CMeshSceneNode::OnRegisterSceneNode()
video::IMaterialRenderer* rnd = video::IMaterialRenderer* rnd =
driver->getMaterialRenderer(Materials[i].MaterialType); driver->getMaterialRenderer(Materials[i].MaterialType);
if (rnd && rnd->isTransparent()) if ((rnd && rnd->isTransparent()) || Materials[i].BlendOperation != video::EBO_NONE)
++transparentCount; ++transparentCount;
else else
++solidCount; ++solidCount;
......
...@@ -64,7 +64,7 @@ void COctreeSceneNode::OnRegisterSceneNode() ...@@ -64,7 +64,7 @@ void COctreeSceneNode::OnRegisterSceneNode()
const video::IMaterialRenderer* const rnd = const video::IMaterialRenderer* const rnd =
driver->getMaterialRenderer(Materials[i].MaterialType); driver->getMaterialRenderer(Materials[i].MaterialType);
if (rnd && rnd->isTransparent()) if ((rnd && rnd->isTransparent()) || Materials[i].BlendOperation != video::EBO_NONE)
++transparentCount; ++transparentCount;
else else
++solidCount; ++solidCount;
......
...@@ -2722,8 +2722,14 @@ void COpenGLDriver::setRenderStates3DMode() ...@@ -2722,8 +2722,14 @@ void COpenGLDriver::setRenderStates3DMode()
// set new material. // set new material.
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size()) if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
{
// force blending if necessary
if (Material.BlendOperation == EBO_NONE && MaterialRenderers[Material.MaterialType].Renderer->isTransparent())
Material.BlendOperation = EBO_ADD;
MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial( MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial(
Material, LastMaterial, ResetRenderStates, this); Material, LastMaterial, ResetRenderStates, this);
}
LastMaterial = Material; LastMaterial = Material;
ResetRenderStates = false; ResetRenderStates = false;
...@@ -3052,8 +3058,11 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -3052,8 +3058,11 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
// zwrite // zwrite
// if (resetAllRenderStates || lastmaterial.ZWriteEnable != material.ZWriteEnable) // if (resetAllRenderStates || lastmaterial.ZWriteEnable != material.ZWriteEnable)
{ {
if (material.ZWriteEnable && (AllowZWriteOnTransparent || !material.isTransparent())) if (material.ZWriteEnable && (AllowZWriteOnTransparent || (material.BlendOperation == EBO_NONE &&
!MaterialRenderers[material.MaterialType].Renderer->isTransparent())))
{
BridgeCalls->setDepthMask(true); BridgeCalls->setDepthMask(true);
}
else else
BridgeCalls->setDepthMask(false); BridgeCalls->setDepthMask(false);
} }
......
...@@ -1296,7 +1296,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE ...@@ -1296,7 +1296,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
{ {
video::IMaterialRenderer* rnd = video::IMaterialRenderer* rnd =
Driver->getMaterialRenderer(node->getMaterial(i).MaterialType); Driver->getMaterialRenderer(node->getMaterial(i).MaterialType);
if (rnd && rnd->isTransparent()) if ((rnd && rnd->isTransparent()) || node->getMaterial(i).BlendOperation != video::EBO_NONE)
{ {
// register as transparent node // register as transparent node
TransparentNodeEntry e(node, camWorldPos); TransparentNodeEntry e(node, camWorldPos);
......
...@@ -486,7 +486,8 @@ void CBurningVideoDriver::setCurrentShader() ...@@ -486,7 +486,8 @@ void CBurningVideoDriver::setCurrentShader()
bool zMaterialTest = Material.org.ZBuffer != ECFN_DISABLED && bool zMaterialTest = Material.org.ZBuffer != ECFN_DISABLED &&
Material.org.ZWriteEnable && Material.org.ZWriteEnable &&
( AllowZWriteOnTransparent || !Material.org.isTransparent() ); ( AllowZWriteOnTransparent || (Material.org.BlendOperation == EBO_NONE &&
!MaterialRenderers[Material.org.MaterialType].Renderer->isTransparent()) );
EBurningFFShader shader = zMaterialTest ? ETR_TEXTURE_GOURAUD : ETR_TEXTURE_GOURAUD_NOZ; EBurningFFShader shader = zMaterialTest ? ETR_TEXTURE_GOURAUD : ETR_TEXTURE_GOURAUD_NOZ;
......
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