001: /*
002: * $RCSfile: GeometryArrayStripifier.java,v $
003: *
004: * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * - Redistribution of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * - Redistribution in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * Neither the name of Sun Microsystems, Inc. or the names of
019: * contributors may be used to endorse or promote products derived
020: * from this software without specific prior written permission.
021: *
022: * This software is provided "AS IS," without a warranty of any
023: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
024: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
025: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
026: * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
027: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
028: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
029: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
030: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
031: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
032: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
033: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
034: * POSSIBILITY OF SUCH DAMAGES.
035: *
036: * You acknowledge that this software is not designed, licensed or
037: * intended for use in the design, construction, operation or
038: * maintenance of any nuclear facility.
039: *
040: * $Revision: 1.3 $
041: * $Date: 2007/02/09 17:17:02 $
042: * $State: Exp $
043: */
044:
045: package org.jdesktop.j3d.utils.scenegraph.traverser;
046:
047: import java.util.HashMap;
048: import javax.media.j3d.TriangleArray;
049: import javax.media.j3d.IndexedTriangleArray;
050: import javax.media.j3d.Shape3D;
051: import javax.media.j3d.GeometryArray;
052: import com.sun.j3d.utils.geometry.GeometryInfo;
053: import com.sun.j3d.utils.geometry.Stripifier;
054: import org.jdesktop.j3d.utils.geometry.GeometryInfoGenerator;
055: import org.jdesktop.j3d.utils.capability.Capabilities;
056:
057: /**
058: * Takes each TriangleArray geometry in the
059: * scene graph and stripifies the data
060: *
061: * @author paulby
062: * @version 1.6, 01/18/02
063: */
064: public class GeometryArrayStripifier extends Object {
065:
066: public static void stripify(javax.media.j3d.Node[] treeRoots) {
067: StripifyProcessor processor = new StripifyProcessor() {
068: private GeometryInfo geomInfo = new GeometryInfo(
069: GeometryInfo.TRIANGLE_ARRAY);
070: private Stripifier stripifier = new Stripifier();
071: private HashMap map = new HashMap(); // Mapping of original
072:
073: // TriangleArrays to new
074: // StripArrays
075:
076: public boolean stripifyGeometry(
077: javax.media.j3d.Shape3D shape) {
078: for (int i = 0; i < shape.numGeometries(); i++) {
079: if (shape.getGeometry(i) != null
080: && shape.getGeometry(i) instanceof GeometryArray) {
081:
082: GeometryArray geom = (GeometryArray) shape
083: .getGeometry(i);
084:
085: GeometryArray previousConvert = (GeometryArray) map
086: .get(geom);
087:
088: if (previousConvert != null) {
089: shape.setGeometry(previousConvert, i);
090: } else if (geom instanceof TriangleArray
091: || geom instanceof IndexedTriangleArray
092: || geom instanceof javax.media.j3d.IndexedTriangleStripArray
093: || geom instanceof javax.media.j3d.TriangleStripArray) {
094: GeometryInfoGenerator
095: .create(geomInfo, geom);
096: stripifier.stripify(geomInfo);
097: GeometryArray newGeom = geomInfo
098: .getGeometryArray();
099: shape.setGeometry(newGeom, i);
100: map.put(geom, newGeom);
101:
102: int[] capabilities = Capabilities
103: .getCapabilities(geom);
104: for (int c = 0; c < capabilities.length; c++)
105: newGeom.setCapability(capabilities[c]);
106: }
107: }
108: }
109: return true;
110: }
111: };
112:
113: for (int i = 0; i < treeRoots.length; i++)
114: scanTree(treeRoots[i], processor);
115: }
116:
117: /**
118: * Stripify all TriangleArray geometry in the scene graph
119: *
120: * @param treeRoot, root of Scene Graph
121: */
122: public static void stripify(javax.media.j3d.Node treeRoot) {
123: stripify(new javax.media.j3d.Node[] { treeRoot });
124: }
125:
126: private static void scanTree(javax.media.j3d.Node treeRoot,
127: StripifyProcessor processor) {
128: try {
129: TreeScan.findNode(treeRoot, javax.media.j3d.Shape3D.class,
130: processor, false, true);
131: } catch (Exception e) {
132: e.printStackTrace();
133: System.out
134: .println("ERROR GeometryArrayStripifier, SceneGraph contains Live or compiled nodes");
135: }
136: }
137:
138: }
|