<?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 content='EventUtilityExamples.x3d' name='title'/>
    <meta content='Event utility node examples for boolean filtering and other event utility nodes.' name='description'/>
    <meta content='Don Brutzman' name='creator'/>
    <meta content='3 November 2002' name='created'/>
    <meta content='20 January 2020' name='modified'/>
    <meta content='BooleanFilter BooleanToggle BooleanTrigger IntegerTrigger TimeTrigger' name='subject'/>
    <meta content='https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamples.x3d' name='identifier'/>
    <meta content='X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit' name='generator'/>
    <meta content='../license.html' name='license'/>
  </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 appinfo='BooleanFilter selectively passes true false or negated events.' name='BooleanFilter' 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 accessType='inputOnly' appinfo='set_boolean is the input value to be filtered.' name='set_boolean' type='SFBool'/>
      <field accessType='outputOnly' appinfo='inputTrue only passes a true value when set_boolean input is true.' name='inputTrue' type='SFBool'/>
      <field accessType='outputOnly' appinfo='inputFalse only passes a false value when set_boolean is false.' name='inputFalse' type='SFBool'/>
      <field accessType='outputOnly' appinfo='inputNegate provides opposite value by negating set_boolean input.' name='inputNegate' type='SFBool'/>
    </ExternProtoDeclare>
    <!-- ======================================== -->
    <ExternProtoDeclare appinfo='BooleanToggle maintains state and negates output when a true input is provided.' name='BooleanToggle' 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 accessType='inputOnly' appinfo='If set_boolean input is true toggle state.' name='set_boolean' type='SFBool'/>
      <field accessType='inputOnly' appinfo='Reset persistent state value.' name='set_toggle' type='SFBool'/>
      <field accessType='initializeOnly' appinfo='Persistent state value that gets toggled or reset.' name='toggle' type='SFBool'/>
      <field accessType='outputOnly' appinfo='Output toggled persistent state value.' name='toggle_changed' type='SFBool'/>
      <!-- warning: toggle depends on exposedField functionality in Script node, not compatible with VRML 97. implemented as inputOnly/initializeOnly/outputOnly triplet. -->
    </ExternProtoDeclare>
    <!-- ======================================== -->
    <ExternProtoDeclare appinfo='BooleanTrigger converts time events to boolean true events.' name='BooleanTrigger' 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 accessType='inputOnly' appinfo='set_triggerTime provides input time event typical event sent is TouchSensor touchTime.' name='set_triggerTime' type='SFTime'/>
      <field accessType='outputOnly' appinfo='triggerTrue outputs a true value whenever a triggerTime event is received.' name='triggerTrue' type='SFBool'/>
    </ExternProtoDeclare>
    <!-- ======================================== -->
    <ExternProtoDeclare appinfo='IntegerTrigger converts boolean true or time input events to integer value (suitable for Switch node).' name='IntegerTrigger' 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 accessType='inputOnly' appinfo='If set_boolean input is true trigger output of integer value.' name='set_boolean' type='SFBool'/>
      <field accessType='inputOnly' appinfo='Resets value used for output when triggered later.' name='set_integerKey' type='SFInt32'/>
      <field accessType='inputOutput' appinfo='integerKey is value for output when triggered.' name='integerKey' type='SFInt32'/>
      <field accessType='outputOnly' appinfo='Reports change in integerKey value.' name='integerKey_changed' type='SFInt32'/>
      <field accessType='outputOnly' appinfo='triggerValue provides integer event output matching integerKey when true set_boolean received.' name='triggerValue' type='SFInt32'/>
    </ExternProtoDeclare>
    <!-- ======================================== -->
    <ExternProtoDeclare appinfo='TimeTrigger converts boolean true events to time events.' name='TimeTrigger' 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 accessType='inputOnly' appinfo='If set_boolean input is true trigger output time value.' name='set_boolean' type='SFBool'/>
      <field accessType='outputOnly' appinfo='triggerTime is output time event sent when set_boolean input is true.' name='triggerTime' type='SFTime'/>
    </ExternProtoDeclare>
    <!-- ======================================== -->
    <Group>
      <Transform translation='0 3 0'>
        <Anchor description='Click for BooleanFilter example' parameter='"target=_blank"' url='"../../Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "../../Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl" "https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl"'>
          <Shape>
            <Appearance>
              <Material diffuseColor='0.6 0.6 0.2'/>
            </Appearance>
            <Text string='"BooleanFilter example"'>
              <FontStyle DEF='TextFont' justify='"MIDDLE" "MIDDLE"' size='0.8' style='BOLD'/>
            </Text>
          </Shape>
        </Anchor>
      </Transform>
      <Transform translation='0 1.5 0'>
        <Anchor description='Click for BooleanToggle example' parameter='"target=_blank"' url='"../../Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "../../Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl" "https://www.web3d.org/x3d/content/examples/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 example' parameter='"target=_blank"' url='"../../Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d" "../../Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl" "https://www.web3d.org/x3d/content/examples/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 example' parameter='"target=_blank"' url='"../../Savage/Tools/Animation/MaterialChoiceExample.x3d" "https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/MaterialChoiceExample.x3d" "../../Savage/Tools/Animation/MaterialChoiceExample.wrl" "https://www.web3d.org/x3d/content/examples/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>
      <Transform DEF='TimeTriggerTransform' translation='0 -3 0'>
        <TouchSensor DEF='TimeTriggerTouchSensor' description='Click forTimeTrigger example'/>
        <Shape>
          <Appearance>
            <Material diffuseColor='0.6 0.6 0.2'/>
          </Appearance>
          <Text string='"TimeTrigger example"'>
            <FontStyle USE='TextFont'/>
          </Text>
        </Shape>
      </Transform>
      <TimeTrigger DEF='TimeTriggerNode'/>
      <TimeSensor DEF='TimeTriggerTimeSensor' cycleInterval='2'/>
      <OrientationInterpolator DEF='TimeTriggerOrientationInterpolator' key='0 0.5 1' keyValue='0 1 0 0 0 1 0 3.14159 0 1 0 6.2432'/>
      <ROUTE fromField='isActive' fromNode='TimeTriggerTouchSensor' toField='set_boolean' toNode='TimeTriggerNode'/>
      <ROUTE fromField='triggerTime' fromNode='TimeTriggerNode' toField='startTime' toNode='TimeTriggerTimeSensor'/>
      <ROUTE fromField='fraction_changed' fromNode='TimeTriggerTimeSensor' toField='set_fraction' toNode='TimeTriggerOrientationInterpolator'/>
      <ROUTE fromField='value_changed' fromNode='TimeTriggerOrientationInterpolator' toField='set_rotation' toNode='TimeTriggerTransform'/>
    </Group>
  </Scene>
</X3D>