view examples/java3d/hello7.java @ 7:243687520bcc

Meh
author samer
date Fri, 05 Apr 2019 21:52:03 +0100
parents 5df24c91468d
children
line wrap: on
line source
/*
		hello7.java

		Construct universe without using SimpleUniverse 
		utility class - this puts together the view
		group explicitly.

		Now has dynamically creatable views all on the same
		view platform. Left and right eye views available!
 */

import samer.core.*;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;

import samer.core.Node;

public class hello7 extends util implements Agent
{
	// create universe
	LocalUniverse	U=new LocalUniverse();
	BranchGroup		root=new BranchGroup();
	ViewPlatform	VP=new ViewPlatform();
	
	public static void main(String[] arse) { init(); new hello7(); }

	public hello7()
	{		
		// create scene
		root.addChild(createSceneGraph());
		// addBackground(root,new Background(0.1f,0.2f,0.15f));
		// addLights(root);

		{ // view platform placement			
			TransformGroup	VT=new TransformGroup();
			Transform3D		t=new Transform3D();

			t.lookAt(new Point3d(0,16,20), new Point3d(0,0,0),new Vector3d(0,1,0));
			t.invert();
			VT.setTransform(t);

			// !!! all key navigators seem to be slaved!			
			addKeyNavigator(VT,readwrite(VT));
			VT.addChild(VP);
			root.addChild(VT);
		}
		// setCapability(ALLOW_DETACH);
		// setCapability(ALLOW_CHILDREN_WRITE);
		// compile();


		// add two  Views on same platform
		new view("left",VP);
		new view("right",VP);

		// root.setCapability(Group.ALLOW_CHILDREN_EXTEND);
		// root.setCapability(Group.ALLOW_CHILDREN_WRITE);
		root.compile();
		
		U.addGroup(root);

		Shell.registerAgent(this);
		Shell.exposeCommands(this);
	}

	public void getCommands(Agent.Registry r) { 
		r.add("view");
		r.setTarget(null); r.add("start").add("stop"); 
	}

	public void execute(String cmd, Environment env) throws Exception
	{
		if (cmd.equals("view")) { 
			new view(X.string(env.datum("name"),"view"),VP);
		}
	}

	private static TransformGroup createSceneGraph()
	{
		Transform3D		r=new Transform3D();
		// r.rotX(Math.PI/2);
		TransformGroup  t2=new TransformGroup(r);
		t2.addChild(yoyoGroup());

		TransformGroup	tg = new TransformGroup();
		addRotator(tg);
		tg.addChild(t2);
		return tg;
	}

	public class view extends View implements Agent
	{
		Node			node;
		Canvas3D		canvas;
		Shell.Window	win;

		public view(String name, ViewPlatform VP)
		{
			node = new Node(name);
			Shell.push(node);

			// create view bits
			canvas=new Canvas3D(getGraphicsConfiguration());
			//if (name.equals("left")) canvas.setMonoscopicViewPolicy(Canvas3D.LEFT_EYE);
			//else if (name.equals("right")) canvas.setMonoscopicViewPolicy(Canvas3D.RIGHT_EYE);

			addCanvas3D(canvas);
			setPhysicalBody(new PhysicalBody());
			setPhysicalEnvironment(new PhysicalEnvironment());
			setWindowEyepointPolicy(View.RELATIVE_TO_WINDOW);
			//setWindowResizePolicy(View.VIRTUAL_WORLD);
			setFrontClipDistance(Shell.getDouble("front",1));
			setBackClipDistance(Shell.getDouble("back",10));

			if (name.equals("left")) setMonoscopicViewPolicy(LEFT_EYE_VIEW);
			else if (name.equals("right")) setMonoscopicViewPolicy(RIGHT_EYE_VIEW);

			attachViewPlatform(VP);

			Shell.pop();

			win=Shell.getWindow(name);
			win.container().add(canvas);
			win.expose();
			win.addWindowListener(new WindowAdapter() {
				public void windowClosing(WindowEvent e) { dispose(); }	
			});

			Shell.registerAgent(this);
		}

		public void dispose() 
		{
			// stopView();
			Shell.deregisterAgent(this);
			win.dispose(); 
		}						

		protected void finalize() { Shell.trace("finalizing view "+this); }

		public void getCommands(Agent.Registry r) { r.add("start").add("stop"); }
		public void execute(String cmd, Environment env) {
			if (cmd.equals("start")) { startView(); }
			else if (cmd.equals("stop")) { stopView(); }
		}
	}
}