<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D profile='Immersive'  version='3.0 xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation =' https://www.web3d.org/specifications/x3d-3.0.xsd ' >
<head>
<meta name='titlecontent=' EventUtilityExamples.x3d '/>
<meta name='descriptioncontent='Event utility node examples for boolean filtering and other event utility nodes.'/>
<meta name='creatorcontent='Don Brutzman'/>
<meta name='createdcontent='3 November 2002'/>
<meta name='modifiedcontent='20 January 2020'/>
<meta name='subjectcontent='BooleanFilter BooleanToggle BooleanTrigger IntegerTrigger TimeTrigger'/>
<meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamples.x3d '/>
<meta name='generatorcontent='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit'/>
<meta name='licensecontent=' ../license.html'/>
</head>
<!-- -->
<Scene>
<!-- ======================================== -->
<!-- ExternProtoDeclare definitions are used here only for language development - do not copy into other scenes! -->
<!-- ExternProtoDeclare node support is provided either by X3D-compliant browser or X3dToVrml97.xslt ExternProtoDeclare definitions. -->
<!-- ======================================== -->
<WorldInfo title='EventUtilityExamples.x3d'/>
<ExternProtoDeclare name='BooleanFilterappinfo='BooleanFilter selectively passes true false or negated events.'
  url=' "EventUtilityPrototypes.x3d#BooleanFilter" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#BooleanFilter" "EventUtilityPrototypes.wrl#BooleanFilter" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#BooleanFilter" ' >
<field name='set_booleantype='SFBoolaccessType='inputOnly'
 appinfo='set_boolean is the input value to be filtered.' />

<field name='inputTruetype='SFBoolaccessType='outputOnly'
 appinfo='inputTrue only passes a true value when set_boolean input is true.' />

<field name='inputFalsetype='SFBoolaccessType='outputOnly'
 appinfo='inputFalse only passes a false value when set_boolean is false.' />

<field name='inputNegatetype='SFBoolaccessType='outputOnly'
 appinfo='inputNegate provides opposite value by negating set_boolean input.' />
</ExternProtoDeclare>
<!-- ======================================== -->
<ExternProtoDeclare name='BooleanToggleappinfo='BooleanToggle maintains state and negates output when a true input is provided.'
  url=' "EventUtilityPrototypes.x3d#BooleanToggle" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#BooleanToggle" "EventUtilityPrototypes.wrl#BooleanToggle" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#BooleanToggle" ' >
<field name='set_booleantype='SFBoolaccessType='inputOnly'
 appinfo='If set_boolean input is true toggle state.' />

<field name='set_toggletype='SFBoolaccessType='inputOnly'
 appinfo='Reset persistent state value.' />

<field name='toggletype='SFBoolaccessType='initializeOnly'
 appinfo='Persistent state value that gets toggled or reset.' />

<field name='toggle_changedtype='SFBoolaccessType='outputOnly'
 appinfo='Output toggled persistent state value.' />

<!-- warning: toggle depends on exposedField functionality in Script node, not compatible with VRML 97. implemented as inputOnly/initializeOnly/outputOnly triplet. -->
</ExternProtoDeclare>
<!-- ======================================== -->
<ExternProtoDeclare name='BooleanTriggerappinfo='BooleanTrigger converts time events to boolean true events.'
  url=' "EventUtilityPrototypes.x3d#BooleanTrigger" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#BooleanTrigger" "EventUtilityPrototypes.wrl#BooleanTrigger" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#BooleanTrigger" ' >
<field name='set_triggerTimetype='SFTimeaccessType='inputOnly'
 appinfo='set_triggerTime provides input time event typical event sent is TouchSensor touchTime.' />

<field name='triggerTruetype='SFBoolaccessType='outputOnly'
 appinfo='triggerTrue outputs a true value whenever a triggerTime event is received.' />
</ExternProtoDeclare>
<!-- ======================================== -->
<ExternProtoDeclare name='IntegerTriggerappinfo='IntegerTrigger converts boolean true or time input events to integer value (suitable for Switch node).'
  url=' "EventUtilityPrototypes.x3d#IntegerTrigger" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#IntegerTrigger" "EventUtilityPrototypes.wrl#IntegerTrigger" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#IntegerTrigger" ' >
<field name='set_booleantype='SFBoolaccessType='inputOnly'
 appinfo='If set_boolean input is true trigger output of integer value.' />

<field name='set_integerKeytype='SFInt32accessType='inputOnly'
 appinfo='Resets value used for output when triggered later.' />

<field name='integerKeytype='SFInt32accessType='inputOutput'
 appinfo='integerKey is value for output when triggered.' />

<field name='integerKey_changedtype='SFInt32accessType='outputOnly'
 appinfo='Reports change in integerKey value.' />

<field name='triggerValuetype='SFInt32accessType='outputOnly'
 appinfo='triggerValue provides integer event output matching integerKey when true set_boolean received.' />
</ExternProtoDeclare>
<!-- ======================================== -->
<ExternProtoDeclare name='TimeTriggerappinfo='TimeTrigger converts boolean true events to time events.'
  url=' "EventUtilityPrototypes.x3d#TimeTrigger" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#TimeTrigger" "EventUtilityPrototypes.wrl#TimeTrigger" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#TimeTrigger" ' >
<field name='set_booleantype='SFBoolaccessType='inputOnly'
 appinfo='If set_boolean input is true trigger output time value.' />

<field name='triggerTimetype='SFTimeaccessType='outputOnly'
 appinfo='triggerTime is output time event sent when set_boolean input is true.' />
</ExternProtoDeclare>
<!-- ======================================== -->
<Group>
<Transform translation='0 3 0'>
<Anchor description='Click for BooleanFilter exampleparameter='"target=_blank"'
  url=' "../../Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "https://savage.nps.edu/Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "../../Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl" "https://savage.nps.edu/Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl" ' >
<Shape>
<Appearance>
<Material diffuseColor='0.6 0.6 0.2'/>
</Appearance>
<Text string='"BooleanFilter example"'>
<FontStyle DEF='TextFontjustify='"MIDDLE" "MIDDLE"size='0.8style='BOLD'/>
</Text>
</Shape>
</Anchor>
</Transform>
<Transform translation='0 1.5 0'>
<Anchor description='Click for BooleanToggle exampleparameter='"target=_blank"'
  url=' "../../Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "https://savage.nps.edu/Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "../../Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl" "https://savage.nps.edu/Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl" ' >
<Shape>
<Appearance>
<Material diffuseColor='0.6 0.6 0.2'/>
</Appearance>
<Text string='"BooleanToggle example"'>
<FontStyle USE=' TextFont'/>
</Text>
</Shape>
</Anchor>
</Transform>
<Transform>
<Anchor description='Click for BooleanTrigger exampleparameter='"target=_blank"'
  url=' "../../Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "https://savage.nps.edu/Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "../../Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl" "https://savage.nps.edu/Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl" ' >
<Shape>
<Appearance>
<Material diffuseColor='0.6 0.6 0.2'/>
</Appearance>
<Text string='"BooleanTrigger example"'>
<FontStyle USE=' TextFont'/>
</Text>
</Shape>
</Anchor>
</Transform>
<Transform translation='0 -1.5 0'>
<Anchor description='Click for IntegerTrigger exampleparameter='"target=_blank"'
  url=' "../../Savage/Tools/Animation/MaterialChoiceExample.x3d" "https://savage.nps.edu/Savage/Tools/Animation/MaterialChoiceExample.x3d" "../../Savage/Tools/Animation/MaterialChoiceExample.wrl" "https://savage.nps.edu/Savage/Tools/Animation/MaterialChoiceExample.wrl" ' >
<Shape>
<Appearance>
<Material diffuseColor='0.6 0.6 0.2'/>
</Appearance>
<Text string='"IntegerTrigger example"'>
<FontStyle USE=' TextFont'/>
</Text>
</Shape>
</Anchor>
</Transform>
<!-- ROUTE information for TimeTriggerTransform node:  [from TimeTriggerOrientationInterpolator.value_changed to set_rotation ] -->
<Transform DEF='TimeTriggerTransformtranslation='0 -3 0'>
<!-- ROUTE information for TimeTriggerTouchSensor node:  [from isActive to TimeTriggerNode.set_boolean ] -->
<TouchSensor DEF='TimeTriggerTouchSensordescription='Click forTimeTrigger example'/>

<Shape>
<Appearance>
<Material diffuseColor='0.6 0.6 0.2'/>
</Appearance>
<Text string='"TimeTrigger example"'>
<FontStyle USE=' TextFont'/>
</Text>
</Shape>
</Transform>
<!-- ROUTE information for TimeTriggerNode node:  [from TimeTriggerTouchSensor.isActive to set_boolean ] [from triggerTime to TimeTriggerTimeSensor.startTime ] -->
<TimeTrigger DEF='TimeTriggerNode'/>

<!-- ROUTE information for TimeTriggerTimeSensor node:  [from TimeTriggerNode.triggerTime to startTime ] [from fraction_changed to TimeTriggerOrientationInterpolator.set_fraction ] -->
<TimeSensor DEF='TimeTriggerTimeSensorcycleInterval='2'/>

<!-- ROUTE information for TimeTriggerOrientationInterpolator node:  [from TimeTriggerTimeSensor.fraction_changed to set_fraction ] [from value_changed to TimeTriggerTransform.set_rotation ] -->
<OrientationInterpolator DEF='TimeTriggerOrientationInterpolatorkey='0 0.5 1keyValue='0 1 0 0 0 1 0 3.14159 0 1 0 6.2432'/>

< ROUTE  fromNode=' TimeTriggerTouchSensor' fromField='isActive' toNode=' TimeTriggerNode' toField='set_boolean'/>
< ROUTE  fromNode=' TimeTriggerNode' fromField='triggerTime' toNode=' TimeTriggerTimeSensor' toField='startTime'/>
< ROUTE  fromNode=' TimeTriggerTimeSensor' fromField='fraction_changed' toNode=' TimeTriggerOrientationInterpolator' toField='set_fraction'/>
< ROUTE  fromNode=' TimeTriggerOrientationInterpolator' fromField='value_changed' toNode=' TimeTriggerTransform' toField='set_rotation'/>
</Group>
</Scene>
</X3D>
<!--

to top <!-- Event Graph ROUTE Table shows event connections -->
 
<!-- Index for DEF nodes: TextFont, TimeTriggerNode, TimeTriggerOrientationInterpolator, TimeTriggerTimeSensor, TimeTriggerTouchSensor, TimeTriggerTransform Index for ExternProtoDeclare definitions: BooleanFilter, BooleanToggle, BooleanTrigger, IntegerTrigger, TimeTrigger
-->

Event Graph ROUTE Table entries with 4 ROUTE connections total, showing X3D event-model relationships for this scene.

Each row shows an event cascade that may occur during a single timestamp interval between frame renderings, as part of the X3D execution model.

TimeTriggerTouchSensor
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
TimeTriggerNode
TimeTrigger
set_boolean
SFBool

 
 
then
TimeTriggerNode
TimeTrigger
triggerTime
SFTime

ROUTE
event to
(2)
TimeTriggerTimeSensor
TimeSensor
startTime
SFTime

 
 
then
TimeTriggerTimeSensor
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(3)
TimeTriggerOrientationInterpolator
OrientationInterpolator
set_fraction
SFFloat

 
 
then
TimeTriggerOrientationInterpolator
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(4)
TimeTriggerTransform
Transform
set_rotation
SFRotation



-->

<!-- Online at
https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamplesIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamples.x3d -->

<!-- Color legend: X3D terminology <X3dNode DEF='idName' field='value'/> matches XML terminology <XmlElement DEF='idName' attribute='value'/>
(Light-blue background: event-based behavior node or statement) (Grey background inside box: inserted documentation) (Magenta background: X3D Extensibility)
    <ProtoDeclare name='ProtoName'> <field name='fieldName'/> </ProtoDeclare> -->

to top <!-- For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources, and X3D Scene Authoring Hints. -->