From c67da2e5d8655704601d6d06e8bc60aabe212253 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 23 Jun 2019 21:49:12 -0400
Subject: [PATCH] Compute shadow when live option.

---
 CameraPane.java  |   42 +++++++++++---------
 Globals.java     |    1 
 cRadio.java      |    3 +
 GroupEditor.java |   30 ++++++++++++++
 Mocap.java       |    2 
 Object3D.java    |    7 ++-
 Grafreed.java    |    2 
 7 files changed, 62 insertions(+), 25 deletions(-)

diff --git a/CameraPane.java b/CameraPane.java
index 76ad7dc..7afdef6 100644
--- a/CameraPane.java
+++ b/CameraPane.java
@@ -326,7 +326,7 @@
                 cStatic.objectstack[materialdepth++] = obj;
                 //System.out.println("material " + material);
                 //Applet3D.tracein(this, selected);
-                display.vector2buffer = obj.projectedVertices;
+                //display.vector2buffer = obj.projectedVertices;
                 if (obj instanceof Camera)
                 {
                     display.options1[0] = material.shift;
@@ -358,7 +358,7 @@
                 /**/
                 } else
                 {
-                    DrawMaterial(material, selected);
+                    DrawMaterial(material, selected, obj.projectedVertices);
                 }
             } else
             {
@@ -382,8 +382,8 @@
             cStatic.objectstack[materialdepth++] = obj;
             //System.out.println("material " + material);
             //Applet3D.tracein("selected ", selected);
-            display.vector2buffer = obj.projectedVertices;
-            display.DrawMaterial(material, selected);
+            //display.vector2buffer = obj.projectedVertices;
+            display.DrawMaterial(material, selected, obj.projectedVertices);
         }
     }
     
@@ -400,8 +400,8 @@
                 materialdepth -= 1;
                 if (materialdepth > 0)
                 {
-                    display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
-                    display.DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1]);
+                    //display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
+                    display.DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1], cStatic.objectstack[materialdepth - 1].projectedVertices);
                 }
             //Applet3D.traceout("selected ", (stackdepth>0)?selectedstack[stackdepth-1]:"???");
             } else if (selected && CameraPane.flash && obj.GetMaterial() != null)
@@ -421,8 +421,8 @@
             materialdepth -= 1;
             if (materialdepth > 0)
             {
-                display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
-                display.DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1]);
+                //display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
+                display.DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1], cStatic.objectstack[materialdepth - 1].projectedVertices);
             }
         //Applet3D.traceout("selected ", (stackdepth>0)?selectedstack[stackdepth-1]:"???");
         //else
@@ -1610,7 +1610,7 @@
 //        gl.glMaterialfv(gl.GL_BACK, gl.GL_DIFFUSE, colorV, 0);
     }
     
-    void DrawMaterial(cMaterial material, boolean selected)
+    void DrawMaterial(cMaterial material, boolean selected, Object3D.cVector2[] others)
     {
             CameraPane display = this;
         //new Exception().printStackTrace();
@@ -1645,7 +1645,7 @@
             colorV[0] = display.modelParams0[0] * material.diffuse;
             colorV[1] = display.modelParams0[1] * material.diffuse;
             colorV[2] = display.modelParams0[2] * material.diffuse;
-            colorV[3] = material.opacity;
+            colorV[3] = 1; // material.opacity;
 
             gl.glColor4f(colorV[0], colorV[1], colorV[2], material.opacity);
             //System.out.println("Opacity = " + opacity);
@@ -1753,9 +1753,9 @@
         display.modelParams7[2] = 0;
         display.modelParams7[3] = 0;
 
-        display.modelParams6[0] = 100; // criss de bug de bump
+        //display.modelParams6[0] = 100; // criss de bug de bump
         
-        Object3D.cVector2[] extparams = display.vector2buffer;
+        Object3D.cVector2[] extparams = others; // display.vector2buffer;
         if (extparams != null && extparams.length > 0 && extparams[0] != null)
         {
             display.modelParams6[0] = extparams[0].x / 1000.0f; // bump
@@ -10548,7 +10548,8 @@
             ambientOcclusion = false;
         }
 
-        if (Globals.lighttouched && DrawMode() == DEFAULT) // && !lightMode) // && !FROZEN)
+        if (//Globals.lighttouched &&
+                DrawMode() == DEFAULT) // && !lightMode) // && !FROZEN)
         {
             //if (RENDERSHADOW) // ?
             if (!IsFrozen())
@@ -13315,7 +13316,8 @@
     /*static*/ float[] modelParams5 = new float[]{0, 0, 0, 0}; // texture, opacity, fakedepth, shadowbias
     /*static*/ float[] modelParams6 = new float[]{0, 0, 0, 0}; // bump, noise, borderfade, fog punchthrough
     /*static*/ float[] modelParams7 = new float[]{0, 0, 0, 0}; // noise power, opacity power
-    Object3D.cVector2[] vector2buffer;
+    
+    //Object3D.cVector2[] vector2buffer;
 
     // IN : ndotl, ndoth, xxx, NdotL //, snininess, lightarea
     // OUT : diff, spec
@@ -14539,7 +14541,9 @@
         ci.camera = renderCamera;
         if (!isRenderer)
         {
-            if (object.editWindow.copy.doEditClick(ci, 0))
+            ObjEditor editWindow = object.editWindow;
+            Object3D copy = editWindow.copy;
+            if (copy.doEditClick(ci, 0))
             {
                 setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
             } else
@@ -16385,16 +16389,16 @@
                 cStatic.objectstack[materialdepth++] = checker;
                 //System.out.println("material " + material);
                 //Applet3D.tracein(this, selected);
-                vector2buffer = checker.projectedVertices;
+                //vector2buffer = checker.projectedVertices;
 
         //checker.GetMaterial().Draw(this, false); // true);
-        DrawMaterial(checker.GetMaterial(), false); // true);
+        DrawMaterial(checker.GetMaterial(), false, checker.projectedVertices); // true);
 
                 materialdepth -= 1;
                 if (materialdepth > 0)
                 {
-                    vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
-                    DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1]);
+                    //vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices;
+                    DrawMaterial(materialstack[materialdepth - 1], selectedstack[materialdepth - 1], cStatic.objectstack[materialdepth - 1].projectedVertices);
                 }
         //checker.GetMaterial().opacity = 1f;
         ////checker.GetMaterial().ambient = 1f;
diff --git a/Globals.java b/Globals.java
index 3cb946a..3489016 100644
--- a/Globals.java
+++ b/Globals.java
@@ -7,6 +7,7 @@
     static iCameraPane theRenderer;
     
         private static boolean LIVE = false;
+        public static boolean COMPUTESHADOWWHENLIVE = true;
         public static boolean RENDERSHADOW = true;
         
         public static boolean MOUSEDRAGGED = false;
diff --git a/Grafreed.java b/Grafreed.java
index f05fa38..7007edf 100644
--- a/Grafreed.java
+++ b/Grafreed.java
@@ -876,7 +876,7 @@
     static int depth = 0;
     static java.util.Stack stack = new java.util.Stack();
     static boolean traceoff = false; // true;
-    static float[] colorV = new float[5];
+    static float[] colorV = new float[4]; // 5];
 
     static void traceon()
     {
diff --git a/GroupEditor.java b/GroupEditor.java
index 8646c14..33acfd4 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -808,11 +808,19 @@
 //                debugCB.addItemListener(this);
 
                 panel.add(oeilCB = new cCheckBox("Eye", CameraPane.OEIL)); //, constraints);
+                oeilCB.setToolTipText("Move camera when tracking target");
                                 oeilCB.addItemListener(this);
 
+                panel.add(shadowCB = new cCheckBox("Shadow", Globals.COMPUTESHADOWWHENLIVE)); //, constraints);
+                shadowCB.setToolTipText("Compute shadows when live");
+                                shadowCB.addItemListener(this);
+
+            if (Globals.ADVANCED)
+            {
                 panel.add(lookAtCB = new cCheckBox("Target", CameraPane.LOOKAT)); //, constraints);
                 lookAtCB.setToolTipText("Look-at target");
                                 lookAtCB.addItemListener(this);
+            }
                 
         }
                                 
@@ -827,6 +835,14 @@
         void EditObject(Object3D obj)
         {
             cRadio radioButton = new cRadio(obj.name);
+            
+            // Patch to avoid bug with transparency.
+            radioButton.hadMaterial = obj.material != null;
+            if (!radioButton.hadMaterial)
+            {
+                obj.material = new cMaterial();
+            }
+            
             radioButton.SetObject(obj);
             radioButton.layout = sevenButton;
             radioButton.SetCamera(cameraView.renderCamera, false);
@@ -863,7 +879,9 @@
         JCheckBox speakerCameraCB;
         JCheckBox speakerFocusCB;
         JCheckBox debugCB;
+        
         JCheckBox oeilCB;
+        JCheckBox shadowCB;
         JCheckBox lookAtCB;
         
 //        static int COLOR = 1;
@@ -966,6 +984,10 @@
             else if(e.getSource() == oeilCB)
             {
                 cameraView.ToggleOeil();
+            }
+            else if(e.getSource() == shadowCB)
+            {
+                Globals.COMPUTESHADOWWHENLIVE ^= true;
             }
             else if(e.getSource() == lookAtCB)
             {
@@ -3126,8 +3148,14 @@
                     for (Enumeration e = buttonGroup.getElements(); e.hasMoreElements();)
                     {
                             ab = (cRadio)e.nextElement();
-                            if(ab.getModel().isSelected() && ab.GetObject() != client)
+                            if (ab.getModel().isSelected() && ab.GetObject() != client)
                             {
+                                // Patch to avoid bug with transparency.
+                                if (!ab.hadMaterial)
+                                {
+                                    ab.object.material = null;
+                                }
+                                
                                 buttonGroup.remove(ab);
                                 radioPanel.remove(ab);
                                 
diff --git a/Mocap.java b/Mocap.java
index a98d80c..438e46a 100644
--- a/Mocap.java
+++ b/Mocap.java
@@ -3915,7 +3915,7 @@
      //       return;
         
         if (//!restarted && /*display.restartframe &&*/
-                Globals.isLIVE() && live && (display.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW))
+                Globals.isLIVE() && live && (display.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || !Globals.COMPUTESHADOWWHENLIVE))
         {
             //display.restartframe = false;
             restarted = true;
diff --git a/Object3D.java b/Object3D.java
index a5ae9d9..45bb2a6 100644
--- a/Object3D.java
+++ b/Object3D.java
@@ -881,7 +881,7 @@
         
         if (marked && Globals.isLIVE() && live &&
                 //TEMP21aug2018
-                (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW) &&
+                (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || !Globals.COMPUTESHADOWWHENLIVE) &&
                 currentframe != Globals.framecount)
         {
             currentframe = Globals.framecount;
@@ -966,6 +966,7 @@
         if (material == null || material.multiply)
             return true;
         
+        // Transparent objects are dynamic because we have to sort the triangles.
         return material.opacity > 0.99;
     }
     
@@ -5750,7 +5751,7 @@
             support = support;
         
         //boolean usecalllists = IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null || !link2master); // !(this instanceof cSpring) && !(this instanceof BezierPatch);
-        boolean usecalllists = IsLive(); // IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null) && !link2master; // !(this instanceof cSpring) && !(this instanceof BezierPatch);
+        boolean usecalllists = !IsLive(); // IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null) && !link2master; // !(this instanceof cSpring) && !(this instanceof BezierPatch);
         
         if (!usecalllists && bRep != null && bRep.displaylist > 0)
         {
@@ -5771,7 +5772,7 @@
         
         if (!selectmode && //display.DrawMode() != display.SELECTION &&
                 //(touched || (bRep != null && bRep.displaylist <= 0)))
-                (Globals.isLIVE() || touched && (bRep != null && bRep.displaylist <= 0)))
+                (Globals.isLIVE() && Globals.COMPUTESHADOWWHENLIVE || touched && (bRep != null && bRep.displaylist <= 0)))
         {
             Globals.lighttouched = true;
         } // all panes...
diff --git a/cRadio.java b/cRadio.java
index 83d4fc2..1ab12b3 100644
--- a/cRadio.java
+++ b/cRadio.java
@@ -38,6 +38,9 @@
     byte[] graphs[] = new byte[10000][];
     int undoindex = 0;
     
+    // Patch to avoid bug with transparency.
+    boolean hadMaterial;
+    
     Object3D object;
     Camera camera;
     cButton layout;

--
Gitblit v1.6.2