diff options
author | Kevin Rushforth <[email protected]> | 2007-03-29 22:39:59 +0000 |
---|---|---|
committer | Kevin Rushforth <[email protected]> | 2007-03-29 22:39:59 +0000 |
commit | ecd1e078bb8529490d9951335ab95e041a40f66c (patch) | |
tree | 8da42160266cb3a4731e881c5af5364a51ac8fd3 | |
parent | bb5331e867166954565f09ebfae6e9ef8e7d91f3 (diff) |
Issue 239: Stencil buffer should be cleared at the start of each frame
Note that the D3D code may still need to save/restore the stencil write
mask and enable flag.
git-svn-id: https://svn.java.net/svn/j3d-core~svn/trunk@804 ba19aa83-45c5-6ac9-afd3-db810772062c
-rw-r--r-- | src/classes/jogl/javax/media/j3d/JoglPipeline.java | 30 | ||||
-rw-r--r-- | src/native/d3d/Canvas3D.cpp | 37 | ||||
-rw-r--r-- | src/native/d3d/D3dCtx.hpp | 4 | ||||
-rw-r--r-- | src/native/ogl/Canvas3D.c | 24 |
4 files changed, 68 insertions, 27 deletions
diff --git a/src/classes/jogl/javax/media/j3d/JoglPipeline.java b/src/classes/jogl/javax/media/j3d/JoglPipeline.java index 4ba4868..541d78c 100644 --- a/src/classes/jogl/javax/media/j3d/JoglPipeline.java +++ b/src/classes/jogl/javax/media/j3d/JoglPipeline.java @@ -7633,10 +7633,13 @@ class JoglPipeline extends Pipeline { void clear(Context ctx, float r, float g, float b, boolean clearStencil) { if (VERBOSE) System.err.println("JoglPipeline.clear()"); - + JoglContext jctx = (JoglContext) ctx; GLContext context = context(ctx); GL gl = context.getGL(); + + // OBSOLETE CLEAR CODE + /* gl.glClearColor(r, g, b, jctx.getAlphaClearValue()); gl.glClear(GL.GL_COLOR_BUFFER_BIT); @@ -7647,12 +7650,33 @@ class JoglPipeline extends Pipeline { gl.glPopAttrib(); // Issue 239 - clear stencil if specified - // TODO KCR : Issue 239 - should we also set stencil mask? If so, we - // may need to save/restore like we do for depth mask if (clearStencil) { + gl.glPushAttrib(GL.GL_STENCIL_BUFFER_BIT); gl.glClearStencil(0); + gl.glStencilMask(~0); gl.glClear(GL.GL_STENCIL_BUFFER_BIT); + gl.glPopAttrib(); } + */ + + // Mask of which buffers to clear, this always includes color & depth + int clearMask = GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT; + + // Issue 239 - clear stencil if specified + if (clearStencil) { + gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT); + + gl.glClearStencil(0); + gl.glStencilMask(~0); + clearMask |= GL.GL_STENCIL_BUFFER_BIT; + } else { + gl.glPushAttrib(GL.GL_DEPTH_BUFFER_BIT); + } + + gl.glDepthMask(true); + gl.glClearColor(r, g, b, jctx.getAlphaClearValue()); + gl.glClear(clearMask); + gl.glPopAttrib(); } diff --git a/src/native/d3d/Canvas3D.cpp b/src/native/d3d/Canvas3D.cpp index 8463b0d..010da46 100644 --- a/src/native/d3d/Canvas3D.cpp +++ b/src/native/d3d/Canvas3D.cpp @@ -302,18 +302,22 @@ void JNICALL Java_javax_media_j3d_NativePipeline_clear( { GetDevice(); - + +// TODO ACES: The d3dCtx->stencilEnable and d3dCtx->stencilWriteEnable flags +// are not used in the rest of the code. They are never set to a value, and +// they are not looked at by most of the code. + /* Java 3D always clears the Z-buffer */ - /* @TODO check same operation for stencil */ - + if (!d3dCtx->zWriteEnable) { device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); - } + } - // TODO KCR : Issue 239 - use clearStencil to decide whether to clear stencil + // Issue 239 - clear stencil, if requested + if (clearStencil) { + device->SetRenderState(D3DRS_STENCILENABLE, TRUE); + device->SetRenderState(D3DRS_STENCILWRITEMASK, ~0); - /* clear stencil, if in used */ - if (d3dCtx->stencilWriteEnable ) { // clear stencil and ZBuffer HRESULT hr = device->Clear(0, NULL, D3DCLEAR_STENCIL | D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, @@ -321,7 +325,16 @@ void JNICALL Java_javax_media_j3d_NativePipeline_clear( if (hr == D3DERR_INVALIDCALL) { printf("[Java3D] Error cleaning Canvas3D stencil & ZBuffer\n"); } - // printf("canvas3D clear stencil & ZBuffer\n"); + // printf("canvas3D clear stencil & ZBuffer\n"); + + // TODO: DO WE NEED TO RESTORE THE STENCIL ENABLE AND WRITE MASK??? +// if (!d3dCtx->stencilEnable) { +// device->SetRenderState(D3DRS_STENCILENABLE, FALSE); +// } +// if (!d3dCtx->stencilWriteEnable) { +// device->SetRenderState(D3DRS_STENCILWRITEMASK, 0); +// } + } else { // clear ZBuffer only @@ -332,15 +345,11 @@ void JNICALL Java_javax_media_j3d_NativePipeline_clear( } // printf("canvas3D clear ZBuffer\n"); } - + if (!d3dCtx->zWriteEnable) { device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - } - // disable stencil - if (d3dCtx->stencilEnable && !d3dCtx->stencilWriteEnable) { - device->SetRenderState(D3DRS_STENCILENABLE, FALSE); } - + } extern "C" JNIEXPORT diff --git a/src/native/d3d/D3dCtx.hpp b/src/native/d3d/D3dCtx.hpp index 4365119..96aea9f 100644 --- a/src/native/d3d/D3dCtx.hpp +++ b/src/native/d3d/D3dCtx.hpp @@ -137,6 +137,10 @@ public: DWORD softwareVertexProcessing; DWORD zWriteEnable; DWORD zEnable; + +// TODO ACES: The following two stencil enable flags are not used +// consistently throughout the pipeline. They are never set to a value, +// and they are not looked at by most of the code. DWORD stencilWriteEnable; // new on 1.4 DWORD stencilEnable; // new on 1.4 diff --git a/src/native/ogl/Canvas3D.c b/src/native/ogl/Canvas3D.c index e70b0c3..fd0d7b9 100644 --- a/src/native/ogl/Canvas3D.c +++ b/src/native/ogl/Canvas3D.c @@ -1476,7 +1476,8 @@ void JNICALL Java_javax_media_j3d_NativePipeline_clear( fprintf(stderr, "Canvas3D.clear(%g, %g, %g, %s)\n", r, g, b, (stencilClear ? "true" : "false")); #endif - + +#ifdef OBSOLETE_CLEAR_CODE glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue); glClear(GL_COLOR_BUFFER_BIT); @@ -1487,31 +1488,34 @@ void JNICALL Java_javax_media_j3d_NativePipeline_clear( glPopAttrib(); /* Issue 239 - clear stencil if specified */ - /* - * TODO KCR : Issue 239 - should we also set stencil mask? If so, we - * may need to save/restore like we do for depth mask - */ if (clearStencil) { + glPushAttrib(GL_STENCIL_BUFFER_BIT); glClearStencil(0); + glStencilMask(~0); glClear(GL_STENCIL_BUFFER_BIT); + glPopAttrib(); } -/* TODO: we should be able to do the following, which should perform better... */ -#if 0 +#endif /* OBSOLETE_CLEAR_CODE */ + + /* Mask of which buffers to clear, this always includes color & depth */ int clearMask = GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT; + /* Issue 239 - clear stencil if specified */ if (clearStencil) { + glPushAttrib(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glClearStencil(0); + glStencilMask(~0); clearMask |= GL_STENCIL_BUFFER_BIT; + } else { + glPushAttrib(GL_DEPTH_BUFFER_BIT); } - glPushAttrib(GL_DEPTH_BUFFER_BIT); glDepthMask(GL_TRUE); glClearColor((float)r, (float)g, (float)b, ctxProperties->alphaClearValue); glClear(clearMask); glPopAttrib(); -#endif - } JNIEXPORT |