From f924d3e00db476c06f55f3d5aaef307e17575340 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Mon, 13 May 2019 07:29:08 -0400
Subject: [PATCH] Transform children

---
 ObjEditor.java       |    6 
 BoundaryRep.java     |    2 
 CameraPane.java      |    6 
 Globals.java         |    1 
 LA.java              |    1 
 SwitchEditor.java    |   15 ++-
 GroupEditor.java     |   69 +++++++++++++---
 cJ3D.java            |   52 ++++++++----
 cFileSystemPane.java |    4 
 Mocap.java           |   30 +++++--
 Object3D.java        |   48 ++++++++++-
 Grafreed.java        |    6 +
 12 files changed, 180 insertions(+), 60 deletions(-)

diff --git a/BoundaryRep.java b/BoundaryRep.java
index 7b31bc4..1781a47 100644
--- a/BoundaryRep.java
+++ b/BoundaryRep.java
@@ -500,7 +500,7 @@
     static Vertex vertextemp = new Vertex(true);
     static Vertex vertextemp2 = new Vertex(true);
     
-    static double SEUIL = 0.1f; // 0.1 for rag doll; 0.07;
+    static double SEUIL = 0.05f; // 0.1 for rag doll; 0.07;
         
     // Compute weight of point w/r to this
     float ComputeWeight(Vertex v, double[][] toRoot, int k)
diff --git a/CameraPane.java b/CameraPane.java
index 830f914..9a919e6 100644
--- a/CameraPane.java
+++ b/CameraPane.java
@@ -14870,7 +14870,7 @@
                 //RESIZETEXTURE ^= true;
                 //break;
             case 'z':
-                RENDERSHADOW ^= true;
+                Globals.RENDERSHADOW ^= true;
                 Globals.lighttouched = true;
                 repaint();
                 break;
@@ -16592,7 +16592,7 @@
                 gl.glDisable(gl.GL_CULL_FACE);
             }
 
-            if (!RENDERSHADOW)
+            if (!Globals.RENDERSHADOW)
                 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
 
             // SB gl.glPolygonOffset(2.5f, 10);
@@ -16602,7 +16602,7 @@
             //gl.glColorMask(false, false, false, false);
 
             //render_scene_from_light_view(gl, drawable, 0, 0);
-            if (RENDERSHADOW && Globals.lighttouched && !movingcamera) // && !parent.IsFreezed())
+            if (Globals.RENDERSHADOW && Globals.lighttouched && !movingcamera) // && !parent.IsFreezed())
             {
                 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
 
diff --git a/Globals.java b/Globals.java
index 4e04949..ca7d104 100644
--- a/Globals.java
+++ b/Globals.java
@@ -6,6 +6,7 @@
     static iCameraPane theRenderer;
     
         private static boolean LIVE = false;
+        public static boolean RENDERSHADOW = true;
         
         static boolean CROWD = false;
         static public int drawMode = iCameraPane.DEFAULT; // WARNING
diff --git a/Grafreed.java b/Grafreed.java
index 95f44cd..088a313 100644
--- a/Grafreed.java
+++ b/Grafreed.java
@@ -41,7 +41,11 @@
     static void Assert(boolean b)
     {
         if (!b)
+        {
+            b = !!b;
             new Exception().printStackTrace(); // assert(b);
+            
+        }
     }
     
     public void init()
@@ -844,7 +848,7 @@
         //Monitor mon=MonitorFactory.start("myFirstMonitor");
         standAlone = true;
         grafreeD = new Grafreed();
-        grafreeD.universe = new Composite();
+        grafreeD.universe = new cGroup();
         grafreeD.universe.name = "Grafreed";
         grafreeD.universe.material = new cMaterial();
         //   theApplet3D.universe.textures = CameraPane.DEFAULT_TEXTURE;
diff --git a/GroupEditor.java b/GroupEditor.java
index 7fcc3f7..a7eda89 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -318,8 +318,12 @@
 		resetTransformItem.addActionListener(this);
 		resetCentroidItem = menu.add(new MenuItem("Reset Centroid"));
 		resetCentroidItem.addActionListener(this);
-		transformgeometryItem = menu.add(new MenuItem("Transform Geometry"));
-		transformgeometryItem.addActionListener(this);
+		resetCentroidXZItem = menu.add(new MenuItem("Reset Centroid XY"));
+		resetCentroidXZItem.addActionListener(this);
+		transformGeometryItem = menu.add(new MenuItem("Transform Geometry"));
+		transformGeometryItem.addActionListener(this);
+		transformChildrenItem = menu.add(new MenuItem("Transform Children"));
+		transformChildrenItem.addActionListener(this);
                 
 		oe.menuBar.add(menu = new Menu("Geometry"));
 		genUVItem = menu.add(new MenuItem("Generate UV"));
@@ -422,17 +426,18 @@
 		sortbysizeItem.addActionListener(this);
 		sortbynameItem = menu.add(new MenuItem("Sort by name"));
 		sortbynameItem.addActionListener(this);
+		menu.add("-");
+		shareGeometriesItem = menu.add(new MenuItem("Share Geometries"));
+		shareGeometriesItem.addActionListener(this);
+		mergeGeometriesItem = menu.add(new MenuItem("Merge Geometries"));
+		mergeGeometriesItem.addActionListener(this);
         if (Globals.ADVANCED)
         {
-		menu.add("-");
+            // Pretty much the same as duplicate and clone.
 		extractGeometriesItem = menu.add(new MenuItem("Link Geometry"));
 		extractGeometriesItem.addActionListener(this);
 		cloneGeometriesItem = menu.add(new MenuItem("Clone Geometry"));
 		cloneGeometriesItem.addActionListener(this);
-		shareGeometriesItem = menu.add(new MenuItem("Share Geometry"));
-		shareGeometriesItem.addActionListener(this);
-		mergeGeometriesItem = menu.add(new MenuItem("Merge Geometry"));
-		mergeGeometriesItem.addActionListener(this);
         }
                 
 		oe.menuBar.add(menu = new Menu("Insert"));
@@ -651,7 +656,7 @@
                 zoomBoxCB.setToolTipText("Display bounding boxes when moving the wheel");
                                 zoomBoxCB.addItemListener(this);
 
-        if (Globals.ADVANCED)
+        if (true) // Globals.ADVANCED)
         {
                 panel.add(supportCB = new cCheckBox("Support", CameraPane.SUPPORT)); //, constraints);
                 supportCB.setToolTipText("Enable rigging");
@@ -2614,9 +2619,13 @@
                 {
 			SmoothMesh();
 		} else
-		if (source == transformgeometryItem)
+		if (source == transformGeometryItem)
 		{
                         TransformGeometry();
+		} else
+		if (source == transformChildrenItem)
+		{
+                        TransformChildren();
 		} else
 		if (source == resetTransformItem)
 		{
@@ -2624,7 +2633,11 @@
 		} else
 		if (source == resetCentroidItem)
 		{
-                        ResetCentroid();
+                        ResetCentroid(true);
+		} else
+		if (source == resetCentroidXZItem)
+		{
+                        ResetCentroid(false);
 		} else
 		if (source == resetParentItem)
 		{
@@ -3140,6 +3153,28 @@
             refreshContents();
         }
         
+        void TransformChildren()
+        {
+            Object3D obj;
+            for (Enumeration e = group.selection.elements(); e.hasMoreElements();)
+            {
+                    obj = (Object3D)e.nextElement();
+                    obj.KeepTextureMatrices();
+                    obj.TransformChildren();
+                    obj.RestoreTextureMatrices();
+                                        
+//                    if (obj.parent == null)
+//                    {
+//                        System.out.println("NULL PARENT!");
+//                        new Exception().printStackTrace();
+//                    }
+//                    else
+//                        TouchTransform(obj);
+//                        //obj.parent.Touch();
+            }
+
+            refreshContents();
+        }
         
         void ResetTransform()
         {
@@ -3252,7 +3287,7 @@
             refreshContents();
         }
         
-        void ResetCentroid()
+        void ResetCentroid(boolean full)
         {
             Object3D obj;
             for (Enumeration e = group.selection.elements(); e.hasMoreElements();)
@@ -3267,12 +3302,16 @@
                     LA.matIdentity(Object3D.mat);
                     obj.getBounds(minima, maxima, false);
                     Object3D.mat[3][0] = -(minima.x + maxima.x)/2;
-                    Object3D.mat[3][1] = -(minima.y + maxima.y)/2;
+                    if (full)
+                        Object3D.mat[3][1] = -(minima.y + maxima.y)/2;
                     Object3D.mat[3][2] = -(minima.z + maxima.z)/2;
                     obj.TransformMesh(Object3D.mat);
+                    
                     Object3D.mat[3][0] = (minima.x + maxima.x)/2;
-                    Object3D.mat[3][1] = (minima.y + maxima.y)/2;
+                    if (full)
+                        Object3D.mat[3][1] = (minima.y + maxima.y)/2;
                     Object3D.mat[3][2] = (minima.z + maxima.z)/2;
+                    
                     LA.matConcat(Object3D.mat, obj.toParent, obj.toParent);
                     //Object3D.mat[3][0] = -Object3D.mat[3][0];
                     //Object3D.mat[3][1] = -Object3D.mat[3][1];
@@ -5153,8 +5192,10 @@
 	private MenuItem panoTexturesItem;
         
 	private MenuItem resetCentroidItem;
-	private MenuItem transformgeometryItem;
+	private MenuItem resetCentroidXZItem;
 	private MenuItem resetTransformItem;
+	private MenuItem transformGeometryItem;
+	private MenuItem transformChildrenItem;
 	private MenuItem hideItem;
 	private MenuItem grabItem;
 	private MenuItem backItem;
diff --git a/LA.java b/LA.java
index 35e7f0e..904647a 100644
--- a/LA.java
+++ b/LA.java
@@ -307,6 +307,7 @@
 
         }
 
+        // Last row should always be 0 0 0 1
         Grafreed.Assert(Math.abs(src[0][3]) <= 1E-15);
         Grafreed.Assert(Math.abs(src[1][3]) <= 1E-15);
         Grafreed.Assert(Math.abs(src[2][3]) <= 1E-15);
diff --git a/Mocap.java b/Mocap.java
index 54415a3..246c834 100644
--- a/Mocap.java
+++ b/Mocap.java
@@ -484,6 +484,12 @@
     {
         Object3D hip = get(0);
         
+        if (toParent == null)
+        {
+            toParent = LA.newMatrix();
+            fromParent = LA.newMatrix();
+        }
+        
         LA.matConcat(toParent, hip.get(0).toParent, matrix);
         
         mocaporigin.x = matrix[3][0];
@@ -664,8 +670,8 @@
     double targetdirx;
     double targetdirz;
     
-    double goalposx = -20;
-    double goalposz = -10;
+    double goalposx = 0; // -20;
+    double goalposz = 0; // -10;
     
     boolean followpath;
     
@@ -2797,7 +2803,8 @@
                 //if (bone._rotationEnabled)
                 if (//frame > 0 &&
                     !bone.skipmocap &&
-                    !bone.name.contains("head") // &&
+                    !bone.name.contains("head") &&
+                    !bone.name.contains("Head") // &&
                  //   !bone.name.contains("rFoot") &&
                  //   !bone.name.contains("lFoot") &&
 //                    !bone.name.contains("Pinky") &&
@@ -3233,8 +3240,8 @@
         
 // aout 2013        endframe = 0; // june 2013
         
-        //ResetZero();
-        setPose(frame);
+        ResetZero();
+        //setPose(frame);
     }
     
     static int mocapsupport = 0;
@@ -3300,7 +3307,7 @@
             {
                 if (support == null)
                 {
-                    if (new File(fullname).exists())
+                    if (bvh == null && new File(fullname).exists())
                             ObjEditor.LoadBVHFile(fullname, this, false, beginframe, lastframetest);
                     else
                     {
@@ -3889,17 +3896,22 @@
      //   if (firstframe)
      //       return;
         
-        if (!restarted && /*display.restartframe &&*/
-                Globals.isLIVE() && live && display.DrawMode() == display.SHADOW) // FUCK
+        if (//!restarted && /*display.restartframe &&*/
+                Globals.isLIVE() && live && (display.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW))
         {
             //display.restartframe = false;
             restarted = true;
+        //System.err.println("restarted = true");
             Step();
         }
         else
         {
-            if (Globals.isLIVE() && live && display.DrawMode() != display.SHADOW)
+        //System.err.println("restarted");
+            if (Globals.isLIVE() && live && display.DrawMode() != iCameraPane.SHADOW)
+            {
                 restarted = false;
+        //System.err.println("restarted = false");
+            }
         }
         
         super.drawSelf(display, root, selected, blocked);
diff --git a/ObjEditor.java b/ObjEditor.java
index a6194b1..cfefeab 100644
--- a/ObjEditor.java
+++ b/ObjEditor.java
@@ -501,13 +501,13 @@
         //SendInfo("Name:", "bold");
         if (sel.GetTextures() != null || debug)
         {
-            si.SendInfo(sel.toString(), "bold");
+            si.SendInfo(sel.toString() + (Globals.ADVANCED?"":" " + System.identityHashCode(sel)), "bold");
             //SendInfo("#children virtual = " + sel.size() + "; real = " + sel.Size() + newline, "regular");
             if (sel.Size() > 0)
             {
                 si.SendInfo("#children = " + sel.Size(), "regular");
             }
-            si.SendInfo((debug ? "    Parent: " : "    ") + sel.parent, "regular");
+            si.SendInfo((debug ? "    Parent: " : "    ") + sel.parent + (Globals.ADVANCED?"":" " + System.identityHashCode(sel.parent)), "regular");
             if (debug)
             {
                 try
@@ -549,7 +549,7 @@
                 }
                 if (sel.support != null)
                 {
-                    si.SendInfo("    support: " + sel.support, "regular");
+                    si.SendInfo("    support: " + sel.support + (Globals.ADVANCED?"":" " + System.identityHashCode(sel.support)), "regular");
                 }
                 if (sel.scriptnode != null)
                 {
diff --git a/Object3D.java b/Object3D.java
index aa628e7..9c74924 100644
--- a/Object3D.java
+++ b/Object3D.java
@@ -797,7 +797,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 +912,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 +1475,7 @@
             BoundaryRep.SEUIL = other.material.cameralight;
 
             // Set default to 0.1
-            BoundaryRep.SEUIL /= 2;
+            BoundaryRep.SEUIL /= 4; // 2;
             System.out.println("SEUIL = " + BoundaryRep.SEUIL);
         }
         
@@ -2983,6 +2988,31 @@
     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);
+            }
+
+            toParent = null; // LA.matIdentity(toParent);
+            fromParent = null; // LA.matIdentity(fromParent);
+
+            Touch();
+        }
+    }
+    
     void TransformGeometry()
     {
         Object3D obj = this;
@@ -5379,7 +5409,7 @@
         return
                 CameraPane.SUPPORT && !CameraPane.movingcamera && 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;
@@ -7368,14 +7398,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()
diff --git a/SwitchEditor.java b/SwitchEditor.java
index e6d6892..19f7e34 100644
--- a/SwitchEditor.java
+++ b/SwitchEditor.java
@@ -9,6 +9,8 @@
 class SwitchEditor extends ObjEditor implements //ItemListener,
         ChangeListener, ObjectUI, ActionListener
 {
+    private cGridBag dampPanel;
+    private cGridBag framePanel;
     SwitchEditor(SwitchNode inBP, GroupEditor callee)
     {
         super(inBP,callee);
@@ -69,6 +71,7 @@
 		oe.aConstraints.gridwidth = 1;
              */
             super.SetupUI2(oe);
+        framePanel = AddSlider(oe.ctrlPanel, "Child: ", 0, switchnode.getNumFrames()-1, switchnode.child);
                 
 //		oe.aConstraints.gridx = 0;
 //		oe.aConstraints.gridwidth = 1;
@@ -81,10 +84,11 @@
 //        
 //        frameField.setInteger(frameselect.child);
             
-            frameField = (cNumberSlider)AddSlider(oe.ctrlPanel, "Child: ", 0, switchnode.getNumFrames()-1, switchnode.child).getComponent(1);
+            frameField = (cNumberSlider)framePanel.getComponent(1);
         oe.ctrlPanel.Return();
+        dampPanel = AddSlider(oe.ctrlPanel, "Damp: ", 0, 500, switchnode.speed);
             
-            speedField = (cNumberSlider)AddSlider(oe.ctrlPanel, "Damp: ", 0, 500, switchnode.speed).getComponent(1);
+            speedField = (cNumberSlider)dampPanel.getComponent(1);
         oe.ctrlPanel.Return();
             
 //		oe.aConstraints.gridy += 1;
@@ -224,8 +228,11 @@
 	//	oe.ctrlPanel.remove(frameLabel);
 	//	oe.ctrlPanel.remove(speedField);
 	//	oe.ctrlPanel.remove(speedLabel);
-                Remove(frameField);
-                Remove(speedField);
+//                Remove(frameField);
+//                Remove(speedField);
+                
+		oe.ctrlPanel.remove(framePanel);
+		oe.ctrlPanel.remove(dampPanel);
 		//oe.ctrlPanel.repaint();
                 
                 super.closeUI();
diff --git a/cFileSystemPane.java b/cFileSystemPane.java
index a446d0f..da2f91f 100644
--- a/cFileSystemPane.java
+++ b/cFileSystemPane.java
@@ -62,10 +62,10 @@
 
         cGridBag fileCommsnds = new cGridBag();
         
-        fileCommsnds.add(refreshButton = new JButton("Refresh")); //, aConstraints);
-                refreshButton.setToolTipText("Refresh entire tree");
         fileCommsnds.add(loadButton = new JButton("Load")); //, aConstraints);
                 loadButton.setToolTipText("Load selected file(s)");
+        fileCommsnds.add(refreshButton = new JButton("Refresh")); //, aConstraints);
+                refreshButton.setToolTipText("Refresh entire tree");
         
         refreshButton.addActionListener(this);
         loadButton.addActionListener(this);
diff --git a/cJ3D.java b/cJ3D.java
index 686d003..1a2fa60 100644
--- a/cJ3D.java
+++ b/cJ3D.java
@@ -360,13 +360,13 @@
             toParent[3][3] = m.m33;
 	}
         
+        Matrix4d m = new Matrix4d();
+                
         Object3D Read(TransformGroup g)
 	{
 		Object3D c = new Object3D(GetName(g)); // g.getClass().getName());
 		
                 Transform3D t = new Transform3D();
-                
-                Matrix4d m = new Matrix4d();
                 
                 g.getTransform(t);
                 
@@ -375,22 +375,18 @@
                 c.toParent = LA.newMatrix();
                 c.fromParent = LA.newMatrix();
                 
-                c.toParent[0][0] = m.m00;
-                c.toParent[0][1] = m.m10;
-                c.toParent[0][2] = m.m20;
-                c.toParent[0][3] = m.m30;
-                c.toParent[1][0] = m.m01;
-                c.toParent[1][1] = m.m11;
-                c.toParent[1][2] = m.m21;
-                c.toParent[1][3] = m.m31;
-                c.toParent[2][0] = m.m02;
-                c.toParent[2][1] = m.m12;
-                c.toParent[2][2] = m.m22;
-                c.toParent[2][3] = m.m32;
-                c.toParent[3][0] = m.m03;
-                c.toParent[3][1] = m.m13;
-                c.toParent[3][2] = m.m23;
-                c.toParent[3][3] = m.m33;
+                if (m.m00 != 0 || m.m10 != 0 || m.m20 != 0 || m.m30 != 0 ||
+                    m.m01 != 0 || m.m11 != 0 || m.m21 != 0 || m.m31 != 0 ||
+                    m.m02 != 0 || m.m12 != 0 || m.m22 != 0 || m.m32 != 0 ||
+                    m.m03 != 0 || m.m13 != 0 || m.m23 != 0 /*|| m.m33 != 0 */)
+                {
+                    SetMatrix(c, m);
+                }
+                else
+                {
+                    System.err.println("Found zero scale matrix. Hide the object instead.");
+                    c.count = 1;
+                }
                 
               //  ReadNode(c, g);
                 LA.matInvert(c.toParent, c.fromParent);
@@ -402,6 +398,26 @@
 		
 		return c;
 	}
+
+    private void SetMatrix(Object3D c, Matrix4d m)
+    {
+        c.toParent[0][0] = m.m00;
+        c.toParent[0][1] = m.m10;
+        c.toParent[0][2] = m.m20;
+        c.toParent[0][3] = m.m30;
+        c.toParent[1][0] = m.m01;
+        c.toParent[1][1] = m.m11;
+        c.toParent[1][2] = m.m21;
+        c.toParent[1][3] = m.m31;
+        c.toParent[2][0] = m.m02;
+        c.toParent[2][1] = m.m12;
+        c.toParent[2][2] = m.m22;
+        c.toParent[2][3] = m.m32;
+        c.toParent[3][0] = m.m03;
+        c.toParent[3][1] = m.m13;
+        c.toParent[3][2] = m.m23;
+        c.toParent[3][3] = m.m33;
+    }
         
         Object3D Read(Scene s, String fn)
         {

--
Gitblit v1.6.2