From 65bdec7ae2c99ca2102c55f92bd62b48c9f14847 Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Tue, 01 Oct 2019 17:30:29 -0400 Subject: [PATCH] Disable project on ground + adam/eve/tom --- Object3D.java | 2200 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 1,661 insertions(+), 539 deletions(-) diff --git a/Object3D.java b/Object3D.java index bdfe925..abd4fbd 100644 --- a/Object3D.java +++ b/Object3D.java @@ -5,6 +5,7 @@ import java.util.Vector; import javax.media.j3d.Transform3D; +import javax.media.opengl.GL; import javax.vecmath.Vector3d; import javax.imageio.ImageIO; @@ -13,14 +14,123 @@ import //weka.core. matrix.Matrix; +import java.util.UUID; + //import net.sourceforge.sizeof.SizeOf; public class Object3D extends Vector<Object3D> implements java.io.Serializable, iSendInfo //, aurelienribon.tweenengine.TweenAccessor<Object3D> { //static final long serialVersionUID = -607422624994562685L; static final long serialVersionUID = 5022536242724664900L; + // Use GetUUID for backward compatibility with null. + private UUID uuid = UUID.randomUUID(); + + // TEMPORARY for versions. No need to be transient. + mocap.reader.BVHReader.BVHResult savebvh; + Object3D saveskeleton; + + // FileObject + Object3D savefilecontent; + // + + 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>(); + + int tabIndex; + ScriptNode scriptnode; + 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) @@ -32,6 +142,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) @@ -99,64 +210,286 @@ // transient boolean reduced; // for morph reduction -transient com.bulletphysics.linearmath.Transform cache; // for fast merge -transient com.bulletphysics.linearmath.Transform cache_1; // for fast merge + transient com.bulletphysics.linearmath.Transform cache; // for fast merge + transient com.bulletphysics.linearmath.Transform cache_1; // for fast merge -transient Object3D transientsupport; // for cloning -transient boolean transientlink2master; + transient Object3D transientsupport; // for cloning + transient boolean transientlink2master; -void SaveSupports() -{ - if (blockloop) - return; - - transientsupport = support; - transientlink2master = link2master; - - support = null; - link2master = false; - - if (bRep != null) + void SaveSupports() { - bRep.SaveSupports(); + if (blockloop) + return; + + transientsupport = support; + transientlink2master = Link2Support(); + + support = null; + link2master = false; + + if (bRep != null) + { + bRep.SaveSupports(); + } + + for (int i = 0; i < Size(); i++) + { + Object3D child = (Object3D) get(i); + if (child == null) + continue; + blockloop = true; + child.SaveSupports(); + blockloop = false; + } } - - for (int i = 0; i < Size(); i++) + + void RestoreSupports() { - Object3D child = (Object3D) get(i); - if (child == null) - continue; + if (blockloop) + return; + + support = transientsupport; + link2master = transientlink2master; + transientsupport = null; + transientlink2master = false; + + if (bRep != null) + { + bRep.RestoreSupports(); + } + + for (int i = 0; i < Size(); i++) + { + Object3D child = (Object3D) get(i); + if (child == null) + continue; + blockloop = true; + child.RestoreSupports(); + blockloop = false; + } + } + + boolean HasBigData() + { + if (blockloop) + return false; + + if (bRep != null) + { + return true; + } + blockloop = true; - child.SaveSupports(); + + 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())) + { + o = hashtable.get(GetUUID()); + + Grafreed.Assert(this.bRep == o.bRep); + //if (this.bRep != null) + // assert(this.bRep.support == o.transientrep); + if (this.support != null) + assert(this.support.bRep == o.transientrep); + } + else + { + isnew = true; + + o = new Object3D("copy of " + this.name); + + hashtable.put(GetUUID(), o); + } + + //if (!blockloop) + { + blockloop = true; + + for (int i=0; i<Size(); i++) + { + get(i).ExtractBigData(hashtable); + } + + blockloop = false; + } + + //if (isnew) + ExtractBigData(o); + } + + void ExtractBigData(Object3D o) + { + //System.err.println("ExtractBigData : " + this + " --> " + o); + + if (o.bRep != null) + Grafreed.Assert(o.bRep == this.bRep); + + o.bRep = this.bRep; +// July 2019 if (this.bRep != null) +// { +// o.transientrep = this.bRep.support; +// o.bRep.support = null; +// } + o.selection = this.selection; + //o.versionlist = this.versionlist; + //o.versionindex = this.versionindex; + + if (this.support != null) + { + if (o.transientrep != null) + Grafreed.Assert(o.transientrep == this.support.bRep); + + o.transientrep = this.support.bRep; + this.support.bRep = null; + } + + // o.support = this.support; + // o.fileparent = this.fileparent; + // if (this.bRep != null) + // o.bRep = this.bRep.support; + + this.bRep = null; + // if (this.bRep != null) + // this.bRep.support = null; + // this.support = null; + // 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; } -} -void RestoreSupports() -{ - if (blockloop) - return; + boolean HasTags() + { + if (blockloop) + return false; - support = transientsupport; - link2master = transientlink2master; - transientsupport = null; - transientlink2master = false; - - if (bRep != null) - { - bRep.RestoreSupports(); - } - - for (int i = 0; i < Size(); i++) - { - Object3D child = (Object3D) get(i); - if (child == null) - continue; blockloop = true; - child.RestoreSupports(); + + 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); + + blockloop = true; + + //hashtable.remove(GetUUID()); + + for (int i=0; i<Size(); i++) + { + get(i).RestoreBigData(hashtable); + } + blockloop = false; } -} + + 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) + { + this.support.bRep = o.transientrep; + } + + this.selection = o.selection; + + //this.versionlist = o.versionlist; + //this.versionindex = o.versionindex; +// July 2019 if (this.bRep != null) +// this.bRep.support = o.transientrep; + // this.support = o.support; + // this.fileparent = o.fileparent; + } // MOCAP SUPPORT double tx,ty,tz,rx,ry,rz; @@ -299,8 +632,13 @@ } boolean live = false; + 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 @@ -308,6 +646,9 @@ boolean random = false; boolean speedup = false; boolean rewind = false; + + // Option to sort triangles, e.g. for transparency. + boolean sort = false; float NORMALPUSH = 0; @@ -326,7 +667,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); @@ -350,7 +691,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); @@ -366,11 +707,11 @@ } } - int memorysize; + transient int memorysize; // needs to be transient, dunno why int MemorySize() { - if (true) // memorysize == 0) + if (memorysize == 0) { try { @@ -480,12 +821,14 @@ toParent = LA.newMatrix(); fromParent = LA.newMatrix(); } + if (toParentMarked == null) { if (maxcount != 1) { - new Exception().printStackTrace(); + //new Exception().printStackTrace(); } + toParentMarked = LA.newMatrix(); fromParentMarked = LA.newMatrix(); } @@ -685,7 +1028,7 @@ void Step() { - // marde pour serialization de Texture + // patch pour serialization de Texture resetmaxcount(); resettransformcount(); resetstep(); @@ -773,7 +1116,7 @@ if (step == 0) step = 1; if (maxcount == 0) - maxcount = 2048; // 4; + maxcount = 128; // 2048; // 4; // if (acceleration == 0) // acceleration = 10; if (delay == 0) // serial @@ -796,7 +1139,7 @@ if (marked && Globals.isLIVE() && live && //TEMP21aug2018 - Globals.DrawMode() == iCameraPane.SHADOW && + (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || !Globals.COMPUTESHADOWWHENLIVE) && currentframe != Globals.framecount) { currentframe = Globals.framecount; @@ -808,7 +1151,8 @@ boolean changedir = random && Math.random() < 0.01; // && !link2master; - if (transformcount*factor > maxcount || (step == 1 && changedir)) + if (transformcount*factor >= maxcount && (rewind || random) || + (step == 1 && changedir)) { countdown = 1; delay = speedup?8:1; @@ -877,20 +1221,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; - 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() @@ -911,6 +1263,11 @@ fromParent = null; // LA.newMatrix(); bRep = null; // new BoundaryRep(); + if (oname != null && oname.equals("LeftHand")) + { + name = oname; + } + /* float hue = (float)Math.random(); Color col; @@ -953,7 +1310,7 @@ public Object clone() { - return GrafreeD.clone(this); + return Grafreed.clone(this); } Object3D copyExpand() @@ -963,8 +1320,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() @@ -972,6 +1331,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) @@ -1042,78 +1425,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) // { @@ -1169,17 +1490,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 @@ -1275,6 +1603,7 @@ toParent = LA.newMatrix(); fromParent = LA.newMatrix(); } + LA.matCopy(other.toParent, toParent); LA.matCopy(other.fromParent, fromParent); @@ -1469,7 +1798,7 @@ BoundaryRep.SEUIL = other.material.cameralight; // Set default to 0.1 - BoundaryRep.SEUIL /= 2; + BoundaryRep.SEUIL /= 4; // 2; System.out.println("SEUIL = " + BoundaryRep.SEUIL); } @@ -1728,7 +2057,7 @@ Object3D o = new Object3D((clone?"Ge:":"Li:") + this.name); o.bRep = transientrep; if (clone) - o.bRep = (BoundaryRep) GrafreeD.clone(transientrep); + o.bRep = (BoundaryRep) Grafreed.clone(transientrep); o.CreateMaterial(); o.SetAttributes(this, -1); //parent @@ -1741,7 +2070,7 @@ Object3D o = new Object3D((clone?"Ge:":"Li:") + this.name); o.bRep = bRep; if (clone) - o.bRep = (BoundaryRep) GrafreeD.clone(bRep); + o.bRep = (BoundaryRep) Grafreed.clone(bRep); o.CreateMaterial(); //o.overwriteThis(this, -1); o.SetAttributes(this, -1); @@ -1828,12 +2157,15 @@ if (obj.name == null) continue; // can't be a null one + // Try perfect match first. if (n.equals(obj.name)) { theobj = obj; count++; } } + + // not needed: n = n.split(":")[0]; // Poser generates a count if (count != 1) for (int i=Size(); --i>=0;) @@ -2151,11 +2483,6 @@ InitOthers(); - if (this instanceof Camera) - { - material.shift = 90; - } - material.multiply = multiply; if (multiply) @@ -2293,12 +2620,22 @@ } */ } + else + { + //((ObjEditor)editWindow).SetupUI2(null); + if (objectUI != null) + ((ObjEditor)objectUI).pinButton.setSelected(pinned); + else + //new Exception().printStackTrace(); + System.err.println("objectUI is null"); + } } void createEditWindow(GroupEditor callee, boolean newWindow) //, boolean root) { if (newWindow) { + new Exception().printStackTrace(); System.exit(0); if (parent != null) { @@ -2333,6 +2670,14 @@ { editWindow.refreshContents(); } + else + { + if (manipWindow != null) + { + manipWindow.refreshContents(); + } + } + //if (parent != null) //parent.refreshEditWindow(); } @@ -2412,7 +2757,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) { @@ -2420,7 +2766,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(); } @@ -2428,19 +2775,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; @@ -2450,7 +2800,7 @@ } } - boolean doParentClick(ClickInfo info) + boolean doParentClick() //ClickInfo info) { if (selection == null) { @@ -2463,7 +2813,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; @@ -2475,13 +2826,15 @@ return retval; } - void doEditDrag(ClickInfo info) + void doEditDrag(//ClickInfo clickInfo, + boolean opposite) { switch (doSomething) { case 1: // '\001' //super. - doEditDrag0(info); + doEditDrag0(//clickInfo, + opposite); break; case 2: // '\002' @@ -2494,11 +2847,13 @@ { //sel.hitSomething = childToDrag.hitSomething; //childToDrag.doEditDrag(info); - sel.doEditDrag(info); + sel.doEditDrag(//clickInfo, + opposite); } else { //super. - doEditDrag0(info); + doEditDrag0(//clickInfo, + opposite); } } break; @@ -2516,6 +2871,9 @@ { deselectAll(); } + + new Exception().printStackTrace(); + ClickInfo newInfo = new ClickInfo(); newInfo.flags = info.flags; newInfo.bounds = info.bounds; @@ -2608,6 +2966,18 @@ void GenNormalsS(boolean crease) { selection.GenNormals(crease); +// for (int i=0; i<selection.size(); i++) +// { +// Object3D selectee = (Object3D) selection.elementAt(i); +// selectee.GenNormals(crease); +// } + + //Touch(); + } + + void GenNormalsMeshS() + { + selection.GenNormalsMesh(); // for (int i=0; i<selection.size(); i++) // { // Object3D selectee = (Object3D) selection.elementAt(i); @@ -2748,6 +3118,24 @@ if (child == null) continue; child.GenNormals(crease); +// Children().release(i); + } + blockloop = false; + } + + void GenNormalsMesh() + { + if (blockloop) + return; + + blockloop = true; + GenNormalsMesh0(); + for (int i = 0; i < Children().Size(); i++) + { + Object3D child = (Object3D) Children().get(i); // reserve(i); + if (child == null) + continue; + child.GenNormalsMesh(); // Children().release(i); } blockloop = false; @@ -2905,7 +3293,8 @@ { if (bRep != null) { - bRep.GenUV(); + bRep.GenUV(); //1); + //bRep.UnfoldUV(); Touch(); } } @@ -2914,7 +3303,19 @@ { 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(); + } + } + + void GenNormalsMesh0() + { + if (bRep != null) + { + bRep.GenerateNormalsMesh(); Touch(); } } @@ -2923,7 +3324,7 @@ { if (bRep != null) { - bRep.GenerateNormalsMINE(); + bRep.MergeNormals(); //.GenerateNormalsMINE(); Touch(); } } @@ -2980,6 +3381,132 @@ 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(int 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) + { + for (int i=Size(); --i>=0;) + { + Object3D v = get(i); + + if (v.toParent == null) + { + v.toParent = LA.newMatrix(); + v.fromParent = LA.newMatrix(); + } + +// LA.matConcat(v.toParent, toParent, v.toParent); +// LA.matConcat(fromParent, v.fromParent, v.fromParent); + LA.matConcat(toParent, v.toParent, v.toParent); + LA.matConcat(v.fromParent, fromParent, v.fromParent); + } + + toParent = null; // LA.matIdentity(toParent); + fromParent = null; // LA.matIdentity(fromParent); + + Touch(); + } + } + void TransformGeometry() { Object3D obj = this; @@ -3195,15 +3722,18 @@ if (bRep != null) { //bRep.RemoveOneTriangle(); + System.out.println(); System.out.println("Reducing " + this); if (name != null && name.contains("lockpickstraps")) name = name; BoundaryRep sup = bRep.support; bRep.support = null; - BoundaryRep temprep = (BoundaryRep) GrafreeD.clone(bRep); + BoundaryRep temprep = (BoundaryRep) Grafreed.clone(bRep); // bRep.SplitInTwo(onlyone); // thread... - temprep.SplitInTwo(reduction34, onlyone); + + while(temprep.SplitInTwo(reduction34, onlyone)); + bRep = temprep; bRep.support = sup; Touch(); @@ -3304,15 +3834,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) @@ -3340,7 +3902,8 @@ if (blockloop) return; - if (marked || (bRep != null && material != null)) // borderline... + if (//marked || // does not make sense + (bRep != null || material != null)) // borderline... live = h; for (int i = 0; i < Size(); i++) @@ -3361,7 +3924,8 @@ return; //if (bRep != null) - if (marked || (bRep != null && material != null)) // borderline... + if (//marked || // does not make sense + (bRep != null || material != null)) // borderline... link2master = h; for (int i = 0; i < Size(); i++) @@ -3381,7 +3945,8 @@ if (blockloop) return; - if (marked || (bRep != null && material != null)) // borderline... + if (//marked || // does not make sense + (bRep != null || material != null)) // borderline... hide = h; for (int i = 0; i < Size(); i++) @@ -3401,7 +3966,7 @@ if (blockloop) return; - if (bRep != null && material != null) // borderline... + if (bRep != null || material != null) // borderline... marked = h; for (int i = 0; i < Size(); i++) @@ -3411,6 +3976,46 @@ continue; blockloop = true; child.MarkLeaves(h); + blockloop = false; + // release(i); + } + } + + void RewindLeaves(boolean h) + { + if (blockloop) + return; + + if (bRep != null || material != null) // borderline... + rewind = h; + + for (int i = 0; i < Size(); i++) + { + Object3D child = (Object3D) get(i); // reserve(i); + if (child == null) + continue; + blockloop = true; + child.RewindLeaves(h); + blockloop = false; + // release(i); + } + } + + void RandomLeaves(boolean h) + { + if (blockloop) + return; + + if (bRep != null || material != null) // borderline... + random = h; + + for (int i = 0; i < Size(); i++) + { + Object3D child = (Object3D) get(i); // reserve(i); + if (child == null) + continue; + blockloop = true; + child.RandomLeaves(h); blockloop = false; // release(i); } @@ -3448,6 +4053,7 @@ void RevertMeshes() { + // BLOCKLOOP if (this instanceof cMesh) { ((cMesh)this).Revert(); @@ -3478,11 +4084,6 @@ Touch(); } - ResetRecur(); - } - - void ResetRecur() - { for (int i = 0; i < size(); i++) { Object3D child = (Object3D) get(i); // reserve(i); @@ -3505,11 +4106,6 @@ Step(); Touch(); - StepRecur(); - } - - void StepRecur() - { for (int i = 0; i < size(); i++) { Object3D child = (Object3D) get(i); // reserve(i); @@ -3696,8 +4292,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) { @@ -3713,19 +4309,19 @@ 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; - if (GrafreeD.RENDERME > 0) + if (Grafreed.RENDERME > 0) { if (child instanceof Merge) ((Merge)child).renderme(); @@ -3740,21 +4336,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) @@ -3876,7 +4472,7 @@ if (child == null) continue; - if (GrafreeD.RENDERME > 0) + if (Grafreed.RENDERME > 0) { if (child instanceof Merge) ((Merge)child).renderme(); @@ -4071,7 +4667,7 @@ if (child == null) continue; - if (GrafreeD.RENDERME > 0) + if (Grafreed.RENDERME > 0) { if (child instanceof Merge) ((Merge)child).renderme(); @@ -4184,6 +4780,55 @@ { blockloop = true; get(i).RepairShadow(); + blockloop = false; + } + } + + void RepairSOV() + { + if (blockloop) + return; + + String texname = this.GetPigmentTexture(); + + if (texname.startsWith("sov")) + { + String[] s = texname.split("/"); + + String[] sname = s[1].split("Color.pn"); + + texname = sname[0]; + + if (sname.length > 1) + { + texname += "Color.jpg"; + } + + this.SetPigmentTexture("sov/" + texname); + } + + texname = this.GetBumpTexture(); + + if (texname.startsWith("sov")) + { + String[] s = texname.split("/"); + + String[] sname = s[1].split("Bump.pn"); + + texname = sname[0]; + + if (sname.length > 1) + { + texname += "Bump.jpg"; + } + + this.SetBumpTexture("sov/" + texname); + } + + for (int i=0; i<Size(); i++) + { + blockloop = true; + get(i).RepairSOV(); blockloop = false; } } @@ -4678,7 +5323,7 @@ cTreePath SelectLeaf(int indexcount, boolean deselect) { - if (hide) + if (hide || dontselect) return null; if (count <= 0) @@ -4702,9 +5347,17 @@ } } + ObjEditor GetWindow() + { + if (editWindow != null) + return editWindow; + + return manipWindow; + } + cTreePath Select(int indexcount, boolean deselect) { - if (hide) + if (hide || dontselect) return null; if (count <= 0) @@ -4738,10 +5391,11 @@ if (leaf != null) { cTreePath tp = new cTreePath(this, leaf); - if (editWindow != null) + ObjEditor window = GetWindow(); + if (window != null) { //System.out.println("editWindow = " + editWindow + " vs " + this); - editWindow.Select(tp, deselect, true); + window.Select(tp, deselect, true); } return tp; @@ -4758,6 +5412,7 @@ if (child == null) continue; + if (child.HasTransparency() && child.size() != 0) { cTreePath leaf = child.Select(indexcount, deselect); @@ -4767,9 +5422,10 @@ if (leaf != null) { cTreePath tp = new cTreePath(this, leaf); - if (editWindow != null) + ObjEditor window = GetWindow(); + if (window != null) { - editWindow.Select(tp, deselect, true); + window.Select(tp, deselect, true); } return tp; @@ -5094,6 +5750,51 @@ blockloop = false; } + void ResetSelectable() + { + if (blockloop) + return; + + blockloop = true; + + keepdontselect = dontselect; + dontselect = true; + + Object3D child; + int nb = Size(); + for (int i = 0; i < nb; i++) + { + child = (Object3D) get(i); + if (child == null) + continue; + child.ResetSelectable(); + } + + blockloop = false; + } + + void RestoreSelectable() + { + if (blockloop) + return; + + blockloop = true; + + dontselect = keepdontselect; + + Object3D child; + int nb = Size(); + for (int i = 0; i < nb; i++) + { + child = (Object3D) get(i); + if (child == null) + continue; + child.RestoreSelectable(); + } + + blockloop = false; + } + boolean IsSelected() { if (parent == null) @@ -5154,12 +5855,41 @@ if (fullname == null) return ""; + if (fullname.pigment != null) + { + return fullname.pigment; + } + // System.out.println("Fullname = " + fullname); - if (fullname.name.indexOf(":") == -1) - return fullname.name; + // Does not work on Windows due to C: +// if (fullname.name.indexOf(":") == -1) +// return fullname.name; +// +// return fullname.name.substring(0,fullname.name.indexOf(":")); - return fullname.name.substring(0,fullname.name.indexOf(":")); + String[] split = fullname.name.split(":"); + + if (split.length == 0) + { + return fullname.pigment = ""; + } + + if (split.length <= 2) + { + if (fullname.name.endsWith(":")) + { + // Windows + return fullname.pigment = fullname.name.substring(0, fullname.name.length()-1); + } + + return fullname.pigment = split[0]; + } + + // Windows + assert(split.length == 4); + + return fullname.pigment = split[0] + ":" + split[1]; } static String GetBump(cTexture fullname) @@ -5167,11 +5897,44 @@ if (fullname == null) return ""; + if (fullname.bump != null) + { + return fullname.bump; + } + // System.out.println("Fullname = " + fullname); - if (fullname.name.indexOf(":") == -1) - return ""; - - return fullname.name.substring(fullname.name.indexOf(":")+1,fullname.name.length()); + // Does not work on Windows due to C: +// if (fullname.name.indexOf(":") == -1) +// return ""; +// +// return fullname.name.substring(fullname.name.indexOf(":")+1,fullname.name.length()); + String[] split = fullname.name.split(":"); + + if (split.length == 0) + { + return fullname.bump = ""; + } + + if (split.length == 1) + { + return fullname.bump = ""; + } + + if (split.length == 2) + { + if (fullname.name.endsWith(":")) + { + // Windows + return fullname.bump = ""; + } + + return fullname.bump = split[1]; + } + + // Windows + assert(split.length == 4); + + return fullname.bump = split[2] + ":" + split[3]; } String GetPigmentTexture() @@ -5245,7 +6008,7 @@ System.out.print("; textures = " + textures); System.out.println("; usedtextures = " + usedtextures); - if (GetTextures() == null) + if (GetTextures() == null) // What is that?? GetTextures().name = ":"; String texname = tex; @@ -5254,6 +6017,9 @@ texname = ""; GetTextures().name = texname + ":" + GetBump(GetTextures()); + + GetTextures().pigment = null; + Touch(); } @@ -5278,6 +6044,43 @@ } } + UUID GetUUID() + { + if (uuid == null) + { + // Serial + uuid = UUID.randomUUID(); + } + + return uuid; + } + + Object3D GetObject(UUID uid) + { + if (blockloop) + return null; + + if (GetUUID().equals(uid)) + return this; + + int nb = Size(); + for (int i = 0; i < nb; i++) + { + Object3D child = (Object3D) get(i); + + if (child == null) + continue; + + blockloop = true; + Object3D obj = child.GetObject(uid); + blockloop = false; + if (obj != null) + return obj; + } + + return null; + } + void SetBumpTexture(String tex) { if (GetTextures() == null) @@ -5289,6 +6092,8 @@ texname = ""; GetTextures().name = Object3D.GetPigment(GetTextures()) + ":" + texname; + + GetTextures().bump = null; Touch(); } @@ -5314,6 +6119,38 @@ } } + void EmbedTextures(boolean embed) + { + if (blockloop) + return; + + //if (GetTextures() != null) + if (embed) + CameraPane.EmbedTextures(GetTextures()); + else + { + GetTextures().pigmentdata = null; + GetTextures().bumpdata = null; + GetTextures().pw = 0; + GetTextures().ph = 0; + GetTextures().bw = 0; + GetTextures().bh = 0; + } + + int nb = Size(); + for (int i = 0; i < nb; i++) + { + Object3D child = (Object3D) get(i); + + if (child == null) + continue; + + blockloop = true; + child.EmbedTextures(embed); + blockloop = false; + } + } + void draw(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { Draw(display, root, selected, blocked); @@ -5322,12 +6159,37 @@ boolean NeedSupport() { return - CameraPane.SUPPORT && !CameraPane.movingcamera && link2master && /*live &&*/ support != null + CameraPane.SUPPORT && (!CameraPane.movingcamera || (!Globals.FREEZEONMOVE && Globals.isLIVE())) && Link2Support() && /*live &&*/ support != null // PROBLEM with CROWD!! - && (Globals.DrawMode() == iCameraPane.SHADOW || Globals.CROWD); + && (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || Globals.CROWD); } static boolean DEBUG_SELECTION = false; + + boolean IsLive() + { + if (live) + return true; + + if (parent == null) + return false; + + 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(); void Draw(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { @@ -5338,8 +6200,31 @@ // 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 && - hide) + (hide || dontselect)) return; if (name != null && name.contains("sclera")) @@ -5371,7 +6256,7 @@ return; } - javax.media.opengl.GL gl = display.GetGL(); + //javax.media.opengl.GL gl = display.GetGL(); /* if (touched) @@ -5389,8 +6274,11 @@ if (support != null) support = support; - //boolean usecalllists = IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null || !link2master); // !(this instanceof cSpring) && !(this instanceof BezierPatch); - boolean usecalllists = false; // 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); + //boolean 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) { @@ -5398,10 +6286,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(); @@ -5410,10 +6300,12 @@ boolean selectmode = display.DrawMode() == display.SELECTION || display.IsDebugSelection(); if (!selectmode && //display.DrawMode() != display.SELECTION && - (touched || (bRep != null && bRep.displaylist <= 0))) + //(touched || (bRep != null && bRep.displaylist <= 0))) + (Globals.isLIVE() && Globals.COMPUTESHADOWWHENLIVE || touched && Globals.COMPUTESHADOWWHENLIVE)) // || (bRep != null && bRep.displaylist <= 0))) { Globals.lighttouched = true; } // all panes... + //if (usecalllists && display.DrawMode() != display.SELECTION && display.DrawMode() != display.SHADOW && if (bRep != null && usecalllists && !selectmode && // june 2013 display.DrawMode() != display.SHADOW && (touched || (bRep != null && bRep.displaylist <= 0))) @@ -5421,9 +6313,9 @@ 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 = gl.glGenLists(1); + bRep.displaylist = display.GenList(); assert(bRep.displaylist != 0); // System.err.println("glGenLists: " + bRep.displaylist + " for " + this); //System.out.println("\tgen list " + list); @@ -5432,25 +6324,27 @@ //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); - gl.glNewList(bRep.displaylist, gl.GL_COMPILE); //_AND_EXECUTE); + display.NewList(bRep.displaylist); } + CallList(display, root, selected, blocked); + // compiled = true; - if (usecalllists) + if (usecalllists && bRep.displaylist > 0) { // System.err.println("end list " + bRep.displaylist + " for " + this); - gl.glEndList(); + display.EndList(); } //gl.glDrawBuffer(gl.GL_BACK); // XXX touched = false; 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) { @@ -5489,8 +6383,8 @@ { if (display.DrawMode() == iCameraPane.SHADOW) { - if (!link2master // tricky to cull in shadow mode. - && GetBRep().FrustumCull(this, gl, display.LightCamera(), true)) + if (!Link2Support() // tricky to cull in shadow mode. + && GetBRep().FrustumCull(this, null, display.LightCamera(), true)) { //System.out.print("CULLED"); culled = true; @@ -5498,7 +6392,7 @@ } else //GetBRep().getBounds(v0, v1, this); - if (GetBRep().FrustumCull(this, gl, display.RenderCamera(), false)) + if (GetBRep().FrustumCull(this, null, display.RenderCamera(), false)) culled = true; // LA.xformPos(v0, display.renderCamera.toScreen, v0); @@ -5538,7 +6432,8 @@ { if (GetBRep() != null) { - CameraPane.NextIndex(this, gl); + display.NextIndex(); + // vertex color conflict : gl.glCallList(list); DrawNode(display, root, selected); if (this instanceof BezierPatch) @@ -5550,6 +6445,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 { /* @@ -5579,7 +6488,29 @@ tex = GetTextures(); } - display.BindTextures(tex, texres); + boolean failedPigment = false; + boolean failedBump = false; + + CameraPane.lastObject = this; + try + { + display.BindPigmentTexture(tex, texres); + } + catch (Exception e) + { + // System.err.println("FAILED: " + this); + failedPigment = true; + } + + try + { + display.BindBumpTexture(tex, texres); + } + catch (Exception e) + { + //System.err.println("FAILED: " + this); + failedBump = true; + } if (!compiled) { @@ -5595,13 +6526,31 @@ // System.err.println("glCallList: " + bRep.displaylist + " for " + this); assert(bRep.displaylist != 0); - gl.glCallList(bRep.displaylist); + display.CallList(bRep.displaylist); // june 2013 drawSelf(display, root, selected); } } + + 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); +// } + } } - display.ReleaseTextures(tex); + if (!failedBump) + display.ReleaseBumpTexture(tex); + + if (!failedPigment) + display.ReleasePigmentTexture(tex); display.PopMaterial(this, selected); } @@ -5647,16 +6596,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); } } @@ -5730,6 +6680,9 @@ void drawSelf(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { + if (display.DrawMode() == iCameraPane.SELECTION && dontselect) + return; + if (hide) return; // shadow optimisation @@ -5855,6 +6808,9 @@ if (display.DrawMode() == display.SHADOW && projectedVertices != null && projectedVertices.length > 2 && projectedVertices[2].y >= 10000) return; // no shadow for transparent objects + if (display.DrawMode() == iCameraPane.SELECTION && dontselect) + return; + if (hide) return; @@ -5895,11 +6851,12 @@ return; } + //bRep.GenUV(1/material.diffuseness); // bRep.lock = true; - javax.media.opengl.GL gl = display.GetGL(); + //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(); @@ -5914,23 +6871,7 @@ bRep.getMinMax(min, max, 100); - gl.glBegin(gl.GL_LINES); - - gl.glVertex3d(min.x, min.y, min.z); - gl.glVertex3d(min.x, min.y, max.z); - gl.glVertex3d(min.x, min.y, min.z); - gl.glVertex3d(min.x, max.y, min.z); - gl.glVertex3d(min.x, min.y, min.z); - gl.glVertex3d(max.x, min.y, min.z); - - gl.glVertex3d(max.x, max.y, max.z); - gl.glVertex3d(min.x, max.y, max.z); - gl.glVertex3d(max.x, max.y, max.z); - gl.glVertex3d(max.x, min.y, max.z); - gl.glVertex3d(max.x, max.y, max.z); - gl.glVertex3d(max.x, max.y, min.z); - - gl.glEnd(); + display.DrawBox(min, max); return; } @@ -5984,178 +6925,19 @@ new Exception().printStackTrace(); return; } - - // TRIANGLE STRIP ARRAY - if (bRep.trimmed) + + if (dontselect) { - float[] v = bRep.getRawVertices(); - float[] n = bRep.getRawNormals(); - float[] c = bRep.getRawColors(); - float[] uv = bRep.getRawUVMap(); - - int count2 = 0; - int count3 = 0; - - if (n.length > 0) - { - for (int i = 0; i < strips.length; i++) - { - gl.glBegin(gl.GL_TRIANGLE_STRIP); - - /* - boolean locked = false; - float eps = 0.1f; - boolean wrap = CameraPane.UVWRAP; // true; // UV WRAP TEXTURE ISSUE: true = artifacts, false = nice - - int dot = 0; - - if ((dot&1) == 0) - dot |= (Math.abs(qv.s - pv.s) < eps && Math.abs(qv.t - pv.t) < eps) ? 3 : 1; - - if (wrap || (dot&2) != 0) // Math.abs(qv.s - pv.s) < eps && Math.abs(qv.t - pv.t) < eps) - gl.glTexCoord2f((float) qv.s, (float) qv.t); - else - { - locked = true; - gl.glTexCoord2f((float) pv.s, (float) pv.t); - } - //System.out.println("vertexq = " + qv.x + ", " + qv.y + ", " + qv.z); - gl.glVertex3f((float) qv.x, (float) qv.y, (float) qv.z); - if (hasnorm) - { - //System.out.println("normalr = " + rv.norm.x + ", " + rv.norm.y + ", " + rv.norm.z); - gl.glNormal3f((float) rv.norm.x, (float) rv.norm.y, (float) rv.norm.z); - } - - if ((dot&4) == 0) - dot |= (Math.abs(rv.s - pv.s) < eps && Math.abs(rv.t - pv.t) < eps) ? 12 : 4; - - if (wrap || !locked && (dot&8) != 0) - gl.glTexCoord2f((float) rv.s, (float) rv.t); - else - gl.glTexCoord2f((float) pv.s, (float) pv.t); - - f.dot = dot; - */ - - if (!selectmode) - { - if (n[count3] != 0 || n[count3 + 1] != 0 || n[count3 + 2] != 0) - { - gl.glNormal3f(n[count3], n[count3 + 1], n[count3 + 2]); - } else - { - gl.glNormal3f(0, 0, 1); - } - - if (c != null) - //System.out.println("glcolor = " + c[count3] + ", " + c[count3+1] + ", " + c[count3+2]); - { - gl.glColor4f(c[count3/3], c[count3/3 /* + 1*/], c[count3/3 /* + 2*/], 1); - } - } - if (flipV) - gl.glTexCoord2f(uv[count2], 1-uv[count2 + 1]); - else - gl.glTexCoord2f(uv[count2], uv[count2 + 1]); - //System.out.println("vertex1 = " + v[count3] + ", " + v[count3+1] + ", " + v[count3+2]); - gl.glVertex3f(v[count3], v[count3 + 1], v[count3 + 2]); - - count2 += 2; - count3 += 3; - if (!selectmode) - { - if (n[count3] != 0 || n[count3 + 1] != 0 || n[count3 + 2] != 0) - { - gl.glNormal3f(n[count3], n[count3 + 1], n[count3 + 2]); - } else - { - gl.glNormal3f(0, 0, 1); - } - if (c != null) - { - gl.glColor4f(c[count3/3], c[count3/3 /* + 1*/], c[count3/3 /* + 2*/], 1); - } - } - if (flipV) - gl.glTexCoord2f(uv[count2], 1-uv[count2 + 1]); - else - gl.glTexCoord2f(uv[count2], uv[count2 + 1]); - //System.out.println("vertex2 = " + v[count3] + ", " + v[count3+1] + ", " + v[count3+2]); - gl.glVertex3f(v[count3], v[count3 + 1], v[count3 + 2]); - - count2 += 2; - count3 += 3; - for (int j = 0; j < strips[i] - 2; j++) - { - //gl.glTexCoord2d(...); - if (!selectmode) - { - if (n[count3] != 0 || n[count3 + 1] != 0 || n[count3 + 2] != 0) - { - gl.glNormal3f(n[count3], n[count3 + 1], n[count3 + 2]); - } else - { - gl.glNormal3f(0, 0, 1); - } - if (c != null) - { - gl.glColor4f(c[count3/3], c[count3/3 /* + 1*/], c[count3/3 /* + 2*/], 1); - } - } - - if (flipV) - gl.glTexCoord2f(uv[count2], 1-uv[count2 + 1]); - else - gl.glTexCoord2f(uv[count2], uv[count2 + 1]); - //System.out.println("coord3 = " + uv[count2] + ", " + uv[count2+1]); - gl.glVertex3f(v[count3], v[count3 + 1], v[count3 + 2]); - count2 += 2; - count3 += 3; - } - - gl.glEnd(); - } - } - - assert count3 == v.length; + //bRep.GenerateNormalsMINE(); } - else // !trimmed - { - int count = 0; - for (int i = 0; i < strips.length; i++) - { - gl.glBegin(gl.GL_TRIANGLE_STRIP); - - Vertex p = bRep.GetVertex(bRep.indices[count++]); - Vertex q = bRep.GetVertex(bRep.indices[count++]); - - drawVertex(gl, p, selectmode); - drawVertex(gl, q, selectmode); - - for (int j = 0; j < strips[i] - 2; j++) - { - Vertex r = bRep.GetVertex(bRep.indices[count++]); - -// if (j%2 == 0) -// drawFace(p, q, r, display, null); -// else -// drawFace(p, r, q, display, null); - -// p = q; -// q = r; - drawVertex(gl, r, selectmode); - } - - gl.glEnd(); - } - } + + display.DrawGeometry(bRep, flipV, selectmode); } else // catch (Error e) { // TRIANGLE ARRAY if (IsOpaque()) // Static()) { - gl.glBegin(gl.GL_TRIANGLES); + display.StartTriangles(); int facecount = bRep.FaceCount(); for (int i = 0; i < facecount; i++) { @@ -6220,7 +7002,7 @@ display.DrawFace(this, p, q, r, face); } - gl.glEnd(); + display.EndTriangles(); } else { @@ -6236,7 +7018,7 @@ facescompare[k] = new FaceCompare(k); } - center = new cVector(); + centertriangle = new cVector(); } else { @@ -6249,8 +7031,8 @@ //System.out.println("SORT"); java.util.Arrays.sort(facescompare); - - gl.glBegin(gl.GL_TRIANGLES); + + display.StartTriangles(); for (int i = 0; i < facecount; i++) { Face face = bRep.GetFace(facescompare[i].index); @@ -6264,11 +7046,12 @@ display.DrawFace(this, p, q, r, face); } - gl.glEnd(); + display.EndTriangles(); } if (false) // live && support != null && support.bRep != null) // debug weights { + /* gl.glDisable(gl.GL_LIGHTING); float[] colorV = new float[3]; @@ -6347,6 +7130,7 @@ // gl.glEnd(); } } + */ } } @@ -6357,7 +7141,7 @@ */ } - transient cVector center; + transient cVector centertriangle; class FaceCompare implements Comparable { @@ -6386,14 +7170,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; @@ -6405,22 +7189,6 @@ void Print(Vertex v) { //System.err.println("(" + v.x + ", " + v.y + ", " + v.z + ")"); - } - - void drawVertex(javax.media.opengl.GL gl, Vertex pv, boolean selectmode) - { - if (!selectmode) - { - gl.glNormal3f((float) pv.norm.x, (float) pv.norm.y, (float) pv.norm.z); - gl.glColor4f(pv.AO, pv.AO, pv.AO, 1); - - if (flipV) - gl.glTexCoord2f((float) pv.s, 1-(float) pv.t); - else - gl.glTexCoord2f((float) pv.s, (float) pv.t); - } - - gl.glVertex3f((float) pv.x, (float) pv.y, (float) pv.z); } void drawSelf(ClickInfo info, int level, boolean select) @@ -6946,20 +7714,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; @@ -6967,15 +7738,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) { @@ -6984,16 +7758,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; @@ -7010,11 +7787,33 @@ // { // CameraPane.Ymax = spoth; // } - spot.translate(32, 32); +// if (CameraPane.Xmin > spot.x) +// { +// CameraPane.Xmin = spot.x; +// } +// if (CameraPane.Xmax < spotw) +// { +// CameraPane.Xmax = spotw; +// } +// if (CameraPane.Ymin > spot.y) +// { +// CameraPane.Ymin = spot.y; +// } +// if (CameraPane.Ymax < spoth) +// { +// CameraPane.Ymax = spoth; +// } + // 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(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; - info.g.setColor(Color.blue); - info.g.fillRect(spot.x, spot.y, spot.width, 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; @@ -7031,29 +7830,9 @@ // { // CameraPane.Ymax = spoth; // } - info.g.drawLine(spotw, spoth, spotw, spoth - 15); - info.g.drawLine(spotw, spoth, spotw - 15, spoth); - spot.translate(0, -32); - info.g.setColor(Color.green); - info.g.fillRect(spot.x, spot.y, spot.width, spot.height); -// if (CameraPane.Xmin > spot.x) -// { -// CameraPane.Xmin = spot.x; -// } -// if (CameraPane.Xmax < spotw) -// { -// CameraPane.Xmax = spotw; -// } -// if (CameraPane.Ymin > spot.y) -// { -// CameraPane.Ymin = spot.y; -// } -// if (CameraPane.Ymax < spoth) -// { -// CameraPane.Ymax = spoth; -// } - info.g.drawArc(boundary.x, boundary.y, - boundary.width, boundary.height, 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) // { @@ -7075,7 +7854,8 @@ } } - boolean doEditClick0(ClickInfo info, int level) + boolean doEditClick0(//ClickInfo clickInfo, + int level) { if (level == 0) { @@ -7084,10 +7864,10 @@ boolean retval = false; - startX = info.x; - startY = info.y; + startX = clickInfo.x; + startY = clickInfo.y; - hitSomething = 0; + hitSomething = -1; cVector origin = new cVector(); //LA.xformPos(origin, toParent, origin); Rectangle spot = new Rectangle(); @@ -7095,22 +7875,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; } @@ -7120,7 +7931,7 @@ } //System.out.println("info.modifiers = " + info.modifiers); - modified = (info.modifiers & CameraPane.META) != 0; + modified = (clickInfo.modifiers & CameraPane.SHIFT) != 0; // Was META //System.out.println("modified = " + modified); //new Exception().printStackTrace(); //viewCode = info.pane.renderCamera.viewCode; @@ -7148,7 +7959,8 @@ return true; } - void doEditDrag0(ClickInfo info) + void doEditDrag0(//ClickInfo info, + boolean opposite) { if (hitSomething == 0) { @@ -7162,7 +7974,8 @@ //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(); switch (hitSomething) @@ -7175,7 +7988,9 @@ scale *= 0.05f * Globals.theRenderer.RenderCamera().Distance(); - if (modified) + // Modified could snap + if (//modified || + opposite) { //assert(false); /* @@ -7195,8 +8010,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); @@ -7205,7 +8020,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); @@ -7222,19 +8037,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 @@ -7249,7 +8064,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); @@ -7259,8 +8074,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); @@ -7269,6 +8084,7 @@ if (modified) { + // Rotate 45 degrees angle /= (Math.PI / 4); angle = Math.floor(angle + 0.5); angle *= (Math.PI / 4); @@ -7282,7 +8098,7 @@ } /**/ - switch (info.pane.RenderCamera().viewCode) + switch (clickInfo.pane.RenderCamera().viewCode) { case 1: // '\001' LA.matZRotate(toParent, angle); @@ -7309,26 +8125,30 @@ 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) + { + sign = -1; + } + hScale = sign*Math.pow(sign*hScale, scale * 50); if (hScale < 0.01) { - hScale = 0.01; + //hScale = 0.01; } - hScale = Math.pow(hScale, scale * 50); - if (hScale < 0.01) + + double vScale = (double) (clickInfo.y - centerPt.y) / 64; + sign = 1; + if (vScale < 0) { - hScale = 0.01; + sign = -1; } - double vScale = (double) (info.y - centerPt.y) / 32; + vScale = sign*Math.pow(sign*vScale, scale * 50); if (vScale < 0.01) { - vScale = 0.01; + //vScale = 0.01; } - vScale = Math.pow(vScale, scale * 50); - if (vScale < 0.01) - { - vScale = 0.01; - } + LA.matCopy(startMat, toParent); /**/ for (int i = 0; i < 3; i++) @@ -7338,39 +8158,56 @@ } /**/ - switch (info.pane.RenderCamera().viewCode) + double totalScale = Math.sqrt(hScale*hScale + vScale*vScale) / clickInfo.scale; + + if (totalScale < 0.01) + { + totalScale = 0.01; + } + + switch (clickInfo.pane.RenderCamera().viewCode) { case 3: // '\001' - if (modified) + if (modified || opposite) { + if (modified) // && opposite) + LA.matScale(toParent, totalScale, totalScale, totalScale); + else //LA.matScale(toParent, 1, hScale, vScale); - LA.matScale(toParent, vScale, 1, 1); + LA.matScale(toParent, totalScale, 1, 1); } // vScale, 1); else { - LA.matScale(toParent, vScale, vScale, vScale); + // EXCEPTION! + LA.matScale(toParent, 1, totalScale, totalScale); } // vScale, 1); break; case 2: // '\002' - if (modified) + if (modified || opposite) { - //LA.matScale(toParent, hScale, 1, vScale); - LA.matScale(toParent, 1, vScale, 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, vScale, 1, vScale); + LA.matScale(toParent, totalScale, 1, totalScale); } break; case 1: // '\003' - if (modified) + if (modified || opposite) { - //LA.matScale(toParent, hScale, vScale, 1); - LA.matScale(toParent, 1, 1, vScale); + 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, vScale, vScale, 1); + LA.matScale(toParent, totalScale, totalScale, 1); } break; } @@ -7404,7 +8241,7 @@ } // NEW ... - info.pane.repaint(); + clickInfo.pane.repaint(); } boolean overflow = false; @@ -7503,19 +8340,27 @@ //return super.toString() + " (id=" + list + ")" + " (brep=" + bRep + ")"; //return name + " (id=" + list + ")" + " (brep=" + bRep + ") " + super.toString(); //return name + " (#tri = " + (bRep==null?0:bRep.VertexCount()) + ") " + super.toString(); + + String objname; + if (false) //parent != null) { - return name + " " + System.identityHashCode(this) + " (" + parent.name + " " + System.identityHashCode(parent) + ")"; + objname = name + " " + System.identityHashCode(this) + " (" + parent.name + " " + System.identityHashCode(parent) + ")"; } else { - return GetName() + (Math.abs(count) == 1000 ? (count == 1000 ? " " : " * ") : (" (" + (count /*- 1*/) + ") ")) + /*(IsSelected()?"(selected) ":"") + (touched?"(touched) ":"") */ +System.identityHashCode(this); + objname = GetName() + (Math.abs(count) == 1000 ? (count == 1000 ? " " : " * ") : (" (" + (count - 1) + ")")) + /*(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) + " " + GetUUID(); } public int hashCode() { - // Fuck Vector... + // Do not use Vector... return System.identityHashCode(this); } @@ -7566,6 +8411,7 @@ objectUI.closeUI(); if (editWindow != null) { + editWindow.ctrlPanel.FlushUI(); editWindow.refreshContents(); } // ? new objectUI = null; @@ -7574,6 +8420,10 @@ { editWindow = null; } // ? + } + else + { + //editWindow.closeUI(); } } @@ -7586,7 +8436,7 @@ /*transient*/ cVector2[] projectedVertices = new cVector2[0]; Object3D /*Composite*/ parent; - Object3D /*Composite*/ fileparent; + Object3D /*Composite*/ fileparent; // In the case of FileObject double[][] toParent; // dynamic matrix double[][] fromParent; @@ -7701,7 +8551,7 @@ { assert(bRep != null); if (!(support instanceof GenericJoint)) // support.bRep != null) - GrafreeD.Assert(support.bRep == bRep.support); + Grafreed.Assert(support.bRep == bRep.support); } else { @@ -7732,6 +8582,10 @@ } transient ObjEditor editWindow; + transient ObjEditor manipWindow; + + transient boolean pinned; + transient ObjectUI objectUI; public static int povDepth = 0; private static cVector tbMin = new cVector(); @@ -7746,13 +8600,13 @@ 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; - private static final int hitCenter = 1; - private static final int hitScale = 2; - private static final int hitRotate = 3; + static final int hitCenter = 1; + static final int hitScale = 2; + static final int hitRotate = 3; /*transient*/ /*private*/ int viewCode; // Now used for transparency cache flag /*transient*/ private Point centerPt; /*transient*/ private int startX; @@ -7945,7 +8799,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() { -- Gitblit v1.6.2