home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.5 Applications 2004 May / SGI IRIX 6.5 Applications 2004 May.iso / dist / java3d.idb / usr / demos / java / j3d / programs / examples / AlternateAppearance / AlternateAppearanceBoundsTest.java.z / AlternateAppearanceBoundsTest.java
Encoding:
Java Source  |  2003-08-08  |  9.4 KB  |  304 lines

  1. /*
  2.  *    @(#)AlternateAppearanceBoundsTest.java 1.10 02/10/21 13:34:15
  3.  *
  4.  * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * - Redistributions of source code must retain the above copyright
  11.  *   notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * - Redistribution in binary form must reproduce the above copyright
  14.  *   notice, this list of conditions and the following disclaimer in
  15.  *   the documentation and/or other materials provided with the
  16.  *   distribution.
  17.  *
  18.  * Neither the name of Sun Microsystems, Inc. or the names of
  19.  * contributors may be used to endorse or promote products derived
  20.  * from this software without specific prior written permission.
  21.  *
  22.  * This software is provided "AS IS," without a warranty of any
  23.  * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
  24.  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
  25.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
  26.  * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
  27.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  28.  * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
  29.  * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
  30.  * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
  31.  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
  32.  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
  33.  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  34.  *
  35.  * You acknowledge that Software is not designed,licensed or intended
  36.  * for use in the design, construction, operation or maintenance of
  37.  * any nuclear facility.
  38.  */
  39.  
  40. import java.applet.Applet;
  41. import java.awt.*;
  42. import java.awt.event.*;
  43. import com.sun.j3d.utils.applet.MainFrame;
  44. import com.sun.j3d.utils.geometry.*;
  45. import com.sun.j3d.utils.universe.*;
  46. import javax.media.j3d.*;
  47. import javax.vecmath.*;
  48. import javax.swing.*;
  49. import javax.swing.event.*;
  50. import javax.swing.border.*;
  51. import com.sun.j3d.utils.behaviors.mouse.*;
  52.  
  53. public class AlternateAppearanceBoundsTest extends JApplet 
  54. implements ActionListener {
  55.  
  56.  
  57.     Material mat1, altMat;               
  58.     Appearance app, otherApp;               
  59.     JComboBox altAppMaterialColor;
  60.     JComboBox appMaterialColor;
  61.     JCheckBox useBoundingLeaf;
  62.     JCheckBox override;
  63.     JComboBox boundsType;
  64.     private Group content1 = null;
  65.     AlternateAppearance altApp;
  66.     Shape3D[] shapes1;
  67.     boolean boundingLeafOn = false;
  68.     // Globally used colors
  69.    Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
  70.    Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
  71.    Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
  72.    Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);
  73.    Color3f[] colors = {white, red, green, blue};
  74.     
  75.     private Bounds worldBounds = new BoundingSphere(
  76.         new Point3d( 0.0, 0.0, 0.0 ),  // Center
  77.         1000.0 );                      // Extent
  78.     private Bounds smallBounds = new BoundingSphere(
  79.         new Point3d( 0.0, 0.0, 0.0 ),  // Center
  80.         0.25 );                         // Extent
  81.     private Bounds tinyBounds = new BoundingSphere(
  82.         new Point3d( 0.0, 0.0, 0.0 ),  // Center
  83.         0.05 );                         // Extent
  84.     private BoundingLeaf leafBounds = null;
  85.     private int currentBounds = 2;
  86.  
  87.     private Bounds[] allBounds = {tinyBounds, smallBounds, worldBounds};
  88.  
  89.     DirectionalLight light1 = null;
  90.  
  91.     // Get the current bounding leaf position
  92.     private int currentPosition = 0;
  93.     //    Point3f pos = (Point3f)positions[currentPosition].value;
  94.  
  95.     private SimpleUniverse u = null;
  96.  
  97.     public AlternateAppearanceBoundsTest() {
  98.     }
  99.  
  100.     public void init() {
  101.     Container contentPane = getContentPane();
  102.     
  103.         Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
  104.         contentPane.add("Center", c);
  105.  
  106.         BranchGroup scene = createSceneGraph();
  107.         // SimpleUniverse is a Convenience Utility class
  108.         u = new SimpleUniverse(c);
  109.  
  110.         // This will move the ViewPlatform back a bit so the
  111.         // objects in the scene can be viewed.
  112.         u.getViewingPlatform().setNominalViewingTransform();
  113.         u.addBranchGraph(scene);
  114.  
  115.  
  116.     // Create GUI
  117.     JPanel p = new JPanel();
  118.     BoxLayout boxlayout = new BoxLayout(p, 
  119.                         BoxLayout.Y_AXIS);
  120.     p.add(createBoundsPanel());
  121.     p.add(createMaterialPanel());
  122.     p.setLayout(boxlayout);
  123.     
  124.     contentPane.add("South", p);
  125.     }
  126.  
  127.     public void destroy() {
  128.     u.cleanup();
  129.     }
  130.     
  131.     BranchGroup createSceneGraph() {
  132.     BranchGroup objRoot = new BranchGroup();
  133.  
  134.     // Create an alternate appearance
  135.     otherApp = new Appearance();
  136.     altMat = new Material();
  137.     altMat.setCapability(Material.ALLOW_COMPONENT_WRITE);
  138.     altMat.setDiffuseColor( new Color3f( 0.0f, 1.0f, 0.0f ) );
  139.     otherApp.setMaterial(altMat);
  140.  
  141.     altApp = new AlternateAppearance();
  142.     altApp.setAppearance(otherApp);
  143.     altApp.setCapability(AlternateAppearance.ALLOW_BOUNDS_WRITE);
  144.     altApp.setCapability(AlternateAppearance.ALLOW_INFLUENCING_BOUNDS_WRITE);
  145.     altApp.setInfluencingBounds( worldBounds );
  146.     objRoot.addChild(altApp);
  147.     
  148.     // Build foreground geometry
  149.     Appearance app1 = new Appearance();
  150.     mat1 = new Material();
  151.     mat1.setCapability(Material.ALLOW_COMPONENT_WRITE);
  152.     mat1.setDiffuseColor( new Color3f( 1.0f, 0.0f, 0.0f ) );
  153.     app1.setMaterial(mat1);
  154.     content1 = new SphereGroup(
  155.                    0.05f,   // radius of spheres
  156.                    0.15f,    // x spacing
  157.                    0.15f,   // y spacing
  158.                    5,       // number of spheres in X
  159.                    5,       // number of spheres in Y
  160.                    app1, // appearance
  161.                    true);  // alt app override = true
  162.     objRoot.addChild( content1 );
  163.     shapes1 = ((SphereGroup)content1).getShapes();
  164.     
  165.  
  166.  
  167.     // Add lights
  168.     light1 = new DirectionalLight( );
  169.     light1.setEnable( true );
  170.     light1.setColor( new Color3f(0.2f, 0.2f, 0.2f) );
  171.     light1.setDirection( new Vector3f( 1.0f, 0.0f, -1.0f ) );
  172.     light1.setInfluencingBounds( worldBounds );
  173.     light1.setCapability(
  174.                 DirectionalLight.ALLOW_INFLUENCING_BOUNDS_WRITE );
  175.     light1.setCapability(
  176.                 DirectionalLight.ALLOW_BOUNDS_WRITE );
  177.     objRoot.addChild( light1 );
  178.  
  179.     // Add an ambient light to dimly illuminate the rest of
  180.     // the shapes in the scene to help illustrate that the
  181.     // directional lights are being scoped... otherwise it looks
  182.     // like we're just removing shapes from the scene
  183.     AmbientLight ambient = new AmbientLight( );
  184.     ambient.setEnable( true );
  185.     ambient.setColor( new Color3f(1.0f, 1.0f, 1.0f) );
  186.     ambient.setInfluencingBounds( worldBounds );
  187.     objRoot.addChild( ambient );
  188.     
  189.  
  190.     // Define a bounding leaf
  191.     leafBounds = new BoundingLeaf( allBounds[currentBounds] );
  192.     leafBounds.setCapability( BoundingLeaf.ALLOW_REGION_WRITE );
  193.     objRoot.addChild( leafBounds );
  194.     if (boundingLeafOn) {
  195.         altApp.setInfluencingBoundingLeaf(leafBounds);
  196.     }
  197.     else {
  198.         altApp.setInfluencingBounds(allBounds[currentBounds]);
  199.     }
  200.         
  201.     
  202.  
  203.     return objRoot;
  204.     }
  205.     JPanel createBoundsPanel() {
  206.     JPanel panel = new JPanel();
  207.     panel.setBorder(new TitledBorder("Scopes"));
  208.  
  209.  
  210.     String boundsValues[] = { "Tiny Bounds", "Small Bounds", "Big Bounds"};
  211.  
  212.     boundsType = new JComboBox(boundsValues);
  213.     boundsType.addActionListener(this);
  214.     boundsType.setSelectedIndex(2);
  215.     panel.add(new JLabel("Bounds"));     
  216.     panel.add(boundsType);
  217.  
  218.     useBoundingLeaf = new JCheckBox("Enable BoundingLeaf", 
  219.                       boundingLeafOn);
  220.     useBoundingLeaf.addActionListener(this);
  221.     panel.add(useBoundingLeaf);
  222.  
  223.     override = new JCheckBox("Enable App Override", 
  224.                       false);
  225.     override.addActionListener(this);
  226.     panel.add(override);
  227.  
  228.     return panel;
  229.  
  230.     }
  231.  
  232.     JPanel createMaterialPanel() {
  233.     JPanel panel = new JPanel();
  234.     panel.setBorder(new TitledBorder("Appearance Attributes"));
  235.  
  236.     String colorVals[] = { "WHITE", "RED", "GREEN", "BLUE"};
  237.  
  238.     altAppMaterialColor = new JComboBox(colorVals);
  239.     altAppMaterialColor.addActionListener(this);
  240.     altAppMaterialColor.setSelectedIndex(2);
  241.     panel.add(new JLabel("Alternate Appearance MaterialColor"));     
  242.     panel.add(altAppMaterialColor);
  243.     
  244.  
  245.  
  246.     appMaterialColor = new JComboBox(colorVals);
  247.     appMaterialColor.addActionListener(this);
  248.     appMaterialColor.setSelectedIndex(1);
  249.     panel.add(new JLabel("Normal Appearance MaterialColor"));     
  250.     panel.add(appMaterialColor);
  251.     
  252.     return panel;
  253.  
  254.  
  255.     }
  256.  
  257.     public void actionPerformed(ActionEvent e) {
  258.     int i;
  259.     
  260.     Object target = e.getSource();
  261.     if (target == altAppMaterialColor) {
  262.         altMat.setDiffuseColor(colors[altAppMaterialColor.getSelectedIndex()]);
  263.     }
  264.     else if (target == useBoundingLeaf) {
  265.         boundingLeafOn = useBoundingLeaf.isSelected();
  266.         if (boundingLeafOn) {
  267.         leafBounds.setRegion(allBounds[currentBounds]);
  268.         altApp.setInfluencingBoundingLeaf( leafBounds );
  269.         }
  270.         else {
  271.         altApp.setInfluencingBoundingLeaf( null );
  272.         altApp.setInfluencingBounds(allBounds[currentBounds]);
  273.         }
  274.  
  275.     }
  276.     else if (target == boundsType) {
  277.         currentBounds = boundsType.getSelectedIndex();
  278.         if (boundingLeafOn) {
  279.         leafBounds.setRegion(allBounds[currentBounds]);
  280.         altApp.setInfluencingBoundingLeaf( leafBounds );
  281.         }
  282.         else {
  283.         altApp.setInfluencingBoundingLeaf( null );
  284.         altApp.setInfluencingBounds(allBounds[currentBounds]);
  285.         }
  286.         
  287.     }
  288.     else if (target == override) {
  289.         for (i = 0; i < shapes1.length; i++)
  290.         shapes1[i].setAppearanceOverrideEnable(override.isSelected());
  291.     }
  292.     else if (target == appMaterialColor) {
  293.         mat1.setDiffuseColor(colors[appMaterialColor.getSelectedIndex()]);
  294.     }
  295.  
  296.     }
  297.                
  298.                
  299.     public static void main(String[] args) {
  300.     Frame frame = new MainFrame(new AlternateAppearanceBoundsTest(), 800, 800);
  301.     }
  302.  
  303. }               
  304.