Commit c981decf authored by hybrid's avatar hybrid

Some cleanup in stencil setup.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3213 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 55a3220a
...@@ -2255,10 +2255,11 @@ void CD3D9Driver::setRenderStatesStencilShadowMode(bool zfail) ...@@ -2255,10 +2255,11 @@ void CD3D9Driver::setRenderStatesStencilShadowMode(bool zfail)
// USE THE ZPASS METHOD // USE THE ZPASS METHOD
pID3DDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS ); pID3DDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS );
pID3DDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP );
pID3DDevice->SetRenderState( D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP ); pID3DDevice->SetRenderState( D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP );
pID3DDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP );
pID3DDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_INCR );
pID3DDevice->SetRenderState( D3DRS_STENCILREF, 0x1 ); pID3DDevice->SetRenderState( D3DRS_STENCILREF, 0x0 );
pID3DDevice->SetRenderState( D3DRS_STENCILMASK, 0xffffffff ); pID3DDevice->SetRenderState( D3DRS_STENCILMASK, 0xffffffff );
pID3DDevice->SetRenderState( D3DRS_STENCILWRITEMASK, 0xffffffff ); pID3DDevice->SetRenderState( D3DRS_STENCILWRITEMASK, 0xffffffff );
...@@ -2272,8 +2273,8 @@ void CD3D9Driver::setRenderStatesStencilShadowMode(bool zfail) ...@@ -2272,8 +2273,8 @@ void CD3D9Driver::setRenderStatesStencilShadowMode(bool zfail)
// USE THE ZFAIL METHOD // USE THE ZFAIL METHOD
pID3DDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS ); pID3DDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS );
pID3DDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP );
pID3DDevice->SetRenderState( D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP ); pID3DDevice->SetRenderState( D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP );
pID3DDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_INCR );
pID3DDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_KEEP ); pID3DDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_KEEP );
pID3DDevice->SetRenderState( D3DRS_STENCILREF, 0x0 ); pID3DDevice->SetRenderState( D3DRS_STENCILREF, 0x0 );
...@@ -2313,8 +2314,9 @@ void CD3D9Driver::setRenderStatesStencilFillMode(bool alpha) ...@@ -2313,8 +2314,9 @@ void CD3D9Driver::setRenderStatesStencilFillMode(bool alpha)
pID3DDevice->SetRenderState(D3DRS_STENCILREF, 0x1); pID3DDevice->SetRenderState(D3DRS_STENCILREF, 0x1);
pID3DDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_LESSEQUAL); pID3DDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_LESSEQUAL);
//pID3DDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_GREATEREQUAL); //pID3DDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_GREATEREQUAL);
pID3DDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP ); pID3DDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP );
pID3DDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP ); pID3DDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP );
pID3DDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP );
pID3DDevice->SetRenderState(D3DRS_STENCILMASK, 0xffffffff ); pID3DDevice->SetRenderState(D3DRS_STENCILMASK, 0xffffffff );
pID3DDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff ); pID3DDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff );
...@@ -2600,13 +2602,13 @@ void CD3D9Driver::drawStencilShadowVolume(const core::vector3df* triangles, s32 ...@@ -2600,13 +2602,13 @@ void CD3D9Driver::drawStencilShadowVolume(const core::vector3df* triangles, s32
// ZPASS Method // ZPASS Method
// Draw front-side of shadow volume in stencil/z only // Draw front-side of shadow volume in stencil/z only
pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW ); pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
pID3DDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_INCRSAT); pID3DDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_INCR);
pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles, sizeof(core::vector3df)); pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles, sizeof(core::vector3df));
// Now reverse cull order so front sides of shadow volume are written. // Now reverse cull order so front sides of shadow volume are written.
pID3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW ); pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
pID3DDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_DECRSAT); pID3DDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_DECR);
pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles, sizeof(core::vector3df)); pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles, sizeof(core::vector3df));
} }
else else
...@@ -2614,13 +2616,13 @@ void CD3D9Driver::drawStencilShadowVolume(const core::vector3df* triangles, s32 ...@@ -2614,13 +2616,13 @@ void CD3D9Driver::drawStencilShadowVolume(const core::vector3df* triangles, s32
// ZFAIL Method // ZFAIL Method
// Draw front-side of shadow volume in stencil/z only // Draw front-side of shadow volume in stencil/z only
pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW ); pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
pID3DDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_INCRSAT ); pID3DDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_INCR);
pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles, sizeof(core::vector3df)); pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles, sizeof(core::vector3df));
// Now reverse cull order so front sides of shadow volume are written. // Now reverse cull order so front sides of shadow volume are written.
pID3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); pID3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW);
pID3DDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_DECRSAT ); pID3DDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_DECR);
pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles, sizeof(core::vector3df)); pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles, sizeof(core::vector3df));
} }
} }
......
...@@ -3195,92 +3195,76 @@ void COpenGLDriver::drawStencilShadowVolume(const core::vector3df* triangles, s3 ...@@ -3195,92 +3195,76 @@ void COpenGLDriver::drawStencilShadowVolume(const core::vector3df* triangles, s3
glEnable(GL_DEPTH_CLAMP_NV); glEnable(GL_DEPTH_CLAMP_NV);
#endif #endif
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
if (!zfail) if (zfail)
{ {
// ZPASS Method
extGlActiveStencilFace(GL_BACK); extGlActiveStencilFace(GL_BACK);
glStencilOp(GL_KEEP, GL_KEEP, decr); glStencilOp(GL_KEEP, incr, GL_KEEP);
glStencilMask(~0); glStencilMask(~0);
glStencilFunc(GL_ALWAYS, 0, ~0); glStencilFunc(GL_ALWAYS, 0, ~0);
extGlActiveStencilFace(GL_FRONT); extGlActiveStencilFace(GL_FRONT);
glStencilOp(GL_KEEP, GL_KEEP, incr); glStencilOp(GL_KEEP, decr, GL_KEEP);
glStencilMask(~0);
glStencilFunc(GL_ALWAYS, 0, ~0);
glDrawArrays(GL_TRIANGLES,0,count);
} }
else else // zpass
{ {
// ZFAIL Method
extGlActiveStencilFace(GL_BACK); extGlActiveStencilFace(GL_BACK);
glStencilOp(GL_KEEP, incr, GL_KEEP); glStencilOp(GL_KEEP, GL_KEEP, decr);
glStencilMask(~0); glStencilMask(~0);
glStencilFunc(GL_ALWAYS, 0, ~0); glStencilFunc(GL_ALWAYS, 0, ~0);
extGlActiveStencilFace(GL_FRONT); extGlActiveStencilFace(GL_FRONT);
glStencilOp(GL_KEEP, decr, GL_KEEP); glStencilOp(GL_KEEP, GL_KEEP, incr);
glStencilMask(~0);
glStencilFunc(GL_ALWAYS, 0, ~0);
glDrawArrays(GL_TRIANGLES,0,count);
} }
glStencilMask(~0);
glStencilFunc(GL_ALWAYS, 0, ~0);
glDrawArrays(GL_TRIANGLES,0,count);
#ifdef GL_NV_depth_clamp
if (FeatureAvailable[IRR_NV_depth_clamp])
glDisable(GL_DEPTH_CLAMP_NV);
#endif
glDisable(GL_STENCIL_TEST_TWO_SIDE_EXT);
} }
else else
#endif #endif
if (FeatureAvailable[IRR_ATI_separate_stencil]) if (FeatureAvailable[IRR_ATI_separate_stencil])
{ {
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
if (!zfail) if (zfail)
{
// ZPASS Method
extGlStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, decr);
extGlStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, incr);
extGlStencilFuncSeparate(GL_FRONT_AND_BACK, GL_ALWAYS, 0, ~0);
glStencilMask(~0);
glDrawArrays(GL_TRIANGLES,0,count);
}
else
{ {
// ZFAIL Method
extGlStencilOpSeparate(GL_BACK, GL_KEEP, incr, GL_KEEP); extGlStencilOpSeparate(GL_BACK, GL_KEEP, incr, GL_KEEP);
extGlStencilOpSeparate(GL_FRONT, GL_KEEP, decr, GL_KEEP); extGlStencilOpSeparate(GL_FRONT, GL_KEEP, decr, GL_KEEP);
extGlStencilFuncSeparate(GL_FRONT_AND_BACK, GL_ALWAYS, 0, ~0);
glDrawArrays(GL_TRIANGLES,0,count);
} }
else // zpass
{
extGlStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, decr);
extGlStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, incr);
}
extGlStencilFuncSeparate(GL_FRONT_AND_BACK, GL_ALWAYS, 0, ~0);
glStencilMask(~0);
glDrawArrays(GL_TRIANGLES,0,count);
} }
else else
#endif #endif
{ {
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
if (!zfail) if (zfail)
{ {
// ZPASS Method glCullFace(GL_FRONT);
glStencilOp(GL_KEEP, incr, GL_KEEP);
glCullFace(GL_BACK);
glStencilOp(GL_KEEP, GL_KEEP, incr);
glDrawArrays(GL_TRIANGLES,0,count); glDrawArrays(GL_TRIANGLES,0,count);
glCullFace(GL_FRONT); glCullFace(GL_BACK);
glStencilOp(GL_KEEP, GL_KEEP, decr); glStencilOp(GL_KEEP, decr, GL_KEEP);
glDrawArrays(GL_TRIANGLES,0,count); glDrawArrays(GL_TRIANGLES,0,count);
} }
else else // zpass
{ {
// ZFAIL Method glCullFace(GL_BACK);
glStencilOp(GL_KEEP, GL_KEEP, incr);
glStencilOp(GL_KEEP, incr, GL_KEEP);
glCullFace(GL_FRONT);
glDrawArrays(GL_TRIANGLES,0,count); glDrawArrays(GL_TRIANGLES,0,count);
glStencilOp(GL_KEEP, decr, GL_KEEP); glCullFace(GL_FRONT);
glCullFace(GL_BACK); glStencilOp(GL_KEEP, GL_KEEP, decr);
glDrawArrays(GL_TRIANGLES,0,count); glDrawArrays(GL_TRIANGLES,0,count);
} }
} }
......
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