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 / AppearanceMixed / AppearanceMixed.java.z / AppearanceMixed.java
Encoding:
Java Source  |  2003-08-08  |  14.0 KB  |  502 lines

  1. /*
  2.  *    @(#)AppearanceMixed.java 1.23 02/10/21 13:37:08
  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 java.awt.GraphicsConfiguration;
  44. import com.sun.j3d.utils.applet.MainFrame;
  45. import com.sun.j3d.utils.universe.*;
  46. import com.sun.j3d.utils.image.TextureLoader;
  47. import com.sun.j3d.utils.geometry.ColorCube;
  48. import javax.media.j3d.*;
  49. import javax.vecmath.*;
  50.  
  51. public class AppearanceMixed extends Applet {
  52.  
  53.     private java.net.URL bgImage;
  54.     private java.net.URL texImage;
  55.  
  56.     private SimpleUniverse u = null;
  57.  
  58.     static class MyCanvas3D extends Canvas3D {
  59.     private GraphicsContext3D gc;
  60.  
  61.     private static final int vertIndices[] = { 0, 1, 2, 0, 2, 3 };
  62.     private static final int normalIndices[] = { 0, 0, 0, 1, 1, 1 };
  63.     private IndexedTriangleArray tri =
  64.         new IndexedTriangleArray(4, IndexedTriangleArray.COORDINATES |
  65.                      IndexedTriangleArray.NORMALS, 6);
  66.  
  67.     private Point3f vert[] = {
  68.         new Point3f(-0.12f, -0.12f, 0.0f),
  69.         new Point3f( 0.12f, -0.12f, 0.0f),
  70.         new Point3f( 0.12f,  0.12f, 0.0f),
  71.         new Point3f(-0.12f,  0.12f, 0.0f),
  72.     };
  73.  
  74.     private Point3f min[] = {
  75.         new Point3f(-0.24f, -0.24f, -0.20f),
  76.         new Point3f( 0.04f, -0.28f, -0.24f),
  77.         new Point3f( 0.00f,  0.00f, -0.24f),
  78.         new Point3f(-0.32f,  0.08f, -0.20f),
  79.     };
  80.  
  81.     private Point3f max[] = {
  82.         new Point3f(-0.04f, -0.04f, 0.12f),
  83.         new Point3f( 0.32f, -0.04f, 0.16f),
  84.         new Point3f( 0.36f,  0.28f, 0.20f),
  85.         new Point3f(-0.04f,  0.24f, 0.16f),
  86.     };
  87.  
  88.     private Point3f delta[] = {
  89.         new Point3f(-0.0021f, -0.0017f,  0.0014f),
  90.         new Point3f( 0.0025f, -0.0013f, -0.0018f),
  91.         new Point3f( 0.0021f,  0.0017f,  0.0018f),
  92.         new Point3f(-0.0025f,  0.0013f, -0.0014f),
  93.     };
  94.  
  95.     private Vector3f normals[];
  96.     private Vector3f v01 = new Vector3f();
  97.     private Vector3f v02 = new Vector3f();
  98.     private Vector3f v03 = new Vector3f();
  99.  
  100.     public void renderField(int fieldDesc) {
  101.         computeVert();
  102.         computeNormals();
  103.         gc.draw(tri);
  104.     }
  105.  
  106.     private void computeVert() {
  107.         for (int i = 0; i < 4; i++) {
  108.         vert[i].add(delta[i]);
  109.         if (vert[i].x > max[i].x) {
  110.             vert[i].x = max[i].x;
  111.             delta[i].x *= -1.0f;
  112.         }
  113.         if (vert[i].x < min[i].x) {
  114.             vert[i].x = min[i].x;
  115.             delta[i].x *= -1.0f;
  116.         }
  117.         if (vert[i].y > max[i].y) {
  118.             vert[i].y = max[i].y;
  119.             delta[i].y *= -1.0f;
  120.         }
  121.         if (vert[i].y < min[i].y) {
  122.             vert[i].y = min[i].y;
  123.             delta[i].y *= -1.0f;
  124.         }
  125.         if (vert[i].z > max[i].z) {
  126.             vert[i].z = max[i].z;
  127.             delta[i].z *= -1.0f;
  128.         }
  129.         if (vert[i].z < min[i].z) {
  130.             vert[i].z = min[i].z;
  131.             delta[i].z *= -1.0f;
  132.         }
  133.         }
  134.         tri.setCoordinates(0, vert);
  135.     }
  136.  
  137.     private void computeNormals() {
  138.         v01.sub(vert[1], vert[0]);
  139.         v02.sub(vert[2], vert[0]);
  140.         v03.sub(vert[3], vert[0]);
  141.         normals[0].cross(v01, v02);
  142.         normals[0].normalize();
  143.         normals[1].cross(v02, v03);
  144.         normals[1].normalize();
  145.         tri.setNormals(0, normals);
  146.     }
  147.  
  148.     public MyCanvas3D(GraphicsConfiguration gcfg) {
  149.         super(gcfg);
  150.  
  151.         // Allocate memory for normals
  152.         normals = new Vector3f[2];
  153.         normals[0] = new Vector3f();
  154.         normals[1] = new Vector3f();
  155.  
  156.         // Set up the indices
  157.         tri.setCoordinateIndices(0, vertIndices);
  158.         tri.setNormalIndices(0, normalIndices);
  159.  
  160.         // Set up the graphics context
  161.         gc = getGraphicsContext3D();
  162.  
  163.         // Create the appearance for the triangle fan
  164.         Appearance app = new Appearance();
  165.         Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
  166.         Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
  167.         Color3f objColor = new Color3f(0.0f, 0.0f, 0.8f);
  168.         app.setMaterial(new Material(objColor, black, objColor,
  169.                      white, 80.0f));
  170.         gc.setAppearance(app);
  171.  
  172.         // Set up the global lights
  173.         Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
  174.         Vector3f lDir1  = new Vector3f(-1.0f, -1.0f, -1.0f);
  175.         Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
  176.         gc.addLight(new AmbientLight(alColor));
  177.         gc.addLight(new DirectionalLight(lColor1, lDir1));
  178.     }
  179.     }
  180.  
  181.  
  182.     private BranchGroup createSceneGraph() {
  183.     // Create the root of the branch graph
  184.     BranchGroup objRoot = new BranchGroup();
  185.  
  186.     // Create a bounds for the background and lights
  187.     BoundingSphere bounds =
  188.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  189.  
  190.     // Set up the background
  191.     TextureLoader bgTexture = new TextureLoader(bgImage, this);
  192.     Background bg = new Background(bgTexture.getImage());
  193.     bg.setApplicationBounds(bounds);
  194.     objRoot.addChild(bg);
  195.  
  196.     // Set up the global lights
  197.     Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
  198.     Vector3f lDir1  = new Vector3f(-1.0f, -1.0f, -1.0f);
  199.     Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
  200.  
  201.     AmbientLight aLgt = new AmbientLight(alColor);
  202.     aLgt.setInfluencingBounds(bounds);
  203.     DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
  204.     lgt1.setInfluencingBounds(bounds);
  205.     objRoot.addChild(aLgt);
  206.     objRoot.addChild(lgt1);
  207.  
  208.     // Create a bunch of objects with a behavior and add them
  209.     // into the scene graph.
  210.  
  211.     int row, col;
  212.     Appearance[][] app = new Appearance[3][3];
  213.  
  214.     for (row = 0; row < 3; row++)
  215.         for (col = 0; col < 3; col++)
  216.         app[row][col] = createAppearance(row * 3 + col);
  217.  
  218.     for (int i = 0; i < 3; i++) {
  219.         double ypos = (double)(i - 1) * 0.6;
  220.         for (int j = 0; j < 3; j++) {
  221.         double xpos = (double)(j - 1) * 0.6;
  222.         objRoot.addChild(createObject(app[i][j], 0.12,  xpos, ypos));
  223.         }
  224.     }
  225.  
  226.         // Let Java 3D perform optimizations on this scene graph.
  227.         objRoot.compile();
  228.  
  229.     return objRoot;
  230.     }
  231.  
  232.  
  233.     private Appearance createAppearance(int idx) {
  234.     Appearance app = new Appearance();
  235.  
  236.     // Globally used colors
  237.     Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
  238.     Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
  239.  
  240.     switch (idx) {
  241.     // Unlit solid
  242.     case 0:
  243.         {
  244.         // Set up the coloring properties
  245.         Color3f objColor = new Color3f(1.0f, 0.2f, 0.4f);
  246.         ColoringAttributes ca = new ColoringAttributes();
  247.         ca.setColor(objColor);
  248.         app.setColoringAttributes(ca);
  249.         break;
  250.         }
  251.  
  252.  
  253.     // Unlit wire frame
  254.     case 1:
  255.         {
  256.         // Set up the coloring properties
  257.         Color3f objColor = new Color3f(0.5f, 0.0f, 0.2f);
  258.         ColoringAttributes ca = new ColoringAttributes();
  259.         ca.setColor(objColor);
  260.         app.setColoringAttributes(ca);
  261.  
  262.         // Set up the polygon attributes
  263.         PolygonAttributes pa = new PolygonAttributes();
  264.         pa.setPolygonMode(pa.POLYGON_LINE);
  265.         pa.setCullFace(pa.CULL_NONE);
  266.         app.setPolygonAttributes(pa);
  267.         break;
  268.         }
  269.  
  270.     // Unlit points
  271.     case 2:
  272.         {
  273.         // Set up the coloring properties
  274.         Color3f objColor = new Color3f(0.2f, 0.2f, 1.0f);
  275.         ColoringAttributes ca = new ColoringAttributes();
  276.         ca.setColor(objColor);
  277.         app.setColoringAttributes(ca);
  278.  
  279.         // Set up the polygon attributes
  280.         PolygonAttributes pa = new PolygonAttributes();
  281.         pa.setPolygonMode(pa.POLYGON_POINT);
  282.         pa.setCullFace(pa.CULL_NONE);
  283.         app.setPolygonAttributes(pa);
  284.  
  285.         // Set up point attributes
  286.         PointAttributes pta = new PointAttributes();
  287.         pta.setPointSize(5.0f);
  288.         app.setPointAttributes(pta);
  289.         break;
  290.         }
  291.  
  292.     // Lit solid
  293.     case 3:
  294.         {
  295.         // Set up the material properties
  296.         Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
  297.         app.setMaterial(new Material(objColor, black, objColor,
  298.                          white, 80.0f));
  299.         break;
  300.         }
  301.  
  302.     // Texture mapped, lit solid
  303.     case 4:
  304.         {
  305.         // Set up the texture map
  306.         TextureLoader tex = new TextureLoader(texImage, this);
  307.         app.setTexture(tex.getTexture());
  308.  
  309.          TextureAttributes texAttr = new TextureAttributes();
  310.          texAttr.setTextureMode(TextureAttributes.MODULATE);
  311.          app.setTextureAttributes(texAttr);
  312.  
  313.  
  314.         // Set up the material properties
  315.         app.setMaterial(new Material(white, black, white, black, 1.0f));
  316.         break;
  317.         }
  318.  
  319.     // Transparent, lit solid
  320.     case 5:
  321.         {
  322.         // Set up the transparency properties
  323.         TransparencyAttributes ta = new TransparencyAttributes();
  324.         ta.setTransparencyMode(ta.BLENDED);
  325.         ta.setTransparency(0.6f);
  326.         app.setTransparencyAttributes(ta);
  327.  
  328.         // Set up the polygon attributes
  329.         PolygonAttributes pa = new PolygonAttributes();
  330.         pa.setCullFace(pa.CULL_NONE);
  331.         app.setPolygonAttributes(pa);
  332.  
  333.         // Set up the material properties
  334.         Color3f objColor = new Color3f(0.7f, 0.8f, 1.0f);
  335.         app.setMaterial(new Material(objColor, black, objColor,
  336.                          black, 1.0f));
  337.         break;
  338.         }
  339.  
  340.     // Lit solid, no specular
  341.     case 6:
  342.         {
  343.         // Set up the material properties
  344.         Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
  345.         app.setMaterial(new Material(objColor, black, objColor,
  346.                          black, 80.0f));
  347.         break;
  348.         }
  349.  
  350.     // Lit solid, specular only
  351.     case 7:
  352.         {
  353.         // Set up the material properties
  354.         Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
  355.         app.setMaterial(new Material(black, black, black,
  356.                          white, 80.0f));
  357.         break;
  358.         }
  359.  
  360.     // Another lit solid with a different color
  361.     case 8:
  362.         {
  363.         // Set up the material properties
  364.         Color3f objColor = new Color3f(0.8f, 0.8f, 0.0f);
  365.         app.setMaterial(new Material(objColor, black, objColor,
  366.                          white, 80.0f));
  367.         break;
  368.         }
  369.  
  370.     default:
  371.         {
  372.         ColoringAttributes ca = new ColoringAttributes();
  373.         ca.setColor(new Color3f(0.0f, 1.0f, 0.0f));
  374.         app.setColoringAttributes(ca);
  375.         }
  376.     }
  377.  
  378.     return app;
  379.     }
  380.  
  381.  
  382.     private Group createObject(Appearance app, double scale,
  383.                    double xpos, double ypos) {
  384.  
  385.     // Create a transform group node to scale and position the object.
  386.     Transform3D t = new Transform3D();
  387.     t.set(scale, new Vector3d(xpos, ypos, 0.0));
  388.     TransformGroup objTrans = new TransformGroup(t);
  389.  
  390.     // Create a second transform group node and initialize it to the
  391.     // identity.  Enable the TRANSFORM_WRITE capability so that
  392.     // our behavior code can modify it at runtime.
  393.     TransformGroup spinTg = new TransformGroup();
  394.     spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  395.  
  396.     // Create a simple shape leaf node and set the appearance
  397.     Shape3D shape = new Tetrahedron();
  398.     shape.setAppearance(app);
  399.  
  400.     // add it to the scene graph.
  401.     spinTg.addChild(shape);
  402.  
  403.     // Create a new Behavior object that will perform the desired
  404.     // operation on the specified transform object and add it into
  405.     // the scene graph.
  406.     Transform3D yAxis = new Transform3D();
  407.     Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
  408.                     0, 0,
  409.                     5000, 0, 0,
  410.                     0, 0, 0);
  411.  
  412.     RotationInterpolator rotator =
  413.         new RotationInterpolator(rotationAlpha, spinTg, yAxis,
  414.                      0.0f, (float) Math.PI*2.0f);
  415.  
  416.     BoundingSphere bounds =
  417.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  418.  
  419.     rotator.setSchedulingBounds(bounds);
  420.  
  421.     // Add the behavior and the transform group to the object
  422.     objTrans.addChild(rotator);
  423.     objTrans.addChild(spinTg);
  424.  
  425.     return objTrans;
  426.     }
  427.  
  428.  
  429.     public AppearanceMixed() {
  430.     }
  431.  
  432.     public AppearanceMixed(java.net.URL bgurl, java.net.URL texurl) {
  433.         bgImage = bgurl;
  434.     texImage = texurl;
  435.     }
  436.     public void init() {
  437.         if (bgImage == null) {
  438.           // the path to the image for an applet
  439.         try {
  440.             bgImage = new java.net.URL(getCodeBase().toString() +
  441.                        "../images/bg.jpg");
  442.         }
  443.         catch (java.net.MalformedURLException ex) {
  444.             System.out.println(ex.getMessage());
  445.         System.exit(1);
  446.         }
  447.     }
  448.  
  449.     if (texImage == null) {
  450.         // the path to the image for an applet
  451.           try {
  452.             texImage = new java.net.URL(getCodeBase().toString() +
  453.                         "../images/apimage.jpg");
  454.         }
  455.         catch (java.net.MalformedURLException ex) {
  456.             System.out.println(ex.getMessage());
  457.         System.exit(1);
  458.         }
  459.     }
  460.     setLayout(new BorderLayout());
  461.         GraphicsConfiguration config =
  462.            SimpleUniverse.getPreferredConfiguration();
  463.  
  464.         MyCanvas3D c = new MyCanvas3D(config);
  465.     add("Center", c);
  466.  
  467.     // Create a simple scene and attach it to the virtual universe
  468.     BranchGroup scene = createSceneGraph();
  469.     u = new SimpleUniverse(c);
  470.  
  471.         // This will move the ViewPlatform back a bit so the
  472.         // objects in the scene can be viewed.
  473.         u.getViewingPlatform().setNominalViewingTransform();
  474.  
  475.     u.addBranchGraph(scene);      
  476.     }
  477.  
  478.     public void destroy() {
  479.     u.cleanup();
  480.     }
  481.  
  482.  
  483.     //
  484.     // The following allows AppearanceMixed to be run as an application
  485.     // as well as an applet
  486.     //
  487.     public static void main(String[] args) {
  488.         // the path to the image file for an application
  489.     java.net.URL bgurl = null;
  490.     java.net.URL texurl = null;
  491.     try {
  492.         bgurl = new java.net.URL("file:../images/bg.jpg");
  493.         texurl = new java.net.URL("file:../images/apimage.jpg");
  494.     }
  495.     catch (java.net.MalformedURLException ex) {
  496.         System.out.println(ex.getMessage());
  497.         System.exit(1);
  498.     }    
  499.     new MainFrame(new AppearanceMixed(bgurl, texurl), 700, 700);
  500.     }
  501. }
  502.