Commit a8d090c4 authored by hybrid's avatar hybrid

Added an enum and support for other Depth comparison functions.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@2129 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 60e1e5a3
......@@ -180,9 +180,9 @@ namespace quake3
switch ( isEqual ( string, pos, funclist, 2 ) )
{
case 0:
ret = 1;
ret = video::ECFN_LESSEQUAL;
case 1:
ret = 2;
ret = video::ECFN_EQUAL;
break;
}
return ret;
......
......@@ -42,6 +42,27 @@ namespace video
EMFN_MODULATE_4X = 4
};
//! Comparison function, e.g. for depth buffer test
enum E_COMPARISON_FUNC
{
//! Test never succeeds, this equals disable
ECFN_NEVER=0,
//! <= test, default for e.g. depth test
ECFN_LESSEQUAL=1,
//! Exact equality
ECFN_EQUAL=2,
//! exclusive less comparison, i.e. <
ECFN_LESS,
//! Succeeds almost always, except for exact equality
ECFN_NOTEQUAL,
//! >= test
ECFN_GREATEREQUAL,
//! inverse of <=
ECFN_GREATER,
//! test succeeds always
ECFN_ALWAYS
};
//! EMT_ONETEXTURE_BLEND: pack srcFact & dstFact and Modulo to MaterialTypeParam
inline f32 pack_texureBlendFunc ( const E_BLEND_FACTOR srcFact, const E_BLEND_FACTOR dstFact, const E_MODULATE_FUNC modulate )
{
......@@ -98,7 +119,7 @@ namespace video
Shininess(0.0f), MaterialTypeParam(0.0f), MaterialTypeParam2(0.0f), Thickness(1.0f),
Wireframe(false), PointCloud(false), GouraudShading(true), Lighting(true),
ZWriteEnable(true), BackfaceCulling(true), FrontfaceCulling(false),
FogEnable(false), NormalizeNormals(false), ZBuffer(1), AntiAliasing(EAAM_SIMPLE|EAAM_LINE_SMOOTH)
FogEnable(false), NormalizeNormals(false), ZBuffer(ECFN_LESSEQUAL), AntiAliasing(EAAM_SIMPLE|EAAM_LINE_SMOOTH)
{ }
//! Copy constructor
......@@ -384,7 +405,7 @@ namespace video
case EMF_LIGHTING:
return Lighting;
case EMF_ZBUFFER:
return ZBuffer!=0;
return ZBuffer!=ECFN_NEVER;
case EMF_ZWRITE_ENABLE:
return ZWriteEnable;
case EMF_BACK_FACE_CULLING:
......@@ -467,4 +488,3 @@ namespace video
} // end namespace irr
#endif
......@@ -394,7 +394,7 @@ void CAnimatedMeshSceneNode::render()
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
}
debug_mat.ZBuffer = false;
debug_mat.ZBuffer = video::ECFN_NEVER;
debug_mat.Lighting = false;
driver->setMaterial(debug_mat);
......@@ -476,7 +476,7 @@ void CAnimatedMeshSceneNode::render()
{
debug_mat.Lighting = false;
debug_mat.Wireframe = true;
debug_mat.ZBuffer = true;
debug_mat.ZBuffer = video::ECFN_NEVER;
driver->setMaterial(debug_mat);
for (u32 g=0; g<m->getMeshBufferCount(); ++g)
......
......@@ -625,13 +625,37 @@ void CBurningShader_Raster_Reference::setMaterial ( const SBurningShaderMaterial
ShaderParam.SetRenderState( BD3DRS_SPECULARMATERIALSOURCE, BD3DMCS_MATERIAL);
// depth buffer enable and compare
ShaderParam.SetRenderState( BD3DRS_ZENABLE, material.org.ZBuffer ? BD3DZB_USEW : BD3DZB_FALSE);
ShaderParam.SetRenderState( BD3DRS_ZFUNC, material.org.ZBuffer == 2 ? BD3DCMP_EQUAL : BD3DCMP_LESSEQUAL );
ShaderParam.SetRenderState( BD3DRS_ZENABLE, (material.org.ZBuffer==video::ECFN_NEVER) ? BD3DZB_FALSE : BD3DZB_USEW);
switch (material.org.ZBuffer)
{
case ECFN_NEVER:
ShaderParam.SetRenderState(BD3DRS_ZFUNC, BD3DCMP_NEVER);
break;
case ECFN_LESSEQUAL:
ShaderParam.SetRenderState(BD3DRS_ZFUNC, BD3DCMP_LESSEQUAL);
break;
case ECFN_EQUAL:
ShaderParam.SetRenderState(BD3DRS_ZFUNC, BD3DCMP_EQUAL);
break;
case ECFN_LESS:
ShaderParam.SetRenderState(BD3DRS_ZFUNC, BD3DCMP_LESSEQUAL);
break;
case ECFN_NOTEQUAL:
ShaderParam.SetRenderState(BD3DRS_ZFUNC, BD3DCMP_NOTEQUAL);
break;
case ECFN_GREATEREQUAL:
ShaderParam.SetRenderState(BD3DRS_ZFUNC, BD3DCMP_GREATEREQUAL);
break;
case ECFN_GREATER:
ShaderParam.SetRenderState(BD3DRS_ZFUNC, BD3DCMP_GREATER);
break;
case ECFN_ALWAYS:
ShaderParam.SetRenderState(BD3DRS_ZFUNC, BD3DCMP_ALWAYS);
break;
}
// depth buffer write
ShaderParam.SetRenderState( BD3DRS_ZWRITEENABLE, m.ZWriteEnable );
}
/*!
......
......@@ -1367,17 +1367,37 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria
{
switch (material.ZBuffer)
{
case 0:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
break;
case 1:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
break;
case 2:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_EQUAL);
break;
case ECFN_NEVER:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
break;
case ECFN_LESSEQUAL:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
break;
case ECFN_EQUAL:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_EQUAL);
break;
case ECFN_LESS:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);
break;
case ECFN_NOTEQUAL:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_NOTEQUAL);
break;
case ECFN_GREATEREQUAL:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATEREQUAL);
break;
case ECFN_GREATER:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATER);
break;
case ECFN_ALWAYS:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
break;
}
}
......
......@@ -1693,17 +1693,37 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
{
switch (material.ZBuffer)
{
case 0:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
break;
case 1:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
break;
case 2:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_EQUAL);
break;
case ECFN_NEVER:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
break;
case ECFN_LESSEQUAL:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
break;
case ECFN_EQUAL:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_EQUAL);
break;
case ECFN_LESS:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);
break;
case ECFN_NOTEQUAL:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_NOTEQUAL);
break;
case ECFN_GREATEREQUAL:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATEREQUAL);
break;
case ECFN_GREATER:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATER);
break;
case ECFN_ALWAYS:
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
break;
}
}
......
......@@ -1554,7 +1554,7 @@ void CNullDriver::fillMaterialStructureFromAttributes(video::SMaterial& outMater
outMaterial.GouraudShading = attr->getAttributeAsBool("GouraudShading");
outMaterial.Lighting = attr->getAttributeAsBool("Lighting");
outMaterial.ZWriteEnable = attr->getAttributeAsBool("ZWriteEnable");
outMaterial.ZBuffer = (char)attr->getAttributeAsInt("ZBuffer");
outMaterial.ZBuffer = (u8)attr->getAttributeAsInt("ZBuffer");
outMaterial.BackfaceCulling = attr->getAttributeAsBool("BackfaceCulling");
outMaterial.FrontfaceCulling = attr->getAttributeAsBool("FrontfaceCulling");
outMaterial.FogEnable = attr->getAttributeAsBool("FogEnable");
......
......@@ -761,7 +761,7 @@ void COgreMeshFileLoader::readPass(io::IReadFile* file, OgreTechnique& technique
else if (token=="depth_check")
{
getMaterialToken(file, token);
pass.Material.ZBuffer=(token=="on");
pass.Material.ZBuffer=((token=="on")?video::ECFN_LESSEQUAL:video::ECFN_NEVER);
}
else if (token=="depth_write")
{
......
......@@ -2059,17 +2059,37 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
{
switch (material.ZBuffer)
{
case 0:
case ECFN_NEVER:
glDisable(GL_DEPTH_TEST);
break;
case 1:
case ECFN_LESSEQUAL:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
break;
case 2:
case ECFN_EQUAL:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_EQUAL);
break;
case ECFN_LESS:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
break;
case ECFN_NOTEQUAL:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_NOTEQUAL);
break;
case ECFN_GREATEREQUAL:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_GEQUAL);
break;
case ECFN_GREATER:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_GREATER);
break;
case ECFN_ALWAYS:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
break;
}
}
......@@ -2187,7 +2207,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
if (static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size())
MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
SMaterial mat;
mat.ZBuffer=0;
mat.ZBuffer=ECFN_NEVER;
mat.Lighting=false;
mat.TextureLayer[0].BilinearFilter=false;
setBasicRenderStates(mat, mat, true);
......
......@@ -615,7 +615,7 @@ s32 CQ3LevelMesh::setShaderMaterial( video::SMaterial &material, const tBSPFace
material.setTexture(1, 0);
material.setTexture(2, 0);
material.setTexture(3, 0);
material.ZBuffer = true;
material.ZBuffer = video::ECFN_LESSEQUAL;
material.ZWriteEnable = true;
material.MaterialTypeParam = 0.f;
......
......@@ -38,7 +38,7 @@ CSkyBoxSceneNode::CSkyBoxSceneNode(video::ITexture* top, video::ITexture* bottom
video::SMaterial mat;
mat.Lighting = false;
mat.ZBuffer = false;
mat.ZBuffer = video::ECFN_NEVER;
mat.ZWriteEnable = false;
mat.TextureLayer[0].TextureWrap = video::ETC_CLAMP;
......
......@@ -48,7 +48,7 @@ CSkyDomeSceneNode::CSkyDomeSceneNode(video::ITexture* sky, u32 horiRes, u32 vert
Buffer = new SMeshBuffer();
Buffer->Material.Lighting = false;
Buffer->Material.ZBuffer = false;
Buffer->Material.ZBuffer = video::ECFN_NEVER;
Buffer->Material.ZWriteEnable = false;
Buffer->Material.setTexture(0, sky);
Buffer->BoundingBox.MaxEdge.set(0,0,0);
......
......@@ -133,7 +133,7 @@ void CSoftwareDriver::selectRightTriangleRenderer()
renderer = ETR_TEXTURE_GOURAUD_ADD;
}
else
if (!Material.ZBuffer && !Material.ZWriteEnable)
if ((Material.ZBuffer==ECFN_NEVER) && !Material.ZWriteEnable)
renderer = ETR_TEXTURE_GOURAUD_NOZ;
else
{
......
......@@ -166,7 +166,7 @@ void CBurningVideoDriver::setCurrentShader()
case EMT_TRANSPARENT_ALPHA_CHANNEL_REF:
case EMT_TRANSPARENT_ALPHA_CHANNEL:
if ( Material.org.ZBuffer )
if ( Material.org.ZBuffer != ECFN_NEVER )
{
shader = ETR_TEXTURE_GOURAUD_ALPHA;
}
......@@ -178,7 +178,7 @@ void CBurningVideoDriver::setCurrentShader()
break;
case EMT_TRANSPARENT_ADD_COLOR:
if ( Material.org.ZBuffer )
if ( Material.org.ZBuffer != ECFN_NEVER )
{
shader = ETR_TEXTURE_GOURAUD_ADD;
}
......@@ -226,7 +226,7 @@ void CBurningVideoDriver::setCurrentShader()
}
if ( zMaterialTest && !Material.org.ZBuffer && !Material.org.ZWriteEnable)
if ( zMaterialTest && (Material.org.ZBuffer==ECFN_NEVER) && !Material.org.ZWriteEnable)
{
shader = ETR_TEXTURE_GOURAUD_NOZ;
}
......
......@@ -104,7 +104,7 @@ CBillboardTextSceneNode::CBillboardTextSceneNode(ISceneNode* parent, ISceneManag
Material.MaterialTypeParam = 1.f / 255.f;
Material.BackfaceCulling = false;
Material.Lighting = false;
Material.ZBuffer = true;
Material.ZBuffer = video::ECFN_LESSEQUAL;
Material.ZWriteEnable = false;
if (font)
......
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