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

📄 linkretained.java

📁 JAVA3D矩陈的相关类
💻 JAVA
字号:
/* * $RCSfile: LinkRetained.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.5 $ * $Date: 2007/02/09 17:18:09 $ * $State: Exp $ */package javax.media.j3d;import java.util.*;/** * A Link leaf node consisting of a reference to a SharedGroup node. */class LinkRetained extends LeafRetained {    /**     * The SharedGroup component of the link node.     */    SharedGroupRetained sharedGroup;        static String plus = "+";    // This is used when setLive to check for cycle scene graph    boolean visited = false;    LinkRetained() {	this.nodeType = NodeRetained.LINK;	localBounds = new BoundingBox();	((BoundingBox)localBounds).setLower( 1.0, 1.0, 1.0);	((BoundingBox)localBounds).setUpper(-1.0,-1.0,-1.0);    }        /**     * Sets the SharedGroup reference.     * @param sharedGroup the SharedGroup node     */    void setSharedGroup(SharedGroup sharedGroup) {	// Note that it is possible that the sharedGroup pass	// in already link to another link and live.	HashKey newKeys[] = null;	boolean abort = false;		if (source.isLive()) {	    // bug 4370407: if sharedGroup is a parent, then don't do anything	    if (sharedGroup != null) {	        synchronized(universe.sceneGraphLock) {	            NodeRetained pa;	            for (pa = parent; pa != null; pa = pa.parent) {	                if (pa == (NodeRetained)sharedGroup.retained) {			    abort = true;                            throw new SceneGraphCycleException(J3dI18N.getString("LinkRetained1"));	                }	            }	        }	        if (abort) 		    return;	    }		    newKeys = getNewKeys(locale.nodeId, localToVworldKeys);	    	    if (this.sharedGroup != null) {		((GroupRetained) parent).checkClearLive(this.sharedGroup,							newKeys, true, null,							0, 0, this); 		this.sharedGroup.parents.removeElement(this);	    } 	}		if (sharedGroup != null) {	    this.sharedGroup =		(SharedGroupRetained)sharedGroup.retained;	}  else {	    this.sharedGroup = null;	}	      if (source.isLive() && (sharedGroup != null)) {	  this.sharedGroup.parents.addElement(this);	  visited = true;	  try {	      int ci = ((GroupRetained) parent).indexOfChild((Node)this.sharedGroup.source);	      ((GroupRetained) parent).checkSetLive(this.sharedGroup,  ci,						    newKeys, true, null,						    0, this); 	  } catch (SceneGraphCycleException e) {	      throw e;          } finally {	      visited = false;	  }      }          }      /**   * Retrieves the SharedGroup reference.   * @return the SharedGroup node   */    SharedGroup getSharedGroup() {	return (sharedGroup != null ?		(SharedGroup)this.sharedGroup.source : null);    }    void computeCombineBounds(Bounds bounds) {	if (boundsAutoCompute) {    	    sharedGroup.computeCombineBounds(bounds);	} else {	    // Should this be lock too ? ( MT safe  ? )	    synchronized(localBounds) {		bounds.combine(localBounds);	    }	}    }        /**     * Gets the bounding object of a node.     * @return the node's bounding object     */    Bounds getBounds() {	return (boundsAutoCompute ?	        (Bounds)sharedGroup.getBounds().clone() :	        super.getBounds());    }             /**     * assign a name to this node when it is made live.     */    void setLive(SetLiveState s) {        super.doSetLive(s);        if (inBackgroundGroup) {            throw new               IllegalSceneGraphException(J3dI18N.getString("LinkRetained0"));        }	if (nodeId == null) {            nodeId = universe.getNodeId();	}	if (sharedGroup != null) {	    this.sharedGroup.parents.addElement(this);	    HashKey newKeys[] = getNewKeys(s.locale.nodeId, s.keys);	    HashKey oldKeys[] = s.keys;	    s.keys = newKeys;	    s.inSharedGroup = true;	    if (visited) {		throw new SceneGraphCycleException(J3dI18N.getString("LinkRetained1"));	    }	    visited = true;	    try {		this.sharedGroup.setLive(s);	    } catch (SceneGraphCycleException e) {		throw e;			    } finally {		visited = false;			    }	    s.inSharedGroup = inSharedGroup;	    s.keys = oldKeys;	    	    localBounds.setWithLock(this.sharedGroup.localBounds);	}	super.markAsLive();    }    void setNodeData(SetLiveState s) {        super.setNodeData(s);        // add this node to parentTransformLink's childTransformLink        if (s.childTransformLinks != null) {            // do not duplicate shared nodes            synchronized(s.childTransformLinks) {                if(!inSharedGroup || !s.childTransformLinks.contains(this)) {                    s.childTransformLinks.add(this);                }            }        }        // add this node to parentSwitchLink's childSwitchLink        if (s.childSwitchLinks != null) {            if(!inSharedGroup ||                        // only add if not already added in sharedGroup                        !s.childSwitchLinks.contains(this)) {                s.childSwitchLinks.add(this);            }        }    }    void recombineAbove() {        localBounds.setWithLock(sharedGroup.localBounds);	parent.recombineAbove();    }        /**     * assign a name to this node when it is made live.     */    void clearLive(SetLiveState s) {		if (sharedGroup != null) {	    HashKey newKeys[] = getNewKeys(s.locale.nodeId, s.keys);            super.clearLive(s);	    HashKey oldKeys[] = s.keys;	    s.keys = newKeys;	    s.inSharedGroup = true;	    this.sharedGroup.parents.removeElement(this);	    this.sharedGroup.clearLive(s);	    s.inSharedGroup = inSharedGroup;	    s.keys = oldKeys;	} else {            super.clearLive(s);	}    }    void removeNodeData(SetLiveState s) {        if(refCount <= 0) {	    // either not in sharedGroup or last instance in sharedGroup            // remove this node from parentTransformLink's childTransformLink            if (parentTransformLink != null) {                ArrayList obj;                if (parentTransformLink instanceof TransformGroupRetained) {                    obj = ((TransformGroupRetained)                        parentTransformLink).childTransformLinks;                } else {                    obj = ((SharedGroupRetained)                        parentTransformLink).childTransformLinks;                }                synchronized(obj) {                    obj.remove(this);                }            }            // remove this node from parentSwitchLink's childSwitchLink            if (parentSwitchLink != null) {                ArrayList switchLinks;                for(int i=0; i<parentSwitchLink.childrenSwitchLinks.size();i++){                    switchLinks = (ArrayList)                                parentSwitchLink.childrenSwitchLinks.get(i);                    if (switchLinks.contains(this)) {                        switchLinks.remove(this);                        break;                    }                }            }        }	super.removeNodeData(s);    }    void updatePickable(HashKey keys[], boolean pick[]) {	super.updatePickable(keys, pick);	if (sharedGroup != null) {	    HashKey newKeys[] = getNewKeys(locale.nodeId, keys);	    sharedGroup.updatePickable(newKeys, pick);	}    }    void updateCollidable(HashKey keys[], boolean collide[]) {	 super.updateCollidable(keys, collide);	 if (sharedGroup != null) {	     HashKey newKeys[] = getNewKeys(locale.nodeId, keys);	     sharedGroup.updateCollidable(newKeys, collide);	 }    }    void setBoundsAutoCompute(boolean autoCompute) {        super.setBoundsAutoCompute(autoCompute);        if (!autoCompute) {            localBounds = getBounds();        }    }    void setCompiled() {	super.setCompiled();	if (sharedGroup != null) {	    sharedGroup.setCompiled();	}    }    void compile(CompileState compState) {	super.compile(compState);        // XXXX: for now keep the static transform in the parent tg        compState.keepTG = true;        // don't remove this group node        mergeFlag = SceneGraphObjectRetained.DONT_MERGE;        if (J3dDebug.devPhase && J3dDebug.debug) {            compState.numLinks++;        }    }    HashKey[] getNewKeys(String localeNodeId,  HashKey oldKeys[]) {	HashKey newKeys[];		if (!inSharedGroup) {	    newKeys = new HashKey[1];	    newKeys[0] = new HashKey(localeNodeId);	    newKeys[0].append(plus + nodeId);	} else {	    // Need to append this link node id to all keys passed in.	    newKeys = new HashKey[oldKeys.length];	    for (int i=oldKeys.length-1; i>=0; i--) {		newKeys[i] = new HashKey(oldKeys[i].toString() 					 + plus + nodeId);	    }	}	return newKeys;    }    void searchGeometryAtoms(UnorderList list) {	if (sharedGroup != null) {	    sharedGroup.searchGeometryAtoms(list);	}    }}

⌨️ 快捷键说明

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