001: /*
002: * $RCSfile: WakeupCondition.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.6 $
028: * $Date: 2008/02/28 20:17:33 $
029: * $State: Exp $
030: */
031:
032: package javax.media.j3d;
033:
034: import java.util.Enumeration;
035:
036: /**
037: * An abstract class specifying a single wakeup Condition. This class
038: * is extended by the WakeupCriterion, WakeupOr, WakeupAnd,
039: * WakeupOrOfAnds, and WakeupAndOfOr classes. A Behavior node hands a
040: * WakeupCondition object to the behavior scheduler and the behavior
041: * scheduler hands back an enumeration of that WakeupCondition.
042: */
043:
044: public abstract class WakeupCondition extends Object {
045:
046: static final int ALL_ELEMENTS = 0;
047: static final int TRIGGERED_ELEMENTS = 1;
048:
049: /**
050: * This boolean indicates whether this condition has been fully met.
051: */
052: boolean conditionMet = false;
053:
054: /**
055: * This points to the parent of this criterion in the AndOr tree
056: */
057: WakeupCondition parent = null;
058:
059: /**
060: * The location of this criterion in the parents array.
061: */
062: int id;
063:
064: /**
065: * The BehaviorRetained node that is using this condition
066: */
067: BehaviorRetained behav = null;
068:
069: /**
070: * This is the allElements enumerator
071: */
072: WakeupCriteriaEnumerator allEnum = null;
073:
074: /**
075: * This is the triggeredElements enumerator
076: */
077: WakeupCriteriaEnumerator trigEnum = null;
078:
079: // Use in WakeupIndexedList
080: int listIdx[][];
081:
082: /**
083: * Returns an enumeration of all WakeupCriterias in this Condition.
084: */
085: public Enumeration allElements() {
086: if (allEnum == null) {
087: allEnum = new WakeupCriteriaEnumerator(this , ALL_ELEMENTS);
088: } else {
089: allEnum.reset(this , ALL_ELEMENTS);
090: }
091: return allEnum;
092: }
093:
094: /**
095: * Returns an enumeration of all triggered WakeupCriterias in this Condition.
096: */
097: public Enumeration triggeredElements() {
098: if (trigEnum == null) {
099: trigEnum = new WakeupCriteriaEnumerator(this ,
100: TRIGGERED_ELEMENTS);
101: } else {
102: trigEnum.reset(this , TRIGGERED_ELEMENTS);
103: }
104: return trigEnum;
105: }
106:
107: /**
108: * this sets the conditionMet flag.
109: */
110: void setConditionMet(int id, Boolean checkSchedulingRegion) {
111:
112: if (!conditionMet) {
113: conditionMet = true;
114: J3dMessage message = new J3dMessage();
115: message.type = J3dMessage.COND_MET;
116: message.threads = J3dThread.UPDATE_BEHAVIOR;
117: message.universe = behav.universe;
118: message.args[0] = behav;
119: message.args[1] = checkSchedulingRegion;
120: message.args[2] = this ;
121: VirtualUniverse.mc.processMessage(message);
122: }
123: }
124:
125: /**
126: * Initialize And/Or tree and add criterion to the BehaviourStructure
127: */
128: void buildTree(WakeupCondition parent, int id, BehaviorRetained b) {
129: this .parent = parent;
130: this .behav = b;
131: this .id = id;
132: conditionMet = false;
133: }
134:
135: /**
136: * This goes through the AndOr tree to remove the various criterion from the
137: * BehaviorStructure.
138: * We can't use behav.universe.behaviorStructure since behav
139: * may reassign to another universe at this time.
140: */
141: void cleanTree(BehaviorStructure bs) {
142: conditionMet = false;
143: }
144:
145: void reInsertElapseTimeCond() {
146: conditionMet = false;
147: }
148:
149: void resetTree() {
150: conditionMet = false;
151: }
152: }
|