From 564f4d12d93813b5d680fc24d4f118c3886d96ed Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Tue, 20 Aug 2019 19:56:41 -0400 Subject: [PATCH] Parallax mapping! --- Object3D.java | 532 +++++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 423 insertions(+), 109 deletions(-) diff --git a/Object3D.java b/Object3D.java index a5ae9d9..aba2406 100644 --- a/Object3D.java +++ b/Object3D.java @@ -22,12 +22,21 @@ //static final long serialVersionUID = -607422624994562685L; static final long serialVersionUID = 5022536242724664900L; + // Use GetUUID for backward compatibility with null. private UUID uuid = UUID.randomUUID(); - // TEMPORARY for mocap undo - mocap.reader.BVHReader.BVHResult bvh; - Object3D skeleton; + // TEMPORARY for mocap undo. No need to be transient. + mocap.reader.BVHReader.BVHResult savebvh; + Object3D saveskeleton; // + + 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>(); ScriptNode scriptnode; @@ -170,24 +179,35 @@ void ExtractBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable) { + Object3D o; + if (hashtable.containsKey(GetUUID())) { - Object3D o = hashtable.get(GetUUID()); + o = hashtable.get(GetUUID()); Grafreed.Assert(this.bRep == o.bRep); - if (this.bRep != null) - assert(this.bRep.support == o.transientrep); + //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); - return; + hashtable.put(GetUUID(), o); } - Object3D o = new Object3D(); - - hashtable.put(GetUUID(), o); - - for (int i=0; i<Size(); i++) + if (!blockloop) { - get(i).ExtractBigData(hashtable); + blockloop = true; + + for (int i=0; i<Size(); i++) + { + get(i).ExtractBigData(hashtable); + } + + blockloop = false; } ExtractBigData(o); @@ -195,11 +215,26 @@ void ExtractBigData(Object3D o) { + if (o.bRep != null) + Grafreed.Assert(o.bRep == this.bRep); + o.bRep = this.bRep; - if (this.bRep != null) +// 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) { - o.transientrep = this.bRep.support; - o.bRep.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; @@ -214,6 +249,73 @@ // this.fileparent = null; } +// Object3D GetObject(java.util.UUID uuid) +// { +// if (this.uuid.equals(uuid)) +// return this; +// +// if (blockloop) +// return null; +// +// blockloop = true; +// +// for (int i=0; i<Size(); i++) +// { +// Object3D o = get(i).GetObject(uuid); +// +// if (o != null) +// return o; +// } +// +// blockloop = false; +// +// return null; +// } + + transient boolean tag; + + void TagObjects(Object3D o, boolean tag) + { + if (blockloop) + return; + + o.tag = tag; + + if (o == this) + return; + + blockloop = true; + + for (int i=0; i<Size(); i++) + { + get(i).TagObjects(o, tag); + } + + blockloop = false; + } + + boolean HasTags() + { + if (blockloop) + return false; + + blockloop = true; + + boolean hasTags = false; + + for (int i=0; i<Size(); i++) + { + hasTags |= get(i).tag || get(i).HasTags(); + + if (hasTags) + break; + } + + blockloop = false; + + return hasTags; + } + void RestoreBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable) { if (!hashtable.containsKey(GetUUID())) @@ -223,19 +325,35 @@ RestoreBigData(o); - hashtable.remove(GetUUID()); + if (blockloop) + return; + + blockloop = true; + + //hashtable.remove(GetUUID()); for (int i=0; i<Size(); i++) { get(i).RestoreBigData(hashtable); } + + blockloop = false; } void RestoreBigData(Object3D o) { this.bRep = o.bRep; - if (this.bRep != null) - this.bRep.support = o.transientrep; + 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; } @@ -381,6 +499,7 @@ } boolean live = false; + transient boolean keepdontselect; boolean dontselect = false; boolean hide = false; boolean link2master = false; // performs reset support/master at each frame @@ -881,7 +1000,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; @@ -966,6 +1085,10 @@ 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; } @@ -1366,6 +1489,7 @@ toParent = LA.newMatrix(); fromParent = LA.newMatrix(); } + LA.matCopy(other.toParent, toParent); LA.matCopy(other.fromParent, fromParent); @@ -2390,6 +2514,11 @@ else { //((ObjEditor)editWindow).SetupUI2(null); + if (objectUI != null) + ((ObjEditor)objectUI).pinButton.setSelected(pinned); + else + //new Exception().printStackTrace(); + System.err.println("objectUI is null"); } } @@ -2432,6 +2561,14 @@ { editWindow.refreshContents(); } + else + { + if (manipWindow != null) + { + manipWindow.refreshContents(); + } + } + //if (parent != null) //parent.refreshEditWindow(); } @@ -2511,7 +2648,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) { @@ -2519,7 +2657,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(); } @@ -2527,19 +2666,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; @@ -2549,7 +2691,7 @@ } } - boolean doParentClick(ClickInfo info) + boolean doParentClick() //ClickInfo info) { if (selection == null) { @@ -2562,7 +2704,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; @@ -2574,13 +2717,15 @@ return retval; } - void doEditDrag(ClickInfo info, boolean opposite) + void doEditDrag(//ClickInfo clickInfo, + boolean opposite) { switch (doSomething) { case 1: // '\001' //super. - doEditDrag0(info, opposite); + doEditDrag0(//clickInfo, + opposite); break; case 2: // '\002' @@ -2593,11 +2738,13 @@ { //sel.hitSomething = childToDrag.hitSomething; //childToDrag.doEditDrag(info); - sel.doEditDrag(info, opposite); + sel.doEditDrag(//clickInfo, + opposite); } else { //super. - doEditDrag0(info, opposite); + doEditDrag0(//clickInfo, + opposite); } } break; @@ -2615,6 +2762,9 @@ { deselectAll(); } + + new Exception().printStackTrace(); + ClickInfo newInfo = new ClickInfo(); newInfo.flags = info.flags; newInfo.bounds = info.bounds; @@ -3062,7 +3212,7 @@ { if (bRep != null) { - bRep.GenerateNormalsMINE(); + bRep.MergeNormals(); //.GenerateNormalsMINE(); Touch(); } } @@ -4962,6 +5112,14 @@ } } + ObjEditor GetWindow() + { + if (editWindow != null) + return editWindow; + + return manipWindow; + } + cTreePath Select(int indexcount, boolean deselect) { if (hide || dontselect) @@ -4998,10 +5156,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; @@ -5018,6 +5177,7 @@ if (child == null) continue; + if (child.HasTransparency() && child.size() != 0) { cTreePath leaf = child.Select(indexcount, deselect); @@ -5027,9 +5187,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; @@ -5354,6 +5515,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) @@ -5414,6 +5620,11 @@ if (fullname == null) return ""; + if (fullname.pigment != null) + { + return fullname.pigment; + } + // System.out.println("Fullname = " + fullname); // Does not work on Windows due to C: @@ -5426,7 +5637,7 @@ if (split.length == 0) { - return ""; + return fullname.pigment = ""; } if (split.length <= 2) @@ -5434,22 +5645,27 @@ if (fullname.name.endsWith(":")) { // Windows - return fullname.name.substring(0, fullname.name.length()-1); + return fullname.pigment = fullname.name.substring(0, fullname.name.length()-1); } - return split[0]; + return fullname.pigment = split[0]; } // Windows assert(split.length == 4); - return split[0] + ":" + split[1]; + return fullname.pigment = split[0] + ":" + split[1]; } static String GetBump(cTexture fullname) { if (fullname == null) return ""; + + if (fullname.bump != null) + { + return fullname.bump; + } // System.out.println("Fullname = " + fullname); // Does not work on Windows due to C: @@ -5461,12 +5677,12 @@ if (split.length == 0) { - return ""; + return fullname.bump = ""; } if (split.length == 1) { - return ""; + return fullname.bump = ""; } if (split.length == 2) @@ -5474,16 +5690,16 @@ if (fullname.name.endsWith(":")) { // Windows - return ""; + return fullname.bump = ""; } - return split[1]; + return fullname.bump = split[1]; } // Windows assert(split.length == 4); - return split[2] + ":" + split[3]; + return fullname.bump = split[2] + ":" + split[3]; } String GetPigmentTexture() @@ -5566,6 +5782,9 @@ texname = ""; GetTextures().name = texname + ":" + GetBump(GetTextures()); + + GetTextures().pigment = null; + Touch(); } @@ -5639,6 +5858,8 @@ GetTextures().name = Object3D.GetPigment(GetTextures()) + ":" + texname; + GetTextures().bump = null; + Touch(); } @@ -5659,6 +5880,38 @@ blockloop = true; child.ResetBumpTexture(); + blockloop = false; + } + } + + 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; } } @@ -5749,8 +6002,10 @@ if (support != null) support = support; - //boolean usecalllists = IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null || !link2master); // !(this instanceof cSpring) && !(this instanceof BezierPatch); - boolean usecalllists = IsLive(); // IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null) && !link2master; // !(this instanceof cSpring) && !(this instanceof BezierPatch); + boolean usecalllists = !IsLive() && IsStatic() && GetBRep() != null && (!CameraPane.SUPPORT || support == null || !link2master); // !(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) { @@ -5760,8 +6015,9 @@ // usecalllists &= !(parent instanceof RandomNode); // usecalllists = false; - if (GetBRep() != null) - usecalllists = usecalllists; + if (display.DrawMode() == display.SHADOW) + //GetBRep() != null) + usecalllists = !!usecalllists; //System.out.println("draw " + this); //new Exception().printStackTrace(); @@ -5771,7 +6027,7 @@ if (!selectmode && //display.DrawMode() != display.SELECTION && //(touched || (bRep != null && bRep.displaylist <= 0))) - (Globals.isLIVE() || touched && (bRep != null && bRep.displaylist <= 0))) + (Globals.isLIVE() && Globals.COMPUTESHADOWWHENLIVE || touched && Globals.COMPUTESHADOWWHENLIVE)) // || (bRep != null && bRep.displaylist <= 0))) { Globals.lighttouched = true; } // all panes... @@ -5783,7 +6039,7 @@ if (!(this instanceof Composite)) touched = false; //if (displaylist == -1 && usecalllists) - if ((bRep != null && bRep.displaylist <= 0) && usecalllists) // june 2013 + if (bRep.displaylist <= 0 && usecalllists) // && display.DrawMode() == display.DEFAULT) // june 2013 { bRep.displaylist = display.GenList(); assert(bRep.displaylist != 0); @@ -5794,7 +6050,7 @@ //System.out.println("\tnew list " + list); //gl.glDrawBuffer(gl.GL_NONE); - if (usecalllists) + if (usecalllists && bRep.displaylist > 0) { // System.err.println("new list " + bRep.displaylist + " for " + this); display.NewList(bRep.displaylist); @@ -5803,7 +6059,7 @@ CallList(display, root, selected, blocked); // compiled = true; - if (usecalllists) + if (usecalllists && bRep.displaylist > 0) { // System.err.println("end list " + bRep.displaylist + " for " + this); display.EndList(); @@ -5903,6 +6159,7 @@ if (GetBRep() != null) { display.NextIndex(); + // vertex color conflict : gl.glCallList(list); DrawNode(display, root, selected); if (this instanceof BezierPatch) @@ -7153,20 +7410,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; @@ -7174,15 +7434,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) { @@ -7191,16 +7454,19 @@ { cVector origin = new cVector(); //LA.xformPos(origin, toParent, origin); - Rectangle spot = calcHotSpot(origin, info); + if (this.clickInfo == null) + this.clickInfo = new ClickInfo(); + + Rectangle spot = calcHotSpot(origin); //, clickInfo); Rectangle boundary = new Rectangle(); boundary.x = spot.x - 30; boundary.y = spot.y - 30; boundary.width = spot.width + 60; boundary.height = spot.height + 60; - info.g.setColor(Color.red); + clickInfo.g.setColor(Color.white); int spotw = spot.x + spot.width; int spoth = spot.y + spot.height; - info.g.fillRect(spot.x, spot.y, spot.width, spot.height); + clickInfo.g.fillRect(spot.x, spot.y, spot.width, spot.height); // if (CameraPane.Xmin > spot.x) // { // CameraPane.Xmin = spot.x; @@ -7217,11 +7483,6 @@ // { // CameraPane.Ymax = spoth; // } - spot.translate(32, 32); - spotw = spot.x + spot.width; - spoth = spot.y + spot.height; - info.g.setColor(Color.cyan); - info.g.fillRect(spot.x, spot.y, spot.width, spot.height); // if (CameraPane.Xmin > spot.x) // { // CameraPane.Xmin = spot.x; @@ -7240,10 +7501,15 @@ // } // bonhommes info.g.drawLine(spotw, spoth, spotw, spoth - boundary.height/2); // 15 //info.g.drawLine(spotw, spoth, spotw - boundary.width/2, spoth); // 15 - spot.translate(0, -32); - info.g.setColor(Color.yellow); - info.g.fillRect(spot.x, spot.y, spot.width, spot.height); - info.g.setColor(Color.green); + spot.translate(32, 0); + clickInfo.g.setColor(Color.yellow); + clickInfo.g.fillRect(spot.x, spot.y, spot.width, spot.height); + + spot.translate(32, 64); + spotw = spot.x + spot.width; + spoth = spot.y + spot.height; + clickInfo.g.setColor(Color.cyan); + clickInfo.g.fillRect(spot.x, spot.y, spot.width, spot.height); // if (CameraPane.Xmin > spot.x) // { // CameraPane.Xmin = spot.x; @@ -7260,8 +7526,9 @@ // { // CameraPane.Ymax = spoth; // } - info.g.drawArc(boundary.x, boundary.y, - boundary.width, boundary.height, 0, 360); + clickInfo.g.setColor(Color.green); + clickInfo.g.drawArc(boundary.x + clickInfo.DX, boundary.y + clickInfo.DY, + (int)(boundary.width * clickInfo.W), (int)(boundary.height * clickInfo.W), 0, 360); //info.g.drawArc(spot.x, spotw, spot.width/2, boundary.height/2, 0, 360); // if (CameraPane.Xmin > boundary.x) // { @@ -7283,7 +7550,8 @@ } } - boolean doEditClick0(ClickInfo info, int level) + boolean doEditClick0(//ClickInfo clickInfo, + int level) { if (level == 0) { @@ -7292,8 +7560,8 @@ boolean retval = false; - startX = info.x; - startY = info.y; + startX = clickInfo.x; + startY = clickInfo.y; hitSomething = -1; cVector origin = new cVector(); @@ -7303,22 +7571,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; } @@ -7328,7 +7627,7 @@ } //System.out.println("info.modifiers = " + info.modifiers); - modified = (info.modifiers & CameraPane.SHIFT) != 0; // Was META + modified = (clickInfo.modifiers & CameraPane.SHIFT) != 0; // Was META //System.out.println("modified = " + modified); //new Exception().printStackTrace(); //viewCode = info.pane.renderCamera.viewCode; @@ -7356,7 +7655,8 @@ return true; } - void doEditDrag0(ClickInfo info, boolean opposite) + void doEditDrag0(//ClickInfo info, + boolean opposite) { if (hitSomething == 0) { @@ -7370,7 +7670,7 @@ //System.out.println("hitSomething = " + hitSomething); - double scale = 0.005f * info.camera.Distance(); + double scale = 0.005f * clickInfo.camera.Distance(); cVector xlate = new cVector(); //cVector xlate2 = new cVector(); @@ -7404,8 +7704,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); @@ -7414,7 +7714,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); @@ -7431,19 +7731,19 @@ LA.xformDir(up, ClickInfo.matbuffer, up); // if (!CameraPane.LOCALTRANSFORM) LA.xformDir(up, Globals.theRenderer.RenderCamera().toScreen, up); - LA.xformDir(info.camera.away, ClickInfo.matbuffer, away); + LA.xformDir(clickInfo.camera.away, ClickInfo.matbuffer, away); // if (!CameraPane.LOCALTRANSFORM) LA.xformDir(away, Globals.theRenderer.RenderCamera().toScreen, away); //LA.vecCross(up, cVector.Z, right2); - cVector delta = LA.newVector(info.x - startX, startY - info.y, 0); + cVector delta = LA.newVector(clickInfo.x - startX, startY - clickInfo.y, 0); //System.out.println("DELTA0 = " + delta); //System.out.println("AWAY = " + info.camera.away); //System.out.println("UP = " + info.camera.up); if (away.z > 0) { - if (info.camera.up.x == 0) // LA.vecDot(right, right2)<0) + if (clickInfo.camera.up.x == 0) // LA.vecDot(right, right2)<0) { delta.x = -delta.x; } else @@ -7458,7 +7758,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); @@ -7468,8 +7768,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); @@ -7492,7 +7792,7 @@ } /**/ - switch (info.pane.RenderCamera().viewCode) + switch (clickInfo.pane.RenderCamera().viewCode) { case 1: // '\001' LA.matZRotate(toParent, angle); @@ -7519,7 +7819,7 @@ break; case hitScale: // scale - double hScale = (double) (info.x - centerPt.x) / 32; + double hScale = (double) (clickInfo.x - centerPt.x) / 64; double sign = 1; if (hScale < 0) { @@ -7531,7 +7831,7 @@ //hScale = 0.01; } - double vScale = (double) (info.y - centerPt.y) / 32; + double vScale = (double) (clickInfo.y - centerPt.y) / 64; sign = 1; if (vScale < 0) { @@ -7542,6 +7842,7 @@ { //vScale = 0.01; } + LA.matCopy(startMat, toParent); /**/ for (int i = 0; i < 3; i++) @@ -7551,33 +7852,39 @@ } /**/ - double totalScale = Math.sqrt(hScale*hScale + vScale*vScale) / Math.sqrt(2); + double totalScale = Math.sqrt(hScale*hScale + vScale*vScale) / clickInfo.scale; if (totalScale < 0.01) { totalScale = 0.01; } - switch (info.pane.RenderCamera().viewCode) + switch (clickInfo.pane.RenderCamera().viewCode) { case 3: // '\001' if (modified || opposite) { + if (modified && opposite) + LA.matScale(toParent, totalScale, totalScale, totalScale); + else //LA.matScale(toParent, 1, hScale, vScale); - LA.matScale(toParent, totalScale, 1, 1); + LA.matScale(toParent, totalScale, 1, 1); } // vScale, 1); else { // EXCEPTION! - LA.matScale(toParent, totalScale, totalScale, totalScale); + LA.matScale(toParent, 1, totalScale, totalScale); } // vScale, 1); break; case 2: // '\002' if (modified || opposite) { - //LA.matScale(toParent, hScale, 1, vScale); - LA.matScale(toParent, 1, totalScale, 1); + if (modified && opposite) + LA.matScale(toParent, totalScale, totalScale, totalScale); + else + //LA.matScale(toParent, hScale, 1, vScale); + LA.matScale(toParent, 1, totalScale, 1); } else { LA.matScale(toParent, totalScale, 1, totalScale); @@ -7587,8 +7894,11 @@ case 1: // '\003' if (modified || opposite) { - //LA.matScale(toParent, hScale, vScale, 1); - LA.matScale(toParent, 1, 1, totalScale); + if (modified && opposite) + LA.matScale(toParent, totalScale, totalScale, totalScale); + else + //LA.matScale(toParent, hScale, vScale, 1); + LA.matScale(toParent, 1, 1, totalScale); } else { LA.matScale(toParent, totalScale, totalScale, 1); @@ -7625,7 +7935,7 @@ } // NEW ... - info.pane.repaint(); + clickInfo.pane.repaint(); } boolean overflow = false; @@ -7966,6 +8276,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