Normand Briere
2017-10-02 fc0ac44e30a56c87c7cf39fe66f6b3178732f1b6
Klein + billboard + rigging "seuil"
11 files modified
4 files added
815 ■■■■■ changed files
BillboardNode.java 54 ●●●●● patch | view | raw | blame | history
BiparamEditor.java 4 ●●●● patch | view | raw | blame | history
Bone.java 2 ●●● patch | view | raw | blame | history
BoundaryRep.java 122 ●●●● patch | view | raw | blame | history
CameraPane.java 3 ●●●● patch | view | raw | blame | history
Grid.java 9 ●●●● patch | view | raw | blame | history
GroupEditor.java 122 ●●●● patch | view | raw | blame | history
HiddenObject.java 39 ●●●●● patch | view | raw | blame | history
Klein.java 200 ●●●●● patch | view | raw | blame | history
KleinEditor.java 123 ●●●●● patch | view | raw | blame | history
Mocap.java 1 ●●●● patch | view | raw | blame | history
ObjEditor.java 80 ●●●● patch | view | raw | blame | history
Object3D.java 49 ●●●● patch | view | raw | blame | history
cMesh.java 4 ●●● patch | view | raw | blame | history
cSpring.java 3 ●●●● patch | view | raw | blame | history
BillboardNode.java
....@@ -0,0 +1,54 @@
1
+/*
2
+ * To change this template, choose Tools | Templates
3
+ * and open the template in the editor.
4
+ */
5
+
6
+/**
7
+ *
8
+ * @author nbriere
9
+ */
10
+public class BillboardNode extends Composite implements java.io.Serializable
11
+{
12
+ static final long serialVersionUID = 0;
13
+
14
+ BillboardNode()
15
+ {
16
+ super("Billboard");
17
+
18
+ toParent = LA.newMatrix();
19
+ fromParent = LA.newMatrix();
20
+ }
21
+
22
+ cVector pos = new cVector();
23
+
24
+ void draw(CameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked)
25
+ {
26
+ cVector eye = display.eyeCamera.location;
27
+
28
+ GlobalTransformInv();
29
+
30
+ pos.x = parent.globalTransform[3][0];
31
+ pos.y = parent.globalTransform[3][1];
32
+ pos.z = parent.globalTransform[3][2];
33
+
34
+ pos.x -= eye.x;
35
+ pos.y -= eye.y;
36
+ pos.z -= eye.z;
37
+
38
+ double angle = Math.atan2(pos.x, pos.z);
39
+
40
+ LA.matIdentity(toParent);
41
+ LA.matIdentity(fromParent);
42
+ LA.matYRotate(toParent, angle);
43
+ LA.matYRotate(fromParent, -angle);
44
+
45
+ super.draw(display, root, selected, blocked);
46
+ }
47
+
48
+ Object3D deepCopy()
49
+ {
50
+ Composite comp = new BillboardNode();
51
+ deepCopySelf(comp);
52
+ return comp;
53
+ }
54
+}
BiparamEditor.java
....@@ -261,8 +261,8 @@
261261 }
262262
263263 Biparam biparam;
264
- JLabel uDivsLabel;
265
- JLabel vDivsLabel;
264
+ //JLabel uDivsLabel;
265
+ //JLabel vDivsLabel;
266266 NumberSlider uDivsField;
267267 NumberSlider vDivsField;
268268 JCheckBox optionCB;
Bone.java
....@@ -26,7 +26,7 @@
2626 */
2727
2828 import javax.media.j3d.*;
29
-import javax.vecmath.*;
29
+//import javax.vecmath.*;
3030
3131 import java.util.*;
3232
BoundaryRep.java
....@@ -497,10 +497,10 @@
497497 return dist2;
498498 }
499499
500
- static Vertex vertextemp = new Vertex();
501
- static Vertex vertextemp2 = new Vertex();
500
+ static Vertex vertextemp = new Vertex(true);
501
+ static Vertex vertextemp2 = new Vertex(true);
502502
503
- static double SEUIL = 0.1; // 0.1 for rag doll; 0.07;
503
+ static double SEUIL = 0.1f; // 0.1 for rag doll; 0.07;
504504
505505 // Compute weight of point w/r to this
506506 float ComputeWeight(Vertex v, double[][] toRoot, int k)
....@@ -570,8 +570,10 @@
570570
571571 if (dot > distmax)
572572 dot = distmax;
573
+ //return 0; // patch for strange behavior
573574 if (dot < -distmax)
574575 dot = -distmax;
576
+ //return 0; // patch for strange behavior
575577
576578 // v3 = GetVertex(this.startvertices[subsupport] + 16);
577579 //
....@@ -609,10 +611,12 @@
609611
610612 float dist2 = (float)Distance2(v, v2, 1E10, toRoot, k);
611613
612
- if (dist2 >= 2 * SEUIL*SEUIL) // && !CameraPane.CROWD) // weightmode
614
+ double seuil = SEUIL * 2;
615
+
616
+ if (dist2 >= 2 * seuil*seuil) // && !CameraPane.CROWD) // weightmode
613617 return 0;
614618
615
- dist2 /= 2 * SEUIL*SEUIL; // multiplied by two because center of support
619
+ dist2 /= 2 * seuil*seuil; // multiplied by two because center of support
616620 // could be far from closest point
617621
618622 // dist2 = Math.pow(dist2, 2);
....@@ -946,7 +950,7 @@
946950
947951 int nbsupports;
948952
949
- SEUIL = 0.1; // aout 2013
953
+ // sept 2017 SEUIL = 0.1; // aout 2013
950954
951955 supports = InitConnections(other);
952956
....@@ -982,7 +986,7 @@
982986
983987 int subsupports = 0;
984988
985
- SEUIL = 0.1; // aout 2013
989
+ // sept 2017 SEUIL = 0.1; // aout 2013
986990
987991 while (subsupports == 0)
988992 {
....@@ -1006,6 +1010,26 @@
10061010
10071011 vect.set(v);
10081012 vect.sub(vect2);
1013
+
1014
+// vertextemp.x = other.averagepoints[c*3];
1015
+// vertextemp.y = other.averagepoints[c*3+1];
1016
+// vertextemp.z = other.averagepoints[c*3+2];
1017
+//
1018
+// Vertex v3 = vertextemp2;
1019
+// v3.x = other.extremepoints[c*3];
1020
+// v3.y = other.extremepoints[c*3+1];
1021
+// v3.z = other.extremepoints[c*3+2];
1022
+//
1023
+// vect3.set(v3); // "X" axis apex
1024
+// vect3.sub(vertextemp); // origin (center)
1025
+//
1026
+// double distmax = vect3.length();
1027
+//
1028
+// vect3.set(v2); // "X" axis apex
1029
+// vect3.sub(vertextemp); // origin (center)
1030
+//
1031
+// if (vect3.length() >= distmax)
1032
+// continue;
10091033
10101034 if (mindistance > vect.dot(vect))
10111035 {
....@@ -1017,7 +1041,9 @@
10171041
10181042 subsupports = v.closestsupport==-1 ? 0 : supports[v.closestsupport].Length();
10191043
1020
- SEUIL *= 2;
1044
+ // previously for "contains", now for weights.
1045
+ assert(subsupports > 0);
1046
+ //SEUIL *= 2;
10211047 }
10221048
10231049 assert(subsupports > 0);
....@@ -3776,10 +3802,19 @@
37763802 for (int i = 0; i < VertexCount(); i++)
37773803 {
37783804 Vertex v = GetVertex(i);
3805
+
3806
+ vertextemp.set(v);
3807
+
37793808 //if (v.norm.x == 0 && v.norm.y == 0 && v.norm.z == 0)
37803809 {
3781
- GenerateNormal(i, v);
3782
- SetVertex(v, i);
3810
+ if (!GenerateNormal(i, vertextemp))
3811
+ continue;
3812
+
3813
+ if (v.norm.dot(vertextemp.norm) < 0)
3814
+ vertextemp.norm.mul(-1);
3815
+
3816
+ if (v.norm.dot(vertextemp.norm) < 0.9)
3817
+ SetVertex(vertextemp, i);
37833818 }
37843819 }
37853820
....@@ -3790,7 +3825,7 @@
37903825 static cVector temp2 = new cVector();
37913826 static cVector temp3 = new cVector();
37923827
3793
- void GenerateNormal(int index, Vertex v)
3828
+ boolean GenerateNormal(int index, Vertex v)
37943829 {
37953830 //System.out.println("Old normal = " + v.norm);
37963831 LA.setVector(v.norm, 0, 0, 0);
....@@ -3819,6 +3854,10 @@
38193854 LA.vecSub(p/*.pos*/, v/*.pos*/, temp1);
38203855 LA.vecSub(q/*.pos*/, v/*.pos*/, temp2);
38213856 }
3857
+ else
3858
+ {
3859
+ continue;
3860
+ }
38223861
38233862 //LA.vecNormalize(temp1);
38243863 //LA.vecNormalize(temp2);
....@@ -3829,17 +3868,25 @@
38293868 double s = temp3.length();
38303869 //double c = temp2.dot(temp1);
38313870
3871
+ if (s == 0)
3872
+ return false;
3873
+
38323874 float angle = 1; // (float) Math.atan2(s, c);
38333875 //if(angle < 0) angle = -angle;
38343876
38353877 //LA.vecNormalize(temp3);
38363878 LA.vecScale(temp3, angle / s);
38373879
3880
+// if (temp3.dot(v.norm) < 0)
3881
+// assert(temp3.dot(v.norm) >= 0);
3882
+
38383883 LA.vecAdd(temp3, v.norm, v.norm);
38393884 }
38403885
38413886 LA.vecNormalize(v.norm);
38423887 //System.out.println("New normal = " + v.norm);
3888
+
3889
+ return true;
38433890 }
38443891
38453892 double Arccos(double x)
....@@ -4926,7 +4973,7 @@
49264973 }
49274974 }
49284975
4929
- System.out.println("done.");
4976
+ //System.out.println("done.");
49304977
49314978 cp.renderCamera = keep;
49324979
....@@ -7075,6 +7122,7 @@
70757122 assert(f2.contains(i));
70767123 assert(f3.contains(i));
70777124
7125
+ // when r is the "center", p is along the boundary
70787126 while (f0.r != i)
70797127 {
70807128 int t = f0.p;
....@@ -7131,60 +7179,90 @@
71317179 f0 = f3;
71327180 f3 = t;
71337181 }
7134
- atleastone = true;
71357182
7183
+ int va = f0.q;
7184
+ int vb = f0.r;
7185
+ int vc = -1;
7186
+
7187
+ Face toremove1 = null;
7188
+ Face toremove2 = null;
7189
+
7190
+ // f0 is the buffer for the first new triangle,
7191
+ // and otherf is the other upper one.
71367192 Face otherf = null;
71377193
71387194 if (f1.contains(f0.p))
71397195 {
71407196 if (f1.p == f0.p)
71417197 {
7198
+ assert(false);
71427199 f0.r = f1.q;
71437200 }
71447201 else
71457202 {
71467203 assert(f1.q == f0.p);
7147
- f0.r = f1.p;
7204
+ vc = f1.p;
71487205 }
71497206
71507207 otherf = f2;
7151
- faces.remove(f1);
7152
- faces.remove(f3);
7208
+ toremove1 = f1;
7209
+ toremove2 = f3;
71537210 }
71547211 else
71557212 if (f2.contains(f0.p))
71567213 {
71577214 if (f2.p == f0.p)
71587215 {
7216
+ assert(false);
71597217 f0.r = f2.q;
71607218 }
71617219 else
71627220 {
71637221 assert(f2.q == f0.p);
7164
- f0.r = f2.p;
7222
+ vc = f2.p;
71657223 }
71667224
71677225 otherf = f3;
7168
- faces.remove(f1);
7169
- faces.remove(f2);
7226
+ toremove1 = f1;
7227
+ toremove2 = f2;
71707228 }
71717229 if (f3.contains(f0.p))
71727230 {
71737231 if (f3.p == f0.p)
71747232 {
7233
+ assert(false);
71757234 f0.r = f3.q;
71767235 }
71777236 else
71787237 {
71797238 assert(f3.q == f0.p);
7180
- f0.r = f3.p;
7239
+ vc = f3.p;
71817240 }
71827241
71837242 otherf = f1;
7184
- faces.remove(f2);
7185
- faces.remove(f3);
7243
+ toremove1 = f2;
7244
+ toremove2 = f3;
71867245 }
71877246
7247
+ vertextemp.set(vertices.get(va));
7248
+ vertextemp.sub(vertices.get(vb));
7249
+ vertextemp.normalize();
7250
+ vertextemp2.set(vertices.get(vc));
7251
+ vertextemp2.sub(vertices.get(vb));
7252
+ vertextemp2.normalize();
7253
+
7254
+ if (vertextemp.dot(vertextemp2) > -0.95)
7255
+ {
7256
+ continue;
7257
+ }
7258
+
7259
+ atleastone = true;
7260
+
7261
+ f0.r = vc;
7262
+
7263
+ faces.remove(toremove1);
7264
+ faces.remove(toremove2);
7265
+
71887266 if (!f0.contains(otherf.p))
71897267 {
71907268 otherf.r = otherf.p;
CameraPane.java
....@@ -13257,7 +13257,8 @@
1325713257 FlipTransform();
1325813258 break;
1325913259 case ENTER:
13260
- object.editWindow.ScreenFit(); // Edit();
13260
+ // object.editWindow.ScreenFit(); // Edit();
13261
+ ToggleLive();
1326113262 break;
1326213263 case DELETE:
1326313264 ClearSelection();
Grid.java
....@@ -4,6 +4,11 @@
44
55 Grid()
66 {
7
+ this(35, 34);
8
+ }
9
+
10
+ Grid(int u, int v)
11
+ {
712 super(false);
813 //this(true);
914 //}
....@@ -12,8 +17,8 @@
1217 //{
1318 inPnt = new cVector();
1419 name = "Grid";
15
- uDivs = 35;
16
- vDivs = 34;
20
+ uDivs = u;
21
+ vDivs = v;
1722 minUDivs = 1;
1823 minVDivs = 1;
1924 center = new cVector();
GroupEditor.java
....@@ -219,6 +219,8 @@
219219 resetsupportItem.addActionListener(this);
220220 linkverticesItem = menu.add(new MenuItem("Link to Support"));
221221 linkverticesItem.addActionListener(this);
222
+ relinkverticesItem = menu.add(new MenuItem("Re-link to Support"));
223
+ relinkverticesItem.addActionListener(this);
222224 setMasterItem = menu.add(new MenuItem("Set Master Mesh"));
223225 setMasterItem.addActionListener(this);
224226
....@@ -231,6 +233,10 @@
231233 frontItem.addActionListener(this);
232234 compositeItem = menu.add(new MenuItem("Composite"));
233235 compositeItem.addActionListener(this);
236
+ hideItem = menu.add(new MenuItem("Hide"));
237
+ hideItem.addActionListener(this);
238
+ ungroupItem = menu.add(new MenuItem("Ungroup"));
239
+ ungroupItem.addActionListener(this);
234240 menu.add("-");
235241 randomItem = menu.add(new MenuItem("Random"));
236242 randomItem.addActionListener(this);
....@@ -252,6 +258,8 @@
252258 oe.menuBar.add(menu = new Menu("Object"));
253259 textureItem = menu.add(new MenuItem("Texture"));
254260 textureItem.addActionListener(this);
261
+ billboardItem = menu.add(new MenuItem("Billboard"));
262
+ billboardItem.addActionListener(this);
255263 csgItem = menu.add(new MenuItem("CSG"));
256264 csgItem.addActionListener(this);
257265 shadowXItem = menu.add(new MenuItem("Shadow X"));
....@@ -269,14 +277,12 @@
269277 pointflowItem = menu.add(new MenuItem("Point Flow"));
270278 pointflowItem.addActionListener(this);
271279 menu.add("-");
272
- transformgeometryItem = menu.add(new MenuItem("Transform Geometry"));
273
- transformgeometryItem.addActionListener(this);
274280 resetTransformItem = menu.add(new MenuItem("Reset Transform"));
275281 resetTransformItem.addActionListener(this);
276282 resetCentroidItem = menu.add(new MenuItem("Reset Centroid"));
277283 resetCentroidItem.addActionListener(this);
278
- ungroupItem = menu.add(new MenuItem("Ungroup"));
279
- ungroupItem.addActionListener(this);
284
+ transformgeometryItem = menu.add(new MenuItem("Transform Geometry"));
285
+ transformgeometryItem.addActionListener(this);
280286
281287 oe.menuBar.add(menu = new Menu("Geometry"));
282288 genUVItem = menu.add(new MenuItem("Generate UV"));
....@@ -287,6 +293,8 @@
287293 genNormalsCADItem.addActionListener(this);
288294 genNormalsMESHItem = menu.add(new MenuItem("Mesh Normals"));
289295 genNormalsMESHItem.addActionListener(this);
296
+ genNormalsMINEItem = menu.add(new MenuItem("My Normals"));
297
+ genNormalsMINEItem.addActionListener(this);
290298 stripifyItem = menu.add(new MenuItem("Stripify"));
291299 stripifyItem.addActionListener(this);
292300 unstripifyItem = menu.add(new MenuItem("Unstripify"));
....@@ -1035,6 +1043,8 @@
10351043 torusItem.addActionListener(this);
10361044 superItem = menu.add(new MenuItem("Superellipsoid"));
10371045 superItem.addActionListener(this);
1046
+ kleinItem = menu.add(new MenuItem("Klein Bottle"));
1047
+ kleinItem.addActionListener(this);
10381048 particleItem = menu.add(new MenuItem("Particle system"));
10391049 particleItem.addActionListener(this);
10401050 ragdollItem = menu.add(new MenuItem("Rag Walk"));
....@@ -1595,6 +1605,10 @@
15951605 {
15961606 makeSomething(new Superellipsoid());
15971607 } else
1608
+ if (event.getSource() == kleinItem)
1609
+ {
1610
+ makeSomething(new Klein());
1611
+ } else
15981612 if (event.getSource() == blobItem)
15991613 {
16001614 Blob blob = new Blob();
....@@ -2003,23 +2017,28 @@
20032017 if (group.selection.size() == 1)
20042018 one = true;
20052019
2020
+ Object3D merge = null;
2021
+
20062022 Object3D content = new cGroup();
20072023
20082024 for (int i=0; i<group.selection.size(); i++)
20092025 {
2010
- Object3D sel = new Merge(group.selection.get(i));
2026
+ merge = new Merge(group.selection.get(i));
20112027
20122028 if (one)
2013
- makeSomething(sel, false);
2029
+ makeSomething(merge, false);
20142030 else
2015
- content.addChild(sel);
2031
+ content.addChild(merge);
20162032 }
20172033
20182034 if (!one)
2019
- makeSomething(content, false);
2020
-
2021
- ResetModel();
2022
- refreshContents();
2035
+ makeSomething(content, true);
2036
+ else
2037
+ {
2038
+ ResetModel();
2039
+ Select(merge.GetTreePath(), true, false); // unselect... false);
2040
+ refreshContents();
2041
+ }
20232042 } else
20242043 if (event.getSource() == mergeGeometriesItem)
20252044 {
....@@ -2096,6 +2115,15 @@
20962115
20972116 refreshContents();
20982117 } else
2118
+ if (event.getSource() == relinkverticesItem)
2119
+ {
2120
+ boolean random = CameraPane.RANDOM;
2121
+ CameraPane.RANDOM = false; // parse all random nodes
2122
+ group.selection.RelinkToSupport();
2123
+ CameraPane.RANDOM = random;
2124
+
2125
+ refreshContents();
2126
+ } else
20992127 if (event.getSource() == resetreferencesItem)
21002128 {
21012129 for (int i=0; i<group.selection.size(); i++)
....@@ -2164,6 +2192,10 @@
21642192 if (event.getSource() == grabItem)
21652193 {
21662194 group(new cGroup(), true);
2195
+ } else
2196
+ if (event.getSource() == hideItem)
2197
+ {
2198
+ group(new HiddenObject());
21672199 } else
21682200 if (event.getSource() == frontItem)
21692201 {
....@@ -2287,6 +2319,10 @@
22872319 {
22882320 group(new TextureNode());
22892321 } else
2322
+ if (event.getSource() == billboardItem)
2323
+ {
2324
+ group(new BillboardNode());
2325
+ } else
22902326 if (event.getSource() == shadowXItem)
22912327 {
22922328 CastShadow(0);
....@@ -2301,7 +2337,15 @@
23012337 } else
23022338 if (event.getSource() == ungroupItem)
23032339 {
2304
- ungroup();
2340
+ //ungroup();
2341
+ for (int i=0; i<group.selection.size(); i++)
2342
+ {
2343
+ Ungroup(group.selection.get(i));
2344
+ }
2345
+
2346
+ ClearSelection(false);
2347
+
2348
+ refreshContents();
23052349 } else
23062350 if (event.getSource() == genUVItem)
23072351 {
....@@ -2318,6 +2362,10 @@
23182362 if (event.getSource() == genNormalsORGANItem)
23192363 {
23202364 GenNormals(false);
2365
+ } else
2366
+ if (event.getSource() == genNormalsMINEItem)
2367
+ {
2368
+ GenNormalsMINE();
23212369 } else
23222370 if (event.getSource() == stripifyItem)
23232371 {
....@@ -3179,6 +3227,13 @@
31793227 refreshContents();
31803228 }
31813229
3230
+ void GenNormalsMINE()
3231
+ {
3232
+ group.selection.GenNormalsMINE();
3233
+
3234
+ refreshContents();
3235
+ }
3236
+
31823237 void Stripify()
31833238 {
31843239 group.StripifyS();
....@@ -3447,12 +3502,26 @@
34473502
34483503 void Align()
34493504 {
3505
+ if (group.selection.size() == 0)
3506
+ return;
3507
+
3508
+ cVector bbmin = new cVector();
3509
+ cVector bbmax = new cVector();
3510
+
3511
+ group.selection.get(0).getBounds(bbmin, bbmax, true);
3512
+
3513
+ double dx = bbmax.x - bbmin.x;
3514
+ double dy = bbmax.y - bbmin.y;
3515
+ double dz = bbmax.z - bbmin.z;
3516
+
3517
+ double scale = Math.sqrt(dx*dx + dy*dy + dz*dz);
3518
+
34503519 for (int i=0; i<group.selection.size(); i++)
34513520 {
34523521 Object3D obj = group.selection.get(i);
34533522
3454
- LA.matTranslate(obj.toParent, i/2f, 0, 0);
3455
- LA.matTranslateInv(obj.fromParent, -i/2f, 0, 0);
3523
+ LA.matTranslate(obj.toParent, i * scale, 0, 0);
3524
+ LA.matTranslateInv(obj.fromParent, -i * scale, 0, 0);
34563525 }
34573526
34583527 refreshContents();
....@@ -4474,6 +4543,26 @@
44744543 makeSomething(csg);
44754544 }
44764545
4546
+ void Ungroup(Object3D g)
4547
+ {
4548
+ if (g instanceof HiddenObject)
4549
+ {
4550
+ HiddenObject h = (HiddenObject) g;
4551
+
4552
+ for (int i=0; i<h.ActualSize(); i++)
4553
+ {
4554
+ objEditor.makeSomething(h.get(i), false);
4555
+ }
4556
+ }
4557
+ else
4558
+ {
4559
+ for (int i=0; i<g.Size(); i++)
4560
+ {
4561
+ objEditor.makeSomething(g.get(i), false);
4562
+ }
4563
+ }
4564
+ }
4565
+
44774566 void ungroup()
44784567 {
44794568 /*
....@@ -4833,6 +4922,7 @@
48334922 private MenuItem resetsupportItem;
48344923 private MenuItem resetreferencesItem;
48354924 private MenuItem linkverticesItem;
4925
+ private MenuItem relinkverticesItem;
48364926 private MenuItem setMasterItem;
48374927 private MenuItem resetMeshItem;
48384928 private MenuItem stepAllItem;
....@@ -4854,6 +4944,7 @@
48544944 private MenuItem genNormalsMESHItem;
48554945 private MenuItem genNormalsCADItem;
48564946 private MenuItem genNormalsORGANItem;
4947
+ private MenuItem genNormalsMINEItem;
48574948 private MenuItem stripifyItem;
48584949 private MenuItem unstripifyItem;
48594950 private MenuItem trimItem;
....@@ -4895,6 +4986,7 @@
48954986 private MenuItem resetCentroidItem;
48964987 private MenuItem transformgeometryItem;
48974988 private MenuItem resetTransformItem;
4989
+ private MenuItem hideItem;
48984990 private MenuItem grabItem;
48994991 private MenuItem backItem;
49004992 private MenuItem frontItem;
....@@ -4935,6 +5027,7 @@
49355027 private MenuItem coneItem;
49365028 private MenuItem torusItem;
49375029 private MenuItem superItem;
5030
+ private MenuItem kleinItem;
49385031 private MenuItem blobItem;
49395032 private MenuItem latheItem;
49405033 private MenuItem bezierItem;
....@@ -4947,6 +5040,7 @@
49475040 private MenuItem csgItem;
49485041 private MenuItem templateItem;
49495042 private MenuItem textureItem;
5043
+ private MenuItem billboardItem;
49505044 private MenuItem shadowXItem;
49515045 private MenuItem shadowYItem;
49525046 private MenuItem shadowZItem;
HiddenObject.java
....@@ -0,0 +1,39 @@
1
+
2
+class HiddenObject extends Object3D
3
+{
4
+static final long serialVersionUID = 0;
5
+
6
+static int globalcount = 1;
7
+
8
+ HiddenObject()
9
+ {
10
+ this("Hidden" + globalcount++);
11
+ }
12
+
13
+ HiddenObject(String name)
14
+ {
15
+ super(name);
16
+ }
17
+
18
+ public int size()
19
+ {
20
+ return 0;
21
+ }
22
+
23
+ public int Size()
24
+ {
25
+ return 0;
26
+ }
27
+
28
+ public int ActualSize()
29
+ {
30
+ return super.size();
31
+ }
32
+
33
+ HiddenObject deepCopy()
34
+ {
35
+ HiddenObject comp = new HiddenObject();
36
+ deepCopySelf(comp);
37
+ return comp;
38
+ }
39
+}
Klein.java
....@@ -0,0 +1,200 @@
1
+
2
+class Klein extends Biparam implements java.io.Serializable
3
+{
4
+// void DrawNode(CameraPane display, Object3D /*Composite*/ root, boolean selected) {}
5
+
6
+ static final long serialVersionUID = 0;
7
+
8
+ double radius = 4;
9
+
10
+ Klein()
11
+ {
12
+ this(true);
13
+ }
14
+
15
+ Klein(Klein s)
16
+ {
17
+ s.deepCopySelf(this);
18
+ }
19
+
20
+ public Klein(boolean recalc)
21
+ {
22
+ toParent = LA.newMatrix();
23
+ fromParent = LA.newMatrix();
24
+
25
+ name = "Klein";
26
+ //uDivs = vDivs = 16;
27
+ uDivs = 32;
28
+ vDivs = 32;
29
+ minUDivs = 3;
30
+ minVDivs = 2;
31
+ //center = new cVector();
32
+ if (recalc)
33
+ {
34
+ retile();
35
+ recalculate();
36
+ }
37
+ }
38
+
39
+ void refreshCenter(cVector c)
40
+ {
41
+ /**/
42
+ toParent[3][0] = c.x; // - center.x;
43
+ toParent[3][1] = c.y; // - center.y;
44
+ toParent[3][2] = c.z; // - center.z;
45
+
46
+ fromParent[3][0] = -c.x; // + center.x;
47
+ fromParent[3][1] = -c.y; // + center.y;
48
+ fromParent[3][2] = -c.z; // + center.z;
49
+ /**/
50
+ //center.set(0,0,0);
51
+ }
52
+
53
+ cVector getCenter()
54
+ {
55
+ //assert(center.x == 0);
56
+ //assert(center.y == 0);
57
+ //assert(center.z == 0);
58
+
59
+ // if (center == null)
60
+ // center = new cVector();
61
+
62
+ cVector c = new cVector(center);
63
+
64
+ for (int i=GetTransformCount(); --i>=0;)
65
+ LA.xformPos(c, toParent, c);
66
+
67
+ return c;
68
+ }
69
+
70
+ Object3D deepCopy()
71
+ {
72
+ Sphere e = new Sphere();
73
+ deepCopySelf(e);
74
+ return e;
75
+ }
76
+
77
+ protected void deepCopySelf(Object3D other)
78
+ {
79
+ super.deepCopySelf(other);
80
+ Klein e = (Klein) other;
81
+ if (center != null)
82
+ {
83
+ e.center = new cVector(center);
84
+ //LA.vecCopy(center, e.center);
85
+ }
86
+ e.radius = radius;
87
+ }
88
+
89
+ void generatePOV(StringBuffer buffer)
90
+ {
91
+ generateNameComment(buffer);
92
+ generateIndent(buffer);
93
+ buffer.append("sphere { ");
94
+ // LA.toPOVRay(center, buffer);
95
+ buffer.append(", ");
96
+ // buffer.append(radius);
97
+ buffer.append("\n");
98
+ generateTransform(buffer);
99
+ generateIndent(buffer);
100
+ buffer.append("}\n");
101
+ }
102
+
103
+ Vertex biparamFunction(double u, double v)
104
+ {
105
+ // KLEIN #!
106
+ /*
107
+ double uAng = LA.toRadians(-180*(1-u) + 180*u);
108
+ double vAng = LA.toRadians(-180*(1-v) + 180*v);
109
+
110
+ // x = cos(u) (a + sin(v) cos(u/2) - sin(2v) sin(u/2)/2)
111
+ // y = sin(u) (a + sin(v) cos(u/2) - sin(2v) sin(u/2)/2)
112
+ // z = sin(u/2) sin(v) + cos(u/2) sin(2v)/2
113
+ //where
114
+ // -pi <= u <= pi
115
+ //and
116
+ // -pi <= v <= pi
117
+ double cosu = Math.cos(uAng);
118
+ double sinu = Math.sin(uAng);
119
+ double cosu2 = Math.cos(uAng/2);
120
+ double sinu2 = Math.sin(uAng/2);
121
+ double sinv = Math.sin(vAng);
122
+ double sin2v = Math.sin(vAng/2);
123
+
124
+ double x = cosu * (handle + sinv * cosu2 - sin2v * sinu2 / 2);
125
+ double y = sinu * (handle + sinv * cosu2 - sin2v * sinu2 / 2);
126
+ double z = sinu2 * sinv + cosu2 * sin2v / 2;
127
+ */
128
+
129
+ double uAng = LA.toRadians(u*360);
130
+ double vAng = LA.toRadians(v*360);
131
+
132
+ double cosu = Math.cos(uAng);
133
+ double sinu = Math.sin(uAng);
134
+ double cosv = Math.cos(vAng);
135
+ double sinv = Math.sin(vAng);
136
+
137
+ double r = radius * (1 - cosu / 2);
138
+
139
+ double x = 6 * cosu * (1 + sinu);
140
+ double y = 16 * sinu;
141
+ double z = r * sinv;
142
+
143
+ if (u < 0.5)
144
+ {
145
+ x += r * cosu * cosv;
146
+ y += r * sinu * cosv;
147
+ }
148
+ else
149
+ {
150
+ x += r * Math.cos(vAng + Math.PI);
151
+ }
152
+
153
+ // y = -16 .. 20
154
+ r = radius * (20 - y)/36 * (1 - cosu / 2);
155
+
156
+ x = 6 * cosu * (1 + sinu);
157
+ y = 16 * sinu;
158
+ z = r * sinv;
159
+
160
+ if (u < 0.5)
161
+ {
162
+ x += r * cosu * cosv;
163
+ y += r * sinu * cosv;
164
+ }
165
+ else
166
+ {
167
+ x += r * Math.cos(vAng + Math.PI);
168
+ }
169
+
170
+ Vertex temp = new Vertex();
171
+ temp.norm = LA.newVector(x, y, z);
172
+ //temp.pos = new cVector();
173
+ if (center != null)
174
+ LA.vecAdd(temp.norm, center, temp/*.pos*/);
175
+ else
176
+ LA.vecCopy(temp.norm, temp/*.pos*/);
177
+ LA.vecNormalize(temp.norm);
178
+
179
+ return temp;
180
+ }
181
+
182
+ void createEditWindow(GroupEditor callee, boolean newWindow)
183
+ {
184
+ //editWindow = (new SphereEditor(this, deepCopy(), callee)).GetEditor();
185
+ if (newWindow)
186
+ {
187
+ objectUI = new KleinEditor(this, deepCopy(), callee);
188
+ } else
189
+ {
190
+ objectUI = new KleinEditor(this, callee);
191
+ }
192
+
193
+ editWindow = objectUI.GetEditor();
194
+ }
195
+
196
+ boolean inside(double x, double y, double z, boolean xform)
197
+ {
198
+ return false;
199
+ }
200
+}
KleinEditor.java
....@@ -0,0 +1,123 @@
1
+// Decompiled by Jad v1.5.7b. Copyright 1997-99 Pavel Kouznetsov.
2
+// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
3
+// Decompiler options: packimports(3)
4
+// Source File Name: SphereEditor.java
5
+
6
+import java.awt.*;
7
+import java.awt.event.*;
8
+import javax.swing.*;
9
+import javax.swing.event.*;
10
+
11
+class KleinEditor extends BiparamEditor implements ActionListener, ObjectUI
12
+{
13
+ KleinEditor(Klein inSph, GroupEditor callee)
14
+ {
15
+ super(inSph, callee); // false);
16
+ //objEditor = new BiparamEditor(inSph, this, callee); // false);
17
+ objEditor = callee.GetEditor();
18
+ //parent = this;
19
+ klein = inSph;
20
+
21
+ SetupUI2(objEditor);
22
+ }
23
+
24
+ KleinEditor(Klein inSph, Object3D copy, GroupEditor callee)
25
+ {
26
+ super(inSph, copy, null, callee); // false);
27
+ //objEditor = new BiparamEditor(inSph, copy, this, callee); // false);
28
+ //parent = this;
29
+ objEditor = this;
30
+ klein = (Klein) copy;
31
+
32
+ //SetupUI(objEditor);
33
+ }
34
+
35
+ void SetupUI2(ObjEditor oe)
36
+ {
37
+ super.SetupUI2(oe);
38
+
39
+ radiusField = AddSlider(oe.ctrlPanel, "Radius:", 0, 20.0, klein.radius, 1);
40
+ Return();
41
+ }
42
+
43
+ void Clear()
44
+ {
45
+ objEditor.Clear();
46
+
47
+ klein = null;
48
+ }
49
+
50
+ /*
51
+ public void doLayout()
52
+ {
53
+ super.doLayout();
54
+ labelAndField(centerLabel, centerField);
55
+ labelAndField(radiusLabel, radiusField);
56
+ widgetPos += 5;
57
+ }
58
+ */
59
+
60
+ /**/
61
+// public void actionPerformed(ActionEvent e)
62
+// {
63
+// if (e.getSource() == centerField ||
64
+// e.getSource() == radiusField)
65
+// {
66
+// applySelf();
67
+// refreshContents();
68
+// }
69
+// else
70
+// super.actionPerformed(e);
71
+// }
72
+ /**/
73
+
74
+ public void stateChanged(ChangeEvent e)
75
+ {
76
+ //System.out.println("Klein :: stateChanged");
77
+ if (e.getSource() == radiusField)
78
+ {
79
+ applySelf();
80
+ //super.applySelf();
81
+ objEditor.refreshContents();
82
+ //Refresh();
83
+ }
84
+ else
85
+ super.stateChanged(e);
86
+ }
87
+
88
+ public void applySelf()
89
+ {
90
+ super.applySelf();
91
+
92
+ klein.radius = radiusField.getFloat();
93
+ klein.recalculate();
94
+ }
95
+
96
+ Klein klein;
97
+ NumberSlider radiusField;
98
+
99
+ public ObjEditor GetEditor()
100
+ {
101
+ //new Exception().printStackTrace();
102
+ return objEditor; // .GetEditor();
103
+ }
104
+
105
+ public void closeUI2()
106
+ {
107
+ objEditor.closeUI();
108
+ }
109
+
110
+ public void closeUI()
111
+ {
112
+ Remove(radiusField);
113
+
114
+ super.closeUI();
115
+ }
116
+
117
+ void refreshContents2()
118
+ {
119
+ objEditor.refreshContents();
120
+ }
121
+
122
+ //BiparamEditor objEditor;
123
+}
Mocap.java
....@@ -2854,6 +2854,7 @@
28542854 if (lastframetest == 0)
28552855 lastframetest = bvh.animation.getNumFrames();
28562856
2857
+ // WARNING: RESET DESTROYS EVERYTHING
28572858 if (baseframe >= lastframetest) // july 2013 // - GetFirstFrame())
28582859 {
28592860 System.out.println("MOCAP reset: " + this.GetFileRoot() +
ObjEditor.java
....@@ -1859,19 +1859,21 @@
18591859 }
18601860
18611861 // Images/textures
1862
- if (textures
1863
- && (filename.toLowerCase().endsWith(".jpg")
1864
- || filename.toLowerCase().endsWith(".jpeg")
1865
- || filename.toLowerCase().endsWith(".gif")
1866
- || filename.toLowerCase().endsWith(".png")
1867
- || filename.toLowerCase().endsWith(".tre")
1868
- || filename.toLowerCase().endsWith(".bmp")
1869
- || filename.toLowerCase().endsWith(".tga")
1870
- || filename.toLowerCase().endsWith(".sgi")
1871
- || filename.toLowerCase().endsWith(".tif")
1872
- || filename.toLowerCase().endsWith(".tiff")))
1862
+ if (filename.toLowerCase().endsWith(".jpg")
1863
+ || filename.toLowerCase().endsWith(".jpeg")
1864
+ || filename.toLowerCase().endsWith(".gif")
1865
+ || filename.toLowerCase().endsWith(".png")
1866
+ || filename.toLowerCase().endsWith(".tre")
1867
+ || filename.toLowerCase().endsWith(".bmp")
1868
+ || filename.toLowerCase().endsWith(".tga")
1869
+ || filename.toLowerCase().endsWith(".sgi")
1870
+ || filename.toLowerCase().endsWith(".tif")
1871
+ || filename.toLowerCase().endsWith(".tiff"))
18731872 {
1874
- DropTexture(filename);
1873
+ if (textures)
1874
+ DropTexture(filename);
1875
+ else
1876
+ CreateBillboard(filename);
18751877 continue;
18761878 }
18771879
....@@ -1882,6 +1884,60 @@
18821884 ResetModel();
18831885 }
18841886
1887
+ void CreateBillboard(String filename)
1888
+ {
1889
+ Object3D source = null;
1890
+ Object3D group = copy;
1891
+
1892
+ if (group.selection.size() > 0)
1893
+ {
1894
+ source = group.selection.get(0);
1895
+ }
1896
+
1897
+ Grid grid = new Grid(1,1);
1898
+ grid.material = null;
1899
+
1900
+ grid.toParent = LA.newMatrix();
1901
+ grid.fromParent = LA.newMatrix();
1902
+ LA.matYRotate(grid.toParent, Math.PI/2);
1903
+ LA.matXRotate(grid.toParent, -Math.PI/2);
1904
+ LA.matXRotate(grid.fromParent, Math.PI/2);
1905
+ LA.matYRotate(grid.fromParent, -Math.PI/2);
1906
+
1907
+ BillboardNode bb = new BillboardNode();
1908
+ bb.addChild(grid);
1909
+
1910
+ Object3D newgroup = new Object3D();
1911
+ newgroup.CreateMaterial();
1912
+
1913
+ File file = new File(filename);
1914
+ newgroup.name = file.getName();
1915
+ newgroup.addChild(bb);
1916
+
1917
+ Object3D main = newgroup;
1918
+
1919
+ main.SetPigmentTexture(filename);
1920
+
1921
+ if (source != null)
1922
+ {
1923
+ main.material = new cMaterial(source.material);
1924
+ if (main.projectedVertices.length < source.projectedVertices.length)
1925
+ {
1926
+ main.projectedVertices = new Object3D.cVector2[source.projectedVertices.length];
1927
+ }
1928
+
1929
+ for (int i=0; i<source.projectedVertices.length; i++)
1930
+ {
1931
+ main.projectedVertices[i].x = source.projectedVertices[i].x;
1932
+ main.projectedVertices[i].y = source.projectedVertices[i].y;
1933
+ }
1934
+
1935
+ main.texres = source.texres;
1936
+ }
1937
+
1938
+ makeSomething(newgroup, false);
1939
+ }
1940
+
18851941 Point location;
18861942
18871943 void DropTexture(String filename)
Object3D.java
....@@ -355,7 +355,7 @@
355355
356356 int MemorySize()
357357 {
358
- if (memorysize == 0)
358
+ if (true) // memorysize == 0)
359359 {
360360 try
361361 {
....@@ -1446,7 +1446,16 @@
14461446 // if (other == null)
14471447 // return;
14481448
1449
- System.out.println("Link support this = " + this + "; other = " + other);
1449
+ if (other != null)
1450
+ {
1451
+ BoundaryRep.SEUIL = other.material.cameralight;
1452
+
1453
+ // Set default to 0.1
1454
+ BoundaryRep.SEUIL /= 2;
1455
+ System.out.println("SEUIL = " + BoundaryRep.SEUIL);
1456
+ }
1457
+
1458
+ System.out.println("Link this = " + this + "; support = " + other);
14501459
14511460 //if (bRep != null)
14521461 // bRep.linkVerticesThis(other.bRep);
....@@ -1816,8 +1825,9 @@
18161825 if (obj.name == null)
18171826 continue; // can't be a null one
18181827
1819
- //if (n.contains(obj.name)) // dec 2013 name.split(":")[0])) // Poser generates a count
1820
- if (n.startsWith(obj.name))
1828
+ String name = obj.name.split(":")[0]; // Poser generates a count
1829
+ //if (n.startsWith(obj.name))
1830
+ if (n.contains(name))
18211831 {
18221832 theobj = obj;
18231833 count++;
....@@ -2732,6 +2742,24 @@
27322742 blockloop = false;
27332743 }
27342744
2745
+ void GenNormalsMINE()
2746
+ {
2747
+ if (blockloop)
2748
+ return;
2749
+
2750
+ blockloop = true;
2751
+ GenNormalsMINE0();
2752
+ for (int i = 0; i < Children().Size(); i++)
2753
+ {
2754
+ Object3D child = (Object3D) Children().get(i); // reserve(i);
2755
+ if (child == null)
2756
+ continue;
2757
+ child.GenNormalsMINE();
2758
+// Children().release(i);
2759
+ }
2760
+ blockloop = false;
2761
+ }
2762
+
27352763 void ClearColors()
27362764 {
27372765 if (blockloop)
....@@ -2876,6 +2904,15 @@
28762904 if (bRep != null)
28772905 {
28782906 bRep.GenerateNormals(crease);
2907
+ Touch();
2908
+ }
2909
+ }
2910
+
2911
+ void GenNormalsMINE0()
2912
+ {
2913
+ if (bRep != null)
2914
+ {
2915
+ bRep.GenerateNormalsMINE();
28792916 Touch();
28802917 }
28812918 }
....@@ -4111,7 +4148,7 @@
41114148 if (blockloop)
41124149 return;
41134150
4114
- for (int i=0; i<size(); i++)
4151
+ for (int i=0; i<Size(); i++)
41154152 {
41164153 if (get(i).parent != this)
41174154 {
....@@ -7733,7 +7770,7 @@
77337770 if (parent == null)
77347771 {
77357772 System.out.println("NULL PARENT");
7736
- new Exception().printStackTrace();
7773
+ //new Exception().printStackTrace();
77377774 } else
77387775 {
77397776 if (parent instanceof BezierPatch)
cMesh.java
....@@ -355,7 +355,9 @@
355355 // DynamicNode handle = new DynamicNode(center.x, center.y, center.z, 0 /*0 , 1 or Float.MAX_VALUE*/, 0);
356356 // Phys.addHandle(handle);
357357
358
- for (int k=Phys.allNodes.size(); --k>=0;) // warning: "add handle" adds a node
358
+ int size = Phys.allNodes.size();
359
+
360
+ for (int k=0; k < size; k++) // warning: "add handle" adds a node
359361 {
360362 DynamicNode dn = Phys.allNodes.get(k);
361363 DynamicNode handle = new DynamicNode(dn.position.x, dn.position.y, dn.position.z, 0 /*0 , 1 or Float.MAX_VALUE*/, 0);
cSpring.java
....@@ -1057,7 +1057,7 @@
10571057 vect1.set(v);
10581058 LA.xformPos(vect1,toRoot,vect1);
10591059
1060
- handles.get(usedrep.VertexCount()-1-i).set(vect1);
1060
+ handles.get(i).set(vect1);
10611061 }
10621062 }
10631063
....@@ -2325,6 +2325,7 @@
23252325
23262326 abstract Point3D forceOn(DynamicNode N);
23272327 }
2328
+
23282329 Point3D force = new Point3D();
23292330 Point3D dir = new Point3D();
23302331