From de4f66e0239a736bce24e09c9a0b49b5bb92d84b Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Tue, 23 Jul 2019 02:41:35 -0400 Subject: [PATCH] Min shader. --- Object3D.java | 605 +++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 477 insertions(+), 128 deletions(-) diff --git a/Object3D.java b/Object3D.java index af581bd..1b9b4c0 100644 --- a/Object3D.java +++ b/Object3D.java @@ -24,6 +24,14 @@ private UUID uuid = UUID.randomUUID(); + // TEMPORARY for mocap undo. No need to be transient. + mocap.reader.BVHReader.BVHResult savebvh; + Object3D saveskeleton; + // + + byte[] versions[]; + int versionindex = -1; + ScriptNode scriptnode; void InitOthers() @@ -104,117 +112,178 @@ // 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 = link2master; + + 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; + } + } + + void ExtractBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable) + { + Object3D o; + + 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 + { + 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; + } + + ExtractBigData(o); + } + + void ExtractBigData(Object3D 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.versions = this.versions; + 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; + } + + void RestoreBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable) + { + if (!hashtable.containsKey(GetUUID())) + return; + + Object3D o = hashtable.get(GetUUID()); + + RestoreBigData(o); + + if (blockloop) + return; + blockloop = true; - child.SaveSupports(); + + //hashtable.remove(GetUUID()); + + for (int i=0; i<Size(); i++) + { + get(i).RestoreBigData(hashtable); + } + blockloop = false; } -} -void RestoreSupports() -{ - if (blockloop) - return; - - support = transientsupport; - link2master = transientlink2master; - transientsupport = null; - transientlink2master = false; - - if (bRep != null) + void RestoreBigData(Object3D o) { - bRep.RestoreSupports(); + this.bRep = o.bRep; + if (this.support != null && o.transientrep != null) + { + this.support.bRep = o.transientrep; + } + + this.selection = o.selection; + + this.versions = o.versions; + this.versionindex = o.versionindex; +// July 2019 if (this.bRep != null) +// this.bRep.support = o.transientrep; + // this.support = o.support; + // this.fileparent = o.fileparent; } - - for (int i = 0; i < Size(); i++) - { - Object3D child = (Object3D) get(i); - if (child == null) - continue; - blockloop = true; - child.RestoreSupports(); - blockloop = false; - } -} - -void ExtractBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable) -{ - if (hashtable.containsKey(GetUUID())) - return; - - Object3D o = new Object3D(); - o.bRep = this.bRep; - if (this.bRep != null) - { - o.transientrep = this.bRep.support; - o.bRep.support = null; - } - -// o.support = this.support; -// o.fileparent = this.fileparent; -// if (this.bRep != null) -// o.bRep = this.bRep.support; - - hashtable.put(GetUUID(), o); - - this.bRep = null; -// if (this.bRep != null) -// this.bRep.support = null; -// this.support = null; -// this.fileparent = null; - - for (int i=0; i<Size(); i++) - { - get(i).ExtractBigData(hashtable); - } -} - -void RestoreBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable) -{ - if (!hashtable.containsKey(GetUUID())) - return; - - Object3D o = hashtable.get(GetUUID()); - - this.bRep = o.bRep; - if (this.bRep != null) - this.bRep.support = o.transientrep; -// this.support = o.support; -// this.fileparent = o.fileparent; - - hashtable.remove(GetUUID()); - - for (int i=0; i<Size(); i++) - { - get(i).RestoreBigData(hashtable); - } -} // MOCAP SUPPORT double tx,ty,tz,rx,ry,rz; @@ -357,6 +426,7 @@ } boolean live = false; + transient boolean keepdontselect; boolean dontselect = false; boolean hide = false; boolean link2master = false; // performs reset support/master at each frame @@ -539,12 +609,14 @@ toParent = LA.newMatrix(); fromParent = LA.newMatrix(); } + if (toParentMarked == null) { if (maxcount != 1) { new Exception().printStackTrace(); } + toParentMarked = LA.newMatrix(); fromParentMarked = LA.newMatrix(); } @@ -855,7 +927,7 @@ if (marked && Globals.isLIVE() && live && //TEMP21aug2018 - (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW) && + (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || !Globals.COMPUTESHADOWWHENLIVE) && currentframe != Globals.framecount) { currentframe = Globals.framecount; @@ -867,7 +939,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; @@ -939,6 +1012,7 @@ if (material == null || material.multiply) return true; + // Transparent objects are dynamic because we have to sort the triangles. return material.opacity > 0.99; } @@ -1339,6 +1413,7 @@ toParent = LA.newMatrix(); fromParent = LA.newMatrix(); } + LA.matCopy(other.toParent, toParent); LA.matCopy(other.fromParent, fromParent); @@ -2360,6 +2435,10 @@ } */ } + else + { + //((ObjEditor)editWindow).SetupUI2(null); + } } void createEditWindow(GroupEditor callee, boolean newWindow) //, boolean root) @@ -2401,6 +2480,14 @@ { editWindow.refreshContents(); } + else + { + if (manipWindow != null) + { + manipWindow.refreshContents(); + } + } + //if (parent != null) //parent.refreshEditWindow(); } @@ -2685,6 +2772,18 @@ //Touch(); } + void GenNormalsMeshS() + { + selection.GenNormalsMesh(); +// for (int i=0; i<selection.size(); i++) +// { +// Object3D selectee = (Object3D) selection.elementAt(i); +// selectee.GenNormals(crease); +// } + + //Touch(); + } + void ClearColorsS() { selection.ClearColors(); @@ -2816,6 +2915,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; @@ -2988,11 +3105,20 @@ } } + void GenNormalsMesh0() + { + if (bRep != null) + { + bRep.GenerateNormalsMesh(); + Touch(); + } + } + void GenNormalsMINE0() { if (bRep != null) { - bRep.GenerateNormalsMINE(); + bRep.MergeNormals(); //.GenerateNormalsMINE(); Touch(); } } @@ -3438,7 +3564,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++) @@ -3459,7 +3586,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++) @@ -3479,7 +3607,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++) @@ -3499,7 +3628,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++) @@ -3509,6 +3638,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); } @@ -4286,6 +4455,55 @@ } } + 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; + } + } + void RepairTexture() { if (this instanceof FileObject || blockloop) @@ -4800,6 +5018,14 @@ } } + ObjEditor GetWindow() + { + if (editWindow != null) + return editWindow; + + return manipWindow; + } + cTreePath Select(int indexcount, boolean deselect) { if (hide || dontselect) @@ -4836,10 +5062,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; @@ -4856,6 +5083,7 @@ if (child == null) continue; + if (child.HasTransparency() && child.size() != 0) { cTreePath leaf = child.Select(indexcount, deselect); @@ -4865,9 +5093,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; @@ -5192,6 +5421,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) @@ -5501,6 +5775,38 @@ } } + void EmbedTextures(boolean embed) + { + if (blockloop) + return; + + //if (GetTextures() != null) + if (embed) + CameraPane.EmbedTextures(GetTextures()); + else + { + GetTextures().pigmentdata = null; + GetTextures().bumpdata = null; + GetTextures().pw = 0; + GetTextures().ph = 0; + GetTextures().bw = 0; + GetTextures().bh = 0; + } + + int nb = Size(); + for (int i = 0; i < nb; i++) + { + Object3D child = (Object3D) get(i); + + if (child == null) + continue; + + blockloop = true; + child.EmbedTextures(embed); + blockloop = false; + } + } + void draw(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { Draw(display, root, selected, blocked); @@ -5509,12 +5815,23 @@ boolean NeedSupport() { return - CameraPane.SUPPORT && (!CameraPane.movingcamera || !Globals.FREEZEONMOVE) && link2master && /*live &&*/ support != null + CameraPane.SUPPORT && (!CameraPane.movingcamera || (!Globals.FREEZEONMOVE && Globals.isLIVE())) && link2master && /*live &&*/ support != null // PROBLEM with CROWD!! && (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || Globals.CROWD); } static boolean DEBUG_SELECTION = false; + + boolean IsLive() + { + if (live) + return true; + + if (parent == null) + return false; + + return parent.IsLive(); + } void Draw(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { @@ -5577,7 +5894,7 @@ 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 = !IsLive(); // IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null) && !link2master; // !(this instanceof cSpring) && !(this instanceof BezierPatch); if (!usecalllists && bRep != null && bRep.displaylist > 0) { @@ -5597,10 +5914,12 @@ boolean selectmode = display.DrawMode() == display.SELECTION || display.IsDebugSelection(); if (!selectmode && //display.DrawMode() != display.SELECTION && - (touched || (bRep != null && bRep.displaylist <= 0))) + //(touched || (bRep != null && bRep.displaylist <= 0))) + (Globals.isLIVE() && Globals.COMPUTESHADOWWHENLIVE || touched && Globals.COMPUTESHADOWWHENLIVE)) // || (bRep != null && bRep.displaylist <= 0))) { Globals.lighttouched = true; } // all panes... + //if (usecalllists && display.DrawMode() != display.SELECTION && display.DrawMode() != display.SHADOW && if (bRep != null && usecalllists && !selectmode && // june 2013 display.DrawMode() != display.SHADOW && (touched || (bRep != null && bRep.displaylist <= 0))) @@ -5728,6 +6047,7 @@ if (GetBRep() != null) { display.NextIndex(); + // vertex color conflict : gl.glCallList(list); DrawNode(display, root, selected); if (this instanceof BezierPatch) @@ -5768,16 +6088,27 @@ tex = GetTextures(); } - boolean failed = false; + boolean failedPigment = false; + boolean failedBump = false; try { - display.BindTextures(tex, texres); + display.BindPigmentTexture(tex, texres); } catch (Exception e) { System.err.println("FAILED: " + this); - failed = true; + failedPigment = true; + } + + try + { + display.BindBumpTexture(tex, texres); + } + catch (Exception e) + { + //System.err.println("FAILED: " + this); + failedBump = true; } if (!compiled) @@ -5800,8 +6131,11 @@ } } - if (!failed) - display.ReleaseTextures(tex); + if (!failedBump) + display.ReleaseBumpTexture(tex); + + if (!failedPigment) + display.ReleasePigmentTexture(tex); display.PopMaterial(this, selected); } @@ -6174,6 +6508,11 @@ // dec 2012 new Exception().printStackTrace(); return; + } + + if (dontselect) + { + //bRep.GenerateNormalsMINE(); } display.DrawGeometry(bRep, flipV, selectmode); @@ -7026,7 +7365,7 @@ spot.translate(32, 32); spotw = spot.x + spot.width; spoth = spot.y + spot.height; - info.g.setColor(Color.blue); + info.g.setColor(Color.cyan); info.g.fillRect(spot.x, spot.y, spot.width, spot.height); // if (CameraPane.Xmin > spot.x) // { @@ -7044,11 +7383,12 @@ // { // CameraPane.Ymax = spoth; // } - // bonhommes info.g.drawLine(spotw, spoth, spotw, spoth - 15); - //info.g.drawLine(spotw, spoth, spotw - 15, 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(0, -32); - info.g.setColor(Color.green); + info.g.setColor(Color.yellow); info.g.fillRect(spot.x, spot.y, spot.width, spot.height); + info.g.setColor(Color.green); // if (CameraPane.Xmin > spot.x) // { // CameraPane.Xmin = spot.x; @@ -7065,8 +7405,8 @@ // { // CameraPane.Ymax = spoth; // } - info.g.drawArc(boundary.x, boundary.y, - boundary.width, boundary.height, 0, 360); + info.g.drawArc(boundary.x + info.DX, boundary.y + info.DY, + (int)(boundary.width * info.W), (int)(boundary.height * info.W), 0, 360); //info.g.drawArc(spot.x, spotw, spot.width/2, boundary.height/2, 0, 360); // if (CameraPane.Xmin > boundary.x) // { @@ -7366,19 +7706,20 @@ switch (info.pane.RenderCamera().viewCode) { case 3: // '\001' - if (modified) + if (modified || opposite) { //LA.matScale(toParent, 1, hScale, vScale); LA.matScale(toParent, totalScale, 1, 1); } // vScale, 1); else { + // EXCEPTION! LA.matScale(toParent, totalScale, totalScale, totalScale); } // vScale, 1); break; case 2: // '\002' - if (modified) + if (modified || opposite) { //LA.matScale(toParent, hScale, 1, vScale); LA.matScale(toParent, 1, totalScale, 1); @@ -7389,7 +7730,7 @@ break; case 1: // '\003' - if (modified) + if (modified || opposite) { //LA.matScale(toParent, hScale, vScale, 1); LA.matScale(toParent, 1, 1, totalScale); @@ -7609,6 +7950,10 @@ editWindow = null; } // ? } + else + { + //editWindow.closeUI(); + } } boolean root; // patch for edit windows @@ -7766,6 +8111,10 @@ } transient ObjEditor editWindow; + transient ObjEditor manipWindow; + + transient boolean pinned; + transient ObjectUI objectUI; public static int povDepth = 0; private static cVector tbMin = new cVector(); -- Gitblit v1.6.2