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

📄 geometrydecompressorretained.java

📁 JAVA3D矩陈的相关类
💻 JAVA
字号:
/* * $RCSfile: GeometryDecompressorRetained.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.7 $ * $Date: 2007/04/12 17:34:04 $ * $State: Exp $ */package javax.media.j3d;import javax.vecmath.* ;import java.util.* ;/** * This class implements a retained geometry backend for the abstract * GeometryDecompressor. */class GeometryDecompressorRetained extends GeometryDecompressor {    private static final boolean debug = false ;    private static final boolean benchmark = false ;    private static final boolean statistics = false ;    private static final boolean printInfo = debug || benchmark || statistics ;    // Type of connections in the compressed data:    // TYPE_POINT (1), TYPE_LINE (2), or TYPE_TRIANGLE (4).    private int bufferDataType ;    // Data bundled with each vertex: bitwise combination of    // NORMAL_IN_BUFFER (1), COLOR_IN_BUFFER (2), ALPHA_IN_BUFFER (4).    private int dataPresent ;    // Size of the compressed geometry in bytes.    private int size ;    // Decompressor output state variables.    private Color4f curColor ;    private Vector3f curNormal ;    // List for accumulating the output of the decompressor and converting to    // GeometryArray representations.    private GeneralizedVertexList vlist ;    // Geometric bounds.    private Point3d lbounds = new Point3d() ;    private Point3d ubounds = new Point3d() ;    // Decompression output constraints.  The decompressor will still process    // all data contained in the compressed buffer, but will only retain data    // for output subject to these booleans.    private boolean boundsOnly = false ;    private boolean positionsOnly = false ;    // A very rough gauge used to initialize the size of vlist, based on    // normal-per-vertex data collected from the HelloUniverse.cg file    // (seagull, '57 Chevy, dinosaur).    //    // XXXX: get fudge values for other vertex combinations    private static final float bytesPerVertexFudge = 5.3f ;    // Used for benchmarking if so configured.    private long startTime ;    private long endTime ;    // Private convenience copies of various constants.    private static final int TYPE_POINT = 	CompressedGeometryRetained.TYPE_POINT ;    private static final int TYPE_LINE = 	CompressedGeometryRetained.TYPE_LINE ;    private static final int TYPE_TRIANGLE = 	CompressedGeometryRetained.TYPE_TRIANGLE ;    private static final int FRONTFACE_CCW = 	GeneralizedStripFlags.FRONTFACE_CCW ;    /**     * If the given argument is true, sets the decompressor to output only the     * bounding box of the decompressed geometry.     * @param boundsOnly set to true if the decompressor should output only the     * geometric bounding box.     */    void setDecompressBoundsOnly(boolean boundsOnly) {	this.boundsOnly = boundsOnly ;	if (boundsOnly) this.positionsOnly = false ;    }    /**     * If the given argument is true, sets the decompressor to output only the      * decompressed positions, their connections, and the bounding box.     * @param positionsOnly set to true if the decompressor should output only     * position, connection, and bounding box data.     */    void setDecompressPositionsOnly(boolean positionsOnly) {	this.positionsOnly = positionsOnly ;	if (positionsOnly) this.boundsOnly = false ;    }    /**     * Decompress the geometry data in a CompressedGeometryRetained.  The     * GeometryArray output is intended to be cached as retained data for     * efficient rendering.  Global color and normal changes output by the     * decompressor are stored as redundant per-vertex data so that a single     * GeometryArray can be used.     *      * Since only one GeometryArray is created, if the bundling attributes     * change while building the vertex list then the decompression is     * aborted.  There should be only one SetState bundling attribute command     * per CompressedGeometry.     *      * @param cgr CompressedGeometryRetained containing compressed geometry     * @return GeometryArrayRetained containing the results of the     * decompression, or null if only the bounds are computed.     */    GeometryRetained decompress(CompressedGeometryRetained cgr) {	if (! checkVersion(cgr.majorVersionNumber, cgr.minorVersionNumber)) {	    return null ;	}	vlist = null ;	curColor = null ;	curNormal = null ;	lbounds.set( 1.0, 1.0, 1.0) ;	ubounds.set(-1.0,-1.0,-1.0) ;	// Get the descriptors for the compressed data.	bufferDataType = cgr.bufferType ;	dataPresent = cgr.bufferContents ;	if (printInfo) beginPrint() ;	// Call the superclass decompress() method which calls the output	// methods of this subclass.  The results are stored in vlist.	size = cgr.size ;	super.decompress(cgr.offset, size, cgr.compressedGeometry) ;	if (boundsOnly) {	    if (printInfo) endPrint() ;	    return null ;	} 	// Convert the output to a GeometryRetained.	GeometryArray ga ;	switch(bufferDataType) {	  case TYPE_TRIANGLE:	    ga = vlist.toTriangleStripArray() ;	    break ;	  case TYPE_LINE:	    ga = vlist.toLineStripArray() ;	    break ;	  case TYPE_POINT:	    ga = vlist.toPointArray() ;	    break ;	  default:	    throw new IllegalArgumentException		(J3dI18N.getString("GeometryDecompressorRetained0")) ;	}	// Release the reference to the non-retained data.	ga.retained.setSource(null) ;	if (printInfo) endPrint() ;	return (GeometryRetained)ga.retained ;    }    /**     * Get the bounds of the decompressed geometry.      * @param bb BoundingBox to receive bounds     */    void getBoundingBox(BoundingBox bb) {	bb.setLower(lbounds) ;	bb.setUpper(ubounds) ;    }    /**     * Initialize the vertex output list based on the vertex format provided     * by the SetState decompression command.     */    void outputVertexFormat(boolean bundlingNorm, boolean bundlingColor,			    boolean doingAlpha) {	if (boundsOnly) return ;	if (vlist != null)	    throw new IllegalStateException		(J3dI18N.getString("GeometryDecompressorRetained1")) ;	int vertexFormat = GeometryArray.COORDINATES ;	if (! positionsOnly) {	    if (bundlingNorm)  vertexFormat |= GeometryArray.NORMALS ;	    if (bundlingColor) vertexFormat |= GeometryArray.COLOR ;	    if (doingAlpha)    vertexFormat |= GeometryArray.WITH_ALPHA ;	}	vlist = new GeneralizedVertexList(vertexFormat, FRONTFACE_CCW,					  (int)(size/bytesPerVertexFudge)) ;    }    /**     * Process a decompressed vertex.     */    void outputVertex(Point3f position, Vector3f normal,		      Color4f color, int vertexReplaceCode) {	if (position.x < lbounds.x) lbounds.x = position.x ;	if (position.y < lbounds.y) lbounds.y = position.y ;	if (position.z < lbounds.z) lbounds.z = position.z ;	if (position.x > ubounds.x) ubounds.x = position.x ;	if (position.y > ubounds.y) ubounds.y = position.y ;	if (position.z > ubounds.z) ubounds.z = position.z ;	if (boundsOnly) return ;	if (curColor != null) color = curColor ;	if (curNormal != null) normal = curNormal ;	vlist.addVertex(position, normal, color, vertexReplaceCode) ;	if (debug) {	    System.err.println("outputVertex: flag " + vertexReplaceCode) ;	    System.err.println(" position " + position.toString()) ;	    if (normal != null)		System.err.println(" normal " + normal.toString()) ;	    if (color != null)		System.err.println(" color " + color.toString()) ;	}    }    /**     * Any global colors output by the decompressor are stored as per-vertex     * color in the retained data used internally by the renderer.  This is     * done for performance and simplicity reasons, at the expense of     * replicating colors.     *     * The next method sets the current color that will be copied to each     * succeeding vertex.  The outputColor() method is never called if     * colors are bundled with each vertex in the compressed buffer.     */    void outputColor(Color4f color) {	if (boundsOnly || positionsOnly) return ;	if (debug) System.err.println("outputColor: " + color.toString()) ;	if ((vlist.vertexFormat & GeometryArray.COLOR) == 0) {	    if (vlist.size() > 0)		throw new IllegalStateException		    (J3dI18N.getString("GeometryDecompressorRetained2")) ;			    vlist.setVertexFormat(vlist.vertexFormat | GeometryArray.COLOR) ;	}	if (curColor == null) curColor = new Color4f() ;	curColor.set(color) ;    }    /**     * Set the current normal that will be copied to each succeeding vertex     * output by the decompressor.  The per-vertex copy is always needed since     * in Java 3D a normal is always associated with a vertex.  This is never     * called if normals are bundled with each vertex in the compressed     * buffer.     */    void outputNormal(Vector3f normal) {	if (boundsOnly || positionsOnly) return ;	if (debug) System.err.println("outputNormal: " + normal.toString()) ;	if ((vlist.vertexFormat & GeometryArray.NORMALS) == 0) {	    if (vlist.size() > 0)		throw new IllegalStateException		    (J3dI18N.getString("GeometryDecompressorRetained3")) ;			    vlist.setVertexFormat(vlist.vertexFormat | GeometryArray.NORMALS) ;	}	if (curNormal == null) curNormal = new Vector3f() ;	curNormal.set(normal) ;    }    private void beginPrint() {	System.err.println("\nGeometryDecompressorRetained") ;	switch(bufferDataType) {	  case TYPE_TRIANGLE:	    System.err.println(" buffer TYPE_TRIANGLE") ; 	    break ;	  case TYPE_LINE:	    System.err.println(" buffer TYPE_LINE") ;	    break ;	  case TYPE_POINT:	    System.err.println(" buffer TYPE_POINT") ;	    break ;	  default:	    throw new IllegalArgumentException		(J3dI18N.getString("GeometryDecompressorRetained4")) ;	}	System.err.print(" buffer data present: coords") ;	if ((dataPresent & CompressedGeometryHeader.NORMAL_IN_BUFFER) != 0)	    System.err.print(" normals") ;	if ((dataPresent & CompressedGeometryHeader.COLOR_IN_BUFFER) != 0)	    System.err.print(" colors") ;	if ((dataPresent & CompressedGeometryHeader.ALPHA_IN_BUFFER) != 0)	    System.err.print(" alpha") ;	System.err.println() ;	if (boundsOnly) System.err.println(" computing bounds only") ;	if (positionsOnly) System.err.println(" computing positions only") ;	startTime = J3dClock.currentTimeMillis() ;    }    private void endPrint() {	endTime = J3dClock.currentTimeMillis() ;	if (benchmark || statistics)	    printBench() ;	     	if (statistics)	    printStats() ;    }    private void printBench() {	float t = (endTime - startTime) / 1000.0f ;	if (boundsOnly) {	    System.err.println(" decompression took " + t + " sec.\n") ;	    return ;	}	System.err.println	    (" decompression + strip conversion took " + t + " sec.") ;	switch(bufferDataType) {  	  case TYPE_POINT:	    System.err.println		(" decompressed " + (vlist.size()) +		 " points at " + (vlist.size()/t) +		 " points/sec.\n") ;	    break ;	  case TYPE_LINE:	    System.err.println		(" decompressed " + (vlist.vertexCount - vlist.stripCount) +		 " lines at " + ((vlist.vertexCount - vlist.stripCount)/t) +		 " lines/sec.\n") ;	    break ;	  case TYPE_TRIANGLE:	      System.err.println		  (" decompressed " +		   (vlist.vertexCount - 2*vlist.stripCount) +		   " triangles at " +		   ((vlist.vertexCount - 2*vlist.stripCount)/t) + 		   " triangles/sec.\n") ;	    break ;	}    }    private void printStats() {	System.err.println(" bounding box:\n  lower " + lbounds.toString() +			   "\n  upper " + ubounds.toString()) ;	if (boundsOnly) return ;	System.err.print	    (" number of vertices in GeometryArray output: " +	     vlist.vertexCount + "\n" +	     " GeometryArray vertex data present: coords") ;	if ((vlist.vertexFormat & GeometryArray.NORMALS) != 0)	    System.err.print(" normals") ;	if ((vlist.vertexFormat & GeometryArray.COLOR) != 0)	    System.err.print(" colors") ;	if ((vlist.vertexFormat & GeometryArray.WITH_ALPHA) != 0)	    System.err.print(" alpha") ;	System.err.println("\n number of strips: " + vlist.stripCount) ;	if (vlist.stripCount > 0) 	    System.err.println		(" vertices/strip: " +		 ((float)vlist.vertexCount / (float)vlist.stripCount)) ;    }}

⌨️ 快捷键说明

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