Viewer3D.java Source code

Java tutorial

Introduction

Here is the source code for Viewer3D.java

Source

/*
 *   @(#)Viewer.java 1.14 02/10/21 13:44:30
 *
 * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * - Redistribution in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in
 *   the documentation and/or other materials provided with the
 *   distribution.
 *
 * Neither the name of Sun Microsystems, Inc. or the names of
 * contributors may be used to endorse or promote products derived
 * from this software without specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any
 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
 * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
 * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
 * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
 * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
 * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that Software is not designed,licensed or intended
 * for use in the design, construction, operation or maintenance of
 * any nuclear facility.
 */

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;

import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.View;
import javax.vecmath.Matrix4d;

import com.sun.j3d.loaders.Loader;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.lw3d.Lw3dLoader;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;

/**
 * This class loads in a Lightwave3D file and displays it in an applet window.
 * The application is fairly basic; a more complete version of a Lightwave 3D
 * loader might incorporate features such as settable clip plane distances and
 * animated views (these are both possible with the current Lightwave 3D loader,
 * they just need to be implemented in the application).
 */
public class Viewer3D extends Applet {

    private java.net.URL filename;

    private SimpleUniverse u;

    public Viewer3D(java.net.URL url) {
        filename = url;
    }

    public Viewer3D() {
    }

    public void init() {
        if (filename == null) {
            // the path to the file for an applet
            try {
                java.net.URL path = getCodeBase();
                filename = new java.net.URL(path.toString() + "./ballcone.lws");
            } catch (java.net.MalformedURLException ex) {
                System.err.println(ex.getMessage());
                ex.printStackTrace();
                System.exit(1);
            }
        }

        // Construct the Lw3d loader and load the file
        Loader lw3dLoader = new Lw3dLoader(Loader.LOAD_ALL);
        Scene loaderScene = null;
        try {
            loaderScene = lw3dLoader.load(filename);
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }

        // Construct the applet canvas
        setLayout(new BorderLayout());
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

        Canvas3D c = new Canvas3D(config);
        add("Center", c);

        // Create a basic universe setup and the root of our scene
        u = new SimpleUniverse(c);
        BranchGroup sceneRoot = new BranchGroup();

        // Change the back clip distance; the default is small for
        // some lw3d worlds
        View theView = u.getViewer().getView();
        theView.setBackClipDistance(50000f);

        // Now add the scene graph defined in the lw3d file
        if (loaderScene.getSceneGroup() != null) {
            // Instead of using the default view location (which may be
            // completely bogus for the particular file you're loading),
            // let's use the initial view from the file. We can get
            // this by getting the view groups from the scene (there's
            // only one for Lightwave 3D), then using the inverse of the
            // transform on that view as the transform for the entire scene.

            // First, get the view groups (shouldn't be null unless there
            // was something wrong in the load
            TransformGroup viewGroups[] = loaderScene.getViewGroups();

            // Get the Transform3D from the view and invert it
            Transform3D t = new Transform3D();
            viewGroups[0].getTransform(t);
            Matrix4d m = new Matrix4d();
            t.get(m);
            m.invert();
            t.set(m);

            // Now we've got the transform we want. Create an
            // appropriate TransformGroup and parent the scene to it.
            // Then insert the new group into the main BranchGroup.
            TransformGroup sceneTransform = new TransformGroup(t);
            sceneTransform.addChild(loaderScene.getSceneGroup());
            sceneRoot.addChild(sceneTransform);
        }

        // Make the scene graph live by inserting the root into the universe
        u.addBranchGraph(sceneRoot);
    }

    public void destroy() {
        u.cleanup();
    }

    /**
     * The main method of the application takes one argument in the args array;
     * the filname that you want to load. Note that the file must be reachable
     * from the directory in which you're running this application.
     */
    public static void main(String args[]) {
        java.net.URL url = null;
        java.net.URL pathUrl = null;
        if (args.length > 0) {
            try {
                if ((args[0].indexOf("file:") == 0) || (args[0].indexOf("http") == 0)) {
                    url = new java.net.URL(args[0]);
                } else if (args[0].charAt(0) != '/') {
                    url = new java.net.URL("file:./" + args[0]);
                } else {
                    url = new java.net.URL("file:" + args[0]);
                }
            } catch (java.net.MalformedURLException ex) {
                System.err.println(ex.getMessage());
                ex.printStackTrace();
                System.exit(1);
            }
        } else {
            // the path to the image for an application
            try {
                url = new java.net.URL("file:./ballcone.lws");
            } catch (java.net.MalformedURLException ex) {
                System.err.println(ex.getMessage());
                ex.printStackTrace();
                System.exit(1);
            }
        }
        new MainFrame(new Viewer3D(url), 500, 500);
    }
}