Commit f9d0f813 authored by nadro's avatar nadro

- Fixed blending issues in example no. 08 (OpenGL driver).

- Added ECFN_DISABLED value (it works like ECFN_NEVER worked before) and changed ECFN_NEVER behaviour (it works like its equivalent value in OpenGL/Direct3D).

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4424 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 15bd9597
...@@ -61,8 +61,8 @@ namespace video ...@@ -61,8 +61,8 @@ namespace video
//! Comparison function, e.g. for depth buffer test //! Comparison function, e.g. for depth buffer test
enum E_COMPARISON_FUNC enum E_COMPARISON_FUNC
{ {
//! Test never succeeds, this equals disable //! Depth test disabled (disable also write to depth buffer)
ECFN_NEVER=0, ECFN_DISABLED=0,
//! <= test, default for e.g. depth test //! <= test, default for e.g. depth test
ECFN_LESSEQUAL=1, ECFN_LESSEQUAL=1,
//! Exact equality //! Exact equality
...@@ -76,7 +76,9 @@ namespace video ...@@ -76,7 +76,9 @@ namespace video
//! inverse of <= //! inverse of <=
ECFN_GREATER, ECFN_GREATER,
//! test succeeds always //! test succeeds always
ECFN_ALWAYS ECFN_ALWAYS,
//! Test never succeeds
ECFN_NEVER
}; };
//! Enum values for enabling/disabling color planes for rendering //! Enum values for enabling/disabling color planes for rendering
...@@ -362,7 +364,9 @@ namespace video ...@@ -362,7 +364,9 @@ namespace video
f32 Thickness; f32 Thickness;
//! Is the ZBuffer enabled? Default: ECFN_LESSEQUAL //! Is the ZBuffer enabled? Default: ECFN_LESSEQUAL
/** Values are from E_COMPARISON_FUNC. */ /** If you want to disable depth test for this material
just set this parameter to ECFN_DISABLED.
Values are from E_COMPARISON_FUNC. */
u8 ZBuffer; u8 ZBuffer;
//! Sets the antialiasing mode //! Sets the antialiasing mode
...@@ -418,7 +422,8 @@ namespace video ...@@ -418,7 +422,8 @@ namespace video
//! Is the zbuffer writeable or is it read-only. Default: true. //! Is the zbuffer writeable or is it read-only. Default: true.
/** This flag is forced to false if the MaterialType is a /** This flag is forced to false if the MaterialType is a
transparent type and the scene parameter transparent type and the scene parameter
ALLOW_ZWRITE_ON_TRANSPARENT is not set. */ ALLOW_ZWRITE_ON_TRANSPARENT is not set. If you set this parameter
to true, make sure that ZBuffer value is other than ECFN_DISABLED */
bool ZWriteEnable:1; bool ZWriteEnable:1;
//! Is backface culling enabled? Default: true //! Is backface culling enabled? Default: true
...@@ -579,7 +584,7 @@ namespace video ...@@ -579,7 +584,7 @@ namespace video
case EMF_LIGHTING: case EMF_LIGHTING:
return Lighting; return Lighting;
case EMF_ZBUFFER: case EMF_ZBUFFER:
return ZBuffer!=ECFN_NEVER; return ZBuffer!=ECFN_DISABLED;
case EMF_ZWRITE_ENABLE: case EMF_ZWRITE_ENABLE:
return ZWriteEnable; return ZWriteEnable;
case EMF_BACK_FACE_CULLING: case EMF_BACK_FACE_CULLING:
......
...@@ -368,7 +368,7 @@ void CAnimatedMeshSceneNode::render() ...@@ -368,7 +368,7 @@ void CAnimatedMeshSceneNode::render()
} }
} }
debug_mat.ZBuffer = video::ECFN_NEVER; debug_mat.ZBuffer = video::ECFN_DISABLED;
debug_mat.Lighting = false; debug_mat.Lighting = false;
driver->setMaterial(debug_mat); driver->setMaterial(debug_mat);
...@@ -448,7 +448,7 @@ void CAnimatedMeshSceneNode::render() ...@@ -448,7 +448,7 @@ void CAnimatedMeshSceneNode::render()
{ {
debug_mat.Lighting = false; debug_mat.Lighting = false;
debug_mat.Wireframe = true; debug_mat.Wireframe = true;
debug_mat.ZBuffer = video::ECFN_NEVER; debug_mat.ZBuffer = video::ECFN_DISABLED;
driver->setMaterial(debug_mat); driver->setMaterial(debug_mat);
for (u32 g=0; g<m->getMeshBufferCount(); ++g) for (u32 g=0; g<m->getMeshBufferCount(); ++g)
......
...@@ -625,7 +625,7 @@ void CBurningShader_Raster_Reference::setMaterial ( const SBurningShaderMaterial ...@@ -625,7 +625,7 @@ void CBurningShader_Raster_Reference::setMaterial ( const SBurningShaderMaterial
ShaderParam.SetRenderState( BD3DRS_SPECULARMATERIALSOURCE, (m.ColorMaterial==ECM_SPECULAR)?BD3DMCS_COLOR1:BD3DMCS_MATERIAL); ShaderParam.SetRenderState( BD3DRS_SPECULARMATERIALSOURCE, (m.ColorMaterial==ECM_SPECULAR)?BD3DMCS_COLOR1:BD3DMCS_MATERIAL);
// depth buffer enable and compare // depth buffer enable and compare
ShaderParam.SetRenderState( BD3DRS_ZENABLE, (material.org.ZBuffer==video::ECFN_NEVER) ? BD3DZB_FALSE : BD3DZB_USEW); ShaderParam.SetRenderState( BD3DRS_ZENABLE, (material.org.ZBuffer==video::ECFN_DISABLED) ? BD3DZB_FALSE : BD3DZB_USEW);
switch (material.org.ZBuffer) switch (material.org.ZBuffer)
{ {
case ECFN_NEVER: case ECFN_NEVER:
......
...@@ -1490,7 +1490,7 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -1490,7 +1490,7 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria
{ {
switch (material.ZBuffer) switch (material.ZBuffer)
{ {
case ECFN_NEVER: case ECFN_DISABLED:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE); pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
break; break;
case ECFN_LESSEQUAL: case ECFN_LESSEQUAL:
...@@ -1521,6 +1521,10 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -1521,6 +1521,10 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
break; break;
case ECFN_NEVER:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_NEVER);
break;
} }
} }
......
...@@ -2202,7 +2202,7 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -2202,7 +2202,7 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
{ {
switch (material.ZBuffer) switch (material.ZBuffer)
{ {
case ECFN_NEVER: case ECFN_DISABLED:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE); pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
break; break;
case ECFN_LESSEQUAL: case ECFN_LESSEQUAL:
...@@ -2233,6 +2233,9 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -2233,6 +2233,9 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
break; break;
case ECFN_NEVER:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_NEVER);
} }
} }
......
...@@ -190,7 +190,7 @@ CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d<u32>& scre ...@@ -190,7 +190,7 @@ CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d<u32>& scre
InitMaterial2D.AntiAliasing=video::EAAM_OFF; InitMaterial2D.AntiAliasing=video::EAAM_OFF;
InitMaterial2D.Lighting=false; InitMaterial2D.Lighting=false;
InitMaterial2D.ZWriteEnable=false; InitMaterial2D.ZWriteEnable=false;
InitMaterial2D.ZBuffer=video::ECFN_NEVER; InitMaterial2D.ZBuffer=video::ECFN_DISABLED;
InitMaterial2D.UseMipMaps=false; InitMaterial2D.UseMipMaps=false;
for (u32 i=0; i<video::MATERIAL_MAX_TEXTURES; ++i) for (u32 i=0; i<video::MATERIAL_MAX_TEXTURES; ++i)
{ {
......
...@@ -993,7 +993,7 @@ void COgreMeshFileLoader::readPass(io::IReadFile* file, OgreTechnique& technique ...@@ -993,7 +993,7 @@ void COgreMeshFileLoader::readPass(io::IReadFile* file, OgreTechnique& technique
{ {
getMaterialToken(file, token); getMaterialToken(file, token);
if (token!="on") if (token!="on")
pass.Material.ZBuffer=video::ECFN_NEVER; pass.Material.ZBuffer=video::ECFN_DISABLED;
} }
else if (token=="depth_write") else if (token=="depth_write")
{ {
......
...@@ -2990,30 +2990,41 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -2990,30 +2990,41 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
{ {
switch (material.ZBuffer) switch (material.ZBuffer)
{ {
case ECFN_NEVER: case ECFN_DISABLED:
BridgeCalls->setDepthFunc(0); BridgeCalls->setDepthTest(false);
break; break;
case ECFN_LESSEQUAL: case ECFN_LESSEQUAL:
BridgeCalls->setDepthTest(true);
BridgeCalls->setDepthFunc(GL_LEQUAL); BridgeCalls->setDepthFunc(GL_LEQUAL);
break; break;
case ECFN_EQUAL: case ECFN_EQUAL:
BridgeCalls->setDepthTest(true);
BridgeCalls->setDepthFunc(GL_EQUAL); BridgeCalls->setDepthFunc(GL_EQUAL);
break; break;
case ECFN_LESS: case ECFN_LESS:
BridgeCalls->setDepthTest(true);
BridgeCalls->setDepthFunc(GL_LESS); BridgeCalls->setDepthFunc(GL_LESS);
break; break;
case ECFN_NOTEQUAL: case ECFN_NOTEQUAL:
BridgeCalls->setDepthTest(true);
BridgeCalls->setDepthFunc(GL_NOTEQUAL); BridgeCalls->setDepthFunc(GL_NOTEQUAL);
break; break;
case ECFN_GREATEREQUAL: case ECFN_GREATEREQUAL:
BridgeCalls->setDepthTest(true);
BridgeCalls->setDepthFunc(GL_GEQUAL); BridgeCalls->setDepthFunc(GL_GEQUAL);
break; break;
case ECFN_GREATER: case ECFN_GREATER:
BridgeCalls->setDepthTest(true);
BridgeCalls->setDepthFunc(GL_GREATER); BridgeCalls->setDepthFunc(GL_GREATER);
break; break;
case ECFN_ALWAYS: case ECFN_ALWAYS:
BridgeCalls->setDepthTest(true);
BridgeCalls->setDepthFunc(GL_ALWAYS); BridgeCalls->setDepthFunc(GL_ALWAYS);
break; break;
case ECFN_NEVER:
BridgeCalls->setDepthTest(true);
BridgeCalls->setDepthFunc(GL_NEVER);
break;
} }
} }
...@@ -3787,8 +3798,9 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>& ...@@ -3787,8 +3798,9 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>&
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glDisable(GL_FOG); glDisable(GL_FOG);
BridgeCalls->setDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST);
BridgeCalls->setDepthMask(false); glDepthFunc(GL_LESS);
glDepthMask(GL_FALSE);
if (debugDataVisible & scene::EDS_MESH_WIRE_OVERLAY) if (debugDataVisible & scene::EDS_MESH_WIRE_OVERLAY)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
...@@ -3918,7 +3930,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef ...@@ -3918,7 +3930,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glDisable(GL_FOG); glDisable(GL_FOG);
BridgeCalls->setDepthMask(false); glDepthMask(GL_FALSE);
glShadeModel(GL_FLAT); glShadeModel(GL_FLAT);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
...@@ -4987,17 +4999,21 @@ const CGcontext& COpenGLDriver::getCgContext() ...@@ -4987,17 +4999,21 @@ const CGcontext& COpenGLDriver::getCgContext()
COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver), COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver),
ClientStateVertex(false), ClientStateNormal(false), ClientStateColor(false), ClientStateTexCoord0(false), ClientStateVertex(false), ClientStateNormal(false), ClientStateColor(false), ClientStateTexCoord0(false),
DepthMask(false), DepthFunc(0), DepthTest(false), MatrixMode(GL_MODELVIEW), DepthFunc(GL_LESS), DepthMask(true), DepthTest(false), MatrixMode(GL_MODELVIEW),
ActiveTexture(GL_TEXTURE0_ARB), ClientActiveTexture(GL_TEXTURE0_ARB) ActiveTexture(GL_TEXTURE0_ARB), ClientActiveTexture(GL_TEXTURE0_ARB)
{ {
// Initial OpenGL values from specification.
for (u32 i = 0; i < MATERIAL_MAX_TEXTURES; ++i) for (u32 i = 0; i < MATERIAL_MAX_TEXTURES; ++i)
{ {
Texture[i] = 0; Texture[i] = 0;
TextureFixedPipeline[i] = true; TextureFixedPipeline[i] = true;
} }
glDepthMask(GL_FALSE); glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
if(Driver->MultiTextureExtension) if(Driver->MultiTextureExtension)
...@@ -5058,44 +5074,40 @@ void COpenGLCallBridge::setClientState(bool vertex, bool normal, bool color, boo ...@@ -5058,44 +5074,40 @@ void COpenGLCallBridge::setClientState(bool vertex, bool normal, bool color, boo
ClientStateTexCoord0 = texCoord0; ClientStateTexCoord0 = texCoord0;
} }
} }
void COpenGLCallBridge::setDepthFunc(GLenum mode)
{
if(DepthFunc != mode)
{
glDepthFunc(mode);
DepthFunc = mode;
}
}
void COpenGLCallBridge::setDepthMask(bool enabled) void COpenGLCallBridge::setDepthMask(bool enable)
{ {
if(DepthMask != enabled) if(DepthMask != enable)
{ {
if (enabled) if (enable)
glDepthMask(GL_TRUE); glDepthMask(GL_TRUE);
else else
glDepthMask(GL_FALSE); glDepthMask(GL_FALSE);
DepthMask = enabled; DepthMask = enable;
} }
} }
void COpenGLCallBridge::setDepthFunc(GLenum mode) void COpenGLCallBridge::setDepthTest(bool enable)
{ {
if(DepthFunc != mode) if(DepthTest != enable)
{ {
if(mode == 0) if (enable)
{ glEnable(GL_DEPTH_TEST);
if(DepthTest)
{
glDisable(GL_DEPTH_TEST);
DepthTest = false;
}
}
else else
{ glDisable(GL_DEPTH_TEST);
if(!DepthTest)
{
glEnable(GL_DEPTH_TEST);
DepthTest = true;
}
glDepthFunc(mode);
}
DepthFunc = mode; DepthTest = enable;
} }
} }
......
...@@ -643,9 +643,11 @@ namespace video ...@@ -643,9 +643,11 @@ namespace video
// Depth calls. // Depth calls.
void setDepthMask(bool enabled); void setDepthFunc(GLenum mode);
void setDepthFunc(GLenum mode); void setDepthMask(bool enable);
void setDepthTest(bool enable);
// Matrix calls. // Matrix calls.
...@@ -667,8 +669,8 @@ namespace video ...@@ -667,8 +669,8 @@ namespace video
bool ClientStateColor; bool ClientStateColor;
bool ClientStateTexCoord0; bool ClientStateTexCoord0;
GLenum DepthFunc;
bool DepthMask; bool DepthMask;
GLenum DepthFunc;
bool DepthTest; bool DepthTest;
GLenum MatrixMode; GLenum MatrixMode;
......
...@@ -38,7 +38,7 @@ CSkyBoxSceneNode::CSkyBoxSceneNode(video::ITexture* top, video::ITexture* bottom ...@@ -38,7 +38,7 @@ CSkyBoxSceneNode::CSkyBoxSceneNode(video::ITexture* top, video::ITexture* bottom
video::SMaterial mat; video::SMaterial mat;
mat.Lighting = false; mat.Lighting = false;
mat.ZBuffer = video::ECFN_NEVER; mat.ZBuffer = video::ECFN_DISABLED;
mat.ZWriteEnable = false; mat.ZWriteEnable = false;
mat.AntiAliasing=0; mat.AntiAliasing=0;
mat.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE; mat.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
......
...@@ -46,7 +46,7 @@ CSkyDomeSceneNode::CSkyDomeSceneNode(video::ITexture* sky, u32 horiRes, u32 vert ...@@ -46,7 +46,7 @@ CSkyDomeSceneNode::CSkyDomeSceneNode(video::ITexture* sky, u32 horiRes, u32 vert
Buffer = new SMeshBuffer(); Buffer = new SMeshBuffer();
Buffer->Material.Lighting = false; Buffer->Material.Lighting = false;
Buffer->Material.ZBuffer = video::ECFN_NEVER; Buffer->Material.ZBuffer = video::ECFN_DISABLED;
Buffer->Material.ZWriteEnable = false; Buffer->Material.ZWriteEnable = false;
Buffer->Material.AntiAliasing = video::EAAM_OFF; Buffer->Material.AntiAliasing = video::EAAM_OFF;
Buffer->Material.setTexture(0, sky); Buffer->Material.setTexture(0, sky);
......
...@@ -139,7 +139,7 @@ void CSoftwareDriver::selectRightTriangleRenderer() ...@@ -139,7 +139,7 @@ void CSoftwareDriver::selectRightTriangleRenderer()
renderer = ETR_TEXTURE_GOURAUD_ADD; renderer = ETR_TEXTURE_GOURAUD_ADD;
} }
else else
if ((Material.ZBuffer==ECFN_NEVER) && !Material.ZWriteEnable) if ((Material.ZBuffer==ECFN_DISABLED) && !Material.ZWriteEnable)
renderer = ETR_TEXTURE_GOURAUD_NOZ; renderer = ETR_TEXTURE_GOURAUD_NOZ;
else else
{ {
......
...@@ -484,7 +484,7 @@ void CBurningVideoDriver::setCurrentShader() ...@@ -484,7 +484,7 @@ void CBurningVideoDriver::setCurrentShader()
ITexture *texture0 = Material.org.getTexture(0); ITexture *texture0 = Material.org.getTexture(0);
ITexture *texture1 = Material.org.getTexture(1); ITexture *texture1 = Material.org.getTexture(1);
bool zMaterialTest = Material.org.ZBuffer != ECFN_NEVER && bool zMaterialTest = Material.org.ZBuffer != ECFN_DISABLED &&
Material.org.ZWriteEnable && Material.org.ZWriteEnable &&
( AllowZWriteOnTransparent || !Material.org.isTransparent() ); ( AllowZWriteOnTransparent || !Material.org.isTransparent() );
......
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