/*
* @(#)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();
}
}
|