From f1c718cce66e5651a0dae91375db6ebfaded1a92 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sat, 27 Apr 2019 21:33:41 -0400
Subject: [PATCH] Test unfold UV

---
 BoundaryRep.java              |  150 +++++++++++++++++++++++++++++
 timeflow/app/TimeflowApp.java |    6 +
 CameraPane.java               |   29 ++++-
 GroupEditor.java              |   42 +++++++-
 GrafreeD.java                 |    9 +
 Object3D.java                 |    4 
 timeflow/views/IntroView.java |    9 +
 7 files changed, 227 insertions(+), 22 deletions(-)

diff --git a/BoundaryRep.java b/BoundaryRep.java
index cbdb1a9..05b3429 100644
--- a/BoundaryRep.java
+++ b/BoundaryRep.java
@@ -3155,7 +3155,27 @@
      */
     }
 
-    void GenUV()
+    void UnfoldUV()
+    {
+            for (int i = 0; i < VertexCount(); i++)
+            {
+                Vertex v = GetVertex(i);
+                
+                v.x = v.s;
+                v.y = v.t;
+                v.z = 0;
+                
+                v.norm.x = 0;
+                v.norm.y = 0;
+                v.norm.z = 1;
+                
+                SetVertex(v, i);
+            }
+    }
+    
+    float power = 2;
+    
+    void GenUV() // float power)
     {
         Trim();
         
@@ -3219,6 +3239,115 @@
                 y -= 0.5;
                 z -= 0.5;
                 
+                double ax = Math.abs(x);
+                double ay = Math.abs(y);
+                double max = ax;
+                if (max < ay)
+                {
+                    max = ay;
+                }
+                
+                x /= max;
+                y /= max;
+
+                double angle = Math.acos(Math.abs(z*2));
+                
+                double k = angle / Math.PI * 2;
+                
+                // k == 0 => uv = 0 (center)
+                // k == 1 => uv = -1,1 (border)
+                
+                if (i == 0)
+                        System.out.println("power = " + power);
+                
+                double length1 = (ax+ay)/max;
+                double length2 = Math.sqrt(ax*ax + ay*ay) / max;
+
+                double t = k;
+                
+                t = Math.pow(t, 3);
+                
+                // Interpolate between k/length2 (center) and k (border)
+                k = k / length2 * (1 - t) + k * t;
+                
+                double u = k*x;
+                double v = k*y;
+
+                u /= 2;
+                v /= 2;
+                u += 0.5;
+                v += 0.5;
+                
+                uvmap[i2] = (float) u;
+                uvmap[i2+1] = (float) v;
+            }
+    }
+        
+    void GenUVold(float power)
+    {
+        Trim();
+        
+        cVector boxcenter = null;
+          cVector minima, maxima;
+            minima = new cVector();
+            maxima = new cVector();
+            minima.x = minima.y = minima.z = Double.MAX_VALUE;
+            maxima.x = maxima.y = maxima.z = -Double.MAX_VALUE;
+            for (int i = 0; i < VertexCount(); i++)
+            {
+                Vertex v = GetVertex(i);
+
+                if (minima.x > v.x)
+                {
+                    minima.x = v.x;
+                }
+                if (minima.y > v.y)
+                {
+                    minima.y = v.y;
+                }
+                if (minima.z > v.z)
+                {
+                    minima.z = v.z;
+                }
+
+                if (maxima.x < v.x)
+                {
+                    maxima.x = v.x;
+                }
+                if (maxima.y < v.y)
+                {
+                    maxima.y = v.y;
+                }
+                if (maxima.z < v.z)
+                {
+                    maxima.z = v.z;
+                }
+            }
+
+            boxcenter = new cVector((maxima.x + minima.x) / 2, (maxima.y + minima.y) / 2, (maxima.z + minima.z) / 2);
+            int i2 = 0, i3 = 0;
+            for (int i = 0; i < positions.length/3; i++, i3 += 3, i2 += 2)
+            {
+//                //uvmap[i2] = (float) normals[i3]*0.5f + 0.5f; // v.x;
+//                //uvmap[i2 + 1] = (float) normals[i3+1]*0.5f + 0.5f; //z;
+//                uvmap[i2] = (float) (positions[i3] - boxcenter.x);
+//                uvmap[i2 + 1] = (float) (positions[i3+2] - boxcenter.z);
+//                uvmap[i2] = (float) Math.atan2(positions[i3+1] - boxcenter.y, positions[i3] - boxcenter.x);
+//                uvmap[i2 + 1] = (float)(positions[i3+2] - boxcenter.z);
+                // box UV
+                double x = positions[i3] - minima.x; // - Math.floor(positions[i3]);
+                double y = positions[i3+1] - minima.y; // - Math.floor(positions[i3+1]);
+                double z = positions[i3+2] - minima.z; // - Math.floor(positions[i3+2]);
+
+                // [-1/2, 1/2]
+                x /= maxima.x - minima.x;
+                y /= maxima.y - minima.y;
+                z /= maxima.z - minima.z;
+                
+                x -= 0.5;
+                y -= 0.5;
+                z -= 0.5;
+                
           //      x *= 2;
           //      y *= 2;
           //      z *= 2;
@@ -3245,6 +3374,15 @@
 
                 z = Math.cos(angle/2);
                 
+                assert(z >= 0);
+                assert(z <= 1);
+                
+                /**/
+                //z = Math.pow(z, power); //1.08f);
+                
+                if (i == 0)
+                        System.out.println("power = " + power);
+                
                 // sqrt(k2*x2 + k2*z2 + y2) = length
                 // k2*x2 + k2*z2 = length2 - y2
                 // k2 = (length2 - y2) / (x2 + z2)
@@ -3264,6 +3402,7 @@
                 
                 x *= k;
                 y *= k;
+                /**/
                 
                 double max = Math.abs(x);
                 if (max < Math.abs(y))
@@ -3276,10 +3415,15 @@
                 }
 
             //    max = Math.sqrt(max*2)/2;
+//                double x2 = Math.pow(Math.abs(x), 1/power);
+//                double y2 = Math.pow(Math.abs(y), 1/power);
+//                double z2 = Math.pow(Math.abs(z), 1/power);
+//                max = Math.pow(x2 + y2 + z2, power);
                 
 //                if (!(max > 0))
-                    assert(max > 0);
-                
+                    //assert(max > 0);
+                    assert(max >= 0);
+                                    
                 x /= max;
                 y /= max;
                 z /= max;
diff --git a/CameraPane.java b/CameraPane.java
index 8c8c173..55e5ab4 100644
--- a/CameraPane.java
+++ b/CameraPane.java
@@ -86,12 +86,14 @@
 static    boolean FULLSCREEN = false;
 static    boolean SUPPORT = true;
 static    boolean INERTIA = true;
-static    boolean FAST = false;
+static    boolean FAST = true; // false;
 static    boolean SLOWPOSE = false;
 static    boolean FOOTCONTACT = true;
 
 static    int tickcount = 0; // slow pose issue
 
+static    boolean BUTTONLESSWHEEL = false;
+static    boolean ZOOMBOXMODE = false;
 static    boolean BOXMODE = false;
 static    boolean IMAGEFLIP = false;
 static    boolean SMOOTHFOCUS = false;
@@ -223,6 +225,11 @@
     public boolean IsBoxMode()
     {
             return BOXMODE;
+    }
+    
+    public boolean IsZoomBoxMode()
+    {
+            return ZOOMBOXMODE;
     }
     
     public void ClearDepth()
@@ -1612,12 +1619,12 @@
         //col.getColorComponents(ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), CameraPane.modelParams0);
         if (!material.multiply)
         {
-            display.color = color;
+            display.color = material.color;
             display.saturation = material.modulation;
         }
         else
         {
-            display.color *= color*2;
+            display.color *= material.color*2;
             display.saturation *= material.modulation*2;
         }
             
@@ -2168,6 +2175,11 @@
     public void ToggleBoxMode()
     {
         BOXMODE ^= true;
+    }
+
+    public void ToggleZoomBoxMode()
+    {
+        ZOOMBOXMODE ^= true;
     }
 
     public void ToggleSmoothFocus()
@@ -13523,6 +13535,7 @@
 	
         //System.err.println("Dtime = " + Dtime + "; units = " + e.getUnitsToScroll() + "; ratio (units/ms) = " + ratio);
             
+        if (BUTTONLESSWHEEL)
 	if (Math.abs(ratio) < 0.1 || Math.abs(Dtime) == 0) // < 30)
 	{
             return;
@@ -13531,7 +13544,7 @@
         boolean capsLocked = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
         
         // TIMER
-        if (!wheeltimer.isRunning() && e.getModifiersEx() == 0 && !capsLocked) // VR
+        if (ZOOMBOXMODE && !wheeltimer.isRunning() && e.getModifiersEx() == 0 && !capsLocked) // VR
         {
             keepboxmode = BOXMODE;
             keepsupport = SUPPORT;
@@ -13748,11 +13761,11 @@
     
     public void mouseDragged(MouseEvent e)
     {
+        //System.out.println("mouseDragged: " + e);
         if (isRenderer)
             movingcamera = true;
         //if (drawing)
         //return;
-        //System.out.println("mouseDragged: " + e);
         if ((e.getModifiersEx() & CTRL) != 0
             || (e.getModifiersEx() & COMMAND) != 0) // || IsFrozen())
         {
@@ -14287,7 +14300,6 @@
     public void mouseMoved(MouseEvent e)
     {
         //System.out.println("mouseMoved: " + e);
-
         if (isRenderer)
             return;
         
@@ -15100,8 +15112,9 @@
 
     protected void processMouseMotionEvent(MouseEvent e)
     {
-        //System.out.println("processMouseMotionEvent: " + mouseMode);
-        if (e.getButton() == MouseEvent.NOBUTTON && (mouseMode & SELECT) == 0)
+        //System.out.println("processMouseMotionEvent: " + mouseMode + " " + e.getModifiers() + " " + e.getModifiersEx() + " " + e.getButton());
+        //if (e.getButton() == MouseEvent.NOBUTTON && (mouseMode & SELECT) == 0)
+        if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) == 0 && (mouseMode & SELECT) == 0)
         {
             mouseMoved(e);
         } else
diff --git a/GrafreeD.java b/GrafreeD.java
index 1527f55..44e3600 100644
--- a/GrafreeD.java
+++ b/GrafreeD.java
@@ -595,6 +595,9 @@
     
     public static void main(String argv[])
     {
+                String osArch = System.getProperty("os.arch");
+                System.out.println("os.arch = " + osArch);
+                
         if (argv.length == 0)
         {
             String javaPath = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
@@ -626,7 +629,11 @@
                 System.out.println("jarfile = " + jarfile);
                 jarpath = jarpath.substring(1, jarpath.length());
                 System.out.println("jarpath = " + jarpath);
-            command += "native" + File.separator + "windows_amd64";
+                command += "native" + File.separator;
+                if (osArch.equals("amd64"))
+                    command += "windows_amd64";
+                else
+                    command += "windows_i586";
         }
         else
             command += "native" + File.separator + "macosx";
diff --git a/GroupEditor.java b/GroupEditor.java
index 02ade54..b72085f 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -438,10 +438,16 @@
         	oe.aConstraints.gridx = 0;
                 
                 oe.toolbarPanel.add(liveCB = new cCheckBox("Live", Globals.isLIVE()), oe.aConstraints);
+                liveCB.setToolTipText("Enabled animation");
                                 liveCB.addItemListener(this);
 
         	oe.aConstraints.gridx += 1;
+                oe.toolbarPanel.add(fastCB = new cCheckBox("Fast", CameraPane.FAST), oe.aConstraints);
+                fastCB.setToolTipText("Fast mode");
+                                fastCB.addItemListener(this);
+        	oe.aConstraints.gridx += 1;
                 oe.toolbarPanel.add(supportCB = new cCheckBox("Support", CameraPane.SUPPORT), oe.aConstraints);
+                supportCB.setToolTipText("Enabled rigging");
                                 supportCB.addItemListener(this);
 
         //	oe.aConstraints.gridx += 1;
@@ -450,21 +456,26 @@
 
         	oe.aConstraints.gridx += 1;
                 oe.toolbarPanel.add(crowdCB = new cCheckBox("Crowd", Globals.CROWD), oe.aConstraints);
+                crowdCB.setToolTipText("Used for crowds");
                                 crowdCB.addItemListener(this);
 
         	oe.aConstraints.gridx += 1;
                 oe.toolbarPanel.add(smoothCB = new cCheckBox("Inertia", CameraPane.INERTIA), oe.aConstraints);
+                smoothCB.setToolTipText("Snapping delay");
                                 smoothCB.addItemListener(this);
 
         	oe.aConstraints.gridx += 1;
-                oe.toolbarPanel.add(fastCB = new cCheckBox("Fast", CameraPane.FAST), oe.aConstraints);
-                                fastCB.addItemListener(this);
-        	oe.aConstraints.gridx += 1;
                 oe.toolbarPanel.add(slowCB = new cCheckBox("Slow", CameraPane.SLOWPOSE), oe.aConstraints);
+                slowCB.setToolTipText("Smooth interpolation");
                                 slowCB.addItemListener(this);
         	oe.aConstraints.gridx += 1;
-                oe.toolbarPanel.add(boxCB = new cCheckBox("Box", CameraPane.FAST), oe.aConstraints);
+                oe.toolbarPanel.add(boxCB = new cCheckBox("Box", CameraPane.BOXMODE), oe.aConstraints);
+                boxCB.setToolTipText("Display bounding boxes");
                                 boxCB.addItemListener(this);
+        	oe.aConstraints.gridx += 1;
+                oe.toolbarPanel.add(zoomBoxCB = new cCheckBox("Zoom", CameraPane.ZOOMBOXMODE), oe.aConstraints);
+                zoomBoxCB.setToolTipText("Display bounding boxes when moving the wheel");
+                                zoomBoxCB.addItemListener(this);
 
 //        	oe.aConstraints.gridx += 1;
 //                oe.toolbarPanel.add(speakerMocapCB = new cCheckBox("Mocap", CameraPane.SPEAKERMOCAP), oe.aConstraints);
@@ -491,19 +502,22 @@
 //                debugCB.addItemListener(this);
 
         	oe.aConstraints.gridx += 1;
-                oe.toolbarPanel.add(oeilCB = new cCheckBox("O", CameraPane.OEIL), oe.aConstraints);
+                oe.toolbarPanel.add(oeilCB = new cCheckBox("Eye", CameraPane.OEIL), oe.aConstraints);
                                 oeilCB.addItemListener(this);
 
         	oe.aConstraints.gridx += 1;
-                oe.toolbarPanel.add(lookAtCB = new cCheckBox("T", CameraPane.LOOKAT), oe.aConstraints);
+                oe.toolbarPanel.add(lookAtCB = new cCheckBox("Target", CameraPane.LOOKAT), oe.aConstraints);
+                lookAtCB.setToolTipText("Look-at target");
                                 lookAtCB.addItemListener(this);
 
         	oe.aConstraints.gridx += 1;
                 oe.toolbarPanel.add(trackCB = new cCheckBox(":", CameraPane.TRACK), oe.aConstraints);
+                trackCB.setToolTipText("Enable tracking");
                                 trackCB.addItemListener(this);
 
         	oe.aConstraints.gridx += 1;
 		oe.toolbarPanel.add(screenfitButton = new cButton("@ ")); //, oe.aConstraints);
+                screenfitButton.setToolTipText("Screen fit");
 		screenfitButton.addActionListener(this);
 			oe.aConstraints.gridx += 1;
 //		oe.toolbarPanel.add(screenfitpointButton = new cButton(" @+ ")); //, oe.aConstraints);
@@ -511,6 +525,7 @@
 //			oe.aConstraints.gridx += 1;
 		oe.toolbarPanel.add(snapobjectButton = new cButton(" O+ ")); //, oe.aConstraints);
 		snapobjectButton.addActionListener(this);
+                snapobjectButton.setToolTipText("Snap Object");
 			oe.aConstraints.gridx += 1;
 
                 //aConstraints.gridx = 0;
@@ -519,6 +534,7 @@
 		oe.aConstraints.gridwidth = 1;
 		
 		oe.toolbarPanel.add(flashSelectionButton = new cButton(" ? ")); //, oe.aConstraints);
+                flashSelectionButton.setToolTipText("Show selection");
 		flashSelectionButton.addActionListener(this);
                 
 		oe.toolbarPanel.add(new cButton("     ", false));
@@ -529,21 +545,28 @@
                 
                 //
 		oe.toolbarPanel.add(twoButton = new cButton(" |+| ")); //, oe.aConstraints);
+                twoButton.setToolTipText("Show center view only");
 		twoButton.addActionListener(this);
 		oe.toolbarPanel.add(fourButton = new cButton("+|| ")); //, oe.aConstraints);
 		fourButton.addActionListener(this);
+                fourButton.setToolTipText("Show left panel only");
 		oe.toolbarPanel.add(sixButton = new cButton("+|+| ")); //, oe.aConstraints);
+                sixButton.setToolTipText("2-column layout left");
 		sixButton.addActionListener(this);
 		oe.toolbarPanel.add(threeButton = new cButton(" |+|+")); //, oe.aConstraints);
+                threeButton.setToolTipText("2-column layout right");
 		threeButton.addActionListener(this);
 		oe.toolbarPanel.add(sevenButton = new cButton("+|+|+")); //, oe.aConstraints);
+                sevenButton.setToolTipText("3-column layout");
 		sevenButton.addActionListener(this);
                 //
 
-		oe.toolbarPanel.add(rootButton = new cButton(" o o o  E  ")); //, oe.aConstraints);
+		oe.toolbarPanel.add(rootButton = new cButton(" o o o ")); //, oe.aConstraints);
+                rootButton.setToolTipText("Edit object in new tab");
 		rootButton.addActionListener(this);
 			oe.aConstraints.gridx += 1;
 		oe.toolbarPanel.add(closeButton = new cButton("  X  ")); //, oe.aConstraints);
+                closeButton.setToolTipText("Close tab");
 		closeButton.addActionListener(this);
 		//oe.treePanel.add(clearButton = new cButton("X"), oe.aConstraints);
 		//clearButton.addActionListener(this);
@@ -676,6 +699,7 @@
         JCheckBox fastCB;
         JCheckBox slowCB;
         JCheckBox boxCB;
+        JCheckBox zoomBoxCB;
         JCheckBox trackCB;
         JCheckBox smoothfocusCB;
 //        JCheckBox speakerMocapCB;
@@ -756,6 +780,10 @@
         cameraView.repaint();
 //                refreshContents();
             }
+            else if(e.getSource() == zoomBoxCB)
+            {
+                cameraView.ToggleZoomBoxMode();
+            }
             else if(e.getSource() == smoothfocusCB)
             {
                 cameraView.ToggleSmoothFocus();
diff --git a/Object3D.java b/Object3D.java
index 8beaebd..70c7ead 100644
--- a/Object3D.java
+++ b/Object3D.java
@@ -2906,7 +2906,8 @@
     {
         if (bRep != null)
         {
-            bRep.GenUV();
+            bRep.GenUV(); //1);
+            //bRep.UnfoldUV();
             Touch();
         }
     }
@@ -5898,6 +5899,7 @@
             return;
         }
         
+        //bRep.GenUV(1/material.diffuseness);
 //        bRep.lock = true;
 
         //javax.media.opengl.GL gl = display.GetGL();
diff --git a/timeflow/app/TimeflowApp.java b/timeflow/app/TimeflowApp.java
index d2c47c4..f70bc07 100755
--- a/timeflow/app/TimeflowApp.java
+++ b/timeflow/app/TimeflowApp.java
@@ -1,5 +1,6 @@
 package timeflow.app;
 
+import java.net.URL;
 import timeflow.app.ui.*;
 import timeflow.app.actions.*;
 import timeflow.app.ui.filter.*;
@@ -696,7 +697,9 @@
                 System.out.println("getVisibleFiles = " + dir);
                 try
                 {
-                        String[] s = new File(TimeflowApp.class.getClassLoader().getResource(dir).toURI()).list();
+                        final URL resource = TimeflowApp.class.getClassLoader().getResource(dir);
+                System.out.println("resource = " + resource);
+                        String[] s = new File(resource.toURI()).list();
                         ArrayList<String> real = new ArrayList<String>();
                         for (int i = 0; i < s.length; i++)
                         {
@@ -709,6 +712,7 @@
                 }
                 catch (Exception e)
                 {
+                        e.printStackTrace();
                         return new String[0];
                 }
         }
diff --git a/timeflow/views/IntroView.java b/timeflow/views/IntroView.java
index 6bd480f..ea61f6d 100755
--- a/timeflow/views/IntroView.java
+++ b/timeflow/views/IntroView.java
@@ -73,7 +73,14 @@
         {
                 try
                 {
-                        String sidebar = IO.read(new File(IntroView.class.getClassLoader().getResource("timeflow/settings/sidebar.html").toURI()));
+                        //resource = jar:file:/Users/nbriere/Projects/GrafreeD/dist/GrafreeD.jar!/timeflow/settings/sidebar.html
+                        //java.lang.IllegalArgumentException: URI is not hierarchical
+                        
+                        //if (true) return;
+                        
+                        final URL resource = IntroView.class.getClassLoader().getResource("sidebar.html");
+                        System.out.println("resource = " + resource);
+                        String sidebar = IO.read(new File(resource.toURI()));
                         controls = new HtmlControls(sidebar);
                 } catch (Exception e)
                 {

--
Gitblit v1.6.2