From e24558ddeacfc945b9e9ba0a32b552d04e2ed4dd Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 02 Jun 2019 20:11:20 -0400
Subject: [PATCH] Selectable mode + new mesh reduction.
---
ObjEditor.java | 13
LA.java | 3
Grid.java | 2
Vertex.java | 25 +
Merge.java | 80 +++--
Composite.java | 9
GenericJoint.java | 11
Grafreed.java | 2
iCameraPane.java | 4
BoundaryRep.java | 423 ++++++++++++++++++++++++++++------
CameraPane.java | 45 ++
Globals.java | 3
GroupEditor.java | 25 +
Face.java | 2
Object3D.java | 43 ++
cVector.java | 18 +
16 files changed, 544 insertions(+), 164 deletions(-)
diff --git a/BoundaryRep.java b/BoundaryRep.java
index 1781a47..3583aa0 100644
--- a/BoundaryRep.java
+++ b/BoundaryRep.java
@@ -161,6 +161,7 @@
|| FaceCount() != other.FaceCount()
|| !(indices == null ^ other.indices != null)) // july 2014
{
+ // The meshes have different structures.
//new Exception().printStackTrace();
trimmed = other.trimmed;
stripified = other.stripified;
@@ -239,9 +240,16 @@
}
}
- Support[] InitConnections(BoundaryRep other)
+ transient Support[] cachesupports = null;
+
+ Support[] InitConnections()
{
- int n = other.startvertices.length-1;
+ if (cachesupports != null)
+ {
+ return cachesupports;
+ }
+
+ int n = this.startvertices.length-1;
Support[] supports = new Support[n];
@@ -253,38 +261,60 @@
for (int object=1; object<=n; object++)
{
- int start = other.startvertices[object-1];
- int end = other.startvertices[object];
+ int start = this.startvertices[object-1];
+ int end = this.startvertices[object];
if (start == end)
continue; // ??
+ /**
+ Vertex v2 = vertextemp;
+ v2.x = averagepoints[object*3];
+ v2.y = averagepoints[object*3+1];
+ v2.z = averagepoints[object*3+2];
+
+ //v2.set(GetVertex(this.startvertices[subsupport]));
+
+ // projected point
+ Vertex v3 = vertextemp2;
+ //GetVertex(this.startvertices[subsupport]);
+ v3.x = extremepoints[object*3];
+ v3.y = extremepoints[object*3+1];
+ v3.z = extremepoints[object*3+2];
+
+ vect3.set(v3); // "X" axis apex
+ vect3.sub(v2); // origin (center)
+ vect3.normalize();
+ /**/
+
int linkcount = 0;
int objectinlist = -1;
+
+ Support subsupport = supports[object-1];
for (int object2=1; object2<=n; object2++)
{
for (int i = start; i < end; i++)
{
- Vertex v = other.GetVertex(i);
+ Vertex v = this.GetVertex(i);
- //
- if (other.Contains(v, object2))
+ // Check if v is close enough from any vertex of the given subobject.
+ if (this.Contains(v, object2))
{
- if (linkcount == supports[object-1].links.length)
+ if (linkcount == subsupport.links.length)
break;
if (object2 == object)
objectinlist = linkcount;
- supports[object-1].links[linkcount++] = object2;
+ subsupport.links[linkcount++] = object2;
break;
}
}
}
- supports[object-1].links[linkcount] = -1;
+ subsupport.links[linkcount] = -1;
if (objectinlist == -1)
assert(objectinlist != -1);
@@ -293,9 +323,9 @@
// assert(linkcount > 1);
// show main support as blue
- int first = supports[object-1].links[0];
- supports[object-1].links[0] = supports[object-1].links[objectinlist];
- supports[object-1].links[objectinlist] = first;
+ int first = subsupport.links[0];
+ subsupport.links[0] = subsupport.links[objectinlist];
+ subsupport.links[objectinlist] = first;
}
for (int loop = 0; --loop>=0;)
@@ -353,7 +383,7 @@
supports = supports2;
}
- return supports;
+ return cachesupports = supports;
}
double Distance2(Vertex v, Vertex v2, double dist2beat, double[][] toRoot, int k)
@@ -598,7 +628,7 @@
// ;
//
- supportsize = supportsizes[subsupport];
+ supportsize = supportminsize[subsupport];
double K = supportsize / distmax;
@@ -650,7 +680,8 @@
// if (supportsize * fadefactor > 1)
// return 1;
- return supportsize * fadefactor;
+ return //supportsize *
+ supportsize * fadefactor;
}
void RecomputeBasis(BoundaryRep other, double[][] toRoot, Vertex v)
@@ -952,7 +983,7 @@
// sept 2017 SEUIL = 0.1; // aout 2013
- supports = InitConnections(other);
+ supports = other.InitConnections();
other.supports = supports; // should be the other way around...
@@ -1895,7 +1926,7 @@
return;
}
- // System.exit(0);
+ // System.exit(0);
cVector vect = new cVector();
cVector normal = new cVector();
@@ -1966,7 +1997,7 @@
if (v.vertexlinks == null)
continue;
- if (v.weights != null && v.weights[j] == 0) // < 0.01 * v.totalweight) // == 0)
+ if (v.weights != null && v.weights[j] < 0.001 * v.totalweight) // == 0)
{
//testweight += v.weights[j-1];
continue;
@@ -2247,6 +2278,8 @@
transient int lastsoundtime;
+ transient boolean once = false;
+
void setMasterThis0(BoundaryRep other, double[][] toRoot, boolean smooth, boolean marked)
{
if (LA.isIdentity(toRoot))
@@ -2302,7 +2335,11 @@
if (v.totalweight == 0)
{
- System.err.println("v.totalweight == 0! --> " + this + " : " + other);
+ if (!once)
+ {
+ System.err.println("v.totalweight == 0! --> " + this + " : " + other);
+ once = true;
+ }
continue;
}
@@ -3098,6 +3135,7 @@
//
// transient VertexCompare[] vertexcompare = null;
+ // Check if v0 is close enough from any vertex of the given subobject of this.
boolean Contains(Vertex v0, int object)
{
int start = startvertices[object-1];
@@ -3696,6 +3734,111 @@
*/
}
+ void GenerateNormals2(boolean crease)
+ {
+ cVector tempVector = new cVector();
+
+// java.util.HashMap<cVector, cVector> tableBase = new java.util.HashMap<cVector, cVector>();
+//
+//
+// for (int i=0; i<this.VertexCount(); i++)
+// {
+// Vertex v = this.GetVertex(i);
+//
+// tempVector.set(v);
+//
+// cVector n = tableBase.get(tempVector.ToFloat());
+//
+// if (n != null)
+// {
+// continue;
+// }
+//
+// tableBase.put(new cVector(tempVector), new cVector(v.norm));
+// }
+
+ BoundaryRep tempSupport = this.support;
+
+ this.support = null;
+
+ BoundaryRep tempRep = (BoundaryRep)Grafreed.clone(this);
+
+ this.support = tempSupport;
+
+ //tempRep.Unstripify();
+
+ tempRep.GenerateNormals2(crease);
+
+ boolean keepnormal = Vertex.normalmode;
+ boolean epsequal = Grafreed.epsequal;
+
+ Vertex.normalmode = false;
+ Grafreed.epsequal = false; // A bit strange
+
+ // No need to have a match for vertex counts.
+
+ java.util.HashMap<cVector, cVector> table = new java.util.HashMap<cVector, cVector>();
+
+ for (int i=0; i<tempRep.VertexCount(); i++)
+ {
+ Vertex v = tempRep.GetVertex(i);
+
+ cVector n = table.get(tempVector.ToFloat());
+
+ if (v.norm.x == 1 && v.norm.y == 0 && v.norm.z == 0)
+ {
+ //continue;
+ }
+
+ tempVector.set(v);
+
+ //cVector nBase = tableBase.get(tempVector);
+
+ //if (v.norm.dot(nBase) < 0.9)
+ //{
+ // continue;
+ //}
+
+ if (n != null && n.x == 1 && n.y == 0 && n.z == 0)
+ {
+ //continue;
+ }
+
+ if (n != null)
+ {
+// if (n.dot(v.norm) < 0)
+// n.sub(v.norm);
+// else
+// n.add(v.norm);
+//
+// n.normalize();
+ continue;
+ }
+
+ table.put(new cVector(tempVector), new cVector(v.norm));
+ }
+
+ for (int i=0; i<this.VertexCount(); i++)
+ {
+ Vertex v = this.GetVertex(i);
+
+ tempVector.set(v);
+
+ cVector n = table.get(tempVector.ToFloat());
+
+ //if (n.dot(v.norm) < 0)
+ if (n == null)
+ continue;
+
+ LA.vecCopy(n, v.norm);
+
+ this.SetVertex(v, i);
+ }
+
+ Grafreed.epsequal = epsequal;
+ Vertex.normalmode = keepnormal;
+ }
+
void GenerateNormals(boolean crease)
{
boolean wastrim = trimmed;
@@ -3869,6 +4012,9 @@
{
triangles[i] = i;
}
+
+ Untrim();
+ MergeNormals();
}
}
@@ -3929,6 +4075,9 @@
triangles = new int[1];
triangles[0] = 3;
}
+
+ Untrim();
+ MergeNormals();
}
/*
@@ -3978,6 +4127,40 @@
}
Vertex.normalmode = false;
+ }
+
+ void MergeNormals()
+ {
+ boolean smooth = Grafreed.smoothmode;
+ boolean link = Grafreed.linkUV;
+ Grafreed.smoothmode = true;
+ Grafreed.linkUV = true;
+
+ System.out.println("#Vertex = " + VertexCount());
+ System.out.println("#Face = " + FaceCount());
+
+ java.util.HashSet<Vertex> table = new java.util.HashSet<Vertex>();
+
+ for (int i = 0; i < VertexCount(); i++)
+ {
+ Vertex v = GetVertex(i);
+
+ if (!table.contains(v))
+ {
+ table.add(v);
+ }
+ }
+
+ Grafreed.smoothmode = smooth;
+ Grafreed.linkUV = link;
+
+// for (int i = 0; i < VertexCount(); i++)
+// {
+// Vertex v = GetVertex(i);
+//
+// table.add(v);
+// }
+
}
static cVector temp1 = new cVector();
@@ -4752,7 +4935,7 @@
{
i3 = positions.length-3;
i2 = uvmap.length - 2;
- new Exception().printStackTrace();
+ //new Exception().printStackTrace();
}
v./*pos.*/x = positions[i3];
@@ -5476,17 +5659,27 @@
transient int nbbadfaces; // ?? = 1000000;
- int ChooseTriangle()
+ /*
+ */
+ int ChooseTriangle(boolean firstEquilateral)
{
int chosen = -1;
double minweight = 1E10;
+ int step = 8; // ?
+
+ if (firstEquilateral)
+ step = 1;
+
nbbadfaces = 0;
- for (int i=0; i<faces.size(); i+=8)
+ for (int i=0; i<faces.size(); i+=step)
// for (int i=faces.size(); (i-=8)>=0;)
{
Face face = (Face) faces.get(i);
+
+ if (face.used)
+ continue;
if (!Valid(face))
{
@@ -5496,6 +5689,15 @@
if (Boundary(face))
continue;
+
+// if (Boundary(face.p))
+// continue;
+//
+// if (Boundary(face.q))
+// continue;
+//
+// if (Boundary(face.r))
+// continue;
if (!ValidValence(face))
continue;
@@ -5508,22 +5710,55 @@
//?? 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)
+ if (firstEquilateral)
{
- minweight = weight;
+ if (OneFaceUsed(links.get(face.p)))
+ continue;
+
+ if (OneFaceUsed(links.get(face.q)))
+ continue;
+
+ if (OneFaceUsed(links.get(face.r)))
+ continue;
+
chosen = i;
- if (minweight == 0)
- break;
+ break;
+ }
+ else
+ {
+ 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;
+ }
}
}
return chosen;
+ }
+
+ private boolean OneFaceUsed(Vector<Face> faces)
+ {
+ if (faces.size() != 6)
+ return true;
+
+ for (int i=0; i<6; i+=1)
+ {
+ if (faces.get(i).used)
+ {
+ return true;
+ }
+ }
+
+ return false;
}
static boolean remove3valence = true;
@@ -5559,7 +5794,7 @@
}
else
{
- assert(links.size() == vertices.size());
+ // TODO Grafreed.Assert(links.size() == vertices.size());
links.setSize(vertices.size());
for (int i=vertices.size(); --i>=0;)
@@ -5567,6 +5802,7 @@
// linkstouched[i] = false;
if (links.get(i) == null) // ??
{
+ new Exception().printStackTrace();
links.set(i, new Vector(8));
// linkstouched[i] = true;
}
@@ -5577,6 +5813,8 @@
}
}
+ boolean once = false;
+
for (int i=faces.size(); --i>=0;)
{
Face face = (Face) faces.get(i);
@@ -5588,6 +5826,9 @@
//if (linkstouched[face.r])
links.get(face.r).add(face);
+ if (face.used)
+ once = true;
+
face.good = 1;
face.boundary = -1;
}
@@ -6953,6 +7194,10 @@
return (face.boundary = 1) == 1;
}
+ // June 2019
+ if (true)
+ return (face.boundary = 0) == 1;
+
// reverse triangle test
q1.set(p);
q2.set(q);
@@ -7402,7 +7647,7 @@
//InitWeights();
}
- int chosen = ChooseTriangle(); // Best is slow and not really better
+ int chosen = ChooseTriangle(true); // Best is slow and not really better
if (chosen == -1)
{
@@ -7416,7 +7661,7 @@
//remove3valence = false;
// InitWeights();
- chosen = ChooseTriangle();
+ chosen = ChooseTriangle(true);
}
}
@@ -7692,7 +7937,7 @@
// boolean lock;
- void SplitInTwo(boolean reduction34, boolean onlyone)
+ boolean SplitInTwo(boolean reduction34, boolean onlyone)
{
if (stripified)
{
@@ -7729,12 +7974,12 @@
{
System.err.println("EXCEPTION CAUGHT");
e.printStackTrace();
- return;
+ return false;
} catch (Error e)
{
System.err.println("ERROR CAUGHT");
e.printStackTrace();
- return;
+ return false;
}
System.out.println("# faces = " + faces.size());
@@ -7744,6 +7989,7 @@
{
Face face = (Face) faces.get(i);
+ face.used = false;
face.nbiterations = 1;
face.weight = -1;
face.boundary = -1;
@@ -7795,6 +8041,11 @@
nbbadfaces = faces.size();
//remove3valence = true;
+ int count = 2;
+
+ if (onlyone)
+ count = 1;
+
firstpass = true;
int n = faces.size();
@@ -7810,8 +8061,9 @@
System.out.print('.');
}
System.out.println();
+ boolean atleastone = false;
int i = 0;
- while (reduction34 || faces.size() > n/2)
+ while (true) // reduction34 || faces.size() > n/2)
{
if (i++%100 == 0)
{
@@ -7833,6 +8085,8 @@
{
if (!RemoveOneTriangle())
break;
+
+ atleastone = true;
}
// if (iterationcount == 0)
// break;
@@ -7843,8 +8097,8 @@
break;
}
firstpass = false;
- if (onlyone)
- break; // one triangle only
+// if (--count<0 && !reduction34)
+// break; // one triangle only
}
InitLinks(false); // for further display
@@ -7860,6 +8114,8 @@
Trim(true,false,false,false,false);
Globals.theRenderer.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR));
+
+ return atleastone;
}
void UpdateIndices(Face face, Face minface)
@@ -7872,18 +8128,21 @@
face.p = minface.p;
//if (leafweights)
face.good = 0; // false;
+ face.used = true;
}
if (face.q == minface.p || face.q == minface.q || face.q == minface.r)
{
face.q = minface.p;
//if (leafweights)
face.good = 0; // false;
+ face.used = true;
}
if (face.r == minface.p || face.r == minface.q || face.r == minface.r)
{
face.r = minface.p;
//if (leafweights)
face.good = 0; // false;
+ face.used = true;
}
if (face.p >/*=*/ minface.q && face.p < minface.r)
@@ -7943,50 +8202,50 @@
if (v == 2)
vert = minface.r;
// Face face = (Face) faces.get(i);
- Vector<Face> vertfaces = links.get(vert);
- for (int i=vertfaces.size(); --i>=0;)
- {
- Face face = (Face) vertfaces.get(i);
-
- // if (face.weight == 10000)
- // continue;
-
- if (face.p == minface.p || face.q == minface.p || face.r == minface.p ||
- face.p == minface.q || face.q == minface.q || face.r == minface.q ||
- face.p == minface.r || face.q == minface.r || face.r == minface.r)
+ Vector<Face> vertfaces = links.get(vert);
+ for (int i=vertfaces.size(); --i>=0;)
{
- if (!leafweights)
+ Face face = (Face) vertfaces.get(i);
+
+ // if (face.weight == 10000)
+ // continue;
+
+ if (face.p == minface.p || face.q == minface.p || face.r == minface.p ||
+ face.p == minface.q || face.q == minface.q || face.r == minface.q ||
+ face.p == minface.r || face.q == minface.r || face.r == minface.r)
{
-// if(minfaceweight <= 0)
-// assert(minfaceweight > 0);
-//
-// //FaceWeight(face);
-// if(face.weight < 0)
-// assert(face.weight >= 0);
-
- face.weight += minfaceweight;
-
-// if (face.weight >= 10000)
-// assert(face.weight < 10000);
+ if (!leafweights)
+ {
+ // if(minfaceweight <= 0)
+ // assert(minfaceweight > 0);
+ //
+ // //FaceWeight(face);
+ // if(face.weight < 0)
+ // assert(face.weight >= 0);
+
+ face.weight += minfaceweight;
+
+ // if (face.weight >= 10000)
+ // assert(face.weight < 10000);
+ }
+ else
+ face.weight = -1;
+
+ face.nbiterations += 1;
+ face.boundary = -1;
+
+ Vertex p = (Vertex)vertices.get(face.p);
+ Vertex q = (Vertex)vertices.get(face.q);
+ Vertex r = (Vertex)vertices.get(face.r);
+
+ p.boundary = -1;
+ q.boundary = -1;
+ r.boundary = -1;
}
else
- face.weight = -1;
-
- face.nbiterations += 1;
- face.boundary = -1;
-
- Vertex p = (Vertex)vertices.get(face.p);
- Vertex q = (Vertex)vertices.get(face.q);
- Vertex r = (Vertex)vertices.get(face.r);
-
- p.boundary = -1;
- q.boundary = -1;
- r.boundary = -1;
+ assert(false);
}
- else
- assert(false);
}
- }
// TouchVertex(minface.p);
// TouchVertex(minface.q);
@@ -8187,6 +8446,7 @@
for (int i=vertfaces.size(); --i>=0;)
{
Face face = (Face) vertfaces.get(i);
+ face.used = true;
face.good = 0; // false;
if (leafweights)
face.weight = -1;
@@ -8465,7 +8725,8 @@
int[] startvertices;
float[] averagepoints;
float[] extremepoints;
- float[] supportsizes; // distance of closest point
+ float[] supportminsize; // distance of closest point
+ float[] supportmaxsize; // distance of fartest point
transient Hashtable vertextable;
/*transient*/ private Vertex[] verticesCopy;
diff --git a/CameraPane.java b/CameraPane.java
index 9a919e6..7039da8 100644
--- a/CameraPane.java
+++ b/CameraPane.java
@@ -8022,7 +8022,7 @@
}
}
- /*boolean*/ public void BindTextures(cTexture tex, int resolution) // INTERFACE
+ /*boolean*/ public void BindTextures(cTexture tex, int resolution) throws Exception // INTERFACE
{
if (// DrawMode() != 0 || /*tex == null ||*/
ambientOcclusion ) // || !textureon)
@@ -8067,7 +8067,7 @@
return; // true;
}
- CacheTexture GetCacheTexture(String tex, boolean bump, int resolution)
+ CacheTexture GetCacheTexture(String tex, boolean bump, int resolution) throws Exception
{
CacheTexture/*com.sun.opengl.util.texture.Texture*/ texture = null;
@@ -8184,7 +8184,9 @@
texturedata = GetFileTexture(cachename, processbump, resolution);
- if (texturedata != null)
+ if (texturedata == null)
+ throw new Exception();
+
texture = new CacheTexture(com.sun.opengl.util.texture.TextureIO.newTexture(texturedata),resolution);
//texture = GetTexture(tex, bump);
}
@@ -8306,7 +8308,7 @@
return texture;
}
- com.sun.opengl.util.texture.Texture GetTexture(String tex, boolean bump, int resolution)
+ com.sun.opengl.util.texture.Texture GetTexture(String tex, boolean bump, int resolution) throws Exception
{
CacheTexture texture = GetCacheTexture(tex, bump, resolution);
@@ -8324,14 +8326,14 @@
return texture!=null?texture.texture:null;
}
- public com.sun.opengl.util.texture.TextureData GetTextureData(String tex, boolean bump, int resolution)
+ public com.sun.opengl.util.texture.TextureData GetTextureData(String tex, boolean bump, int resolution) throws Exception
{
CacheTexture texture = GetCacheTexture(tex, bump, resolution);
return texture!=null?texture.texturedata:null;
}
- boolean BindTexture(String tex, boolean bump, int resolution)
+ boolean BindTexture(String tex, boolean bump, int resolution) throws Exception
{
if (/*tex == null ||*/ ambientOcclusion ) // || !textureon)
{
@@ -10798,7 +10800,16 @@
// Bump noise
gl.glActiveTexture(GL.GL_TEXTURE6);
//gl.glBindTexture(GL.GL_TEXTURE_2D, bump_noise);
- BindTexture(NOISE_TEXTURE, false, 2);
+
+ try
+ {
+ BindTexture(NOISE_TEXTURE, false, 2);
+ }
+ catch (Exception e)
+ {
+ System.err.println("FAILED: " + NOISE_TEXTURE);
+ }
+
gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glEnable(GL.GL_TEXTURE_2D);
@@ -11354,7 +11365,14 @@
usedtextures.clear();
- BindTextures(DEFAULT_TEXTURES, 2);
+ try
+ {
+ BindTextures(DEFAULT_TEXTURES, 2);
+ }
+ catch (Exception e)
+ {
+ System.err.println("FAILED: " + DEFAULT_TEXTURES);
+ }
}
//System.out.println("--> " + stackdepth);
// GrafreeD.traceon();
@@ -11445,7 +11463,14 @@
if (checker != null && DrawMode() == DEFAULT)
{
//BindTexture(IMMORTAL_TEXTURE);
- BindTextures(checker.GetTextures(), checker.texres);
+ try
+ {
+ BindTextures(checker.GetTextures(), checker.texres);
+ }
+ catch (Exception e)
+ {
+ System.err.println("FAILED: " + checker.GetTextures());
+ }
// NEAREST
GetGL().glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); // GL.GL_LINEAR);
DrawChecker(gl);
@@ -16602,7 +16627,7 @@
//gl.glColorMask(false, false, false, false);
//render_scene_from_light_view(gl, drawable, 0, 0);
- if (Globals.RENDERSHADOW && Globals.lighttouched && !movingcamera) // && !parent.IsFreezed())
+ if (Globals.RENDERSHADOW && Globals.lighttouched && (!movingcamera || !Globals.FREEZEONMOVE)) // && !parent.IsFreezed())
{
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
diff --git a/Composite.java b/Composite.java
index bffa912..1d9e036 100644
--- a/Composite.java
+++ b/Composite.java
@@ -866,7 +866,14 @@
tex = GetTextures();
}
- display.BindTextures(tex, texres);
+ try
+ {
+ display.BindTextures(tex, texres);
+ }
+ catch (Exception e)
+ {
+ System.err.println("FAILED: " + this);
+ }
if (//true) // new NORMAND
touched || softtouched)
diff --git a/Face.java b/Face.java
index 6b289df..b6c962a 100644
--- a/Face.java
+++ b/Face.java
@@ -31,6 +31,8 @@
//cVector norm;
//short flags;
+ transient boolean used;
+
transient float weight; // face weight using normals if leaf or maximum of all recursive elements
transient int good; // vertex links broken
transient int boundary;
diff --git a/GenericJoint.java b/GenericJoint.java
index 1119276..4c7c0e0 100644
--- a/GenericJoint.java
+++ b/GenericJoint.java
@@ -557,7 +557,8 @@
bRep.startvertices = new int[numObjects];
bRep.averagepoints = new float[(bRep.startvertices.length-1) * 3];
bRep.extremepoints = new float[(bRep.startvertices.length-1) * 3];
- bRep.supportsizes = new float[(bRep.startvertices.length-1)];
+ bRep.supportminsize = new float[(bRep.startvertices.length-1)];
+ bRep.supportmaxsize = new float[(bRep.startvertices.length-1)];
buildrep = true;
initialmatrices = new ObjectArrayList<Transform>();
@@ -1225,11 +1226,12 @@
}
else
{
- if (bRep.averagepoints == null || bRep.extremepoints == null || bRep.supportsizes == null)
+ if (bRep.averagepoints == null || bRep.extremepoints == null || bRep.supportminsize == null || bRep.supportmaxsize == null)
{
bRep.averagepoints = new float[(bRep.startvertices.length-1) * 3];
bRep.extremepoints = new float[(bRep.startvertices.length-1) * 3];
- bRep.supportsizes = new float[(bRep.startvertices.length-1)];
+ bRep.supportminsize = new float[(bRep.startvertices.length-1)];
+ bRep.supportmaxsize = new float[(bRep.startvertices.length-1)];
}
float averagex = 0;
@@ -1299,7 +1301,8 @@
}
}
- bRep.supportsizes[currentobject-1] = (float)Math.sqrt(mindist2);
+ bRep.supportminsize[currentobject-1] = (float)Math.sqrt(mindist2);
+ bRep.supportmaxsize[currentobject-1] = (float)Math.sqrt(maxdist2);
}
// if (hull.numTriangles() > 0)
diff --git a/Globals.java b/Globals.java
index ca7d104..e0c7291 100644
--- a/Globals.java
+++ b/Globals.java
@@ -1,12 +1,13 @@
public class Globals
{
- public static boolean ADVANCED = false;
+ public static boolean ADVANCED = true; //false;
static iCameraPane theRenderer;
private static boolean LIVE = false;
public static boolean RENDERSHADOW = true;
+ public static boolean FREEZEONMOVE = false; // true;
static boolean CROWD = false;
static public int drawMode = iCameraPane.DEFAULT; // WARNING
diff --git a/Grafreed.java b/Grafreed.java
index 088a313..f05fa38 100644
--- a/Grafreed.java
+++ b/Grafreed.java
@@ -23,6 +23,8 @@
static float epsvertex2 = 0.001f;
static boolean linkUV = false; // not uniform at load time
+ static boolean smoothmode = false;
+
static Wav wav = new Wav("/Users/nbriere/0ut/wavs/monoformat"); // output");
static boolean hassound = false;
static boolean savesound = false;
diff --git a/Grid.java b/Grid.java
index f607c0d..1780c12 100644
--- a/Grid.java
+++ b/Grid.java
@@ -4,7 +4,7 @@
Grid()
{
- this(35, 34);
+ this(36, 36);
}
Grid(int u, int v)
diff --git a/GroupEditor.java b/GroupEditor.java
index a7eda89..e833b7c 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -210,10 +210,6 @@
oe.menuBar.add(menu = new Menu("Setting"));
if (Globals.ADVANCED)
{
- resetMeshItem = menu.add(new MenuItem("Reset All"));
- resetMeshItem.addActionListener(this);
- stepAllItem = menu.add(new MenuItem("Step All"));
- stepAllItem.addActionListener(this);
revertMeshItem = menu.add(new MenuItem("Revert Meshes"));
revertMeshItem.addActionListener(this);
resetreferencesItem = menu.add(new MenuItem("Reset Mesh References"));
@@ -372,6 +368,10 @@
oe.menuBar.add(menu = new Menu("Attributes"));
clearMaterialsItem = menu.add(new MenuItem("Clear Materials"));
clearMaterialsItem.addActionListener(this);
+ resetAllItem = menu.add(new MenuItem("Reset All"));
+ resetAllItem.addActionListener(this);
+ stepAllItem = menu.add(new MenuItem("Step All"));
+ stepAllItem.addActionListener(this);
menu.add("-");
liveleavesItem = menu.add(new MenuItem("Live Leaves"));
liveleavesItem.addActionListener(this);
@@ -493,7 +493,7 @@
//this.AddOptions(oe.toolbarPanel, oe.aConstraints);
oe.toolbarPanel.add(liveCB = new cCheckBox("Live", Globals.isLIVE())); //, oe.aConstraints);
- liveCB.setToolTipText("Enabled animation");
+ liveCB.setToolTipText("Enable animation");
liveCB.addItemListener(this);
oe.toolbarPanel.add(oneStepButton = new cButton("Step", !Grafreed.NIMBUSLAF)); //, oe.aConstraints);
@@ -2281,7 +2281,7 @@
{
RevertMeshes();
} else
- if (source == resetMeshItem)
+ if (source == resetAllItem)
{
ResetAll();
} else
@@ -3652,7 +3652,16 @@
String pigment = Object3D.GetPigment(tex);
//String bump = Object3D.GetBump(tex);
- com.sun.opengl.util.texture.TextureData texturedata = Globals.theRenderer.GetTextureData(pigment, false, node.texres);
+ com.sun.opengl.util.texture.TextureData texturedata = null;
+
+ try
+ {
+ texturedata = Globals.theRenderer.GetTextureData(pigment, false, node.texres);
+ }
+ catch (Exception e)
+ {
+ System.err.println("FAIL: " + node);
+ }
double s = v.s;
@@ -5131,7 +5140,7 @@
private MenuItem linkverticesItem;
private MenuItem relinkverticesItem;
private MenuItem setMasterItem;
- private MenuItem resetMeshItem;
+ private MenuItem resetAllItem;
private MenuItem stepAllItem;
private MenuItem revertMeshItem;
private MenuItem poseMeshItem;
diff --git a/LA.java b/LA.java
index 904647a..154bebd 100644
--- a/LA.java
+++ b/LA.java
@@ -88,6 +88,9 @@
static void vecCopy(cVector a, cVector b)
{
+ Grafreed.Assert (a != null);
+ assert (b != null);
+
b.x = a.x;
b.y = a.y;
b.z = a.z;
diff --git a/Merge.java b/Merge.java
index 24d1788..03408c4 100644
--- a/Merge.java
+++ b/Merge.java
@@ -134,6 +134,7 @@
transient cVector maxima = new cVector();
// ObjectArrayList<Transform> initialmatrices;
+ transient boolean rendered = false;
void DrawNode(iCameraPane display, Object3D /*Composite*/ root, boolean selected) // ??
{
@@ -153,6 +154,8 @@
{
e.printStackTrace();
}
+
+ rendered = true;
}
super.DrawNode(display, root, selected);
@@ -260,7 +263,8 @@
bRep.startvertices = new int[NumGeometries(GetObject()) + 1];
bRep.averagepoints = new float[(bRep.startvertices.length-1) * 3];
bRep.extremepoints = new float[(bRep.startvertices.length-1) * 3];
- bRep.supportsizes = new float[(bRep.startvertices.length-1)];
+ bRep.supportminsize = new float[(bRep.startvertices.length-1)];
+ bRep.supportmaxsize = new float[(bRep.startvertices.length-1)];
buildrep = true;
// initialmatrices = new ObjectArrayList<Transform>();
@@ -686,11 +690,12 @@
}
else
{
- if (bRep.averagepoints == null || bRep.extremepoints == null || bRep.supportsizes == null)
+ if (bRep.averagepoints == null || bRep.extremepoints == null || bRep.supportminsize == null || bRep.supportmaxsize == null)
{
bRep.averagepoints = new float[(bRep.startvertices.length-1) * 3];
bRep.extremepoints = new float[(bRep.startvertices.length-1) * 3];
- bRep.supportsizes = new float[(bRep.startvertices.length-1)];
+ bRep.supportminsize = new float[(bRep.startvertices.length-1)];
+ bRep.supportmaxsize = new float[(bRep.startvertices.length-1)];
}
float averagex = 0;
@@ -731,42 +736,47 @@
v.norm.normalize();
}
- int index3 = currentobject-1;
- index3 *= 3;
-
- bRep.averagepoints[index3] = averagex/count;
- bRep.averagepoints[index3+1] = averagey/count;
- bRep.averagepoints[index3+2] = averagez/count;
-
- double mindist2 = 1E10f;
- double maxdist2 = -1E10f;
-
- for (int i=bRep.startvertices[currentobject-1]; i<bRep.startvertices[currentobject]; i++)
+ if (!rendered)
{
- Vertex v = bRep.GetVertex(i);
-
- double x = v.x - bRep.averagepoints[index3];
- double y = v.y - bRep.averagepoints[index3+1];
- double z = v.z - bRep.averagepoints[index3+2];
-
- double dist2 = x*x + y*y + z*z;
-
- if (mindist2 > dist2)
- mindist2 = dist2;
- if (maxdist2 < dist2)
+ int index3 = currentobject-1;
+ index3 *= 3;
+
+ bRep.averagepoints[index3] = averagex/count;
+ bRep.averagepoints[index3+1] = averagey/count;
+ bRep.averagepoints[index3+2] = averagez/count;
+
+ double mindist2 = 1E10f;
+ double maxdist2 = -1E10f;
+
+ for (int i=bRep.startvertices[currentobject-1]; i<bRep.startvertices[currentobject]; i++)
{
- maxdist2 = dist2;
- bRep.extremepoints[index3] = (float)v.x;
- bRep.extremepoints[index3+1] = (float)v.y;
- bRep.extremepoints[index3+2] = (float)v.z;
+ Vertex v = bRep.GetVertex(i);
+
+ double x = v.x - bRep.averagepoints[index3];
+ double y = v.y - bRep.averagepoints[index3+1];
+ double z = v.z - bRep.averagepoints[index3+2];
+
+ double dist2 = x*x + y*y + z*z;
+
+ if (mindist2 > dist2)
+ mindist2 = dist2;
+
+ if (maxdist2 < dist2)
+ {
+ maxdist2 = dist2;
+ bRep.extremepoints[index3] = (float)v.x;
+ bRep.extremepoints[index3+1] = (float)v.y;
+ bRep.extremepoints[index3+2] = (float)v.z;
+ }
}
+
+ bRep.supportminsize[currentobject-1] = (float)Math.sqrt(mindist2);
+ bRep.supportmaxsize[currentobject-1] = (float)Math.sqrt(maxdist2);
+ // for (int i = 0; i < hull.numVertices(); i++)
+ // {
+ //
+ // }
}
-
- bRep.supportsizes[currentobject-1] = (float)Math.sqrt(mindist2);
-// for (int i = 0; i < hull.numVertices(); i++)
-// {
-//
-// }
}
// if (hull.numTriangles() > 0)
diff --git a/ObjEditor.java b/ObjEditor.java
index cfefeab..75f346b 100644
--- a/ObjEditor.java
+++ b/ObjEditor.java
@@ -784,6 +784,7 @@
// NumberSlider vDivsField;
// JCheckBox endcaps;
JCheckBox liveCB;
+ JCheckBox selectCB;
JCheckBox hideCB;
JCheckBox link2masterCB;
JCheckBox markCB;
@@ -986,9 +987,11 @@
liveCB = AddCheckBox(setupPanel, "Live", copy.live);
liveCB.setToolTipText("Animate object");
+ selectCB = AddCheckBox(setupPanel, "Select", !copy.dontselect);
+ selectCB.setToolTipText("Make object selectable");
+// Return();
hideCB = AddCheckBox(setupPanel, "Hide", copy.hide);
hideCB.setToolTipText("Hide object");
-// Return();
markCB = AddCheckBox(setupPanel, "Mark", copy.marked);
markCB.setToolTipText("Set the animation target transform");
@@ -1028,7 +1031,7 @@
oe.ctrlPanel.add(commandsPanel);
oe.ctrlPanel.Return();
- pushPanel = AddSlider(oe.ctrlPanel, "Push", -10, 10, 0, 1);
+ pushPanel = AddSlider(oe.ctrlPanel, "Push", -1, 1, copy.NORMALPUSH, 1.1); // To have the buttons
normalpushField = (cNumberSlider)pushPanel.getComponent(1);
//Return();
@@ -3007,6 +3010,10 @@
{
copy.live ^= true;
return;
+ } else if (event.getSource() == selectCB)
+ {
+ copy.dontselect ^= true;
+ return;
} else if (event.getSource() == hideCB)
{
copy.hide ^= true;
@@ -3588,7 +3595,7 @@
}
if (normalpushField != null)
- copy.NORMALPUSH = (float)normalpushField.getFloat()/1000;
+ copy.NORMALPUSH = (float)normalpushField.getFloat()/100;
}
void SnapObject()
diff --git a/Object3D.java b/Object3D.java
index 9c74924..56b46d5 100644
--- a/Object3D.java
+++ b/Object3D.java
@@ -300,6 +300,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
@@ -1834,12 +1835,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;)
@@ -3002,8 +3006,10 @@
v.fromParent = LA.newMatrix();
}
- LA.matConcat(v.toParent, toParent, v.toParent);
- LA.matConcat(fromParent, v.fromParent, v.fromParent);
+// 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);
@@ -3236,7 +3242,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();
@@ -4711,7 +4719,7 @@
cTreePath SelectLeaf(int indexcount, boolean deselect)
{
- if (hide)
+ if (hide || dontselect)
return null;
if (count <= 0)
@@ -4737,7 +4745,7 @@
cTreePath Select(int indexcount, boolean deselect)
{
- if (hide)
+ if (hide || dontselect)
return null;
if (count <= 0)
@@ -5407,7 +5415,7 @@
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.RENDERSHADOW || Globals.CROWD);
}
@@ -5424,7 +5432,7 @@
}
if (display.DrawMode() == iCameraPane.SELECTION &&
- hide)
+ (hide || dontselect))
return;
if (name != null && name.contains("sclera"))
@@ -5666,7 +5674,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)
{
@@ -5688,7 +5706,8 @@
}
}
- display.ReleaseTextures(tex);
+ if (!failed)
+ display.ReleaseTextures(tex);
display.PopMaterial(this, selected);
}
@@ -5817,6 +5836,9 @@
void drawSelf(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked)
{
+ if (display.DrawMode() == iCameraPane.SELECTION && dontselect)
+ return;
+
if (hide)
return;
// shadow optimisation
@@ -5942,6 +5964,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;
diff --git a/Vertex.java b/Vertex.java
index e8cdcec..9714028 100644
--- a/Vertex.java
+++ b/Vertex.java
@@ -112,7 +112,6 @@
{
//if (normalmode) // pos == null)
// return 0;
-
if (norm == null || !normalmode)
{
return /*pos.*/ super.hashCode();
@@ -129,12 +128,26 @@
Vertex vert = (Vertex) o;
//System.out.println("pos = " + pos + "; vert.pos = " + vert/*.pos*/);
+
+ double tolerance = 0.00001;
+
+ if (!Grafreed.epsequal)
+ tolerance = 0;
- return Math.abs(/*pos.*/x - vert./*pos.*/x) +
- Math.abs(/*pos.*/y - vert./*pos.*/y) +
- Math.abs(/*pos.*/z - vert./*pos.*/z) < 0.00001 && // GrafreeD.epsvertex2 && // WARNING: USE 0.0001 for serial issues
- (Grafreed.linkUV || Math.abs(s - vert.s) + Math.abs(t - vert.t) < 0.00001)
- ; // GrafreeD.epsvertex2;
+ boolean samepos = Math.abs(/*pos.*/x - vert./*pos.*/x) +
+ Math.abs(/*pos.*/y - vert./*pos.*/y) +
+ Math.abs(/*pos.*/z - vert./*pos.*/z) <= tolerance && // GrafreeD.epsvertex2 && // WARNING: USE 0.0001 for serial issues
+ (Grafreed.linkUV || Math.abs(s - vert.s) + Math.abs(t - vert.t) <= tolerance)
+ ; // GrafreeD.epsvertex2;
+
+ if (samepos && Grafreed.smoothmode)
+ {
+ norm.add(vert.norm);
+ norm.normalize();
+ vert.norm.set(norm);
+ }
+
+ return samepos;
}
/*
public boolean isSame(Object o)
diff --git a/cVector.java b/cVector.java
index 0517b70..bc50fbe 100644
--- a/cVector.java
+++ b/cVector.java
@@ -63,6 +63,15 @@
}
}
+ cVector ToFloat()
+ {
+ x = (float)x;
+ y = (float)y;
+ z = (float)z;
+
+ return this;
+ }
+
void set(cVector v)
{
x = v.x;
@@ -247,18 +256,21 @@
return "[" + x0 + ", " + y0 + ", " + z0 + "]";
}
- /*
public boolean equals(Object o)
{
//if (true) return false;
cVector vert = (cVector) o;
+ double tolerance = 0.00001;
+
+ if (!Grafreed.epsequal)
+ tolerance = 0;
+
return Math.abs(x - vert.x) +
Math.abs(y - vert.y) +
- Math.abs(z - vert.z) < 0.01;
+ Math.abs(z - vert.z) <= tolerance;
}
- */
public int hashCode()
{
diff --git a/iCameraPane.java b/iCameraPane.java
index 866cbe7..ccb0763 100644
--- a/iCameraPane.java
+++ b/iCameraPane.java
@@ -55,7 +55,7 @@
void DrawString(Object3D obj);
- void BindTextures(cTexture tex, int resolution);
+ void BindTextures(cTexture tex, int resolution) throws Exception;
void ReleaseTextures(cTexture tex);
void DrawFace(Object3D obj, Vertex pv, Vertex qv, Vertex rv, Face face);
@@ -82,7 +82,7 @@
void setCursor(java.awt.Cursor cursor);
- com.sun.opengl.util.texture.TextureData GetTextureData(String tex, boolean bump, int resolution);
+ com.sun.opengl.util.texture.TextureData GetTextureData(String tex, boolean bump, int resolution) throws Exception;
void repaint();
--
Gitblit v1.6.2