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

📄 geometryatom.java

📁 JAVA3D矩陈的相关类
💻 JAVA
字号:
/* * $RCSfile: GeometryAtom.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 java.util.ArrayList;import javax.vecmath.*;/** * A GeometryAtom is the smallest object representing Geometry. */class GeometryAtom extends Object implements BHLeafInterface, NnuId {        /**     * Array of geometry components of this geometry atom     */    // The first index of geometryArr should always be 0, unless geometryArr contains    // multiple Text3Ds.    GeometryRetained[] geometryArray = null;        /**     * Array of transforms used only for Text3d.     */    Transform3D[] lastLocalTransformArray = null;    /**      * The locale that this geometry atom is attatched to.  This is only non-null     * if this instance is directly linked into a locale.     */    Locale locale = null;    /**     * The mirror Shape3DRetained for this GeometryAtom.     */    Shape3DRetained source = null;      /**     * The BHLeafNode for this GeometryAtom.     */    BHLeafNode bhLeafNode = null;        // true if alpha channel is editable    boolean alphaEditable;        // true if this ga is visible. Default is true.    boolean visible = true;        /**     * This is the original geometry type from which this atom came     */    int geoType = -1;    /**     * The list of RenderAtoms for this GeometryAtom     */    RenderAtom[] renderAtoms = new RenderAtom[0];    // Id use for quick search.    int nnuId;    Point3d[] centroid = null;    boolean centroidIsDirty = true;    Object lockObj = new Object();    GeometryAtom() {	// Get a not necessary unique Id.	nnuId = NnuIdManager.getId();    }    public int getId() {	return nnuId;    }    public int equal(NnuId obj) {	int keyId = obj.getId();	if(nnuId < keyId) {	    return -1;	}	else if(nnuId > keyId) {	    return 1;	}	else { // Found it!	    return 0;	}    }        public BoundingBox computeBoundingHull() {	/*	  System.err.println("Bounds is " + source.vwcBounds); 	  for(int i=0; i<geometryArray.length; i++) {	  System.err.println( i + " geoBounds " +	  geometryArray[i].geoBounds);	  }	  */		return source.vwcBounds;    }    // This method is use by picking and collision queries.    public boolean isEnable() {	return ((source.vwcBounds != null) && 		(source.vwcBounds.isEmpty() == false) &&		(source.switchState.currentSwitchOn));    }    // This method is use by visibility query.    public boolean isEnable(int vis) {	if((source.vwcBounds != null) && (source.vwcBounds.isEmpty() == false) &&	   (source.switchState.currentSwitchOn)) {	    switch(vis) {	    case View.VISIBILITY_DRAW_VISIBLE:		return visible;	    case View.VISIBILITY_DRAW_INVISIBLE:		return (!visible);	    case View.VISIBILITY_DRAW_ALL:		return true;	    }	}	return false;    }    public Locale getLocale2() {	return locale;    }        /**     * Gets a RenderAtom for the given viewIndex.     * If it doesn't exist, it creates one.     */    RenderAtom getRenderAtom(View view) {	RenderAtom ra;	int index;	// If renderAtom is not scoped to this view, don't even	// bother creating the renderAtom	synchronized (renderAtoms) {	    index = view.viewIndex;	    if (index >= renderAtoms.length) {		// If creating a new RenderAtom, but this ga is not scoped		// to this view, then just return ..		if (source.viewList != null &&		    !source.viewList.contains(view))		    return null;		RenderAtom[] newList = new RenderAtom[index+1];		for (int i = 0; i < renderAtoms.length; i++) {		    newList[i] = renderAtoms[i];		}		ra = new RenderAtom();		newList[index] = ra;		newList[index].geometryAtom = this;				// Allocate space based on number of geometry in the list		ra.rListInfo = new RenderAtomListInfo[geometryArray.length];		if (geoType != GeometryRetained.GEO_TYPE_TEXT3D) {		    for (int j = 0; j < ra.rListInfo.length; j++) {			ra.rListInfo[j] = new RenderAtomListInfo();			ra.rListInfo[j].renderAtom = ra;			ra.rListInfo[j].index = j;		    }		}		else {		    for (int j = 0; j < ra.rListInfo.length; j++) {			ra.rListInfo[j] = new RenderAtomListInfo();			ra.rListInfo[j].renderAtom = ra;			ra.rListInfo[j].index = j;			ra.rListInfo[j].localToVworld = new Transform3D();		    }		}		// Note this must be the last line in synchronized.		// Otherwise the lock is changed to newList and		// another thread can come in modified. This cause		// NullPointerException in		// renderAtoms[index].geometryAtom = this;		// which I encounter.		renderAtoms = newList;	    } else {		if (renderAtoms[index] == null) {		    // If creating a new RenderAtom, but this ga is not scoped		    // to this view, then just return ..		    if (source.viewList != null &&			!source.viewList.contains(view))			return null;		    ra = new RenderAtom();		    renderAtoms[index] = ra;		    renderAtoms[index].geometryAtom = this;		    // Allocate space based on number of geometry in the list		    ra.rListInfo = new RenderAtomListInfo[geometryArray.length];		    if (geoType != GeometryRetained.GEO_TYPE_TEXT3D) {			for (int j = 0; j < ra.rListInfo.length; j++) {			    ra.rListInfo[j] = new RenderAtomListInfo();			    ra.rListInfo[j].renderAtom = ra;			    ra.rListInfo[j].index = j;			}		    }		    else {			for (int j = 0; j < ra.rListInfo.length; j++) {			    ra.rListInfo[j] = new RenderAtomListInfo();			    ra.rListInfo[j].renderAtom = ra;			    ra.rListInfo[j].index = j;			    ra.rListInfo[j].localToVworld = new Transform3D();			}		    }		}	    }	}	    	return (renderAtoms[index]);    }    // If the renderAtom is transparent, then make sure that the    // value is up-to-date    void updateCentroid() {	// New for 1.3.2	// If the sortShape3DBounds flag is set, the bounds of the	// Shape3D node will be used in place of the computed	// GeometryArray bounds for transparency sorting for those	// Shape3D nodes whose boundsAutoCompute attribute is set to	// false.	if (VirtualUniverse.mc.sortShape3DBounds &&	    !source.boundsAutoCompute) {	    synchronized(lockObj) {		if (centroid == null) {		    centroid = new Point3d[geometryArray.length];		    for (int j = 0; j < centroid.length; j++) {			centroid[j] = new Point3d(source.localBounds.getCenter());			source.getCurrentLocalToVworld(0).transform(centroid[j]);		    }                }		else {		    for (int j = 0; j < centroid.length; j++) {			centroid[j].set(source.localBounds.getCenter());			source.getCurrentLocalToVworld(0).transform(centroid[j]);		    }		}	    }	    return;	}	// End of new for 1.3.2		synchronized(lockObj) {	    for (int j = 0; j < geometryArray.length; j++) {		if (geometryArray[j] == null)		    continue;		synchronized(geometryArray[j].centroid) {		    if (geometryArray[j].recompCentroid) {			geometryArray[j].computeCentroid();			geometryArray[j].recompCentroid = false;		    }		}	    }	    if (centroidIsDirty) {		if (centroid == null) {		    centroid = new Point3d[geometryArray.length];		    for (int j = 0; j < centroid.length; j++) {			if (geometryArray[j] == null)			    continue;			centroid[j] = new Point3d(geometryArray[j].centroid);			source.getCurrentLocalToVworld(0).transform(centroid[j]);		    }		}		else {		    for (int j = 0; j < centroid.length; j++) {			if (geometryArray[j] == null)			    continue;			centroid[j].set(geometryArray[j].centroid);			source.getCurrentLocalToVworld(0).transform(centroid[j]);		    }		}		centroidIsDirty = false;	    }	}    }}

⌨️ 快捷键说明

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