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 / OrientedShape3D / OrientedTest.java.z / OrientedTest.java
Encoding:
Java Source  |  2003-08-08  |  10.1 KB  |  299 lines

  1. /*
  2.  *    @(#)OrientedTest.java 1.10 02/10/21 13:47:43
  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.image.TextureLoader;
  44. import com.sun.j3d.utils.applet.MainFrame;
  45. import com.sun.j3d.utils.geometry.*;
  46. import com.sun.j3d.utils.universe.*;
  47. import javax.media.j3d.*;
  48. import javax.vecmath.*;
  49. import com.sun.j3d.utils.behaviors.mouse.*;
  50.  
  51. public class OrientedTest extends Applet {
  52.  
  53.     // setup font stuff
  54.     private String fontName = "TestFont";
  55.     private String textString = "OrientedShape3D";
  56.     float sl = textString.length();
  57.  
  58.     // paths to texture image files
  59.     private java.net.URL earthImage = null;
  60.     private java.net.URL stoneImage = null;
  61.  
  62.     private SimpleUniverse u = null;
  63.  
  64.     public BranchGroup createSceneGraph() {
  65.  
  66.     // Create the root of the branch graph
  67.     BranchGroup objRoot = new BranchGroup();
  68.  
  69.         TransformGroup objScale = new TransformGroup();
  70.         Transform3D textMat = new Transform3D();
  71.         // Assuming uniform size chars, set scale to fit string in view
  72.         textMat.setScale(1.2/sl);
  73.         objScale.setTransform(textMat);
  74.  
  75.  
  76.  
  77.     // Create the transform group node and initialize it to the
  78.     // identity.  Enable the TRANSFORM_WRITE capability so that
  79.     // our behavior code can modify it at runtime.  Add it to the
  80.     // root of the subgraph.
  81.     TransformGroup objTrans = new TransformGroup();
  82.     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  83.     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  84.     objRoot.addChild(objTrans);
  85.  
  86.     BoundingSphere bounds =
  87.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  88.  
  89.         Appearance apText = new Appearance();
  90.     Material m = new Material();
  91.         m.setLightingEnable(true);
  92.     apText.setMaterial(m);
  93.  
  94.  
  95.         Appearance apEarth= new Appearance();
  96.         Material mm = new Material();
  97.         mm.setLightingEnable(true);
  98.     apEarth.setMaterial(mm);
  99.  
  100.         Appearance apStone = new Appearance();
  101.     apStone.setMaterial(mm);
  102.  
  103. // create 3D text 
  104.         Font3D f3d = new Font3D(new Font(fontName, Font.PLAIN, 2),
  105.                                 new FontExtrusion());
  106.         Text3D txt = new Text3D(f3d, textString, 
  107.              new Point3f( -sl/2.0f, 3.0f, 0.0f));
  108.         OrientedShape3D textShape = new OrientedShape3D();
  109.         textShape.setGeometry(txt);
  110.         textShape.setAppearance(apText);
  111.     textShape.setAlignmentAxis( 0.0f, 1.0f, 0.0f);
  112.         objScale.addChild( textShape );
  113.  
  114.  
  115.     // Create a simple shape leaf node, add it to the scene graph.
  116.  
  117.     Transform3D cubeMat = new Transform3D();
  118.     TransformGroup cubeTrans = new TransformGroup(cubeMat);
  119.     cubeMat.set(new Vector3d(0.9, 0.0, -1.0));
  120.     cubeTrans.setTransform(cubeMat);
  121.     cubeTrans.addChild(new ColorCube(0.3));
  122.         objTrans.addChild(cubeTrans);
  123.  
  124.         TextureLoader stoneTex = new TextureLoader(stoneImage, new String("RGB"), this);
  125.         if (stoneTex != null) apStone.setTexture(stoneTex.getTexture());
  126.  
  127.      TextureAttributes texAttr = new TextureAttributes();
  128.      texAttr.setTextureMode(TextureAttributes.MODULATE);
  129.      apStone.setTextureAttributes(texAttr);
  130.  
  131.  
  132.     Transform3D coneMat = new Transform3D();
  133.     TransformGroup coneTrans = new TransformGroup(coneMat);
  134.     coneMat.set(new Vector3d(0.0, 0.0, 0.0));
  135.     coneTrans.setTransform(coneMat);
  136.     coneTrans.addChild(new Cone(.2f, 0.8f,Cone.GENERATE_NORMALS |
  137.                     Cone.GENERATE_TEXTURE_COORDS, apStone));
  138.         objTrans.addChild(coneTrans);
  139.  
  140.         TextureLoader earthTex = new TextureLoader(earthImage, new String("RGB"), this);
  141.         if (earthTex != null) apEarth.setTexture(earthTex.getTexture());
  142.  
  143.      apEarth.setTextureAttributes(texAttr);
  144.  
  145.     Transform3D cylinderMat = new Transform3D();
  146.     TransformGroup cylinderTrans = new TransformGroup(cylinderMat);
  147.     cylinderMat.set(new Vector3d(-0.9, 0.5, -1.0));
  148.     cylinderTrans.setTransform(cylinderMat);
  149.     cylinderTrans.addChild(new Cylinder(.35f, 2.0f,Cylinder.GENERATE_NORMALS |
  150.                               Cylinder.GENERATE_TEXTURE_COORDS, apEarth));
  151.         objTrans.addChild(cylinderTrans);
  152.  
  153.         objTrans.addChild(objScale);
  154.  
  155.  
  156.  
  157.  
  158.         // Set up the background
  159.         Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
  160.         Background bgNode = new Background(bgColor);
  161.         bgNode.setApplicationBounds(bounds);
  162.         objRoot.addChild(bgNode);
  163.  
  164.         // Set up the ambient light
  165.         Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
  166.         AmbientLight ambientLightNode = new AmbientLight(ambientColor);
  167.         ambientLightNode.setInfluencingBounds(bounds);
  168.         objRoot.addChild(ambientLightNode);
  169.  
  170.         // Set up the directional lights
  171.         Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
  172.         Vector3f light1Direction  = new Vector3f(1.0f, 1.0f, 1.0f);
  173.         Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f);
  174.         Vector3f light2Direction  = new Vector3f(-1.0f, -1.0f, -1.0f);
  175.  
  176.         DirectionalLight light1
  177.             = new DirectionalLight(light1Color, light1Direction);
  178.         light1.setInfluencingBounds(bounds);
  179.         objRoot.addChild(light1);
  180.           
  181.         DirectionalLight light2
  182.             = new DirectionalLight(light2Color, light2Direction);
  183.         light2.setInfluencingBounds(bounds);
  184.         objRoot.addChild(light2);
  185.  
  186.         apText.setMaterial(mm);
  187.     
  188.         // Have Java 3D perform optimizations on this scene graph.
  189.         objRoot.compile();
  190.  
  191.     return objRoot;
  192.     }
  193.  
  194.     public OrientedTest() {
  195.     }
  196.  
  197.     public OrientedTest(java.net.URL earthURL, java.net.URL stoneURL) {
  198.         earthImage = earthURL;
  199.     stoneImage = stoneURL;
  200.     }
  201.  
  202.     public void init() {
  203.         // the paths to the image files for an applet
  204.         if (earthImage == null) {
  205.         try {
  206.             earthImage = new java.net.URL(getCodeBase().toString() +
  207.                           "../images/earth.jpg");
  208.         }
  209.         catch (java.net.MalformedURLException ex) {
  210.             System.out.println(ex.getMessage());
  211.         System.exit(1);
  212.         }
  213.     }
  214.     if (stoneImage == null) {
  215.       try {
  216.           stoneImage = new java.net.URL(getCodeBase().toString() +
  217.                         "../images/stone.jpg");
  218.       }
  219.       catch (java.net.MalformedURLException ex) {
  220.           System.out.println(ex.getMessage());
  221.           System.exit(1);
  222.       }
  223.     }
  224.     setLayout(new BorderLayout());
  225.         GraphicsConfiguration config =
  226.            SimpleUniverse.getPreferredConfiguration();
  227.  
  228.         Canvas3D c = new Canvas3D(config);
  229.     add("Center", c);
  230.  
  231.     // Create a simple scene and attach it to the virtual universe
  232.     BranchGroup scene = createSceneGraph();
  233.     u = new SimpleUniverse(c, 4);
  234.  
  235.     // add mouse behaviors to ViewingPlatform
  236.     ViewingPlatform viewingPlatform = u.getViewingPlatform();
  237.  
  238.     // there is a special rotate behavior, so can't use the utility
  239.     // method
  240.     MouseRotateY rotate = new MouseRotateY(MouseRotateY.INVERT_INPUT);
  241.     rotate.setTransformGroup(viewingPlatform.getMultiTransformGroup().
  242.                    getTransformGroup(0));
  243.     BranchGroup rotateBG = new BranchGroup();
  244.     rotateBG.addChild(rotate);
  245.     viewingPlatform.addChild(rotateBG);
  246.     BoundingSphere bounds =
  247.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  248.     rotate.setSchedulingBounds(bounds);
  249.  
  250.     MouseZoom zoom =
  251.         new MouseZoom(c, MouseZoom.INVERT_INPUT);
  252.     zoom.setTransformGroup(viewingPlatform.getMultiTransformGroup().
  253.               getTransformGroup(1));
  254.     zoom.setSchedulingBounds(bounds);
  255.     BranchGroup zoomBG = new BranchGroup();
  256.     zoomBG.addChild(zoom);
  257.     viewingPlatform.addChild(zoomBG);
  258.     
  259.     MouseTranslate translate =
  260.         new MouseTranslate(c, MouseTranslate.INVERT_INPUT);
  261.     translate.setTransformGroup(viewingPlatform.getMultiTransformGroup().
  262.                     getTransformGroup(2));
  263.     translate.setSchedulingBounds(bounds);
  264.     BranchGroup translateBG = new BranchGroup();
  265.     translateBG.addChild(translate);
  266.     viewingPlatform.addChild(translateBG);
  267.  
  268.         // This will move the ViewPlatform back a bit so the
  269.         // objects in the scene can be viewed.
  270.         u.getViewingPlatform().setNominalViewingTransform();
  271.  
  272.     u.addBranchGraph(scene);
  273.     }
  274.  
  275.     public void destroy() {
  276.     u.cleanup();
  277.     }
  278.   
  279.     //
  280.     // The following allows OrientedTest to be run as an application
  281.     // as well as an applet
  282.     //
  283.     public static void main(String[] args) {
  284.         java.net.URL earthURL = null;
  285.     java.net.URL stoneURL = null;
  286.     try {
  287.         // the paths to the image files for an application
  288.         earthURL = new java.net.URL("file:../images/earth.jpg");
  289.         stoneURL = new java.net.URL("file:../images/stone.jpg");
  290.     }
  291.     catch (java.net.MalformedURLException ex) {
  292.         System.out.println(ex.getMessage());
  293.         System.exit(1);
  294.     }
  295.         
  296.     new MainFrame(new OrientedTest(earthURL, stoneURL), 400, 400);
  297.     }
  298. }
  299.