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