What you are doing sounds like it should work.  I have attached
a modified AppearanceMixed that uses setModelTransform().  It isn't
doing what you need it to do, but it gives you an example of
using it.

Doug Twilleager
Sun Microsystems

>MIME-Version: 1.0
>Subject: Re: [JAVA3D] Range ordering of transparent objects
>Comments: To: Doug Twilleager <[EMAIL PROTECTED]>
>To: [EMAIL PROTECTED]
>
>Doug,
>
>I appreciate your help.  I've spent the morning doing some rearranging
>and setting up for this.  It's not quite working for me yet, but I'm
>pretty sure I know why.
>
>I have the transform from each Shape to virtual world coordinates.  But
>I think I may be missing the part of the transform to go from virtual
>world to eye coordinates.  Can you give me what you consider to be the
>set of steps to do this?
>
>For example:
>
>     VW
>      |
>     Locale
>       |
>    ------------
>    BG1       BG2
>    |          |
>    G1        TG3
>    |          |
>    TG1       ViewPlatform
>    |
>    TG2
>    |
>    S3D
>
>Let's say I want to draw the shape S3D in immediate mode after hacking
>it off under G1.  I compute the transform3D (xform1) for the shape that
>includes TG1 and TG2, and I also get the transform from G1 to virtual
>world coordinates.
>
>Right now, my code looks something like:
>
>      G1.getLocalToVworld(parentXform);  // G1 to virtual world
>      tempxform.mul(parentXform, xform1); // make S3D to virtual world
>      gc.setAppearance( S3D.getAppearance() );
>      gc.setModelTransform( tempxform );
>      gc.draw( shape );
>
>I use TG3 to move the view around in the scene.  Am I missing TG3 in my
>code?  Actually, I guess I'm asking exactly how the argument to
>"setModelTransform" should be created.
>
>I swear if I get this going I'll put it in the FAQ... ;)
>
>-Lee
>
>> -----Original Message-----
>> From: Doug Twilleager [mailto:[EMAIL PROTECTED]]
>> Sent: Monday, April 23, 2001 11:18 PM
>> To: [EMAIL PROTECTED]
>> Subject: Re: [JAVA3D] Range ordering of transparent objects
>>
>>
>> Well, it looks like you have found a performance trap in detach/attach
>> of OrderedGroup.  Let's try this a different way.  If we examine the
>> order of operations in the Renderer thread, it looks like this:
>>
>>         Canvas3D.preRender();
>>         Render opaque objects
>>         Render OrderedGroup objects
>>         Canvas3D.renderField();
>>         Rendertransparent objects
>>         Canvas3D.postRender();
>>         Swap buffers
>>         Canvas3D.postSwap();
>>
>> Since you are trying to render a collection of objects in a specific
>> order, and they fall into the OrderedGroup catagory, an alternative
>> approach is to render your ordered objects using the GraphicsContext3D
>> in the Canvas3D.renderField() callback.  This is pretty much the same
>> place that OrderedGroup would have rendered them.  And since you have
>> references to all the objects, and are sorting them, it would be easy
>> to render them there.  As long as the geometry was pretty
>> much a one to
>> one relationship with OrderedGroup children, you won't loose any
>> performance from state sorting.  This technique should work well.
>>
>> Doug Twilleager
>> Sun Microsystems
>>
>> >To: "'Doug Twilleager'" <[EMAIL PROTECTED]>
>> >Cc: "JAVA3D-INTEREST (E-mail)" <[EMAIL PROTECTED]>
>> >Subject: RE: [JAVA3D] Range ordering of transparent objects
>> >MIME-Version: 1.0
>> >
>> >Doug,
>> >I turned off compiling of my scene and placed a BranchGroup above my
>> >OrderedGroup.  Next, I changed all my child nodes to plain
>> Group nodes.
>> >Still was very slow.  Then I turned off all reordering and
>> left *just*
>> >the detach/attach of my OrderedGroup.  Still slow.  Finally,
>> I did some
>> >profiling....
>> >
>> >long time1 = System.currentTimeMillis();
>> >for(i = 0; i < 5; i++)
>> >{
>> >  myBranch.detach();
>> >  myParent.addChild( myBranch );
>> >}
>> >long time2 = System.currentTimeMillis();
>> >System.out.println(" AVG TIME = " + ((float)(time2-time1) * 0.2f) );
>> >
>> >AVG TIME = 46.0
>> >AVG TIME = 70.200005
>> >AVG TIME = 50.0
>> >AVG TIME = 74.200005
>> >AVG TIME = 146.2
>> >AVG TIME = 84.200005
>> >AVG TIME = 66.200005
>> >AVG TIME = 90.0
>> >AVG TIME = 66.200005
>> >AVG TIME = 264.4
>> >AVG TIME = 76.200005
>> >AVG TIME = 108.200005
>> >AVG TIME = 86.0
>> >
>> >These times are in milliseconds. Actually, I even changed it to do a
>> >single attach/detach timing:
>> >
>> >AVG TIME = 70.0
>> >AVG TIME = 90.0
>> >AVG TIME = 60.0
>> >AVG TIME = 90.0
>> >AVG TIME = 841.0
>> >AVG TIME = 90.0
>> >AVG TIME = 151.0
>> >AVG TIME = 90.0
>> >AVG TIME = 140.0
>> >AVG TIME = 90.0
>> >AVG TIME = 80.0
>> >AVG TIME = 120.0
>> >
>> >I know that Win2k timing is only good for 10ms, but there's a couple
>> >pretty big ones in there.  What can I do about this?  If
>> there is no way
>> >around this, then how can I *ever* do range-ordering??  If the new
>> >capability in 1.3 won't be available until later this year,
>> how about an
>> >interim release that just allows for *quick* reordering of
>> OrderedGroup
>> >nodes as a workaround?  At least the problem would then be workable.
>> >
>> >Thx
>> >-Lee
>> >
>> >> -----Original Message-----
>> >> From: Doug Twilleager [mailto:[EMAIL PROTECTED]]
>> >> Sent: Monday, April 23, 2001 3:17 PM
>> >> To: [EMAIL PROTECTED]
>> >> Subject: Re: [JAVA3D] Range ordering of transparent objects
>> >>
>> >>
>> >> The only way to get the compile out of the way is to compile the
>> >> scene without your OrderedGroup's, and then add them in after
>> >> the compile.  Other than that, I don't see any other ways
>> >> to do this in 1.2.*.
>> >>
>> >> Doug Twilleager
>> >> Sun Microsystems
>> >>
>> >>
>> >> >To: "'Doug Twilleager'" <[EMAIL PROTECTED]>,
>> >> [EMAIL PROTECTED]
>> >> >Subject: RE: [JAVA3D] Range ordering of transparent objects
>> >> >MIME-Version: 1.0
>> >> >
>> >> >Doug,
>> >> >The only way to rearrange the children of the
>> OrderedGroup is to do
>> >> >attaches and reattaches of BranchGroups since I get an
>> >> exception if I do
>> >> >a "setChild(Node, index)" without the child being a
>> >> BranchGroup.  This
>> >> >is from the Group.setChild() Javadoc:
>> >> >
>> >> >"RestrictedAccessException - if this group node is part of live or
>> >> >compiled scene graph and the child node being set is not a
>> >> BranchGroup
>> >> >node"
>> >> >
>> >> >Since they are BranchGroups, I still get the overhead of doing
>> >> >attach/detach with each child.  My code for swapping
>> >> children looks like
>> >> >this:
>> >> >
>> >> >  in constructor...
>> >> >  {
>> >> >    ...
>> >> >    empty = new BranchGroup();
>> >> >    empty.setCapability(BranchGroup.ALLOW_DETACH);
>> >> >    ...
>> >> >  }
>> >> >
>> >> >  private void doReordering()
>> >> >  {
>> >> >    myBranch.detach();  // detach OrderedGroup from scene
>> >> >
>> >> >    // Call "swapBranches" as necessary
>> >> >
>> >> >    myParent.addChild( myBranch );
>> >> >  }
>> >> >
>> >> >  private void swapBranches(int a, int b)
>> >> >  {
>> >> >
>> >> >    BranchGroup b1 = (BranchGroup)myOrderedGroup.getChild( a );
>> >> >    BranchGroup b2 = (BranchGroup)myOrderedGroup.getChild( b );
>> >> >    myOrderedGroup.setChild( empty, a );  // I think this calls
>> >> >b1.detach()
>> >> >    myOrderedGroup.setChild( b1, b );
>> >> >    myOrderedGroup.setChild( b2, a );
>> >> >  }
>> >> >
>> >> >What do you think I can do?  Is there a way to prevent my
>> >> OrderedGroup
>> >> >from being compiled so I don't have to use BranchGroups for the
>> >> >children??
>> >> >
>> >> >Thx
>> >> >-Lee
>> >> >
>> >> >> -----Original Message-----
>> >> >> From: Doug Twilleager [mailto:[EMAIL PROTECTED]]
>> >> >> Sent: Monday, April 23, 2001 1:23 PM
>> >> >> To: [EMAIL PROTECTED]
>> >> >> Subject: Re: [JAVA3D] Range ordering of transparent objects
>> >> >
>> >> ><snip...>
>> >> >
>> >> >> If you detach the branch graph which contains the
>> >> >> OrderedGroup, rearrange
>> >> >> the OrderedGroup, then reattach again, you will get better
>> >> performance
>> >> >> that attaching and reattaching the children of the
>> >> >> OrderedGroup individually.
>> >> >>
>> >> >> Doug Twilleager
>> >> >> Sun Microsystems
>> >> >>
>> >>
>> >> ==============================================================
>> >> =============
>> >> To unsubscribe, send email to [EMAIL PROTECTED] and
>> >> include in the body
>> >> of the message "signoff JAVA3D-INTEREST".  For general help,
>> >> send email to
>> >> [EMAIL PROTECTED] and include in the body of the
>> message "help".
>> >>
>>
>> ==============================================================
>> =============
>> To unsubscribe, send email to [EMAIL PROTECTED] and
>> include in the body
>> of the message "signoff JAVA3D-INTEREST".  For general help,
>> send email to
>> [EMAIL PROTECTED] and include in the body of the message "help".
>>
>
>===========================================================================
>To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
>of the message "signoff JAVA3D-INTEREST".  For general help, send email to
>[EMAIL PROTECTED] and include in the body of the message "help".
/*
 *      @(#)AppearanceMixed.java 1.20 01/01/11 07:30:42
 *
 * Copyright (c) 1996-2001 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.
 */

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.*;
import javax.vecmath.*;

public class AppearanceMixed extends Applet {

    private java.net.URL bgImage;
    private java.net.URL texImage;

    private SimpleUniverse u = null;

    static class MyCanvas3D extends Canvas3D {
        private GraphicsContext3D gc;

        private static final int vertIndices[] = { 0, 1, 2, 0, 2, 3 };
        private static final int normalIndices[] = { 0, 0, 0, 1, 1, 1 };
        private IndexedTriangleArray tri =
            new IndexedTriangleArray(4, IndexedTriangleArray.COORDINATES |
                                     IndexedTriangleArray.NORMALS, 6);

        private Transform3D cmt = new Transform3D();
        private Transform3D tz = new Transform3D();
        private Alpha rotAlpha = new Alpha(-1, 6000);
        private Vector3f trans = new Vector3f(0.7f, 0.0f, 0.0f);

        private Point3f vert[] = {
            new Point3f(-0.12f, -0.12f, 0.0f),
            new Point3f( 0.12f, -0.12f, 0.0f),
            new Point3f( 0.12f,  0.12f, 0.0f),
            new Point3f(-0.12f,  0.12f, 0.0f),
        };

        private Point3f min[] = {
            new Point3f(-0.24f, -0.24f, -0.20f),
            new Point3f( 0.04f, -0.28f, -0.24f),
            new Point3f( 0.00f,  0.00f, -0.24f),
            new Point3f(-0.32f,  0.08f, -0.20f),
        };

        private Point3f max[] = {
            new Point3f(-0.04f, -0.04f, 0.12f),
            new Point3f( 0.32f, -0.04f, 0.16f),
            new Point3f( 0.36f,  0.28f, 0.20f),
            new Point3f(-0.04f,  0.24f, 0.16f),
        };

        private Point3f delta[] = {
            new Point3f(-0.0021f, -0.0017f,  0.0014f),
            new Point3f( 0.0025f, -0.0013f, -0.0018f),
            new Point3f( 0.0021f,  0.0017f,  0.0018f),
            new Point3f(-0.0025f,  0.0013f, -0.0014f),
        };

        private Vector3f normals[];
        private Vector3f v01 = new Vector3f();
        private Vector3f v02 = new Vector3f();
        private Vector3f v03 = new Vector3f();

        public void renderField(int fieldDesc) {
            computeVert();
            computeNormals();
            double angle = rotAlpha.value() * 2.0*Math.PI;
            cmt.rotY(angle);
            cmt.setTranslation(trans);
            gc.setModelTransform(cmt);
            gc.draw(tri);
        }

        private void computeVert() {
            for (int i = 0; i < 4; i++) {
                vert[i].add(delta[i]);
                if (vert[i].x > max[i].x) {
                    vert[i].x = max[i].x;
                    delta[i].x *= -1.0f;
                }
                if (vert[i].x < min[i].x) {
                    vert[i].x = min[i].x;
                    delta[i].x *= -1.0f;
                }
                if (vert[i].y > max[i].y) {
                    vert[i].y = max[i].y;
                    delta[i].y *= -1.0f;
                }
                if (vert[i].y < min[i].y) {
                    vert[i].y = min[i].y;
                    delta[i].y *= -1.0f;
                }
                if (vert[i].z > max[i].z) {
                    vert[i].z = max[i].z;
                    delta[i].z *= -1.0f;
                }
                if (vert[i].z < min[i].z) {
                    vert[i].z = min[i].z;
                    delta[i].z *= -1.0f;
                }
            }
            tri.setCoordinates(0, vert);
        }

        private void computeNormals() {
            v01.sub(vert[1], vert[0]);
            v02.sub(vert[2], vert[0]);
            v03.sub(vert[3], vert[0]);
            normals[0].cross(v01, v02);
            normals[0].normalize();
            normals[1].cross(v02, v03);
            normals[1].normalize();
            tri.setNormals(0, normals);
        }

        public MyCanvas3D(GraphicsConfiguration gcfg) {
            super(gcfg);

            // Allocate memory for normals
            normals = new Vector3f[2];
            normals[0] = new Vector3f();
            normals[1] = new Vector3f();

            // Set up the indices
            tri.setCoordinateIndices(0, vertIndices);
            tri.setNormalIndices(0, normalIndices);

            // Set up the graphics context
            gc = getGraphicsContext3D();

            // Create the appearance for the triangle fan
            Appearance app = new Appearance();
            Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
            Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
            Color3f objColor = new Color3f(0.0f, 0.0f, 0.8f);
            app.setMaterial(new Material(objColor, black, objColor,
                                         white, 80.0f));
            gc.setAppearance(app);

            // Set up the global lights
            Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
            Vector3f lDir1  = new Vector3f(-1.0f, -1.0f, -1.0f);
            Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
            gc.addLight(new AmbientLight(alColor));
            gc.addLight(new DirectionalLight(lColor1, lDir1));
        }
    }


    private BranchGroup createSceneGraph() {
        // Create the root of the branch graph
        BranchGroup objRoot = new BranchGroup();

        // Create a bounds for the background and lights
        BoundingSphere bounds =
            new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

        // Set up the background
        TextureLoader bgTexture = new TextureLoader(bgImage, this);
        Background bg = new Background(bgTexture.getImage());
        bg.setApplicationBounds(bounds);
        objRoot.addChild(bg);

        // Set up the global lights
        Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
        Vector3f lDir1  = new Vector3f(-1.0f, -1.0f, -1.0f);
        Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);

        AmbientLight aLgt = new AmbientLight(alColor);
        aLgt.setInfluencingBounds(bounds);
        DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
        lgt1.setInfluencingBounds(bounds);
        objRoot.addChild(aLgt);
        objRoot.addChild(lgt1);

        // Create a bunch of objects with a behavior and add them
        // into the scene graph.

        int row, col;
        Appearance[][] app = new Appearance[3][3];

        for (row = 0; row < 3; row++)
            for (col = 0; col < 3; col++)
                app[row][col] = createAppearance(row * 3 + col);

        for (int i = 0; i < 3; i++) {
            double ypos = (double)(i - 1) * 0.6;
            for (int j = 0; j < 3; j++) {
                double xpos = (double)(j - 1) * 0.6;
                objRoot.addChild(createObject(app[i][j], 0.12,  xpos, ypos));
            }
        }

        // Let Java 3D perform optimizations on this scene graph.
        objRoot.compile();

        return objRoot;
    }


    private Appearance createAppearance(int idx) {
        Appearance app = new Appearance();

        // Globally used colors
        Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
        Color3f white = new Color3f(1.0f, 1.0f, 1.0f);

        switch (idx) {
        // Unlit solid
        case 0:
            {
                // Set up the coloring properties
                Color3f objColor = new Color3f(1.0f, 0.2f, 0.4f);
                ColoringAttributes ca = new ColoringAttributes();
                ca.setColor(objColor);
                app.setColoringAttributes(ca);
                break;
            }


        // Unlit wire frame
        case 1:
            {
                // Set up the coloring properties
                Color3f objColor = new Color3f(0.5f, 0.0f, 0.2f);
                ColoringAttributes ca = new ColoringAttributes();
                ca.setColor(objColor);
                app.setColoringAttributes(ca);

                // Set up the polygon attributes
                PolygonAttributes pa = new PolygonAttributes();
                pa.setPolygonMode(pa.POLYGON_LINE);
                pa.setCullFace(pa.CULL_NONE);
                app.setPolygonAttributes(pa);
                break;
            }

        // Unlit points
        case 2:
            {
                // Set up the coloring properties
                Color3f objColor = new Color3f(0.2f, 0.2f, 1.0f);
                ColoringAttributes ca = new ColoringAttributes();
                ca.setColor(objColor);
                app.setColoringAttributes(ca);

                // Set up the polygon attributes
                PolygonAttributes pa = new PolygonAttributes();
                pa.setPolygonMode(pa.POLYGON_POINT);
                pa.setCullFace(pa.CULL_NONE);
                app.setPolygonAttributes(pa);

                // Set up point attributes
                PointAttributes pta = new PointAttributes();
                pta.setPointSize(5.0f);
                app.setPointAttributes(pta);
                break;
            }

        // Lit solid
        case 3:
            {
                // Set up the material properties
                Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
                app.setMaterial(new Material(objColor, black, objColor,
                                             white, 80.0f));
                break;
            }

        // Texture mapped, lit solid
        case 4:
            {
                // Set up the texture map
                TextureLoader tex = new TextureLoader(texImage, this);
                app.setTexture(tex.getTexture());

                TextureAttributes texAttr = new TextureAttributes();
                texAttr.setTextureMode(TextureAttributes.MODULATE);
                app.setTextureAttributes(texAttr);


                // Set up the material properties
                app.setMaterial(new Material(white, black, white, black, 1.0f));
                break;
            }

        // Transparent, lit solid
        case 5:
            {
                // Set up the transparency properties
                TransparencyAttributes ta = new TransparencyAttributes();
                ta.setTransparencyMode(ta.BLENDED);
                ta.setTransparency(0.6f);
                app.setTransparencyAttributes(ta);

                // Set up the polygon attributes
                PolygonAttributes pa = new PolygonAttributes();
                pa.setCullFace(pa.CULL_NONE);
                app.setPolygonAttributes(pa);

                // Set up the material properties
                Color3f objColor = new Color3f(0.7f, 0.8f, 1.0f);
                app.setMaterial(new Material(objColor, black, objColor,
                                             black, 1.0f));
                break;
            }

        // Lit solid, no specular
        case 6:
            {
                // Set up the material properties
                Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
                app.setMaterial(new Material(objColor, black, objColor,
                                             black, 80.0f));
                break;
            }

        // Lit solid, specular only
        case 7:
            {
                // Set up the material properties
                Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
                app.setMaterial(new Material(black, black, black,
                                             white, 80.0f));
                break;
            }

        // Another lit solid with a different color
        case 8:
            {
                // Set up the material properties
                Color3f objColor = new Color3f(0.8f, 0.8f, 0.0f);
                app.setMaterial(new Material(objColor, black, objColor,
                                             white, 80.0f));
                break;
            }

        default:
            {
                ColoringAttributes ca = new ColoringAttributes();
                ca.setColor(new Color3f(0.0f, 1.0f, 0.0f));
                app.setColoringAttributes(ca);
            }
        }

        return app;
    }


    private Group createObject(Appearance app, double scale,
                               double xpos, double ypos) {

        // Create a transform group node to scale and position the object.
        Transform3D t = new Transform3D();
        t.set(scale, new Vector3d(xpos, ypos, 0.0));
        TransformGroup objTrans = new TransformGroup(t);

        // Create a second transform group node and initialize it to the
        // identity.  Enable the TRANSFORM_WRITE capability so that
        // our behavior code can modify it at runtime.
        TransformGroup spinTg = new TransformGroup();
        spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

        // Create a simple shape leaf node and set the appearance
        Shape3D shape = new Tetrahedron();
        shape.setAppearance(app);

        // add it to the scene graph.
        spinTg.addChild(shape);

        // Create a new Behavior object that will perform the desired
        // operation on the specified transform object and add it into
        // the scene graph.
        Transform3D yAxis = new Transform3D();
        Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
                                        0, 0,
                                        5000, 0, 0,
                                        0, 0, 0);

        RotationInterpolator rotator =
            new RotationInterpolator(rotationAlpha, spinTg, yAxis,
                                     0.0f, (float) Math.PI*2.0f);

        BoundingSphere bounds =
            new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);

        rotator.setSchedulingBounds(bounds);

        // Add the behavior and the transform group to the object
        objTrans.addChild(rotator);
        objTrans.addChild(spinTg);

        return objTrans;
    }


    public AppearanceMixed() {
    }

    public AppearanceMixed(java.net.URL bgurl, java.net.URL texurl) {
        bgImage = bgurl;
        texImage = texurl;
    }
    public void init() {
        if (bgImage == null) {
            // the path to the image for an applet
            try {
                bgImage = new java.net.URL(getCodeBase().toString() +
                                           "bg.jpg");
            }
            catch (java.net.MalformedURLException ex) {
                System.out.println(ex.getMessage());
                System.exit(1);
            }
        }

        if (texImage == null) {
            // the path to the image for an applet
            try {
                texImage = new java.net.URL(getCodeBase().toString() +
                                            "apimage.jpg");
            }
            catch (java.net.MalformedURLException ex) {
                System.out.println(ex.getMessage());
                System.exit(1);
            }
        }
        setLayout(new BorderLayout());
        GraphicsConfiguration config =
           SimpleUniverse.getPreferredConfiguration();

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

        // Create a simple scene and attach it to the virtual universe
        BranchGroup scene = createSceneGraph();
        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 void destroy() {
        u.removeAllLocales();
    }


    //
    // The following allows AppearanceMixed to be run as an application
    // as well as an applet
    //
    public static void main(String[] args) {
        // the path to the image file for an application
        java.net.URL bgurl = null;
        java.net.URL texurl = null;
        try {
            bgurl = new java.net.URL("file:bg.jpg");
            texurl = new java.net.URL("file:apimage.jpg");
        }
        catch (java.net.MalformedURLException ex) {
            System.out.println(ex.getMessage());
            System.exit(1);
        }
        new MainFrame(new AppearanceMixed(bgurl, texurl), 700, 700);
    }
}

Reply via email to