Grouping Shapes
ExSwitch.java

	

//
//  CLASS
//    ExSwitch	-  illustrate use of switches
//
//  LESSON
//    Add a Switch grouping node to select among several shapes to render.
//
//  AUTHOR
//    Michael J. Bailey / San Diego Supercomputer Center
//

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.lang.*;
import java.net.*;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.image.*;
import com.sun.j3d.utils.geometry.*;

public class ExSwitch
	extends Example
{
	//  nodes that can be updated via a menu:

	Switch group = null;

	private int currentSwitch = 0;


	//  Build the scene:

	public Group buildScene()
	{
		// Turn on the headlight
		setHeadlightEnable( true );

		// Build the scene root
		group = new Switch( );
		group.setCapability( Switch.ALLOW_SWITCH_WRITE );

		// Create application bounds
		BoundingSphere worldBounds = new BoundingSphere(
			new Point3d( 0.0, 0.0, 0.0 ),  // Center
			1000.0 );                      // Extent


		Transform3D t3d;

		Appearance app0 = new Appearance( );
		Material mat0 = new Material();
		mat0.setAmbientColor( 0.8f, 0.4f, 0.2f );
		mat0.setDiffuseColor( 0.8f, 0.4f, 0.2f );
		mat0.setSpecularColor( 0.0f, 0.0f, 0.f );
		app0.setMaterial( mat0 );
		t3d = new Transform3D( );
		t3d.setTranslation( new Vector3f( -2.f, 0.f, 0.f ) );
		TransformGroup tg0 = new TransformGroup( t3d );
		Sphere sph0 = new Sphere( 0.5f,
			Primitive.GENERATE_NORMALS, 16, app0 );
		tg0.addChild( sph0 );
		group.addChild( tg0 );

		Appearance app1 = new Appearance( );
		Material mat1 = new Material();
		mat1.setAmbientColor( 0.2f, 0.8f, 0.4f );
		mat1.setDiffuseColor( 0.2f, 0.8f, 0.4f );
		mat1.setSpecularColor( 0.0f, 0.0f, 0.f );
		app1.setMaterial( mat1 );
		t3d.setTranslation( new Vector3f( 0.f, 0.f, 0.f ) );
		TransformGroup tg1 = new TransformGroup( t3d );
		Sphere sph1 = new Sphere( 1.5f,
			Primitive.GENERATE_NORMALS, 16, app1 );
		tg1.addChild( sph1 );
		group.addChild( tg1 );

		Appearance app2 = new Appearance( );
		Material mat2 = new Material();
		mat2.setAmbientColor( 0.4f, 0.2f, 0.8f );
		mat2.setDiffuseColor( 0.4f, 0.2f, 0.8f );
		mat2.setSpecularColor( 0.0f, 0.0f, 0.f );
		app2.setMaterial( mat2 );
		t3d.setTranslation( new Vector3f( 2.f, 0.f, 0.f ) );
		TransformGroup tg2 = new TransformGroup( t3d );
		Sphere sph2 = new Sphere( 1.0f,
			Primitive.GENERATE_NORMALS, 16, app2 );
		tg2.addChild( sph2 );
		group.addChild( tg2 );

		group.setWhichChild( options[currentSwitch].child );

		return group;
	}


	//
	//  Main (if invoked as an application)
	//
	public static void main( String[] args )
	{
		ExSwitch ex = new ExSwitch();
		ex.initialize( args );
		ex.buildUniverse();
		ex.showFrame();
	}

	private NameChildMask[] options =
	{
		new NameChildMask( "CHILD_ALL",  Switch.CHILD_ALL,	0 ),
		new NameChildMask( "CHILD_NONE", Switch.CHILD_NONE,	0 ),
		new NameChildMask( "0",	  	 0,			0 ),
		new NameChildMask( "1",	  	 1,			0 ),
		new NameChildMask( "2",	  	 2,			0 ),
		new NameChildMask( "0+1",	 Switch.CHILD_MASK,	3 ),
		new NameChildMask( "0+2",	 Switch.CHILD_MASK,	5 ),
		new NameChildMask( "1+2",	 Switch.CHILD_MASK,	6 ),
	};

	private CheckboxMenuItem[] switchMenu;
	

	//
	//  Initialize the GUI (application and applet)
	//
	public void initialize( String[] args )
	{
		// Initialize the window, menubar, etc.
		super.initialize( args );
		exampleFrame.setTitle( "Java 3D Switch Example" );

		// Add a menu to select among switch options

		Menu mt = new Menu( "Switch" );
		switchMenu = new CheckboxMenuItem[ options.length ];
		for( int i = 0; i < options.length; i++ )
		{
			switchMenu[i] = new CheckboxMenuItem( options[i].name );
			switchMenu[i].addItemListener( this );
			switchMenu[i].setState( false );
			mt.add( switchMenu[i] );
		}
		exampleMenuBar.add( mt );

		currentSwitch = 0;
		switchMenu[currentSwitch].setState( true );
	}


	//
	//  Handle checkboxes
	//
	public void itemStateChanged( ItemEvent event )
	{
		Object src = event.getSource();

		// Check if it is switch choice
		for( int i = 0; i < switchMenu.length; i++ )
		{
			if( src == switchMenu[i] )
			{
				// Update the checkboxes
				switchMenu[currentSwitch].setState( false );
				currentSwitch = i;
				switchMenu[currentSwitch].setState( true );

				// Set the switch
				group.setWhichChild( options[currentSwitch].child );
				group.setChildMask( options[currentSwitch].mask );
				return;
			}
		}


		// Handle all other checkboxes
		super.itemStateChanged( event );
	}


	public class
	NameChildMask
	{
		public String name;
		public int child;
		public BitSet mask;

		public NameChildMask( String n, int c, int m )
		{
			name = n;
			child = c;
			mask = new BitSet(3);
			if( (m&1) != 0 )	mask.set( 0 );
			if( (m&2) != 0 )	mask.set( 1 );
			if( (m&4) != 0 )	mask.set( 2 );
		}
	}

}