📄 wakeuponcollisionentry.java
字号:
/* * $RCSfile: WakeupOnCollisionEntry.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Use is subject to license terms. * * $Revision: 1.4 $ * $Date: 2007/02/09 17:18:31 $ * $State: Exp $ */package javax.media.j3d;import java.util.*;/** * Class specifying a wakeup when the specified object * collides with any other object in the scene graph. * */public final class WakeupOnCollisionEntry extends WakeupCriterion { // different types of WakeupIndexedList that use in GeometryStructure static final int COND_IN_GS_LIST = 0; static final int COLLIDEENTRY_IN_BS_LIST = 1; // total number of different IndexedUnorderedSet types static final int TOTAL_INDEXED_UNORDER_SET_TYPES = 2; /** * Use geometry in computing collisions. */ public static final int USE_GEOMETRY = 10; /** * Use geometric bounds as an approximation in computing collisions. */ public static final int USE_BOUNDS = 11; static final int GROUP = NodeRetained.GROUP; static final int BOUNDINGLEAF = NodeRetained.BOUNDINGLEAF; static final int SHAPE = NodeRetained.SHAPE; static final int MORPH = NodeRetained.MORPH; static final int ORIENTEDSHAPE3D = NodeRetained.ORIENTEDSHAPE3D; static final int BOUND = 0; /** * Accuracy mode one of USE_GEOMETRY or USE_BOUNDS */ int accuracyMode; // Cached the arming Node being used when it is not BOUND NodeRetained armingNode; // A transformed Bounds of Group/Bounds, use by // BOUND, GROUP Bounds vwcBounds = null; // Use by BoundingLeaf, point to mirror BoundingLeaf // transformedRegion under this leaf is used. BoundingLeafRetained boundingLeaf = null; /** * Geometry atoms that this wakeup condition refer to. * Only use by SHAPE, MORPH, GROUP, ORIENTEDSHAPE */ UnorderList geometryAtoms = null; // one of GROUP, BOUNDINGLEAF, SHAPE, MORPH, BOUND int nodeType; SceneGraphPath armingPath = null; Bounds armingBounds = null; // the following two references are set only after a collision // has occurred Bounds collidingBounds = null; SceneGraphPath collidingPath = null; /** * Constructs a new WakeupOnCollisionEntry criterion with * USE_BOUNDS for a speed hint. * @param armingPath the path used to <em>arm</em> collision * detection * @exception IllegalArgumentException if object associated with the * SceneGraphPath is other than a Group, Shape3D, Morph, or * BoundingLeaf node. */ public WakeupOnCollisionEntry(SceneGraphPath armingPath) { this(armingPath, USE_BOUNDS); } /** * Constructs a new WakeupOnCollisionEntry criterion. * @param armingPath the path used to <em>arm</em> collision * detection * @param speedHint one of USE_GEOMETRY or USE_BOUNDS, specifies how * accurately Java 3D will perform collision detection * @exception IllegalArgumentException if hint is not one of * USE_GEOMETRY or USE_BOUNDS. * @exception IllegalArgumentException if object associated with the * SceneGraphPath is other than a Group, Shape3D, Morph, or * BoundingLeaf node. */ public WakeupOnCollisionEntry(SceneGraphPath armingPath, int speedHint) { this(new SceneGraphPath(armingPath), speedHint, null); } /** * Constructs a new WakeupOnCollisionEntry criterion. * @param armingNode the Group, Shape, or Morph node used to * <em>arm</em> collision detection * @exception IllegalArgumentException if object is under a * SharedGroup node or object is other than a Group, Shape3D, * Morph or BoundingLeaf node. */ public WakeupOnCollisionEntry(Node armingNode) { this(armingNode, USE_BOUNDS); } /** * Constructs a new WakeupOnCollisionEntry criterion. * @param armingNode the Group, Shape, or Morph node used to * <em>arm</em> collision detection * @param speedHint one of USE_GEOMETRY or USE_BOUNDS, specifies how * accurately Java 3D will perform collision detection * @exception IllegalArgumentException if hint is not one of * USE_GEOMETRY or USE_BOUNDS. * @exception IllegalArgumentException if object is under a * SharedGroup node or object is other than a Group, Shape3D, * Morph or BoundingLeaf node. */ public WakeupOnCollisionEntry(Node armingNode, int speedHint) { this(new SceneGraphPath(null, armingNode), speedHint, null); } /** * Constructs a new WakeupOnCollisionEntry criterion. * @param armingBounds the bounds object used to <em>arm</em> collision * detection */ public WakeupOnCollisionEntry(Bounds armingBounds) { this(null, USE_BOUNDS, (Bounds) armingBounds.clone()); } /** * Constructs a new WakeupOnCollisionEntry criterion. * @param armingPath the path used to <em>arm</em> collision * detection * @param speedHint one of USE_GEOMETRY or USE_BOUNDS, specifies how * accurately Java 3D will perform collision detection * @param armingBounds the bounds object used to <em>arm</em> collision * detection * @exception IllegalArgumentException if hint is not one of * USE_GEOMETRY or USE_BOUNDS. * @exception IllegalArgumentException if object associated with the * SceneGraphPath is other than a Group, Shape3D, Morph, or * BoundingLeaf node. */ WakeupOnCollisionEntry(SceneGraphPath armingPath, int speedHint, Bounds armingBounds) { if (armingPath != null) { this.armingNode = (NodeRetained) armingPath.getObject().retained; nodeType = getNodeType(armingNode, armingPath, "WakeupOnCollisionEntry"); this.armingPath = armingPath; validateSpeedHint(speedHint, "WakeupOnCollisionEntry4"); } else { this.armingBounds = armingBounds; nodeType = BOUND; } accuracyMode = speedHint; WakeupIndexedList.init(this, TOTAL_INDEXED_UNORDER_SET_TYPES); } /** * Returns the path used in specifying the collision condition. * @return the SceneGraphPath object generated when arming this * criterion---null implies that a bounds object armed this criteria */ public SceneGraphPath getArmingPath() { return (armingPath != null ? new SceneGraphPath(armingPath) : null); } /** * Returns the bounds object used in specifying the collision condition. * @return the Bounds object generated when arming this * criterion---null implies that a SceneGraphPath armed this criteria */ public Bounds getArmingBounds() { return (armingBounds != null ? (Bounds)armingBounds.clone() : null); } /** * Retrieves the path describing the object causing the collision. * @return the SceneGraphPath that describes the triggering object. * @exception IllegalStateException if not called from within the * a behavior's processStimulus method which was awoken by a collision. */ public SceneGraphPath getTriggeringPath() { if (behav == null) { throw new IllegalStateException(J3dI18N.getString("WakeupOnCollisionEntry5")); } synchronized (behav) { if (!behav.inCallback) { throw new IllegalStateException (J3dI18N.getString("WakeupOnCollisionEntry5")); } } return (collidingPath != null ? new SceneGraphPath(collidingPath): null); } /** * Retrieves the Bounds object that caused the collision * @return the colliding Bounds object. * @exception IllegalStateException if not called from within the * a behavior's processStimulus method which was awoken by a collision. */ public Bounds getTriggeringBounds() { if (behav == null) { throw new IllegalStateException(J3dI18N.getString("WakeupOnCollisionEntry6")); } synchronized (behav) { if (!behav.inCallback) { throw new IllegalStateException (J3dI18N.getString("WakeupOnCollisionEntry6")); } } return (collidingBounds != null ? (Bounds)(collidingBounds.clone()): null); } /** * Node legality checker * throw Exception if node is not legal. * @return nodeType */ static int getNodeType(NodeRetained armingNode, SceneGraphPath armingPath, String s) throws IllegalArgumentException { // check if SceneGraphPath is unique // Note that graph may not live at this point so we // can't use node.inSharedGroup. if (!armingPath.validate()) { throw new IllegalArgumentException(J3dI18N.getString(s + "7")); } if (armingNode.inBackgroundGroup) { throw new IllegalArgumentException(J3dI18N.getString(s + "1")); } // This should come before Shape3DRetained check if (armingNode instanceof OrientedShape3DRetained) { return ORIENTEDSHAPE3D; } if (armingNode instanceof Shape3DRetained) { return SHAPE; } if (armingNode instanceof MorphRetained) { return MORPH; } if (armingNode instanceof GroupRetained) { return GROUP; } if (armingNode instanceof BoundingLeafRetained) { return BOUNDINGLEAF; } throw new IllegalArgumentException(J3dI18N.getString(s + "0")); } /** * speedHint legality checker * throw Exception if speedHint is not legal */ static void validateSpeedHint(int speedHint, String s)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -