From 1d909ffa0c2beb51d453b53b845c4f3a749ca5f0 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Mon, 10 Jun 2019 20:38:07 -0400
Subject: [PATCH] Undo/redo fully working

---
 Object3D.java |  185 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 150 insertions(+), 35 deletions(-)

diff --git a/Object3D.java b/Object3D.java
index aa628e7..2c2cf4d 100644
--- a/Object3D.java
+++ b/Object3D.java
@@ -14,11 +14,15 @@
 import //weka.core.
         matrix.Matrix;
 
+import java.util.UUID;
+
 //import net.sourceforge.sizeof.SizeOf;
 public class Object3D extends Vector<Object3D> implements java.io.Serializable, iSendInfo //, aurelienribon.tweenengine.TweenAccessor<Object3D>
 {
     //static final long serialVersionUID = -607422624994562685L;
     static final long serialVersionUID = 5022536242724664900L;
+    
+    private UUID uuid = UUID.randomUUID();
     
     ScriptNode scriptnode;
 
@@ -300,6 +304,7 @@
         }
         
     boolean live = false;
+    boolean dontselect = false;
     boolean hide = false;
     boolean link2master = false; // performs reset support/master at each frame
     boolean marked = false; // animation node
@@ -774,7 +779,7 @@
         if (step == 0)
             step = 1;
         if (maxcount == 0)
-            maxcount = 2048; // 4;
+            maxcount = 128; // 2048; // 4;
 //        if (acceleration == 0)
 //            acceleration = 10;
         if (delay == 0) // serial
@@ -797,7 +802,7 @@
         
         if (marked && Globals.isLIVE() && live &&
                 //TEMP21aug2018
-                Globals.DrawMode() == iCameraPane.SHADOW &&
+                (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW) &&
                 currentframe != Globals.framecount)
         {
             currentframe = Globals.framecount;
@@ -912,6 +917,11 @@
         fromParent = null; // LA.newMatrix();
         bRep = null; // new BoundaryRep();
 
+        if (oname != null && oname.equals("LeftHand"))
+        {
+            name = oname;
+        }
+        
         /*
         float hue = (float)Math.random();
         Color col;
@@ -1470,7 +1480,7 @@
             BoundaryRep.SEUIL = other.material.cameralight;
 
             // Set default to 0.1
-            BoundaryRep.SEUIL /= 2;
+            BoundaryRep.SEUIL /= 4; // 2;
             System.out.println("SEUIL = " + BoundaryRep.SEUIL);
         }
         
@@ -1829,12 +1839,15 @@
             if (obj.name == null)
                 continue; // can't be a null one
             
+            // Try perfect match first.
             if (n.equals(obj.name))
             {
                 theobj = obj;
                 count++;
             }
         }
+        
+        // not needed: n = n.split(":")[0]; // Poser generates a count
         
     if (count != 1)
         for (int i=Size(); --i>=0;)
@@ -2983,6 +2996,33 @@
     blockloop = false;
 }
             
+    void TransformChildren()
+    {
+        if (toParent != null)
+        {
+            for (int i=Size(); --i>=0;)
+            {
+                Object3D v = get(i);
+
+                if (v.toParent == null)
+                {
+                    v.toParent = LA.newMatrix();
+                    v.fromParent = LA.newMatrix();
+                }
+
+//                LA.matConcat(v.toParent, toParent, v.toParent);
+//                LA.matConcat(fromParent, v.fromParent, v.fromParent);
+                LA.matConcat(toParent, v.toParent, v.toParent);
+                LA.matConcat(v.fromParent, fromParent, v.fromParent);
+            }
+
+            toParent = null; // LA.matIdentity(toParent);
+            fromParent = null; // LA.matIdentity(fromParent);
+
+            Touch();
+        }
+    }
+    
     void TransformGeometry()
     {
         Object3D obj = this;
@@ -3206,7 +3246,9 @@
         bRep.support = null;
         BoundaryRep temprep = (BoundaryRep) Grafreed.clone(bRep);
 //            bRep.SplitInTwo(onlyone); // thread...
-            temprep.SplitInTwo(reduction34, onlyone);
+        
+        while(temprep.SplitInTwo(reduction34, onlyone));
+        
             bRep = temprep;
             bRep.support = sup;
             Touch();
@@ -4681,7 +4723,7 @@
 
     cTreePath SelectLeaf(int indexcount, boolean deselect)
     {
-        if (hide)
+        if (hide || dontselect)
             return null;
         
         if (count <= 0)
@@ -4707,7 +4749,7 @@
     
     cTreePath Select(int indexcount, boolean deselect)
     {
-        if (hide)
+        if (hide || dontselect)
             return null;
             
         if (count <= 0)
@@ -5333,6 +5375,43 @@
         }
     }
     
+    UUID GetUUID()
+    {
+        if (uuid == null)
+        {
+            // Serial
+            uuid = UUID.randomUUID();
+        }
+        
+        return uuid;
+    }
+    
+    Object3D GetObject(UUID uid)
+    {
+        if (blockloop)
+            return null;
+        
+        if (GetUUID().equals(uid))
+            return this;
+        
+        int nb = Size();
+        for (int i = 0; i < nb; i++)
+        {
+            Object3D child = (Object3D) get(i);
+
+            if (child == null)
+                continue;
+
+            blockloop = true;
+            Object3D obj = child.GetObject(uid);
+            blockloop = false;
+            if (obj != null)
+                return obj;
+        }
+        
+        return null;
+    }
+    
     void SetBumpTexture(String tex)
     {
         if (GetTextures() == null)
@@ -5377,9 +5456,9 @@
     boolean NeedSupport()
     {
         return
-                CameraPane.SUPPORT && !CameraPane.movingcamera && link2master && /*live &&*/ support != null
+                CameraPane.SUPPORT && (!CameraPane.movingcamera || !Globals.FREEZEONMOVE) && link2master && /*live &&*/ support != null
                  // PROBLEM with CROWD!!
-                    && (Globals.DrawMode() == iCameraPane.SHADOW || Globals.CROWD);
+                    && (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || Globals.CROWD);
     }
     
     static boolean DEBUG_SELECTION = false;
@@ -5394,7 +5473,7 @@
         }
         
         if (display.DrawMode() == iCameraPane.SELECTION &&
-                hide)
+                (hide || dontselect))
             return;
 
         if (name != null && name.contains("sclera"))
@@ -5636,7 +5715,17 @@
         tex = GetTextures();
     }
 
-    display.BindTextures(tex, texres);
+    boolean failed = false;
+    
+    try
+    {
+        display.BindTextures(tex, texres);
+    }
+    catch (Exception e)
+    {
+        System.err.println("FAILED: " + this);
+        failed = true;
+    }
            
             if (!compiled)
             {
@@ -5658,7 +5747,8 @@
                 }
             }
 
-    display.ReleaseTextures(tex);
+    if (!failed)
+        display.ReleaseTextures(tex);
 
     display.PopMaterial(this, selected);
         }
@@ -5787,6 +5877,9 @@
     
     void drawSelf(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked)
     {
+        if (display.DrawMode() == iCameraPane.SELECTION && dontselect)
+            return;
+        
         if (hide)
             return;
         // shadow optimisation
@@ -5911,6 +6004,9 @@
     {
         if (display.DrawMode() == display.SHADOW && projectedVertices != null && projectedVertices.length > 2 && projectedVertices[2].y >= 10000)
             return; // no shadow for transparent objects
+        
+        if (display.DrawMode() == iCameraPane.SELECTION && dontselect)
+            return;
         
         if (hide)
             return;
@@ -6895,8 +6991,8 @@
 //            {
 //                CameraPane.Ymax = spoth;
 //            }
-            info.g.drawLine(spotw, spoth, spotw, spoth - 15);
-            info.g.drawLine(spotw, spoth, spotw - 15, spoth);
+            // bonhommes info.g.drawLine(spotw, spoth, spotw, spoth - 15);
+            //info.g.drawLine(spotw, spoth, spotw - 15, spoth);
             spot.translate(0, -32);
             info.g.setColor(Color.green);
             info.g.fillRect(spot.x, spot.y, spot.width, spot.height);
@@ -6951,7 +7047,7 @@
         startX = info.x;
         startY = info.y;
 
-        hitSomething = 0;
+        hitSomething = -1;
         cVector origin = new cVector();
         //LA.xformPos(origin, toParent, origin);
         Rectangle spot = new Rectangle();
@@ -7027,6 +7123,7 @@
         //System.out.println("hitSomething = " + hitSomething);
 
         double scale = 0.005f * info.camera.Distance();
+        
         cVector xlate = new cVector();
         //cVector xlate2 = new cVector();
         switch (hitSomething)
@@ -7175,24 +7272,27 @@
 
             case hitScale: // scale
                 double hScale = (double) (info.x - centerPt.x) / 32;
+                double sign = 1;
+                if (hScale < 0)
+                {
+                    sign = -1;
+                }
+                hScale = sign*Math.pow(sign*hScale, scale * 50);
                 if (hScale < 0.01)
                 {
-                    hScale = 0.01;
+                    //hScale = 0.01;
                 }
-                hScale = Math.pow(hScale, scale * 50);
-                if (hScale < 0.01)
-                {
-                    hScale = 0.01;
-                }
+                
                 double vScale = (double) (info.y - centerPt.y) / 32;
-                if (vScale < 0.01)
+                sign = 1;
+                if (vScale < 0)
                 {
-                    vScale = 0.01;
+                    sign = -1;
                 }
-                vScale = Math.pow(vScale, scale * 50);
+                vScale = sign*Math.pow(sign*vScale, scale * 50);
                 if (vScale < 0.01)
                 {
-                    vScale = 0.01;
+                    //vScale = 0.01;
                 }
                 LA.matCopy(startMat, toParent);
                 /**/
@@ -7203,17 +7303,24 @@
                 }
                 /**/
 
+                double totalScale = Math.sqrt(hScale*hScale + vScale*vScale) / Math.sqrt(2);
+                        
+                if (totalScale < 0.01)
+                {
+                    totalScale = 0.01;
+                }
+                
                 switch (info.pane.RenderCamera().viewCode)
                 {
                     case 3: // '\001'
                         if (modified)
                         {
                             //LA.matScale(toParent, 1, hScale, vScale);
-                            LA.matScale(toParent, vScale, 1, 1);
+                            LA.matScale(toParent, totalScale, 1, 1);
                         } // vScale, 1);
                         else
                         {
-                            LA.matScale(toParent, vScale, vScale, vScale);
+                            LA.matScale(toParent, totalScale, totalScale, totalScale);
                         } // vScale, 1);
                         break;
 
@@ -7221,10 +7328,10 @@
                         if (modified)
                         {
                             //LA.matScale(toParent, hScale, 1, vScale);
-                            LA.matScale(toParent, 1, vScale, 1);
+                            LA.matScale(toParent, 1, totalScale, 1);
                         } else
                         {
-                            LA.matScale(toParent, vScale, 1, vScale);
+                            LA.matScale(toParent, totalScale, 1, totalScale);
                         }
                         break;
 
@@ -7232,10 +7339,10 @@
                         if (modified)
                         {
                             //LA.matScale(toParent, hScale, vScale, 1);
-                            LA.matScale(toParent, 1, 1, vScale);
+                            LA.matScale(toParent, 1, 1, totalScale);
                         } else
                         {
-                            LA.matScale(toParent, vScale, vScale, 1);
+                            LA.matScale(toParent, totalScale, totalScale, 1);
                         }
                         break;
                 }
@@ -7368,14 +7475,22 @@
         //return super.toString() + " (id=" + list + ")" + " (brep=" + bRep + ")";
         //return name + " (id=" + list + ")" + " (brep=" + bRep + ") " + super.toString();
         //return name + " (#tri = " + (bRep==null?0:bRep.VertexCount()) + ") " + super.toString();
+        
+        String objname;
+        
         if (false) //parent != null)
         {
-            return name + " " + System.identityHashCode(this) + " (" + parent.name + " " + System.identityHashCode(parent) + ")";
+            objname = name + " " + System.identityHashCode(this) + " (" + parent.name + " " + System.identityHashCode(parent) + ")";
         } else
         {
-            return GetName() + (Math.abs(count) == 1000 ? (count == 1000 ? " " : " * ") : (" (" + (count /*- 1*/) + ") ")) + /*(IsSelected()?"(selected) ":"") + (touched?"(touched) ":"") */ +System.identityHashCode(this);
+            objname = GetName() + (Math.abs(count) == 1000 ? (count == 1000 ? " " : " * ") : (" (" + (count - 1) + ")")) + /*(IsSelected()?"(selected) ":"") + (touched?"(touched) ":"") */ "";
         } //  + super.toString();
     //return name + " (" + (SizeOf.deepSizeOf(this)/1024) + "K) " + this.getClass().getName();
+        
+        if (!Globals.ADVANCED)
+            return objname;
+        
+        return objname + " " + System.identityHashCode(this);
     }
 
     public int hashCode()
@@ -7616,9 +7731,9 @@
     private static cVector edge2 = new cVector();
     //private static cVector norm = new cVector();
     /*transient private*/ int hitSomething;
-    private static final int hitCenter = 1;
-    private static final int hitScale = 2;
-    private static final int hitRotate = 3;
+    static final int hitCenter = 1;
+    static final int hitScale = 2;
+    static final int hitRotate = 3;
     /*transient*/ /*private*/ int viewCode; // Now used for transparency cache flag
 	/*transient*/ private Point centerPt;
     /*transient*/ private int startX;

--
Gitblit v1.6.2