<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://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='http://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='6 September 2010' name='modified'/>
    <meta content='BooleanFilter BooleanToggle BooleanTrigger IntegerTrigger TimeTrigger' name='subject'/>
    <meta content='http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamples.x3d' name='identifier'/>
    <meta content='X3D-Edit 3.2, https://savage.nps.edu/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. -->
    <!-- ======================================== -->
    <ExternProtoDeclare appinfo='Selectively pass only true or false events.' name='BooleanFilter' url='"EventUtilityPrototypes.wrl#BooleanFilter" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#BooleanFilter" "EventUtilityPrototypes.x3d#BooleanFilter" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#BooleanFilter"'>
      <field accessType='inputOnly' name='set_boolean' type='SFBool'/>
      <field accessType='outputOnly' name='inputTrue' type='SFBool'/>
      <field accessType='outputOnly' name='inputFalse' type='SFBool'/>
      <field accessType='outputOnly' name='inputNegate' type='SFBool'/>
    </ExternProtoDeclare>
    <!-- ======================================== -->
    <ExternProtoDeclare appinfo='Negate or reset prior boolean state output result.' name='BooleanToggle' url='"EventUtilityPrototypes.wrl#BooleanToggle" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#BooleanToggle" "EventUtilityPrototypes.x3d#BooleanToggle" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#BooleanToggle"'>
      <!-- warning: toggle depends on exposedField functionality in Script node, not compatible with VRML 97. implemented as inputOnly/initializeOnly/outputOnly triplet. -->
      <field accessType='inputOnly' name='set_boolean' type='SFBool'/>
      <field accessType='inputOnly' name='set_toggle' type='SFBool'/>
      <field accessType='inputOutput' name='toggle' type='SFBool'/>
      <field accessType='outputOnly' name='toggle_changed' type='SFBool'/>
    </ExternProtoDeclare>
    <!-- ======================================== -->
    <ExternProtoDeclare appinfo='Convert time events to boolean true events.' name='BooleanTrigger' url='"EventUtilityPrototypes.wrl#BooleanTrigger" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#BooleanTrigger" "EventUtilityPrototypes.x3d#BooleanTrigger" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#BooleanTrigger"'>
      <field accessType='inputOnly' name='set_triggerTime' type='SFTime'/>
      <field accessType='outputOnly' name='triggerTrue' type='SFBool'/>
    </ExternProtoDeclare>
    <!-- ======================================== -->
    <ExternProtoDeclare appinfo='Convert boolean true or time input events to integer value (suitable for Switch node).' name='IntegerTrigger' url='"EventUtilityPrototypes.wrl#IntegerTrigger" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#IntegerTrigger" "EventUtilityPrototypes.x3d#IntegerTrigger" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#IntegerTrigger"'>
      <field accessType='inputOnly' name='set_boolean' type='SFBool'/>
      <field accessType='inputOnly' name='set_integerKey' type='SFInt32'/>
      <field accessType='inputOutput' name='integerKey' type='SFInt32'/>
      <field accessType='outputOnly' name='integerKey_changed' type='SFInt32'/>
      <field accessType='outputOnly' name='triggerValue' type='SFInt32'/>
    </ExternProtoDeclare>
    <!-- ======================================== -->
    <ExternProtoDeclare appinfo='Convert boolean true events to time events.' name='TimeTrigger' url='"EventUtilityPrototypes.wrl#TimeTrigger" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#TimeTrigger" "EventUtilityPrototypes.x3d#TimeTrigger" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#TimeTrigger"'>
      <field accessType='inputOnly' name='set_boolean' type='SFBool'/>
      <field accessType='outputOnly' 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://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='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://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 translation='0 0 0'>
        <Anchor description='Click for BooleanTrigger example' parameter='"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 example' parameter='"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>
      <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>
