Commit af86f539 authored by hybrid's avatar hybrid

Avoid access to StencilBuffer if it is non-existent.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3487 dfc29bdd-3216-0410-991c-e03cc46cb475
parent d1a4b288
...@@ -2649,16 +2649,19 @@ void CBurningVideoDriver::drawStencilShadowVolume(const core::vector3df* triangl ...@@ -2649,16 +2649,19 @@ void CBurningVideoDriver::drawStencilShadowVolume(const core::vector3df* triangl
void CBurningVideoDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor leftUpEdge, void CBurningVideoDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor leftUpEdge,
video::SColor rightUpEdge, video::SColor leftDownEdge, video::SColor rightDownEdge) video::SColor rightUpEdge, video::SColor leftDownEdge, video::SColor rightDownEdge)
{ {
if (!StencilBuffer)
return;
// draw a shadow rectangle covering the entire screen using stencil buffer // draw a shadow rectangle covering the entire screen using stencil buffer
const u32 h = RenderTargetSurface->getDimension().Height; const u32 h = RenderTargetSurface->getDimension().Height;
const u32 w = RenderTargetSurface->getDimension().Width; const u32 w = RenderTargetSurface->getDimension().Width;
tVideoSample *dst; tVideoSample *dst;
u32 *stencil; u32 *stencil;
u32* const stencilBase=(u32*) StencilBuffer->lock();
for ( u32 y = 0; y < h; ++y ) for ( u32 y = 0; y < h; ++y )
{ {
dst = (tVideoSample*)RenderTargetSurface->lock() + ( y * w ); dst = (tVideoSample*)RenderTargetSurface->lock() + ( y * w );
stencil = (u32*) StencilBuffer->lock() + ( y * w ); stencil = stencilBase + ( y * w );
for ( u32 x = 0; x < w; ++x ) for ( u32 x = 0; x < w; ++x )
{ {
......
...@@ -110,14 +110,12 @@ CTRStencilShadow::CTRStencilShadow(CBurningVideoDriver* driver) ...@@ -110,14 +110,12 @@ CTRStencilShadow::CTRStencilShadow(CBurningVideoDriver* driver)
} }
/*! /*!
*/ */
void CTRStencilShadow::setParam ( u32 index, f32 value) void CTRStencilShadow::setParam ( u32 index, f32 value)
{ {
u32 val = (u32) value; u32 val = (u32) value;
// glStencilOp (fail,zfail,zpass // glStencilOp (fail,zfail,zpass
if ( index == 1 && val == 1 ) if ( index == 1 && val == 1 )
{ {
...@@ -128,14 +126,14 @@ void CTRStencilShadow::setParam ( u32 index, f32 value) ...@@ -128,14 +126,14 @@ void CTRStencilShadow::setParam ( u32 index, f32 value)
{ {
fragmentShader = &CTRStencilShadow::fragment_zfail_decr; fragmentShader = &CTRStencilShadow::fragment_zfail_decr;
} }
} }
/*! /*!
*/ */
void CTRStencilShadow::fragment_zfail_decr () void CTRStencilShadow::fragment_zfail_decr ()
{ {
if (!Stencil)
return;
//tVideoSample *dst; //tVideoSample *dst;
#ifdef USE_ZBUFFER #ifdef USE_ZBUFFER
...@@ -150,7 +148,6 @@ void CTRStencilShadow::fragment_zfail_decr () ...@@ -150,7 +148,6 @@ void CTRStencilShadow::fragment_zfail_decr ()
s32 xEnd; s32 xEnd;
s32 dx; s32 dx;
#ifdef SUBTEXEL #ifdef SUBTEXEL
f32 subPixel; f32 subPixel;
#endif #endif
...@@ -285,13 +282,14 @@ void CTRStencilShadow::fragment_zfail_decr () ...@@ -285,13 +282,14 @@ void CTRStencilShadow::fragment_zfail_decr ()
line.l[0][0] += slopeL[0]; line.l[0][0] += slopeL[0];
#endif #endif
} }
} }
/*! /*!
*/ */
void CTRStencilShadow::fragment_zfail_incr () void CTRStencilShadow::fragment_zfail_incr()
{ {
if (!Stencil)
return;
//tVideoSample *dst; //tVideoSample *dst;
#ifdef USE_ZBUFFER #ifdef USE_ZBUFFER
...@@ -396,12 +394,10 @@ void CTRStencilShadow::fragment_zfail_incr () ...@@ -396,12 +394,10 @@ void CTRStencilShadow::fragment_zfail_incr ()
stencil = (u32*) Stencil->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart; stencil = (u32*) Stencil->lock() + ( line.y * RenderTarget->getDimension().Width ) + xStart;
#endif #endif
#ifdef INVERSE_W #ifdef INVERSE_W
f32 inversew; f32 inversew;
#endif #endif
#ifdef IPOL_C0 #ifdef IPOL_C0
tFixPoint r3, g3, b3; tFixPoint r3, g3, b3;
#endif #endif
...@@ -441,7 +437,6 @@ void CTRStencilShadow::fragment_zfail_incr () ...@@ -441,7 +437,6 @@ void CTRStencilShadow::fragment_zfail_incr ()
line.l[0][0] += slopeL[0]; line.l[0][0] += slopeL[0];
#endif #endif
} }
} }
void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c )
...@@ -520,7 +515,6 @@ void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons ...@@ -520,7 +515,6 @@ void CTRStencilShadow::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons
f32 subPixel; f32 subPixel;
#endif #endif
// rasterize upper sub-triangle // rasterize upper sub-triangle
//if ( (f32) 0.0 != scan.invDeltaY[1] ) //if ( (f32) 0.0 != scan.invDeltaY[1] )
if ( F32_GREATER_0 ( scan.invDeltaY[1] ) ) if ( F32_GREATER_0 ( scan.invDeltaY[1] ) )
......
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