⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compilestate.java

📁 JAVA3D矩陈的相关类
💻 JAVA
字号:
/* * $RCSfile: CompileState.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.5 $ * $Date: 2007/04/12 17:34:04 $ * $State: Exp $ */package javax.media.j3d;import java.util.*;import java.security.*;/** * The CompileState holds information used during a compile.  It is * passed to each SceneGraphObject (SGO) during the compile.  Each SGO * modifies the CompileState as necessary and passes the CompileState * to its children (if any). * * The CompileState currently has two functions: appearance mapping * and shape merging. * * Appearance mapping maintains a list of the unique appearances seen * during the compile.  getAppearance() is used to turn multiple, * equivalent and static appearances into a single shared appearance. * * The shape mergings collects shapes that are potentially mergable * during a compile.  The shapes are sorted into a Map of Lists of * shapes, using the shape's appearance as the key.  After a subtree * is traversed, the shapes are merged and added to the Group. */class CompileState {    // Appearance mapping stuff:    HashMap knownAppearances = new HashMap();    int	    numAppearances = 0;    int	    numShared = 0;    int numShapes = 0;    // Shape merging stuff:    HashMap shapeLists = null; // top entry in shapeListStack    int	numMergeSets = 0;    int	numMergeShapes = 0;    boolean compileVerbose = false;    static final int BOUNDS_READ		= 0x00001;    static final int GEOMETRY_READ		= 0x00002;        // scene graph flattening    boolean keepTG = false;	// used to force the immediate transform				// group to stay around    boolean needNormalsTransform = false;  // true if the current transform 		 			   // needs to push down normals					   // transform to geometries				 				// the current static transform group    TransformGroupRetained staticTransform = null;    				// parent group    GroupRetained parentGroup = null;				// list of transform group				// for the current transform group    ArrayList transformGroupChildrenList = null; 				// list of objects that have a static				// transform that can be deferenced				// after compile    ArrayList staticTransformObjects = new ArrayList(1);    int numTransformGroups = 0;    int numStaticTransformGroups = 0;    int numMergedTransformGroups = 0;    int numGroups = 0;    int numMergedGroups = 0;    int numShapesWSharedGeom = 0;    int numShapesWStaticTG = 0;    int numLinks = 0;    int numSwitches = 0;    int numOrderedGroups = 0;    int numMorphs = 0;    CompileState() {	try {	    compileVerbose = Boolean.getBoolean("javax.media.j3d.compileVerbose");	} catch (AccessControlException e) {	    compileVerbose = false;	}	initShapeMerge();    }     // Appearance mapping:    /**     * Returns an unique appearance which equals app.  If appearance does not     * equal any previously found, the appearance will be added to the known     * appearances and be returned.  If the apperance equals a previously known     * appearance, then the prevously known apperance will be returned     */    AppearanceRetained getAppearance(AppearanceRetained app) {        AppearanceRetained retval;        // see if the appearance has allready been classified        if (app.map == this) {            if (app.mapAppearance != null) {                numShared++;                return app.mapAppearance;            }        }        // check if this appearance equals one one in the Map        if ((retval = (AppearanceRetained)knownAppearances.get(app)) != null) {            numShared++;        } else {             // not found, put this appearance in the map             knownAppearances.put(app, app);             numAppearances++;	     numShared++; // sharing with self...             retval = app;        }        // cache this result on the appearance in case it appears again        app.map = this;        app.mapAppearance = retval;        return retval;    }    // Shape Merging:    private void initShapeMerge() {	shapeLists = new HashMap();    }    void addShape(Shape3DRetained shape) {	if (parentGroup != null) {	    // sort the shapes into lists with equivalent appearances	    Vector list;	    if ((list = (Vector)shapeLists.get(shape.appearance)) == null) {		list = new Vector();		shapeLists.put(shape.appearance, list);	    }	    // Add the shape to the list only if at its parent level	    // no children can be added or removed ..	    // Look for the first non-null geometry, there should be atleast	    // one otherwise it wouldn't come here	    GeometryRetained geometry = null;	    int i = 0;	    while (geometry == null && i < shape.geometryList.size()) {		geometry = (GeometryRetained) shape.geometryList.get(i);		i++;	    }	    	    if (shape.parent instanceof GroupRetained && ((GroupRetained)shape.parent).isStaticChildren() && geometry.geoType < GeometryArrayRetained.GEO_TYPE_RASTER) {		list.add(shape);	    }	}    }    void printStats() {	System.err.println("numTransformGroups= " + numTransformGroups);	System.err.println("numStaticTransformGroups= " + numStaticTransformGroups);	System.err.println("numMergedTransformGroups= " + numMergedTransformGroups);	System.err.println("numGroups= " + numGroups);	System.err.println("numMergedGroups= " + numMergedGroups);	System.err.println("numShapes= " + numShapes);	System.err.println("numShapesWStaticTG= " + numShapesWStaticTG);	System.err.println("numMergeShapes= " + numMergeShapes);	System.err.println("numMergeSets= " + numMergeSets);	System.err.println("numLinks= " + numLinks);	System.err.println("numSwitches= " + numSwitches);	System.err.println("numOrderedGroups= " + numOrderedGroups);	System.err.println("numMorphs= " + numMorphs);    }    void doShapeMerge() {	//	System.err.println("doShapeMerge, shapeList = "+shapeLists);	if (shapeLists != null) {	    // loop over the shapes in each list, creating a single shape 	    // for each.  Add the shape to the group 	    Collection lists = shapeLists.values();	    Iterator listIterator = lists.iterator();	    Shape3DRetained mergeShape;	    GeometryRetained firstGeo;	    int num = 0;	    int compileFlags = 0;	    	    while (listIterator.hasNext()) {		Vector curList = (Vector)listIterator.next();		int numShapes = curList.size();		Shape3DRetained[] shapes = new Shape3DRetained[numShapes];		curList.copyInto(shapes);		Shape3DRetained[] toBeMergedShapes = new Shape3DRetained[numShapes];		for (int i = 0; i < numShapes; i++) {		    if (shapes[i] == null) {			continue;		    }		    firstGeo = null;		    num = 0;		    // Get the first non-null geometry		    while (firstGeo == null && num < shapes[i].geometryList.size()) {			firstGeo = (GeometryRetained) shapes[i].geometryList.get(num);			num++;		    }		    if (firstGeo != null && firstGeo instanceof GeometryArrayRetained) {			int numMerge = 0;			mergeShape = shapes[i];			GeometryArrayRetained mergeGeo = (GeometryArrayRetained)firstGeo;						toBeMergedShapes[numMerge++] = mergeShape;			// Determine if all mergeable shapes have the same boundsCompute			// and collisionBounds set the same way			compileFlags = getCompileFlags(mergeShape);			for (int j = i+1; j < numShapes; j++) {			    if (shapes[j] == null) {				continue;			    }			    firstGeo = null;			    num = 0;			    // Get the first non-null geometry			    while (firstGeo == null && num < shapes[j].geometryList.size()) {				firstGeo = (GeometryRetained) shapes[j].geometryList.get(num);				num++;			    }			    // There is a non-null geometry for this shape ..			    if (firstGeo != null &&				shapes[j].isEquivalent(mergeShape) &&				firstGeo.isEquivalenceClass(mergeGeo) &&				((GeometryArrayRetained)firstGeo).vertexFormat == mergeGeo.vertexFormat) {				    // got one to merge, add shapes to merge, 				    toBeMergedShapes[numMerge++] = shapes[j];				    compileFlags |= getCompileFlags(shapes[j]);				    				    // remove from shapes				    shapes[j] = null;			    }			}			if (numMerge > 1) {			    // remove the shapes from its parent before merge			    // They all should			    GroupRetained group = (GroupRetained)toBeMergedShapes[0].parent;			    Shape3DRetained s;			    for (int n = 0; n < numMerge; n++) {				s = toBeMergedShapes[n];				boolean found = false;				int numChilds = group.numChildren();				for (int k = 0; (k < numChilds && !found); k++) {				    if (group.getChild(k).retained == s) {					found = true;					group.removeChild(k);				    }				}				if (!found) {				    System.err.println("ShapeSet.add(): Can't remove " +						       "shape from parent, can't find shape!");				}				    							    }							    mergeShape = new Shape3DCompileRetained(toBeMergedShapes, numMerge, compileFlags);			    if (J3dDebug.devPhase && J3dDebug.debug) {				if (J3dDebug.doDebug(J3dDebug.compileState, J3dDebug.LEVEL_3)) {				    System.err.println("Dest is "+ parentGroup);				    System.err.println("Compile Shape "+mergeShape);				    System.err.println(mergeShape.geometryList.size()+" geoemtryList");				    for (int j = 0; j < mergeShape.geometryList.size(); j++) {					GeometryRetained geo = ((GeometryRetained)mergeShape.geometryList.get(j));					if (geo != null)					    System.err.println("\t Geo_type = "+geo.geoType);				    }				    System.err.println(numMerge+" Shapes were merged ");				    for (int j = 0; j < numMerge; j++) {					System.err.println("\t" + toBeMergedShapes[j]);				    }				}			    }			    // Set the source to one of the merged shape's source			    mergeShape.setSource(toBeMergedShapes[0].source);			    numMergeSets++;			    numMergeShapes += numMerge ;			    parentGroup.addChild((Node)mergeShape.source);			}		    }		    // add the shape to the dest		}	    }	}	// Clear the shapelists for the next merge	shapeLists.clear();    }    int getCompileFlags(Shape3DRetained shape) {	int cflag = 0;	// If allow intersect is turned on , then geometry is readable	if (shape.allowIntersect() ||	    shape.source.getCapability(Shape3D.ALLOW_GEOMETRY_READ)||	    (shape.boundsAutoCompute &&	     shape.source.getCapability(Shape3D.ALLOW_BOUNDS_READ)))	    cflag |= GEOMETRY_READ; 	return cflag;			    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -