Expose stencil buffer to render code.

The intention is to provide a layer for tracking shadow
rendering, so a single bit is sufficient for now.
This commit is contained in:
Paul Chote
2013-03-03 22:03:04 +13:00
parent 1b34c7d6b9
commit f6264eeba4
4 changed files with 37 additions and 0 deletions

View File

@@ -53,6 +53,9 @@ namespace OpenRA.FileFormats.Graphics
void EnableDepthBuffer(); void EnableDepthBuffer();
void DisableDepthBuffer(); void DisableDepthBuffer();
void EnableStencilBuffer();
void DisableStencilBuffer();
} }
public interface IVertexBuffer<T> public interface IVertexBuffer<T>

View File

@@ -198,5 +198,17 @@ namespace OpenRA.Graphics
Flush(); Flush();
Device.DisableDepthBuffer(); Device.DisableDepthBuffer();
} }
public void EnableStencilBuffer()
{
Flush();
Device.EnableStencilBuffer();
}
public void DisableStencilBuffer()
{
Flush();
Device.DisableStencilBuffer();
}
} }
} }

View File

@@ -41,6 +41,9 @@ namespace OpenRA.Renderer.Null
public void EnableDepthBuffer() { } public void EnableDepthBuffer() { }
public void DisableDepthBuffer() { } public void DisableDepthBuffer() { }
public void EnableStencilBuffer() { }
public void DisableStencilBuffer() { }
public void Clear() { } public void Clear() { }
public void Present() { } public void Present() { }

View File

@@ -49,6 +49,7 @@ namespace OpenRA.Renderer.SdlCommon
Sdl.SDL_GL_SetAttribute( Sdl.SDL_GL_GREEN_SIZE, 8 ); Sdl.SDL_GL_SetAttribute( Sdl.SDL_GL_GREEN_SIZE, 8 );
Sdl.SDL_GL_SetAttribute( Sdl.SDL_GL_BLUE_SIZE, 8 ); Sdl.SDL_GL_SetAttribute( Sdl.SDL_GL_BLUE_SIZE, 8 );
Sdl.SDL_GL_SetAttribute( Sdl.SDL_GL_ALPHA_SIZE, 0 ); Sdl.SDL_GL_SetAttribute( Sdl.SDL_GL_ALPHA_SIZE, 0 );
Sdl.SDL_GL_SetAttribute( Sdl.SDL_GL_STENCIL_SIZE, 1 );
int windowFlags = 0; int windowFlags = 0;
switch (window) switch (window)
@@ -133,6 +134,24 @@ namespace OpenRA.Renderer.SdlCommon
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
} }
public void EnableStencilBuffer()
{
Gl.glClear(Gl.GL_STENCIL_BUFFER_BIT);
ErrorHandler.CheckGlError();
Gl.glEnable(Gl.GL_STENCIL_TEST);
ErrorHandler.CheckGlError();
Gl.glStencilFunc(Gl.GL_NOTEQUAL, 1, 1);
ErrorHandler.CheckGlError();
Gl.glStencilOp(Gl.GL_KEEP, Gl.GL_KEEP, Gl.GL_INCR);
ErrorHandler.CheckGlError();
}
public void DisableStencilBuffer()
{
Gl.glDisable(Gl.GL_STENCIL_TEST);
ErrorHandler.CheckGlError();
}
public void EnableDepthBuffer() public void EnableDepthBuffer()
{ {
Gl.glClear(Gl.GL_DEPTH_BUFFER_BIT); Gl.glClear(Gl.GL_DEPTH_BUFFER_BIT);