//
// UniverseBuilderJ3D.java
//
/*
copied from Sun's Java 3D API Specification. version 1.0
*/
package visad.java3d;
import java.lang.reflect.Method;
import javax.media.j3d.*;
import javax.vecmath.*;
public class UniverseBuilderJ3D extends Object {
// User-specified canvas
private Canvas3D canvas;
// Scene graph elements that the user may want access to
private VirtualUniverse universe;
private Locale locale;
TransformGroup vpTrans;
View view;
private BranchGroup vpRoot;
private ViewPlatform vp;
public UniverseBuilderJ3D(Canvas3D c) {
canvas = c;
// Establish a virtual universe, with a single hi-res Locale
universe = new VirtualUniverse();
locale = new Locale(universe);
// Create a PhysicalBody and Physical Environment object
PhysicalBody body = new PhysicalBody();
PhysicalEnvironment environment = new PhysicalEnvironment();
// Create a View and attach the Canvas3D and the physical
// body and environment to the view.
view = new View();
view.addCanvas3D(c);
view.setPhysicalBody(body);
view.setPhysicalEnvironment(environment);
if(minimumFrameCycleTime!=0) {
view.setMinimumFrameCycleTime(minimumFrameCycleTime);
}
// Create a branch group node for the view platform
vpRoot = new BranchGroup();
vpRoot.setCapability(BranchGroup.ALLOW_DETACH);
vpRoot.setCapability(Group.ALLOW_CHILDREN_READ);
// Create a ViewPlatform object, and its associated
// TransformGroup object, and attach it to the root of the
// subgraph. Attach the view to the view platform.
Transform3D t = new Transform3D();
t.set(new Vector3f(0.0f, 0.0f, 2.0f));
vp = new ViewPlatform();
vpTrans = new TransformGroup(t);
vpTrans.setCapability(Group.ALLOW_CHILDREN_READ);
vpTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
vpTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
vpTrans.addChild(vp);
vpRoot.addChild(vpTrans);
view.attachViewPlatform(vp);
// Attach the branch graph to the universe, via the Locale.
// The scene graph is now live!
locale.addBranchGraph(vpRoot);
}
private static long minimumFrameCycleTime=0;
/**
* This lets client code set the framecycletime on the View
*
* @param ms The frame cycle time in milliseconds
*/
public static void setMinimumFrameCycleTime(long ms) {
minimumFrameCycleTime = ms;
}
public void addBranchGraph(BranchGroup bg) {
if (locale != null) locale.addBranchGraph(bg);
}
/**
* Clean up resources according to
* http://wiki.java.net/bin/view/Javadesktop/Java3DApplicationDevelopment#Releasing_Canvas3D_View_and_Virt
*/
public void destroy() {
// clean up resources in a way compatible back to Java3D 1.2
for (int idx = 0; idx < view.numCanvas3Ds(); idx++) {
Canvas3D cvs = view.getCanvas3D(idx);
if (cvs.isOffScreen()) {
cvs.setOffScreenBuffer(null);
}
view.removeCanvas3D(cvs);
}
try {
view.attachViewPlatform(null);
} catch (RuntimeException why) {
// Apparently this might throw a NPE.
// Ignore because we're just trying to conform to best practice.
}
universe.removeAllLocales();
canvas = null;
universe = null;
locale = null;
vpTrans = null;
view = null;
vpRoot = null;
vp = null;
}
}