commit b4cbe0562aa8886f48d5a94b9ba41c41844a89f7
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Oct 27 13:52:39 2022 +0200

    Disable writing DEPTH and STENCIL to the Screen from both the TwistyObjectNode and the Overlay Node.

diff --git a/src/main/java/org/distorted/main/RubikRenderer.java b/src/main/java/org/distorted/main/RubikRenderer.java
index 90e78e78..06f4413b 100644
--- a/src/main/java/org/distorted/main/RubikRenderer.java
+++ b/src/main/java/org/distorted/main/RubikRenderer.java
@@ -13,6 +13,7 @@ import android.app.Activity;
 import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
+import org.distorted.library.main.InternalOutputSurface;
 import org.distorted.objectlib.effects.BaseEffect;
 import org.distorted.library.effect.EffectType;
 import org.distorted.library.effect.VertexEffectQuaternion;
@@ -22,6 +23,7 @@ import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.mesh.MeshBase;
 import org.distorted.external.RubikNetwork;
 import org.distorted.objectlib.main.ObjectControl;
+import org.distorted.overlays.OverlayGeneric;
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
@@ -89,6 +91,7 @@ public class RubikRenderer implements GLSurfaceView.Renderer, DistortedLibrary.E
      mFPS = new Fps();
      mScreen = new DistortedScreen();
      mScreen.glClearColor(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS, 1.0f);
+     mScreen.enableDepthStencil(InternalOutputSurface.DEPTH_NO_STENCIL);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -124,6 +127,7 @@ public class RubikRenderer implements GLSurfaceView.Renderer, DistortedLibrary.E
       VertexEffectRotate.enable();
       VertexEffectQuaternion.enable();
       BaseEffect.Type.enableEffects();
+      OverlayGeneric.enableEffects();
 
       DistortedLibrary.onSurfaceCreated(mView.getContext(),this,1);
       DistortedLibrary.setCull(true);
diff --git a/src/main/java/org/distorted/main/RubikSurfaceView.java b/src/main/java/org/distorted/main/RubikSurfaceView.java
index abb8ae20..09068da3 100644
--- a/src/main/java/org/distorted/main/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/main/RubikSurfaceView.java
@@ -47,6 +47,8 @@ public class RubikSurfaceView extends GLSurfaceView
         mCreated = true;
         mObjectController.createNode(width,height);
         TwistyObjectNode objectNode = mObjectController.getNode();
+        objectNode.glDepthMask(false);
+        objectNode.glStencilMask(0);
         mRenderer.getScreen().attach(objectNode);
         }
       }
diff --git a/src/main/java/org/distorted/overlays/OverlayGeneric.java b/src/main/java/org/distorted/overlays/OverlayGeneric.java
index 513d24c5..ee0d0b3b 100644
--- a/src/main/java/org/distorted/overlays/OverlayGeneric.java
+++ b/src/main/java/org/distorted/overlays/OverlayGeneric.java
@@ -11,9 +11,55 @@ package org.distorted.overlays;
 
 import org.distorted.library.main.DistortedScreen;
 
+import java.lang.reflect.Method;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public abstract class OverlayGeneric
 {
+   private enum Overlays
+      {
+      STARS ( OverlayStars.class )
+      ;
+
+      private final Class<? extends OverlayGeneric> mClass;
+
+      Overlays(Class<? extends OverlayGeneric> clazz)
+         {
+         mClass = clazz;
+         }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public static void enableEffects()
+     {
+     Method method;
+
+     for(Overlays overlay: Overlays.values() )
+        {
+        try
+          {
+          method = overlay.mClass.getDeclaredMethod("enableEffects");
+          }
+        catch(NoSuchMethodException ex)
+          {
+          android.util.Log.e("OverlayGeneric", overlay.mClass.getSimpleName()+": exception getting method: "+ex.getMessage());
+          method = null;
+          }
+
+        try
+          {
+          if( method!=null ) method.invoke(null);
+          }
+        catch(Exception ex)
+          {
+          android.util.Log.e("OverlayGeneric", overlay.mClass.getSimpleName()+": exception invoking method: "+ex.getMessage());
+          }
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
    public abstract long startOverlay(DistortedScreen screen, ListenerOverlay listener, DataGeneric data);
 }
\ No newline at end of file
diff --git a/src/main/java/org/distorted/overlays/OverlayStars.java b/src/main/java/org/distorted/overlays/OverlayStars.java
index d31d3aee..39b75595 100644
--- a/src/main/java/org/distorted/overlays/OverlayStars.java
+++ b/src/main/java/org/distorted/overlays/OverlayStars.java
@@ -13,68 +13,133 @@ import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 
-import org.distorted.library.effect.MatrixEffectMove;
-import org.distorted.library.effect.MatrixEffectRotate;
-import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.effect.VertexEffectMove;
+import org.distorted.library.effect.VertexEffectRotate;
+import org.distorted.library.effect.VertexEffectScale;
 import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedNode;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
+import org.distorted.library.main.InternalOutputSurface;
+import org.distorted.library.mesh.MeshJoined;
 import org.distorted.library.mesh.MeshQuad;
 import org.distorted.library.message.EffectListener;
 import org.distorted.library.type.Dynamic1D;
+import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
 import org.distorted.main.R;
 
+import java.util.Random;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class OverlayStars extends OverlayGeneric implements EffectListener
 {
+   private static final int DUR_ALL = 10000;
+   private static final int DUR_MOV =  5000;
+
    private ListenerOverlay mListener;
    private DistortedNode mNode;
    private DistortedScreen mScreen;
+   private final Static3D mPointE = new Static3D(0,0,2);
+   private float mWidth, mHeight;
+   private Random mRandom;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private Dynamic3D createRandomMove()
+      {
+      Dynamic3D move = new Dynamic3D();
+      move.setDuration(DUR_MOV);
+      move.setCount(0.5f);
+
+      float widthS = (mRandom.nextFloat()-0.5f)*mWidth;
+      float widthM = widthS + (mRandom.nextFloat()-0.5f)*mWidth*0.2f;
+
+      Static3D pointS = new Static3D(widthS,mHeight/2,2);
+      Static3D pointM = new Static3D(widthM,mHeight/4,2);
+
+      move.add(pointS);
+      move.add(pointM);
+      move.add(mPointE);
+
+      return move;
+      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    private DistortedNode createNode(Resources res, int totS, int newS)
       {
+      // texture /////////////////////////////////////////////////////
       Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.star);
       DistortedTexture texture = new DistortedTexture();
       texture.setTexture(bmp);
 
-      float scale = mScreen.getWidth()*0.3f;
+      // mesh ////////////////////////////////////////////////////////
+
+      MeshQuad[] mesh = new MeshQuad[newS+1];
+
+      for(int i=0; i<newS+1; i++)
+         {
+         mesh[i] = new MeshQuad();
+         mesh[i].setEffectAssociation(0,(i==0?0:1),i);
+         }
 
-      Static3D move     = new Static3D(0,0,1);
+      MeshJoined wholeMesh = new MeshJoined(mesh);
+
+      // effects: main ///////////////////////////////////////////////
+      DistortedEffects effects = new DistortedEffects();
+
+      float scaleM = mWidth*0.3f;
+      float scaleP = mWidth*0.1f;
+
+      Static3D moveM    = new Static3D(0,0,1);
       Static1D point0   = new Static1D(0);
       Static1D point360 = new Static1D(360);
       Dynamic1D angle   = new Dynamic1D();
       angle.add(point0);
       angle.add(point360);
       angle.setCount(0.5f);
-      angle.setDuration(5000);
+      angle.setDuration(DUR_ALL);
       Static3D axis = new Static3D(0,0,1);
       Static3D center = new Static3D(0,0,0);
 
-      DistortedEffects effects = new DistortedEffects();
-      MatrixEffectMove moveEffect = new MatrixEffectMove(move);
-      MatrixEffectScale scaleEffect = new MatrixEffectScale(scale);
-      MatrixEffectRotate rotateEffect = new MatrixEffectRotate(angle,axis,center);
-      effects.apply(moveEffect);
-      effects.apply(scaleEffect);
-      effects.apply(rotateEffect);
-
-      rotateEffect.notifyWhenFinished(this);
-
-      MeshQuad mesh = new MeshQuad();
-
-      return new DistortedNode(texture,effects,mesh);
+      VertexEffectMove mainMove     = new VertexEffectMove(moveM);
+      VertexEffectScale mainScale   = new VertexEffectScale(scaleM);
+      VertexEffectRotate mainRotate = new VertexEffectRotate(angle,axis,center);
+      mainMove.setMeshAssociation(2,0);
+      mainScale.setMeshAssociation(2,0);
+      mainRotate.setMeshAssociation(2,0);
+      mainRotate.notifyWhenFinished(this);
+
+      // effects: moving stars ///////////////////////////////////////
+      VertexEffectScale scaleE = new VertexEffectScale(scaleP);
+      scaleE.setMeshAssociation(1,-1);
+      effects.apply(scaleE);
+
+      for(int i=1; i<newS+1; i++)
+        {
+        Dynamic3D moveP = createRandomMove();
+        VertexEffectMove moveE= new VertexEffectMove(moveP);
+        moveE.setMeshAssociation(2,i);
+        effects.apply(moveE);
+        }
+
+      // main effect queue ///////////////////////////////////////////
+      effects.apply(mainMove);
+      effects.apply(mainScale);
+      effects.apply(mainRotate);
+
+      return new DistortedNode(texture,effects,wholeMesh);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
    public long startOverlay(DistortedScreen screen, ListenerOverlay listener, DataGeneric data)
       {
+      if( mRandom==null ) mRandom = new Random();
+
       mScreen = screen;
       mListener= listener;
       DataStars stars = (DataStars)data;
@@ -82,7 +147,13 @@ public class OverlayStars extends OverlayGeneric implements EffectListener
       int newS = stars.getNew();
       Resources res = stars.getResources();
 
+      mWidth = mScreen.getWidth();
+      mHeight= mScreen.getHeight();
+
       mNode = createNode(res,totS,newS);
+      mNode.glDepthMask(false);
+      mNode.glStencilMask(0);
+      mNode.enableDepthStencil(InternalOutputSurface.NO_DEPTH_NO_STENCIL);
       mScreen.attach(mNode);
 
       return 0;
@@ -95,4 +166,14 @@ public class OverlayStars extends OverlayGeneric implements EffectListener
       mScreen.detach(mNode);
       mListener.overlayFinished(id);
       }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @SuppressWarnings("unused")
+  public static void enableEffects()
+     {
+     VertexEffectMove.enable();
+     VertexEffectScale.enable();
+     VertexEffectRotate.enable();
+     }
 }
\ No newline at end of file
