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
\return True if the materials are equal, else false. */
inline bool operator==(const SMaterial& b) const
{ 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
......
......@@ -164,7 +164,7 @@ void CAnimatedMeshSceneNode::OnRegisterSceneNode()
video::IMaterialRenderer* rnd =
driver->getMaterialRenderer(Materials[i].MaterialType);
if (rnd && rnd->isTransparent())
if ((rnd && rnd->isTransparent()) || Materials[i].BlendOperation != video::EBO_NONE)
++transparentCount;
else
++solidCount;
......
......@@ -1370,9 +1370,15 @@ bool CD3D8Driver::setRenderStates3DMode()
// set new material.
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(
Material, LastMaterial, ResetRenderStates, this);
}
}
bool shaderOK = true;
......@@ -1533,8 +1539,11 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria
// zwrite
// 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);
}
else
pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE);
}
......
......@@ -2076,9 +2076,15 @@ bool CD3D9Driver::setRenderStates3DMode()
// set new material.
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(
Material, LastMaterial, ResetRenderStates, this);
}
}
bool shaderOK = true;
if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
......@@ -2244,8 +2250,11 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
// zwrite
// 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);
}
else
pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE);
}
......
......@@ -89,7 +89,7 @@ void CMeshSceneNode::OnRegisterSceneNode()
video::IMaterialRenderer* rnd =
driver->getMaterialRenderer(Materials[i].MaterialType);
if (rnd && rnd->isTransparent())
if ((rnd && rnd->isTransparent()) || Materials[i].BlendOperation != video::EBO_NONE)
++transparentCount;
else
++solidCount;
......
......@@ -64,7 +64,7 @@ void COctreeSceneNode::OnRegisterSceneNode()
const video::IMaterialRenderer* const rnd =
driver->getMaterialRenderer(Materials[i].MaterialType);
if (rnd && rnd->isTransparent())
if ((rnd && rnd->isTransparent()) || Materials[i].BlendOperation != video::EBO_NONE)
++transparentCount;
else
++solidCount;
......
......@@ -2722,8 +2722,14 @@ void COpenGLDriver::setRenderStates3DMode()
// set new material.
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(
Material, LastMaterial, ResetRenderStates, this);
}
LastMaterial = Material;
ResetRenderStates = false;
......@@ -3052,8 +3058,11 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
// zwrite
// 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);
}
else
BridgeCalls->setDepthMask(false);
}
......
......@@ -1296,7 +1296,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
{
video::IMaterialRenderer* rnd =
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
TransparentNodeEntry e(node, camWorldPos);
......
......@@ -486,7 +486,8 @@ void CBurningVideoDriver::setCurrentShader()
bool zMaterialTest = Material.org.ZBuffer != ECFN_DISABLED &&
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;
......
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