📄 behaviorstructure.java
字号:
if (triggeredVP != null) { boundsEntryList.add(w); } // we always trigger bound is inside during initialize if (needTrigger && (triggeredVP != null)) { w.triggeredVP = triggeredVP; w.setTriggered(); } } void removeVPExitCondition(WakeupOnViewPlatformExit w) { wakeupOnViewPlatformExit.remove(w); // don't remove boundsExitList, it is use next time // when addVPEntryCondition invoke to determine whether to // trigger an event or not. } void addVPExitCondition(WakeupOnViewPlatformExit w) { // Cleanup, since collideEntryList did not remove // its condition in removeVPEntryCondition boolean needTrigger = true; WakeupOnViewPlatformExit boundsExitArr[] = (WakeupOnViewPlatformExit []) boundsExitList.toArray(false); WakeupOnViewPlatformExit wexit; for (int i=boundsExitList.arraySize()-1; i>=0; i--) { wexit = boundsExitArr[i]; if ((wexit.behav == w.behav) && (wexit.region.equals(w.region))) { boundsExitList.remove(i); needTrigger = false; break; } } ViewPlatformRetained triggeredVP = intersectVPCenter(w.transformedRegion); wakeupOnViewPlatformExit.add(w); if (triggeredVP != null) { w.triggeredVP = triggeredVP; boundsExitList.add(w); } if (!needTrigger) { return; } // see if the matching wakeupOnViewPlatformEntry // condition exists WakeupOnViewPlatformEntry boundsEntryArr[] = (WakeupOnViewPlatformEntry []) boundsEntryList.toArray(false); WakeupOnViewPlatformEntry wentry; for (int i=boundsEntryList.arraySize()-1; i>=0; i--) { wentry = boundsEntryArr[i]; if ((wentry.behav == w.behav) && (wentry.region.equals(w.region))) { // Don't remove this since if user wakeupOr() // Entry and Exit condition together we may have trouble // boundsEntryList.remove(i); if (triggeredVP == null) { w.setTriggered(); } break; } } } void removeSensorEntryCondition(WakeupOnSensorEntry w) { wakeupOnSensorEntry.remove(w); // don't remove currentSensorEntryList, it is use next time // when addSensorExitCondition invoke to determine whether to // trigger an event or not. } void addSensorEntryCondition(WakeupOnSensorEntry w) { boolean needTrigger = true; // see if the matching wakeupOnSensorEntry // condition exists WakeupOnSensorEntry sensorEntryArr[] = (WakeupOnSensorEntry []) currentSensorEntryList.toArray(false); WakeupOnSensorEntry wentry; for (int i=currentSensorEntryList.arraySize()-1; i>=0; i--) { wentry = sensorEntryArr[i]; if ((wentry.behav == w.behav) && (wentry.region.equals(w.region))) { currentSensorEntryList.remove(i); needTrigger = false; break; } } wakeupOnSensorEntry.add(w); w.updateTransformRegion(); Sensor target = sensorIntersect(w.transformedRegion); if (target != null) { w.setTarget(target); currentSensorEntryList.add(w); } if (needTrigger && (target != null)) { w.setTriggered(); } VirtualUniverse.mc.sendRunMessage(universe, J3dThread.UPDATE_BEHAVIOR); } void removeSensorExitCondition(WakeupOnSensorExit w) { wakeupOnSensorExit.remove(w); // don't remove currentSensorExitList, it is use next time // when addSensorEntryCondition invoke to determine whether to // trigger an event or not } void addSensorExitCondition(WakeupOnSensorExit w) { // Cleanup boolean needTrigger = true; WakeupOnSensorExit currentSensorExitArr[] = (WakeupOnSensorExit []) currentSensorExitList.toArray(false); WakeupOnSensorExit wexit; for (int i=currentSensorExitList.arraySize()-1; i>=0; i--) { wexit = currentSensorExitArr[i]; if ((wexit.behav == w.behav) && (wexit.region.equals(w.region))) { currentSensorExitList.remove(i); needTrigger = false; break; } } w.updateTransformRegion(); Sensor target = sensorIntersect(w.transformedRegion); wakeupOnSensorExit.add(w); if (target != null) { w.setTarget(target); currentSensorExitList.add(w); } if (!needTrigger) { return; } // see if the matching wakeupOnSensorEntry // condition exists WakeupOnSensorEntry sensorEntryArr[] = (WakeupOnSensorEntry []) currentSensorEntryList.toArray(false); WakeupOnSensorEntry wentry; for (int i=currentSensorEntryList.arraySize()-1; i>=0; i--) { wentry = sensorEntryArr[i]; if ((wentry.behav == w.behav) && (wentry.region.equals(w.region))) { // No need to invoke currentSensorEntryList.remove(i); if (target == null) { w.setTriggered(); } break; } } VirtualUniverse.mc.sendRunMessage(universe, J3dThread.UPDATE_BEHAVIOR); } void processConditionMet(BehaviorRetained behav, Boolean checkSchedulingRegion) { // Since we reuse wakeup condition, the old wakeupCondition // will not reactivate again while processStimulus is running // which may set another wakeupCondition. // Previously we don't reuse wakeupCondition and cleanTree() // everytime before calling processStimulus() so the flag // inCallback is not necessary to check. if (!behav.inCallback && ((checkSchedulingRegion == Boolean.FALSE) || behav.active)) { processList[behav.schedulingInterval].add(behav); } else { if (((behav.wakeupMask & BehaviorRetained.WAKEUP_TIME) != 0) && (behav.source != null) && (behav.source.isLive()) && (behav.wakeupCondition != null)) { // need to add back wakeupOnElapsedTime condition // to TimerThread behav.wakeupCondition.reInsertElapseTimeCond(); } } } final void processBehXformChanged(UnorderList arrList) { BehaviorRetained beh; Object[] nodes, nodesArr; int size = arrList.size(); nodesArr = arrList.toArray(false); for (int i = 0; i < size; i++) { nodes = (Object[])nodesArr[i]; for (int j=0; j<nodes.length; j++) { beh = (BehaviorRetained)nodes[j]; beh.updateTransformRegion(); processBehaviorTransform(beh); } } } final void processVpfXformChanged(UnorderList arrList) { ViewPlatformRetained vpf; Object[] nodes, nodesArr; int size = arrList.size(); nodesArr = arrList.toArray(false); for (int i = 0; i < size; i++) { nodes = (Object[])nodesArr[i]; for (int j=0; j<nodes.length; j++) { processViewPlatformTransform((ViewPlatformRetained)nodes[j]); } } } final void processTransformChanged(Object leaf[]) { Object node; int i; // We have to process them in group rather then one by one, // otherwise we may have both activation/deactivation // conditions wakeup at the same time when both ViewPlatform // and Behavior transform under a branch. // Update transformRegion first for (i=0; i < leaf.length; i++) { node = leaf[i]; if (node instanceof BehaviorRetained) { ((BehaviorRetained) node).updateTransformRegion(); processBehaviorTransform((BehaviorRetained) node); } else if (node instanceof ViewPlatformRetained) { ((ViewPlatformRetained) node).updateTransformRegion(); transformViewPlatformList.add(node); } } // finally handle ViewPlatformRetained Transform change if (transformViewPlatformList.size() > 0) { ViewPlatformRetained vpArr[] = (ViewPlatformRetained []) transformViewPlatformList.toArray(false); int size = transformViewPlatformList.arraySize(); for (i=0; i < size; i++) { processViewPlatformTransform((ViewPlatformRetained) vpArr[i]); } transformViewPlatformList.clear(); } } // assume behav.updateTransformRegion() invoke before final void processBehaviorTransform(BehaviorRetained behav) { if ((behav.wakeupMask & BehaviorRetained.WAKEUP_VP_ENTRY) != 0) { updateVPEntryTransformRegion(behav); } if ((behav.wakeupMask & BehaviorRetained.WAKEUP_VP_EXIT) != 0) { updateVPExitTransformRegion(behav); } if (behav.active) { if (!intersectVPRegion(behav.transformedRegion)) { removeFromScheduleList(behav); } } else { addToScheduleList(behav); } } void processViewPlatformTransform(ViewPlatformRetained vp) { int i; BehaviorRetained behav; vp.updateTransformRegion(); if (!vp.isActiveViewPlatform()) { return; } BehaviorRetained behavArr[] = (BehaviorRetained []) behaviors.toArray(false); // re-evaulate all behaviors affected by this vp for (i=behaviors.arraySize()-1; i>=0; i--) { behav = behavArr[i]; if (behav.active) { if (!intersectVPRegion(behav.transformedRegion)) { removeFromScheduleList(behav); } } else { addToScheduleList(behav); } } // handle wakeupOnViewPlatformEntry WakeupOnViewPlatformEntry wakeupOnViewPlatformEntryArr[] = (WakeupOnViewPlatformEntry []) wakeupOnViewPlatformEntry.toArray(false); WakeupOnViewPlatformEntry wentry; int idx; ViewPlatformRetained triggeredVP; for (i=wakeupOnViewPlatformEntry.arraySize()-1; i >=0; i--) { wentry = wakeupOnViewPlatformEntryArr[i]; idx = boundsEntryList.indexOf(wentry); if (idx < 0) { if (wentry.transformedRegion.intersect(vp.center)) { boundsEntryList.add(wentry); wentry.triggeredVP = vp; wentry.setTriggered(); } } else { triggeredVP = intersectVPCenter(wentry.transformedRegion); if (triggeredVP == null) { boundsEntryList.remove(idx); } } } // handle wakeupOnViewPlatformExit; WakeupOnViewPlatformExit wakeupOnViewPlatformExitArr[] = (WakeupOnViewPlatformExit []) wakeupOnViewPlatformExit.toArray(false); WakeupOnViewPlatformExit wexit; for (i=wakeupOnViewPlatformExit.arraySize()-1; i >=0; i--) { wexit = wakeupOnViewPlatformExitArr[i]; idx = boundsExitList.indexOf(wexit); if (idx < 0) { if (wexit.transformedRegion.intersect(vp.center)) { wexit.triggeredVP = vp; boundsExitList.add(wexit); } } else { triggeredVP = intersectVPCenter(wexit.transformedRegion); if (triggeredVP == null) { boundsExitList.remove(idx); wexit.setTriggered(); } } } } void updateVPEntryTransformRegion(BehaviorRetained behav) { WakeupOnViewPlatformEntry wakeupOnViewPlatformEntryArr[] = (WakeupOnViewPlatformEntry []) wakeupOnViewPlatformEntry.toArray(false); WakeupOnViewPlatformEntry wentry; ViewPlatformRetained triggeredVP; for (int i=wakeupOnViewPlatformEntry.arraySize()-1; i >=0; i--) { wentry = wakeupOnViewPlatformEntryArr[i]; if (wentry.behav == behav) { wentry.updateTransformRegion(behav); int idx = boundsEntryList.indexOf(wentry); triggeredVP = intersectVPCenter(wentry.transformedRegion); if (triggeredVP != null) { if (idx < 0) { boundsEntryList.add(wentry); wentry.triggeredVP = triggeredVP; wentry.setTriggered(); } } else { if (idx >=0) { boundsEntryList.remove(idx); } } } } } void updateVPExitTransformRegion(BehaviorRetained behav) { WakeupOnViewPlatformExit wakeupOnViewPlatformExitArr[] = (WakeupOnViewPlatformExit []) wakeupOnViewPlatformExit.toArray(false); WakeupOnViewPlatformExit wexit; ViewPlatformRetained triggeredVP; for (int i=wakeupOnViewPlatformExit.arraySize()-1; i >=0; i--) { wexit = wakeupOnViewPlatformExitArr[i]; if (wexit.behav == behav) { wexit.updateTransformRegion(behav); wexit = wakeupOnViewPlatformExitArr[i]; int idx = boundsExitList.indexOf(wexit); triggeredVP = intersectVPCenter(wexit.transformedRegion); if (triggeredVP != null) { if (idx < 0) { wexit.triggeredVP = triggeredVP; boundsExitList.add(wexit); } } else { if (idx >= 0) { boundsExitList.remove(idx); wexit.setTriggered(); } } } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -