summaryrefslogtreecommitdiffstats
path: root/src/javax/media/j3d/WakeupOnElapsedFrames.java
blob: cb596a4f676835141312b98d88183f66079b142d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/*
 * Copyright 1997-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;

/**
 * Class specifying a wakeup when a specific number of frames have
 * elapsed.  The wakeup criterion can either be passive or
 * non-passive.  If any behavior uses a non-passive
 * WakeupOnElapsedFrames, the rendering system will run continuously.
 *
 * <p>
 * In general, applications cannot count on behavior execution being
 * synchronized with rendering.  Behaviors that use
 * WakeupOnElapsedFrames with a frame count of 0 are an exception to
 * this general rule.  Such behaviors will be executed every frame.
 * Further, all modifications to scene graph objects (not including
 * geometry by-reference or texture by-reference) made from the
 * <code>processStimulus</code> methods of such behaviors are
 * guaranteed to take effect in the same rendering frame.
 */
public final class WakeupOnElapsedFrames extends WakeupCriterion {

    // different types of WakeupIndexedList that use in BehaviorStructure
    static final int COND_IN_BS_LIST = 0;

    // total number of different IndexedUnorderedSet types
    static final int TOTAL_INDEXED_UNORDER_SET_TYPES = 1;

    // Indicates whether the wakeup condition is passive or
    // non-passive.  Only behaviors using a non-passive
    // WakeupOnElapsedFrames will force a continuous traversal.
    boolean passive;

    // Number of frames before wakeup
    int frameCount;

    // When this reaches 0, this criterion is met.
    int countdown;

    /**
     * Constructs a non-passive WakeupOnElapsedFrames criterion.
     *
     * @param frameCount the number of frames that Java 3D should draw
     * before awakening this behavior object; a value of N means
     * wakeup at the end of frame N, where the current frame is zero,
     * a value of zero means wakeup at the end of the current frame.
     *
     * @exception IllegalArgumentException if frameCount is less than zero
     */
    public WakeupOnElapsedFrames(int frameCount) {
	this(frameCount, false);
    }

    /**
     * Constructs a WakeupOnElapsedFrames criterion.
     *
     * @param frameCount the number of frames that Java 3D should draw
     * before awakening this behavior object; a value of N means
     * wakeup at the end of frame N, where the current frame is zero,
     * a value of zero means wakeup at the end of the current frame.
     *
     * @param passive flag indicating whether this behavior is
     * passive; a non-passive behavior will cause the rendering system
     * to run continuously, while a passive behavior will only run
     * when some other event causes a frame to be run.
     *
     * @exception IllegalArgumentException if frameCount is less than zero
     *
     * @since Java 3D 1.2
     */
    public WakeupOnElapsedFrames(int frameCount, boolean passive) {
	if (frameCount < 0)
	    throw new IllegalArgumentException(J3dI18N.getString("WakeupOnElapsedFrames0"));

	this.frameCount = frameCount;
	this.passive = passive;
	WakeupIndexedList.init(this, TOTAL_INDEXED_UNORDER_SET_TYPES);
    }

    /**
     * Retrieves the elapsed frame count that was used when
     * constructing this object.
     *
     * @return the elapsed frame count specified when constructing
     * this object
     */
    public int getElapsedFrameCount() {
	return frameCount;
    }

    /**
     * Retrieves the state of the passive flag that was used when
     * constructing this object.
     *
     * @return true if this wakeup criterion is passive, false otherwise
     *
     * @since Java 3D 1.2
     */
    public boolean isPassive() {
	return passive;
    }

    /**
     * decrement the frame count, and set trigger if 0
     */
    void newFrame() {
	if (this.countdown == 0) {
	    this.setTriggered();
	} else {
	    this.countdown--;
	}
    }



    /**
     * This is a callback from BehaviorStructure. It is
     * used to add wakeupCondition to behavior structure.
     */
    @Override
    void addBehaviorCondition(BehaviorStructure bs) {
	this.countdown = this.frameCount;
	bs.wakeupOnElapsedFrames.add(this);
	if (!passive && (behav != null) && behav.enable) {
	    bs.activeWakeupOnFrameCount++;
	}

	// This is necessary to invoke this condition next time
	// Otherwise jftc won't work for static scene.
	VirtualUniverse.mc.sendRunMessage(bs.universe,
					  J3dThread.UPDATE_BEHAVIOR);
    }


    /**
     * This is a callback from BehaviorStructure. It is
     * used to remove wakeupCondition from behavior structure.
     */
    @Override
    void removeBehaviorCondition(BehaviorStructure bs) {
	bs.wakeupOnElapsedFrames.remove(this);
	if (!passive && (behav != null) && behav.enable) {
	    bs.activeWakeupOnFrameCount--;
	}
    }


    /**
     * Perform task in addBehaviorCondition() that has to be
     * set every time the condition met.
     */
    @Override
    void resetBehaviorCondition(BehaviorStructure bs) {
	this.countdown = this.frameCount;
    }

}