From 89da025f40680d9cea46f2b0a7c8c6829a0d0451 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 12 Apr 2015 19:37:37 -0400
Subject: [PATCH] Height fields.

---
 ObjEditor.java        |    2 
 Texture.java          |    4 
 Mocap.java            |   16 
 BiparamEditor.java    |    4 
 /dev/null             |   26 --
 ScriptNode.java       |    8 
 BoundaryRep.java      |   85 ++++++-
 HeightField.java      |   26 ++
 CameraPane.java       |   22 +
 KDNode.java           |    2 
 GroupEditor.java      |  390 ++++++++++++++++++++++++--------
 Checker.java          |   27 ++
 CheckerInterface.java |    5 
 KDTree.java           |    4 
 Object3D.java         |   61 +++-
 iHeightField.java     |   13 +
 16 files changed, 514 insertions(+), 181 deletions(-)

diff --git a/BiparamEditor.java b/BiparamEditor.java
index f6f1aef..1525688 100644
--- a/BiparamEditor.java
+++ b/BiparamEditor.java
@@ -66,9 +66,9 @@
              */
             super.SetupUI2(oe);
                 
-            uDivsField = AddSlider(oe.ctrlPanel, "U #", biparam.minUDivs, 256+biparam.minUDivs, biparam.uDivs);
+            uDivsField = AddSlider(oe.ctrlPanel, "U #", biparam.minUDivs, 1024+biparam.minUDivs, biparam.uDivs);
             Return();
-            vDivsField = AddSlider(oe.ctrlPanel, "V #", biparam.minVDivs, 256+biparam.minVDivs, biparam.vDivs);
+            vDivsField = AddSlider(oe.ctrlPanel, "V #", biparam.minVDivs, 1024+biparam.minVDivs, biparam.vDivs);
             Return();
 //		oe.aConstraints.gridwidth = 1;
 //		oe.aConstraints.fill = GridBagConstraints.VERTICAL;
diff --git a/BoundaryRep.java b/BoundaryRep.java
index 931cfab..693d818 100644
--- a/BoundaryRep.java
+++ b/BoundaryRep.java
@@ -3531,7 +3531,7 @@
            e.printStackTrace();
         }
         
-        Trim(wastrim,true,crease,wasstrip,false);
+        Trim(true/*wastrim*/,true,crease,wasstrip,false);
     }
     
     void GenNormalsJME()
@@ -5038,6 +5038,59 @@
         colors = null;
     }
     
+    void CreateMesh(iHeightField hf, int x, int y)
+    {
+        BoundaryRep tmp = new BoundaryRep();
+        
+        int vc = 0;
+        
+        Vertex v = new Vertex(true);
+        
+        for (int i=0; i<x; i++)
+        {
+            for (int j=0; j<y; j++)
+            {
+//                Vertex v = tmp.GetVertex(vc++);
+                
+                v.s = v.x = i;
+                v.t = v.z = j;
+                v.s /= x; v.t /= y;
+                v.y = hf.f(i,j);
+                
+                int iu = tmp.AddTableVertex(v);
+                
+                v.s = v.x = i+1;
+                v.t = v.z = j;
+                v.s /= x; v.t /= y;
+                v.y = hf.f(i+1,j);
+                
+                int iv = tmp.AddTableVertex(v);
+                
+                v.s = v.x = i+1;
+                v.t = v.z = j+1;
+                v.s /= x; v.t /= y;
+                v.y = hf.f(i+1,j+1);
+                
+                int iw = tmp.AddTableVertex(v);
+                
+                v.s = v.x = i;
+                v.t = v.z = j+1;
+                v.s /= x; v.t /= y;
+                v.y = hf.f(i,j+1);
+                
+                int ix = tmp.AddTableVertex(v);
+                
+                tmp.AddFace(iu,iw,iv);
+                tmp.AddFace(iu,ix,iw);
+            }
+        }
+        
+        Set(tmp);
+
+        Trim(true,false,true);
+        ClearColors();
+    }
+    
     void Stripify()
     {
         if (stripified)
@@ -5297,18 +5350,10 @@
         double minweight = 1E10;
         
         nbbadfaces = 0;
-        for (int i=faces.size(); (i-=8)>=0;)
+        for (int i=0; i<faces.size(); i+=8)
+//        for (int i=faces.size(); (i-=8)>=0;)
         {
             Face face = (Face) faces.get(i);
-            
-        //??    if (face.weight < 0)
-        //        continue;
-            
-            double K = 1; // 0.01; // .25;
-            
-            double factor = (1-K)*face.nbiterations + K; //*face.weight;
-            
-            double weight = FaceWeight(face); // *Math.pow(PerimeterMax(face),0.25)*factor;
             
             if (!Valid(face))
             {
@@ -5327,10 +5372,21 @@
                 !ValidValence(face.r))
                 continue;
                         
+        //??    if (face.weight < 0)
+        //        continue;
+            
+            double K = 1; // 0.01; // .25;
+            
+            double factor = (1-K)*face.nbiterations + K; //*face.weight;
+            
+            double weight = FaceWeight(face); // *Math.pow(PerimeterMax(face),0.25)*factor;
+            
             if (minweight > weight)
             {
                 minweight = weight;
                 chosen = i;
+                if (minweight == 0)
+                    break;
             }
         }
         
@@ -7373,7 +7429,7 @@
         if (max < maxz - minz)
             max = maxz - minz;
         
-        tmp.THRESHOLD = max/25; // 50;
+        tmp.THRESHOLD = 0.5; // max/25; // 50;
         
         tmp.faces.clear();
         
@@ -7932,6 +7988,8 @@
         
         minface.q = minface.r = minface.p;
         
+        int count = 0;
+        
         for (int i=0; i<faces.size(); i++)
         {
             Face face = (Face) faces.get(i);
@@ -7943,6 +8001,9 @@
                 TouchVertex(face.r, true); // , minface.weight);
 //    assert(!lock);
                 faces.remove(i--);
+                count++;
+                if (count == 4)
+                    break;
             }
         }
         
diff --git a/CameraPane.java b/CameraPane.java
index b9fb49f..3e6f8d9 100644
--- a/CameraPane.java
+++ b/CameraPane.java
@@ -768,6 +768,8 @@
     class CacheTexture
     {
         com.sun.opengl.util.texture.Texture texture;
+        com.sun.opengl.util.texture.TextureData texturedata;
+        
         int resolution;
         
         CacheTexture(com.sun.opengl.util.texture.Texture tex, int res)
@@ -6451,7 +6453,7 @@
         return; // true;
     }
     
-    com.sun.opengl.util.texture.Texture GetTexture(String tex, boolean bump, int resolution)
+    CacheTexture GetCacheTexture(String tex, boolean bump, int resolution)
     {
         CacheTexture/*com.sun.opengl.util.texture.Texture*/ texture = null;
         
@@ -6665,6 +6667,8 @@
                         thetex.texture.dispose();
                         textures.remove(texname);
                     }
+                    
+                    texture.texturedata = texturedata;
                     textures.put(texname, texture);
 
            //         newtex = true;
@@ -6681,6 +6685,13 @@
             }
         }
         
+        return texture;
+    }
+    
+    com.sun.opengl.util.texture.Texture GetTexture(String tex, boolean bump, int resolution)
+    {
+        CacheTexture texture = GetCacheTexture(tex, bump, resolution);
+                
         if (bump)
         {
     //        GraphreeD.trace("PUSH BUMP " + tex  + "(" + bumpdepth + ")" + " : " + texture);
@@ -6693,6 +6704,13 @@
         }
         
         return texture!=null?texture.texture:null;
+    }
+    
+    com.sun.opengl.util.texture.TextureData GetTextureData(String tex, boolean bump, int resolution)
+    {
+        CacheTexture texture = GetCacheTexture(tex, bump, resolution);
+                
+        return texture!=null?texture.texturedata:null;
     }
     
     boolean BindTexture(String tex, boolean bump, int resolution)
@@ -10253,7 +10271,7 @@
             return;
         }
 
-        if (obj instanceof CheckerIG)
+        if (obj instanceof Checker)
         {
             checker = obj;
 
diff --git a/Checker.java b/Checker.java
index d62b2ab..d1fffe7 100644
--- a/Checker.java
+++ b/Checker.java
@@ -1,5 +1,26 @@
-//package edu.wlu.cs.levy.CG;
+class Checker extends Object3D
+{
+    Checker()
+    {
+        this("Checker");
+    }
+    
+    Checker(String name)
+    {
+        super(name);
+        
+        material = new cMaterial();
+        
+        material.ambient = 100;
+        material.specular = 0.001f;
+        material.diffuse = 0.01f;
+        material.cameralight = 0.001f;
+    }
 
-public interface Checker<T> {
-    public boolean usable(T v);
+    Object3D deepCopy()
+    {
+            Object3D comp = new Checker();
+            deepCopySelf(comp);
+            return comp;
+    }
 }
diff --git a/CheckerIG.java b/CheckerIG.java
deleted file mode 100644
index 94d5993..0000000
--- a/CheckerIG.java
+++ /dev/null
@@ -1,26 +0,0 @@
-class CheckerIG extends Object3D
-{
-    CheckerIG()
-    {
-        this("Checker");
-    }
-    
-    CheckerIG(String name)
-    {
-        super(name);
-        
-        material = new cMaterial();
-        
-        material.ambient = 100;
-        material.specular = 0.001f;
-        material.diffuse = 0.01f;
-        material.cameralight = 0.001f;
-    }
-
-    Object3D deepCopy()
-    {
-            Object3D comp = new CheckerIG();
-            deepCopySelf(comp);
-            return comp;
-    }
-}
diff --git a/CheckerInterface.java b/CheckerInterface.java
new file mode 100644
index 0000000..5c6b626
--- /dev/null
+++ b/CheckerInterface.java
@@ -0,0 +1,5 @@
+//package edu.wlu.cs.levy.CG;
+
+public interface CheckerInterface<T> {
+    public boolean usable(T v);
+}
diff --git a/GroupEditor.java b/GroupEditor.java
index f50fede..200e78d 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -14,7 +14,7 @@
 
 //import buoy.widget.BFileChooser;
 
-class GroupEditor extends ObjEditor implements iParse, //iCallBack,
+class GroupEditor extends ObjEditor implements //iParse, //iCallBack,
         ObjectUI,
         Runnable,
         ActionListener,
@@ -188,8 +188,9 @@
 		clearItem.addActionListener(this);
 		clearAllItem = menu.add(new MenuItem("Clear All"));
 		clearAllItem.addActionListener(this);
-		menu.add("-");
-		resetMeshItem = menu.add(new MenuItem("Reset All"));
+
+		oe.menuBar.add(menu = new Menu("Setting"));
+                resetMeshItem = menu.add(new MenuItem("Reset All"));
 		resetMeshItem.addActionListener(this);
 		stepAllItem = menu.add(new MenuItem("Step All"));
 		stepAllItem.addActionListener(this);
@@ -221,7 +222,7 @@
 		setMasterItem = menu.add(new MenuItem("Set Master Mesh"));
 		setMasterItem.addActionListener(this);
                 
-		oe.menuBar.add(menu = new Menu("Object"));
+		oe.menuBar.add(menu = new Menu("Group"));
 		grabItem = menu.add(new MenuItem("Grab"));
 		grabItem.addActionListener(this);
 		frontItem = menu.add(new MenuItem("Front"));
@@ -247,7 +248,8 @@
 		scriptNodeItem.addActionListener(this);
 		cameraItem = menu.add(new MenuItem("Camera"));
 		cameraItem.addActionListener(this);
-		menu.add("-");
+                
+		oe.menuBar.add(menu = new Menu("Object"));
 		textureItem = menu.add(new MenuItem("Texture"));
 		textureItem.addActionListener(this);
 		csgItem = menu.add(new MenuItem("CSG"));
@@ -292,8 +294,6 @@
 		untrimItem = menu.add(new MenuItem("Untrim"));
 		untrimItem.addActionListener(this);
 		menu.add("-");
-		clearMaterialsItem = menu.add(new MenuItem("Clear Materials"));
-		clearMaterialsItem.addActionListener(this);
 		clearColorsItem = menu.add(new MenuItem("Clear AO"));
 		clearColorsItem.addActionListener(this);
 		reverseNormalsItem = menu.add(new MenuItem("Reverse Normals"));
@@ -310,6 +310,10 @@
 		smoothMeshItem.addActionListener(this);
 		clipMeshItem = menu.add(new MenuItem("Clip mesh"));
 		clipMeshItem.addActionListener(this);
+
+                oe.menuBar.add(menu = new Menu("Attributes"));
+		clearMaterialsItem = menu.add(new MenuItem("Clear Materials"));
+		clearMaterialsItem.addActionListener(this);
 		menu.add("-");
 		liveleavesItem = menu.add(new MenuItem("Live Leaves"));
 		liveleavesItem.addActionListener(this);
@@ -332,27 +336,18 @@
 		flipVItem.addActionListener(this);
 		unflipVItem = menu.add(new MenuItem("Unflip V"));
 		unflipVItem.addActionListener(this);
-		lowTexturesItem = menu.add(new MenuItem("Low Texture"));
+		lowTexturesItem = menu.add(new MenuItem("Low Texture (256)"));
 		lowTexturesItem.addActionListener(this);
-		normalTexturesItem = menu.add(new MenuItem("Normal Texture"));
+		normalTexturesItem = menu.add(new MenuItem("Normal Texture (512)"));
 		normalTexturesItem.addActionListener(this);
-		highTexturesItem = menu.add(new MenuItem("High Texture"));
+		highTexturesItem = menu.add(new MenuItem("High Texture (1024)"));
 		highTexturesItem.addActionListener(this);
-		veryhighTexturesItem = menu.add(new MenuItem("Very high Texture"));
+		veryhighTexturesItem = menu.add(new MenuItem("Very high Texture (2048)"));
 		veryhighTexturesItem.addActionListener(this);
-		maxTexturesItem = menu.add(new MenuItem("Max Texture"));
+		maxTexturesItem = menu.add(new MenuItem("Max Texture (4096)"));
 		maxTexturesItem.addActionListener(this);
-		panoTexturesItem = menu.add(new MenuItem("Panoramic Texture"));
+		panoTexturesItem = menu.add(new MenuItem("Panoramic Texture (8192)"));
 		panoTexturesItem.addActionListener(this);
-		menu.add("-");
-		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("Selection"));
 		attachPigmentItem = menu.add(new MenuItem("Attach Pigment..."));
@@ -370,9 +365,31 @@
 		sortbysizeItem.addActionListener(this);
 		sortbynameItem = menu.add(new MenuItem("Sort by name"));
 		sortbynameItem.addActionListener(this);
+		menu.add("-");
+		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"));
 		buildCreateMenu(menu);
-		oe.menuBar.add(menu = new Menu("Tools"));
+                
+               
+                oe.menuBar.add(menu = new Menu("Include"));
+		importGFDItem = menu.add(new MenuItem("GraphreeD Object..."));
+		importGFDItem.addActionListener(this);
+		importVRMLX3DItem = menu.add(new MenuItem("VRML/X3D Object..."));
+		importVRMLX3DItem.addActionListener(this);
+		importOBJItem = menu.add(new MenuItem("OBJ Object..."));
+		importOBJItem.addActionListener(this);
+		import3DSItem = menu.add(new MenuItem("3DS Object..."));
+		import3DSItem.addActionListener(this);
+
+                oe.menuBar.add(menu = new Menu("Tools"));
 		buildToolsMenu(menu);
 	}
 	
@@ -1002,6 +1019,8 @@
 	
 	void buildCreateMenu(Menu menu)
 	{
+		//heightFieldItem = menu.add(new MenuItem("Height Field"));
+		//heightFieldItem.addActionListener(this);
 		gridItem = menu.add(new MenuItem("Grid"));
 		gridItem.addActionListener(this);
 		rectoidItem = menu.add(new MenuItem("Box"));
@@ -1048,15 +1067,6 @@
 		doubleItem.addActionListener(this);
 		tripleItem = menu.add(new MenuItem("Trident"));
 		tripleItem.addActionListener(this);
-		menu.add("-");
-		importGFDItem = menu.add(new MenuItem("GraphreeD Object..."));
-		importGFDItem.addActionListener(this);
-		importVRMLX3DItem = menu.add(new MenuItem("VRML/X3D Object..."));
-		importVRMLX3DItem.addActionListener(this);
-		importOBJItem = menu.add(new MenuItem("OBJ Object..."));
-		importOBJItem.addActionListener(this);
-		import3DSItem = menu.add(new MenuItem("3DS Object..."));
-		import3DSItem.addActionListener(this);
 	}
         
 	void buildToolsMenu(Menu menu)
@@ -1068,6 +1078,8 @@
 		menu.add("-");
 		parseverticesItem = menu.add(new MenuItem("Multiplicity"));
 		parseverticesItem.addActionListener(this);
+		textureFieldItem = menu.add(new MenuItem("Texture Field"));
+		textureFieldItem.addActionListener(this);
 		alignItem = menu.add(new MenuItem("Align"));
 		alignItem.addActionListener(this);
 		mirrorItem = menu.add(new MenuItem("Mirror Poses"));
@@ -1521,6 +1533,46 @@
                     makeSomething(ragdoll);
 			//makeSomething(new VehicleDemo());
 		} else
+                    /*
+                     */
+		if (event.getSource() == heightFieldItem)
+		{
+                    Object3D obj = new Object3D();
+                    
+                    obj.CreateMaterial();
+                    obj.bRep = new BoundaryRep();
+                    
+                    obj.bRep.CreateMesh(new iHeightField()
+                    {
+                        public double f(double x, double y)
+                        {
+       // The Mandelbrot set is represented by coloring
+            // each point (x,y) according to the number of
+            // iterations it takes before the while loop in 
+            // this method ends.  For points that are actually
+            // in the Mandelbrot set, or very close to it, the 
+            // count will reach the maximum value, 80.  These
+            // points will be colored purple.  All other colors
+            // represent points that are definitely NOT in the set.
+                            x -= 600;
+                            y -= 500;
+                            x /= 200;
+                            y /= 200;
+         int count = 0;
+         double zx = x;
+         double zy = y;
+         while (count < 80 && Math.abs(x) < 100 && Math.abs(zy) < 100) {
+            double new_zx = zx*zx - zy*zy + x;
+            zy = 2*zx*zy + y;
+            zx = new_zx;
+            count++;
+         }
+         return count; // Math.sqrt(count);
+                        }
+                    }, 1000,1000);
+                    
+                    makeSomething(obj);
+		} else
 		if (event.getSource() == gridItem)
 		{
 			makeSomething(new Grid());
@@ -1570,7 +1622,7 @@
                         LA.matConcat(obj.toParent, cameraView.renderCamera.fromParent, obj.toParent);
 			LA.matInvert(obj.toParent, obj.fromParent);
                      */
-			makeSomething(new CheckerIG());
+			makeSomething(new Checker());
 		} else
 		if (event.getSource() == meshItem)
 		{
@@ -2352,6 +2404,10 @@
 		if (event.getSource() == parseverticesItem)
                 {
 			ParseVertices();
+		} else
+		if (event.getSource() == textureFieldItem)
+                {
+			TextureVertices();
 		} else
 		if (event.getSource() == alignItem)
                 {
@@ -3157,96 +3213,228 @@
 
         //Object3D buffer;
         cVector temp = new cVector();
-        BoundaryRep temprep;
-        Object3D nodes;
-        Vector<Vertex> vertices;
-        
-        public void Vertex(Object3D node, Vertex v)
-        {
-            vertices.add(v);
-            nodes.addElement(node);
-            
-            if (temprep.GetCache(v) != null)
-            {
-                temprep.Remove(v);
-            }
-            else
-            {
-                temprep.Remember(v);
-            }
-        }
-        
-        public void Face(Object3D node, Face f)
-        {
-            
-        }
-        
+//        BoundaryRep temprep;
+//        Object3D nodes;
+//        Vector<Vertex> vertices;
+//        
+//        cGroup buffer;
+//        
+//        public void Vertex(Object3D node, Vertex v)
+//        {
+////            vertices.add(v);
+////            nodes.addElement(node);
+////
+////            if (temprep.GetCache(v) != null)
+////            {
+////                temprep.Remove(v);
+////            } else
+////            {
+////                temprep.Remember(v);
+////            }
+//            
+//                    //Object3D node = nodes.get(index);
+//                    temp.set(v); // vertices.get(index)); // temprep.GetVertex(k));
+//                  //  System.out.println("temp = " + temp.x + ", " + temp.y + ", " + temp.z);
+//
+//                    LA.xformPos(temp, node.GlobalTransformInv(), temp);
+//                    
+//                  //  System.out.println("tem+ = " + temp.x + ", " + temp.y + ", " + temp.z);
+//                    
+//                    cGroup g = new cGroup();
+//                    
+//                    if (g.toParent == null)
+//                    {
+//                        g.toParent = LA.newMatrix();
+//                        g.fromParent = LA.newMatrix();
+//                    }
+//                    LA.matTranslate(g.toParent, temp.x, temp.y, temp.z);
+//                    LA.matTranslate(g.fromParent, -temp.x, -temp.y, -temp.z);
+//
+//                    g.add(GraphreeD.clipboard);
+//
+//                    buffer.add(g);
+//        }
+//        
+//        public void Face(Object3D node, Face f)
+//        {
+//            
+//        }
+//        
+//	void ParseVerticesOld() // ??
+//	{
+//            //if (group.selection.size() != 1)
+//            //    return;
+//            
+//            temprep = new BoundaryRep();
+//            nodes = new Object3D();
+//            vertices = new Vector<Vertex>();
+//            
+//            boolean epsequal = GraphreeD.epsequal;
+//            GraphreeD.epsequal = true;
+//            
+//            for (int i=0; i<group.selection.size(); i++)
+//            {
+//                Object3D buffer = new cGroup(group.selection.get(i).name + "+");
+//            
+//		group.selection.get(i).Parse(
+//this                        );
+//                
+//                int repsize = temprep.VertexCount();
+//                int tablesize = temprep.vertextable.size();
+//                int nodesize = nodes.size();
+//
+//                assert(vertices.size() == nodes.size());
+//                
+//                temprep.vertextable.elements();
+//                
+//                java.util.Set<java.util.Map.Entry<Vertex,Vertex>> set = temprep.vertextable.entrySet();
+//
+//                for (java.util.Map.Entry<Vertex,Vertex> entry : set)
+//                {
+//                    cGroup g = new cGroup();
+//
+//                    int index = vertices.indexOf(entry.getValue()); // temprep.vertextable.(k));
+//                    
+//                    Object3D node = nodes.get(index);
+//                    temp.set(vertices.get(index)); // temprep.GetVertex(k));
+//                  //  System.out.println("temp = " + temp.x + ", " + temp.y + ", " + temp.z);
+//
+//                    LA.xformPos(temp, node.GlobalTransformInv(), temp);
+//                    
+//                  //  System.out.println("tem+ = " + temp.x + ", " + temp.y + ", " + temp.z);
+//                    
+//                    if (g.toParent == null)
+//                    {
+//                        g.toParent = LA.newMatrix();
+//                        g.fromParent = LA.newMatrix();
+//                    }
+//                    LA.matTranslate(g.toParent, temp.x, temp.y, temp.z);
+//                    LA.matTranslate(g.fromParent, -temp.x, -temp.y, -temp.z);
+//
+//                    g.add(GraphreeD.clipboard);
+//
+//                    buffer.add(g);
+//                }
+//                
+//                makeSomething(buffer, i==group.selection.size()-1);
+//            }
+//            
+//            GraphreeD.epsequal = epsequal;
+//            
+//            //buffer = null;
+//            temprep = null;
+//            nodes = null;
+//            
+//            refreshContents();
+//	}
+	
 	void ParseVertices()
 	{
-            //if (group.selection.size() != 1)
-            //    return;
-            
-            temprep = new BoundaryRep();
-            nodes = new Object3D();
-            vertices = new Vector<Vertex>();
-            
             boolean epsequal = GraphreeD.epsequal;
             GraphreeD.epsequal = true;
             
             for (int i=0; i<group.selection.size(); i++)
             {
-                Object3D buffer = new cGroup(group.selection.get(i).name + "+");
+                final cGroup buffer = new cGroup(group.selection.get(i).name + "+");
             
-		group.selection.get(i).Parse(this);
-                
-                int repsize = temprep.VertexCount();
-                int tablesize = temprep.vertextable.size();
-                int nodesize = nodes.size();
+		group.selection.get(i).Parse(
+                        
+                        new iParse()
+                        {
+                            public void Vertex(Object3D node, Vertex v)
+                            {
+                                temp.set(v);
+                                LA.xformPos(temp, node.GlobalTransformInv(), temp);
 
-                assert(vertices.size() == nodes.size());
-                
-                temprep.vertextable.elements();
-                
-                java.util.Set<java.util.Map.Entry<Vertex,Vertex>> set = temprep.vertextable.entrySet();
+                                cGroup g = new cGroup();
 
-                for (java.util.Map.Entry<Vertex,Vertex> entry : set)
-                {
-                    cGroup g = new cGroup();
+                                if (g.toParent == null)
+                                {
+                                    g.toParent = LA.newMatrix();
+                                    g.fromParent = LA.newMatrix();
+                                }
+                                LA.matTranslate(g.toParent, temp.x, temp.y, temp.z);
+                                LA.matTranslate(g.fromParent, -temp.x, -temp.y, -temp.z);
 
-                    int index = vertices.indexOf(entry.getValue()); // temprep.vertextable.(k));
-                    Object3D node = nodes.get(index);
-                    temp.set(vertices.get(index)); // temprep.GetVertex(k));
-                  //  System.out.println("temp = " + temp.x + ", " + temp.y + ", " + temp.z);
+                                g.add(GraphreeD.clipboard);
 
-                    LA.xformPos(temp, node.GlobalTransformInv(), temp);
-                    
-                  //  System.out.println("tem+ = " + temp.x + ", " + temp.y + ", " + temp.z);
-                    
-                    if (g.toParent == null)
-                    {
-                        g.toParent = LA.newMatrix();
-                        g.fromParent = LA.newMatrix();
-                    }
-                    LA.matTranslate(g.toParent, temp.x, temp.y, temp.z);
-                    LA.matTranslate(g.fromParent, -temp.x, -temp.y, -temp.z);
+                                buffer.add(g);
+                            }
 
-                    g.add(GraphreeD.clipboard);
+                            public void Face(Object3D node, Face f)
+                            {
 
-                    buffer.add(g);
-                }
+                            }
+                        }
+                        );
                 
                 makeSomething(buffer, i==group.selection.size()-1);
             }
             
             GraphreeD.epsequal = epsequal;
             
-            //buffer = null;
-            temprep = null;
-            nodes = null;
+            refreshContents();
+	}
+        
+	void TextureVertices()
+	{
+            for (int i=0; i<group.selection.size(); i++)
+            {
+		group.selection.get(i).Parse(
+                    new iParse()
+                    {
+                        public void Vertex(Object3D node, Vertex v)
+                        {
+                            cTexture tex = node.GetTextures();
+                            String pigment = Object3D.GetPigment(tex);
+                            //String bump = Object3D.GetBump(tex);
+                            
+                            com.sun.opengl.util.texture.TextureData texturedata = CameraPane.theRenderer.GetTextureData(pigment, false, node.texres);
+                            
+                            double s = v.s;
+                            
+                            if (s == 1)
+                                s = 0;
+                            
+                            double t = v.t;
+                            
+                            if (t == 1)
+                                t = 0;
+                            
+                            int indexs = (int) (texturedata.getWidth() * s);
+                            int indext = (int) (texturedata.getHeight() * t);
+                            
+                            int index = indext * texturedata.getWidth() + indexs;
+                            
+                            java.nio.ByteBuffer bytebuf = (java.nio.ByteBuffer)texturedata.getBuffer();
+                                    
+                            int slide = bytebuf.capacity() / texturedata.getWidth() / texturedata.getHeight();
+                            
+                            float scale = bytebuf.get(index*slide) & 0xFF;
+                            scale += bytebuf.get(index*slide+1) & 0xFF;
+                            scale += bytebuf.get(index*slide+2) & 0xFF;
+                            scale /= 3;
+                            
+                            scale /= 0xFF;
+                            scale /= 4;
+                            
+                            //v.AO = scale;
+                            
+                            v.x += v.norm.x * scale;
+                            v.y += v.norm.y * scale;
+                            v.z += v.norm.z * scale;
+                        }
+
+                        public void Face(Object3D node, Face f)
+                        {
+                        }
+                    }
+                );
+            }
             
             refreshContents();
 	}
-	
+        
 	void Align()
 	{
             for (int i=0; i<group.selection.size(); i++)
@@ -4728,6 +4916,8 @@
 	private MenuItem particleItem;
 	private MenuItem ragdollItem;
 	private MenuItem ragdoll2Item;
+	private MenuItem heightFieldItem;
+	private MenuItem textureFieldItem;
 	private MenuItem gridItem;
 	private MenuItem rectoidItem;
 	private MenuItem ellipsoidItem;
diff --git a/HeightField.java b/HeightField.java
new file mode 100644
index 0000000..1c3325b
--- /dev/null
+++ b/HeightField.java
@@ -0,0 +1,26 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/**
+ *
+ * @author nbriere
+ */
+public class HeightField extends Grid
+{
+    iHeightField heightField;
+    
+    HeightField(iHeightField hf)
+    {
+        heightField = hf;
+    }
+    
+    Vertex biparamFunction(double u, double v)
+    {
+        Vertex temp = new Vertex((2*v-1)*radius*8, 0 /*-radius,*/, (2*u-1)*radius*8);
+        temp.norm = LA.newVector(0,1,0);
+        return temp;
+    }
+    
+}
diff --git a/KDNode.java b/KDNode.java
index 6479992..7ce90d3 100644
--- a/KDNode.java
+++ b/KDNode.java
@@ -140,7 +140,7 @@
     protected static <T> void nnbr(KDNode<T> kd, HPoint target, HRect hr,
             double max_dist_sqd, int lev, int K,
             NearestNeighborList<KDNode<T>> nnl,
-            Checker<T> checker,
+            CheckerInterface<T> checker,
             long timeout)
     {
 
diff --git a/KDTree.java b/KDTree.java
index 5832c5d..ea6ebe6 100644
--- a/KDTree.java
+++ b/KDTree.java
@@ -285,7 +285,7 @@
      * @throws IllegalArgumentException if <I>n</I> is negative or
      * exceeds tree size 
      */
-    public List<T> nearest(double[] key, int n, Checker<T> checker)
+    public List<T> nearest(double[] key, int n, CheckerInterface<T> checker)
             throws KeySizeException, IllegalArgumentException
     {
 
@@ -360,7 +360,7 @@
     }
 
     private NearestNeighborList<KDNode<T>> getnbrs(double[] key, int n,
-            Checker<T> checker) throws KeySizeException
+            CheckerInterface<T> checker) throws KeySizeException
     {
 
         if (key.length != m_K)
diff --git a/Mocap.java b/Mocap.java
index d01cb85..88fa618 100644
--- a/Mocap.java
+++ b/Mocap.java
@@ -754,7 +754,7 @@
         //long
 // june 2014                floorid = sourcenode.getFloor(floor); // , sourcenode.parent);
         
-        CameraPane.debugpoints[0].name = "Floor = " + floorid;
+        CameraPane.debugpoints[0].name = ""; // "Floor = " + 0; // floorid;
         CameraPane.debugpoints[0].toParent[3][0] = floor.x;
         CameraPane.debugpoints[0].toParent[3][1] = floor.y;
         CameraPane.debugpoints[0].toParent[3][2] = floor.z;
@@ -770,7 +770,7 @@
         
         this.count--; // currently drawing itself
         
-        CameraPane.debugpoints[7].name = "Centroid = " + groundid; // centroid;
+        CameraPane.debugpoints[7].name = ""; // Centroid = " + 0; // groundid; // centroid;
         CameraPane.debugpoints[7].toParent[3][0] = centroid.x;
         CameraPane.debugpoints[7].toParent[3][1] = centroid.y;
         CameraPane.debugpoints[7].toParent[3][2] = centroid.z;
@@ -795,7 +795,7 @@
         
 // jan 2014        sourcenode.parent.TransformToWorld(tmp);
         
-        CameraPane.debugpoints[1].name = "C+";
+        CameraPane.debugpoints[1].name = ""; // "C+";
         CameraPane.debugpoints[1].toParent[3][0] = tmp.x;
         CameraPane.debugpoints[1].toParent[3][1] = tmp.y;
         CameraPane.debugpoints[1].toParent[3][2] = tmp.z;
@@ -814,7 +814,7 @@
             tmp.z = pinz;
         }
         
-        CameraPane.debugpoints[2].name = "Pin";
+        CameraPane.debugpoints[2].name = ""; // "Pin";
         CameraPane.debugpoints[2].toParent[3][0] = tmp.x;
         CameraPane.debugpoints[2].toParent[3][1] = tmp.y;
         CameraPane.debugpoints[2].toParent[3][2] = tmp.z;
@@ -822,7 +822,7 @@
         //if (sourcenode.parent.parent != null)
 // jan 2014            sourcenode.parent.TransformToLocal(tmp); //, tmp);
 
-        CameraPane.debugpoints[3].name = "C-";
+        CameraPane.debugpoints[3].name = ""; // "C-";
         CameraPane.debugpoints[3].toParent[3][0] = tmp.x;
         CameraPane.debugpoints[3].toParent[3][1] = tmp.y;
         CameraPane.debugpoints[3].toParent[3][2] = tmp.z;
@@ -895,14 +895,14 @@
 //        if (sourcenode.parent.parent != null)
 //            sourcenode.parent.parent.TransformToWorld(floor); //, floor);
         
-        CameraPane.debugpoints[5].name = "F++";
+        CameraPane.debugpoints[5].name = ""; // "F++";
         CameraPane.debugpoints[5].toParent[3][0] = floor.x;
         CameraPane.debugpoints[5].toParent[3][1] = floor.y;
         CameraPane.debugpoints[5].toParent[3][2] = floor.z;
         
         floor.y = tempg;
 
-        CameraPane.debugpoints[6].name = "F+-";
+        CameraPane.debugpoints[6].name = ""; // "F+-";
         CameraPane.debugpoints[6].toParent[3][0] = floor.x;
         CameraPane.debugpoints[6].toParent[3][1] = floor.y;
         CameraPane.debugpoints[6].toParent[3][2] = floor.z;
@@ -1318,7 +1318,7 @@
         
         rotsourcenode.TransformToWorld(test);
 
-        CameraPane.debugpoints[4].name = "ROT = "; // + test;
+        CameraPane.debugpoints[4].name = ""; // "ROT = "; // + test;
         CameraPane.debugpoints[4].toParent[3][0] = test.x;
         CameraPane.debugpoints[4].toParent[3][1] = test.y;
         CameraPane.debugpoints[4].toParent[3][2] = test.z;
diff --git a/ObjEditor.java b/ObjEditor.java
index 689f974..22fab98 100644
--- a/ObjEditor.java
+++ b/ObjEditor.java
@@ -1336,7 +1336,7 @@
 
 //            aConstraints = gbc; // (GridBagConstraints) GraphreeD.clone(gbc);
 
-        frame.setSize(800, 600);
+        frame.setSize(1024, 768);
         frame.show();
 
         gridPanel.setDividerLocation(1.0);
diff --git a/Object3D.java b/Object3D.java
index 1b4f39c..8f3990d 100644
--- a/Object3D.java
+++ b/Object3D.java
@@ -3717,7 +3717,7 @@
 
     boolean getCentroid(cVector centroid, boolean xform)
     {
-        assert(false);
+// for speaker        assert(false);
         if (blockloop)
             return false;
         
@@ -4515,16 +4515,28 @@
     
     Object3D GetFileRoot()
     {
+        if (overflow)
+            return null;
+        
+        overflow = true;
+            
+        Object3D pfr = null;
+        
         if (parent == null && fileparent == null)
-            return this;
+            pfr = this;
         
         if (parent == null && fileparent != null) // V4.gfd???
-            return fileparent;
+            pfr = fileparent;
         
-        if (parent == null)
-            return this;
+        if (pfr == null && parent == null)
+            pfr = this;
         
-        return parent.GetFileRoot();
+        if (pfr == null)
+            pfr = parent.GetFileRoot();
+        
+        overflow = false;
+        
+        return pfr;
     }
     
     cTreePath GetPath()
@@ -5280,7 +5292,7 @@
         if (name != null && name.contains("sclera"))
             name = name;
         
-        if (this instanceof CheckerIG)
+        if (this instanceof Checker)
             return;
         
         if (display.drawMode == display.SHADOW && PASSTEST)
@@ -7735,8 +7747,15 @@
         info.pane.repaint();
     }
 
+    boolean overflow = false;
+    
     void TransformToWorld(cVector out) // , cVector out)
     {
+        if (overflow)
+            return;
+        
+        overflow = true;
+            
         // june 2013 ???       assert (in == out);
         cVector in = out;
         if (toParent != null && !(this instanceof Texture || this instanceof TextureNode))
@@ -7753,6 +7772,8 @@
         {
             (parent!=null?parent:fileparent).TransformToWorld(out); //, out);
         }
+        
+        overflow = false;
     }
 
     void TransformToLocal(cVector out) //, cVector out)
@@ -7995,19 +8016,22 @@
             max = new cVector();
         }
         
-        Object3D sourcenode = GetFileRoot();
-    
-        if (!sourcenode.name.contains("rclab"))
+        if (false) // Can crawl!!
         {
-            getBounds(min, max, true);
+            Object3D sourcenode = GetFileRoot();
 
-            if (min.y != Double.POSITIVE_INFINITY && min.y > 2)
+            if (sourcenode != null && !sourcenode.name.contains("rclab"))
             {
-//                sourcenode.getBounds(min, max, true);
-                sourcenode.getBounds(v0, v1, true);
-//                sourcenode.toParent = sourcenode.toParent;
-//                get(0).toParent = get(0).toParent;
-//                sourcenode.GlobalTransform();
+                getBounds(min, max, true);
+
+                if (min.y != Double.POSITIVE_INFINITY && min.y > 2)
+                {
+    //                sourcenode.getBounds(min, max, true);
+                    sourcenode.getBounds(v0, v1, true);
+    //                sourcenode.toParent = sourcenode.toParent;
+    //                get(0).toParent = get(0).toParent;
+    //                sourcenode.GlobalTransform();
+                }
             }
         }
         
@@ -8016,7 +8040,8 @@
         if (support != null)
         {
             assert(bRep != null);
-            GraphreeD.Assert(support.bRep == bRep.support);
+            if (!(support instanceof GenericJoint)) // support.bRep != null)
+                GraphreeD.Assert(support.bRep == bRep.support);
         }
         else
         {
diff --git a/ScriptNode.java b/ScriptNode.java
index 93f6266..4ba4bbb 100644
--- a/ScriptNode.java
+++ b/ScriptNode.java
@@ -285,7 +285,7 @@
             else
             {
                 if (speaker != null)
-                    System.err.println(speaker.GetFileRoot().name + " (not a command) : " + reader.line);
+                    System.err.println(speaker.GetFileRoot().name + " (speaking) : " + reader.line);
                 else
                     System.err.println("no speaker (not a command) : " + reader.line);
             }
@@ -412,7 +412,7 @@
         {
             //path += "/" + Filename(readers[i].script);
             ScriptReader reader = readers[i];
-            path += Filename(readers[i].script) + "; duration=" + reader.duration + "; total=" + reader.totalduration +
+            path += Filename(reader.script) + "; duration=" + reader.duration + "; total=" + reader.totalduration +
                                                   "; line#" + reader.linecount + ": " + reader.line;
             if (reader.line != null && // sept 2014
                     reader.line.startsWith("_"))
@@ -488,7 +488,7 @@
                 reader = readers[stack] = new ScriptReader(new BufferedReader(new FileReader(script)), reader.totalduration, /*0, 0, "",*/ script);
                 //duration = 0; // june 2014
                 //linecount = 0;
-                //reader.script = script;
+                reader.script = script; // oct 2014
                 return;
             }
             if (command.equals("return")) // line.startsWith("; return"))
@@ -1438,7 +1438,7 @@
             object.skip = false;
             return;
         }
-        if (command.equals("skipmocap"))
+        if (command.equals("skipmocap") || command.equals("mocapskip")) // oct 2014
         {
             object.skipmocap = true;
             return;
diff --git a/Texture.java b/Texture.java
index a208c91..cb0153c 100644
--- a/Texture.java
+++ b/Texture.java
@@ -10,8 +10,8 @@
 public class Texture extends Composite implements java.io.Serializable
 {
     // deprecated due to serial problems
-    static final long serialVersionUID = //-5280151442948961597L; // new java
-                                            7695543694999681408L; // old java !!!
+    static final long serialVersionUID = -5280151442948961597L; // new java
+                                         //   7695543694999681408L; // old java !!!
     
     // default = -8076744133104150348L
     
diff --git a/iHeightField.java b/iHeightField.java
new file mode 100644
index 0000000..6cc1102
--- /dev/null
+++ b/iHeightField.java
@@ -0,0 +1,13 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/**
+ *
+ * @author nbriere
+ */
+public interface iHeightField
+{
+    double f(double x, double y);
+}

--
Gitblit v1.6.2