commit 20ee7cc9be1a13856ecea49658cca6eb269f36f6
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Mon Jul 3 15:18:37 2017 +0100

    Bugfix in RenderState

diff --git a/src/main/java/org/distorted/library/main/DistortedRenderState.java b/src/main/java/org/distorted/library/main/DistortedRenderState.java
index 5e8ce76..e913aa4 100644
--- a/src/main/java/org/distorted/library/main/DistortedRenderState.java
+++ b/src/main/java/org/distorted/library/main/DistortedRenderState.java
@@ -121,32 +121,61 @@ public class DistortedRenderState
 
   static void colorDepthStencilOn()
     {
+    sState.colorMaskR = cState.colorMaskR;
+    sState.colorMaskG = cState.colorMaskG;
+    sState.colorMaskB = cState.colorMaskB;
+    sState.colorMaskA = cState.colorMaskA;
+
     if( cState.colorMaskR!=1 || cState.colorMaskG!=1 || cState.colorMaskB!=1 || cState.colorMaskA!=1 )
       {
-      sState.colorMaskR = cState.colorMaskR;
-      sState.colorMaskG = cState.colorMaskG;
-      sState.colorMaskB = cState.colorMaskB;
-      sState.colorMaskA = cState.colorMaskA;
       cState.colorMaskR = 1;
       cState.colorMaskG = 1;
       cState.colorMaskB = 1;
       cState.colorMaskA = 1;
       GLES30.glColorMask(true,true,true,true);
       }
+
+    sState.depthMask = cState.depthMask;
+
     if( cState.depthMask!=1 )
       {
-      sState.depthMask = cState.depthMask;
       cState.depthMask = 1;
       GLES30.glDepthMask(true);
       }
+
+    sState.stencilMask = cState.stencilMask;
+
     if( cState.stencilMask!= STENCIL_MASK )
       {
-      sState.stencilMask = cState.stencilMask;
       cState.stencilMask = STENCIL_MASK;
       GLES30.glStencilMask(cState.stencilMask);
       }
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static void colorDepthStencilRestore()
+    {
+    if( sState.colorMaskR!=cState.colorMaskR || sState.colorMaskG!=cState.colorMaskG || sState.colorMaskB!=cState.colorMaskB || sState.colorMaskA!=cState.colorMaskA)
+      {
+      cState.colorMaskR = sState.colorMaskR;
+      cState.colorMaskG = sState.colorMaskG;
+      cState.colorMaskB = sState.colorMaskB;
+      cState.colorMaskA = sState.colorMaskA;
+      GLES30.glColorMask(cState.colorMaskR==1,cState.colorMaskG==1,cState.colorMaskB==1,cState.colorMaskA==1);
+      }
+    if( sState.depthMask!=cState.depthMask )
+      {
+      cState.depthMask = sState.depthMask;
+      GLES30.glDepthMask(cState.depthMask==1);
+      }
+    if( sState.stencilMask!=cState.stencilMask )
+      {
+      cState.stencilMask = sState.stencilMask;
+      GLES30.glStencilMask(cState.stencilMask);
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   static void switchOffDrawing()
@@ -166,41 +195,48 @@ public class DistortedRenderState
 
   static void setUpStencilMark()
     {
+    sState.stencilTest = cState.stencilTest;
+
     if( cState.stencilTest!=1 )
       {
-      sState.stencilTest = cState.stencilTest;
       cState.stencilTest = 1;
       //android.util.Log.d("State", "stencil test on");
       GLES30.glEnable(GLES30.GL_STENCIL_TEST);
       }
+
+    sState.stencilFuncFunc = cState.stencilFuncFunc;
+    sState.stencilFuncRef  = cState.stencilFuncRef;
+    sState.stencilFuncMask = cState.stencilFuncMask;
+
     if( cState.stencilFuncFunc!=GLES30.GL_ALWAYS || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
       {
-      sState.stencilFuncFunc = cState.stencilFuncFunc;
-      sState.stencilFuncRef  = cState.stencilFuncRef;
-      sState.stencilFuncMask = cState.stencilFuncMask;
       cState.stencilFuncFunc = GLES30.GL_ALWAYS;
       cState.stencilFuncRef  = 1;
       cState.stencilFuncMask = STENCIL_MASK;
       //android.util.Log.d("State", "stencil func on");
       GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
       }
+
+    sState.stencilOpSfail = cState.stencilOpSfail;
+    sState.stencilOpDpfail= cState.stencilOpDpfail;
+    sState.stencilOpDppass= cState.stencilOpDppass;
+
     if( cState.stencilOpSfail!=GLES30.GL_KEEP || cState.stencilOpDpfail!=GLES30.GL_KEEP || cState.stencilOpDppass!=GLES30.GL_REPLACE )
       {
-      sState.stencilOpSfail = cState.stencilOpSfail;
-      sState.stencilOpDpfail= cState.stencilOpDpfail;
-      sState.stencilOpDppass= cState.stencilOpDppass;
       cState.stencilOpSfail = GLES30.GL_KEEP;
       cState.stencilOpDpfail= GLES30.GL_KEEP;
       cState.stencilOpDppass= GLES30.GL_REPLACE;
       //android.util.Log.d("State", "stencil op on");
       GLES30.glStencilOp(cState.stencilOpSfail,cState.stencilOpDpfail,cState.stencilOpDppass);
       }
+
+    sState.colorMaskR = cState.colorMaskR;
+    sState.colorMaskG = cState.colorMaskG;
+    sState.colorMaskB = cState.colorMaskB;
+    sState.colorMaskA = cState.colorMaskA;
+
     if( cState.colorMaskR!=0 || cState.colorMaskG!=0 || cState.colorMaskB!=0 || cState.colorMaskA!=0 )
       {
-      sState.colorMaskR = cState.colorMaskR;
-      sState.colorMaskG = cState.colorMaskG;
-      sState.colorMaskB = cState.colorMaskB;
-      sState.colorMaskA = cState.colorMaskA;
       cState.colorMaskR = 0;
       cState.colorMaskG = 0;
       cState.colorMaskB = 0;
@@ -208,16 +244,20 @@ public class DistortedRenderState
       //android.util.Log.d("State", "switch off color writing");
       GLES30.glColorMask(false,false,false,false);
       }
+
+    sState.depthMask = cState.depthMask;
+
     if( cState.depthMask!=1 )
       {
-      sState.depthMask = cState.depthMask;
       cState.depthMask = 1;
       //android.util.Log.d("State", "switch on depth writing");
       GLES30.glDepthMask(true);
       }
+
+    sState.stencilMask = cState.stencilMask;
+
     if( cState.stencilMask!= STENCIL_MASK )
       {
-      sState.stencilMask = cState.stencilMask;
       cState.stencilMask = STENCIL_MASK;
       //android.util.Log.d("State", "stencil mask on");
       GLES30.glStencilMask(cState.stencilMask);
@@ -269,37 +309,46 @@ public class DistortedRenderState
  */
   public static void useStencilMark()
     {
+    sState.stencilMask = cState.stencilMask;
+
     if( cState.stencilTest!=1 )
       {
-      sState.stencilTest = cState.stencilTest;
       cState.stencilTest = 1;
       GLES30.glEnable(GLES30.GL_STENCIL_TEST);
       }
+
+    sState.stencilFuncFunc = cState.stencilFuncFunc;
+    sState.stencilFuncRef  = cState.stencilFuncRef;
+    sState.stencilFuncMask = cState.stencilFuncMask;
+
     if( cState.stencilFuncFunc!=GLES30.GL_EQUAL || cState.stencilFuncRef!=1 || cState.stencilFuncMask!=STENCIL_MASK )
       {
-      sState.stencilFuncFunc = cState.stencilFuncFunc;
-      sState.stencilFuncRef  = cState.stencilFuncRef;
-      sState.stencilFuncMask = cState.stencilFuncMask;
       cState.stencilFuncFunc = GLES30.GL_EQUAL;
       cState.stencilFuncRef  = 1;
       cState.stencilFuncMask = STENCIL_MASK;
       GLES30.glStencilFunc(cState.stencilFuncFunc,cState.stencilFuncRef,cState.stencilFuncMask);
       }
+
+    sState.stencilMask = cState.stencilMask;
+
     if( cState.stencilMask!= 0x00 )
       {
-      sState.stencilMask = cState.stencilMask;
       cState.stencilMask = 0x00;
       GLES30.glStencilMask(cState.stencilMask);
       }
-     if( cState.depthMask!=0 )
+
+    sState.depthMask = cState.depthMask;
+
+    if( cState.depthMask!=0 )
       {
-      sState.depthMask = cState.depthMask;
       cState.depthMask = 0;
       GLES30.glDepthMask(false);
       }
+
+    sState.depthTest = cState.depthTest;
+
     if( cState.depthTest!=0 )
       {
-      sState.depthTest = cState.depthTest;
       cState.depthTest = 0;
       GLES30.glDisable(GLES30.GL_DEPTH_TEST);
       }
