diff options
author | Julien Gouesse <[email protected]> | 2015-11-28 15:11:48 +0100 |
---|---|---|
committer | Julien Gouesse <[email protected]> | 2015-11-28 15:11:48 +0100 |
commit | dbc98deea1884e44da2c74d6ea807253cdefa693 (patch) | |
tree | 29c3ee7dea82d7dd773d81f33f645dde67e43a17 /src/javax/media/j3d/Node.java | |
parent | 2c99f1329dc55bd496bce91b9aba956ecba3c67e (diff) |
Relocate package prefix to org.jogamp.java3d
Diffstat (limited to 'src/javax/media/j3d/Node.java')
-rw-r--r-- | src/javax/media/j3d/Node.java | 823 |
1 files changed, 0 insertions, 823 deletions
diff --git a/src/javax/media/j3d/Node.java b/src/javax/media/j3d/Node.java deleted file mode 100644 index 70bfe02..0000000 --- a/src/javax/media/j3d/Node.java +++ /dev/null @@ -1,823 +0,0 @@ -/* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - */ - -package javax.media.j3d; - -import java.util.Enumeration; -import java.util.Hashtable; - -/** - * The Node class provides an abstract class for all Group and Leaf Nodes. - * It provides a common framework for constructing a Java 3D scene graph, - * specifically bounding volumes. - * - * <p> - * For more information, see the - * <a href="doc-files/intro.html">Introduction to the Java 3D API</a>. - * - * <p> - * NOTE: Applications should <i>not</i> extend this class directly. - */ -public abstract class Node extends SceneGraphObject { - - /** - * Specifies that this Node will be reported in the pick - * SceneGraphPath if a pick occurs. This capability is only - * specifiable for Group nodes; it is ignored for leaf nodes. - * The default for Group nodes is false. All interior nodes not - * needed for uniqueness in a SceneGraphPath that don't have - * ENABLE_PICK_REPORTING set to true will not be reported in the - * SceneGraphPath. - * @see SceneGraphPath - */ - public static final int - ENABLE_PICK_REPORTING = CapabilityBits.NODE_ENABLE_PICK_REPORTING; - - /** - * Specifies that this Node will be reported in the collision - * SceneGraphPath if a collision occurs. This capability is only - * specifiable for Group nodes; it is ignored for leaf nodes. - * The default for Group nodes is false. All interior nodes not - * needed for uniqueness in a SceneGraphPath that don't have - * ENABLE_COLLISION_REPORTING set to true will not be reported - * in the SceneGraphPath. - * @see SceneGraphPath - */ - public static final int - ENABLE_COLLISION_REPORTING = CapabilityBits.NODE_ENABLE_COLLISION_REPORTING; - - /** - * Specifies that this Node allows read access to its bounds - * information. - */ - public static final int - ALLOW_BOUNDS_READ = CapabilityBits.NODE_ALLOW_BOUNDS_READ; - - /** - * Specifies that this Node allows write access to its bounds - * information. - */ - public static final int - ALLOW_BOUNDS_WRITE = CapabilityBits.NODE_ALLOW_BOUNDS_WRITE; - - /** - * Specifies that this Node allows reading its pickability state. - */ - public static final int - ALLOW_PICKABLE_READ = CapabilityBits.NODE_ALLOW_PICKABLE_READ; - - /** - * Specifies that this Node allows write access its pickability state. - */ - public static final int - ALLOW_PICKABLE_WRITE = CapabilityBits.NODE_ALLOW_PICKABLE_WRITE; - - /** - * Specifies that this Node allows reading its collidability state. - */ - public static final int - ALLOW_COLLIDABLE_READ = CapabilityBits.NODE_ALLOW_COLLIDABLE_READ; - - /** - * Specifies that this Node allows write access its collidability state. - */ - public static final int - ALLOW_COLLIDABLE_WRITE = CapabilityBits.NODE_ALLOW_COLLIDABLE_WRITE; - - /** - * Specifies that this Node allows read access to its bounds - * auto compute information. - */ - public static final int - ALLOW_AUTO_COMPUTE_BOUNDS_READ = CapabilityBits.NODE_ALLOW_AUTO_COMPUTE_BOUNDS_READ; - - /** - * Specifies that this Node allows write access to its bounds - * auto compute information. - */ - public static final int - ALLOW_AUTO_COMPUTE_BOUNDS_WRITE = CapabilityBits.NODE_ALLOW_AUTO_COMPUTE_BOUNDS_WRITE; - - /** - * Specifies that this Node allows read access to its local - * coordinates to virtual world (Vworld) coordinates transform. - */ - public static final int - ALLOW_LOCAL_TO_VWORLD_READ = CapabilityBits.NODE_ALLOW_LOCAL_TO_VWORLD_READ; - - /** - * Specifies that this Node allows read access to its parent Group node. - * - * @since Java 3D 1.4 - */ - public static final int - ALLOW_PARENT_READ = CapabilityBits.NODE_ALLOW_PARENT_READ; - - /** - * Specifies that this Node allows read access to its Locale. - * - * @since Java 3D 1.4 - */ - public static final int - ALLOW_LOCALE_READ = CapabilityBits.NODE_ALLOW_LOCALE_READ; - - // Array for setting default read capabilities - private static final int[] readCapabilities = { - ALLOW_BOUNDS_READ, - ALLOW_PICKABLE_READ, - ALLOW_COLLIDABLE_READ, - ALLOW_AUTO_COMPUTE_BOUNDS_READ, - ALLOW_LOCAL_TO_VWORLD_READ, - ALLOW_PARENT_READ, - ALLOW_LOCALE_READ - }; - - // for checking for cycles - private boolean visited = false; - - - /** - * Constructs a Node object with default parameters. The default - * values are as follows: - * <ul> - * pickable : true<br> - * collidable : true<br> - * bounds auto compute : true<br> - * bounds : N/A (automatically computed)<br> - * </ul> - */ - public Node() { - // set default read capabilities - setDefaultReadCapabilities(readCapabilities); - } - - /** - - * @return the parent of this node, or null if this node has no parent - * @exception CapabilityNotSetException if appropriate capability is - * not set and this object is part of live or compiled scene graph - */ - public Node getParent() { - if (isLiveOrCompiled()) { - if(!this.getCapability(ALLOW_PARENT_READ)) { - throw new CapabilityNotSetException(J3dI18N.getString("Node0")); - } - } - - NodeRetained nr = ((NodeRetained)this.retained).getParent(); - return (nr == null ? null : (Node) nr.getSource()); - } - - /** - * Sets the geometric bounds of a node. - * @param bounds the bounding object for a node - * @exception CapabilityNotSetException if appropriate capability is - * not set and this object is part of live or compiled scene graph - */ - public void setBounds(Bounds bounds) { - if (isLiveOrCompiled()) - if(!this.getCapability(ALLOW_BOUNDS_WRITE)) - throw new CapabilityNotSetException(J3dI18N.getString("Node1")); - - ((NodeRetained)this.retained).setBounds(bounds); - } - - /** - * Returns the bounding object of a node. - * @return the node's bounding object - * @exception CapabilityNotSetException if appropriate capability is - * not set and this object is part of live or compiled scene graph - * @exception SceneGraphCycleException if there is a cycle in the - * scene graph - */ - public Bounds getBounds() { - - if (isLiveOrCompiled()) { - if(!this.getCapability(ALLOW_BOUNDS_READ)) { - throw new CapabilityNotSetException(J3dI18N.getString("Node2")); - } - } - else { - // this will throw a SceneGraphCycleException if there is - // a cycle - checkForCycle(); - } - - return ((NodeRetained)this.retained).getBounds(); - } - - /** - * Returns the collidable value; this value determines whether this node - * and it's children, if a group node, can be considered for collision - * purposes; if it is set to false, then neither this node nor any - * children nodes will be traversed for collision purposes; the default - * value is true. The collidable setting is the way that an - * application can perform collision culling. - * @return the present collidable value for this node - */ - public boolean getCollidable() { - if (isLiveOrCompiled()) - if(!this.getCapability(ALLOW_COLLIDABLE_READ)) - throw new CapabilityNotSetException(J3dI18N.getString("Node16")); - - return ((NodeRetained)retained).getCollidable(); - } - - /** - * Sets the collidable value; determines whether this node and any of its - * children, if a group node, can be considered for collision purposes. - * @param collidable the new collidable value for this node - */ - public void setCollidable( boolean collidable ) { - if (isLiveOrCompiled()) - if(!this.getCapability(ALLOW_COLLIDABLE_WRITE)) - throw new CapabilityNotSetException(J3dI18N.getString("Node4")); - - ((NodeRetained)retained).setCollidable(collidable); - } - - /** - * Turns the automatic calcuation of geometric bounds of a node on/off. - * @param autoCompute indicates if the node's bounding object is - * automatically computed. - * @exception CapabilityNotSetException if appropriate capability is - * not set and this object is part of live or compiled scene graph - */ - public void setBoundsAutoCompute(boolean autoCompute) { - if (isLiveOrCompiled()) - if(!this.getCapability(ALLOW_AUTO_COMPUTE_BOUNDS_WRITE)) - throw new CapabilityNotSetException(J3dI18N.getString("Node5")); - - ((NodeRetained)this.retained).setBoundsAutoCompute(autoCompute); - } - - /** - * Gets the value indicating if the automatic calcuation of geometric bounds of a node is on/off. - * @return the node's auto compute flag for the geometric bounding object - * @exception CapabilityNotSetException if appropriate capability is - * not set and this object is part of live or compiled scene graph - */ - public boolean getBoundsAutoCompute() { - if (isLiveOrCompiled()) - if(!this.getCapability(ALLOW_AUTO_COMPUTE_BOUNDS_READ)) - throw new CapabilityNotSetException(J3dI18N.getString("Node6")); - - return ((NodeRetained)this.retained).getBoundsAutoCompute(); - } - - /** - * Retrieves the local coordinates to virtual world coordinates - * transform for this node in the scene graph. This is the composite - * of all transforms in the scene graph from the root down to - * <code>this</code> node. It is only valid - * for nodes that are part of a live scene graph. - * If the node is not part of a live scene graph then the coordinates are - * calculated as if the graph was attached at the origin of a locale. - * @param t the object that will receive the local coordinates to - * Vworld coordinates transform. - * @exception RestrictedAccessException if the node is compiled but not - * part of a live scene graph - * @exception CapabilityNotSetException if appropriate capability is - * not set and this node is part of live or compiled scene graph - * @exception IllegalSharingException if the node is a descendant - * of a SharedGroup node. - */ - public void getLocalToVworld(Transform3D t) { - if (isLiveOrCompiled()) { - if(!this.getCapability(ALLOW_LOCAL_TO_VWORLD_READ)) - throw new CapabilityNotSetException(J3dI18N.getString("Node8")); - } - - if (!isLive()) { - // TODO Support compiled graphs - if (isCompiled()) - throw new RestrictedAccessException(J3dI18N.getString("Node7")); - - // In 1.4 we support getLocalToVworld for non live nodes - ((NodeRetained)this.retained).computeNonLiveLocalToVworld(t, this); - //throw new RestrictedAccessException(J3dI18N.getString("Node7")); - } else { - ((NodeRetained)this.retained).getLocalToVworld(t); - } - } - - - /** - * Retrieves the local coordinates to virtual world coordinates - * transform for the particular path in the scene graph ending with - * this node. This is the composite - * of all transforms in the scene graph from the root down to - * <code>this</code> node via the specified Link nodes. It is - * only valid for nodes that are part of a live scene graph. - * @param path the specific path from the node to the Locale - * @param t the object that will receive the local coordinates to - * Vworld coordinates transform. - * @exception RestrictedAccessException if the node is <em>not</em> - * part of a live scene graph - * @exception CapabilityNotSetException if appropriate capability is - * not set and this node is part of live scene graph - * @exception IllegalArgumentException if the specified path does - * not contain a valid Locale, or if the last node in the path is - * different from this node - * @exception IllegalSharingException if the node is not a descendant - * of a SharedGroup node. - */ - public void getLocalToVworld(SceneGraphPath path, Transform3D t) { - if (!isLive()) { - throw new RestrictedAccessException(J3dI18N.getString("Node7")); - } - - if(!this.getCapability(ALLOW_LOCAL_TO_VWORLD_READ)) - throw new CapabilityNotSetException(J3dI18N.getString("Node8")); - - ((NodeRetained)this.retained).getLocalToVworld(path,t); - - } - - /** - * Retrieves the locale to which this node is attached. If the - * node is not part of a live scene graph, null is returned. - * - * @return the locale to which this node is attached. - * - * @exception CapabilityNotSetException if appropriate capability is - * not set and this node is part of live scene graph - * @exception IllegalSharingException if the node is a descendant - * of a SharedGroup node. - * - * @since Java 3D 1.4 - */ - public Locale getLocale() { - if (!isLive()) { - return null; - } - - if(!this.getCapability(ALLOW_LOCALE_READ)) { - throw new CapabilityNotSetException(J3dI18N.getString("Node17")); - } - - return ((NodeRetained)this.retained).getLocale(); - } - - /** - * Duplicates all the nodes of the specified sub-graph. For Group Nodes - * the group node is duplicated via a call to <code>cloneNode</code> - * and then <code>cloneTree</code> - * is called for each child node. For Leaf Nodes, component - * data can either be duplicated or be made a reference to the original - * data. Leaf Node cloneTree behavior is determined by the - * <code>duplicateOnCloneTree</code> flag found in every Leaf Node's - * component data class and by the <code>forceDuplicate</code> paramter. - * @return a reference to the cloned sub-graph. - * @exception DanglingReferenceException When a dangling reference is - * discovered during the cloneTree operation. - * @exception RestrictedAccessException if this object is part of live - * or compiled scene graph - * @exception SceneGraphCycleException if there is a cycle in the - * scene graph - * @see NodeComponent#setDuplicateOnCloneTree - */ - public Node cloneTree() { - return cloneTree(new NodeReferenceTable(), false, false); - } - - /** - * Duplicates all the nodes of the specified sub-graph. For Group Nodes - * the group node is duplicated via a call to <code>cloneNode</code> - * and then <code>cloneTree</code> is called for each child node. - * For Leaf Nodes, component - * data can either be duplicated or be made a reference to the original - * data. Leaf Node cloneTree behavior is determined by the - * <code>duplicateOnCloneTree</code> flag found in every Leaf Node's - * component data class and by the <code>forceDuplicate</code> paramter. - * @param forceDuplicate when set to <code>true</code>, causes the - * <code>duplicateOnCloneTree</code> flag to be ignored. When - * <code>false</code>, the value of each node's - * <code>duplicateOnCloneTree</code> determines whether data is - * duplicated or copied. - * @return a reference to the cloned scene graph. - * @exception DanglingReferenceException When a dangling reference is - * discovered during the cloneTree operation. - * @exception RestrictedAccessException if this object is part of live - * or compiled scene graph - * @exception SceneGraphCycleException if there is a cycle in the - * scene graph - * @see NodeComponent#setDuplicateOnCloneTree - */ - public Node cloneTree(boolean forceDuplicate) { - return cloneTree(new NodeReferenceTable(), forceDuplicate, false); - } - - /** - * Duplicates all the nodes of the specified sub-graph. For Group Nodes - * the group node is duplicated via a call to <code>cloneNode</code> and - * then <code>cloneTree</code> is called for each child node. For - * Leaf Nodes, component - * data can either be duplicated or be made a reference to the original - * data. Leaf Node cloneTree behavior is determined by the - * <code>duplicateOnCloneTree</code> flag found in every Leaf Node's - * component data class and by the <code>forceDuplicate</code> paramter. - * - * @param forceDuplicate when set to <code>true</code>, causes the - * <code>duplicateOnCloneTree</code> - * flag to be ignored. When <code>false</code>, the value of each node's - * <code>duplicateOnCloneTree</code> determines whether data is - * duplicated or copied. - * - * @param allowDanglingReferences when set to <code>true</code> allows - * the <code>cloneTree</code> - * method to complete even whan a dangling reference is discovered. When - * this parameter is <code>false</code> a - * <code>DanglingReferenceException</code> is generated as - * soon as cloneTree detects this situation. - * - * @return a reference to the cloned scene graph. - * - * @exception DanglingReferenceException When a dangling reference is - * discovered during the cloneTree operation and the - * <code>allowDanglingReference</code> parameter is </code>false</code>. - * @exception RestrictedAccessException if this object is part of live - * or compiled scene graph - * @exception SceneGraphCycleException if there is a cycle in the - * scene graph - * - * @see NodeComponent#setDuplicateOnCloneTree - */ - public Node cloneTree(boolean forceDuplicate, - boolean allowDanglingReferences) { - return cloneTree(new NodeReferenceTable(), - forceDuplicate, allowDanglingReferences); - } - - - /** - * Duplicates all the nodes of the specified sub-graph. For Group Nodes - * the group node is duplicated via a call to <code>cloneNode</code> - * and then <code>cloneTree</code> - * is called for each child node. For Leaf Nodes, component - * data can either be duplicated or be made a reference to the original - * data. Leaf Node cloneTree behavior is determined by the - * <code>duplicateOnCloneTree</code> flag found in every Leaf Node's - * component data class and by the <code>forceDuplicate</code> paramter. - * @param referenceTable table that stores the mapping between - * original and cloned nodes. All previous values in the - * referenceTable will be cleared before the clone is made. - * @return a reference to the cloned sub-graph. - * @exception DanglingReferenceException When a dangling reference is - * discovered during the cloneTree operation. - * @exception RestrictedAccessException if this object is part of live - * or compiled scene graph - * @exception SceneGraphCycleException if there is a cycle in the - * scene graph - * @see NodeComponent#setDuplicateOnCloneTree - * @since Java 3D 1.2 - */ - public Node cloneTree(NodeReferenceTable referenceTable) { - return cloneTree(referenceTable, false, false); - } - - - /** - * Duplicates all the nodes of the specified sub-graph. For Group Nodes - * the group node is duplicated via a call to <code>cloneNode</code> - * and then <code>cloneTree</code> is called for each child node. - * For Leaf Nodes, component - * data can either be duplicated or be made a reference to the original - * data. Leaf Node cloneTree behavior is determined by the - * <code>duplicateOnCloneTree</code> flag found in every Leaf Node's - * component data class and by the <code>forceDuplicate</code> paramter. - * @param referenceTable table that stores the mapping between - * original and cloned nodes. All previous values in the - * referenceTable will be cleared before the clone is made. - * @param forceDuplicate when set to <code>true</code>, causes the - * <code>duplicateOnCloneTree</code> flag to be ignored. When - * <code>false</code>, the value of each node's - * <code>duplicateOnCloneTree</code> determines whether data is - * duplicated or copied. - * @return a reference to the cloned scene graph. - * @exception DanglingReferenceException When a dangling reference is - * discovered during the cloneTree operation. - * @exception RestrictedAccessException if this object is part of live - * or compiled scene graph - * @exception SceneGraphCycleException if there is a cycle in the - * scene graph - * @see NodeComponent#setDuplicateOnCloneTree - * @since Java 3D 1.2 - */ - public Node cloneTree(NodeReferenceTable referenceTable, - boolean forceDuplicate) { - return cloneTree(referenceTable, forceDuplicate, false); - } - - /** - * Duplicates all the nodes of the specified sub-graph. For Group Nodes - * the group node is duplicated via a call to <code>cloneNode</code> - * and then <code>cloneTree</code> is called for each child node. - * For Leaf Nodes, component - * data can either be duplicated or be made a reference to the original - * data. Leaf Node cloneTree behavior is determined by the - * <code>duplicateOnCloneTree</code> flag found in every Leaf Node's - * component data class and by the <code>forceDuplicate</code> paramter. - * @param referenceTable table that stores the mapping between - * original and cloned nodes. All previous values in the - * referenceTable will be cleared before the clone is made. - * @param forceDuplicate when set to <code>true</code>, causes the - * <code>duplicateOnCloneTree</code> flag to be ignored. When - * <code>false</code>, the value of each node's - * <code>duplicateOnCloneTree</code> determines whether data is - * duplicated or copied. - * - * @param allowDanglingReferences when set to <code>true</code> allows - * the <code>cloneTree</code> - * method to complete even whan a dangling reference is discovered. When - * this parameter is <code>false</code> a - * <code>DanglingReferenceException</code> is generated as - * soon as cloneTree detects this situation. - * - * @return a reference to the cloned scene graph. - * @exception DanglingReferenceException When a dangling reference is - * discovered during the cloneTree operation. - * @exception RestrictedAccessException if this object is part of live - * or compiled scene graph - * @exception SceneGraphCycleException if there is a cycle in the - * scene graph - * @see NodeComponent#setDuplicateOnCloneTree - * @since Java 3D 1.2 - */ - public Node cloneTree(NodeReferenceTable referenceTable, - boolean forceDuplicate, - boolean allowDanglingReferences) { - - if (!isLiveOrCompiled()) { - // this will throw a SceneGraphCycleException if there is - // a cycle - checkForCycle(); - } - - referenceTable.set(allowDanglingReferences, new Hashtable()); - Node n = cloneTree(forceDuplicate, referenceTable.objectHashtable); - - // go through hash table looking for Leaf nodes. - // call updateNodeReferences for each. - Enumeration e = referenceTable.objectHashtable.elements(); - - while (e.hasMoreElements()) { - SceneGraphObject o = (SceneGraphObject) e.nextElement(); - o.updateNodeReferences(referenceTable); - } - return n; - } - - /** - * Duplicates all the nodes of the specified sub-graph. For Group Nodes - * the group node is duplicated via a call to <code>cloneNode</code> and - * then <code>cloneTree</code> is called for each child node. For - * Leaf Nodes, component - * data can either be duplicated or be made a reference to the original - * data. Leaf Node cloneTree behavior is determined by the - * <code>duplicateOnCloneTree</code> flag found in every Leaf Node's - * component data class and by the <code>forceDuplicate</code> paramter. - * - * @param forceDuplicate when set to <code>true</code>, causes the - * <code>duplicateOnCloneTree</code> - * flag to be ignored. When <code>false</code>, the value of each node's - * <code>duplicateOnCloneTree</code> determines whether data is - * duplicated or copied. - * - * @param nodeHashtable a hashtable used to map orignal node references to - * their cloned counterpart. - * - * @return a reference to the cloned scene graph. - * - * @see NodeComponent#setDuplicateOnCloneTree - */ - Node cloneTree(boolean forceDuplicate, Hashtable nodeHashtable) { - Node l; - this.nodeHashtable = nodeHashtable; - try { - l = cloneNode(forceDuplicate); - } catch (RuntimeException e) { - this.nodeHashtable = null; - throw e; - } - // must reset to null so that we can tell whether the call is from user - // or cloneTree - this.nodeHashtable = null; - nodeHashtable.put(this, l); - return l; - } - - - /** - * Used to create a new instance of the node. This routine is called - * by <code>cloneTree</code> to duplicate the current node. - * <code>cloneNode</code> should be overridden by any user subclassed - * objects. All subclasses must have their <code>cloneNode</code> - * method consist of the following lines: - * <P><blockquote><pre> - * public Node cloneNode(boolean forceDuplicate) { - * UserSubClass usc = new UserSubClass(); - * usc.duplicateNode(this, forceDuplicate); - * return usc; - * } - * </pre></blockquote> - * NOTE: Applications should <i>not</i> call this method directly. - * It should only be called by the cloneTree method. - * - * @param forceDuplicate when set to <code>true</code>, causes the - * <code>duplicateOnCloneTree</code> flag to be ignored. When - * <code>false</code>, the value of each node's - * <code>duplicateOnCloneTree</code> variable determines whether - * NodeComponent data is duplicated or copied. - * - * @exception RestrictedAccessException if this object is part of live - * or compiled scene graph - * - * @see Node#cloneTree - * @see Node#duplicateNode - * @see NodeComponent#setDuplicateOnCloneTree - */ - public Node cloneNode(boolean forceDuplicate) { - throw new RuntimeException(J3dI18N.getString("Node12")); - } - - - /** - * Copies all node information from <code>originalNode</code> into - * the current node. This method is called from the - * <code>cloneNode</code> method which is, in turn, called by the - * <code>cloneTree</code> method. - * <P> - * For any <code>NodeComponent</code> objects - * contained by the object being duplicated, each <code>NodeComponent</code> - * object's <code>duplicateOnCloneTree</code> value is used to determine - * whether the <code>NodeComponent</code> should be duplicated in the new node - * or if just a reference to the current node should be placed in the - * new node. This flag can be overridden by setting the - * <code>forceDuplicate</code> parameter in the <code>cloneTree</code> - * method to <code>true</code>. - * - * <br> - * NOTE: Applications should <i>not</i> call this method directly. - * It should only be called by the cloneNode method. - * - * @param originalNode the original node to duplicate. - * @param forceDuplicate when set to <code>true</code>, causes the - * <code>duplicateOnCloneTree</code> flag to be ignored. When - * <code>false</code>, the value of each node's - * <code>duplicateOnCloneTree</code> variable determines whether - * NodeComponent data is duplicated or copied. - * - * @see Group#cloneNode - * @see Node#duplicateNode - * @see Node#cloneTree - * @see NodeComponent#setDuplicateOnCloneTree - */ - public void duplicateNode(Node originalNode, - boolean forceDuplicate) { - duplicateAttributes(originalNode, forceDuplicate); - } - - /** - * Copies all node information from <code>originalNode</code> into - * the current node. This method is called from subclass of - * <code>duplicateNode</code> method which is, in turn, called by the - * <code>cloneNode</code> method. - * <P> - * For any <i>NodeComponent</i> objects - * contained by the object being duplicated, each <i>NodeComponent</i> - * object's <code>duplicateOnCloneTree</code> value is used to determine - * whether the <i>NodeComponent<i> should be duplicated in the new node - * or if just a reference to the current node should be placed in the - * new node. This flag can be overridden by setting the - * <code>forceDuplicate</code> parameter in the <code>cloneTree</code> - * method to <code>true</code>. - * - * - * @param originalNode the original node to duplicate. - * @param forceDuplicate when set to <code>true</code>, causes the - * <code>duplicateOnCloneTree</code> flag to be ignored. When - * <code>false</code>, the value of each node's - * <code>duplicateOnCloneTree</code> variable determines whether - * NodeComponent data is duplicated or copied. - * - * @see Group#cloneNode - * @see Node#duplicateNode - * @see Node#cloneTree - * @see NodeComponent#setDuplicateOnCloneTree - */ - final void checkDuplicateNode(Node originalNode, - boolean forceDuplicate) { - if (originalNode.nodeHashtable != null) { - duplicateAttributes(originalNode, forceDuplicate); - } else { - // user call cloneNode() or duplicateNode() directly - // instead of via cloneTree() - originalNode.nodeHashtable = new Hashtable(); - duplicateAttributes(originalNode, forceDuplicate); - originalNode.nodeHashtable = null; - } - } - - - /** - * Copies all Node information from - * <code>originalNode</code> into - * the current node. This method is called from the - * <code>cloneNode</code> method which is, in turn, called by the - * <code>cloneTree</code> method.<P> - * - * @param originalNode the original node to duplicate. - * @param forceDuplicate when set to <code>true</code>, causes the - * <code>duplicateOnCloneTree</code> flag to be ignored. When - * <code>false</code>, the value of each node's - * <code>duplicateOnCloneTree</code> variable determines whether - * NodeComponent data is duplicated or copied. - * - * @exception RestrictedAccessException if originalNode object is part of a live - * or compiled scenegraph. - * - * @see Node#duplicateNode - * @see Node#cloneTree - * @see NodeComponent#setDuplicateOnCloneTree - */ - void duplicateAttributes(Node originalNode, boolean forceDuplicate) { - - if (originalNode.isLiveOrCompiled()) { - throw new RestrictedAccessException(J3dI18N.getString("Node13")); - } - super.duplicateSceneGraphObject(originalNode); - NodeRetained attr = (NodeRetained) originalNode.retained; - NodeRetained rt = (NodeRetained) retained; - - rt.setPickable(attr.getPickable()); - rt.setCollidable(attr.getCollidable()); - } - - - /** - * When set to <code>true</code> this <code>Node</code> can be Picked. - * Setting to false indicates that this node and it's children - * are ALL unpickable. - * - * @param pickable Indicates if this node should be pickable or not - */ - public void setPickable( boolean pickable ) { - if (isLiveOrCompiled()) - if(!this.getCapability(ALLOW_PICKABLE_WRITE)) - throw new CapabilityNotSetException(J3dI18N.getString("Node14")); - - ((NodeRetained)retained).setPickable(pickable); - } - - /** - * Returns true if this <code>Node</code> is pickable, - * false if it is not pickable. - */ - public boolean getPickable() { - if (isLiveOrCompiled()) - if(!this.getCapability(ALLOW_PICKABLE_READ)) - throw new CapabilityNotSetException(J3dI18N.getString("Node3")); - - return ((NodeRetained)retained).getPickable(); - } - - /** - * checks for cycles in the scene graph - */ - void checkForCycle() { - if (visited) { - throw new SceneGraphCycleException(J3dI18N.getString("Node15")); - } - visited = true; - Node parent = getParent(); - if (parent != null) { - parent.checkForCycle(); - } - visited = false; - } - -} |