Java 3D and VRML Package Tree Printer : 3D Environment « 3D « Java






Java 3D and VRML Package Tree Printer


/*
 * @(#)TreePrinter.java 1.2 01/08/01 11:02:27
 * 
 * ************************************************************** "Copyright (c)
 * 2001 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.io.PrintStream;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.media.j3d.CapabilityNotSetException;
import javax.media.j3d.Link;
import javax.media.j3d.Locale;
import javax.media.j3d.SceneGraphObject;
import javax.media.j3d.SharedGroup;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;

public class TreePrinter {
  PrintStream printStream;

  String j3dPkg = new String("javax.media.j3d.");

  String v97Pkg = new String("com.sun.j3d.loaders.vrml97.impl.");

  public void print(PrintStream s, Locale l) {
    printStream = s;
    HashSet sharedGroups = new HashSet();
    printTree(l, 0, sharedGroups);
    Iterator iterator = sharedGroups.iterator();
    while (iterator.hasNext()) {
      SharedGroup sg = (SharedGroup) iterator.next();
      print(s, sg);
    }
  }

  public void print(Locale l) {
    print(System.out, l);
  }

  private void printTree(Locale l, int graphDepth, Set sharedGroups) {
    printNode(l, 0, sharedGroups);
    try {
      Enumeration e = l.getAllBranchGraphs();
      while (e.hasMoreElements()) {
        Object o = e.nextElement();
        if (o instanceof Locale)
          printTree((Locale) o, graphDepth + 1, sharedGroups);
        else if (o instanceof SceneGraphObject)
          printTree((SceneGraphObject) o, graphDepth + 1,
              sharedGroups);
        else
          printStream.println(o + " unknown and in tree");
      }
    } catch (CapabilityNotSetException e) {
      printStream.println("No capability to read children");
    }
  }

  public void print(PrintStream s, SceneGraphObject sgo) {
    printStream = s;
    HashSet sharedGroups = new HashSet();
    if (sgo == null) {
      printStream.println("null");
    } else {
      printTree(sgo, 0, sharedGroups);
      Iterator iterator = sharedGroups.iterator();
      while (iterator.hasNext()) {
        SharedGroup sg = (SharedGroup) iterator.next();
        print(s, sg);
      }
    }
  }

  public void print(SceneGraphObject sgo) {
    print(System.out, sgo);
  }

  private void printTree(SceneGraphObject sgo, int graphDepth,
      Set sharedGroups) {

    printNode(sgo, graphDepth, sharedGroups);
    if (sgo instanceof javax.media.j3d.Group) {
      try {
        Enumeration e = ((javax.media.j3d.Group) sgo).getAllChildren();
        while (e.hasMoreElements()) {
          printTree((SceneGraphObject) (e.nextElement()),
              graphDepth + 1, sharedGroups);
        }
      } catch (CapabilityNotSetException e) {
        // Can't read handled below
      }
    }
  }

  private String nodeString(Object o) {
    String objString = o.toString();
    if (objString.startsWith(j3dPkg)) {
      objString = objString.substring(j3dPkg.length());
    }
    if (objString.startsWith(v97Pkg)) {
      objString = objString.substring(v97Pkg.length());
    }
    return objString;
  }

  private void printNode(Object o, int indent, Set sharedGroups) {
    for (int i = 0; i < indent; i++)
      printStream.print(">");
    printStream.print(nodeString(o) + ": ");
    if (o instanceof SceneGraphObject) {
      SceneGraphObject sgo = (SceneGraphObject) o;
      int capBits = 0;
      // TODO: how to make sure we always check all the valid bits?
      for (int i = 0; i < 64; i++) {
        if (sgo.getCapability(i)) {
          capBits |= 1 << i;
        }
      }
      printStream.print("capBits:Ox" + Integer.toHexString(capBits));
      if (o instanceof javax.media.j3d.Group) {
        javax.media.j3d.Group g = (javax.media.j3d.Group) o;
        int numChildren = 0;
        try {
          numChildren = g.numChildren();
        } catch (CapabilityNotSetException e) {
          //anyone who is using treePrinter, is debugging, so it is
          //alright to blindly allow read. you should first detach
          //browser.curScene, print the tree, then add it back to
          //browser.locale when finished.
          g.setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_READ);
          numChildren = g.numChildren();
          //System.out.println("Can't read children on group");
          //return;
        }
        printStream.print(" children:" + numChildren);
        if (o instanceof TransformGroup) {
          Transform3D transform = new Transform3D();
          Transform3D identity = new Transform3D();
          TransformGroup t = (TransformGroup) o;
          t.getTransform(transform);
          // TODO: use getBestType() when implemented
          if (transform.equals(identity)) {
            printStream.print(" xform:IDENTITY ");
          } else {
            printStream.print(" xform:NON-IDENTITY ");
          }
        }
      } else if (o instanceof Link) {
        Link l = (Link) o;
        SharedGroup sg = l.getSharedGroup();
        printStream.print(" sg:" + nodeString(sg));
        sharedGroups.add(sg);
      } else {
        printStream.print(": leaf");
      }
    }
    printStream.println();
  }
}


           
       








Related examples in the same category

1.Environment ExplorerEnvironment Explorer
2.Query PropertiesQuery Properties
3.Package InfoPackage Info
4.Frames per second counterFrames per second counter
5.Timer TestTimer Test