.. | .. |
---|
161 | 161 | || FaceCount() != other.FaceCount() |
---|
162 | 162 | || !(indices == null ^ other.indices != null)) // july 2014 |
---|
163 | 163 | { |
---|
| 164 | + // The meshes have different structures. |
---|
164 | 165 | //new Exception().printStackTrace(); |
---|
165 | 166 | trimmed = other.trimmed; |
---|
166 | 167 | stripified = other.stripified; |
---|
.. | .. |
---|
172 | 173 | bufV = other.bufV; |
---|
173 | 174 | bufF = other.bufF; |
---|
174 | 175 | |
---|
175 | | - positions = (float[]) GrafreeD.clone(other.positions); |
---|
176 | | - normals = (float[]) GrafreeD.clone(other.normals); |
---|
177 | | - colors = (float[]) GrafreeD.clone(other.colors); |
---|
178 | | - uvmap = (float[]) GrafreeD.clone(other.uvmap); |
---|
179 | | - triangles = (int[]) GrafreeD.clone(other.triangles); |
---|
| 176 | + positions = (float[]) Grafreed.clone(other.positions); |
---|
| 177 | + normals = (float[]) Grafreed.clone(other.normals); |
---|
| 178 | + colors = (float[]) Grafreed.clone(other.colors); |
---|
| 179 | + uvmap = (float[]) Grafreed.clone(other.uvmap); |
---|
| 180 | + triangles = (int[]) Grafreed.clone(other.triangles); |
---|
180 | 181 | |
---|
181 | | - indices = (int[]) GrafreeD.clone(other.indices); |
---|
| 182 | + indices = (int[]) Grafreed.clone(other.indices); |
---|
182 | 183 | |
---|
183 | | - vertices = (Vector<Vertex>) GrafreeD.clone(other.vertices); |
---|
184 | | - faces = (Vector<Face>) GrafreeD.clone(other.faces); |
---|
| 184 | + vertices = (Vector<Vertex>) Grafreed.clone(other.vertices); |
---|
| 185 | + faces = (Vector<Face>) Grafreed.clone(other.faces); |
---|
185 | 186 | } |
---|
186 | 187 | else |
---|
187 | 188 | { |
---|
.. | .. |
---|
239 | 240 | } |
---|
240 | 241 | } |
---|
241 | 242 | |
---|
242 | | - Support[] InitConnections(BoundaryRep other) |
---|
| 243 | + transient Support[] cachesupports = null; |
---|
| 244 | + |
---|
| 245 | + Support[] InitConnections() |
---|
243 | 246 | { |
---|
244 | | - int n = other.startvertices.length-1; |
---|
| 247 | + if (cachesupports != null) |
---|
| 248 | + { |
---|
| 249 | + return cachesupports; |
---|
| 250 | + } |
---|
| 251 | + |
---|
| 252 | + int n = this.startvertices.length-1; |
---|
245 | 253 | |
---|
246 | 254 | Support[] supports = new Support[n]; |
---|
247 | 255 | |
---|
.. | .. |
---|
253 | 261 | |
---|
254 | 262 | for (int object=1; object<=n; object++) |
---|
255 | 263 | { |
---|
256 | | - int start = other.startvertices[object-1]; |
---|
257 | | - int end = other.startvertices[object]; |
---|
| 264 | + int start = this.startvertices[object-1]; |
---|
| 265 | + int end = this.startvertices[object]; |
---|
258 | 266 | |
---|
259 | 267 | if (start == end) |
---|
260 | 268 | continue; // ?? |
---|
261 | 269 | |
---|
| 270 | + /** |
---|
| 271 | + Vertex v2 = vertextemp; |
---|
| 272 | + v2.x = averagepoints[object*3]; |
---|
| 273 | + v2.y = averagepoints[object*3+1]; |
---|
| 274 | + v2.z = averagepoints[object*3+2]; |
---|
| 275 | + |
---|
| 276 | + //v2.set(GetVertex(this.startvertices[subsupport])); |
---|
| 277 | + |
---|
| 278 | + // projected point |
---|
| 279 | + Vertex v3 = vertextemp2; |
---|
| 280 | + //GetVertex(this.startvertices[subsupport]); |
---|
| 281 | + v3.x = extremepoints[object*3]; |
---|
| 282 | + v3.y = extremepoints[object*3+1]; |
---|
| 283 | + v3.z = extremepoints[object*3+2]; |
---|
| 284 | + |
---|
| 285 | + vect3.set(v3); // "X" axis apex |
---|
| 286 | + vect3.sub(v2); // origin (center) |
---|
| 287 | + vect3.normalize(); |
---|
| 288 | + /**/ |
---|
| 289 | + |
---|
262 | 290 | int linkcount = 0; |
---|
263 | 291 | |
---|
264 | 292 | int objectinlist = -1; |
---|
| 293 | + |
---|
| 294 | + Support subsupport = supports[object-1]; |
---|
265 | 295 | |
---|
266 | 296 | for (int object2=1; object2<=n; object2++) |
---|
267 | 297 | { |
---|
268 | 298 | for (int i = start; i < end; i++) |
---|
269 | 299 | { |
---|
270 | | - Vertex v = other.GetVertex(i); |
---|
| 300 | + Vertex v = this.GetVertex(i); |
---|
271 | 301 | |
---|
272 | | - // |
---|
273 | | - if (other.Contains(v, object2)) |
---|
| 302 | + // Check if v is close enough from any vertex of the given subobject. |
---|
| 303 | + if (this.Contains(v, object2)) |
---|
274 | 304 | { |
---|
275 | | - if (linkcount == supports[object-1].links.length) |
---|
| 305 | + if (linkcount == subsupport.links.length) |
---|
276 | 306 | break; |
---|
277 | 307 | |
---|
278 | 308 | if (object2 == object) |
---|
279 | 309 | objectinlist = linkcount; |
---|
280 | 310 | |
---|
281 | | - supports[object-1].links[linkcount++] = object2; |
---|
| 311 | + subsupport.links[linkcount++] = object2; |
---|
282 | 312 | break; |
---|
283 | 313 | } |
---|
284 | 314 | } |
---|
285 | 315 | } |
---|
286 | 316 | |
---|
287 | | - supports[object-1].links[linkcount] = -1; |
---|
| 317 | + subsupport.links[linkcount] = -1; |
---|
288 | 318 | |
---|
289 | 319 | if (objectinlist == -1) |
---|
290 | 320 | assert(objectinlist != -1); |
---|
.. | .. |
---|
293 | 323 | // assert(linkcount > 1); |
---|
294 | 324 | |
---|
295 | 325 | // show main support as blue |
---|
296 | | - int first = supports[object-1].links[0]; |
---|
297 | | - supports[object-1].links[0] = supports[object-1].links[objectinlist]; |
---|
298 | | - supports[object-1].links[objectinlist] = first; |
---|
| 326 | + int first = subsupport.links[0]; |
---|
| 327 | + subsupport.links[0] = subsupport.links[objectinlist]; |
---|
| 328 | + subsupport.links[objectinlist] = first; |
---|
299 | 329 | } |
---|
300 | 330 | |
---|
301 | 331 | for (int loop = 0; --loop>=0;) |
---|
.. | .. |
---|
353 | 383 | supports = supports2; |
---|
354 | 384 | } |
---|
355 | 385 | |
---|
356 | | - return supports; |
---|
| 386 | + return cachesupports = supports; |
---|
357 | 387 | } |
---|
358 | 388 | |
---|
359 | 389 | double Distance2(Vertex v, Vertex v2, double dist2beat, double[][] toRoot, int k) |
---|
.. | .. |
---|
500 | 530 | static Vertex vertextemp = new Vertex(true); |
---|
501 | 531 | static Vertex vertextemp2 = new Vertex(true); |
---|
502 | 532 | |
---|
503 | | - static double SEUIL = 0.1f; // 0.1 for rag doll; 0.07; |
---|
| 533 | + static double SEUIL = 0.05f; // 0.1 for rag doll; 0.07; |
---|
504 | 534 | |
---|
505 | 535 | // Compute weight of point w/r to this |
---|
506 | 536 | float ComputeWeight(Vertex v, double[][] toRoot, int k) |
---|
.. | .. |
---|
598 | 628 | // ; |
---|
599 | 629 | // |
---|
600 | 630 | |
---|
601 | | - supportsize = supportsizes[subsupport]; |
---|
| 631 | + supportsize = supportminsize[subsupport]; |
---|
602 | 632 | |
---|
603 | 633 | double K = supportsize / distmax; |
---|
604 | 634 | |
---|
.. | .. |
---|
650 | 680 | // if (supportsize * fadefactor > 1) |
---|
651 | 681 | // return 1; |
---|
652 | 682 | |
---|
653 | | - return supportsize * fadefactor; |
---|
| 683 | + return //supportsize * |
---|
| 684 | + supportsize * fadefactor; |
---|
654 | 685 | } |
---|
655 | 686 | |
---|
656 | 687 | void RecomputeBasis(BoundaryRep other, double[][] toRoot, Vertex v) |
---|
.. | .. |
---|
952 | 983 | |
---|
953 | 984 | // sept 2017 SEUIL = 0.1; // aout 2013 |
---|
954 | 985 | |
---|
955 | | - supports = InitConnections(other); |
---|
| 986 | + supports = other.InitConnections(); |
---|
956 | 987 | |
---|
957 | 988 | other.supports = supports; // should be the other way around... |
---|
958 | 989 | |
---|
.. | .. |
---|
1518 | 1549 | InitFaceIndices(); |
---|
1519 | 1550 | } |
---|
1520 | 1551 | |
---|
1521 | | - BoundaryRep rep = (BoundaryRep) GrafreeD.clone(this); |
---|
| 1552 | + BoundaryRep rep = (BoundaryRep) Grafreed.clone(this); |
---|
1522 | 1553 | //float[] v = new float[100]; |
---|
1523 | 1554 | |
---|
1524 | 1555 | for (int loops=1; --loops>=0;) |
---|
.. | .. |
---|
1548 | 1579 | InitFaceIndices(); |
---|
1549 | 1580 | } |
---|
1550 | 1581 | |
---|
1551 | | - BoundaryRep rep = (BoundaryRep) GrafreeD.clone(this); |
---|
| 1582 | + BoundaryRep rep = (BoundaryRep) Grafreed.clone(this); |
---|
1552 | 1583 | //float[] v = new float[100]; |
---|
1553 | 1584 | |
---|
1554 | 1585 | for (int loops=10; --loops>=0;) |
---|
.. | .. |
---|
1895 | 1926 | return; |
---|
1896 | 1927 | } |
---|
1897 | 1928 | |
---|
1898 | | - // System.exit(0); |
---|
| 1929 | + // System.exit(0); |
---|
1899 | 1930 | |
---|
1900 | 1931 | cVector vect = new cVector(); |
---|
1901 | 1932 | cVector normal = new cVector(); |
---|
.. | .. |
---|
1966 | 1997 | if (v.vertexlinks == null) |
---|
1967 | 1998 | continue; |
---|
1968 | 1999 | |
---|
1969 | | - if (v.weights != null && v.weights[j] == 0) // < 0.01 * v.totalweight) // == 0) |
---|
| 2000 | + if (v.weights != null && v.weights[j] < 0.001 * v.totalweight) // == 0) |
---|
1970 | 2001 | { |
---|
1971 | 2002 | //testweight += v.weights[j-1]; |
---|
1972 | 2003 | continue; |
---|
.. | .. |
---|
2247 | 2278 | |
---|
2248 | 2279 | transient int lastsoundtime; |
---|
2249 | 2280 | |
---|
| 2281 | + transient boolean once = false; |
---|
| 2282 | + |
---|
2250 | 2283 | void setMasterThis0(BoundaryRep other, double[][] toRoot, boolean smooth, boolean marked) |
---|
2251 | 2284 | { |
---|
2252 | 2285 | if (LA.isIdentity(toRoot)) |
---|
.. | .. |
---|
2302 | 2335 | |
---|
2303 | 2336 | if (v.totalweight == 0) |
---|
2304 | 2337 | { |
---|
2305 | | - System.err.println("v.totalweight == 0! --> " + this + " : " + other); |
---|
| 2338 | + if (!once) |
---|
| 2339 | + { |
---|
| 2340 | + System.err.println("v.totalweight == 0! --> " + this + " : " + other); |
---|
| 2341 | + once = true; |
---|
| 2342 | + } |
---|
2306 | 2343 | continue; |
---|
2307 | 2344 | } |
---|
2308 | 2345 | |
---|
.. | .. |
---|
2670 | 2707 | |
---|
2671 | 2708 | if (Globals.framecount - lastsoundtime > 30) // 0.25 secs |
---|
2672 | 2709 | { |
---|
2673 | | - GrafreeD.wav.play((Math.random()+0.5)/Math.max(tmp.length2(),0.2)); //, 1); |
---|
| 2710 | + Grafreed.wav.play((Math.random()+0.5)/Math.max(tmp.length2(),0.2)); //, 1); |
---|
2674 | 2711 | |
---|
2675 | 2712 | lastsoundtime = Globals.framecount; |
---|
2676 | 2713 | } |
---|
.. | .. |
---|
3098 | 3135 | // |
---|
3099 | 3136 | // transient VertexCompare[] vertexcompare = null; |
---|
3100 | 3137 | |
---|
| 3138 | + // Check if v0 is close enough from any vertex of the given subobject of this. |
---|
3101 | 3139 | boolean Contains(Vertex v0, int object) |
---|
3102 | 3140 | { |
---|
3103 | 3141 | int start = startvertices[object-1]; |
---|
.. | .. |
---|
3247 | 3285 | max = ay; |
---|
3248 | 3286 | } |
---|
3249 | 3287 | |
---|
| 3288 | + if (max == 0) |
---|
| 3289 | + { |
---|
| 3290 | + uvmap[i2] = 0.5f; |
---|
| 3291 | + uvmap[i2+1] = 0.5f; |
---|
| 3292 | + continue; |
---|
| 3293 | + } |
---|
| 3294 | + |
---|
3250 | 3295 | x /= max; |
---|
3251 | 3296 | y /= max; |
---|
3252 | 3297 | |
---|
3253 | 3298 | double angle = Math.acos(Math.abs(z*2)); |
---|
3254 | 3299 | |
---|
3255 | 3300 | double k = angle / Math.PI * 2; |
---|
| 3301 | + |
---|
| 3302 | + assert(k >= 0); |
---|
3256 | 3303 | |
---|
3257 | 3304 | // k == 0 => uv = 0 (center) |
---|
3258 | 3305 | // k == 1 => uv = -1,1 (border) |
---|
.. | .. |
---|
3268 | 3315 | t = Math.pow(t, 3); |
---|
3269 | 3316 | |
---|
3270 | 3317 | // Interpolate between k/length2 (center) and k (border) |
---|
3271 | | - k = k / length2 * (1 - t) + k * t; |
---|
| 3318 | + if (length2 > 0) |
---|
| 3319 | + k *= (1 - t) / length2 + t; |
---|
3272 | 3320 | |
---|
3273 | 3321 | double u = k*x; |
---|
3274 | 3322 | double v = k*y; |
---|
.. | .. |
---|
3393 | 3441 | k /= x*x + y*y; |
---|
3394 | 3442 | } |
---|
3395 | 3443 | else |
---|
3396 | | - GrafreeD.Assert(z == 1); |
---|
| 3444 | + Grafreed.Assert(z == 1); |
---|
3397 | 3445 | |
---|
3398 | 3446 | if (k < 0) |
---|
3399 | 3447 | k = 0; |
---|
.. | .. |
---|
3686 | 3734 | */ |
---|
3687 | 3735 | } |
---|
3688 | 3736 | |
---|
| 3737 | + void GenerateNormals2(boolean crease) |
---|
| 3738 | + { |
---|
| 3739 | + cVector tempVector = new cVector(); |
---|
| 3740 | + |
---|
| 3741 | +// java.util.HashMap<cVector, cVector> tableBase = new java.util.HashMap<cVector, cVector>(); |
---|
| 3742 | +// |
---|
| 3743 | +// |
---|
| 3744 | +// for (int i=0; i<this.VertexCount(); i++) |
---|
| 3745 | +// { |
---|
| 3746 | +// Vertex v = this.GetVertex(i); |
---|
| 3747 | +// |
---|
| 3748 | +// tempVector.set(v); |
---|
| 3749 | +// |
---|
| 3750 | +// cVector n = tableBase.get(tempVector.ToFloat()); |
---|
| 3751 | +// |
---|
| 3752 | +// if (n != null) |
---|
| 3753 | +// { |
---|
| 3754 | +// continue; |
---|
| 3755 | +// } |
---|
| 3756 | +// |
---|
| 3757 | +// tableBase.put(new cVector(tempVector), new cVector(v.norm)); |
---|
| 3758 | +// } |
---|
| 3759 | + |
---|
| 3760 | + BoundaryRep tempSupport = this.support; |
---|
| 3761 | + |
---|
| 3762 | + this.support = null; |
---|
| 3763 | + |
---|
| 3764 | + BoundaryRep tempRep = (BoundaryRep)Grafreed.clone(this); |
---|
| 3765 | + |
---|
| 3766 | + this.support = tempSupport; |
---|
| 3767 | + |
---|
| 3768 | + //tempRep.Unstripify(); |
---|
| 3769 | + |
---|
| 3770 | + tempRep.GenerateNormals2(crease); |
---|
| 3771 | + |
---|
| 3772 | + boolean keepnormal = Vertex.normalmode; |
---|
| 3773 | + boolean epsequal = Grafreed.epsequal; |
---|
| 3774 | + |
---|
| 3775 | + Vertex.normalmode = false; |
---|
| 3776 | + Grafreed.epsequal = false; // A bit strange |
---|
| 3777 | + |
---|
| 3778 | + // No need to have a match for vertex counts. |
---|
| 3779 | + |
---|
| 3780 | + java.util.HashMap<cVector, cVector> table = new java.util.HashMap<cVector, cVector>(); |
---|
| 3781 | + |
---|
| 3782 | + for (int i=0; i<tempRep.VertexCount(); i++) |
---|
| 3783 | + { |
---|
| 3784 | + Vertex v = tempRep.GetVertex(i); |
---|
| 3785 | + |
---|
| 3786 | + cVector n = table.get(tempVector.ToFloat()); |
---|
| 3787 | + |
---|
| 3788 | + if (v.norm.x == 1 && v.norm.y == 0 && v.norm.z == 0) |
---|
| 3789 | + { |
---|
| 3790 | + //continue; |
---|
| 3791 | + } |
---|
| 3792 | + |
---|
| 3793 | + tempVector.set(v); |
---|
| 3794 | + |
---|
| 3795 | + //cVector nBase = tableBase.get(tempVector); |
---|
| 3796 | + |
---|
| 3797 | + //if (v.norm.dot(nBase) < 0.9) |
---|
| 3798 | + //{ |
---|
| 3799 | + // continue; |
---|
| 3800 | + //} |
---|
| 3801 | + |
---|
| 3802 | + if (n != null && n.x == 1 && n.y == 0 && n.z == 0) |
---|
| 3803 | + { |
---|
| 3804 | + //continue; |
---|
| 3805 | + } |
---|
| 3806 | + |
---|
| 3807 | + if (n != null) |
---|
| 3808 | + { |
---|
| 3809 | +// if (n.dot(v.norm) < 0) |
---|
| 3810 | +// n.sub(v.norm); |
---|
| 3811 | +// else |
---|
| 3812 | +// n.add(v.norm); |
---|
| 3813 | +// |
---|
| 3814 | +// n.normalize(); |
---|
| 3815 | + continue; |
---|
| 3816 | + } |
---|
| 3817 | + |
---|
| 3818 | + table.put(new cVector(tempVector), new cVector(v.norm)); |
---|
| 3819 | + } |
---|
| 3820 | + |
---|
| 3821 | + for (int i=0; i<this.VertexCount(); i++) |
---|
| 3822 | + { |
---|
| 3823 | + Vertex v = this.GetVertex(i); |
---|
| 3824 | + |
---|
| 3825 | + tempVector.set(v); |
---|
| 3826 | + |
---|
| 3827 | + cVector n = table.get(tempVector.ToFloat()); |
---|
| 3828 | + |
---|
| 3829 | + //if (n.dot(v.norm) < 0) |
---|
| 3830 | + if (n == null) |
---|
| 3831 | + continue; |
---|
| 3832 | + |
---|
| 3833 | + LA.vecCopy(n, v.norm); |
---|
| 3834 | + |
---|
| 3835 | + this.SetVertex(v, i); |
---|
| 3836 | + } |
---|
| 3837 | + |
---|
| 3838 | + Grafreed.epsequal = epsequal; |
---|
| 3839 | + Vertex.normalmode = keepnormal; |
---|
| 3840 | + } |
---|
| 3841 | + |
---|
3689 | 3842 | void GenerateNormals(boolean crease) |
---|
3690 | 3843 | { |
---|
3691 | 3844 | boolean wastrim = trimmed; |
---|
.. | .. |
---|
3859 | 4012 | { |
---|
3860 | 4013 | triangles[i] = i; |
---|
3861 | 4014 | } |
---|
| 4015 | + |
---|
| 4016 | + Untrim(); |
---|
| 4017 | + MergeNormals(); |
---|
3862 | 4018 | } |
---|
3863 | 4019 | } |
---|
3864 | 4020 | |
---|
.. | .. |
---|
3892 | 4048 | tsa.getNormals(0, normals); |
---|
3893 | 4049 | tsa.getTextureCoordinates(0, 0, uvmap); |
---|
3894 | 4050 | // tsa.getColors(0, colors); |
---|
| 4051 | + |
---|
| 4052 | + for (int i=colors.length; --i>=0;) |
---|
| 4053 | + { |
---|
| 4054 | + colors[i] = 1; |
---|
| 4055 | + } |
---|
3895 | 4056 | |
---|
3896 | 4057 | int stripcount = tsa.getNumStrips(); |
---|
3897 | 4058 | triangles = new int[stripcount]; |
---|
.. | .. |
---|
3914 | 4075 | triangles = new int[1]; |
---|
3915 | 4076 | triangles[0] = 3; |
---|
3916 | 4077 | } |
---|
| 4078 | + |
---|
| 4079 | + Untrim(); |
---|
| 4080 | + MergeNormals(); |
---|
3917 | 4081 | } |
---|
3918 | 4082 | |
---|
3919 | 4083 | /* |
---|
.. | .. |
---|
3963 | 4127 | } |
---|
3964 | 4128 | |
---|
3965 | 4129 | Vertex.normalmode = false; |
---|
| 4130 | + } |
---|
| 4131 | + |
---|
| 4132 | + void MergeNormals() |
---|
| 4133 | + { |
---|
| 4134 | + boolean smooth = Grafreed.smoothmode; |
---|
| 4135 | + boolean link = Grafreed.linkUV; |
---|
| 4136 | + Grafreed.smoothmode = true; |
---|
| 4137 | + Grafreed.linkUV = true; |
---|
| 4138 | + |
---|
| 4139 | + System.out.println("#Vertex = " + VertexCount()); |
---|
| 4140 | + System.out.println("#Face = " + FaceCount()); |
---|
| 4141 | + |
---|
| 4142 | + java.util.HashSet<Vertex> table = new java.util.HashSet<Vertex>(); |
---|
| 4143 | + |
---|
| 4144 | + for (int i = 0; i < VertexCount(); i++) |
---|
| 4145 | + { |
---|
| 4146 | + Vertex v = GetVertex(i); |
---|
| 4147 | + |
---|
| 4148 | + if (!table.contains(v)) |
---|
| 4149 | + { |
---|
| 4150 | + table.add(v); |
---|
| 4151 | + } |
---|
| 4152 | + } |
---|
| 4153 | + |
---|
| 4154 | + Grafreed.smoothmode = smooth; |
---|
| 4155 | + Grafreed.linkUV = link; |
---|
| 4156 | + |
---|
| 4157 | +// for (int i = 0; i < VertexCount(); i++) |
---|
| 4158 | +// { |
---|
| 4159 | +// Vertex v = GetVertex(i); |
---|
| 4160 | +// |
---|
| 4161 | +// table.add(v); |
---|
| 4162 | +// } |
---|
| 4163 | + |
---|
3966 | 4164 | } |
---|
3967 | 4165 | |
---|
3968 | 4166 | static cVector temp1 = new cVector(); |
---|
.. | .. |
---|
4737 | 4935 | { |
---|
4738 | 4936 | i3 = positions.length-3; |
---|
4739 | 4937 | i2 = uvmap.length - 2; |
---|
4740 | | - new Exception().printStackTrace(); |
---|
| 4938 | + //new Exception().printStackTrace(); |
---|
4741 | 4939 | } |
---|
4742 | 4940 | |
---|
4743 | 4941 | v./*pos.*/x = positions[i3]; |
---|
.. | .. |
---|
5461 | 5659 | |
---|
5462 | 5660 | transient int nbbadfaces; // ?? = 1000000; |
---|
5463 | 5661 | |
---|
5464 | | - int ChooseTriangle() |
---|
| 5662 | + /* |
---|
| 5663 | + */ |
---|
| 5664 | + int ChooseTriangle(boolean firstEquilateral) |
---|
5465 | 5665 | { |
---|
5466 | 5666 | int chosen = -1; |
---|
5467 | 5667 | |
---|
5468 | 5668 | double minweight = 1E10; |
---|
5469 | 5669 | |
---|
| 5670 | + int step = 8; // ? |
---|
| 5671 | + |
---|
| 5672 | + if (firstEquilateral) |
---|
| 5673 | + step = 1; |
---|
| 5674 | + |
---|
5470 | 5675 | nbbadfaces = 0; |
---|
5471 | | - for (int i=0; i<faces.size(); i+=8) |
---|
| 5676 | + for (int i=0; i<faces.size(); i+=step) |
---|
5472 | 5677 | // for (int i=faces.size(); (i-=8)>=0;) |
---|
5473 | 5678 | { |
---|
5474 | 5679 | Face face = (Face) faces.get(i); |
---|
| 5680 | + |
---|
| 5681 | + if (face.used) |
---|
| 5682 | + continue; |
---|
5475 | 5683 | |
---|
5476 | 5684 | if (!Valid(face)) |
---|
5477 | 5685 | { |
---|
.. | .. |
---|
5481 | 5689 | |
---|
5482 | 5690 | if (Boundary(face)) |
---|
5483 | 5691 | continue; |
---|
| 5692 | + |
---|
| 5693 | +// if (Boundary(face.p)) |
---|
| 5694 | +// continue; |
---|
| 5695 | +// |
---|
| 5696 | +// if (Boundary(face.q)) |
---|
| 5697 | +// continue; |
---|
| 5698 | +// |
---|
| 5699 | +// if (Boundary(face.r)) |
---|
| 5700 | +// continue; |
---|
5484 | 5701 | |
---|
5485 | 5702 | if (!ValidValence(face)) |
---|
5486 | 5703 | continue; |
---|
.. | .. |
---|
5493 | 5710 | //?? if (face.weight < 0) |
---|
5494 | 5711 | // continue; |
---|
5495 | 5712 | |
---|
5496 | | - double K = 1; // 0.01; // .25; |
---|
5497 | | - |
---|
5498 | | - double factor = (1-K)*face.nbiterations + K; //*face.weight; |
---|
5499 | | - |
---|
5500 | | - double weight = FaceWeight(face); // *Math.pow(PerimeterMax(face),0.25)*factor; |
---|
5501 | | - |
---|
5502 | | - if (minweight > weight) |
---|
| 5713 | + if (firstEquilateral) |
---|
5503 | 5714 | { |
---|
5504 | | - minweight = weight; |
---|
| 5715 | + if (OneFaceUsed(links.get(face.p))) |
---|
| 5716 | + continue; |
---|
| 5717 | + |
---|
| 5718 | + if (OneFaceUsed(links.get(face.q))) |
---|
| 5719 | + continue; |
---|
| 5720 | + |
---|
| 5721 | + if (OneFaceUsed(links.get(face.r))) |
---|
| 5722 | + continue; |
---|
| 5723 | + |
---|
5505 | 5724 | chosen = i; |
---|
5506 | | - if (minweight == 0) |
---|
5507 | | - break; |
---|
| 5725 | + break; |
---|
| 5726 | + } |
---|
| 5727 | + else |
---|
| 5728 | + { |
---|
| 5729 | + double K = 1; // 0.01; // .25; |
---|
| 5730 | + |
---|
| 5731 | + double factor = (1-K)*face.nbiterations + K; //*face.weight; |
---|
| 5732 | + |
---|
| 5733 | + double weight = FaceWeight(face); // *Math.pow(PerimeterMax(face),0.25)*factor; |
---|
| 5734 | + |
---|
| 5735 | + if (minweight > weight) |
---|
| 5736 | + { |
---|
| 5737 | + minweight = weight; |
---|
| 5738 | + chosen = i; |
---|
| 5739 | + if (minweight == 0) |
---|
| 5740 | + break; |
---|
| 5741 | + } |
---|
5508 | 5742 | } |
---|
5509 | 5743 | } |
---|
5510 | 5744 | |
---|
5511 | 5745 | return chosen; |
---|
| 5746 | + } |
---|
| 5747 | + |
---|
| 5748 | + private boolean OneFaceUsed(Vector<Face> faces) |
---|
| 5749 | + { |
---|
| 5750 | + if (faces.size() != 6) |
---|
| 5751 | + return true; |
---|
| 5752 | + |
---|
| 5753 | + for (int i=0; i<6; i+=1) |
---|
| 5754 | + { |
---|
| 5755 | + if (faces.get(i).used) |
---|
| 5756 | + { |
---|
| 5757 | + return true; |
---|
| 5758 | + } |
---|
| 5759 | + } |
---|
| 5760 | + |
---|
| 5761 | + return false; |
---|
5512 | 5762 | } |
---|
5513 | 5763 | |
---|
5514 | 5764 | static boolean remove3valence = true; |
---|
.. | .. |
---|
5544 | 5794 | } |
---|
5545 | 5795 | else |
---|
5546 | 5796 | { |
---|
5547 | | - assert(links.size() == vertices.size()); |
---|
| 5797 | + // TODO Grafreed.Assert(links.size() == vertices.size()); |
---|
5548 | 5798 | |
---|
5549 | 5799 | links.setSize(vertices.size()); |
---|
5550 | 5800 | for (int i=vertices.size(); --i>=0;) |
---|
.. | .. |
---|
5552 | 5802 | // linkstouched[i] = false; |
---|
5553 | 5803 | if (links.get(i) == null) // ?? |
---|
5554 | 5804 | { |
---|
| 5805 | + new Exception().printStackTrace(); |
---|
5555 | 5806 | links.set(i, new Vector(8)); |
---|
5556 | 5807 | // linkstouched[i] = true; |
---|
5557 | 5808 | } |
---|
.. | .. |
---|
5562 | 5813 | } |
---|
5563 | 5814 | } |
---|
5564 | 5815 | |
---|
| 5816 | + boolean once = false; |
---|
| 5817 | + |
---|
5565 | 5818 | for (int i=faces.size(); --i>=0;) |
---|
5566 | 5819 | { |
---|
5567 | 5820 | Face face = (Face) faces.get(i); |
---|
.. | .. |
---|
5573 | 5826 | //if (linkstouched[face.r]) |
---|
5574 | 5827 | links.get(face.r).add(face); |
---|
5575 | 5828 | |
---|
| 5829 | + if (face.used) |
---|
| 5830 | + once = true; |
---|
| 5831 | + |
---|
5576 | 5832 | face.good = 1; |
---|
5577 | 5833 | face.boundary = -1; |
---|
5578 | 5834 | } |
---|
.. | .. |
---|
6344 | 6600 | |
---|
6345 | 6601 | void InitWeights() |
---|
6346 | 6602 | { |
---|
| 6603 | + new Exception().printStackTrace(); |
---|
6347 | 6604 | System.exit(0); |
---|
6348 | 6605 | int n = 0; |
---|
6349 | 6606 | int b = 0; |
---|
.. | .. |
---|
6937 | 7194 | return (face.boundary = 1) == 1; |
---|
6938 | 7195 | } |
---|
6939 | 7196 | |
---|
| 7197 | + // June 2019 |
---|
| 7198 | + if (true) |
---|
| 7199 | + return (face.boundary = 0) == 1; |
---|
| 7200 | + |
---|
6940 | 7201 | // reverse triangle test |
---|
6941 | 7202 | q1.set(p); |
---|
6942 | 7203 | q2.set(q); |
---|
.. | .. |
---|
7386 | 7647 | //InitWeights(); |
---|
7387 | 7648 | } |
---|
7388 | 7649 | |
---|
7389 | | - int chosen = ChooseTriangle(); // Best is slow and not really better |
---|
| 7650 | + int chosen = ChooseTriangle(true); // Best is slow and not really better |
---|
7390 | 7651 | |
---|
7391 | 7652 | if (chosen == -1) |
---|
7392 | 7653 | { |
---|
.. | .. |
---|
7400 | 7661 | //remove3valence = false; |
---|
7401 | 7662 | // InitWeights(); |
---|
7402 | 7663 | |
---|
7403 | | - chosen = ChooseTriangle(); |
---|
| 7664 | + chosen = ChooseTriangle(true); |
---|
7404 | 7665 | } |
---|
7405 | 7666 | } |
---|
7406 | 7667 | |
---|
.. | .. |
---|
7676 | 7937 | |
---|
7677 | 7938 | // boolean lock; |
---|
7678 | 7939 | |
---|
7679 | | - void SplitInTwo(boolean reduction34, boolean onlyone) |
---|
| 7940 | + boolean SplitInTwo(boolean reduction34, boolean onlyone) |
---|
7680 | 7941 | { |
---|
7681 | 7942 | if (stripified) |
---|
7682 | 7943 | { |
---|
.. | .. |
---|
7713 | 7974 | { |
---|
7714 | 7975 | System.err.println("EXCEPTION CAUGHT"); |
---|
7715 | 7976 | e.printStackTrace(); |
---|
7716 | | - return; |
---|
| 7977 | + return false; |
---|
7717 | 7978 | } catch (Error e) |
---|
7718 | 7979 | { |
---|
7719 | 7980 | System.err.println("ERROR CAUGHT"); |
---|
7720 | 7981 | e.printStackTrace(); |
---|
7721 | | - return; |
---|
| 7982 | + return false; |
---|
7722 | 7983 | } |
---|
7723 | 7984 | |
---|
7724 | 7985 | System.out.println("# faces = " + faces.size()); |
---|
.. | .. |
---|
7728 | 7989 | { |
---|
7729 | 7990 | Face face = (Face) faces.get(i); |
---|
7730 | 7991 | |
---|
| 7992 | + face.used = false; |
---|
7731 | 7993 | face.nbiterations = 1; |
---|
7732 | 7994 | face.weight = -1; |
---|
7733 | 7995 | face.boundary = -1; |
---|
.. | .. |
---|
7779 | 8041 | nbbadfaces = faces.size(); |
---|
7780 | 8042 | //remove3valence = true; |
---|
7781 | 8043 | |
---|
| 8044 | + int count = 2; |
---|
| 8045 | + |
---|
| 8046 | + if (onlyone) |
---|
| 8047 | + count = 1; |
---|
| 8048 | + |
---|
7782 | 8049 | firstpass = true; |
---|
7783 | 8050 | |
---|
7784 | 8051 | int n = faces.size(); |
---|
.. | .. |
---|
7794 | 8061 | System.out.print('.'); |
---|
7795 | 8062 | } |
---|
7796 | 8063 | System.out.println(); |
---|
| 8064 | + boolean atleastone = false; |
---|
7797 | 8065 | int i = 0; |
---|
7798 | | - while (reduction34 || faces.size() > n/2) |
---|
| 8066 | + while (true) // reduction34 || faces.size() > n/2) |
---|
7799 | 8067 | { |
---|
7800 | 8068 | if (i++%100 == 0) |
---|
7801 | 8069 | { |
---|
.. | .. |
---|
7817 | 8085 | { |
---|
7818 | 8086 | if (!RemoveOneTriangle()) |
---|
7819 | 8087 | break; |
---|
| 8088 | + |
---|
| 8089 | + atleastone = true; |
---|
7820 | 8090 | } |
---|
7821 | 8091 | // if (iterationcount == 0) |
---|
7822 | 8092 | // break; |
---|
.. | .. |
---|
7827 | 8097 | break; |
---|
7828 | 8098 | } |
---|
7829 | 8099 | firstpass = false; |
---|
7830 | | - if (onlyone) |
---|
7831 | | - break; // one triangle only |
---|
| 8100 | +// if (--count<0 && !reduction34) |
---|
| 8101 | +// break; // one triangle only |
---|
7832 | 8102 | } |
---|
7833 | 8103 | |
---|
7834 | 8104 | InitLinks(false); // for further display |
---|
.. | .. |
---|
7844 | 8114 | Trim(true,false,false,false,false); |
---|
7845 | 8115 | |
---|
7846 | 8116 | Globals.theRenderer.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR)); |
---|
| 8117 | + |
---|
| 8118 | + return atleastone; |
---|
7847 | 8119 | } |
---|
7848 | 8120 | |
---|
7849 | 8121 | void UpdateIndices(Face face, Face minface) |
---|
.. | .. |
---|
7856 | 8128 | face.p = minface.p; |
---|
7857 | 8129 | //if (leafweights) |
---|
7858 | 8130 | face.good = 0; // false; |
---|
| 8131 | + face.used = true; |
---|
7859 | 8132 | } |
---|
7860 | 8133 | if (face.q == minface.p || face.q == minface.q || face.q == minface.r) |
---|
7861 | 8134 | { |
---|
7862 | 8135 | face.q = minface.p; |
---|
7863 | 8136 | //if (leafweights) |
---|
7864 | 8137 | face.good = 0; // false; |
---|
| 8138 | + face.used = true; |
---|
7865 | 8139 | } |
---|
7866 | 8140 | if (face.r == minface.p || face.r == minface.q || face.r == minface.r) |
---|
7867 | 8141 | { |
---|
7868 | 8142 | face.r = minface.p; |
---|
7869 | 8143 | //if (leafweights) |
---|
7870 | 8144 | face.good = 0; // false; |
---|
| 8145 | + face.used = true; |
---|
7871 | 8146 | } |
---|
7872 | 8147 | |
---|
7873 | 8148 | if (face.p >/*=*/ minface.q && face.p < minface.r) |
---|
.. | .. |
---|
7927 | 8202 | if (v == 2) |
---|
7928 | 8203 | vert = minface.r; |
---|
7929 | 8204 | // Face face = (Face) faces.get(i); |
---|
7930 | | - Vector<Face> vertfaces = links.get(vert); |
---|
7931 | | - for (int i=vertfaces.size(); --i>=0;) |
---|
7932 | | - { |
---|
7933 | | - Face face = (Face) vertfaces.get(i); |
---|
7934 | | - |
---|
7935 | | - // if (face.weight == 10000) |
---|
7936 | | - // continue; |
---|
7937 | | - |
---|
7938 | | - if (face.p == minface.p || face.q == minface.p || face.r == minface.p || |
---|
7939 | | - face.p == minface.q || face.q == minface.q || face.r == minface.q || |
---|
7940 | | - face.p == minface.r || face.q == minface.r || face.r == minface.r) |
---|
| 8205 | + Vector<Face> vertfaces = links.get(vert); |
---|
| 8206 | + for (int i=vertfaces.size(); --i>=0;) |
---|
7941 | 8207 | { |
---|
7942 | | - if (!leafweights) |
---|
| 8208 | + Face face = (Face) vertfaces.get(i); |
---|
| 8209 | + |
---|
| 8210 | + // if (face.weight == 10000) |
---|
| 8211 | + // continue; |
---|
| 8212 | + |
---|
| 8213 | + if (face.p == minface.p || face.q == minface.p || face.r == minface.p || |
---|
| 8214 | + face.p == minface.q || face.q == minface.q || face.r == minface.q || |
---|
| 8215 | + face.p == minface.r || face.q == minface.r || face.r == minface.r) |
---|
7943 | 8216 | { |
---|
7944 | | -// if(minfaceweight <= 0) |
---|
7945 | | -// assert(minfaceweight > 0); |
---|
7946 | | -// |
---|
7947 | | -// //FaceWeight(face); |
---|
7948 | | -// if(face.weight < 0) |
---|
7949 | | -// assert(face.weight >= 0); |
---|
7950 | | - |
---|
7951 | | - face.weight += minfaceweight; |
---|
7952 | | - |
---|
7953 | | -// if (face.weight >= 10000) |
---|
7954 | | -// assert(face.weight < 10000); |
---|
| 8217 | + if (!leafweights) |
---|
| 8218 | + { |
---|
| 8219 | + // if(minfaceweight <= 0) |
---|
| 8220 | + // assert(minfaceweight > 0); |
---|
| 8221 | + // |
---|
| 8222 | + // //FaceWeight(face); |
---|
| 8223 | + // if(face.weight < 0) |
---|
| 8224 | + // assert(face.weight >= 0); |
---|
| 8225 | + |
---|
| 8226 | + face.weight += minfaceweight; |
---|
| 8227 | + |
---|
| 8228 | + // if (face.weight >= 10000) |
---|
| 8229 | + // assert(face.weight < 10000); |
---|
| 8230 | + } |
---|
| 8231 | + else |
---|
| 8232 | + face.weight = -1; |
---|
| 8233 | + |
---|
| 8234 | + face.nbiterations += 1; |
---|
| 8235 | + face.boundary = -1; |
---|
| 8236 | + |
---|
| 8237 | + Vertex p = (Vertex)vertices.get(face.p); |
---|
| 8238 | + Vertex q = (Vertex)vertices.get(face.q); |
---|
| 8239 | + Vertex r = (Vertex)vertices.get(face.r); |
---|
| 8240 | + |
---|
| 8241 | + p.boundary = -1; |
---|
| 8242 | + q.boundary = -1; |
---|
| 8243 | + r.boundary = -1; |
---|
7955 | 8244 | } |
---|
7956 | 8245 | else |
---|
7957 | | - face.weight = -1; |
---|
7958 | | - |
---|
7959 | | - face.nbiterations += 1; |
---|
7960 | | - face.boundary = -1; |
---|
7961 | | - |
---|
7962 | | - Vertex p = (Vertex)vertices.get(face.p); |
---|
7963 | | - Vertex q = (Vertex)vertices.get(face.q); |
---|
7964 | | - Vertex r = (Vertex)vertices.get(face.r); |
---|
7965 | | - |
---|
7966 | | - p.boundary = -1; |
---|
7967 | | - q.boundary = -1; |
---|
7968 | | - r.boundary = -1; |
---|
| 8246 | + assert(false); |
---|
7969 | 8247 | } |
---|
7970 | | - else |
---|
7971 | | - assert(false); |
---|
7972 | 8248 | } |
---|
7973 | | - } |
---|
7974 | 8249 | |
---|
7975 | 8250 | // TouchVertex(minface.p); |
---|
7976 | 8251 | // TouchVertex(minface.q); |
---|
.. | .. |
---|
8171 | 8446 | for (int i=vertfaces.size(); --i>=0;) |
---|
8172 | 8447 | { |
---|
8173 | 8448 | Face face = (Face) vertfaces.get(i); |
---|
| 8449 | + face.used = true; |
---|
8174 | 8450 | face.good = 0; // false; |
---|
8175 | 8451 | if (leafweights) |
---|
8176 | 8452 | face.weight = -1; |
---|
.. | .. |
---|
8217 | 8493 | if (!trimmed) |
---|
8218 | 8494 | return; |
---|
8219 | 8495 | |
---|
8220 | | - GrafreeD.linkUV = false; |
---|
| 8496 | + Grafreed.linkUV = false; |
---|
8221 | 8497 | |
---|
8222 | 8498 | try |
---|
8223 | 8499 | { |
---|
.. | .. |
---|
8449 | 8725 | int[] startvertices; |
---|
8450 | 8726 | float[] averagepoints; |
---|
8451 | 8727 | float[] extremepoints; |
---|
8452 | | - float[] supportsizes; // distance of closest point |
---|
| 8728 | + float[] supportminsize; // distance of closest point |
---|
| 8729 | + float[] supportmaxsize; // distance of fartest point |
---|
8453 | 8730 | |
---|
8454 | 8731 | transient Hashtable vertextable; |
---|
8455 | 8732 | /*transient*/ private Vertex[] verticesCopy; |
---|