/* 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.app.balls3d; import javax.media.j3d.*; import javax.vecmath.*; import sim.portrayal3d.simple.*; import java.awt.Color; public class BallPortrayal extends SpherePortrayal3D { final static Color obColor = Color.green; final static Color colColor = Color.red; float multiply; public BallPortrayal( double diam ) { multiply = (float) diam; } public TransformGroup getModel(Object obj, TransformGroup j3dModel) { // Below we'd like to change the appearance of our sphere whenever // it collides or stops colliding, or set it the very first time we present // the sphere to the user. Likewise we'd like to change the size of // the sphere whenever its mass changes, or set it the very first time // as well. // If the j3DModel is null, then we're being asked to construct a brand new model // likely for the very first time. At this point there is *no* model // on which we can change appearance or set scales. So how do we set them // the very first time? The answer is: don't worry about it. The setAppearance // and setScale methods are constructed such that if you call them // _before_ the model is built, your desired changes are stored away temporarily // until super.getModel(...) is called, at which point they're applied when // the model is built. // alternatively, the arrangement below could have instead have been done as: // TransformGroup ret = super.getModel(obj, j3dModel); // ... do the various collision and mass stuff ... // return ret; // ... that is, we call super.getModel(...) *first*, then update things. Here // the model has for sure already been built (because if it wasn't built already, // super.getModel(...) surely did so). Thus the setAppearance and setScale methods // just directly modify the model. // It works either way. if (j3dModel==null || ((Ball)obj).oldCollision != ((Ball)obj).collision ) // either the first time or when it changes { ((Ball)obj).oldCollision = ((Ball)obj).collision; // reset it if (((Ball)obj).collision) setAppearance(j3dModel, appearanceForColors( colColor, // ambient color null, // emissive color (black) colColor, // diffuse color null, // specular color (white) 1.0f, // no shininess 1.0f)); // full opacity else setAppearance(j3dModel, appearanceForColors( obColor, // ambient color null, // emissive color (black) obColor, // diffuse color null, // specular color (white) 1.0f, // no shininess 1.0f)); // full opacity } if (j3dModel==null || ((Ball)obj).oldMass != ((Ball)obj).mass) // likewise { ((Ball)obj).oldMass = ((Ball)obj).mass; // reset it setScale(j3dModel, multiply * (float)(((Ball)obj).diameter) / 2.0f); } return super.getModel(obj, j3dModel); } }