From 5e6a6f3319f0c4c687fe71952ac9ecc17792b83a Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Mon, 10 Jun 2019 20:37:18 -0400 Subject: [PATCH] Fix normal for mesh --- Object3D.java | 285 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 227 insertions(+), 58 deletions(-) diff --git a/Object3D.java b/Object3D.java index 2cb44d8..2c2cf4d 100644 --- a/Object3D.java +++ b/Object3D.java @@ -14,11 +14,15 @@ 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; + + private UUID uuid = UUID.randomUUID(); ScriptNode scriptnode; @@ -300,6 +304,7 @@ } boolean live = false; + boolean dontselect = false; boolean hide = false; boolean link2master = false; // performs reset support/master at each frame boolean marked = false; // animation node @@ -774,7 +779,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 @@ -797,7 +802,7 @@ if (marked && Globals.isLIVE() && live && //TEMP21aug2018 - Globals.DrawMode() == iCameraPane.SHADOW && + (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW) && currentframe != Globals.framecount) { currentframe = Globals.framecount; @@ -912,6 +917,11 @@ fromParent = null; // LA.newMatrix(); bRep = null; // new BoundaryRep(); + if (oname != null && oname.equals("LeftHand")) + { + name = oname; + } + /* float hue = (float)Math.random(); Color col; @@ -954,7 +964,7 @@ public Object clone() { - return GrafreeD.clone(this); + return Grafreed.clone(this); } Object3D copyExpand() @@ -1470,7 +1480,7 @@ BoundaryRep.SEUIL = other.material.cameralight; // Set default to 0.1 - BoundaryRep.SEUIL /= 2; + BoundaryRep.SEUIL /= 4; // 2; System.out.println("SEUIL = " + BoundaryRep.SEUIL); } @@ -1729,7 +1739,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 @@ -1742,7 +1752,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); @@ -1829,12 +1839,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;) @@ -2477,13 +2490,13 @@ return retval; } - void doEditDrag(ClickInfo info) + void doEditDrag(ClickInfo info, boolean opposite) { switch (doSomething) { case 1: // '\001' //super. - doEditDrag0(info); + doEditDrag0(info, opposite); break; case 2: // '\002' @@ -2496,11 +2509,11 @@ { //sel.hitSomething = childToDrag.hitSomething; //childToDrag.doEditDrag(info); - sel.doEditDrag(info); + sel.doEditDrag(info, opposite); } else { //super. - doEditDrag0(info); + doEditDrag0(info, opposite); } } break; @@ -2983,6 +2996,33 @@ 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; @@ -3204,9 +3244,11 @@ 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(); @@ -3728,7 +3770,7 @@ if (child == null) continue; - if (GrafreeD.RENDERME > 0) + if (Grafreed.RENDERME > 0) { if (child instanceof Merge) ((Merge)child).renderme(); @@ -3879,7 +3921,7 @@ if (child == null) continue; - if (GrafreeD.RENDERME > 0) + if (Grafreed.RENDERME > 0) { if (child instanceof Merge) ((Merge)child).renderme(); @@ -4074,7 +4116,7 @@ if (child == null) continue; - if (GrafreeD.RENDERME > 0) + if (Grafreed.RENDERME > 0) { if (child instanceof Merge) ((Merge)child).renderme(); @@ -4681,7 +4723,7 @@ cTreePath SelectLeaf(int indexcount, boolean deselect) { - if (hide) + if (hide || dontselect) return null; if (count <= 0) @@ -4707,7 +4749,7 @@ cTreePath Select(int indexcount, boolean deselect) { - if (hide) + if (hide || dontselect) return null; if (count <= 0) @@ -5159,10 +5201,34 @@ // 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 ""; + } + + if (split.length <= 2) + { + if (fullname.name.endsWith(":")) + { + // Windows + return fullname.name.substring(0, fullname.name.length()-1); + } + + return split[0]; + } + + // Windows + assert(split.length == 4); + + return split[0] + ":" + split[1]; } static String GetBump(cTexture fullname) @@ -5171,10 +5237,38 @@ return ""; // 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 ""; + } + + if (split.length == 1) + { + return ""; + } + + if (split.length == 2) + { + if (fullname.name.endsWith(":")) + { + // Windows + return ""; + } + + return split[1]; + } + + // Windows + assert(split.length == 4); + + return split[2] + ":" + split[3]; } String GetPigmentTexture() @@ -5248,7 +5342,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; @@ -5279,6 +5373,43 @@ child.ResetPigmentTexture(); blockloop = false; } + } + + 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) @@ -5325,9 +5456,9 @@ boolean NeedSupport() { return - CameraPane.SUPPORT && !CameraPane.movingcamera && link2master && /*live &&*/ support != null + CameraPane.SUPPORT && (!CameraPane.movingcamera || !Globals.FREEZEONMOVE) && link2master && /*live &&*/ support != null // PROBLEM with CROWD!! - && (Globals.DrawMode() == iCameraPane.SHADOW || Globals.CROWD); + && (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || Globals.CROWD); } static boolean DEBUG_SELECTION = false; @@ -5342,7 +5473,7 @@ } if (display.DrawMode() == iCameraPane.SELECTION && - hide) + (hide || dontselect)) return; if (name != null && name.contains("sclera")) @@ -5584,7 +5715,17 @@ tex = GetTextures(); } - display.BindTextures(tex, texres); + boolean failed = false; + + try + { + display.BindTextures(tex, texres); + } + catch (Exception e) + { + System.err.println("FAILED: " + this); + failed = true; + } if (!compiled) { @@ -5606,7 +5747,8 @@ } } - display.ReleaseTextures(tex); + if (!failed) + display.ReleaseTextures(tex); display.PopMaterial(this, selected); } @@ -5735,6 +5877,9 @@ void drawSelf(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { + if (display.DrawMode() == iCameraPane.SELECTION && dontselect) + return; + if (hide) return; // shadow optimisation @@ -5859,6 +6004,9 @@ { if (display.DrawMode() == display.SHADOW && projectedVertices != null && projectedVertices.length > 2 && projectedVertices[2].y >= 10000) return; // no shadow for transparent objects + + if (display.DrawMode() == iCameraPane.SELECTION && dontselect) + return; if (hide) return; @@ -6843,8 +6991,8 @@ // { // CameraPane.Ymax = spoth; // } - info.g.drawLine(spotw, spoth, spotw, spoth - 15); - info.g.drawLine(spotw, spoth, spotw - 15, spoth); + // bonhommes 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); @@ -6899,7 +7047,7 @@ startX = info.x; startY = info.y; - hitSomething = 0; + hitSomething = -1; cVector origin = new cVector(); //LA.xformPos(origin, toParent, origin); Rectangle spot = new Rectangle(); @@ -6932,7 +7080,7 @@ } //System.out.println("info.modifiers = " + info.modifiers); - modified = (info.modifiers & CameraPane.META) != 0; + modified = (info.modifiers & CameraPane.SHIFT) != 0; // Was META //System.out.println("modified = " + modified); //new Exception().printStackTrace(); //viewCode = info.pane.renderCamera.viewCode; @@ -6960,7 +7108,7 @@ return true; } - void doEditDrag0(ClickInfo info) + void doEditDrag0(ClickInfo info, boolean opposite) { if (hitSomething == 0) { @@ -6975,6 +7123,7 @@ //System.out.println("hitSomething = " + hitSomething); double scale = 0.005f * info.camera.Distance(); + cVector xlate = new cVector(); //cVector xlate2 = new cVector(); switch (hitSomething) @@ -6987,7 +7136,7 @@ scale *= 0.05f * Globals.theRenderer.RenderCamera().Distance(); - if (modified) + if (modified || opposite) { //assert(false); /* @@ -7081,6 +7230,7 @@ if (modified) { + // Rotate 90 degrees angle /= (Math.PI / 4); angle = Math.floor(angle + 0.5); angle *= (Math.PI / 4); @@ -7122,24 +7272,27 @@ case hitScale: // scale double hScale = (double) (info.x - centerPt.x) / 32; + 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) - { - hScale = 0.01; - } + double vScale = (double) (info.y - centerPt.y) / 32; - if (vScale < 0.01) + sign = 1; + if (vScale < 0) { - vScale = 0.01; + sign = -1; } - vScale = Math.pow(vScale, scale * 50); + vScale = sign*Math.pow(sign*vScale, scale * 50); if (vScale < 0.01) { - vScale = 0.01; + //vScale = 0.01; } LA.matCopy(startMat, toParent); /**/ @@ -7150,17 +7303,24 @@ } /**/ + double totalScale = Math.sqrt(hScale*hScale + vScale*vScale) / Math.sqrt(2); + + if (totalScale < 0.01) + { + totalScale = 0.01; + } + switch (info.pane.RenderCamera().viewCode) { case 3: // '\001' if (modified) { //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); + LA.matScale(toParent, totalScale, totalScale, totalScale); } // vScale, 1); break; @@ -7168,10 +7328,10 @@ if (modified) { //LA.matScale(toParent, hScale, 1, vScale); - LA.matScale(toParent, 1, vScale, 1); + LA.matScale(toParent, 1, totalScale, 1); } else { - LA.matScale(toParent, vScale, 1, vScale); + LA.matScale(toParent, totalScale, 1, totalScale); } break; @@ -7179,10 +7339,10 @@ if (modified) { //LA.matScale(toParent, hScale, vScale, 1); - LA.matScale(toParent, 1, 1, vScale); + LA.matScale(toParent, 1, 1, totalScale); } else { - LA.matScale(toParent, vScale, vScale, 1); + LA.matScale(toParent, totalScale, totalScale, 1); } break; } @@ -7315,14 +7475,22 @@ //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); } public int hashCode() @@ -7378,6 +7546,7 @@ objectUI.closeUI(); if (editWindow != null) { + editWindow.ctrlPanel.FlushUI(); editWindow.refreshContents(); } // ? new objectUI = null; @@ -7513,7 +7682,7 @@ { assert(bRep != null); if (!(support instanceof GenericJoint)) // support.bRep != null) - GrafreeD.Assert(support.bRep == bRep.support); + Grafreed.Assert(support.bRep == bRep.support); } else { @@ -7562,9 +7731,9 @@ 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; -- Gitblit v1.6.2