import java.awt.Rectangle; import java.util.Enumeration; import java.util.Vector; class Composite extends Object3D implements java.io.Serializable { //static final long serialVersionUID = 7573824863213044426L; static final long serialVersionUID = 2504838101189782470L; Composite() { this("Composite"); } Composite(String name) { super(name); children = this; // new Vector(); selection = new Object3D(); // Vector(0, 0); } Composite Children() { return this; } // void RemoveOneTriangle() // { // super.RemoveOneTriangle(); // for (int i = 0; i < Children().size(); i++) // { // Object3D child = (Object3D) Children().reserve(i); // child.RemoveOneTriangle(); // Children().release(i); // } // } // void ClearMaterials() // { // super.ClearMaterials(); // for (int i = 0; i < Children().size(); i++) // { // Object3D child = (Object3D) Children().reserve(i); // child.ClearMaterials(); // Children().release(i); // } // } // void GenUVS() // { // for (int i=0; i keep = new Vector(); for (int i = 0; i < super.size(); i++) { Object3D obj = (Object3D) super.get(i); keep.add(obj); } /**/ // super.clear(); // Composite compo = (Composite) deepCopy(); // //compo.clear(); // Wipe serialized version /** // for (int i = 0; i < keep.size(); i++) { add(keep.get(i)); } /**/ /* if (this instanceof Texture) compo = new Texture(); else if (this instanceof CSG) compo = new CSG(); else if (this instanceof cGroup) compo = new cGroup(); else compo = new Composite(); */ Composite compo = new Composite(); super.deepCopySelf(compo); for (int i = 0; i < Children().size(); i++) { Object3D obj = (Object3D) Children().reserve(i); compo.addChild(obj.copyExpand()); Children().release(i); } //super.deepCopySelf(compo); return compo; } protected void deepCopySelf(Object3D other) { super.deepCopySelf(other); if (false) { Composite c = (Composite) other; if (selection != null) { // assert(false); // ?!?!?!?!?! c.selection = /*(Vector)*/ (Object3D) selection.clone(); } else { c.selection = new Object3D(); // Vector(0, 0); } assert (c.Children() == c); //?? c.clear(); /**/ c.Children().setSize(Children().size()); for (int i=0; i < Children().size(); i++) { Object3D obj = (Object3D)Children().get(i); if (IsContainedIn(obj)) { // assert(false); // ?!?!?!?!?! c.Children().setElementAt(c, i); } else { obj = obj.deepCopy(); obj.parent = c; c.Children().setElementAt(obj, i); } } /**/ } /** Composite copy = (Composite) GraphreeD.clone(this); copy.Reset(); assert copy != null; // .Children() = copy; for (int i = 0; i < copy.Children().size(); i++) { Object3D obj = (Object3D) copy.Children().reserve(i); c.addChild(obj); copy.Children().release(i); } /**/ } // transient cVector min = new cVector(); // transient cVector max = new cVector(); void getBounds0(cVector minima, cVector maxima, boolean xform) { new Exception().printStackTrace(); System.exit(0); minima.x = minima.y = minima.z = 1E10; maxima.x = maxima.y = maxima.z = -1E10; // if (HasLoops()) // { // return; // } cVector min = new cVector(); cVector max = new cVector(); if (min == null) // ??? { min = new cVector(); max = new cVector(); } for (int i = Children().size(); --i >= 0;) { Object3D child = (Object3D) Children().reserve(i); child.getBounds(min, max, true); // xform); Children().release(i); for (int xyz = 0; xyz < 3; xyz++) { if (min.get(xyz) < minima.get(xyz)) { minima.set(xyz, min.get(xyz)); } if (max.get(xyz) > maxima.get(xyz)) { maxima.set(xyz, max.get(xyz)); } } } //System.out.println("Bounds = " + minima + " - " + maxima); if (xform) { transformBounds(minima, maxima); } //System.out.println("Bounds2 = " + minima + " - " + maxima); } void generatePOV(StringBuffer buffer) { Object3D child; for (Enumeration e = Children().elements(); e.hasMoreElements(); child.generatePOV(buffer)) { child = (Object3D) e.nextElement(); } } void createEditWindow(GroupEditor callee, boolean newWindow) //, boolean root) { // may 2014: use Object3D... if (!newWindow) { super.createEditWindow(callee, newWindow); return; } // NEW WINDOW if (root) //false) // mar 2013 //parent == null) { editWindow = new GroupEditor(this, this, callee).GetEditor(); } else /* editWindow = new GroupEditor(this, deepCopy(), callee); */ { if (newWindow) { objectUI = new GroupEditor(this, deepCopy(), callee); } else { objectUI = new GroupEditor(this, callee, true); } editWindow = objectUI.GetEditor(); } } /* void addChild(Object3D child) { //new Exception().printStackTrace(); Children().addElement(child); //System.out.println("Add " + child + " to " + this); //System.out.println("iscontained? " + IsContainedIn(child)); if (child.parent == null || !IsContainedIn(child)) // criss de patch de fou... { child.setParent(this); //System.out.println("Set parent = " + child.parent); } Touch(); } */ // void removeChild(Object3D child) // { // /* // child.setParent(null); // Children().removeElement(child); // */ // //System.out.println("child = " + child); // //System.out.println("child.parent = " + child.parent); // //System.out.println("this = " + this); // // if (Children().indexOf(child) >= 0) // { // child.setParent(null); // Children().removeElement(child); // } else // { // // removeChild(child.parent); // for (int i = 0; i < Children().size(); i++) // { // Object3D obj = (Object3D) Children().reserve(i); // obj.removeChild(child); // Children().release(i); // } // } // // if (selection != null) // selection.removeElement(child); // // Touch(); // } // // void addSelectee(Object3D child) // { // // We accept multiple link... // if (false) // selectees.indexOf(child) != -1) // { // //assert (selectees.indexOf(child) == -1); // System.out.println("Child = " + child + "; this = " + this); // new Exception().printStackTrace(); // } // // if (selection != null) // selection.addElement(child); // //? child.SoftTouch(); // } // // void removeSelectee(Object3D child) // { // selection.removeElement(child); // //? child.SoftTouch(); // } // // void deselectAll() // { // childToDrag = null; // // if (selection == null) // new Exception().printStackTrace(); // else // selection.clear(); // //? SoftTouch(); // } // // void ClearSelection(boolean all) // { // if (all || (selection.size() > 0 && selection.get(0) == this)) // { // selection.clear(); // for (Object3D child : Children()) // { // child.ClearUI(); // } // Children().clear(); // } else // { // Object3D selectee; // for (; selection.size() > 0; selectee.ClearUI(), removeChild(selectee)) // { // selectee = (Object3D) selection.elementAt(0); // } // } // // childToDrag = null; // // Touch(); // } void SoftTouch() { super.SoftTouch(); for (int i = 0; i < Children().size(); i++) { Object3D obj = (Object3D) Children().reserve(i); if (obj == null) continue; if (obj.material == null) { obj.SoftTouch(); } Children().release(i); } } void HardTouch() { super.HardTouch(); for (int i = 0; i < Children().size(); i++) { Object3D child = (Object3D) Children().reserve(i); if (child == null) continue; child.HardTouch(); Children().release(i); } } // void ClearMaterial() // { // if (selection.size() == 0) // { // super.ClearMaterial(); // } else // { // for (int i = 0; i < selection.size(); i++) // { // Object3D o = (Object3D) selection.get(i); // if (o == this) // { // super.ClearMaterial(); // continue; // } // o.ClearMaterial(); // } // } // } // void CreateMaterial() // { // if (selection.size() == 0) // { // super.CreateMaterial(); // } else // { // for (int i = 0; i < selection.size(); i++) // { // Object3D o = (Object3D) selection.get(i); // if (o != this) // { // o.CreateMaterial(); // } else // { // super.CreateMaterial(); // } // } // } // } // void UpdateMaterial(cMaterial anchor, cMaterial current, boolean propagate) // { // if (blockloop) // { // return; // } // // super.UpdateMaterial(anchor, current, false); // // if (!propagate) // { // return; // } // // for (int i = 0; i < Children().size(); i++) // { // Object3D child = (Object3D) Children().reserve(i); // blockloop = true; // child.UpdateMaterial(anchor, current, propagate); // blockloop = false; // Children().release(i); // } // // int temp = count; // // count = 0; // try leaf // for (int i = 0; i < Children().size(); i++) // { // Object3D child = (Object3D) Children().reserve(i); // blockloop = true; // child.UpdateMaterial(anchor, current, propagate); // blockloop = false; // Children().release(i); // } // // count = temp; // } // boolean IsSelected(Object3D child) { if (selection != null) { if (selection.indexOf(child) != -1) { return true; } } if (parent == null) { return false; } if (parent.IsContainedIn(this)) { return false; } return true; // parent.IsSelected(child); } /* cTreePath Select(int indexcount, boolean deselect) { if (count <= 0) { return null; } if (bRep != null) { cTreePath tp = super.Select(indexcount, deselect); //HANDLE if (tp != null || !(this instanceof BezierPatch)) return tp; } for (int i = 0; i < Children().size(); i++) { Object3D child = (Object3D) Children().reserve(i); if (!child.HasTransparency()) { cTreePath leaf = child.Select(indexcount, deselect); Children().release(i); if (leaf != null) { cTreePath tp = new cTreePath(this, leaf); if (editWindow != null) { //System.out.println("editWindow = " + editWindow + " vs " + this); editWindow.Select(tp, deselect); } return tp; } } else { Children().release(i); } } for (int i = 0; i < Children().size(); i++) { Object3D child = (Object3D) Children().reserve(i); if (child.HasTransparency() && child.size() != 0) { cTreePath leaf = child.Select(indexcount, deselect); Children().release(i); if (leaf != null) { cTreePath tp = new cTreePath(this, leaf); if (editWindow != null) { editWindow.Select(tp, deselect); } return tp; } } else { Children().release(i); } } return null; } */ Vector GetSelectionTreePaths() { Vector tps = new Vector(); for (int i = 0; i < Children().size(); i++) { Object3D child = (Object3D) Children().reserve(i); boolean isSelected = IsSelected(child); Children().release(i); if (isSelected) { tps.add(child.GetTreePath()); } else { child.AppendSelectionTreePaths(tps); } } return tps; } void AppendSelectionTreePaths(Vector tps) { for (int i = 0; i < Children().size(); i++) { Object3D child = (Object3D) Children().reserve(i); boolean isSelected = IsSelected(child); Children().release(i); if (isSelected) { tps.add(child.GetTreePath()); } else { child.AppendSelectionTreePaths(tps); } } } void draw(ClickInfo info, int level, boolean select) { new Exception().printStackTrace(); ClickInfo newInfo = new ClickInfo(); newInfo.flags = info.flags; newInfo.bounds = info.bounds; newInfo.camera = info.camera; newInfo.g = info.g; newInfo.toScreen = info.toScreen; if (newInfo.toScreen == null) { newInfo.toScreen = info.camera.toScreen; } if (level > 0) { newInfo.toScreen = new double[4][4]; LA.matConcat(toParent, info.toScreen, newInfo.toScreen); } Object3D child; boolean sel; //for (Enumeration e = Children().elements(); e.hasMoreElements(); child.draw(newInfo, level + 1, sel)) int nb = Children().size(); for (int i = 0; i < nb; i++) { //child = (Object3D)e.nextElement(); child = (Object3D) Children().reserve(i); sel = select; if (level == 0 && IsSelected(child)) { sel = true; } child.draw(newInfo, level + 1, sel); Children().release(i); } } void draw(iCameraPane display, Object3D /*Composite*/ root, boolean selected, boolean blocked) { if (this instanceof BezierPatch) { //DrawNode(display,root,selected); super.draw(display, root, selected, blocked); //return; // HANDLE } if (count <= 0) // || display.IsFreezed()) { return; } if ((//display.drawMode == CameraPane.SHADOW || display.DrawMode() == CameraPane.SELECTION || display.IsDebugSelection()) && //HasTransparency()) // SERIAL PATCH // if (viewCode == -1) // { // viewCode = 0; // false; // if ( super.HasTransparency()) // { // viewCode = 1; // } // true; // } { return; } cTexture tex = null; boolean selectmode = display.DrawMode() == display.SELECTION || display.IsDebugSelection(); if (//display.drawMode != display.SHADOW && !selectmode // display.drawMode != display.SELECTION ) { tex = GetTextures(); } boolean failedPigment = false; boolean failedBump = false; 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 (//true) // new NORMAND touched || softtouched) { // ??????? touched = false; // ??? //Applet3D.tracein("DRAW : ", this); if (this instanceof Texture || this instanceof TextureNode) { //System.out.println("Texture2 = "); LA.matPrint(toParent); display.PushTextureMatrix(ToParent(), GetTransformCount()); } else { //System.out.println("Model2 = " + this); Invariants(); // june 2013 display.PushMatrix(ToParent(), GetTransformCount()); if (!cLinker.stack.empty()) // cLinker.stack.peek() != null) { LA.xformPos(cLinker.stack.peek(), fromParent, cLinker.stack.peek()); } } drawSelf(display, root, selected, blocked); if (this instanceof Texture || this instanceof TextureNode) { display.PopTextureMatrix(fromParent); } else { /* System.out.println("PUSH"); LA.matPrint(fromParent); LA.matInvert(toParent, display.tmpmat); System.out.println("REAL"); LA.matPrint(display.tmpmat); System.out.println(); */ display.PopMatrix(fromParent); if (!cLinker.stack.empty()) // cLinker.stack.peek() != null) { LA.xformPos(cLinker.stack.peek(), toParent, cLinker.stack.peek()); } } //Applet3D.traceout("DRAW : ", this); //?? softtouched = false; //if(display.drawMode == display.DEFAULT) // touched = softtouched = false; // ????????? } else { if (CameraPane.HANDLES) { BoundaryRep brep = bRep; bRep = null; super.draw(display, root, selected, blocked); bRep = brep; } } if (!failedBump) display.ReleaseBumpTexture(tex); if (!failedPigment) display.ReleasePigmentTexture(tex); } void Reset0() { /* if (count <= 1) { return; } */ super.ResetDisplayList(); // Patch... if (parent != null) { if (selection == null) selection = new Object3D(); selection.clear(); } Object3D child; int nb = Children().size(); for (int i = 0; i < nb; i++) { child = (Object3D) Children().reserve(i); child.ResetDisplayList(); Children().release(i); } } // void PreprocessOcclusion(CameraPane cp) // { // /* // if (AOdone) // return; // // AOdone = true; // */ // // if (blockloop) // return; // // if (count <= 0) // { // return; // } // // int nb = Children().size(); // for (int i = 0; i < nb; i++) // { // // WARNING LOOP // Object3D child = (Object3D) Children().reserve(i); // //Object3D child = (Object3D) Children().get(i); // // if (child == null) // continue; // // blockloop = true; // child.PreprocessOcclusion(cp); // blockloop = false; // // Children().release(i); // } // } void drawSelfOld(iCameraPane display, Object3D /*Composite*/ root, boolean selected) { // if (count <= 0) // || display.IsFreezed()) // { // return; // } // // //if (depth == 0) // //return; // //Applet3D.tracein("draw", this); // cTexture tex = null; // // if (display.drawMode != display.SELECTION) // { // tex = GetTextures(); // } // // //System.out.println("Object = " + this); // // // if (display.BindTextures(tex)) // { // Touch(); // } // // if (material != null) // { // materialstack[stackdepth] = material; // selectedstack[stackdepth] = selected; // cStatic.objectstack[stackdepth++] = this; // //System.out.println("material " + material); // //Applet3D.tracein("selected ", selected); // display.vector2buffer = projectedVertices; // material.Draw(display, selected); // } // // Object3D child; // boolean sel; // int nb = Children().size(); // /* // for (int i=0; i 0) // { // display.vector2buffer = cStatic.objectstack[stackdepth - 1].projectedVertices; // materialstack[stackdepth - 1].Draw(display, selectedstack[stackdepth - 1]); // } // //Applet3D.traceout("selected ", (stackdepth>0)?selectedstack[stackdepth-1]:"???"); // //else // //material.Draw(display, false); // } // display.ReleaseTextures(tex); // //Applet3D.traceout("draw", this); } boolean HasTransparency() { if (true) return false; // SERIAL PATCH if (viewCode == -1) { viewCode = 0; // false; if (super.HasTransparency()) { viewCode = 1; } // true; else { Object3D child; int nb = Children().size(); for (int i = 0; i < nb; i++) { child = (Object3D) Children().reserve(i); boolean has = child.HasTransparency(); Children().release(i); if (has) { viewCode = 1; // true; break; } } } } return viewCode == 1; } // void drawEditHandles(ClickInfo info, int level) // { // if (level == 0) // { // if (selection == null) // return; // // Object3D selectee; // for (Enumeration e = selection.elements(); e.hasMoreElements(); selectee.drawEditHandles(info, level + 1)) // { // selectee = (Object3D) e.nextElement(); // } // // } else // { // super.drawEditHandles(info, level + 1); // } // } // // boolean doEditClick(ClickInfo info, int level) // { // doSomething = 0; // if (level == 0) // { // return doParentClick(info); // } // if (super.doEditClick(info, level)) // { // doSomething = 1; // return true; // } else // { // return false; // } // } // // boolean doParentClick(ClickInfo info) // { // boolean retval = false; // // for (Enumeration e = selection.elements(); e.hasMoreElements();) // { // Object3D selectee = (Object3D) e.nextElement(); // if (selectee.doEditClick(info, 1)) // { // childToDrag = selectee; // doSomething = 2; // //return true; // retval = true; // } // } // // return retval; // } // // void doEditDrag(ClickInfo info) // { // switch (doSomething) // { // case 1: // '\001' // super.doEditDrag(info); // break; // // case 2: // '\002' // // Use childToDrag for specific selection // for (int i = 0; i < selection.size(); i++) // { // Object3D sel = selection.get(i); // //System.out.println(" sel = " + sel); // if (sel != this) // childToDrag != this) // { // //sel.hitSomething = childToDrag.hitSomething; // //childToDrag.doEditDrag(info); // sel.doEditDrag(info); // } else // { // super.doEditDrag(info); // } // } // break; // } // } // // boolean doSelection(ClickInfo info, Rectangle r, int level) // { // if (level == 0) // { // deselectAll(); // } // ClickInfo newInfo = new ClickInfo(); // newInfo.flags = info.flags; // newInfo.bounds = info.bounds; // newInfo.camera = info.camera; // newInfo.g = info.g; // newInfo.toScreen = info.toScreen; // // if (newInfo.toScreen == null) // { // newInfo.toScreen = info.camera.toScreen; // } // if (level > 0) // { // newInfo.toScreen = new double[4][4]; // LA.matConcat(toParent, info.toScreen, newInfo.toScreen); // } // boolean temp = false; // Object3D child; // int nb = Children().size(); // for (int i = 0; i < nb; i++) // { // child = (Object3D) Children().reserve(i); // boolean doSelect = child.doSelection(newInfo, r, level + 1); // Children().release(i); // // if (doSelect) // { // temp = true; // if (level == 0) // { // addSelectee(child); // } // } // } // // if (level == 0 && editWindow != null) // { // editWindow.refreshContents(); // } // return temp; // } // // void invariants() // { // GraphreeD.tracein(this); // for (int i = 0; i < Children().size(); i++) // { // Object3D child = (Object3D) Children().reserve(i); // if (child == null) // continue; // // if (child.parent != null && child.parent != this) // { // System.out.println("INVARIANT FAIL: " + this); // } // child.invariants(); // Children().release(i); // } // // assert selection != null; // GraphreeD.traceout(this); // } Composite children; // no longer used /*transient*/ Vector selectees; // deprecated // transient private int doSomething; //// transient private Object3D childToDrag; // private static final int doNothing = 0; // private static final int editSelf = 1; // private static final int editChild = 2; /* public int Size() { return super.size(); } public int size() { ////GraphreeD.trace("SIZE " + this + " = ", super.size()); //System.out.println("SIZE = " + this + " " + super.size()); //assert (count >= 0); if (count <= 0) { return 0; } else { return super.size(); } } public Object3D reserve(int i) { ////GraphreeD.tracein("RESERVE " + this + " = ", i); Object3D child = super.get(i); //Applet3D.tracein("RESERVE ", child); child.count--; //assert (child.count >= 0); return child; } public void release(int i) { ////GraphreeD.traceout("RELEASE " + this + " = ", i); // Object3D child = super.get(i); // //Applet3D.traceout("RELEASE ", child); // child.count++; super.get(i).count++; //assert (child.count >= 0); } */ //int depth = 10; }