Mega Code Archive

 
Categories / Java / 3D Graphics
 

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();   } }