<?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='BooleanSequencerExample.x3d' name='title'/>
    <meta content='This example shows how to use the BooleanSequencer prototype in an animated scenario.' name='description'/>
    <meta content='Don Brutzman, Estuko Lippi, Jeff Weekley, Jane Wu' name='creator'/>
    <meta content='10 August 2001' name='created'/>
    <meta content='20 October 2019' name='modified'/>
    <meta content='https://www.web3d.org/technicalinfo/specifications/vrml97/part1/nodesRef.html#ScalarInterpolator' name='reference'/>
    <meta content='boolean sequencer' name='subject'/>
    <meta content='https://www.web3d.org/x3d/content/examples/Basic/development/BooleanSequencerExample.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>
    <WorldInfo title='BooleanSequencerExample.x3d'/>
    <Group DEF='HUDGroup'>
      <ProximitySensor DEF='WhereSensor' size='1000 1000 1000'/>
      <Transform DEF='BillboardWhereTransform'>
        <Transform rotation='1 0 0 -0.03' translation='0 0 -12'>
          <Billboard>
            <Transform DEF='BillboardPlaneTransform'>
              <TouchSensor DEF='Toucher' description='Click text to start clock and run multiple BooleanSequencers'/>
              <Shape>
                <Appearance>
                  <Material diffuseColor='0 1 1'/>
                </Appearance>
                <Text string='"Click text to start clock, run" "multiple BooleanSequencers" "" "" "" "See Viewpoint description" "for bound Viewpoint number"'>
                  <FontStyle justify='"MIDDLE" "MIDDLE"'/>
                </Text>
              </Shape>
            </Transform>
          </Billboard>
        </Transform>
      </Transform>
      <ROUTE fromField='position_changed' fromNode='WhereSensor' toField='set_translation' toNode='BillboardWhereTransform'/>
      <ROUTE fromField='orientation_changed' fromNode='WhereSensor' toField='set_rotation' toNode='BillboardWhereTransform'/>
    </Group>
    <TimeSensor DEF='Clock' cycleInterval='10'/>
    <ROUTE fromField='touchTime' fromNode='Toucher' toField='set_startTime' toNode='Clock'/>
    <Viewpoint DEF='FrontUpViewpoint' description='View 0, Front Up'/>
    <Group DEF='AnimatedView1'>
      <Viewpoint DEF='LeftViewpoint' description='View 1, Left' orientation='0 1 0 -1.57' position='-10 0 0'/>
      <BooleanSequencer DEF='LeftViewBinder' key='0 0.1 0.25' keyValue='false true false'/>
      <ROUTE fromField='fraction_changed' fromNode='Clock' toField='set_fraction' toNode='LeftViewBinder'/>
      <ROUTE fromField='value_changed' fromNode='LeftViewBinder' toField='set_bind' toNode='LeftViewpoint'/>
    </Group>
    <Group DEF='AnimatedView2'>
      <Viewpoint DEF='BackViewpoint' description='View 2, Back' orientation='0 1 0 -3.14' position='0 0 -10'/>
      <BooleanSequencer DEF='BackViewBinder' key='0 0.375 0.475' keyValue='false true false'/>
      <ROUTE fromField='fraction_changed' fromNode='Clock' toField='set_fraction' toNode='BackViewBinder'/>
      <ROUTE fromField='value_changed' fromNode='BackViewBinder' toField='set_bind' toNode='BackViewpoint'/>
    </Group>
    <Group DEF='AnimatedView3'>
      <Viewpoint DEF='RightViewpoint' description='View 3, Right' orientation='0 1 0 1.57' position='10 0 0'/>
      <BooleanSequencer DEF='RightViewBinder' key='0 0.5 0.6' keyValue='false true false'/>
      <ROUTE fromField='fraction_changed' fromNode='Clock' toField='set_fraction' toNode='RightViewBinder'/>
      <ROUTE fromField='value_changed' fromNode='RightViewBinder' toField='set_bind' toNode='RightViewpoint'/>
    </Group>
    <Group DEF='AnimatedView4'>
      <Viewpoint DEF='TopViewpoint' description='View 4, Top' orientation='1 0 0 -1.57' position='0 10 0'/>
      <BooleanSequencer DEF='TopViewBinder' key='0.625 0.725' keyValue='true false'/>
      <ROUTE fromField='fraction_changed' fromNode='Clock' toField='set_fraction' toNode='TopViewBinder'/>
      <ROUTE fromField='value_changed' fromNode='TopViewBinder' toField='set_bind' toNode='TopViewpoint'/>
    </Group>
    <Group DEF='AnimatedView5'>
      <Viewpoint DEF='FrontDownViewpoint' description='View 5, Front Down' orientation='1 0 0 -3.14' position='0 0 -10'/>
      <BooleanSequencer DEF='FrontDownViewBinder' key='0.75 0.85' keyValue='true false'/>
      <ROUTE fromField='fraction_changed' fromNode='Clock' toField='set_fraction' toNode='FrontDownViewBinder'/>
      <ROUTE fromField='value_changed' fromNode='FrontDownViewBinder' toField='set_bind' toNode='FrontDownViewpoint'/>
    </Group>
    <Group DEF='AnimatedView6'>
      <Viewpoint DEF='BottomViewpoint' description='View 6, Bottom' orientation='1 0 0 1.57' position='0 -10 0'/>
      <BooleanSequencer DEF='BottomViewBinder' key='0.875 0.975' keyValue='true false'/>
      <ROUTE fromField='fraction_changed' fromNode='Clock' toField='set_fraction' toNode='BottomViewBinder'/>
      <ROUTE fromField='value_changed' fromNode='BottomViewBinder' toField='set_bind' toNode='BottomViewpoint'/>
    </Group>
    <Switch DEF='DebugSwitch' whichChoice='0'>
      <Group>
        <Script DEF='Debug'>
          <field accessType='inputOnly' name='setFraction' type='SFFloat'/>
          <field accessType='inputOnly' name='setFrontUpViewBind' type='SFBool'/>
          <field accessType='inputOnly' name='setLeftViewBind' type='SFBool'/>
          <field accessType='inputOnly' name='setBackViewBind' type='SFBool'/>
          <field accessType='inputOnly' name='setRightViewBind' type='SFBool'/>
          <field accessType='inputOnly' name='setTopViewBind' type='SFBool'/>
          <field accessType='inputOnly' name='setFrontDownViewBind' type='SFBool'/>
          <field accessType='inputOnly' name='setBottomViewBind' type='SFBool'/>
          <field accessType='inputOnly' name='setFrontUpBSOutput' type='SFBool'/>
          <field accessType='inputOnly' name='setLeftBSOutput' type='SFBool'/>
          <field accessType='inputOnly' name='setBackBSOutput' type='SFBool'/>
          <field accessType='inputOnly' name='setRightBSOutput' type='SFBool'/>
          <field accessType='inputOnly' name='setTopBSOutput' type='SFBool'/>
          <field accessType='inputOnly' name='setFrontDownBSOutput' type='SFBool'/>
          <field accessType='inputOnly' name='setBottomBSOutput' type='SFBool'/>
          <![CDATA[
ecmascript:

function setFraction(value, timeStamp)
{
	Browser.println ('fraction =' + value);
}

function setFrontUpViewBind(value, timeStamp)
{
	Browser.println ('FrontUpView bind:' + value);
}

function setLeftViewBind(value, timeStamp)
{
	Browser.println ('LeftView bind:' + value);
}

function setBackViewBind(value, timeStamp)
{
	Browser.println ('BackView bind:' + value);
}

function setRightViewBind(value, timeStamp)
{
	Browser.println ('RightView bind:' + value);
}

function setTopViewBind(value, timeStamp)
{
	Browser.println ('TopView bind:' + value);
}

function setFrontDownViewBind(value, timeStamp)
{
	Browser.println ('FrontDownView bind:' + value);
}

function setBottomViewBind(value, timeStamp)
{
	Browser.println ('BottomView bind:' + value);
}

function setFrontUpBSOutput(value, timeStamp)
{
	Browser.println ('BooleanSequencer output for FrontUpViewpoint:' + value);
}

function setLeftBSOutput(value, timeStamp)
{
	Browser.println ('BooleanSequencer output for LeftViewpoint:' + value);
}

function setBackBSOutput(value, timeStamp)
{
	Browser.println ('BooleanSequencer output for BackViewpoint:' + value);
}

function setRightBSOutput(value, timeStamp)
{
	Browser.println ('BooleanSequencer output for RightViewpoint:' + value);
}

function setTopBSOutput(value, timeStamp)
{
	Browser.println ('BooleanSequencer output for TopViewpoint:' + value);
}

function setFrontDownBSOutput(value, timeStamp)
{
	Browser.println ('BooleanSequencer output for FrontDownViewpoint:' + value);
}

function setBottomBSOutput(value, timeStamp)
{
	Browser.println ('BooleanSequencer output for BottomViewpoint:' + value);
}
]]>
        </Script>
        <ROUTE fromField='fraction_changed' fromNode='Clock' toField='setFraction' toNode='Debug'/>
        <ROUTE fromField='isBound' fromNode='FrontUpViewpoint' toField='setFrontUpViewBind' toNode='Debug'/>
        <ROUTE fromField='isBound' fromNode='LeftViewpoint' toField='setLeftViewBind' toNode='Debug'/>
        <ROUTE fromField='isBound' fromNode='BackViewpoint' toField='setBackViewBind' toNode='Debug'/>
        <ROUTE fromField='isBound' fromNode='RightViewpoint' toField='setRightViewBind' toNode='Debug'/>
        <ROUTE fromField='isBound' fromNode='TopViewpoint' toField='setTopViewBind' toNode='Debug'/>
        <ROUTE fromField='isBound' fromNode='FrontDownViewpoint' toField='setFrontDownViewBind' toNode='Debug'/>
        <ROUTE fromField='isBound' fromNode='BottomViewpoint' toField='setBottomViewBind' toNode='Debug'/>
        <ROUTE fromField='value_changed' fromNode='LeftViewBinder' toField='setLeftBSOutput' toNode='Debug'/>
        <ROUTE fromField='value_changed' fromNode='BackViewBinder' toField='setBackBSOutput' toNode='Debug'/>
        <ROUTE fromField='value_changed' fromNode='RightViewBinder' toField='setRightBSOutput' toNode='Debug'/>
        <ROUTE fromField='value_changed' fromNode='TopViewBinder' toField='setTopBSOutput' toNode='Debug'/>
        <ROUTE fromField='value_changed' fromNode='FrontDownViewBinder' toField='setFrontDownBSOutput' toNode='Debug'/>
        <ROUTE fromField='value_changed' fromNode='BottomViewBinder' toField='setBottomBSOutput' toNode='Debug'/>
      </Group>
    </Switch>
    <Transform>
      <Shape>
        <Appearance>
          <Material diffuseColor='1 1 0'/>
        </Appearance>
        <Box size='2 0.1 0.35'/>
      </Shape>
      <Transform translation='-1 0 0'>
        <Shape>
          <Appearance>
            <Material diffuseColor='1 0 0'/>
          </Appearance>
          <Sphere radius='0.2'/>
        </Shape>
      </Transform>
      <Transform translation='1 0 0'>
        <Shape>
          <Appearance>
            <Material diffuseColor='0 1 0'/>
          </Appearance>
          <Sphere radius='0.2'/>
        </Shape>
      </Transform>
    </Transform>
    <Transform>
      <Shape>
        <Appearance>
          <Material diffuseColor='0 0 1'/>
        </Appearance>
        <Cone/>
      </Shape>
    </Transform>
  </Scene>
</X3D>