samer@0: /** samer@0: ViewGroup.java samer@0: samer@0: A View branch group containing a ViewPlatform samer@0: and associated Views, Canvas3Ds and Windows to samer@0: hold the canvases. Can be added dynamically samer@0: to a live universe. samer@0: samer@0: Parameters: samer@0: initial placement samer@0: autostart canvas? samer@0: autostart view? samer@0: keyboard navigator? samer@0: various view policies samer@0: samer@0: Requirements: samer@0: must be placable (hence TransformGroup and ViewPlatform) samer@0: must be Node so addable to universe samer@0: renderable: samer@0: view.renderOnce() samer@0: view.startView() samer@0: view.stopView() samer@0: canvas.startRenderer() samer@0: canvas.stopRenderer() samer@0: ... ? samer@0: disposable: cleans up properly samer@0: must have accessible View and Canvas objects samer@0: must manage multiple canvases for stereo samer@0: samer@0: */ samer@0: package samer.j3d; samer@0: samer@0: import samer.core.*; samer@0: import samer.tools.*; samer@0: import java.awt.*; samer@0: import java.awt.event.*; samer@0: import javax.media.j3d.*; samer@0: import javax.vecmath.*; samer@0: samer@0: samer@0: public class ViewBase extends javax.media.j3d.View implements Agent, WindowListener, Task samer@0: { samer@0: public ViewBase() samer@0: { samer@0: stopView(); // seems be started during constructor samer@0: samer@0: PhysicalBody body=new PhysicalBody(); samer@0: PhysicalEnvironment env=new PhysicalEnvironment(); samer@0: double d=Shell.getDouble("eyeSeparation",0.01); // units?? samer@0: body.setLeftEyePosition(new Point3d(-d,0,0)); samer@0: body.setRightEyePosition(new Point3d(d,0,0)); samer@0: body.setNominalEyeHeightFromGround(0); samer@0: samer@0: // canvas.getStereoAvailable() samer@0: // canvas.setStereoEnable samer@0: // queryProperties samer@0: samer@0: setPhysicalBody(body); samer@0: setPhysicalEnvironment(env); samer@0: samer@0: setWindowEyepointPolicy(View.RELATIVE_TO_WINDOW); samer@0: //setWindowResizePolicy(View.VIRTUAL_WORLD); samer@0: //setLocalEyeLightingEnable(true); samer@0: //setWindowMovementPolicy(View.VIRTUAL_WORLD); samer@0: setFrontClipDistance(Shell.getDouble("front",0.5)); samer@0: setBackClipDistance(Shell.getDouble("back",20)); samer@0: setDepthBufferFreezeTransparent(true); samer@0: // Shell.registerAgent(this); samer@0: } samer@0: samer@0: samer@0: public Canvas3D createCanvas() { samer@0: GraphicsConfigTemplate tmp=new GraphicsConfigTemplate3D(); samer@0: Shell.trace("Graphics configuration template: "+tmp); samer@0: samer@0: Canvas3D canvas=new Canvas3D( samer@0: GraphicsEnvironment.getLocalGraphicsEnvironment(). samer@0: getDefaultScreenDevice().getBestConfiguration(tmp)); samer@0: addCanvas3D(canvas); samer@0: return canvas; samer@0: } samer@0: samer@0: public Shell.Window createWindow(Canvas3D canvas, String name) { samer@0: Shell.Window w=Shell.getWindow(name); samer@0: w.container().setLayout(new java.awt.BorderLayout()); samer@0: w.container().add(canvas); samer@0: w.addWindowListener(this); samer@0: w.expose(); samer@0: // expose commands for agent samer@0: return w; samer@0: } samer@0: samer@0: public void dispose() { samer@0: stopView(); samer@0: // Shell.deregisterAgent(this); samer@0: } samer@0: samer@0: public void getCommands(Agent.Registry r) { samer@0: r.add("start").add("stop").add("render"); samer@0: } samer@0: public void execute(String cmd, Environment env) throws Exception { samer@0: if (cmd.equals("render")) renderOnce(); samer@0: else if (cmd.equals("start")) { Shell.trace("view staring"); startView(); } samer@0: else if (cmd.equals("stop")) { Shell.trace("view stopping"); stopView(); } samer@0: } samer@0: samer@0: public void starting() {} samer@0: public void stopping() {} samer@0: public void run() { if (!isViewRunning()) renderOnce(); } samer@0: samer@0: public void windowOpened(WindowEvent e) {} samer@0: public void windowClosed(WindowEvent e) { } samer@0: public void windowClosing(WindowEvent e) { dispose(); } samer@0: public void windowActivated(WindowEvent e) { } samer@0: public void windowDeactivated(WindowEvent e) {} samer@0: public void windowIconified(WindowEvent e) {} samer@0: public void windowDeiconified(WindowEvent e) {} samer@0: }