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

📄 geometrydecompressorshape3d.java

📁 JAVA3D矩陈的相关类
💻 JAVA
字号:
/* * $RCSfile: GeometryDecompressorShape3D.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.6 $ * $Date: 2007/04/12 17:34:04 $ * $State: Exp $ */package javax.media.j3d;import javax.vecmath.* ;import java.util.* ;/** * This class implements a Shape3D backend for the abstract * GeometryDecompressor. */class GeometryDecompressorShape3D 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 ;    // List for accumulating the output of the decompressor and converting to    // GeometryArray representations.    private GeneralizedVertexList vlist ;    // Accumulates Shape3D objects constructed from decompressor output.    private ArrayList shapes ;    // Decompressor output state variables.    private Color4f curColor ;    private Vector3f curNormal ;    // Variables for gathering statistics.    private int origVertexCount ;    private int stripCount ;    private int vertexCount ;    private int triangleCount ;    private long startTime ;    private long endTime ;    // Triangle array type to construct.    private int triOutputType ;    // Types of triangle output available.    private static final int TRI_SET = 0 ;    private static final int TRI_STRIP_SET = 1 ;    private static final int TRI_STRIP_AND_FAN_SET = 2 ;    private static final int TRI_STRIP_AND_TRI_SET = 3 ;    // 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 ;    /**     * Decompress the given compressed geometry.      * @param cgr CompressedGeometryRetained object with compressed geometry     * @return an array of Shape3D with TriangleArray geometry if compressed     * data contains triangles; otherwise, Shape3D array containing PointArray     * or LineStripArray geometry     * @see CompressedGeometry     * @see GeometryDecompressor     */    Shape3D[] toTriangleArrays(CompressedGeometryRetained cgr) {	return decompress(cgr, TRI_SET) ;    }    /**     * Decompress the given compressed geometry.      * @param cgr CompressedGeometryRetained object with compressed geometry     * @return an array of Shape3D with TriangleStripArray geometry if     * compressed data contains triangles; otherwise, Shape3D array containing     * PointArray or LineStripArray geometry     * @see CompressedGeometry     * @see GeometryDecompressor     */    Shape3D[] toTriangleStripArrays(CompressedGeometryRetained cgr) {	return decompress(cgr, TRI_STRIP_SET) ;    }    /**     * Decompress the given compressed geometry.      * @param cgr CompressedGeometryRetained object with compressed geometry     * @return an array of Shape3D with TriangleStripArray and     * TriangleFanArray geometry if compressed data contains triangles;     * otherwise, Shape3D array containing PointArray or LineStripArray     * geometry     * @see CompressedGeometry     * @see GeometryDecompressor     */    Shape3D[] toStripAndFanArrays(CompressedGeometryRetained cgr) {	return decompress(cgr, TRI_STRIP_AND_FAN_SET) ;    }    /**     * Decompress the given compressed geometry.      * @param cgr CompressedGeometryRetained object with compressed geometry     * @return an array of Shape3D with TriangleStripArray and     * TriangleArray geometry if compressed data contains triangles;     * otherwise, Shape3D array containing PointArray or LineStripArray     * geometry     * @see CompressedGeometry     * @see GeometryDecompressor     */    Shape3D[] toStripAndTriangleArrays(CompressedGeometryRetained cgr) {	return decompress(cgr, TRI_STRIP_AND_TRI_SET) ;    }    /**     * Decompress the data contained in a CompressedGeometryRetained and     * return an array of Shape3D objects using the specified triangle output     * type.  The triangle output type is ignored if the compressed data     * contains points or lines.     */     private Shape3D[] decompress(CompressedGeometryRetained cgr,				 int triOutputType) {	if (! checkVersion(cgr.majorVersionNumber, cgr.minorVersionNumber)) {	    return null ;	}	vlist = null ;	curColor = null ;	curNormal = null ;	// Get descriptors for compressed data.	bufferDataType = cgr.bufferType ;	dataPresent = cgr.bufferContents ;	if (printInfo) beginPrint() ;	// Initialize the decompressor backend.	this.triOutputType = triOutputType ;	shapes = new ArrayList() ;	// Call the superclass decompress() method which calls the output	// methods of this subclass.  The results are stored in vlist.	super.decompress(cgr.offset, cgr.size, cgr.compressedGeometry) ;	// Convert the decompressor output to Shape3D objects.	addShape3D() ;	if (printInfo) endPrint() ;	// Return the fixed-length output array.	Shape3D shapeArray[] = new Shape3D[shapes.size()] ;	return (Shape3D[])shapes.toArray(shapeArray) ;    }    /**     * 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 (vlist != null)	    // Construct shapes using the current vertex format.	    addShape3D() ;			int vertexFormat = GeometryArray.COORDINATES ;	if (bundlingNorm)  vertexFormat |= GeometryArray.NORMALS ;	if (bundlingColor) vertexFormat |= GeometryArray.COLOR ;	if (doingAlpha)    vertexFormat |= GeometryArray.WITH_ALPHA ;	vlist = new GeneralizedVertexList(vertexFormat, FRONTFACE_CCW) ;    }    /**     * Add a new decompressed vertex to the current list.     */    void outputVertex(Point3f position, Vector3f normal,		      Color4f color, int vertexReplaceCode) {	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()) ;	}    }    /**     * Create a Shape3D using the current color for both the ambient and     * diffuse material colors, then start a new vertex list for the new     * color.  The outputColor() method is never called if colors are bundled     * with each vertex in the compressed buffer.     */    void outputColor(Color4f color) {	if (debug) System.err.println(" outputColor: " + color.toString()) ;	if (vlist.size() > 0) {	    // Construct Shape3D using the current color.	    addShape3D() ;	    // Start a new vertex list for the new color.	    vlist = new GeneralizedVertexList(vlist.vertexFormat,					      FRONTFACE_CCW) ;	}	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 needed since in     * Java 3D a normal is always associated with a vertex.  This method is     * never called if normals are bundled with each vertex in the compressed     * buffer.     */    void outputNormal(Vector3f normal) {	if (debug) System.err.println(" outputNormal: " + normal.toString()) ;	if ((vlist.vertexFormat & GeometryArray.NORMALS) == 0) {	    if (vlist.size() > 0)		// Construct Shape3D using the current vertex format.		addShape3D() ;			    // Start a new vertex list with the new format.	    vlist = new GeneralizedVertexList		(vlist.vertexFormat|GeometryArray.NORMALS, FRONTFACE_CCW) ;	}	if (curNormal == null) curNormal = new Vector3f() ;	curNormal.set(normal) ;    }    /**     * Create a Shape3D object of the desired type from the current vertex     * list.  Apply the current color, if non-null, as a Material attribute.     */    private void addShape3D() {	Material m = new Material() ;	if (curColor != null) {	    if ((vlist.vertexFormat & GeometryArray.WITH_ALPHA) == 0) {		m.setAmbientColor(curColor.x, curColor.y, curColor.z) ;		m.setDiffuseColor(curColor.x, curColor.y, curColor.z) ;	    }	    else {		m.setAmbientColor(curColor.x, curColor.y, curColor.z) ;		m.setDiffuseColor(curColor.x, curColor.y, curColor.z,				  curColor.w) ;	    }	}	if ((vlist.vertexFormat & GeometryArray.NORMALS) == 0)	    m.setLightingEnable(false) ;	else	    m.setLightingEnable(true) ;	Appearance a = new Appearance() ;	a.setMaterial(m) ;	switch(bufferDataType) {	  case TYPE_TRIANGLE:	    switch(triOutputType) {	      case TRI_SET:		TriangleArray ta = vlist.toTriangleArray() ;		if (ta != null)		    shapes.add(new Shape3D(ta, a)) ;		break ;	      case TRI_STRIP_SET:		TriangleStripArray tsa = vlist.toTriangleStripArray() ;		if (tsa != null)		    shapes.add(new Shape3D(tsa, a)) ;		break ;	      case TRI_STRIP_AND_FAN_SET:		GeometryStripArray gsa[] = vlist.toStripAndFanArrays() ;		if (gsa[0] != null)		    shapes.add(new Shape3D(gsa[0], a)) ;		if (gsa[1] != null)		    shapes.add(new Shape3D(gsa[1], a)) ;		break ;	      case TRI_STRIP_AND_TRI_SET:		GeometryArray ga[] = vlist.toStripAndTriangleArrays() ;		if (ga[0] != null)		    shapes.add(new Shape3D(ga[0], a)) ;		if (ga[1] != null)		    shapes.add(new Shape3D(ga[1], a)) ;		break ;	      default:		throw new IllegalArgumentException		    (J3dI18N.getString("GeometryDecompressorShape3D0")) ;	    } 	    break ;	  case TYPE_LINE:	    LineStripArray lsa = vlist.toLineStripArray() ;	    if (lsa != null)		shapes.add(new Shape3D(lsa, a)) ;	    break ;	  case TYPE_POINT:	    PointArray pa = vlist.toPointArray() ;	    if (pa != null)		shapes.add(new Shape3D(pa, a)) ;	    break ;	  default:	    throw new IllegalArgumentException		(J3dI18N.getString("GeometryDecompressorShape3D1")) ;	}	if (benchmark  || statistics) {	    origVertexCount += vlist.size() ;	    vertexCount += vlist.vertexCount ;	    stripCount += vlist.stripCount ;	    triangleCount += vlist.triangleCount ;	}    }    private void beginPrint() {	System.err.println("\nGeometryDecompressorShape3D") ;	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("GeometryDecompressorShape3D1")) ;	}	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() ;	stripCount = 0 ;	vertexCount = 0 ;	triangleCount = 0 ;	origVertexCount = 0 ;	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 ;	System.err.println	    (" decompression + strip conversion took " + t + " sec.") ;	switch(bufferDataType) {  	  case TYPE_POINT:	    System.err.println		(" points decompressed: " + vertexCount + "\n" +		 " net decompression rate: " + (vertexCount/t) +		 " points/sec.\n") ;	    break ;	  case TYPE_LINE:	    System.err.println		(" lines decompressed: " + (vertexCount - stripCount) + "\n" +		 " net decompression rate: " + ((vertexCount - stripCount)/t) +		 " lines/sec.\n") ;	    break ;	  case TYPE_TRIANGLE:	    System.err.println		(" triangles decompressed: " +		   (vertexCount - 2*stripCount) + "\n" +		 " net decompression rate: " +		   ((vertexCount - 2*stripCount)/t) + " triangles/sec.\n") ;	    break ;	}    }    private void printStats() {	switch(triOutputType) {	  case TRI_SET:	    System.err.println(" using individual triangle output") ;	    break ;	  case TRI_STRIP_SET:	    System.err.println(" using strip output") ;	    break ;	  case TRI_STRIP_AND_FAN_SET:	    System.err.println(" using strips and fans for output") ;	    break ;	  case TRI_STRIP_AND_TRI_SET:	    System.err.println(" using strips and triangles for output") ;	    break ;	}	System.err.print	    (" number of Shape3D objects: " + shapes.size() +	     "\n number of Shape3D decompressed vertices: ") ;	if (triOutputType == TRI_SET || bufferDataType == TYPE_POINT) {	    System.err.println(vertexCount) ;	}	else if (triOutputType == TRI_STRIP_AND_TRI_SET) {	    System.err.println((vertexCount + triangleCount*3) + 			       "\n number of strips: " + stripCount +			       "\n number of individual triangles: " +			       triangleCount) ;	    if (stripCount > 0) 		System.err.println		    (" vertices/strip: " + (float)vertexCount/stripCount +		     "\n triangles represented in strips: " +		     (vertexCount - 2*stripCount)) ;	}	else {	    System.err.println(vertexCount +			       "\n number of strips: " + stripCount) ;	    if (stripCount > 0) 		System.err.println		    (" vertices/strip: " + (float)vertexCount/stripCount) ;	}	System.err.print(" vertex data present in last Shape3D: 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() ;    }}

⌨️ 快捷键说明

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