From d1c46d1f3dfde6a700c94790e5737ffdb7b6c58a Mon Sep 17 00:00:00 2001 From: Michal Stawinski Date: Mon, 10 Jun 2013 01:03:17 +0200 Subject: [PATCH 1/2] Fix issues with GLScissorStack There were two issues in current implementation: - original clip rects where kept on stack, instead of clipping intersections - when popping topmost frame nothing happened (we should return to previous clip intersection) --- .../andengine/opengl/util/GLScissorStack.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/org/andengine/opengl/util/GLScissorStack.java b/src/org/andengine/opengl/util/GLScissorStack.java index 6dae8f197..21f3f41e8 100644 --- a/src/org/andengine/opengl/util/GLScissorStack.java +++ b/src/org/andengine/opengl/util/GLScissorStack.java @@ -85,10 +85,10 @@ public void glPushScissor(final int pX, final int pY, final int pWidth, final in height = pHeight; } else { /* Take the intersection between the current and the new scissor: */ - final int currentX = this.mScissorStack[this.mScissorStackOffset - (GLSCISSOR_SIZE - GLSCISSOR_X_INDEX)]; - final int currentY = this.mScissorStack[this.mScissorStackOffset - (GLSCISSOR_SIZE - GLSCISSOR_Y_INDEX)]; - final int currentWidth = this.mScissorStack[this.mScissorStackOffset - (GLSCISSOR_SIZE - GLSCISSOR_WIDTH_INDEX)]; - final int currentHeight = this.mScissorStack[this.mScissorStackOffset - (GLSCISSOR_SIZE - GLSCISSOR_HEIGHT_INDEX)]; + final int currentX = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_X_INDEX]; + final int currentY = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_Y_INDEX]; + final int currentWidth = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_WIDTH_INDEX]; + final int currentHeight = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_HEIGHT_INDEX]; final float xMin = Math.max(currentX, pX); final float xMax = Math.min(currentX + currentWidth, pX + pWidth); @@ -102,14 +102,14 @@ public void glPushScissor(final int pX, final int pY, final int pWidth, final in height = (int) (yMax - yMin); } - this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_X_INDEX] = pX; - this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_Y_INDEX] = pY; - this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_WIDTH_INDEX] = pWidth; - this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_HEIGHT_INDEX] = pHeight; + this.mScissorStackOffset += GLScissorStack.GLSCISSOR_SIZE; - GLES20.glScissor(x, y, width, height); + this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_X_INDEX] = x; + this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_Y_INDEX] = y; + this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_WIDTH_INDEX] = width; + this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_HEIGHT_INDEX] = height; - this.mScissorStackOffset += GLScissorStack.GLSCISSOR_SIZE; + GLES20.glScissor(x, y, width, height); } public void glPopScissor() { From c7aae3b1e2ebb53adff31575e0f96c5143ec10c4 Mon Sep 17 00:00:00 2001 From: Michal Stawinski Date: Fri, 28 Jun 2013 11:20:31 +0200 Subject: [PATCH 2/2] Fix issue with ClipEntities with empty intersection This resulted in strange artifacts --- .../andengine/opengl/util/GLScissorStack.java | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/org/andengine/opengl/util/GLScissorStack.java b/src/org/andengine/opengl/util/GLScissorStack.java index 21f3f41e8..d40612c04 100644 --- a/src/org/andengine/opengl/util/GLScissorStack.java +++ b/src/org/andengine/opengl/util/GLScissorStack.java @@ -90,16 +90,27 @@ public void glPushScissor(final int pX, final int pY, final int pWidth, final in final int currentWidth = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_WIDTH_INDEX]; final int currentHeight = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_HEIGHT_INDEX]; - final float xMin = Math.max(currentX, pX); - final float xMax = Math.min(currentX + currentWidth, pX + pWidth); - - final float yMin = Math.max(currentY, pY); - final float yMax = Math.min(currentY + currentHeight, pY + pHeight); - - x = (int) xMin; - y = (int) yMin; - width = (int) (xMax - xMin); - height = (int) (yMax - yMin); + final int xMin = Math.max(currentX, pX); + final int xMax = Math.min(currentX + currentWidth, pX + pWidth); + + final int yMin = Math.max(currentY, pY); + final int yMax = Math.min(currentY + currentHeight, pY + pHeight); + + if (xMax > xMin) { + x = xMin; + width = xMax - xMin; + } else { + x = pX; + width = 0; + } + + if (yMax > yMin) { + y = yMin; + height = yMax - yMin; + } else { + y = pY; + height = 0; + } } this.mScissorStackOffset += GLScissorStack.GLSCISSOR_SIZE;