From cb37a129d1adb403019c96e798e86e2da9667f15 Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Sun, 17 Nov 2019 17:56:04 -0500 Subject: [PATCH] Maze --- Object3D.java | 1431 +++++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 1,142 insertions(+), 289 deletions(-) diff --git a/Object3D.java b/Object3D.java index 1b9b4c0..bcefc4f 100644 --- a/Object3D.java +++ b/Object3D.java @@ -22,18 +22,129 @@ //static final long serialVersionUID = -607422624994562685L; static final long serialVersionUID = 5022536242724664900L; + // Use GetUUID for backward compatibility with null. private UUID uuid = UUID.randomUUID(); - // TEMPORARY for mocap undo. No need to be transient. + // TEMPORARY for versions. No need to be transient. mocap.reader.BVHReader.BVHResult savebvh; Object3D saveskeleton; + + // FileObject + Object3D savefilecontent; // - byte[] versions[]; + String skyboxname; + String skyboxext; + + Object3D[] versionlist; int versionindex = -1; + java.util.Hashtable<java.util.UUID, Object3D> versiontable; // = new java.util.Hashtable<java.util.UUID, Object3D>(); + + transient int tabIndex; // Tabs can change between sessions. + ScriptNode scriptnode; + void GetOrigin(cVector o) + { + o.x = this.toParent[3][0]; + o.y = this.toParent[3][1]; + o.z = this.toParent[3][2]; + } + + void SetOrigin(cVector o) + { + this.toParent[3][0] = o.x; + this.toParent[3][1] = o.y; + this.toParent[3][2] = o.z; + } + + void deepCopyNode(Object3D other) + { + other.skyboxname = skyboxname; + other.skyboxext = skyboxext; + + if (toParent != null) + { + other.toParent = LA.newMatrix(); + other.fromParent = LA.newMatrix(); + LA.matCopy(toParent, other.toParent); + LA.matCopy(fromParent, other.fromParent); + if (toParentMarked != null) + { + other.toParentMarked = LA.newMatrix(); + other.fromParentMarked = LA.newMatrix(); + LA.matCopy(toParentMarked, other.toParentMarked); + LA.matCopy(fromParentMarked, other.fromParentMarked); + } + } + else + { + if (other.toParent == null) +// assert(other.toParent == null); +// new Exception().printStackTrace(); + System.err.println("null parent: " + other); + } + + /* + double ident[][] = LA.newMatrix(); + if (bRep == null) + other.bRep = null; + else + other.bRep = new BoundaryRep(bRep, ident); + */ + // Really new... + //other.editWindow = null; + if (name == null) + other.name = null; + else + other.name = new String(name); + + if (material != null) + { + other.material = new cMaterial(material); + } else + { + other.material = null; + } + + other.GetTextures().name = GetTextures().name; + + CopyExtraMaterial(other); + + other.touched = touched; + other.softtouched = softtouched; + + other.random = random; + other.link2master = Link2Support(); + other.transformcount = transformcount; + other.marked = marked; + other.skip = skip; + other.count = count; + other.flipV = flipV; + other.live = live; + other.rewind = rewind; + other.hide = hide; + other.texres = texres; + other.speedup = speedup; + other.height = height; + other.depth = depth; + } + + int VersionCount() + { + int count = 0; + + if (versionlist != null) + for (int i = versionlist.length; --i >= 0;) + { + if (versionlist[i] != null) + count++; + } + + return count; + } + void InitOthers() { if (projectedVertices == null || projectedVertices.length <= 2) @@ -45,6 +156,7 @@ projectedVertices[i] = new cVector2(); // Others } projectedVertices[0].x = 100; // bump + projectedVertices[1].y = 1000; // punchthrough. only for png } void MinMax(cVector minima, cVector maxima) @@ -124,7 +236,7 @@ return; transientsupport = support; - transientlink2master = link2master; + transientlink2master = Link2Support(); support = null; link2master = false; @@ -171,9 +283,42 @@ } } + boolean HasBigData() + { + if (blockloop) + return false; + + if (bRep != null) + { + return true; + } + + blockloop = true; + + for (int i = 0; i < Size(); i++) + { + Object3D child = (Object3D) get(i); + if (child == null) + continue; + if (child.HasBigData()) + { + blockloop = false; + return true; + } + } + + blockloop = false; + return false; + } + void ExtractBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable) { + if (blockloop) + return; + Object3D o; + + boolean isnew = false; if (hashtable.containsKey(GetUUID())) { @@ -187,12 +332,14 @@ } else { + isnew = true; + o = new Object3D("copy of " + this.name); hashtable.put(GetUUID(), o); } - if (!blockloop) + //if (!blockloop) { blockloop = true; @@ -203,12 +350,15 @@ blockloop = false; } - - ExtractBigData(o); + + //if (isnew) + ExtractBigData(o); } void ExtractBigData(Object3D o) { + //System.err.println("ExtractBigData : " + this + " --> " + o); + if (o.bRep != null) Grafreed.Assert(o.bRep == this.bRep); @@ -219,8 +369,8 @@ // o.bRep.support = null; // } o.selection = this.selection; - o.versions = this.versions; - o.versionindex = this.versionindex; + //o.versionlist = this.versionlist; + //o.versionindex = this.versionindex; if (this.support != null) { @@ -243,17 +393,84 @@ // this.fileparent = null; } +// Object3D GetObject(java.util.UUID uuid) +// { +// if (this.uuid.equals(uuid)) +// return this; +// +// if (blockloop) +// return null; +// +// blockloop = true; +// +// for (int i=0; i<Size(); i++) +// { +// Object3D o = get(i).GetObject(uuid); +// +// if (o != null) +// return o; +// } +// +// blockloop = false; +// +// return null; +// } + + transient boolean tag; + + void TagObjects(Object3D o, boolean tag) + { + if (blockloop) + return; + + o.tag = tag; + + if (o == this) + return; + + blockloop = true; + + for (int i=0; i<Size(); i++) + { + get(i).TagObjects(o, tag); + } + + blockloop = false; + } + + boolean HasTags() + { + if (blockloop) + return false; + + blockloop = true; + + boolean hasTags = false; + + for (int i=0; i<Size(); i++) + { + hasTags |= get(i).tag || get(i).HasTags(); + + if (hasTags) + break; + } + + blockloop = false; + + return hasTags; + } + void RestoreBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable) { + if (blockloop) + return; + if (!hashtable.containsKey(GetUUID())) return; Object3D o = hashtable.get(GetUUID()); RestoreBigData(o); - - if (blockloop) - return; blockloop = true; @@ -269,6 +486,9 @@ void RestoreBigData(Object3D o) { + //System.err.println("RestoreBigData : " + this + " <-- " + o); + Grafreed.Assert(this.bRep == null); + this.bRep = o.bRep; if (this.support != null && o.transientrep != null) { @@ -277,8 +497,8 @@ this.selection = o.selection; - this.versions = o.versions; - this.versionindex = o.versionindex; + //this.versionlist = o.versionlist; + //this.versionindex = o.versionindex; // July 2019 if (this.bRep != null) // this.bRep.support = o.transientrep; // this.support = o.support; @@ -429,7 +649,10 @@ transient boolean keepdontselect; boolean dontselect = false; boolean hide = false; - boolean link2master = false; // performs reset support/master at each frame + + boolean link2master = false; // performs reset support/master at each frame (cannot rename due to serialization) + boolean link2support = false; // (cannot rename due to serialization) + boolean marked = false; // animation node boolean skip = false; // centroid issue boolean skipmocap = false; // mocap data @@ -437,6 +660,9 @@ boolean random = false; boolean speedup = false; boolean rewind = false; + + // Option to sort triangles, e.g. for transparency. + boolean sort = false; float NORMALPUSH = 0; @@ -447,27 +673,74 @@ return this; } + class SizeCompare implements Comparable + { + int size; + Object3D child; + + SizeCompare(Object3D c) + { + child = c; + size = c.MemorySize(); + } + + public int compareTo(Object o) + { + SizeCompare comp = (SizeCompare) o; + + return comp.size < size ? 1 : -1; + } + } + + transient SizeCompare[] sizecompare = null; + void SortBySize() { - boolean sorted = false; +// boolean sorted = false; +// +// while (!sorted) +// { +// sorted = true; +// +// for (int i=0; i<Size()-1; i++) +// { +// Object3D obji = get(i); +// Object3D objj = get(i+1); +// +// if (obji.MemorySize() < objj.MemorySize()) +// { +// set(i, objj); +// set(i+1, obji); +// +// sorted = false; +// } +// } +// } + + int count = Size(); - while (!sorted) + if (sizecompare == null || sizecompare.length != count) { - sorted = true; - - for (int i=0; i<size()-1; i++) + sizecompare = new SizeCompare[count]; + + for (int k=0; k<count; k++) { - Object3D obji = get(i); - Object3D objj = get(i+1); - - if (obji.MemorySize() < objj.MemorySize()) - { - set(i, objj); - set(i+1, obji); - - sorted = false; - } + sizecompare[k] = new SizeCompare(get(k)); } + } + else + { + for (int k=0; k<count; k++) + { + sizecompare[k].size = get(k).MemorySize(); + } + } + + java.util.Arrays.sort(sizecompare); + + for (int i=0; i<count; i++) + { + set(i, sizecompare[i].child); } } @@ -479,7 +752,7 @@ { sorted = true; - for (int i=0; i<size()-1; i++) + for (int i=0; i<Size()-1; i++) { Object3D obji = get(i); Object3D objj = get(i+1); @@ -495,38 +768,63 @@ } } - int memorysize; + transient int memorysize; // needs to be transient, dunno why int MemorySize() { - if (true) // memorysize == 0) +// if (memorysize == 0) +// { +// try +// { +// Object3D obj = this; +// +// Object3D parent = obj.parent; +// obj.parent = null; +// Object3D support = obj.support; +// obj.support = null; +// +// java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); +// java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(baos); +// +// out.writeObject(obj); +// +// obj.parent = parent; +// obj.support = support; +// +// memorysize = baos.toByteArray().length; +// } +// catch (Exception e) +// { +// e.printStackTrace(); +// } +// } +// +// return memorysize; + + if (blockloop) { - try - { - Object3D obj = this; + return 0; + } - Object3D parent = obj.parent; - obj.parent = null; - Object3D support = obj.support; - obj.support = null; - - java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); - java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(baos); - - out.writeObject(obj); - - obj.parent = parent; - obj.support = support; - - memorysize = baos.toByteArray().length; - } - catch (Exception e) - { - e.printStackTrace(); - } + int memory = 0; + + if (bRep != null) + { + memory = bRep.VertexCount(); } - return memorysize; + blockloop = true; + + for (int i = 0; i < Size(); i++) + { + Object3D obj = (Object3D) Children().get(i); + + memory += obj.MemorySize(); + } + + blockloop = false; + + return memory; } void Slower() @@ -614,7 +912,7 @@ { if (maxcount != 1) { - new Exception().printStackTrace(); + //new Exception().printStackTrace(); } toParentMarked = LA.newMatrix(); @@ -816,7 +1114,7 @@ void Step() { - // marde pour serialization de Texture + // patch pour serialization de Texture resetmaxcount(); resettransformcount(); resetstep(); @@ -851,7 +1149,7 @@ transformcount++; } - int maxcount; + int maxcount = 128; int transformcount; int step; @@ -904,7 +1202,10 @@ if (step == 0) step = 1; if (maxcount == 0) - maxcount = 128; // 2048; // 4; + { + System.out.println("maxcount == 0"); + System.exit(0); // maxcount = 128; // 2048; // 4; + } // if (acceleration == 0) // acceleration = 10; if (delay == 0) // serial @@ -930,6 +1231,8 @@ (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || !Globals.COMPUTESHADOWWHENLIVE) && currentframe != Globals.framecount) { + Globals.lighttouched = true; + currentframe = Globals.framecount; // System.err.println("transformcount = " + transformcount); @@ -1009,21 +1312,28 @@ { // return true; - if (material == null || material.multiply) - return true; +// if (material == null || material.multiply) +// return true; +// +// if (projectedVertices != null && projectedVertices.length > 2 && projectedVertices[2].y >= 10000) +// return false; +// +// // Transparent objects are dynamic because we have to sort the triangles. +// return material.opacity > 0.99; - // Transparent objects are dynamic because we have to sort the triangles. - return material.opacity > 0.99; + return !sort; } boolean IsOpaque() { // return true; - if (material == null || material.multiply) - return true; +// if (material == null || material.multiply) +// return true; +// +// return material.opacity > 0.99; - return material.opacity > 0.99; + return !sort; } Object3D() @@ -1101,8 +1411,10 @@ // will share the geometry assert (!(this instanceof Composite)); - return deepCopy(); // Never called for Composite - + + Object3D obj = deepCopy(); // Never called for Composite + obj.count = 2; + return obj; } boolean HasLoops() @@ -1110,6 +1422,30 @@ return false; } + void ResetUUIDs() + { + if (blockloop) + { + return; + } + + this.uuid = null; + + blockloop = true; + + for (int i = 0; i < Size(); i++) + { + Object3D obj = (Object3D) Children().get(i); + + if (obj != null) + { + obj.ResetUUIDs(); + } + } + + blockloop = false; + } + boolean IsInfinite() { if (blockloop) @@ -1180,78 +1516,16 @@ return; blockloop = true; + + // other.parent = parent; + //System.out.println("COPY " + this + " to " + other); //new Exception().printStackTrace(); + deepCopyNode(other); - other.parent = parent; - if (toParent != null) - { - other.toParent = LA.newMatrix(); - other.fromParent = LA.newMatrix(); - LA.matCopy(toParent, other.toParent); - LA.matCopy(fromParent, other.fromParent); - if (toParentMarked != null) - { - other.toParentMarked = LA.newMatrix(); - other.fromParentMarked = LA.newMatrix(); - LA.matCopy(toParentMarked, other.toParentMarked); - LA.matCopy(fromParentMarked, other.fromParentMarked); - } - } - else - { - if (other.toParent == null) -// assert(other.toParent == null); -// new Exception().printStackTrace(); - System.err.println("null parent: " + other); - } - /* - double ident[][] = LA.newMatrix(); - if (bRep == null) - other.bRep = null; - else - other.bRep = new BoundaryRep(bRep, ident); - */ - // Really new... other.bRep = bRep; // Share the geometry other.support = support; // Share the support - - //other.editWindow = null; - if (name == null) - other.name = null; - else - other.name = new String(name); - - if (material != null) - { - other.material = new cMaterial(material); - } else - { - other.material = null; - } - - other.GetTextures().name = GetTextures().name; - - CopyExtraMaterial(other); - - other.touched = touched; - other.softtouched = softtouched; - - other.random = random; - other.link2master = link2master; - other.transformcount = transformcount; - other.marked = marked; - other.skip = skip; - other.count = count; - other.flipV = flipV; - other.live = live; - other.rewind = rewind; - other.hide = hide; - other.texres = texres; - other.speedup = speedup; - other.height = height; - other.depth = depth; // aout 2013 if (/*displaylist != -1 &&*/other.displaylist != displaylist) // { @@ -1279,7 +1553,7 @@ Object3D obj = (Object3D)Children().get(i); if (IsContainedIn(obj)) { -// assert(false); // ?!?!?!?!?! + assert(false); // ?!?!?!?!?! c.Children().setElementAt(c, i); } else @@ -1307,17 +1581,24 @@ if ((mask & GEOMETRY) != 0) { if (bRep != null) - bRep.overwriteThis(other.bRep==null?other.transientrep:other.bRep); - else - assert(other.bRep == null); - - if (bRep != null) { + bRep.overwriteThis(other.bRep==null?other.transientrep:other.bRep); CameraPane.RemoveList(bRep.displaylist); bRep.displaylist = 0; // june 2013 -1; } else - bRep = bRep; + { + //assert(other.bRep == null); + bRep = other.bRep; + } + +// if (bRep != null) +// { +// CameraPane.RemoveList(bRep.displaylist); +// bRep.displaylist = 0; // june 2013 -1; +// } +// else +// bRep = bRep; } /* Use a MASK = GEO/MAT @@ -2293,11 +2574,6 @@ InitOthers(); - if (this instanceof Camera) - { - material.shift = 90; - } - material.multiply = multiply; if (multiply) @@ -2375,7 +2651,7 @@ return b; } - void UpdateMaterial(cMaterial anchor, cMaterial current, boolean propagate) + void UpdateMaterial(cMaterial anchor, cMaterial current, boolean propagate, boolean colorparallax) { if (blockloop) { @@ -2385,7 +2661,7 @@ // super.UpdateMaterial(anchor, current, false); if (material != null) { - material.UpdateMaterial(anchor, current); + material.UpdateMaterial(anchor, current, colorparallax); } if (!propagate) @@ -2399,7 +2675,7 @@ if (child == null) continue; blockloop = true; - child.UpdateMaterial(anchor, current, propagate); + child.UpdateMaterial(anchor, current, propagate, false); blockloop = false; Children().release(i); } @@ -2413,7 +2689,7 @@ if (child == null) continue; blockloop = true; - child.UpdateMaterial(anchor, current, propagate); + child.UpdateMaterial(anchor, current, propagate, false); blockloop = false; Children().release(i); } @@ -2438,6 +2714,11 @@ else { //((ObjEditor)editWindow).SetupUI2(null); + if (objectUI != null) + ((ObjEditor)objectUI).pinButton.setSelected(pinned); + else + //new Exception().printStackTrace(); + System.err.println("objectUI is null"); } } @@ -2567,7 +2848,8 @@ private static final int editSelf = 1; private static final int editChild = 2; - void drawEditHandles(ClickInfo info, int level) + void drawEditHandles(//ClickInfo info, + int level) { if (level == 0) { @@ -2575,7 +2857,8 @@ return; Object3D selectee; - for (java.util.Enumeration e = selection.elements(); e.hasMoreElements(); selectee.drawEditHandles(info, level + 1)) + for (java.util.Enumeration e = selection.elements(); e.hasMoreElements(); selectee.drawEditHandles(//info, + level + 1)) { selectee = (Object3D) e.nextElement(); } @@ -2583,19 +2866,22 @@ } else { //super. - drawEditHandles0(info, level + 1); + drawEditHandles0(//info, + level + 1); } } - boolean doEditClick(ClickInfo info, int level) + boolean doEditClick(//ClickInfo info, + int level) { doSomething = 0; if (level == 0) { - return doParentClick(info); + return doParentClick(); //info); } if (//super. - doEditClick0(info, level)) + doEditClick0(//info, + level)) { doSomething = 1; return true; @@ -2605,7 +2891,7 @@ } } - boolean doParentClick(ClickInfo info) + boolean doParentClick() //ClickInfo info) { if (selection == null) { @@ -2618,7 +2904,8 @@ for (java.util.Enumeration e = selection.elements(); e.hasMoreElements();) { Object3D selectee = (Object3D) e.nextElement(); - if (selectee.doEditClick(info, 1)) + if (selectee.doEditClick(//info, + 1)) { childToDrag = selectee; doSomething = 2; @@ -2630,13 +2917,15 @@ return retval; } - void doEditDrag(ClickInfo info, boolean opposite) + void doEditDrag(//ClickInfo clickInfo, + boolean opposite) { switch (doSomething) { case 1: // '\001' //super. - doEditDrag0(info, opposite); + doEditDrag0(//clickInfo, + opposite); break; case 2: // '\002' @@ -2649,11 +2938,13 @@ { //sel.hitSomething = childToDrag.hitSomething; //childToDrag.doEditDrag(info); - sel.doEditDrag(info, opposite); + sel.doEditDrag(//clickInfo, + opposite); } else { //super. - doEditDrag0(info, opposite); + doEditDrag0(//clickInfo, + opposite); } } break; @@ -2671,6 +2962,9 @@ { deselectAll(); } + + new Exception().printStackTrace(); + ClickInfo newInfo = new ClickInfo(); newInfo.flags = info.flags; newInfo.bounds = info.bounds; @@ -3100,7 +3394,10 @@ { if (bRep != null) { + //bRep.GenerateNormals2(crease); // in-place doesn't work. it gives wrong normals (diamond artifact). bRep.GenerateNormals(crease); + if (!bRep.trimmed) + bRep.MergeNormals(); Touch(); } } @@ -3175,6 +3472,105 @@ blockloop = false; } + public void ResetTransform(int mask) + { + Object3D obj = this; + + if (mask == -1) + { + if (obj instanceof Camera) // jan 2014 + { + LA.matIdentity(obj.toParent); + LA.matIdentity(obj.fromParent); + } + else + { + obj.toParent = null; // jan 2014 LA.matIdentity(obj.toParent); + obj.fromParent = null; // LA.matIdentity(obj.fromParent); + } + return; + } + + if ((mask&2) != 0) // Scale/rotation + { + obj.toParent[0][0] = obj.toParent[1][1] = obj.toParent[2][2] = 1; + obj.toParent[0][1] = obj.toParent[1][0] = obj.toParent[2][0] = 0; + obj.toParent[0][2] = obj.toParent[1][2] = obj.toParent[2][1] = 0; + obj.fromParent[0][0] = obj.fromParent[1][1] = obj.fromParent[2][2] = 1; + obj.fromParent[0][1] = obj.fromParent[1][0] = obj.fromParent[2][0] = 0; + obj.fromParent[0][2] = obj.fromParent[1][2] = obj.fromParent[2][1] = 0; + } + if ((mask&1) != 0) // Translation + { + if (obj.toParent != null) + { + obj.toParent[3][0] = obj.toParent[3][1] = obj.toParent[3][2] = 0; + obj.fromParent[3][0] = obj.fromParent[3][1] = obj.fromParent[3][2] = 0; + } + } + } + + public void Scale(float scale) + { + Object3D obj = this; + + obj.toParent[0][0] = obj.toParent[1][1] = obj.toParent[2][2] = scale; + obj.toParent[0][1] = obj.toParent[1][0] = obj.toParent[2][0] = 0; + obj.toParent[0][2] = obj.toParent[1][2] = obj.toParent[2][1] = 0; + obj.fromParent[0][0] = obj.fromParent[1][1] = obj.fromParent[2][2] = 1/scale; + obj.fromParent[0][1] = obj.fromParent[1][0] = obj.fromParent[2][0] = 0; + obj.fromParent[0][2] = obj.fromParent[1][2] = obj.fromParent[2][1] = 0; + } + + public void TextureRatioTransform(int axis) + { + cTexture tex = GetTextures(); + + com.sun.opengl.util.texture.TextureData texturedata = null; + + try + { + texturedata = Globals.theRenderer.GetTextureData(tex, false, texres); + } + catch (Exception e) + { + System.err.println("FAIL TextureRatio: " + this); + } + + LA.matIdentity(Object3D.mat); + Object3D.mat[axis][axis] = (double)texturedata.getWidth() / texturedata.getHeight(); + + if (toParent == null) + { + toParent = LA.newMatrix(); + fromParent = LA.newMatrix(); + } + + ResetTransform(2); + + LA.matConcat(Object3D.mat, fromParent, fromParent); + LA.matInvert(fromParent, toParent); + } + + void TextureRatio(int axis) + { + if (blockloop) + return; + + blockloop = true; + + TextureRatioTransform(axis); + + for (int i=Size(); --i>=0;) + { + Object3D v = get(i); + + v.TextureRatio(axis); + } + + blockloop = false; + } + void TransformChildren() { if (toParent != null) @@ -3417,6 +3813,7 @@ if (bRep != null) { //bRep.RemoveOneTriangle(); + System.out.println(); System.out.println("Reducing " + this); if (name != null && name.contains("lockpickstraps")) name = name; @@ -3528,15 +3925,47 @@ void ClearMaterials() { + if (blockloop) + return; + + blockloop = true; + ClearMaterial(); - for (int i = 0; i < size(); i++) + for (int i = 0; i < Size(); i++) { - Object3D child = (Object3D) reserve(i); + Object3D child = (Object3D) get(i); if (child == null) continue; child.ClearMaterials(); - release(i); } + + blockloop = false; + } + + void ClearVersionList() + { + this.versionlist = null; + this.versionindex = -1; + this.versiontable = null; + } + + void ClearVersions() + { + if (blockloop) + return; + + blockloop = true; + + ClearVersionList(); + for (int i = 0; i < Size(); i++) + { + Object3D child = (Object3D) get(i); + if (child == null) + continue; + child.ClearVersions(); + } + + blockloop = false; } void FlipV(boolean flip) @@ -3715,6 +4144,7 @@ void RevertMeshes() { + // BLOCKLOOP if (this instanceof cMesh) { ((cMesh)this).Revert(); @@ -3745,11 +4175,6 @@ Touch(); } - ResetRecur(); - } - - void ResetRecur() - { for (int i = 0; i < size(); i++) { Object3D child = (Object3D) get(i); // reserve(i); @@ -3772,11 +4197,6 @@ Step(); Touch(); - StepRecur(); - } - - void StepRecur() - { for (int i = 0; i < size(); i++) { Object3D child = (Object3D) get(i); // reserve(i); @@ -3963,8 +4383,8 @@ Touch(); } - transient cVector min = new cVector(); - transient cVector max = new cVector(); + transient cVector min; + transient cVector max; void getBounds(cVector minima, cVector maxima, boolean xform) { @@ -3980,15 +4400,15 @@ if (blockloop) return; - if (min == null) // ??? + if (min == null) { min = new cVector(); max = new cVector(); } - for (int i = 0; i<size(); i++) + for (int i = 0; i<Size(); i++) { - Object3D child = (Object3D) reserve(i); + Object3D child = (Object3D) get(i); //reserve(i); if (child == null) continue; @@ -4007,21 +4427,21 @@ if (child.hide && !(child instanceof Merge) || child.skip) //if (child.hide) { - release(i); + //release(i); continue; } blockloop = true; child.getBounds(min, max, true); // xform); blockloop = false; - release(i); + //release(i); MinMax(minima, maxima); } if (bRep != null) { - bRep.getBounds(minima,maxima,this); + bRep.getBounds(minima, maxima, xform?this:null); } if (false) // xform) @@ -5294,8 +5714,9 @@ { } // transient int displaylist = 0; // -1; - transient boolean touched = true; - transient boolean softtouched = true; + transient boolean reset = false; // Recalculate + transient boolean touched = true; // call list only + transient boolean softtouched = true; // aucune idee void Touch() { @@ -5348,6 +5769,7 @@ { //System.out.println("HardTouch " + this); // new Exception().printStackTrace(); //new Exception().printStackTrace(); + reset = true; touched = true; CameraPane.touched = true; //if (parent != null) @@ -5526,6 +5948,11 @@ if (fullname == null) return ""; + if (fullname.pigment != null) + { + return fullname.pigment; + } + // System.out.println("Fullname = " + fullname); // Does not work on Windows due to C: @@ -5538,7 +5965,7 @@ if (split.length == 0) { - return ""; + return fullname.pigment = ""; } if (split.length <= 2) @@ -5546,22 +5973,27 @@ if (fullname.name.endsWith(":")) { // Windows - return fullname.name.substring(0, fullname.name.length()-1); + return fullname.pigment = fullname.name.substring(0, fullname.name.length()-1); } - return split[0]; + return fullname.pigment = split[0]; } // Windows assert(split.length == 4); - return split[0] + ":" + split[1]; + return fullname.pigment = split[0] + ":" + split[1]; } static String GetBump(cTexture fullname) { if (fullname == null) return ""; + + if (fullname.bump != null) + { + return fullname.bump; + } // System.out.println("Fullname = " + fullname); // Does not work on Windows due to C: @@ -5573,12 +6005,12 @@ if (split.length == 0) { - return ""; + return fullname.bump = ""; } if (split.length == 1) { - return ""; + return fullname.bump = ""; } if (split.length == 2) @@ -5586,16 +6018,16 @@ if (fullname.name.endsWith(":")) { // Windows - return ""; + return fullname.bump = ""; } - return split[1]; + return fullname.bump = split[1]; } // Windows assert(split.length == 4); - return split[2] + ":" + split[3]; + return fullname.bump = split[2] + ":" + split[3]; } String GetPigmentTexture() @@ -5678,6 +6110,9 @@ texname = ""; GetTextures().name = texname + ":" + GetBump(GetTextures()); + + GetTextures().pigment = null; + Touch(); } @@ -5751,6 +6186,8 @@ GetTextures().name = Object3D.GetPigment(GetTextures()) + ":" + texname; + GetTextures().bump = null; + Touch(); } @@ -5815,7 +6252,7 @@ boolean NeedSupport() { return - CameraPane.SUPPORT && (!CameraPane.movingcamera || (!Globals.FREEZEONMOVE && Globals.isLIVE())) && link2master && /*live &&*/ support != null + CameraPane.SUPPORT && (!CameraPane.movingcamera || (!Globals.FREEZEONMOVE && Globals.isLIVE())) && Link2Support() && /*live &&*/ support != null // PROBLEM with CROWD!! && (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || Globals.CROWD); } @@ -5833,6 +6270,22 @@ return parent.IsLive(); } + boolean IsDynamic() + { + return live && bRep != null; + } + + boolean Link2Support() + { + return link2master || link2support; + } + + static cVector minima = new cVector(); + static cVector maxima = new cVector(); + static javax.vecmath.Point3d center = new javax.vecmath.Point3d(); + + boolean compiling; + void Draw(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { Invariants(); // june 2013 @@ -5840,6 +6293,29 @@ if (support != null) { // System.err.println("Draw " + this + " Frame # " + ((Mocap)((Merge)support).object).frame); + } + + if (false) // live && Link2Support() && support == null && !this.marked) // project on ground + { + getBounds(minima, maxima, true); + center.x = (minima.x + maxima.x) / 2; + center.y = 10000; // (minima.y + maxima.y) / 2; + center.z = (minima.z + maxima.z) / 2; + + Ray ray = new Ray(center, new Vector3d(0,-1,0)); + + IntersectResult res = new IntersectResult(); + res.t = Double.POSITIVE_INFINITY; + + if (Grafreed.grafreed.universe.intersect(ray, res)) + { + double resx = ray.eyePoint.x + ray.viewDirection.x * res.t; + double resy = ray.eyePoint.y + ray.viewDirection.y * res.t; + double resz = ray.eyePoint.z + ray.viewDirection.z * res.t; + + LA.matTranslate(toParent, 0, resy - minima.y, 0); + LA.matInvert(toParent, fromParent); + } } if (display.DrawMode() == iCameraPane.SELECTION && @@ -5893,8 +6369,12 @@ if (support != null) support = support; - //boolean usecalllists = IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null || !link2master); // !(this instanceof cSpring) && !(this instanceof BezierPatch); - boolean usecalllists = !IsLive(); // IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null) && !link2master; // !(this instanceof cSpring) && !(this instanceof BezierPatch); + boolean usecalllists = !IsDynamic() && + IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null || !Link2Support()); // !(this instanceof cSpring) && !(this instanceof BezierPatch); + + //usecalllists = false; //!IsLive(); // IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null) && !link2master; // !(this instanceof cSpring) && !(this instanceof BezierPatch); + + //usecalllists &= display.DrawMode() == display.DEFAULT; // Don't compute list in shadow pass. if (!usecalllists && bRep != null && bRep.displaylist > 0) { @@ -5902,10 +6382,12 @@ bRep.displaylist = 0; } // usecalllists &= !(parent instanceof RandomNode); - // usecalllists = false; + if (CameraPane.BOXMODE) // Too dynamic + usecalllists = false; - if (GetBRep() != null) - usecalllists = usecalllists; + if (display.DrawMode() == display.SHADOW) + //GetBRep() != null) + usecalllists = !!usecalllists; //System.out.println("draw " + this); //new Exception().printStackTrace(); @@ -5915,7 +6397,7 @@ if (!selectmode && //display.DrawMode() != display.SELECTION && //(touched || (bRep != null && bRep.displaylist <= 0))) - (Globals.isLIVE() && Globals.COMPUTESHADOWWHENLIVE || touched && Globals.COMPUTESHADOWWHENLIVE)) // || (bRep != null && bRep.displaylist <= 0))) + ((Globals.isLIVE() && Globals.COMPUTESHADOWWHENLIVE) || touched)) // || (bRep != null && bRep.displaylist <= 0))) { Globals.lighttouched = true; } // all panes... @@ -5927,7 +6409,7 @@ if (!(this instanceof Composite)) touched = false; //if (displaylist == -1 && usecalllists) - if ((bRep != null && bRep.displaylist <= 0) && usecalllists) // june 2013 + if (bRep.displaylist <= 0 && usecalllists) // && display.DrawMode() == display.DEFAULT) // june 2013 { bRep.displaylist = display.GenList(); assert(bRep.displaylist != 0); @@ -5938,16 +6420,18 @@ //System.out.println("\tnew list " + list); //gl.glDrawBuffer(gl.GL_NONE); - if (usecalllists) + if (usecalllists && bRep.displaylist > 0) { // System.err.println("new list " + bRep.displaylist + " for " + this); display.NewList(bRep.displaylist); } + compiling = true; CallList(display, root, selected, blocked); + compiling = false; // compiled = true; - if (usecalllists) + if (usecalllists && bRep.displaylist > 0) { // System.err.println("end list " + bRep.displaylist + " for " + this); display.EndList(); @@ -5957,8 +6441,8 @@ Globals.lighttouched = true; // all panes... } - touched = GetBRep() == null; // this instanceof Composite || this instanceof FileObject; // false; - //touched = false; + //touched = GetBRep() == null; // this instanceof Composite || this instanceof FileObject; // false; + touched = false; if (this instanceof Texture || this instanceof TextureNode) { @@ -5997,7 +6481,7 @@ { if (display.DrawMode() == iCameraPane.SHADOW) { - if (!link2master // tricky to cull in shadow mode. + if (!Link2Support() // tricky to cull in shadow mode. && GetBRep().FrustumCull(this, null, display.LightCamera(), true)) { //System.out.print("CULLED"); @@ -6059,6 +6543,20 @@ { drawSelf(display, root, selected, blocked); } + +// if (!(this instanceof Composite)) +// { +// for (int i = 0; i < size(); i++) +// { +// Object3D child = (Object3D) reserve(i); +// if (child == null) +// continue; +// +// child.draw(display, root, selected, blocked); +// +// release(i); +// } +// } } else { /* @@ -6091,13 +6589,14 @@ boolean failedPigment = false; boolean failedBump = false; + CameraPane.lastObject = this; try { display.BindPigmentTexture(tex, texres); } catch (Exception e) { - System.err.println("FAILED: " + this); + // System.err.println("FAILED: " + this); failedPigment = true; } @@ -6128,6 +6627,20 @@ display.CallList(bRep.displaylist); // june 2013 drawSelf(display, root, selected); } + } + + // Bezier surface: assert (!(this instanceof Composite)); + { +// CRASH MOCAP!! for (int i = 0; i < size(); i++) +// { +// Object3D child = (Object3D) reserve(i); +// if (child == null) +// continue; +// +// child.draw(display, root, selected, blocked); +// +// release(i); +// } } } @@ -6181,16 +6694,17 @@ void CallList(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { - if (GetBRep() == null) - { - drawSelf(display, root, selected, blocked); - } else + if (GetBRep() != null) { DrawNode(display, root, selected); if (this instanceof BezierPatch) { //drawSelf(display, root, selected); } + } + else + { + drawSelf(display, root, selected, blocked); } } @@ -6389,15 +6903,18 @@ void DrawNode(iCameraPane display, Object3D /*Composite*/ root, boolean selected) { - if (display.DrawMode() == display.SHADOW && projectedVertices != null && projectedVertices.length > 2 && projectedVertices[2].y >= 10000) - return; // no shadow for transparent objects - - if (display.DrawMode() == iCameraPane.SELECTION && dontselect) - return; + if (!compiling) + { + if (display.DrawMode() == display.SHADOW && projectedVertices != null && projectedVertices.length > 2 && projectedVertices[2].y >= 10000) + return; // no shadow for transparent objects + + if (display.DrawMode() == iCameraPane.SELECTION && dontselect) + return; + } if (hide) return; - + if (scriptnode != null) { scriptnode.DrawNode(display, root, selected); @@ -6440,7 +6957,8 @@ //javax.media.opengl.GL gl = display.GetGL(); - if (CameraPane.BOXMODE && !selected) // || CameraPane.movingcamera) + if (CameraPane.BOXMODE && !Link2Support()) // + //!selected) // || CameraPane.movingcamera) { int fc = bRep.FaceCount(); int vc = bRep.VertexCount(); @@ -6602,7 +7120,7 @@ facescompare[k] = new FaceCompare(k); } - center = new cVector(); + centertriangle = new cVector(); } else { @@ -6725,7 +7243,7 @@ */ } - transient cVector center; + transient cVector centertriangle; class FaceCompare implements Comparable { @@ -6754,14 +7272,14 @@ Vertex q = bRep.GetVertex(face.q); Vertex r = bRep.GetVertex(face.r); - center.set(p); - center.add(q); - center.add(r); - center.mul(1.0/3); + centertriangle.set(p); + centertriangle.add(q); + centertriangle.add(r); + centertriangle.mul(1.0/3); - center.sub(Globals.theRenderer.EyeCamera().location); + centertriangle.sub(Globals.theRenderer.EyeCamera().location); - distance = center.dot(center); + distance = centertriangle.dot(centertriangle); } return distance; @@ -7298,20 +7816,23 @@ } } - protected void calcHotSpot(cVector in, ClickInfo info, Point outPt, Rectangle outRec) + static ClickInfo clickInfo = new ClickInfo(); + + protected void calcHotSpot(cVector in, //ClickInfo clickInfo, + Point outPt, Rectangle outRec) { - int hc = info.bounds.x + info.bounds.width / 2; - int vc = info.bounds.y + info.bounds.height / 2; - double[][] toscreen = info.toScreen; + int hc = clickInfo.bounds.x + clickInfo.bounds.width / 2; + int vc = clickInfo.bounds.y + clickInfo.bounds.height / 2; + double[][] toscreen = clickInfo.toScreen; if (toscreen == null) { - toscreen = new Camera(info.camera.viewCode).toScreen; + toscreen = new Camera(clickInfo.camera.viewCode).toScreen; } cVector vec = in; LA.xformPos(in, toscreen, in); //System.out.println("Distance = " + info.camera.Distance()); - vec.x *= 100 * info.camera.SCALE / info.camera.Distance(); - vec.y *= 100 * info.camera.SCALE / info.camera.Distance(); + vec.x *= 100 * clickInfo.camera.SCALE / clickInfo.camera.Distance(); + vec.y *= 100 * clickInfo.camera.SCALE / clickInfo.camera.Distance(); outPt.x = hc + (int) vec.x; outPt.y = vc - (int) vec.y; outRec.x = outPt.x - 3; @@ -7319,15 +7840,18 @@ outRec.width = outRec.height = 6; } - protected Rectangle calcHotSpot(cVector in, ClickInfo info) + protected Rectangle calcHotSpot(cVector in//, ClickInfo clickInfo + ) { Point pt = new Point(0, 0); Rectangle rec = new Rectangle(); - calcHotSpot(in, info, pt, rec); + calcHotSpot(in, //clickInfo, + pt, rec); return rec; } - void drawEditHandles0(ClickInfo info, int level) + void drawEditHandles0(//ClickInfo clickInfo, + int level) { if (level == 0) { @@ -7336,16 +7860,19 @@ { cVector origin = new cVector(); //LA.xformPos(origin, toParent, origin); - Rectangle spot = calcHotSpot(origin, info); + if (this.clickInfo == null) + this.clickInfo = new ClickInfo(); + + Rectangle spot = calcHotSpot(origin); //, clickInfo); Rectangle boundary = new Rectangle(); boundary.x = spot.x - 30; boundary.y = spot.y - 30; boundary.width = spot.width + 60; boundary.height = spot.height + 60; - info.g.setColor(Color.red); + clickInfo.g.setColor(Color.white); int spotw = spot.x + spot.width; int spoth = spot.y + spot.height; - info.g.fillRect(spot.x, spot.y, spot.width, spot.height); + clickInfo.g.fillRect(spot.x, spot.y, spot.width, spot.height); // if (CameraPane.Xmin > spot.x) // { // CameraPane.Xmin = spot.x; @@ -7362,11 +7889,6 @@ // { // CameraPane.Ymax = spoth; // } - spot.translate(32, 32); - spotw = spot.x + spot.width; - spoth = spot.y + spot.height; - info.g.setColor(Color.cyan); - info.g.fillRect(spot.x, spot.y, spot.width, spot.height); // if (CameraPane.Xmin > spot.x) // { // CameraPane.Xmin = spot.x; @@ -7385,10 +7907,15 @@ // } // bonhommes info.g.drawLine(spotw, spoth, spotw, spoth - boundary.height/2); // 15 //info.g.drawLine(spotw, spoth, spotw - boundary.width/2, spoth); // 15 - spot.translate(0, -32); - info.g.setColor(Color.yellow); - info.g.fillRect(spot.x, spot.y, spot.width, spot.height); - info.g.setColor(Color.green); + spot.translate(32, 0); + clickInfo.g.setColor(Color.yellow); + clickInfo.g.fillRect(spot.x, spot.y, spot.width, spot.height); + + spot.translate(32, 64); + spotw = spot.x + spot.width; + spoth = spot.y + spot.height; + clickInfo.g.setColor(Color.cyan); + clickInfo.g.fillRect(spot.x, spot.y, spot.width, spot.height); // if (CameraPane.Xmin > spot.x) // { // CameraPane.Xmin = spot.x; @@ -7405,8 +7932,9 @@ // { // CameraPane.Ymax = spoth; // } - info.g.drawArc(boundary.x + info.DX, boundary.y + info.DY, - (int)(boundary.width * info.W), (int)(boundary.height * info.W), 0, 360); + clickInfo.g.setColor(Color.green); + clickInfo.g.drawArc(boundary.x + clickInfo.DX, boundary.y + clickInfo.DY, + (int)(boundary.width * clickInfo.W), (int)(boundary.height * clickInfo.W), 0, 360); //info.g.drawArc(spot.x, spotw, spot.width/2, boundary.height/2, 0, 360); // if (CameraPane.Xmin > boundary.x) // { @@ -7428,7 +7956,8 @@ } } - boolean doEditClick0(ClickInfo info, int level) + boolean doEditClick0(//ClickInfo clickInfo, + int level) { if (level == 0) { @@ -7437,8 +7966,8 @@ boolean retval = false; - startX = info.x; - startY = info.y; + startX = clickInfo.x; + startY = clickInfo.y; hitSomething = -1; cVector origin = new cVector(); @@ -7448,22 +7977,53 @@ { centerPt = new Point(0, 0); } - calcHotSpot(origin, info, centerPt, spot); - if (spot.contains(info.x, info.y)) + calcHotSpot(origin, //info, + centerPt, spot); + if (spot.contains(clickInfo.x, clickInfo.y)) { hitSomething = hitCenter; retval = true; } spot.translate(32, 0); - if (spot.contains(info.x, info.y)) + if (spot.contains(clickInfo.x, clickInfo.y)) { hitSomething = hitRotate; retval = true; } spot.translate(0, 32); - if (spot.contains(info.x, info.y)) + spot.translate(32, 0); + spot.translate(0, 32); + if (spot.contains(clickInfo.x, clickInfo.y)) { hitSomething = hitScale; + + double scale = 0.005f * clickInfo.camera.Distance(); + double hScale = (double) (clickInfo.x - centerPt.x) / 64; + double sign = 1; + if (hScale < 0) + { + sign = -1; + } + hScale = sign*Math.pow(sign*hScale, scale * 50); + if (hScale < 0.01) + { + //hScale = 0.01; + } + + double vScale = (double) (clickInfo.y - centerPt.y) / 64; + sign = 1; + if (vScale < 0) + { + sign = -1; + } + vScale = sign*Math.pow(sign*vScale, scale * 50); + if (vScale < 0.01) + { + //vScale = 0.01; + } + + clickInfo.scale = Math.sqrt(hScale*hScale + vScale*vScale); + retval = true; } @@ -7473,7 +8033,7 @@ } //System.out.println("info.modifiers = " + info.modifiers); - modified = (info.modifiers & CameraPane.SHIFT) != 0; // Was META + modified = (clickInfo.modifiers & CameraPane.SHIFT) != 0; // Was META //System.out.println("modified = " + modified); //new Exception().printStackTrace(); //viewCode = info.pane.renderCamera.viewCode; @@ -7501,7 +8061,8 @@ return true; } - void doEditDrag0(ClickInfo info, boolean opposite) + void doEditDrag0(//ClickInfo info, + boolean opposite) { if (hitSomething == 0) { @@ -7515,7 +8076,7 @@ //System.out.println("hitSomething = " + hitSomething); - double scale = 0.005f * info.camera.Distance(); + double scale = 0.005f * clickInfo.camera.Distance(); cVector xlate = new cVector(); //cVector xlate2 = new cVector(); @@ -7529,7 +8090,9 @@ scale *= 0.05f * Globals.theRenderer.RenderCamera().Distance(); - if (modified || opposite) + // Modified could snap + if (//modified || + opposite) { //assert(false); /* @@ -7549,8 +8112,8 @@ toParent[3][i] = xlate.get(i); LA.matInvert(toParent, fromParent); */ - cVector delta = LA.newVector(0, 0, startY - info.y); - LA.xformDir(delta, new Camera(info.camera.viewCode).fromScreen, delta); + cVector delta = LA.newVector(0, 0, startY - clickInfo.y); + LA.xformDir(delta, new Camera(clickInfo.camera.viewCode).fromScreen, delta); LA.matCopy(startMat, toParent); LA.matTranslate(toParent, delta.x * scale, delta.y * scale, delta.z * scale); @@ -7559,7 +8122,7 @@ } else { //LA.xformDir(delta, info.camera.fromScreen, delta); - cVector up = new cVector(info.camera.up); + cVector up = new cVector(clickInfo.camera.up); cVector away = new cVector(); //cVector right2 = new cVector(); //LA.vecCross(up, cVector.Z, right); @@ -7576,19 +8139,19 @@ LA.xformDir(up, ClickInfo.matbuffer, up); // if (!CameraPane.LOCALTRANSFORM) LA.xformDir(up, Globals.theRenderer.RenderCamera().toScreen, up); - LA.xformDir(info.camera.away, ClickInfo.matbuffer, away); + LA.xformDir(clickInfo.camera.away, ClickInfo.matbuffer, away); // if (!CameraPane.LOCALTRANSFORM) LA.xformDir(away, Globals.theRenderer.RenderCamera().toScreen, away); //LA.vecCross(up, cVector.Z, right2); - cVector delta = LA.newVector(info.x - startX, startY - info.y, 0); + cVector delta = LA.newVector(clickInfo.x - startX, startY - clickInfo.y, 0); //System.out.println("DELTA0 = " + delta); //System.out.println("AWAY = " + info.camera.away); //System.out.println("UP = " + info.camera.up); if (away.z > 0) { - if (info.camera.up.x == 0) // LA.vecDot(right, right2)<0) + if (clickInfo.camera.up.x == 0) // LA.vecDot(right, right2)<0) { delta.x = -delta.x; } else @@ -7603,7 +8166,7 @@ //System.out.println("DELTA1 = " + delta); LA.xformDir(delta, ClickInfo.matbuffer, delta); //System.out.println("DELTA2 = " + delta); - LA.xformDir(delta, new Camera(info.camera.viewCode).fromScreen, delta); + LA.xformDir(delta, new Camera(clickInfo.camera.viewCode).fromScreen, delta); LA.matCopy(startMat, toParent); //System.out.println("DELTA3 = " + delta); LA.matTranslate(toParent, delta.x * scale, delta.y * scale, delta.z * scale); @@ -7613,8 +8176,8 @@ break; case hitRotate: // rotate - int dx = info.x - centerPt.x; - int dy = -(info.y - centerPt.y); + int dx = clickInfo.x - centerPt.x; + int dy = -(clickInfo.y - centerPt.y); double angle = (double) Math.atan2(dx, dy); angle = -(1.570796 - angle); @@ -7623,7 +8186,7 @@ if (modified) { - // Rotate 90 degrees + // Rotate 45 degrees angle /= (Math.PI / 4); angle = Math.floor(angle + 0.5); angle *= (Math.PI / 4); @@ -7637,7 +8200,7 @@ } /**/ - switch (info.pane.RenderCamera().viewCode) + switch (clickInfo.pane.RenderCamera().viewCode) { case 1: // '\001' LA.matZRotate(toParent, angle); @@ -7664,7 +8227,7 @@ break; case hitScale: // scale - double hScale = (double) (info.x - centerPt.x) / 32; + double hScale = (double) (clickInfo.x - centerPt.x) / 64; double sign = 1; if (hScale < 0) { @@ -7676,7 +8239,7 @@ //hScale = 0.01; } - double vScale = (double) (info.y - centerPt.y) / 32; + double vScale = (double) (clickInfo.y - centerPt.y) / 64; sign = 1; if (vScale < 0) { @@ -7687,6 +8250,7 @@ { //vScale = 0.01; } + LA.matCopy(startMat, toParent); /**/ for (int i = 0; i < 3; i++) @@ -7696,33 +8260,39 @@ } /**/ - double totalScale = Math.sqrt(hScale*hScale + vScale*vScale) / Math.sqrt(2); + double totalScale = Math.sqrt(hScale*hScale + vScale*vScale) / clickInfo.scale; if (totalScale < 0.01) { totalScale = 0.01; } - switch (info.pane.RenderCamera().viewCode) + switch (clickInfo.pane.RenderCamera().viewCode) { case 3: // '\001' if (modified || opposite) { + if (modified) // && opposite) + LA.matScale(toParent, totalScale, totalScale, totalScale); + else //LA.matScale(toParent, 1, hScale, vScale); - LA.matScale(toParent, totalScale, 1, 1); + LA.matScale(toParent, totalScale, 1, 1); } // vScale, 1); else { // EXCEPTION! - LA.matScale(toParent, totalScale, totalScale, totalScale); + LA.matScale(toParent, 1, totalScale, totalScale); } // vScale, 1); break; case 2: // '\002' if (modified || opposite) { - //LA.matScale(toParent, hScale, 1, vScale); - LA.matScale(toParent, 1, totalScale, 1); + if (modified) // && opposite) + LA.matScale(toParent, totalScale, totalScale, totalScale); + else + //LA.matScale(toParent, hScale, 1, vScale); + LA.matScale(toParent, 1, totalScale, 1); } else { LA.matScale(toParent, totalScale, 1, totalScale); @@ -7732,8 +8302,11 @@ case 1: // '\003' if (modified || opposite) { - //LA.matScale(toParent, hScale, vScale, 1); - LA.matScale(toParent, 1, 1, totalScale); + if (modified) // && opposite) + LA.matScale(toParent, totalScale, totalScale, totalScale); + else + //LA.matScale(toParent, hScale, vScale, 1); + LA.matScale(toParent, 1, 1, totalScale); } else { LA.matScale(toParent, totalScale, totalScale, 1); @@ -7770,7 +8343,7 @@ } // NEW ... - info.pane.repaint(); + clickInfo.pane.repaint(); } boolean overflow = false; @@ -7877,19 +8450,19 @@ objname = name + " " + System.identityHashCode(this) + " (" + parent.name + " " + System.identityHashCode(parent) + ")"; } else { - objname = GetName() + (Math.abs(count) == 1000 ? (count == 1000 ? " " : " * ") : (" (" + (count - 1) + ")")) + /*(IsSelected()?"(selected) ":"") + (touched?"(touched) ":"") */ ""; + objname = GetName() + (Math.abs(count) == 1000 ? (count == 1000 ? " " : " * ") : (" (" + ((bRep==null)?(count - 1):bRep.VertexCount()) + ")")) + /*(IsSelected()?"(selected) ":"") + (touched?"(touched) ":"") */ ""; } // + super.toString(); //return name + " (" + (SizeOf.deepSizeOf(this)/1024) + "K) " + this.getClass().getName(); if (!Globals.ADVANCED) return objname; - return objname + " " + System.identityHashCode(this); + return objname + " " + System.identityHashCode(this) + " " + GetUUID(); } public int hashCode() { - // Fuck Vector... + // Do not use Vector... return System.identityHashCode(this); } @@ -8129,8 +8702,8 @@ private static cVector2 qq2 = new cVector2(); private static cVector2 rr2 = new cVector2(); private static cVector2 ss2 = new cVector2(); - private static cVector edge1 = new cVector(); - private static cVector edge2 = new cVector(); +// private static cVector edge1 = new cVector(); +// private static cVector edge2 = new cVector(); //private static cVector norm = new cVector(); /*transient private*/ int hitSomething; static final int hitCenter = 1; @@ -8328,7 +8901,275 @@ Touch(); } + + static Vertex s1 = new Vertex(); + static Vertex s2 = new Vertex(); + static Vertex s3 = new Vertex(); + boolean intersectMesh(Ray ray, IntersectResult result) + { + boolean success = false; + + if (bRep.stripified) + { + int[] strips = bRep.getRawIndices(); + + // TRIANGLE STRIP ARRAY + if (bRep.trimmed) + { + float[] v = bRep.getRawVertices(); + + int count3 = 0; + + if (v.length > 0) + { + for (int i = 0; i < strips.length; i++) + { + s1.set(v[count3], v[count3 + 1], v[count3 + 2]); + count3 += 3; + + s2.set(v[count3], v[count3 + 1], v[count3 + 2]); + count3 += 3; + + for (int j = 0; j < strips[i] - 2; j++) + { + s3.set(v[count3], v[count3 + 1], v[count3 + 2]); + count3 += 3; + + if (j%2 == 0) + success |= intersectTriangle(ray, result, s1, s2, s3); + else + success |= intersectTriangle(ray, result, s1, s3, s2); + + s1.set(s2); + s2.set(s3); + } + } + } + + assert count3 == v.length; + } + else // !trimmed + { + int count = 0; + for (int i = 0; i < strips.length; i++) + { + Vertex p = bRep.GetVertex(bRep.indices[count++]); + Vertex q = bRep.GetVertex(bRep.indices[count++]); + + for (int j = 0; j < strips[i] - 2; j++) + { + Vertex r = bRep.GetVertex(bRep.indices[count++]); + + if (j%2 == 0) + success |= intersectTriangle(ray, result, p, q, r); + else + success |= intersectTriangle(ray, result, p, r, q); + + p = q; + q = r; + } + } + } + } else // catch (Error e) + { + int facecount = bRep.FaceCount(); + for (int i = 0; i < facecount; i++) + { + Face face = bRep.GetFace(i); + + Vertex p = bRep.GetVertex(face.p); + Vertex q = bRep.GetVertex(face.q); + Vertex r = bRep.GetVertex(face.r); + + success |= intersectTriangle(ray, result, p, q, r); + } + } + + return success; + } + + static cVector eye = new cVector(); + static cVector dir = new cVector(); + + transient BBox bbox = null; + + boolean intersect(Ray ray, IntersectResult result) + { + double eyex = ray.eyePoint.x; + double eyey = ray.eyePoint.y; + double eyez = ray.eyePoint.z; + + double dirx = ray.viewDirection.x; + double diry = ray.viewDirection.y; + double dirz = ray.viewDirection.z; + + if (this.fromParent != null && !(this instanceof TextureNode)) + { + eye.x = eyex; + eye.y = eyey; + eye.z = eyez; + dir.x = dirx; + dir.y = diry; + dir.z = dirz; + + LA.xformPos(eye, this.fromParent, eye); + LA.xformDir(dir, this.fromParent, dir); + + ray.eyePoint.x = eye.x; + ray.eyePoint.y = eye.y; + ray.eyePoint.z = eye.z; + + ray.viewDirection.x = dir.x; + ray.viewDirection.y = dir.y; + ray.viewDirection.z = dir.z; + } + + boolean success = false; + + boolean touch = false; + + if (bRep != null && Link2Support()) + { + if (bbox == null) + { + bbox = new BBox(); + + cVector min = new cVector(); + cVector max = new cVector(); + + this.getBounds(min, max, true); + + bbox.min.x = min.x; + bbox.min.y = min.y; + bbox.min.z = min.z; + + bbox.max.x = max.x; + bbox.max.y = max.y; + bbox.max.z = max.z; + } + + if (true) // NOT WORKING bbox.intersect(ray, result)) + { + success |= intersectMesh(ray, result); + } + else + { + //this.hide = true; + touch = true; + } + } + + for (int i=0; i<size(); i++) + { + Object3D child = (Object3D) reserve(i); + + if (child == null) + continue; + + success |= child.intersect(ray, result); + release(i); + } + + ray.eyePoint.x = eyex; + ray.eyePoint.y = eyey; + ray.eyePoint.z = eyez; + + ray.viewDirection.x = dirx; + ray.viewDirection.y = diry; + ray.viewDirection.z = dirz; + +// if (touch) +// this.Touch(); // refresh display list + + return success; + } + + static Vector3d edge1 = new Vector3d(); + static Vector3d edge2 = new Vector3d(); + static Vector3d P = new Vector3d(); + static Vector3d T = new Vector3d(); + static Vector3d Q = new Vector3d(); + + private boolean intersectTriangle(Ray ray, IntersectResult result, Vertex v1, Vertex v2, Vertex v3) + { + if (false) + { + result.t = 0; + return true; + } + + /* + Fast, Minimum Storage Ray/Triangle Intersection, Moller et al. + + Reference: http://www.cs.virginia.edu/~gfx/Courses/2003/ImageSynthesis/papers/Acceleration/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf + */ + + // Calculate edges of the triangle + edge1.set(v2.x - v1.x, v2.y - v1.y, v2.z - v1.z); + edge2.set(v3.x - v1.x, v3.y - v1.y, v3.z - v1.z); + + // Calculate the determinant (U parameter) + P.cross(ray.viewDirection, edge2); + double det = edge1.dot(P); + + if (det > -1e-9 && det < 1e-9) + { + return false; + } // Ray lies in plane of triangle + + double invDet = 1 / det; + + // Calculate distance from vertex1 to ray origin + T.set(ray.eyePoint.x - v1.x, ray.eyePoint.y - v1.y, ray.eyePoint.z - v1.z); + + double U = (T.dot(P)) * invDet; // Calculate U parameter + + if (U < 0.f || U > 1.f) + { + return false; + } // Intersection lies outside of the triangle + + // Calculate V parameter + Q.cross(T, edge1); + + double V = ray.viewDirection.dot(Q) * invDet; + + if (V < 0.f || (U + V) > 1.f) + { + return false; + } // Intersection lies outside of the triangle + + double t = edge2.dot(Q) * invDet; + + if (t > 1e-9) // Triangle and ray intersects + { + //result.isIntersected = true; + //result.id = id; + + if (false) // isShadow) + { + result.t = t; + return true; + } else if (t < result.t) + { + result.object = this; + + result.t = t; + + //result.p.x = ray.eyePoint.x + ray.viewDirection.x * t; + //result.p.y = ray.eyePoint.y + ray.viewDirection.y * t; + //result.p.z = ray.eyePoint.z + ray.viewDirection.z * t; + + result.n.cross(edge1, edge2); + result.n.normalize(); + } + + return true; + } + + return false; + } public int Size() { @@ -8425,5 +9266,17 @@ return -1; } */ + + void Translate(double x, double y, double z) + { + if (toParent == null) + { + toParent = LA.newMatrix(); + fromParent = LA.newMatrix(); + } + + LA.matTranslate(toParent, x, y, z); + LA.matTranslateInv(fromParent, -x, -y, -z); + } } -- Gitblit v1.6.2