LightsNPlanesApp.java Source code

Java tutorial

Introduction

Here is the source code for LightsNPlanesApp.java

Source

/*
 *      LightsNPlanesApp.java 1.0 99/04/12
 *
 * Copyright (c) 1999 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
 * modify and redistribute this software in source and binary code form,
 * provided that i) this copyright notice and license appear on all copies of
 * the software; and ii) Licensee does not utilize the software in a manner
 * which is disparaging to Sun.
 *
 * 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.
 *
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear
 * facility. Licensee represents and warrants that it will not use or
 * redistribute the Software for such purposes.
 */

/*
 *
 * This application (or a version of it) generated one or more
 * of the images in Chapter 6 of Getting Started with the Java 3D API.
 * The Java 3D Turtorial.
 *
 * See http://www.sun.com/desktop/java3d/collateral for more information.
 *
 */

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

import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingBox;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.IndexedQuadArray;
import javax.media.j3d.Light;
import javax.media.j3d.Material;
import javax.media.j3d.Node;
import javax.media.j3d.PointLight;
import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.media.j3d.SpotLight;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;

/**
 * LightsNPlanesApp creates
 */
public class LightsNPlanesApp extends Applet {

    TransformGroup createTG(float x, float y, float z) {
        Vector3f position = new Vector3f(x, y, z);
        Transform3D translate = new Transform3D();
        translate.set(position);
        TransformGroup trans1 = new TransformGroup(translate);
        return trans1;
    }

    Appearance createMatAppear(Color3f dColor, Color3f sColor, float shine) {

        Appearance appear = new Appearance();
        Material material = new Material();
        material.setDiffuseColor(dColor);
        material.setSpecularColor(sColor);
        material.setShininess(shine);
        appear.setMaterial(material);

        return appear;
    }

    public LightsNPlanesApp() {
        setLayout(new BorderLayout());
        Canvas3D c = new Canvas3D(null);
        add("Center", c);

        BoundingSphere bounds = new BoundingSphere(new Point3d(), 0.1);

        Vector3f direction = new Vector3f(0.0f, -1.0f, 0.0f);
        Point3f position = new Point3f(0.0f, 0.5f, -0.3f);

        Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
        Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
        Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
        Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);

        BranchGroup scene = new BranchGroup();

        IndexedQuadArray qa = new IndexedQuadArray(9, QuadArray.COORDINATES | QuadArray.NORMALS, 16);
        qa.setCoordinate(0, new Point3f(-0.3f, 0.3f, -0.3f));
        qa.setCoordinate(1, new Point3f(0.0f, 0.3f, -0.3f));
        qa.setCoordinate(2, new Point3f(0.3f, 0.3f, -0.3f));
        qa.setCoordinate(3, new Point3f(-0.3f, 0.0f, 0.0f));
        qa.setCoordinate(4, new Point3f(0.0f, 0.0f, 0.0f));
        qa.setCoordinate(5, new Point3f(0.3f, 0.0f, 0.0f));
        qa.setCoordinate(6, new Point3f(-0.3f, -0.3f, 0.3f));
        qa.setCoordinate(7, new Point3f(0.0f, -0.3f, 0.3f));
        qa.setCoordinate(8, new Point3f(0.3f, -0.3f, 0.3f));
        Vector3f n = new Vector3f(0.0f, 0.6f, 0.8f);
        n.normalize();
        qa.setNormal(0, n);
        qa.setNormal(1, n);
        qa.setNormal(2, n);
        qa.setNormal(3, n);
        qa.setNormal(4, n);
        qa.setNormal(5, n);
        qa.setNormal(6, n);
        qa.setNormal(7, n);
        qa.setNormal(8, n);

        qa.setCoordinateIndex(0, 0);
        qa.setCoordinateIndex(1, 3);
        qa.setCoordinateIndex(2, 4);
        qa.setCoordinateIndex(3, 1);
        qa.setCoordinateIndex(4, 1);
        qa.setCoordinateIndex(5, 4);
        qa.setCoordinateIndex(6, 5);
        qa.setCoordinateIndex(7, 2);
        qa.setCoordinateIndex(8, 3);
        qa.setCoordinateIndex(9, 6);
        qa.setCoordinateIndex(10, 7);
        qa.setCoordinateIndex(11, 4);
        qa.setCoordinateIndex(12, 4);
        qa.setCoordinateIndex(13, 7);
        qa.setCoordinateIndex(14, 8);
        qa.setCoordinateIndex(15, 5);

        TransformGroup trans1 = createTG(-0.7f, 0.0f, -0.5f);
        scene.addChild(trans1);

        TransformGroup trans2 = createTG(0.0f, 0.0f, -0.5f);
        scene.addChild(trans2);

        TransformGroup trans3 = createTG(0.7f, 0.0f, -0.5f);
        scene.addChild(trans3);

        Appearance qAppear = createMatAppear(white, white, 5.0f);
        Shape3D p1 = new Shape3D(qa, qAppear);
        //    p1.setBoundsAutoCompute(false);
        p1.setBounds(bounds);
        p1.setCapability(Node.ALLOW_BOUNDS_READ);
        trans1.addChild(p1);

        Shape3D p2 = new Shape3D(qa, qAppear);
        p2.setBounds(bounds);
        p2.setCapability(Node.ALLOW_BOUNDS_READ);
        trans2.addChild(p2);

        Shape3D p3 = new Shape3D(qa, qAppear);
        p3.setBounds(bounds);
        p3.setCapability(Node.ALLOW_BOUNDS_READ);
        trans3.addChild(p3);

        AmbientLight lightA = new AmbientLight();
        lightA.setInfluencingBounds(new BoundingSphere());
        lightA.setCapability(Light.ALLOW_INFLUENCING_BOUNDS_READ);
        scene.addChild(lightA);

        DirectionalLight lightD = new DirectionalLight();
        lightD.setInfluencingBounds(bounds);
        lightD.setBoundsAutoCompute(false);
        lightD.setCapability(Light.ALLOW_INFLUENCING_BOUNDS_READ);
        lightD.setDirection(direction);
        lightD.setColor(red);
        trans1.addChild(lightD);

        PointLight lightP = new PointLight();
        lightP.setInfluencingBounds(bounds);
        lightP.setCapability(Light.ALLOW_INFLUENCING_BOUNDS_READ);
        lightP.setPosition(position);
        lightP.setColor(green);
        trans2.addChild(lightP);

        SpotLight lightS = new SpotLight();
        lightS.setInfluencingBounds(bounds);
        lightS.setCapability(Light.ALLOW_INFLUENCING_BOUNDS_READ);
        lightS.setPosition(position);
        lightS.setDirection(direction);
        lightS.setSpreadAngle(0.3f);
        lightS.setConcentration(1.0f);
        lightS.setColor(blue);
        trans3.addChild(lightS);

        Background background = new Background();
        background.setApplicationBounds(new BoundingSphere());
        background.setColor(1.0f, 1.0f, 1.0f);
        scene.addChild(background);

        scene.compile();
        System.out.print("bounds object: ");
        System.out.println(bounds);

        System.out.print("influencing bounds for lightA: ");
        System.out.println(lightA.getInfluencingBounds());

        System.out.print("influencing bounds for lightD: ");
        System.out.println(lightD.getInfluencingBounds());

        System.out.print("influencing bounds for lightP: ");
        System.out.println(lightP.getInfluencingBounds());

        System.out.print("influencing bounds for lightS: ");
        System.out.println(lightS.getInfluencingBounds());

        System.out.print("bounds for plane1: ");
        System.out.println(p1.getBounds());

        System.out.print("bounds for plane2: ");
        System.out.println(p2.getBounds());

        System.out.print("bounds for plane3: ");
        System.out.println(p3.getBounds());

        BoundingSphere bs0 = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 0.2);
        BoundingSphere bs1 = new BoundingSphere(new Point3d(-0.1, 0.0, 0.0), 0.2);
        BoundingSphere bs2 = new BoundingSphere(new Point3d(-0.2, 0.0, 0.0), 0.2);
        BoundingSphere bs3 = new BoundingSphere(new Point3d(-0.3, 0.0, 0.0), 0.2);
        BoundingSphere bs4 = new BoundingSphere(new Point3d(-0.4, 0.0, 0.0), 0.2);
        BoundingSphere bs5 = new BoundingSphere(new Point3d(-0.5, 0.0, 0.0), 0.2);
        BoundingSphere bs6 = new BoundingSphere(new Point3d(-0.6, 0.0, 0.0), 0.2);
        BoundingSphere bs7 = new BoundingSphere(new Point3d(-0.7, 0.0, 0.0), 0.2);
        BoundingSphere bs8 = new BoundingSphere(new Point3d(-0.8, 0.0, 0.0), 0.2);
        BoundingBox bb1 = new BoundingBox(bs1);
        BoundingBox bb2 = new BoundingBox(bs2);
        BoundingBox bb3 = new BoundingBox(bs3);
        BoundingBox bb4 = new BoundingBox(bs4);
        BoundingBox bb5 = new BoundingBox(bs5);
        BoundingBox bb6 = new BoundingBox(bs6);
        BoundingBox bb7 = new BoundingBox(bs7);
        BoundingBox bb8 = new BoundingBox(bs8);

        if (bs0.intersect(bs1))
            System.out.println("bs0 intersects bs1");
        if (bs0.intersect(bs2))
            System.out.println("bs0 intersects bs2");
        if (bs0.intersect(bs3))
            System.out.println("bs0 intersects bs3");
        if (bs0.intersect(bs4))
            System.out.println("bs0 intersects bs4");
        if (bs0.intersect(bs5))
            System.out.println("bs0 intersects bs5");
        if (bs0.intersect(bs6))
            System.out.println("bs0 intersects bs6");
        if (bs0.intersect(bs7))
            System.out.println("bs0 intersects bs7");
        if (bs0.intersect(bs8))
            System.out.println("bs0 intersects bs8");

        if (bs0.intersect(bb1))
            System.out.println("bs0 intersects bb1");
        if (bs0.intersect(bb2))
            System.out.println("bs0 intersects bb2");
        if (bs0.intersect(bb3))
            System.out.println("bs0 intersects bb3");
        if (bs0.intersect(bb4))
            System.out.println("bs0 intersects bb4");
        if (bs0.intersect(bb5))
            System.out.println("bs0 intersects bb5");
        if (bs0.intersect(bb6))
            System.out.println("bs0 intersects bb6");
        if (bs0.intersect(bb7))
            System.out.println("bs0 intersects bb7");
        if (bs0.intersect(bb8))
            System.out.println("bs0 intersects bb8");

        SimpleUniverse u = new SimpleUniverse(c);

        // This will move the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        u.getViewingPlatform().setNominalViewingTransform();

        u.addBranchGraph(scene);
    }

    public static void main(String argv[]) {
        new MainFrame(new LightsNPlanesApp(), 256, 128);
    }
}