001: /*
002: * $RCSfile: WakeupOnElapsedFrames.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 a specific number of frames have
036: * elapsed. The wakeup criterion can either be passive or
037: * non-passive. If any behavior uses a non-passive
038: * WakeupOnElapsedFrames, the rendering system will run continuously.
039: *
040: * <p>
041: * In general, applications cannot count on behavior execution being
042: * synchronized with rendering. Behaviors that use
043: * WakeupOnElapsedFrames with a frame count of 0 are an exception to
044: * this general rule. Such behaviors will be executed every frame.
045: * Further, all modifications to scene graph objects (not including
046: * geometry by-reference or texture by-reference) made from the
047: * <code>processStimulus</code> methods of such behaviors are
048: * guaranteed to take effect in the same rendering frame.
049: */
050: public final class WakeupOnElapsedFrames extends WakeupCriterion {
051:
052: // different types of WakeupIndexedList that use in BehaviorStructure
053: static final int COND_IN_BS_LIST = 0;
054:
055: // total number of different IndexedUnorderedSet types
056: static final int TOTAL_INDEXED_UNORDER_SET_TYPES = 1;
057:
058: // Indicates whether the wakeup condition is passive or
059: // non-passive. Only behaviors using a non-passive
060: // WakeupOnElapsedFrames will force a continuous traversal.
061: boolean passive;
062:
063: // Number of frames before wakeup
064: int frameCount;
065:
066: // When this reaches 0, this criterion is met.
067: int countdown;
068:
069: /**
070: * Constructs a non-passive WakeupOnElapsedFrames criterion.
071: *
072: * @param frameCount the number of frames that Java 3D should draw
073: * before awakening this behavior object; a value of N means
074: * wakeup at the end of frame N, where the current frame is zero,
075: * a value of zero means wakeup at the end of the current frame.
076: *
077: * @exception IllegalArgumentException if frameCount is less than zero
078: */
079: public WakeupOnElapsedFrames(int frameCount) {
080: this (frameCount, false);
081: }
082:
083: /**
084: * Constructs a WakeupOnElapsedFrames criterion.
085: *
086: * @param frameCount the number of frames that Java 3D should draw
087: * before awakening this behavior object; a value of N means
088: * wakeup at the end of frame N, where the current frame is zero,
089: * a value of zero means wakeup at the end of the current frame.
090: *
091: * @param passive flag indicating whether this behavior is
092: * passive; a non-passive behavior will cause the rendering system
093: * to run continuously, while a passive behavior will only run
094: * when some other event causes a frame to be run.
095: *
096: * @exception IllegalArgumentException if frameCount is less than zero
097: *
098: * @since Java 3D 1.2
099: */
100: public WakeupOnElapsedFrames(int frameCount, boolean passive) {
101: if (frameCount < 0)
102: throw new IllegalArgumentException(J3dI18N
103: .getString("WakeupOnElapsedFrames0"));
104:
105: this .frameCount = frameCount;
106: this .passive = passive;
107: WakeupIndexedList.init(this , TOTAL_INDEXED_UNORDER_SET_TYPES);
108: }
109:
110: /**
111: * Retrieves the elapsed frame count that was used when
112: * constructing this object.
113: *
114: * @return the elapsed frame count specified when constructing
115: * this object
116: */
117: public int getElapsedFrameCount() {
118: return frameCount;
119: }
120:
121: /**
122: * Retrieves the state of the passive flag that was used when
123: * constructing this object.
124: *
125: * @return true if this wakeup criterion is passive, false otherwise
126: *
127: * @since Java 3D 1.2
128: */
129: public boolean isPassive() {
130: return passive;
131: }
132:
133: /**
134: * decrement the frame count, and set trigger if 0
135: */
136: void newFrame() {
137: if (this .countdown == 0) {
138: this .setTriggered();
139: } else {
140: this .countdown--;
141: }
142: }
143:
144: /**
145: * This is a callback from BehaviorStructure. It is
146: * used to add wakeupCondition to behavior structure.
147: */
148: void addBehaviorCondition(BehaviorStructure bs) {
149: this .countdown = this .frameCount;
150: bs.wakeupOnElapsedFrames.add(this );
151: if (!passive && (behav != null) && behav.enable) {
152: bs.activeWakeupOnFrameCount++;
153: }
154:
155: // This is necessary to invoke this condition next time
156: // Otherwise jftc won't work for static scene.
157: VirtualUniverse.mc.sendRunMessage(bs.universe,
158: J3dThread.UPDATE_BEHAVIOR);
159: }
160:
161: /**
162: * This is a callback from BehaviorStructure. It is
163: * used to remove wakeupCondition from behavior structure.
164: */
165: void removeBehaviorCondition(BehaviorStructure bs) {
166: bs.wakeupOnElapsedFrames.remove(this );
167: if (!passive && (behav != null) && behav.enable) {
168: bs.activeWakeupOnFrameCount--;
169: }
170: }
171:
172: /**
173: * Perform task in addBehaviorCondition() that has to be
174: * set every time the condition met.
175: */
176: void resetBehaviorCondition(BehaviorStructure bs) {
177: this.countdown = this.frameCount;
178: }
179:
180: }
|