From fc0ac44e30a56c87c7cf39fe66f6b3178732f1b6 Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Sun, 01 Oct 2017 20:17:17 -0400 Subject: [PATCH] Klein + billboard + rigging "seuil" --- ObjEditor.java | 80 ++++ Grid.java | 9 Bone.java | 2 HiddenObject.java | 39 ++ Mocap.java | 1 BiparamEditor.java | 4 Klein.java | 200 ++++++++++++++ cMesh.java | 4 BoundaryRep.java | 122 +++++++- CameraPane.java | 3 GroupEditor.java | 122 +++++++- cSpring.java | 3 Object3D.java | 49 +++ KleinEditor.java | 123 ++++++++ BillboardNode.java | 54 +++ 15 files changed, 753 insertions(+), 62 deletions(-) diff --git a/BillboardNode.java b/BillboardNode.java new file mode 100644 index 0000000..ea1cb8e --- /dev/null +++ b/BillboardNode.java @@ -0,0 +1,54 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * + * @author nbriere + */ +public class BillboardNode extends Composite implements java.io.Serializable +{ + static final long serialVersionUID = 0; + + BillboardNode() + { + super("Billboard"); + + toParent = LA.newMatrix(); + fromParent = LA.newMatrix(); + } + + cVector pos = new cVector(); + + void draw(CameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) + { + cVector eye = display.eyeCamera.location; + + GlobalTransformInv(); + + pos.x = parent.globalTransform[3][0]; + pos.y = parent.globalTransform[3][1]; + pos.z = parent.globalTransform[3][2]; + + pos.x -= eye.x; + pos.y -= eye.y; + pos.z -= eye.z; + + double angle = Math.atan2(pos.x, pos.z); + + LA.matIdentity(toParent); + LA.matIdentity(fromParent); + LA.matYRotate(toParent, angle); + LA.matYRotate(fromParent, -angle); + + super.draw(display, root, selected, blocked); + } + + Object3D deepCopy() + { + Composite comp = new BillboardNode(); + deepCopySelf(comp); + return comp; + } +} diff --git a/BiparamEditor.java b/BiparamEditor.java index 9598f9c..6fde80f 100644 --- a/BiparamEditor.java +++ b/BiparamEditor.java @@ -261,8 +261,8 @@ } Biparam biparam; - JLabel uDivsLabel; - JLabel vDivsLabel; + //JLabel uDivsLabel; + //JLabel vDivsLabel; NumberSlider uDivsField; NumberSlider vDivsField; JCheckBox optionCB; diff --git a/Bone.java b/Bone.java index 5daf945..93c1188 100755 --- a/Bone.java +++ b/Bone.java @@ -26,7 +26,7 @@ */ import javax.media.j3d.*; -import javax.vecmath.*; +//import javax.vecmath.*; import java.util.*; diff --git a/BoundaryRep.java b/BoundaryRep.java index 7fc9789..9cf899c 100644 --- a/BoundaryRep.java +++ b/BoundaryRep.java @@ -497,10 +497,10 @@ return dist2; } - static Vertex vertextemp = new Vertex(); - static Vertex vertextemp2 = new Vertex(); + static Vertex vertextemp = new Vertex(true); + static Vertex vertextemp2 = new Vertex(true); - static double SEUIL = 0.1; // 0.1 for rag doll; 0.07; + static double SEUIL = 0.1f; // 0.1 for rag doll; 0.07; // Compute weight of point w/r to this float ComputeWeight(Vertex v, double[][] toRoot, int k) @@ -570,8 +570,10 @@ if (dot > distmax) dot = distmax; + //return 0; // patch for strange behavior if (dot < -distmax) dot = -distmax; + //return 0; // patch for strange behavior // v3 = GetVertex(this.startvertices[subsupport] + 16); // @@ -609,10 +611,12 @@ float dist2 = (float)Distance2(v, v2, 1E10, toRoot, k); - if (dist2 >= 2 * SEUIL*SEUIL) // && !CameraPane.CROWD) // weightmode + double seuil = SEUIL * 2; + + if (dist2 >= 2 * seuil*seuil) // && !CameraPane.CROWD) // weightmode return 0; - dist2 /= 2 * SEUIL*SEUIL; // multiplied by two because center of support + dist2 /= 2 * seuil*seuil; // multiplied by two because center of support // could be far from closest point // dist2 = Math.pow(dist2, 2); @@ -946,7 +950,7 @@ int nbsupports; - SEUIL = 0.1; // aout 2013 + // sept 2017 SEUIL = 0.1; // aout 2013 supports = InitConnections(other); @@ -982,7 +986,7 @@ int subsupports = 0; - SEUIL = 0.1; // aout 2013 + // sept 2017 SEUIL = 0.1; // aout 2013 while (subsupports == 0) { @@ -1006,6 +1010,26 @@ vect.set(v); vect.sub(vect2); + +// vertextemp.x = other.averagepoints[c*3]; +// vertextemp.y = other.averagepoints[c*3+1]; +// vertextemp.z = other.averagepoints[c*3+2]; +// +// Vertex v3 = vertextemp2; +// v3.x = other.extremepoints[c*3]; +// v3.y = other.extremepoints[c*3+1]; +// v3.z = other.extremepoints[c*3+2]; +// +// vect3.set(v3); // "X" axis apex +// vect3.sub(vertextemp); // origin (center) +// +// double distmax = vect3.length(); +// +// vect3.set(v2); // "X" axis apex +// vect3.sub(vertextemp); // origin (center) +// +// if (vect3.length() >= distmax) +// continue; if (mindistance > vect.dot(vect)) { @@ -1017,7 +1041,9 @@ subsupports = v.closestsupport==-1 ? 0 : supports[v.closestsupport].Length(); - SEUIL *= 2; + // previously for "contains", now for weights. + assert(subsupports > 0); + //SEUIL *= 2; } assert(subsupports > 0); @@ -3776,10 +3802,19 @@ for (int i = 0; i < VertexCount(); i++) { Vertex v = GetVertex(i); + + vertextemp.set(v); + //if (v.norm.x == 0 && v.norm.y == 0 && v.norm.z == 0) { - GenerateNormal(i, v); - SetVertex(v, i); + if (!GenerateNormal(i, vertextemp)) + continue; + + if (v.norm.dot(vertextemp.norm) < 0) + vertextemp.norm.mul(-1); + + if (v.norm.dot(vertextemp.norm) < 0.9) + SetVertex(vertextemp, i); } } @@ -3790,7 +3825,7 @@ static cVector temp2 = new cVector(); static cVector temp3 = new cVector(); - void GenerateNormal(int index, Vertex v) + boolean GenerateNormal(int index, Vertex v) { //System.out.println("Old normal = " + v.norm); LA.setVector(v.norm, 0, 0, 0); @@ -3819,6 +3854,10 @@ LA.vecSub(p/*.pos*/, v/*.pos*/, temp1); LA.vecSub(q/*.pos*/, v/*.pos*/, temp2); } + else + { + continue; + } //LA.vecNormalize(temp1); //LA.vecNormalize(temp2); @@ -3829,17 +3868,25 @@ double s = temp3.length(); //double c = temp2.dot(temp1); + if (s == 0) + return false; + float angle = 1; // (float) Math.atan2(s, c); //if(angle < 0) angle = -angle; //LA.vecNormalize(temp3); LA.vecScale(temp3, angle / s); +// if (temp3.dot(v.norm) < 0) +// assert(temp3.dot(v.norm) >= 0); + LA.vecAdd(temp3, v.norm, v.norm); } LA.vecNormalize(v.norm); //System.out.println("New normal = " + v.norm); + + return true; } double Arccos(double x) @@ -4926,7 +4973,7 @@ } } - System.out.println("done."); + //System.out.println("done."); cp.renderCamera = keep; @@ -7075,6 +7122,7 @@ assert(f2.contains(i)); assert(f3.contains(i)); + // when r is the "center", p is along the boundary while (f0.r != i) { int t = f0.p; @@ -7131,60 +7179,90 @@ f0 = f3; f3 = t; } - atleastone = true; + int va = f0.q; + int vb = f0.r; + int vc = -1; + + Face toremove1 = null; + Face toremove2 = null; + + // f0 is the buffer for the first new triangle, + // and otherf is the other upper one. Face otherf = null; if (f1.contains(f0.p)) { if (f1.p == f0.p) { + assert(false); f0.r = f1.q; } else { assert(f1.q == f0.p); - f0.r = f1.p; + vc = f1.p; } otherf = f2; - faces.remove(f1); - faces.remove(f3); + toremove1 = f1; + toremove2 = f3; } else if (f2.contains(f0.p)) { if (f2.p == f0.p) { + assert(false); f0.r = f2.q; } else { assert(f2.q == f0.p); - f0.r = f2.p; + vc = f2.p; } otherf = f3; - faces.remove(f1); - faces.remove(f2); + toremove1 = f1; + toremove2 = f2; } if (f3.contains(f0.p)) { if (f3.p == f0.p) { + assert(false); f0.r = f3.q; } else { assert(f3.q == f0.p); - f0.r = f3.p; + vc = f3.p; } otherf = f1; - faces.remove(f2); - faces.remove(f3); + toremove1 = f2; + toremove2 = f3; } + vertextemp.set(vertices.get(va)); + vertextemp.sub(vertices.get(vb)); + vertextemp.normalize(); + vertextemp2.set(vertices.get(vc)); + vertextemp2.sub(vertices.get(vb)); + vertextemp2.normalize(); + + if (vertextemp.dot(vertextemp2) > -0.95) + { + continue; + } + + atleastone = true; + + f0.r = vc; + + faces.remove(toremove1); + faces.remove(toremove2); + if (!f0.contains(otherf.p)) { otherf.r = otherf.p; diff --git a/CameraPane.java b/CameraPane.java index 8fe82ec..091d05a 100644 --- a/CameraPane.java +++ b/CameraPane.java @@ -13257,7 +13257,8 @@ FlipTransform(); break; case ENTER: - object.editWindow.ScreenFit(); // Edit(); + // object.editWindow.ScreenFit(); // Edit(); + ToggleLive(); break; case DELETE: ClearSelection(); diff --git a/Grid.java b/Grid.java index 8a2d40b..f607c0d 100644 --- a/Grid.java +++ b/Grid.java @@ -4,6 +4,11 @@ Grid() { + this(35, 34); + } + + Grid(int u, int v) + { super(false); //this(true); //} @@ -12,8 +17,8 @@ //{ inPnt = new cVector(); name = "Grid"; - uDivs = 35; - vDivs = 34; + uDivs = u; + vDivs = v; minUDivs = 1; minVDivs = 1; center = new cVector(); diff --git a/GroupEditor.java b/GroupEditor.java index 4fa02b1..d7a1c3e 100644 --- a/GroupEditor.java +++ b/GroupEditor.java @@ -219,6 +219,8 @@ resetsupportItem.addActionListener(this); linkverticesItem = menu.add(new MenuItem("Link to Support")); linkverticesItem.addActionListener(this); + relinkverticesItem = menu.add(new MenuItem("Re-link to Support")); + relinkverticesItem.addActionListener(this); setMasterItem = menu.add(new MenuItem("Set Master Mesh")); setMasterItem.addActionListener(this); @@ -231,6 +233,10 @@ frontItem.addActionListener(this); compositeItem = menu.add(new MenuItem("Composite")); compositeItem.addActionListener(this); + hideItem = menu.add(new MenuItem("Hide")); + hideItem.addActionListener(this); + ungroupItem = menu.add(new MenuItem("Ungroup")); + ungroupItem.addActionListener(this); menu.add("-"); randomItem = menu.add(new MenuItem("Random")); randomItem.addActionListener(this); @@ -252,6 +258,8 @@ oe.menuBar.add(menu = new Menu("Object")); textureItem = menu.add(new MenuItem("Texture")); textureItem.addActionListener(this); + billboardItem = menu.add(new MenuItem("Billboard")); + billboardItem.addActionListener(this); csgItem = menu.add(new MenuItem("CSG")); csgItem.addActionListener(this); shadowXItem = menu.add(new MenuItem("Shadow X")); @@ -269,14 +277,12 @@ pointflowItem = menu.add(new MenuItem("Point Flow")); pointflowItem.addActionListener(this); menu.add("-"); - transformgeometryItem = menu.add(new MenuItem("Transform Geometry")); - transformgeometryItem.addActionListener(this); resetTransformItem = menu.add(new MenuItem("Reset Transform")); resetTransformItem.addActionListener(this); resetCentroidItem = menu.add(new MenuItem("Reset Centroid")); resetCentroidItem.addActionListener(this); - ungroupItem = menu.add(new MenuItem("Ungroup")); - ungroupItem.addActionListener(this); + transformgeometryItem = menu.add(new MenuItem("Transform Geometry")); + transformgeometryItem.addActionListener(this); oe.menuBar.add(menu = new Menu("Geometry")); genUVItem = menu.add(new MenuItem("Generate UV")); @@ -287,6 +293,8 @@ genNormalsCADItem.addActionListener(this); genNormalsMESHItem = menu.add(new MenuItem("Mesh Normals")); genNormalsMESHItem.addActionListener(this); + genNormalsMINEItem = menu.add(new MenuItem("My Normals")); + genNormalsMINEItem.addActionListener(this); stripifyItem = menu.add(new MenuItem("Stripify")); stripifyItem.addActionListener(this); unstripifyItem = menu.add(new MenuItem("Unstripify")); @@ -1035,6 +1043,8 @@ torusItem.addActionListener(this); superItem = menu.add(new MenuItem("Superellipsoid")); superItem.addActionListener(this); + kleinItem = menu.add(new MenuItem("Klein Bottle")); + kleinItem.addActionListener(this); particleItem = menu.add(new MenuItem("Particle system")); particleItem.addActionListener(this); ragdollItem = menu.add(new MenuItem("Rag Walk")); @@ -1595,6 +1605,10 @@ { makeSomething(new Superellipsoid()); } else + if (event.getSource() == kleinItem) + { + makeSomething(new Klein()); + } else if (event.getSource() == blobItem) { Blob blob = new Blob(); @@ -2003,23 +2017,28 @@ if (group.selection.size() == 1) one = true; + Object3D merge = null; + Object3D content = new cGroup(); for (int i=0; i<group.selection.size(); i++) { - Object3D sel = new Merge(group.selection.get(i)); + merge = new Merge(group.selection.get(i)); if (one) - makeSomething(sel, false); + makeSomething(merge, false); else - content.addChild(sel); + content.addChild(merge); } if (!one) - makeSomething(content, false); - - ResetModel(); - refreshContents(); + makeSomething(content, true); + else + { + ResetModel(); + Select(merge.GetTreePath(), true, false); // unselect... false); + refreshContents(); + } } else if (event.getSource() == mergeGeometriesItem) { @@ -2096,6 +2115,15 @@ refreshContents(); } else + if (event.getSource() == relinkverticesItem) + { + boolean random = CameraPane.RANDOM; + CameraPane.RANDOM = false; // parse all random nodes + group.selection.RelinkToSupport(); + CameraPane.RANDOM = random; + + refreshContents(); + } else if (event.getSource() == resetreferencesItem) { for (int i=0; i<group.selection.size(); i++) @@ -2164,6 +2192,10 @@ if (event.getSource() == grabItem) { group(new cGroup(), true); + } else + if (event.getSource() == hideItem) + { + group(new HiddenObject()); } else if (event.getSource() == frontItem) { @@ -2287,6 +2319,10 @@ { group(new TextureNode()); } else + if (event.getSource() == billboardItem) + { + group(new BillboardNode()); + } else if (event.getSource() == shadowXItem) { CastShadow(0); @@ -2301,7 +2337,15 @@ } else if (event.getSource() == ungroupItem) { - ungroup(); + //ungroup(); + for (int i=0; i<group.selection.size(); i++) + { + Ungroup(group.selection.get(i)); + } + + ClearSelection(false); + + refreshContents(); } else if (event.getSource() == genUVItem) { @@ -2318,6 +2362,10 @@ if (event.getSource() == genNormalsORGANItem) { GenNormals(false); + } else + if (event.getSource() == genNormalsMINEItem) + { + GenNormalsMINE(); } else if (event.getSource() == stripifyItem) { @@ -3179,6 +3227,13 @@ refreshContents(); } + void GenNormalsMINE() + { + group.selection.GenNormalsMINE(); + + refreshContents(); + } + void Stripify() { group.StripifyS(); @@ -3447,12 +3502,26 @@ void Align() { + if (group.selection.size() == 0) + return; + + cVector bbmin = new cVector(); + cVector bbmax = new cVector(); + + group.selection.get(0).getBounds(bbmin, bbmax, true); + + double dx = bbmax.x - bbmin.x; + double dy = bbmax.y - bbmin.y; + double dz = bbmax.z - bbmin.z; + + double scale = Math.sqrt(dx*dx + dy*dy + dz*dz); + for (int i=0; i<group.selection.size(); i++) { Object3D obj = group.selection.get(i); - LA.matTranslate(obj.toParent, i/2f, 0, 0); - LA.matTranslateInv(obj.fromParent, -i/2f, 0, 0); + LA.matTranslate(obj.toParent, i * scale, 0, 0); + LA.matTranslateInv(obj.fromParent, -i * scale, 0, 0); } refreshContents(); @@ -4474,6 +4543,26 @@ makeSomething(csg); } + void Ungroup(Object3D g) + { + if (g instanceof HiddenObject) + { + HiddenObject h = (HiddenObject) g; + + for (int i=0; i<h.ActualSize(); i++) + { + objEditor.makeSomething(h.get(i), false); + } + } + else + { + for (int i=0; i<g.Size(); i++) + { + objEditor.makeSomething(g.get(i), false); + } + } + } + void ungroup() { /* @@ -4833,6 +4922,7 @@ private MenuItem resetsupportItem; private MenuItem resetreferencesItem; private MenuItem linkverticesItem; + private MenuItem relinkverticesItem; private MenuItem setMasterItem; private MenuItem resetMeshItem; private MenuItem stepAllItem; @@ -4854,6 +4944,7 @@ private MenuItem genNormalsMESHItem; private MenuItem genNormalsCADItem; private MenuItem genNormalsORGANItem; + private MenuItem genNormalsMINEItem; private MenuItem stripifyItem; private MenuItem unstripifyItem; private MenuItem trimItem; @@ -4895,6 +4986,7 @@ private MenuItem resetCentroidItem; private MenuItem transformgeometryItem; private MenuItem resetTransformItem; + private MenuItem hideItem; private MenuItem grabItem; private MenuItem backItem; private MenuItem frontItem; @@ -4935,6 +5027,7 @@ private MenuItem coneItem; private MenuItem torusItem; private MenuItem superItem; + private MenuItem kleinItem; private MenuItem blobItem; private MenuItem latheItem; private MenuItem bezierItem; @@ -4947,6 +5040,7 @@ private MenuItem csgItem; private MenuItem templateItem; private MenuItem textureItem; + private MenuItem billboardItem; private MenuItem shadowXItem; private MenuItem shadowYItem; private MenuItem shadowZItem; diff --git a/HiddenObject.java b/HiddenObject.java new file mode 100644 index 0000000..4baa8fe --- /dev/null +++ b/HiddenObject.java @@ -0,0 +1,39 @@ + +class HiddenObject extends Object3D +{ +static final long serialVersionUID = 0; + +static int globalcount = 1; + + HiddenObject() + { + this("Hidden" + globalcount++); + } + + HiddenObject(String name) + { + super(name); + } + + public int size() + { + return 0; + } + + public int Size() + { + return 0; + } + + public int ActualSize() + { + return super.size(); + } + + HiddenObject deepCopy() + { + HiddenObject comp = new HiddenObject(); + deepCopySelf(comp); + return comp; + } +} diff --git a/Klein.java b/Klein.java new file mode 100644 index 0000000..601ff95 --- /dev/null +++ b/Klein.java @@ -0,0 +1,200 @@ + +class Klein extends Biparam implements java.io.Serializable +{ +// void DrawNode(CameraPane display, Object3D /*Composite*/ root, boolean selected) {} + + static final long serialVersionUID = 0; + + double radius = 4; + + Klein() + { + this(true); + } + + Klein(Klein s) + { + s.deepCopySelf(this); + } + + public Klein(boolean recalc) + { + toParent = LA.newMatrix(); + fromParent = LA.newMatrix(); + + name = "Klein"; + //uDivs = vDivs = 16; + uDivs = 32; + vDivs = 32; + minUDivs = 3; + minVDivs = 2; + //center = new cVector(); + if (recalc) + { + retile(); + recalculate(); + } + } + + void refreshCenter(cVector c) + { + /**/ + toParent[3][0] = c.x; // - center.x; + toParent[3][1] = c.y; // - center.y; + toParent[3][2] = c.z; // - center.z; + + fromParent[3][0] = -c.x; // + center.x; + fromParent[3][1] = -c.y; // + center.y; + fromParent[3][2] = -c.z; // + center.z; + /**/ + //center.set(0,0,0); + } + + cVector getCenter() + { + //assert(center.x == 0); + //assert(center.y == 0); + //assert(center.z == 0); + + // if (center == null) + // center = new cVector(); + + cVector c = new cVector(center); + + for (int i=GetTransformCount(); --i>=0;) + LA.xformPos(c, toParent, c); + + return c; + } + + Object3D deepCopy() + { + Sphere e = new Sphere(); + deepCopySelf(e); + return e; + } + + protected void deepCopySelf(Object3D other) + { + super.deepCopySelf(other); + Klein e = (Klein) other; + if (center != null) + { + e.center = new cVector(center); + //LA.vecCopy(center, e.center); + } + e.radius = radius; + } + + void generatePOV(StringBuffer buffer) + { + generateNameComment(buffer); + generateIndent(buffer); + buffer.append("sphere { "); + // LA.toPOVRay(center, buffer); + buffer.append(", "); + // buffer.append(radius); + buffer.append("\n"); + generateTransform(buffer); + generateIndent(buffer); + buffer.append("}\n"); + } + + Vertex biparamFunction(double u, double v) + { + // KLEIN #! + /* + double uAng = LA.toRadians(-180*(1-u) + 180*u); + double vAng = LA.toRadians(-180*(1-v) + 180*v); + + // x = cos(u) (a + sin(v) cos(u/2) - sin(2v) sin(u/2)/2) + // y = sin(u) (a + sin(v) cos(u/2) - sin(2v) sin(u/2)/2) + // z = sin(u/2) sin(v) + cos(u/2) sin(2v)/2 + //where + // -pi <= u <= pi + //and + // -pi <= v <= pi + double cosu = Math.cos(uAng); + double sinu = Math.sin(uAng); + double cosu2 = Math.cos(uAng/2); + double sinu2 = Math.sin(uAng/2); + double sinv = Math.sin(vAng); + double sin2v = Math.sin(vAng/2); + + double x = cosu * (handle + sinv * cosu2 - sin2v * sinu2 / 2); + double y = sinu * (handle + sinv * cosu2 - sin2v * sinu2 / 2); + double z = sinu2 * sinv + cosu2 * sin2v / 2; + */ + + double uAng = LA.toRadians(u*360); + double vAng = LA.toRadians(v*360); + + double cosu = Math.cos(uAng); + double sinu = Math.sin(uAng); + double cosv = Math.cos(vAng); + double sinv = Math.sin(vAng); + + double r = radius * (1 - cosu / 2); + + double x = 6 * cosu * (1 + sinu); + double y = 16 * sinu; + double z = r * sinv; + + if (u < 0.5) + { + x += r * cosu * cosv; + y += r * sinu * cosv; + } + else + { + x += r * Math.cos(vAng + Math.PI); + } + + // y = -16 .. 20 + r = radius * (20 - y)/36 * (1 - cosu / 2); + + x = 6 * cosu * (1 + sinu); + y = 16 * sinu; + z = r * sinv; + + if (u < 0.5) + { + x += r * cosu * cosv; + y += r * sinu * cosv; + } + else + { + x += r * Math.cos(vAng + Math.PI); + } + + Vertex temp = new Vertex(); + temp.norm = LA.newVector(x, y, z); + //temp.pos = new cVector(); + if (center != null) + LA.vecAdd(temp.norm, center, temp/*.pos*/); + else + LA.vecCopy(temp.norm, temp/*.pos*/); + LA.vecNormalize(temp.norm); + + return temp; + } + + void createEditWindow(GroupEditor callee, boolean newWindow) + { + //editWindow = (new SphereEditor(this, deepCopy(), callee)).GetEditor(); + if (newWindow) + { + objectUI = new KleinEditor(this, deepCopy(), callee); + } else + { + objectUI = new KleinEditor(this, callee); + } + + editWindow = objectUI.GetEditor(); + } + + boolean inside(double x, double y, double z, boolean xform) + { + return false; + } +} diff --git a/KleinEditor.java b/KleinEditor.java new file mode 100644 index 0000000..d5fbd4a --- /dev/null +++ b/KleinEditor.java @@ -0,0 +1,123 @@ +// Decompiled by Jad v1.5.7b. Copyright 1997-99 Pavel Kouznetsov. +// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html +// Decompiler options: packimports(3) +// Source File Name: SphereEditor.java + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.event.*; + +class KleinEditor extends BiparamEditor implements ActionListener, ObjectUI +{ + KleinEditor(Klein inSph, GroupEditor callee) + { + super(inSph, callee); // false); + //objEditor = new BiparamEditor(inSph, this, callee); // false); + objEditor = callee.GetEditor(); + //parent = this; + klein = inSph; + + SetupUI2(objEditor); + } + + KleinEditor(Klein inSph, Object3D copy, GroupEditor callee) + { + super(inSph, copy, null, callee); // false); + //objEditor = new BiparamEditor(inSph, copy, this, callee); // false); + //parent = this; + objEditor = this; + klein = (Klein) copy; + + //SetupUI(objEditor); + } + + void SetupUI2(ObjEditor oe) + { + super.SetupUI2(oe); + + radiusField = AddSlider(oe.ctrlPanel, "Radius:", 0, 20.0, klein.radius, 1); + Return(); + } + + void Clear() + { + objEditor.Clear(); + + klein = null; + } + + /* + public void doLayout() + { + super.doLayout(); + labelAndField(centerLabel, centerField); + labelAndField(radiusLabel, radiusField); + widgetPos += 5; + } + */ + + /**/ +// public void actionPerformed(ActionEvent e) +// { +// if (e.getSource() == centerField || +// e.getSource() == radiusField) +// { +// applySelf(); +// refreshContents(); +// } +// else +// super.actionPerformed(e); +// } + /**/ + + public void stateChanged(ChangeEvent e) + { + //System.out.println("Klein :: stateChanged"); + if (e.getSource() == radiusField) + { + applySelf(); + //super.applySelf(); + objEditor.refreshContents(); + //Refresh(); + } + else + super.stateChanged(e); + } + + public void applySelf() + { + super.applySelf(); + + klein.radius = radiusField.getFloat(); + klein.recalculate(); + } + + Klein klein; + NumberSlider radiusField; + + public ObjEditor GetEditor() + { + //new Exception().printStackTrace(); + return objEditor; // .GetEditor(); + } + + public void closeUI2() + { + objEditor.closeUI(); + } + + public void closeUI() + { + Remove(radiusField); + + super.closeUI(); + } + + void refreshContents2() + { + objEditor.refreshContents(); + } + + //BiparamEditor objEditor; +} diff --git a/Mocap.java b/Mocap.java index 8af85a4..99ef9dc 100644 --- a/Mocap.java +++ b/Mocap.java @@ -2854,6 +2854,7 @@ if (lastframetest == 0) lastframetest = bvh.animation.getNumFrames(); + // WARNING: RESET DESTROYS EVERYTHING if (baseframe >= lastframetest) // july 2013 // - GetFirstFrame()) { System.out.println("MOCAP reset: " + this.GetFileRoot() + diff --git a/ObjEditor.java b/ObjEditor.java index 228f57c..1140321 100644 --- a/ObjEditor.java +++ b/ObjEditor.java @@ -1859,19 +1859,21 @@ } // Images/textures - if (textures - && (filename.toLowerCase().endsWith(".jpg") - || filename.toLowerCase().endsWith(".jpeg") - || filename.toLowerCase().endsWith(".gif") - || filename.toLowerCase().endsWith(".png") - || filename.toLowerCase().endsWith(".tre") - || filename.toLowerCase().endsWith(".bmp") - || filename.toLowerCase().endsWith(".tga") - || filename.toLowerCase().endsWith(".sgi") - || filename.toLowerCase().endsWith(".tif") - || filename.toLowerCase().endsWith(".tiff"))) + if (filename.toLowerCase().endsWith(".jpg") + || filename.toLowerCase().endsWith(".jpeg") + || filename.toLowerCase().endsWith(".gif") + || filename.toLowerCase().endsWith(".png") + || filename.toLowerCase().endsWith(".tre") + || filename.toLowerCase().endsWith(".bmp") + || filename.toLowerCase().endsWith(".tga") + || filename.toLowerCase().endsWith(".sgi") + || filename.toLowerCase().endsWith(".tif") + || filename.toLowerCase().endsWith(".tiff")) { - DropTexture(filename); + if (textures) + DropTexture(filename); + else + CreateBillboard(filename); continue; } @@ -1882,6 +1884,60 @@ ResetModel(); } + void CreateBillboard(String filename) + { + Object3D source = null; + Object3D group = copy; + + if (group.selection.size() > 0) + { + source = group.selection.get(0); + } + + Grid grid = new Grid(1,1); + grid.material = null; + + grid.toParent = LA.newMatrix(); + grid.fromParent = LA.newMatrix(); + LA.matYRotate(grid.toParent, Math.PI/2); + LA.matXRotate(grid.toParent, -Math.PI/2); + LA.matXRotate(grid.fromParent, Math.PI/2); + LA.matYRotate(grid.fromParent, -Math.PI/2); + + BillboardNode bb = new BillboardNode(); + bb.addChild(grid); + + Object3D newgroup = new Object3D(); + newgroup.CreateMaterial(); + + File file = new File(filename); + newgroup.name = file.getName(); + newgroup.addChild(bb); + + Object3D main = newgroup; + + main.SetPigmentTexture(filename); + + if (source != null) + { + main.material = new cMaterial(source.material); + if (main.projectedVertices.length < source.projectedVertices.length) + { + main.projectedVertices = new Object3D.cVector2[source.projectedVertices.length]; + } + + for (int i=0; i<source.projectedVertices.length; i++) + { + main.projectedVertices[i].x = source.projectedVertices[i].x; + main.projectedVertices[i].y = source.projectedVertices[i].y; + } + + main.texres = source.texres; + } + + makeSomething(newgroup, false); + } + Point location; void DropTexture(String filename) diff --git a/Object3D.java b/Object3D.java index ebab7df..f6cf69b 100644 --- a/Object3D.java +++ b/Object3D.java @@ -355,7 +355,7 @@ int MemorySize() { - if (memorysize == 0) + if (true) // memorysize == 0) { try { @@ -1446,7 +1446,16 @@ // if (other == null) // return; - System.out.println("Link support this = " + this + "; other = " + other); + if (other != null) + { + BoundaryRep.SEUIL = other.material.cameralight; + + // Set default to 0.1 + BoundaryRep.SEUIL /= 2; + System.out.println("SEUIL = " + BoundaryRep.SEUIL); + } + + System.out.println("Link this = " + this + "; support = " + other); //if (bRep != null) // bRep.linkVerticesThis(other.bRep); @@ -1816,8 +1825,9 @@ if (obj.name == null) continue; // can't be a null one - //if (n.contains(obj.name)) // dec 2013 name.split(":")[0])) // Poser generates a count - if (n.startsWith(obj.name)) + String name = obj.name.split(":")[0]; // Poser generates a count + //if (n.startsWith(obj.name)) + if (n.contains(name)) { theobj = obj; count++; @@ -2732,6 +2742,24 @@ blockloop = false; } + void GenNormalsMINE() + { + if (blockloop) + return; + + blockloop = true; + GenNormalsMINE0(); + for (int i = 0; i < Children().Size(); i++) + { + Object3D child = (Object3D) Children().get(i); // reserve(i); + if (child == null) + continue; + child.GenNormalsMINE(); +// Children().release(i); + } + blockloop = false; + } + void ClearColors() { if (blockloop) @@ -2876,6 +2904,15 @@ if (bRep != null) { bRep.GenerateNormals(crease); + Touch(); + } + } + + void GenNormalsMINE0() + { + if (bRep != null) + { + bRep.GenerateNormalsMINE(); Touch(); } } @@ -4111,7 +4148,7 @@ if (blockloop) return; - for (int i=0; i<size(); i++) + for (int i=0; i<Size(); i++) { if (get(i).parent != this) { @@ -7733,7 +7770,7 @@ if (parent == null) { System.out.println("NULL PARENT"); - new Exception().printStackTrace(); + //new Exception().printStackTrace(); } else { if (parent instanceof BezierPatch) diff --git a/cMesh.java b/cMesh.java index af52c25..942d155 100644 --- a/cMesh.java +++ b/cMesh.java @@ -355,7 +355,9 @@ // DynamicNode handle = new DynamicNode(center.x, center.y, center.z, 0 /*0 , 1 or Float.MAX_VALUE*/, 0); // Phys.addHandle(handle); - for (int k=Phys.allNodes.size(); --k>=0;) // warning: "add handle" adds a node + int size = Phys.allNodes.size(); + + for (int k=0; k < size; k++) // warning: "add handle" adds a node { DynamicNode dn = Phys.allNodes.get(k); DynamicNode handle = new DynamicNode(dn.position.x, dn.position.y, dn.position.z, 0 /*0 , 1 or Float.MAX_VALUE*/, 0); diff --git a/cSpring.java b/cSpring.java index 6bebd0f..2986693 100644 --- a/cSpring.java +++ b/cSpring.java @@ -1057,7 +1057,7 @@ vect1.set(v); LA.xformPos(vect1,toRoot,vect1); - handles.get(usedrep.VertexCount()-1-i).set(vect1); + handles.get(i).set(vect1); } } @@ -2325,6 +2325,7 @@ abstract Point3D forceOn(DynamicNode N); } + Point3D force = new Point3D(); Point3D dir = new Point3D(); -- Gitblit v1.6.2