<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd">
<X3D profile='Immersive'  version='3.3 xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation =' https://www.web3d.org/specifications/x3d-3.3.xsd ' >
<head>
<meta name='titlecontent=' BooleanTogglePumpHouse.x3d '/>
<meta name='descriptioncontent='A BooleanToggle node controls pump house animation: select to stop, then select again to restart.'/>
<meta name='creatorcontent='Todd Gagnon and Mark A. Boyd'/>
<meta name='translatorcontent=' Xeena VRML importer, X3D-Edit 3.1, https://www.web3d.org/x3d/content/README.X3D-Edit.html '/>
<meta name='createdcontent='8 June 1998'/>
<meta name='translatedcontent='20 December 2002'/>
<meta name='modifiedcontent='20 October 2019'/>
<meta name='referencecontent=' KelpTank.x3d '/>
<meta name='referencecontent=' https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/KelpForestExhibit/PumpHouse.x3d '/>
<meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter09EventUtilitiesScripting/BooleanTogglePumpHouse.x3d '/>
<meta name='generatorcontent='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit'/>
<meta name='generatorcontent=' Vrml97ToX3dNist, http://ovrt.nist.gov/v2_x3d.html '/>
<meta name='licensecontent=' ../license.html'/>
</head>
<!-- -->
<Scene>
<WorldInfo title='BooleanTogglePumpHouse.x3d'/>
<Background skyColor='1 1 1'/>
<Viewpoint description='Click pump house to toggle operationorientation='-0.969 0.239 0.056 0.13position='1.66 1.34 5.95'/>
<Group>
<Transform scale='0.91 0.6 0.3translation='0.8 -0.65 0.5'>
<Shape>
<Appearance>
<Material diffuseColor='0.749 0.694 0.651'/>
</Appearance>
<Cylinder bottom='falsetop='false'/>
</Shape>
</Transform>
<Group>
<!-- ROUTE information for PumpTouched node:  [from isActive to Toggler.set_boolean ] -->
<TouchSensor DEF='PumpToucheddescription='touch to activate'/>

<Shape>
<Appearance DEF='PumpHouseAppearance'>
<Material diffuseColor='0.82 0.78 0.74'/>
</Appearance>
<IndexedFaceSet coordIndex='0 1 5 4 -1 5 1 2 6 -1 6 2 3 7 -1 3 0 4 7 -1 1 12 13 2 -1 2 13 14 -1 12 15 16 13 -1 15 0 3 16 -1 16 3 17 -1 9 5 6 10 -1 8 9 10 11 -1 4 8 11 7 -1 4 5 9 8 -1 11 10 6 7 -1 3 2 14 17 -1 13 16 17 14 -1'>
<Coordinate point='0.0 0.0 0.0 2.0 0.0 0.0 2.0 1.75 0.0 0.0 1.75 0.0 0.625 0.75 0.0 1.0 0.75 0.0 1.0 1.6 0.0 0.625 1.6 0.0 0.625 0.75 -0.65 1.0 0.75 -0.65 1.0 1.6 -0.65 0.625 1.6 -0.65 2.0 0.0 -2.7 2.0 1.75 -2.7 2.0 2.5 -1.0 0.0 0.0 -2.7 0.0 1.75 -2.7 0.0 2.5 -1.0'/>
</IndexedFaceSet>
</Shape>
</Group>
</Group>
<Group>
<Transform scale='0.5 0.5 0.5translation='1.0 1.1 -1.5'>
<!-- ROUTE information for PistonTransform node:  [from PistonPath.value_changed to set_translation ] -->
<Transform DEF='PistonTransform'>
<Transform scale='1.8 1.2 0.6translation='0.0 -0.2 0.0'>
<Shape>
<Appearance>
<Material diffuseColor='0.427 0.427 0.42'/>
</Appearance>
<Cylinder height='1.0radius='0.98'/>
</Shape>
</Transform>
<Transform DEF='CylinderRodrotation='0.0 0.0 -1.0 0.523599translation='-0.25 0.75 0.0'>
<Shape>
<Appearance USE=' PumpHouseAppearance'/>
<Cylinder height='1.0radius='0.1'/>
</Shape>
</Transform>
<Transform rotation='0.0 0.0 1.0 1.047198translation='1.0 0.6 0.0'>
<Transform USE=' CylinderRod'/>
</Transform>
<Transform translation='0.0 1.2 0.0'>
<Shape>
<Appearance USE=' PumpHouseAppearance'/>
<Sphere radius='0.15'/>
</Shape>
</Transform>
<!-- ROUTE information for RockerArm1 node:  [from Rocker1Path.value_changed to set_translation ] [from Rocker1Rotation.value_changed to set_rotation ] -->
<Transform DEF='RockerArm1center='0.0 -0.4 0.0'>
<Shape>
<Appearance USE=' PumpHouseAppearance'/>
<Cylinder height='1.8radius='0.1'/>
</Shape>
<Transform translation='0.0 0.95 0.0'>
<Shape>
<Appearance USE=' PumpHouseAppearance'/>
<Sphere radius='0.15'/>
</Shape>
</Transform>
<!-- ROUTE information for Rocker1Path node:  [from PistonClock.fraction_changed to set_fraction ] [from value_changed to RockerArm1.set_translation ] -->
<PositionInterpolator DEF='Rocker1Pathkey='0.0 0.3 0.32 0.5 0.75 1.0keyValue='0.0 2.0 -0.25 0.0 1.8 -0.35 0.0 1.8 -0.35 0.0 2.0 -0.25 0.0 2.0 -0.12 0.0 2.0 -0.25'/>

<!-- ROUTE information for Rocker1Rotation node:  [from PistonClock.fraction_changed to set_fraction ] [from value_changed to RockerArm1.set_rotation ] -->
<OrientationInterpolator DEF='Rocker1Rotationkey='0.0 0.3 0.32 0.5 0.75 1.0keyValue='-1.0 0.0 0.0 0.523599 -1.0 0.0 0.0 1.0471976 -1.0 0.0 0.0 1.0471976 -1.0 0.0 0.0 0.523599 -1.0 0.0 0.0 0.2617994 -1.0 0.0 0.0 0.523599'/>
</Transform>
<!-- ROUTE information for RockerArm2 node:  [from Rocker2Path.value_changed to set_translation ] [from Rocker2Rotation.value_changed to set_rotation ] -->
<Transform DEF='RockerArm2center='0.0 0.7 0.0'>
<Shape>
<Appearance USE=' PumpHouseAppearance'/>
<Cylinder height='1.8radius='0.1'/>
</Shape>
<Transform translation='0.0 -0.95 0.0'>
<Shape>
<Appearance USE=' PumpHouseAppearance'/>
<Sphere radius='0.15'/>
</Shape>
</Transform>
<!-- ROUTE information for Rocker2Path node:  [from PistonClock.fraction_changed to set_fraction ] [from value_changed to RockerArm2.set_translation ] -->
<PositionInterpolator DEF='Rocker2Pathkey='0.0 0.3 0.32 0.5 0.75 1.0keyValue='0.0 1.95 -1.0 0.0 1.2 -1.6 0.0 1.2 -1.6 0.0 1.95 -1.0 0.0 2.2 -0.65 0.0 1.95 -1.0'/>

<!-- ROUTE information for Rocker2Rotation node:  [from PistonClock.fraction_changed to set_fraction ] [from value_changed to RockerArm2.set_rotation ] -->
<OrientationInterpolator DEF='Rocker2Rotationkey='0.0 0.3 0.32 0.5 0.75 1.0keyValue='1.0 0.0 0.0 0.523599 1.0 0.0 0.0 0.4 1.0 0.0 0.0 0.4 1.0 0.0 0.0 0.523599 1.0 0.0 0.0 1.570796 1.0 0.0 0.0 0.523599'/>
</Transform>
</Transform>

<!-- ROUTE information for PistonPath node:  [from PistonClock.fraction_changed to set_fraction ] [from value_changed to PistonTransform.set_translation ] -->
<PositionInterpolator DEF='PistonPathkey='0.0 0.3 0.32 0.5 0.75 1.0keyValue='-0.4 -2.3 4.0 -0.4 -1.5 4.0 -0.4 -1.5 4.0 -0.4 -2.3 4.0 -0.4 -3.3 4.0 -0.4 -2.3 4.0'/>

<!-- ROUTE information for Toggler node:  [from PumpTouched.isActive to set_boolean ] [from toggle_changed to Tee.set_boolean ] -->
<BooleanToggle DEF='TogglercontainerField='children'/>



<!-- ROUTE information for PauseOff node:  [from Tee.inputFalse to set_boolean ] [from triggerTime to PistonClock.resumeTime ] -->
<TimeTrigger DEF='PauseOff'/>
</Transform>
</Group>
<field name='dumpSFBooltype='SFBoolaccessType='inputOnly'/>
<field name='dumpSFTimetype='SFTimeaccessType='inputOnly'/>
</Script>
< ROUTE  fromNode=' PumpTouched' fromField='isActive' toNode=' Toggler' toField='set_boolean'/>
< ROUTE  fromNode=' Tee' fromField='inputTrue' toNode=' Dump' toField='dumpSFBool'/>
< ROUTE  fromNode=' PauseOn' fromField='triggerTime' toNode=' Dump' toField='dumpSFTime'/>
< ROUTE  fromNode=' Toggler' fromField='toggle_changed' toNode=' Tee' toField='set_boolean'/>
< ROUTE  fromNode=' Tee' fromField='inputTrue' toNode=' PauseOn' toField='set_boolean'/>
< ROUTE  fromNode=' Tee' fromField='inputFalse' toNode=' PauseOff' toField='set_boolean'/>
< ROUTE  fromNode=' PauseOn' fromField='triggerTime' toNode=' PistonClock' toField='pauseTime'/>
< ROUTE  fromNode=' PauseOff' fromField='triggerTime' toNode=' PistonClock' toField='resumeTime'/>
< ROUTE  fromNode=' PistonClock' fromField='fraction_changed' toNode=' PistonPath' toField='set_fraction'/>
< ROUTE  fromNode=' PistonPath' fromField='value_changed' toNode=' PistonTransform' toField='set_translation'/>
< ROUTE  fromNode=' PistonClock' fromField='fraction_changed' toNode=' Rocker1Path' toField='set_fraction'/>
< ROUTE  fromNode=' Rocker1Path' fromField='value_changed' toNode=' RockerArm1' toField='set_translation'/>
< ROUTE  fromNode=' PistonClock' fromField='fraction_changed' toNode=' Rocker1Rotation' toField='set_fraction'/>
< ROUTE  fromNode=' Rocker1Rotation' fromField='value_changed' toNode=' RockerArm1' toField='set_rotation'/>
< ROUTE  fromNode=' PistonClock' fromField='fraction_changed' toNode=' Rocker2Path' toField='set_fraction'/>
< ROUTE  fromNode=' Rocker2Path' fromField='value_changed' toNode=' RockerArm2' toField='set_translation'/>
< ROUTE  fromNode=' PistonClock' fromField='fraction_changed' toNode=' Rocker2Rotation' toField='set_fraction'/>
< ROUTE  fromNode=' Rocker2Rotation' fromField='value_changed' toNode=' RockerArm2' toField='set_rotation'/>
</Scene>
</X3D>
<!--

to top <!-- Event Graph ROUTE Table shows event connections -->
 
<!-- Index for DEF nodes: CylinderRod, Dump, PauseOff, PauseOn, PistonClock, PistonPath, PistonTransform, PumpHouseAppearance, PumpTouched, Rocker1Path, Rocker1Rotation, Rocker2Path, Rocker2Rotation, RockerArm1, RockerArm2, Tee, Toggler

Index for Viewpoint node: Viewpoint_1
-->

Event Graph ROUTE Table entries with 18 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.

PumpTouched
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
Toggler
BooleanToggle
set_boolean
SFBool

 
 
then
Toggler
BooleanToggle
toggle_changed
SFBool

ROUTE
event to
(2)
Tee
BooleanFilter
set_boolean
SFBool

 
 
then
Tee
BooleanFilter
inputFalse
SFBool

ROUTE
event to
(3)
PauseOff
TimeTrigger
set_boolean
SFBool

 
 
then
PauseOff
TimeTrigger
triggerTime
SFTime

ROUTE
event to
(4)
PistonClock
TimeSensor
resumeTime
SFTime

 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
PistonPath
PositionInterpolator
set_fraction
SFFloat

 
 
then
PistonPath
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(6)
PistonTransform
Transform
set_translation
SFVec3f
 
 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
Rocker1Path
PositionInterpolator
set_fraction
SFFloat

 
 
then
Rocker1Path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(6)
RockerArm1
Transform
set_translation
SFVec3f
 
 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
Rocker1Rotation
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rocker1Rotation
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(6)
RockerArm1
Transform
set_rotation
SFRotation
 
 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
Rocker2Path
PositionInterpolator
set_fraction
SFFloat

 
 
then
Rocker2Path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(6)
RockerArm2
Transform
set_translation
SFVec3f
 
 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
Rocker2Rotation
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rocker2Rotation
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(6)
RockerArm2
Transform
set_rotation
SFRotation
 
 
 
then
Tee
BooleanFilter
inputTrue
SFBool

ROUTE
event to
(3)
Dump
Script
dumpSFBool
SFBool
 
 
 
then
Tee
BooleanFilter
inputTrue
SFBool

ROUTE
event to
(3)
PauseOn
TimeTrigger
set_boolean
SFBool

 
 
then
PauseOn
TimeTrigger
triggerTime
SFTime

ROUTE
event to
(4)
Dump
Script
dumpSFTime
SFTime
 
 
 
then
PauseOn
TimeTrigger
triggerTime
SFTime

ROUTE
event to
(4)
PistonClock
TimeSensor
pauseTime
SFTime

 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
PistonPath
PositionInterpolator
set_fraction
SFFloat

 
 
then
PistonPath
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(6)
PistonTransform
Transform
set_translation
SFVec3f
 
 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
Rocker1Path
PositionInterpolator
set_fraction
SFFloat

 
 
then
Rocker1Path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(6)
RockerArm1
Transform
set_translation
SFVec3f
 
 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
Rocker1Rotation
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rocker1Rotation
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(6)
RockerArm1
Transform
set_rotation
SFRotation
 
 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
Rocker2Path
PositionInterpolator
set_fraction
SFFloat

 
 
then
Rocker2Path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(6)
RockerArm2
Transform
set_translation
SFVec3f
 
 
 
then
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(5)
Rocker2Rotation
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rocker2Rotation
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(6)
RockerArm2
Transform
set_rotation
SFRotation


PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
PistonPath
PositionInterpolator
set_fraction
SFFloat

 
 
then
PistonPath
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(2)
PistonTransform
Transform
set_translation
SFVec3f
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rocker1Path
PositionInterpolator
set_fraction
SFFloat

 
 
then
Rocker1Path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(2)
RockerArm1
Transform
set_translation
SFVec3f
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rocker1Rotation
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rocker1Rotation
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
RockerArm1
Transform
set_rotation
SFRotation
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rocker2Path
PositionInterpolator
set_fraction
SFFloat

 
 
then
Rocker2Path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(2)
RockerArm2
Transform
set_translation
SFVec3f
PistonClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
Rocker2Rotation
OrientationInterpolator
set_fraction
SFFloat

 
 
then
Rocker2Rotation
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
RockerArm2
Transform
set_rotation
SFRotation



-->

<!-- Online at
https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter09EventUtilitiesScripting/BooleanTogglePumpHouseIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter09EventUtilitiesScripting/BooleanTogglePumpHouse.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)
-->

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