/* Copyright 2006 by Sean Luke and George Mason University Licensed under the Academic Free License version 3.0 See the file "LICENSE" for more information */ package sim.portrayal3d.simple; import sim.portrayal.*; import sim.portrayal3d.*; import sim.display.*; import javax.media.j3d.*; import javax.vecmath.*; import sim.display3d.*; import sim.util.*; public class SwitchedPortrayal3D extends SimplePortrayal3D { SimplePortrayal3D child; public SwitchedPortrayal3D(SimplePortrayal3D child) { this.child = child; } public PolygonAttributes polygonAttributes() { return child.polygonAttributes(); } public Inspector getInspector(LocationWrapper wrapper, GUIState state) { return child.getInspector(wrapper,state); } public String getName(LocationWrapper wrapper) { return child.getName(wrapper); } /** Sets the current display both here and in the child. */ public void setCurrentDisplay(Display3D display) { super.setCurrentDisplay(display); child.setCurrentDisplay(display); } /** Sets the current field portrayal both here and in the child. */ public void setCurrentFieldPortrayal(FieldPortrayal3D p) { super.setCurrentFieldPortrayal(p); child.setCurrentFieldPortrayal(p); } public boolean setSelected(LocationWrapper wrapper, boolean selected) { return child.setSelected(wrapper,selected); } public SimplePortrayal3D getChild(Object object) { if (child!=null) return child; else { if (!(object instanceof SimplePortrayal3D)) throw new RuntimeException("Object provided to SwitchedPortrayal3D is not a SimplePortrayal3D: " + object); return (SimplePortrayal3D) object; } } public boolean getShowsChild(Object obj) { if (obj == null) return true; // no information to say otherwise else if (obj instanceof Number) { return ((Number)obj).doubleValue() != 0.0; } else if (obj instanceof Valuable) { return ((Valuable)obj).doubleValue() != 0.0; } else return true; } public TransformGroup getModel(Object obj, TransformGroup previousTransformGroup) { Switch internalSwitch; if (previousTransformGroup == null) { TransformGroup internalTransformGroup = getChild(obj).getModel(obj,null); internalTransformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_READ); internalTransformGroup.clearCapabilityIsFrequent(TransformGroup.ALLOW_CHILDREN_READ); internalSwitch = new Switch(); internalSwitch.addChild(internalTransformGroup); internalSwitch.setCapability(Switch.ALLOW_SWITCH_READ); internalSwitch.setCapability(Switch.ALLOW_SWITCH_WRITE); internalSwitch.setCapability(Switch.ALLOW_CHILDREN_READ); internalSwitch.clearCapabilityIsFrequent(Switch.ALLOW_CHILDREN_READ); previousTransformGroup = new TransformGroup(); previousTransformGroup.setCapability(TransformGroup.ALLOW_CHILDREN_READ); previousTransformGroup.clearCapabilityIsFrequent(TransformGroup.ALLOW_CHILDREN_READ); previousTransformGroup.addChild(internalSwitch); } else { internalSwitch = (Switch)(previousTransformGroup.getChild(0)); TransformGroup internalTransformGroup = (TransformGroup)(internalSwitch.getChild(0)); getChild(obj).getModel(obj,internalTransformGroup); } internalSwitch.setWhichChild(getShowsChild(obj) ? Switch.CHILD_ALL : Switch.CHILD_NONE); return previousTransformGroup; } }