001: /*
002: * $RCSfile: TreeCleaner.java,v $
003: *
004: * @(#)TreeCleaner.java 1.2 99/03/11 11:12:00
005: *
006: * Copyright (c) 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
007: *
008: * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
009: * modify and redistribute this software in source and binary code form,
010: * provided that i) this copyright notice and license appear on all copies of
011: * the software; and ii) Licensee does not utilize the software in a manner
012: * which is disparaging to Sun.
013: *
014: * This software is provided "AS IS," without a warranty of any kind. ALL
015: * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
016: * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
017: * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
018: * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
019: * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
020: * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
021: * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
022: * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
023: * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
024: * POSSIBILITY OF SUCH DAMAGES.
025: *
026: * This software is not designed or intended for use in on-line control of
027: * aircraft, air traffic, aircraft navigation or aircraft communications; or in
028: * the design, construction, operation or maintenance of any nuclear
029: * facility. Licensee represents and warrants that it will not use or
030: * redistribute the Software for such purposes.
031: *
032: * $Revision: 1.2 $
033: * $Date: 2005/02/03 23:07:03 $
034: * $State: Exp $
035: */
036: /*
037: * @Author: Rick Goldberg
038: * @Author: Doug Gehringer
039: */
040: package org.jdesktop.j3d.loaders.vrml97.impl;
041:
042: import java.util.*;
043:
044: import javax.media.j3d.*;
045: import javax.vecmath.Color3f;
046:
047: /** Description of the Class */
048: public class TreeCleaner {
049:
050: private final static int CLEAN_UNUSED = 1;
051: private final static int CLEAN_NONE = 2;
052:
053: private final static int ALREADY_CLEANED = -1;
054:
055: final static boolean debug = false;
056:
057: /**
058: * Clears pickable and collidable flags in Shape3Ds in the subgraph
059: * under the input node. The pickable flag is set to false if there
060: * are no groups above the Shape3D with ENABLE_PICK_REPORTING set. The
061: * collidable flag on Shape3ds is always set to false.
062: *
063: *@param implNode Description of the Parameter
064: *@exception RestrictedAccessException Description of the Exception
065: */
066: public static void cleanSubgraph(javax.media.j3d.Node implNode)
067: throws RestrictedAccessException {
068: Hashtable sharedGroups = new Hashtable();
069:
070: checkAndClean(implNode, CLEAN_UNUSED, sharedGroups);
071:
072: // now go through the shared groups we found, since traversing
073: // the sg's can find new sg's, we need to iterate
074: int numGroupsCleaned = 0;
075: Integer alreadyCleaned = new Integer(ALREADY_CLEANED);
076:
077: while (numGroupsCleaned < sharedGroups.size()) {
078: if (debug) {
079: System.out.println("Cleaning shared groups: "
080: + numGroupsCleaned + " done out of "
081: + sharedGroups.size());
082: }
083: Enumeration e = sharedGroups.keys();
084: while (e.hasMoreElements()) {
085: SharedGroup sg = (SharedGroup) e.nextElement();
086: int sgFlag = ((Integer) sharedGroups.get(sg))
087: .intValue();
088: if (sgFlag != ALREADY_CLEANED) {
089: checkAndClean(sg, sgFlag, sharedGroups);
090: sharedGroups.put(sg, alreadyCleaned);
091: numGroupsCleaned++;
092: }
093: }
094: }
095: }
096:
097: /**
098: * Description of the Method
099: *
100: *@param node Description of the Parameter
101: *@param pickingFlag Description of the Parameter
102: *@param sharedGroups Description of the Parameter
103: *@exception RestrictedAccessException Description of the Exception
104: */
105: static void checkAndClean(javax.media.j3d.Node node,
106: int pickingFlag, Hashtable sharedGroups)
107: throws RestrictedAccessException {
108: if (node != null) {
109: if (node.isLive()) {
110: throw new RestrictedAccessException(
111: "Can't clean a live scene graph");
112: } else {
113: clean(node, pickingFlag, sharedGroups);
114: }
115: }
116: }
117:
118: /**
119: * Description of the Method
120: *
121: *@param node Description of the Parameter
122: *@param pickingFlag Description of the Parameter
123: *@param sharedGroups Description of the Parameter
124: */
125: static void clean(javax.media.j3d.Node node, int pickingFlag,
126: Hashtable sharedGroups) {
127:
128: if (node instanceof javax.media.j3d.Group) {
129: // if current flag is unused and this group is pickable, keep it's
130: // children pickable
131: if ((pickingFlag == CLEAN_UNUSED)
132: && (node
133: .getCapability(javax.media.j3d.Node.ENABLE_PICK_REPORTING))) {
134: pickingFlag = CLEAN_NONE;
135: }
136: Enumeration e = ((javax.media.j3d.Group) node)
137: .getAllChildren();
138: while (e.hasMoreElements()) {
139: clean((javax.media.j3d.Node) (e.nextElement()),
140: pickingFlag, sharedGroups);
141: }
142: } else if (node instanceof Link) {
143: Link link = (Link) node;
144: SharedGroup sg = link.getSharedGroup();
145: Integer value = (Integer) sharedGroups.get(sg);
146: // Set value if none set before or this value is more restrictive
147: if ((value == null) || (pickingFlag > value.intValue())) {
148: value = new Integer(pickingFlag);
149: sharedGroups.put(sg, new Integer(pickingFlag));
150: }
151: } else if (node instanceof Shape3D) {
152: if (pickingFlag != CLEAN_NONE) {
153: node.setPickable(false);
154: }
155: node.setCollidable(false);
156: }
157: }
158: }
|