001: /*
002: * $RCSfile: WakeupOnViewPlatformExit.java,v $
003: *
004: * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
006: *
007: * This code is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU General Public License version 2 only, as
009: * published by the Free Software Foundation. Sun designates this
010: * particular file as subject to the "Classpath" exception as provided
011: * by Sun in the LICENSE file that accompanied this code.
012: *
013: * This code is distributed in the hope that it will be useful, but WITHOUT
014: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: * version 2 for more details (a copy is included in the LICENSE file that
017: * accompanied this code).
018: *
019: * You should have received a copy of the GNU General Public License version
020: * 2 along with this work; if not, write to the Free Software Foundation,
021: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
022: *
023: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
024: * CA 95054 USA or visit www.sun.com if you need additional information or
025: * have any questions.
026: *
027: * $Revision: 1.5 $
028: * $Date: 2008/02/28 20:17:33 $
029: * $State: Exp $
030: */
031:
032: package javax.media.j3d;
033:
034: /**
035: * Class specifying a wakeup when an active ViewPlatform no longer
036: * intersects the specified boundary.
037: */
038: public final class WakeupOnViewPlatformExit extends WakeupCriterion {
039:
040: // different types of WakeupIndexedList that use in BehaviorStructure
041: static final int COND_IN_BS_LIST = 0;
042: static final int BOUNDSEXIT_IN_BS_LIST = 1;
043:
044: // total number of different IndexedUnorderedSet types
045: static final int TOTAL_INDEXED_UNORDER_SET_TYPES = 2;
046:
047: Bounds region;
048:
049: /**
050: * Transformed region
051: */
052: Bounds transformedRegion;
053:
054: /**
055: * ViewPlatform that triggered this wakeup condition.
056: */
057: ViewPlatformRetained triggeredVP;
058:
059: /**
060: * Constructs a new WakeupOnExit criterion.
061: * @param region the region that will trigger a wakeup if a ViewPlatform
062: * no longer intersects.
063: */
064: public WakeupOnViewPlatformExit(Bounds region) {
065: this .region = (Bounds) region.clone();
066: WakeupIndexedList.init(this , TOTAL_INDEXED_UNORDER_SET_TYPES);
067: }
068:
069: /**
070: * Returns this object's bounds specification
071: * @return the bounds used in constructing this WakeupCriterion.
072: */
073: public Bounds getBounds() {
074: return (Bounds) region.clone();
075: }
076:
077: /**
078: * Retrieves the ViewPlatform node that caused the wakeup.
079: *
080: * @return the triggering ViewPlatform node
081: *
082: * @exception IllegalStateException if not called from within
083: * a behavior's processStimulus method that was awoken by a
084: * view platform exit.
085: *
086: * @since Java 3D 1.3
087: */
088: public ViewPlatform getTriggeringViewPlatform() {
089: if (behav == null) {
090: throw new IllegalStateException(J3dI18N
091: .getString("WakeupOnViewPlatformExit0"));
092: }
093:
094: synchronized (behav) {
095: if (!behav.inCallback) {
096: throw new IllegalStateException(J3dI18N
097: .getString("WakeupOnViewPlatformExit0"));
098: }
099: }
100:
101: return (triggeredVP != null) ? (ViewPlatform) triggeredVP.source
102: : null;
103: }
104:
105: /**
106: * Update the cached Transfrom Region, call from BehaviorStructure
107: * when TRANSFORM_CHANGED message get. Also call from buildTree.
108: */
109: void updateTransformRegion(BehaviorRetained b) {
110: if (transformedRegion != null) {
111: transformedRegion.set(region);
112: } else {
113: // region is read only once initialize (since there is no
114: // set method for region). So no need to use cloneWithLock()
115: transformedRegion = (Bounds) region.clone();
116: }
117: transformedRegion.transform(b.getCurrentLocalToVworld(null));
118: }
119:
120: /**
121: * This is a callback from BehaviorStructure. It is
122: * used to add wakeupCondition to behavior structure.
123: */
124: void addBehaviorCondition(BehaviorStructure bs) {
125: updateTransformRegion(behav);
126: behav.wakeupArray[BehaviorRetained.WAKEUP_VP_EXIT_INDEX]++;
127: behav.wakeupMask |= BehaviorRetained.WAKEUP_VP_EXIT;
128: bs.addVPExitCondition(this );
129: }
130:
131: /**
132: * This is a callback from BehaviorStructure. It is
133: * used to remove wakeupCondition from behavior structure.
134: */
135: void removeBehaviorCondition(BehaviorStructure bs) {
136: bs.removeVPExitCondition(this );
137: behav.wakeupArray[BehaviorRetained.WAKEUP_VP_EXIT_INDEX]--;
138: if (behav.wakeupArray[BehaviorRetained.WAKEUP_VP_EXIT_INDEX] == 0) {
139: behav.wakeupMask &= ~BehaviorRetained.WAKEUP_VP_EXIT;
140: }
141: }
142:
143: /**
144: * Perform task in addBehaviorCondition() that has to be
145: * set every time the condition met.
146: */
147: void resetBehaviorCondition(BehaviorStructure bs) {
148: // updateTransformRegion() is invoked in BehaviorStructure
149: // whenever Behavior transform change so there is
150: // no need to transform here every time.
151: }
152: }
|