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 / PrintCanvas3D / PrintCanvas3D.java.z / PrintCanvas3D.java
Encoding:
Java Source  |  2003-08-08  |  10.2 KB  |  326 lines

  1. /*
  2.  *    @(#)PrintCanvas3D.java 1.5 02/04/01 15:04:11
  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 com.sun.j3d.loaders.objectfile.ObjectFile;
  41. import com.sun.j3d.loaders.ParsingErrorException;
  42. import com.sun.j3d.loaders.IncorrectFormatException;
  43. import com.sun.j3d.loaders.Scene;
  44. import javax.swing.*;
  45. import java.awt.BorderLayout;
  46. import java.awt.Container;
  47. import java.awt.Dimension;
  48. import java.awt.GraphicsConfiguration;
  49. import java.awt.Point;
  50. import java.awt.image.BufferedImage;
  51. import java.awt.event.*;
  52. import com.sun.j3d.utils.universe.*;
  53. import javax.media.j3d.*;
  54. import javax.vecmath.*;
  55. import java.io.*;
  56. import com.sun.j3d.utils.behaviors.mouse.*;
  57.  
  58. public class PrintCanvas3D extends JFrame implements ActionListener {
  59.  
  60.     private static final boolean spin = false;
  61.     private static final boolean noTriangulate = false;
  62.     private static final boolean noStripify = false;
  63.     private static final double creaseAngle = 60.0;
  64.  
  65.     private JMenuItem snapshotItem;
  66.     private JMenuItem printItem;
  67.     private JMenuItem quitItem;
  68.  
  69.     private SimpleUniverse u;
  70.     private Canvas3D canvas3D;
  71.     private OffScreenCanvas3D offScreenCanvas3D;
  72.  
  73.     private static final int OFF_SCREEN_SCALE = 3;
  74.  
  75.     private class AppPanel extends JPanel {
  76.  
  77.     private String filename = null;
  78.  
  79.     public BranchGroup createSceneGraph(String args[]) {
  80.         // Create the root of the branch graph
  81.         BranchGroup objRoot = new BranchGroup();
  82.  
  83.         // Create a Transformgroup to scale all objects so they
  84.         // appear in the scene.
  85.         TransformGroup objScale = new TransformGroup();
  86.         Transform3D t3d = new Transform3D();
  87.         t3d.setScale(0.7);
  88.         objScale.setTransform(t3d);
  89.         objRoot.addChild(objScale);
  90.  
  91.         // Create the transform group node and initialize it to the
  92.         // identity.  Enable the TRANSFORM_WRITE capability so that
  93.         // our behavior code can modify it at runtime.  Add it to the
  94.         // root of the subgraph.
  95.         TransformGroup objTrans = new TransformGroup();
  96.         objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  97.         objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  98.         objScale.addChild(objTrans);
  99.  
  100.         int flags = ObjectFile.RESIZE;
  101.         if (!noTriangulate) flags |= ObjectFile.TRIANGULATE;
  102.         if (!noStripify) flags |= ObjectFile.STRIPIFY;
  103.         ObjectFile f =
  104.         new ObjectFile(flags, 
  105.                    (float)(creaseAngle * Math.PI / 180.0));
  106.         Scene s = null;
  107.         try {
  108.         s = f.load(filename);
  109.         }
  110.         catch (FileNotFoundException e) {
  111.         System.err.println(e);
  112.         System.exit(1);
  113.         }
  114.         catch (ParsingErrorException e) {
  115.         System.err.println(e);
  116.         System.exit(1);
  117.         }
  118.         catch (IncorrectFormatException e) {
  119.         System.err.println(e);
  120.         System.exit(1);
  121.         }
  122.       
  123.         objTrans.addChild(s.getSceneGroup());
  124.  
  125.         BoundingSphere bounds =
  126.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  127.  
  128.         if (spin) {
  129.         Transform3D yAxis = new Transform3D();
  130.         Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
  131.                         0, 0,
  132.                         4000, 0, 0,
  133.                         0, 0, 0);
  134.  
  135.         RotationInterpolator rotator =
  136.             new RotationInterpolator(rotationAlpha, objTrans, yAxis,
  137.                          0.0f, (float) Math.PI*2.0f);
  138.         rotator.setSchedulingBounds(bounds);
  139.         objTrans.addChild(rotator);
  140.         } else {
  141.         // Create the rotate behavior node
  142.         MouseRotate behavior = new MouseRotate();
  143.         behavior.setTransformGroup(objTrans);
  144.         objTrans.addChild(behavior);
  145.         behavior.setSchedulingBounds(bounds);
  146.  
  147.         // Create the zoom behavior node
  148.         MouseZoom behavior2 = new MouseZoom();
  149.         behavior2.setTransformGroup(objTrans);
  150.         objTrans.addChild(behavior2);
  151.         behavior2.setSchedulingBounds(bounds);
  152.  
  153.         // Create the translate behavior node
  154.         MouseTranslate behavior3 = new MouseTranslate();
  155.         behavior3.setTransformGroup(objTrans);
  156.         objTrans.addChild(behavior3);
  157.         behavior3.setSchedulingBounds(bounds);
  158.         }
  159.  
  160.         // Set up the background
  161.         Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
  162.         Background bgNode = new Background(bgColor);
  163.         bgNode.setApplicationBounds(bounds);
  164.         objRoot.addChild(bgNode);
  165.  
  166.         // Set up the ambient light
  167.         Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
  168.         AmbientLight ambientLightNode = new AmbientLight(ambientColor);
  169.         ambientLightNode.setInfluencingBounds(bounds);
  170.         objRoot.addChild(ambientLightNode);
  171.  
  172.         // Set up the directional lights
  173.         Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
  174.         Vector3f light1Direction  = new Vector3f(4.0f, -7.0f, -12.0f);
  175.         Color3f light2Color = new Color3f(0.3f, 0.3f, 0.4f);
  176.         Vector3f light2Direction  = new Vector3f(-6.0f, -2.0f, -1.0f);
  177.  
  178.         DirectionalLight light1
  179.         = new DirectionalLight(light1Color, light1Direction);
  180.         light1.setInfluencingBounds(bounds);
  181.         objRoot.addChild(light1);
  182.  
  183.         DirectionalLight light2
  184.         = new DirectionalLight(light2Color, light2Direction);
  185.         light2.setInfluencingBounds(bounds);
  186.         objRoot.addChild(light2);
  187.  
  188.         return objRoot;
  189.     }
  190.  
  191.     private void usage() {
  192.         System.out.println("Usage: java PrintCanvas3D <.obj file>");
  193.         System.exit(0);
  194.     } // End of usage
  195.  
  196.  
  197.     // Create the Canvas3D (both on-screen and off-screen)
  198.     private void createCanvas3D(String[] args) {
  199.         if (args.length == 0) {
  200.         usage();
  201.         } else {
  202.         for (int i = 0 ; i < args.length ; i++) {
  203.             if (args[i].startsWith("-")) {
  204.             System.err.println("Argument '" + args[i] + "' ignored.");
  205.             }
  206.             else {
  207.             filename = args[i];
  208.             }
  209.         }
  210.         }
  211.  
  212.         if (filename == null) {
  213.         usage();
  214.         }
  215.  
  216.         // Create Canvas3D
  217.         GraphicsConfiguration config =
  218.         SimpleUniverse.getPreferredConfiguration();
  219.  
  220.         canvas3D = new Canvas3D(config);
  221.         canvas3D.setSize(600, 450);
  222.  
  223.         // Create a simple scene and attach it to the virtual universe
  224.         BranchGroup scene = createSceneGraph(args);
  225.         u = new SimpleUniverse(canvas3D);
  226.         // This will move the ViewPlatform back a bit so the
  227.         // objects in the scene can be viewed.
  228.         u.getViewingPlatform().setNominalViewingTransform();
  229.         u.addBranchGraph(scene);
  230.  
  231.         // Create the off-screen Canvas3D object
  232.         offScreenCanvas3D = new OffScreenCanvas3D(config, true);
  233.         // Set the off-screen size based on a scale factor times the
  234.         // on-screen size
  235.         Screen3D sOn = canvas3D.getScreen3D();
  236.         Screen3D sOff = offScreenCanvas3D.getScreen3D();
  237.         Dimension dim = sOn.getSize();
  238.         dim.width *= OFF_SCREEN_SCALE;
  239.         dim.height *= OFF_SCREEN_SCALE;
  240.         sOff.setSize(dim);
  241.         sOff.setPhysicalScreenWidth(sOn.getPhysicalScreenWidth() *
  242.                     OFF_SCREEN_SCALE);
  243.         sOff.setPhysicalScreenHeight(sOn.getPhysicalScreenHeight() *
  244.                      OFF_SCREEN_SCALE);
  245.  
  246.         // attach the offscreen canvas to the view
  247.         u.getViewer().getView().addCanvas3D(offScreenCanvas3D);
  248.     }
  249.  
  250.     private AppPanel(String args[]) {
  251.         setLayout(new BorderLayout());
  252.  
  253.         // Create Canvas3D and scene graph
  254.         createCanvas3D(args);
  255.         add("Center", canvas3D);
  256.     }
  257.     }
  258.  
  259.     public void actionPerformed (ActionEvent event) {
  260.     Object target = event.getSource();
  261.  
  262.     if ((target == snapshotItem) ||
  263.         (target == printItem)) {
  264.         Point loc = canvas3D.getLocationOnScreen();
  265.         offScreenCanvas3D.setOffScreenLocation(loc);
  266.         Dimension dim = canvas3D.getSize();
  267.         dim.width *= OFF_SCREEN_SCALE;
  268.         dim.height *= OFF_SCREEN_SCALE;
  269.         BufferedImage bImage =
  270.         offScreenCanvas3D.doRender(dim.width, dim.height);
  271.  
  272.         if (target == snapshotItem) {
  273.         new ImageDisplayer(bImage);
  274.         }
  275.         else { // (target == printItem)
  276.         new ImagePrinter(bImage).print();
  277.         }
  278.     }
  279.     else if (target == quitItem) {
  280.         u.removeAllLocales();
  281.         System.exit(0);
  282.     }
  283.     }
  284.  
  285.     private JMenuBar createMenuBar() {
  286.     JMenuBar menuBar = new JMenuBar();
  287.     JMenu fileMenu = new JMenu("File");
  288.     snapshotItem = new JMenuItem("Snapshot");
  289.     snapshotItem.addActionListener(this);
  290.     printItem = new JMenuItem("Print...");
  291.     printItem.addActionListener(this);
  292.     quitItem = new JMenuItem("Quit");
  293.     quitItem.addActionListener(this);
  294.     fileMenu.add(snapshotItem);
  295.     fileMenu.add(printItem);
  296.     fileMenu.add(new JSeparator());
  297.     fileMenu.add(quitItem);
  298.     menuBar.add(fileMenu);
  299.     return menuBar;
  300.     }
  301.  
  302.     private PrintCanvas3D(String args[]) {
  303.     this.setTitle("Canvas3D Print Test");
  304.  
  305.     // Create and initialize menu bar
  306.     JPopupMenu.setDefaultLightWeightPopupEnabled(false);
  307.     this.setJMenuBar(createMenuBar());
  308.  
  309.     // Handle the close event
  310.     this.addWindowListener(new WindowAdapter() {
  311.         public void windowClosing(WindowEvent winEvent) {
  312.         System.exit(0);
  313.         }
  314.     });
  315.  
  316.     // Add main panel to top-level frame and make it visible
  317.     this.getContentPane().add(new AppPanel(args));
  318.     this.pack();
  319.     this.setVisible(true);
  320.     }
  321.  
  322.     public static void main(String[] args) {
  323.     new PrintCanvas3D(args);
  324.     }
  325. }
  326.