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 | 2837 +++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 1,791 insertions(+), 1,046 deletions(-) diff --git a/Object3D.java b/Object3D.java index f6cf69b..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,13 +14,136 @@ 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) + { + projectedVertices = new Object3D.cVector2[3]; + } + for (int i = 0; i < 3; i++) + { + projectedVertices[i] = new cVector2(); // Others + } + projectedVertices[0].x = 100; // bump + projectedVertices[1].y = 1000; // punchthrough. only for png + } void MinMax(cVector minima, cVector maxima) { @@ -86,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; @@ -286,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 @@ -295,6 +646,11 @@ boolean random = false; boolean speedup = false; boolean rewind = false; + + // Option to sort triangles, e.g. for transparency. + boolean sort = false; + + float NORMALPUSH = 0; Object3D support; @@ -311,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); @@ -335,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); @@ -351,11 +707,11 @@ } } - int memorysize; + transient int memorysize; // needs to be transient, dunno why int MemorySize() { - if (true) // memorysize == 0) + if (memorysize == 0) { try { @@ -415,16 +771,16 @@ { Object3D copy = this; - Camera parentcam = CameraPane.theRenderer.manipCamera; + Camera parentcam = Globals.theRenderer.ManipCamera(); - if (CameraPane.theRenderer.manipCamera == CameraPane.theRenderer.cameras[0]) + if (Globals.theRenderer.ManipCamera() == Globals.theRenderer.Cameras()[0]) { - parentcam = CameraPane.theRenderer.cameras[1]; + parentcam = Globals.theRenderer.Cameras()[1]; } - if (CameraPane.theRenderer.manipCamera == CameraPane.theRenderer.cameras[1]) + if (Globals.theRenderer.ManipCamera() == Globals.theRenderer.Cameras()[1]) { - parentcam = CameraPane.theRenderer.cameras[0]; + parentcam = Globals.theRenderer.Cameras()[0]; } if (this == parentcam) @@ -432,7 +788,7 @@ //assert(this instanceof Camera); for (int count = parentcam.GetTransformCount(); --count>=0;) - LA.xformPos(CameraPane.theRenderer.targetLookAt, parentcam.toParent, CameraPane.theRenderer.targetLookAt); + LA.xformPos(Globals.theRenderer.TargetLookAt(), parentcam.toParent, Globals.theRenderer.TargetLookAt()); } copy.marked ^= true; @@ -452,7 +808,7 @@ //assert(this instanceof Camera); for (int count = parentcam.GetTransformCount(); --count>=0;) - LA.xformPos(CameraPane.theRenderer.targetLookAt, parentcam.fromParent, CameraPane.theRenderer.targetLookAt); + LA.xformPos(Globals.theRenderer.TargetLookAt(), parentcam.fromParent, Globals.theRenderer.TargetLookAt()); } copy.Touch(); // display list issue @@ -465,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(); } @@ -587,7 +945,7 @@ return; } - if (CameraPane.fromscript) + if (Globals.fromscript) { transformcount = 0; return; @@ -670,7 +1028,7 @@ void Step() { - // marde pour serialization de Texture + // patch pour serialization de Texture resetmaxcount(); resettransformcount(); resetstep(); @@ -745,7 +1103,7 @@ int GetTransformCount() { - // marde pour serialization de Texture + // patch pour serialization de Texture resetmaxcount(); resettransformcount(); resetstep(); @@ -758,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 @@ -779,9 +1137,12 @@ // factor = CameraPane.STEP; // } - if (marked && CameraPane.isLIVE() && live && CameraPane.drawMode == CameraPane.SHADOW && currentframe != CameraPane.framecount) + if (marked && Globals.isLIVE() && live && + //TEMP21aug2018 + (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || !Globals.COMPUTESHADOWWHENLIVE) && + currentframe != Globals.framecount) { - currentframe = CameraPane.framecount; + currentframe = Globals.framecount; // System.err.println("transformcount = " + transformcount); // System.err.println("factor = " + factor); @@ -790,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; @@ -859,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() @@ -893,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; @@ -935,7 +1310,7 @@ public Object clone() { - return GrafreeD.clone(this); + return Grafreed.clone(this); } Object3D copyExpand() @@ -945,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() @@ -954,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) @@ -1024,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) // { @@ -1151,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 @@ -1257,6 +1603,7 @@ toParent = LA.newMatrix(); fromParent = LA.newMatrix(); } + LA.matCopy(other.toParent, toParent); LA.matCopy(other.fromParent, fromParent); @@ -1451,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); } @@ -1710,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 @@ -1723,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); @@ -1810,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;) @@ -2130,21 +2480,9 @@ if (/*parent != null &&*/ material == null) { material = new cMaterial(GetMaterial()); - if (projectedVertices == null || projectedVertices.length <= 2) - { - projectedVertices = new Object3D.cVector2[3]; - } - for (int i = 0; i < 3; i++) - { - projectedVertices[i] = new cVector2(); // Others - } - projectedVertices[0].x = 100; // bump - if (this instanceof Camera) - { - material.shift = 90; - } - + InitOthers(); + material.multiply = multiply; if (multiply) @@ -2282,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) { @@ -2322,6 +2670,14 @@ { editWindow.refreshContents(); } + else + { + if (manipWindow != null) + { + manipWindow.refreshContents(); + } + } + //if (parent != null) //parent.refreshEditWindow(); } @@ -2401,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) { @@ -2409,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(); } @@ -2417,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; @@ -2439,7 +2800,7 @@ } } - boolean doParentClick(ClickInfo info) + boolean doParentClick() //ClickInfo info) { if (selection == null) { @@ -2452,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; @@ -2464,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' @@ -2483,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; @@ -2505,6 +2871,9 @@ { deselectAll(); } + + new Exception().printStackTrace(); + ClickInfo newInfo = new ClickInfo(); newInfo.flags = info.flags; newInfo.bounds = info.bounds; @@ -2597,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); @@ -2737,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; @@ -2894,7 +3293,8 @@ { if (bRep != null) { - bRep.GenUV(); + bRep.GenUV(); //1); + //bRep.UnfoldUV(); Touch(); } } @@ -2903,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(); } } @@ -2912,7 +3324,7 @@ { if (bRep != null) { - bRep.GenerateNormalsMINE(); + bRep.MergeNormals(); //.GenerateNormalsMINE(); Touch(); } } @@ -2969,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; @@ -3184,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(); @@ -3293,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) @@ -3329,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++) @@ -3350,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++) @@ -3370,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++) @@ -3390,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++) @@ -3400,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); } @@ -3437,6 +4053,7 @@ void RevertMeshes() { + // BLOCKLOOP if (this instanceof cMesh) { ((cMesh)this).Revert(); @@ -3467,11 +4084,6 @@ Touch(); } - ResetRecur(); - } - - void ResetRecur() - { for (int i = 0; i < size(); i++) { Object3D child = (Object3D) get(i); // reserve(i); @@ -3494,11 +4106,6 @@ Step(); Touch(); - StepRecur(); - } - - void StepRecur() - { for (int i = 0; i < size(); i++) { Object3D child = (Object3D) get(i); // reserve(i); @@ -3685,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) { @@ -3702,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(); @@ -3729,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) @@ -3865,7 +4472,7 @@ if (child == null) continue; - if (GrafreeD.RENDERME > 0) + if (Grafreed.RENDERME > 0) { if (child instanceof Merge) ((Merge)child).renderme(); @@ -4060,7 +4667,7 @@ if (child == null) continue; - if (GrafreeD.RENDERME > 0) + if (Grafreed.RENDERME > 0) { if (child instanceof Merge) ((Merge)child).renderme(); @@ -4157,6 +4764,71 @@ } blockloop = true; get(i).RepairParent(); + blockloop = false; + } + } + + void RepairShadow() + { + if (blockloop) + return; + + if (this.material != null) + this.InitOthers(); + + for (int i=0; i<Size(); i++) + { + 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; } } @@ -4651,7 +5323,7 @@ cTreePath SelectLeaf(int indexcount, boolean deselect) { - if (hide) + if (hide || dontselect) return null; if (count <= 0) @@ -4675,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) @@ -4711,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; @@ -4731,6 +5412,7 @@ if (child == null) continue; + if (child.HasTransparency() && child.size() != 0) { cTreePath leaf = child.Select(indexcount, deselect); @@ -4740,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; @@ -4827,7 +5510,7 @@ return globalTransform; } - void PreprocessOcclusion(CameraPane cp) + void PreprocessOcclusion(iCameraPane cp) { /* if (AOdone) @@ -4974,7 +5657,8 @@ } else // if (editWindow != null) { - editWindow.cameraView.lighttouched = true; + //editWindow.cameraView.lighttouched = true; + Globals.lighttouched = true; } } @@ -5066,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) @@ -5126,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) @@ -5139,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() @@ -5217,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; @@ -5226,6 +6017,9 @@ texname = ""; GetTextures().name = texname + ":" + GetBump(GetTextures()); + + GetTextures().pigment = null; + Touch(); } @@ -5250,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) @@ -5261,6 +6092,8 @@ texname = ""; GetTextures().name = Object3D.GetPigment(GetTextures()) + ":" + texname; + + GetTextures().bump = null; Touch(); } @@ -5286,25 +6119,79 @@ } } - void draw(CameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) + 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); } - static cMaterial[] materialstack = new cMaterial[65536]; - static boolean[] selectedstack = new boolean[65536]; - static int materialdepth = 0; - 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!! - && (CameraPane.drawMode == CameraPane.SHADOW || CameraPane.CROWD); + && (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || Globals.CROWD); } + static boolean DEBUG_SELECTION = false; - void Draw(CameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) + 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) { Invariants(); // june 2013 @@ -5313,8 +6200,31 @@ // System.err.println("Draw " + this + " Frame # " + ((Mocap)((Merge)support).object).frame); } - if (display.drawMode == CameraPane.SELECTION && - hide) + 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 || dontselect)) return; if (name != null && name.contains("sclera")) @@ -5332,7 +6242,7 @@ if (this instanceof Checker) return; - if (display.drawMode == display.SHADOW && PASSTEST) + if (display.DrawMode() == display.SHADOW && PASSTEST) return; if (count <= 0) @@ -5340,13 +6250,13 @@ return; } - if ((//display.drawMode == CameraPane.SHADOW || - display.drawMode == CameraPane.SELECTION || CameraPane.DEBUG_SELECTION) && HasTransparency()) + if ((//display.DrawMode() == CameraPane.SHADOW || + display.DrawMode() == iCameraPane.SELECTION || display.IsDebugSelection()) && HasTransparency()) { return; } - javax.media.opengl.GL gl = display.GetGL(); + //javax.media.opengl.GL gl = display.GetGL(); /* if (touched) @@ -5364,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) { @@ -5373,32 +6286,36 @@ 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(); boolean compiled = false; - boolean selectmode = display.drawMode == display.SELECTION || CameraPane.DEBUG_SELECTION; + boolean selectmode = display.DrawMode() == display.SELECTION || display.IsDebugSelection(); - if (!selectmode && //display.drawMode != display.SELECTION && - (touched || (bRep != null && bRep.displaylist <= 0))) + if (!selectmode && //display.DrawMode() != display.SELECTION && + //(touched || (bRep != null && bRep.displaylist <= 0))) + (Globals.isLIVE() && Globals.COMPUTESHADOWWHENLIVE || touched && Globals.COMPUTESHADOWWHENLIVE)) // || (bRep != null && bRep.displaylist <= 0))) { - display.lighttouched = true; + 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 && + + //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))) { 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); @@ -5407,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; - display.lighttouched = true; // all panes... + 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) { @@ -5460,12 +6379,12 @@ // frustum culling if (CameraPane.FRUSTUM && !blocked && !IsInfinite() && GetBRep() != null // && GetBRep().VertexCount() != 1260 // default grid - && display.drawMode != CameraPane.SELECTION) + && display.DrawMode() != iCameraPane.SELECTION) { - if (display.drawMode == CameraPane.SHADOW) + 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; @@ -5473,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); @@ -5509,11 +6428,12 @@ if (!culled) - if (display.drawMode == display.SELECTION || CameraPane.DEBUG_SELECTION) + if (display.DrawMode() == display.SELECTION || display.IsDebugSelection()) { if (GetBRep() != null) { - CameraPane.NextIndex(this, gl); + display.NextIndex(); + // vertex color conflict : gl.glCallList(list); DrawNode(display, root, selected); if (this instanceof BezierPatch) @@ -5525,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 { /* @@ -5535,55 +6469,7 @@ color[2] /= 2; gl.glMaterialfv(gl.GL_BACK, gl.GL_AMBIENT_AND_DIFFUSE, color, 0); */ - if (material != null) - { - materialstack[materialdepth] = material; - selectedstack[materialdepth] = selected; - cStatic.objectstack[materialdepth++] = this; - //System.out.println("material " + material); - //Applet3D.tracein(this, selected); - display.vector2buffer = projectedVertices; - if (this instanceof Camera) - { - display.options1[0] = material.shift; - //System.out.println("shift " + material.shift); - display.options1[1] = material.lightarea; - display.options1[2] = material.shadowbias; - display.options1[3] = material.aniso; - display.options1[4] = material.anisoV; - display.options2[0] = material.opacity; - display.options2[1] = material.diffuse; - display.options2[2] = material.factor; - - cColor.HSBtoRGB(material.color, material.modulation, 1, display.options3); - display.options4[0] = material.cameralight/0.2f; - display.options4[1] = material.subsurface; - display.options4[2] = material.sheen; - - // if (display.CURRENTANTIALIAS > 0) - // display.options3[3] /= 4; - - /* - System.out.println("Focus = " + display.options1[0]); - System.out.println("Aperture = " + display.options1[1]); - System.out.println("ShadowBlur = " + display.options1[2]); - System.out.println("Antialiasing = " + display.options1[3]); - System.out.println("Fog = " + display.options2[0]); - System.out.println("Intensity = " + display.options2[1]); - System.out.println("Elevation = " + display.options2[2]); - /**/ - } else - { - material.Draw(display, selected); - } - } else - { - if (selected && CameraPane.flash) - { - display.modelParams4[1] = 100; - gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 4, display.modelParams4, 0); - } - } + display.PushMaterial(this, selected); //System.out.println("call list " + list); //System.out.println(); @@ -5602,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) { @@ -5618,30 +6526,33 @@ // 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 (parent != null && parent.GetMaterial() != null) - // parent.GetMaterial().Draw(display, parent.IsSelected(this)); - if (material != null) - { - materialdepth -= 1; - if (materialdepth > 0) - { - display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices; - materialstack[materialdepth - 1].Draw(display, selectedstack[materialdepth - 1]); - } - //Applet3D.traceout("selected ", (stackdepth>0)?selectedstack[stackdepth-1]:"???"); - } else if (selected && CameraPane.flash && GetMaterial() != null) - { - display.modelParams4[1] = GetMaterial().cameralight; - gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 4, display.modelParams4, 0); - } + if (!failedBump) + display.ReleaseBumpTexture(tex); + + if (!failedPigment) + display.ReleasePigmentTexture(tex); + + display.PopMaterial(this, selected); } if (this instanceof Texture || this instanceof TextureNode) @@ -5683,18 +6594,19 @@ // resetMasterNode(); } - void CallList(CameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) + 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); } } @@ -5766,8 +6678,11 @@ boolean flipV = false; // true; int texres = 0; // 0 = low, 1 = normal, 2 = high res texture - void drawSelf(CameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) + void drawSelf(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { + if (display.DrawMode() == iCameraPane.SELECTION && dontselect) + return; + if (hide) return; // shadow optimisation @@ -5825,16 +6740,7 @@ // // ??????????????????????????? Touch(); // } - if (material != null) - { - materialstack[materialdepth] = material; - selectedstack[materialdepth] = selected; - cStatic.objectstack[materialdepth++] = this; - //System.out.println("material " + material); - //Applet3D.tracein("selected ", selected); - display.vector2buffer = projectedVertices; - material.Draw(display, selected); - } +display.PushMaterial2(this, selected); Object3D child; boolean sel; @@ -5886,19 +6792,7 @@ */ //depth += 1; - if (material != null) - { - materialdepth -= 1; - if (materialdepth > 0) - { - display.vector2buffer = cStatic.objectstack[materialdepth - 1].projectedVertices; - materialstack[materialdepth - 1].Draw(display, selectedstack[materialdepth - 1]); - } - //Applet3D.traceout("selected ", (stackdepth>0)?selectedstack[stackdepth-1]:"???"); - //else - //material.Draw(display, false); - } - +display.PopMaterial2(this); /* display.ReleaseTextures(tex); */ @@ -5909,10 +6803,13 @@ //static cVector min,max; - void DrawNode(CameraPane display, Object3D /*Composite*/ root, boolean selected) + void DrawNode(iCameraPane display, Object3D /*Composite*/ root, boolean selected) { - if (display.drawMode == display.SHADOW && projectedVertices != null && projectedVertices.length > 2 && projectedVertices[2].y >= 10000) + 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; @@ -5954,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) // || CameraPane.movingcamera) + if (CameraPane.BOXMODE && !Link2Support()) //selected) // || CameraPane.movingcamera) { int fc = bRep.FaceCount(); int vc = bRep.VertexCount(); @@ -5973,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; } @@ -6033,7 +6915,7 @@ { //throw new Error(); - boolean selectmode = display.drawMode == display.SELECTION || CameraPane.DEBUG_SELECTION; + boolean selectmode = display.DrawMode() == display.SELECTION || display.IsDebugSelection(); int[] strips = bRep.getRawIndices(); @@ -6043,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++) { @@ -6277,9 +7000,9 @@ // // r.norm.dot(v3) > -0.5) // // continue; - drawFace(p, q, r, display, face); + display.DrawFace(this, p, q, r, face); } - gl.glEnd(); + display.EndTriangles(); } else { @@ -6295,7 +7018,7 @@ facescompare[k] = new FaceCompare(k); } - center = new cVector(); + centertriangle = new cVector(); } else { @@ -6308,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); @@ -6321,13 +7044,14 @@ Vertex q = bRep.GetVertex(face.q); Vertex r = bRep.GetVertex(face.r); - drawFace(p, q, r, display, face); + 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]; @@ -6406,6 +7130,7 @@ // gl.glEnd(); } } + */ } } @@ -6416,7 +7141,7 @@ */ } - transient cVector center; + transient cVector centertriangle; class FaceCompare implements Comparable { @@ -6445,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(CameraPane.theRenderer.eyeCamera.location); + centertriangle.sub(Globals.theRenderer.EyeCamera().location); - distance = center.dot(center); + distance = centertriangle.dot(centertriangle); } return distance; @@ -6461,347 +7186,11 @@ transient FaceCompare[] facescompare = null; - void SetColor(CameraPane display, Vertex p0) - { - if (display.RENDERPROGRAM == 0) - { - float r = 0; - if (bRep != null) - { - if (bRep.stripified) - { - r = 1; - } - } - float g = 0; - if (bRep != null) - { - if (bRep.trimmed) - { - g = 1; - } - } - float b = 0; - if (support != null && link2master) - { - b = 1; - } - display.GetGL().glColor3f(r*p0.AO, g*p0.AO, b*p0.AO); - return; - } - - if (display.drawMode != CameraPane.SHADOW) - return; - - javax.media.opengl.GL gl = display.GetGL(); -// if (true) return; -// float ao = p.AO; -// -// // if (ao == 0 && !bRep.AOdone) // transient problem! -// // ao = 1; -// -// gl.glColor4f(ao, ao, ao, 1); - -// CameraPane.selectedpoint. -// getAverage(cStatic.point1, true); - if (CameraPane.pointflow == null) // !random) // live) - { - return; - } - - cStatic.point1.set(0,0,0); - LA.xformPos(cStatic.point1, CameraPane.selectedpoint.toParent, cStatic.point1); - - cStatic.point1.sub(p0); - - -// if (marked && (p0.vertexlinks == null || support == null || support.bRep == null)) // no position delta? -// { -// return; -// } - - //if (true) - if (cStatic.point1.dot(cStatic.point1) > 0.000001) - { - return; - } - - float[] colorV = new float[3]; - - if (false) // marked) - { - // debug rigging weights - for (int object = 0; object < p0.vertexlinks.length; object++) - { - float weight = p0.weights[object] / p0.totalweight; - - // if (weight < 0.1) - // { - // assert(weight == 0); - // continue; - // } - - if (p0.vertexlinks[object] == -1) - continue; - - Vertex q = support.bRep.GetVertex(p0.vertexlinks[object]); - - int color = //1 << object; // - //p.vertexlinks.length; - support.bRep.supports[p0.closestsupport].links[object]; - colorV[2] += (color & 1) * weight; - colorV[1] += ((color & 2) >> 1) * weight; - colorV[0] += ((color & 4) >> 2) * weight; - } - } - else - { - if (drawingstarted) - { - // find next point - if (bRep.GetVertex(0).faceindices == null) - { - bRep.InitFaceIndices(); - } - - double ymin = p0.y; - - Vertex newp = p0; - - for (int fii = 0; fii < p0.faceindices.length; fii++) - { - int fi = p0.faceindices[fii]; - - if (fi == -1) - break; - - Face f = bRep.GetFace(fi); - - Vertex p = bRep.GetVertex(f.p); - Vertex q = bRep.GetVertex(f.q); - Vertex r = bRep.GetVertex(f.r); - - int swap = (int)(Math.random()*3); - -// for (int s=swap; --s>=0;) -// { -// Vertex t = p; -// p = q; -// q = r; -// r = t; -// } - if (ymin > p.y) - { - ymin = p.y; - newp = p; -// break; - } - if (ymin > q.y) - { - ymin = q.y; - newp = q; -// break; - } - if (ymin > r.y) - { - ymin = r.y; - newp = r; -// break; - } - } - - CameraPane.selectedpoint.toParent[3][0] = newp.x; - CameraPane.selectedpoint.toParent[3][1] = newp.y; - CameraPane.selectedpoint.toParent[3][2] = newp.z; - - drawingstarted = false; - - // return; - } - - if (false) // CameraPane.DRAW - { - p0.AO = colorV[0] = 2; - colorV[1] = 2; - colorV[2] = 2; - } - - CameraPane.pointflow.add(p0); - CameraPane.pointflow.Touch(); - } - -// gl.glColor3f(colorV[0], colorV[1], colorV[2]); -// gl.glMaterialfv(gl.GL_FRONT, gl.GL_DIFFUSE, colorV, 0); -// gl.glMaterialfv(gl.GL_BACK, gl.GL_DIFFUSE, colorV, 0); - } - 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 drawFace(Vertex pv, Vertex qv, Vertex rv, - CameraPane display, Face face) - { - if (pv.y == -10000 || - qv.y == -10000 || - rv.y == -10000) - return; - -// float b = f.nbiterations & 1; -// float g = (f.nbiterations>>1) & 1; -// float r = (f.nbiterations>>2) & 1; -// -// //if (f.weight == 10000) -// //{ -// // r = 1; g = b = 0; -// //} -// //else -// //{ -// // assert(f.weight < 10000); -// r = g = b = (float)bRep.FaceWeight(f)*100; -// if (r<0) -// assert(r>=0); -// //} - - javax.media.opengl.GL gl = display.GetGL(); - - boolean selectmode = display.drawMode == display.SELECTION || CameraPane.DEBUG_SELECTION; - - //System.out.println("p = " + pv + "; q = " + qv + "; r = " + rv); - if (!selectmode) // display.drawMode != display.SELECTION) // && display.drawMode != display.SHADOW) // (attributes & FILL) != 0) - { - //gl.glBegin(gl.GL_TRIANGLES); - boolean hasnorm = pv.norm != null; // && (pv.norm.x != 0 || pv.norm.y != 0 || pv.norm.z != 0); - if (!hasnorm) - { - // System.out.println("FUCK!!"); - LA.vecSub(pv/*.pos*/, qv/*.pos*/, v0); - LA.vecSub(pv/*.pos*/, rv/*.pos*/, v1); - LA.vecCross(v0, v1, v2); - LA.vecNormalize(v2); - gl.glNormal3f((float) v2.x, (float) v2.y, (float) v2.z); - } - - if (hasnorm) - { -// if (!pv.norm.normalized()) -// assert(pv.norm.normalized()); - - //System.out.println("normalp = " + pv.norm.x + ", " + pv.norm.y + ", " + pv.norm.z); - gl.glNormal3f((float) pv.norm.x, (float) pv.norm.y, (float) pv.norm.z); - } - gl.glColor4f(pv.AO, pv.AO, pv.AO, 1); - SetColor(display, pv); - //gl.glColor4f(r, g, b, 1); - //gl.glColor4f(pv.boundary, pv.boundary, pv.boundary, 1); - if (flipV) - gl.glTexCoord2f((float) pv.s, 1-(float) pv.t); - else - gl.glTexCoord2f((float) pv.s, (float) pv.t); - //System.out.println("vertexp = " + pv.x + ", " + pv.y + ", " + pv.z); - gl.glVertex3f((float) pv./*pos.*/x, (float) pv./*pos.*/y, (float) pv./*pos.*/z); -// Print(pv); - if (hasnorm) - { -// assert(qv.norm.normalized()); - //System.out.println("normalq = " + qv.norm.x + ", " + qv.norm.y + ", " + qv.norm.z); - gl.glNormal3f((float) qv.norm.x, (float) qv.norm.y, (float) qv.norm.z); - } - //System.out.println("vertexq = " + qv.s + ", " + qv.t); - // boolean locked = false; - // float eps = 0.1f; - // boolean wrap = CameraPane.UVWRAP; // true; // UV WRAP TEXTURE ISSUE: true = artifacts, false = nice - - // int dot = 0; //*/ (int)f.dot; - - // 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) - if (flipV) - gl.glTexCoord2f((float) qv.s, 1-(float) qv.t); - else - gl.glTexCoord2f((float) qv.s, (float) qv.t); - // else - // { - // locked = true; - // gl.glTexCoord2f((float) pv.s, (float) pv.t); - // } - gl.glColor4f(qv.AO, qv.AO, qv.AO, 1); - SetColor(display, qv); - //gl.glColor4f(r, g, b, 1); - //gl.glColor4f(qv.boundary, qv.boundary, qv.boundary, 1); - //System.out.println("vertexq = " + qv.x + ", " + qv.y + ", " + qv.z); - gl.glVertex3f((float) qv./*pos.*/x, (float) qv./*pos.*/y, (float) qv./*pos.*/z); -// Print(qv); - if (hasnorm) - { -// assert(rv.norm.normalized()); - //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) - if (flipV) - gl.glTexCoord2f((float) rv.s, 1-(float) rv.t); - else - gl.glTexCoord2f((float) rv.s, (float) rv.t); - // else - // gl.glTexCoord2f((float) pv.s, (float) pv.t); - - // f.dot = dot; - - gl.glColor4f(rv.AO, rv.AO, rv.AO, 1); - SetColor(display, rv); - //gl.glColor4f(r, g, b, 1); - //gl.glColor4f(rv.boundary, rv.boundary, rv.boundary, 1); - //System.out.println("vertexr = " + rv.x + ", " + rv.y + ", " + rv.z); - gl.glVertex3f((float) rv./*pos.*/x, (float) rv./*pos.*/y, (float) rv./*pos.*/z); -// Print(rv); - //gl.glEnd(); - } - else - { - gl.glVertex3f((float) pv.x, (float) pv.y, (float) pv.z); - gl.glVertex3f((float) qv.x, (float) qv.y, (float) qv.z); - gl.glVertex3f((float) rv.x, (float) rv.y, (float) rv.z); - - } - - if (false) // (attributes & WIREFRAME) != 0) - { - gl.glDisable(gl.GL_LIGHTING); - - gl.glBegin(gl.GL_LINE_LOOP); - gl.glVertex3d(pv./*pos.*/x, pv./*pos.*/y, pv./*pos.*/z); - gl.glVertex3d(qv./*pos.*/x, qv./*pos.*/y, qv./*pos.*/z); - gl.glVertex3d(rv./*pos.*/x, rv./*pos.*/y, rv./*pos.*/z); - gl.glEnd(); - - gl.glEnable(gl.GL_LIGHTING); - } - } - void drawSelf(ClickInfo info, int level, boolean select) { if (bRep == null) @@ -7325,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; @@ -7346,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) { @@ -7363,98 +7758,104 @@ { 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); - 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; - } - spot.translate(32, 32); + clickInfo.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; +// } +// 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); - 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.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.cyan); + clickInfo.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; +// } + 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) - { - CameraPane.Xmin = boundary.x; - } - if (CameraPane.Xmax < boundary.x + boundary.width) - { - CameraPane.Xmax = boundary.x + boundary.width; - } - if (CameraPane.Ymin > boundary.y) - { - CameraPane.Ymin = boundary.y; - } - if (CameraPane.Ymax < boundary.y + boundary.height) - { - CameraPane.Ymax = boundary.y + boundary.height; - } +// if (CameraPane.Xmin > boundary.x) +// { +// CameraPane.Xmin = boundary.x; +// } +// if (CameraPane.Xmax < boundary.x + boundary.width) +// { +// CameraPane.Xmax = boundary.x + boundary.width; +// } +// if (CameraPane.Ymin > boundary.y) +// { +// CameraPane.Ymin = boundary.y; +// } +// if (CameraPane.Ymax < boundary.y + boundary.height) +// { +// CameraPane.Ymax = boundary.y + boundary.height; +// } return; } } - boolean doEditClick0(ClickInfo info, int level) + boolean doEditClick0(//ClickInfo clickInfo, + int level) { if (level == 0) { @@ -7463,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(); @@ -7474,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; } @@ -7499,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; @@ -7527,7 +7959,8 @@ return true; } - void doEditDrag0(ClickInfo info) + void doEditDrag0(//ClickInfo info, + boolean opposite) { if (hitSomething == 0) { @@ -7541,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) @@ -7552,9 +7986,11 @@ case hitCenter: // Translate - scale *= 0.05f * info.pane.theRenderer.renderCamera.Distance(); + scale *= 0.05f * Globals.theRenderer.RenderCamera().Distance(); - if (modified) + // Modified could snap + if (//modified || + opposite) { //assert(false); /* @@ -7574,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); @@ -7584,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); @@ -7600,20 +8036,20 @@ } LA.xformDir(up, ClickInfo.matbuffer, up); // if (!CameraPane.LOCALTRANSFORM) - LA.xformDir(up, info.pane.theRenderer.renderCamera.toScreen, up); - LA.xformDir(info.camera.away, ClickInfo.matbuffer, away); + LA.xformDir(up, Globals.theRenderer.RenderCamera().toScreen, up); + LA.xformDir(clickInfo.camera.away, ClickInfo.matbuffer, away); // if (!CameraPane.LOCALTRANSFORM) - LA.xformDir(away, info.pane.theRenderer.renderCamera.toScreen, away); + 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 @@ -7628,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); @@ -7638,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); @@ -7648,6 +8084,7 @@ if (modified) { + // Rotate 45 degrees angle /= (Math.PI / 4); angle = Math.floor(angle + 0.5); angle *= (Math.PI / 4); @@ -7661,7 +8098,7 @@ } /**/ - switch (info.pane.renderCamera.viewCode) + switch (clickInfo.pane.RenderCamera().viewCode) { case 1: // '\001' LA.matZRotate(toParent, angle); @@ -7688,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++) @@ -7717,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; } @@ -7783,7 +8241,7 @@ } // NEW ... - info.pane.repaint(); + clickInfo.pane.repaint(); } boolean overflow = false; @@ -7882,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); } @@ -7945,6 +8411,7 @@ objectUI.closeUI(); if (editWindow != null) { + editWindow.ctrlPanel.FlushUI(); editWindow.refreshContents(); } // ? new objectUI = null; @@ -7953,6 +8420,10 @@ { editWindow = null; } // ? + } + else + { + //editWindow.closeUI(); } } @@ -7965,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; @@ -8080,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 { @@ -8111,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(); @@ -8125,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; @@ -8162,6 +8637,8 @@ void SetAttributes(Object3D obj, int mask) { Object3D targ = this; + + targ.NORMALPUSH = obj.NORMALPUSH; if (obj.material != null) { @@ -8322,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