<?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=' PinballTable.x3d '/>
<meta name='descriptioncontent='A pinball table with some ball animations.'/>
<meta name='creatorcontent='Jiradett Kerdsri and Kacha Jitpanya'/>
<meta name='createdcontent='6 August 2001'/>
<meta name='modifiedcontent='20 October 2019'/>
<meta name='Imagecontent='PinballTableModel.png' />
<meta name='referencecontent=' http://www.pinballrebel.com/game/pins/tommy/tommy_pinball.htm '/>
<meta name='Imagecontent=' http://www.pinballrebel.com/game/pins/tommy/tombg.jpg ' />
<meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/PinballTable.x3d '/>
<meta name='generatorcontent='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit'/>
<meta name='licensecontent=' ../license.html'/>
</head>
<!-- -->
<Scene>
<WorldInfo title='PinballTable.x3d'/>
<Group>
<!-- table -->
<Transform center='0 0 -4rotation='1 0 0 0.25'>
<Group>
<Transform>
<Shape>
<Box size='4.5 0.2 8'/>
<Appearance> </Appearance>
</Shape>
<!-- side beam -->
<Transform translation='2.25 0 0'>
<Shape DEF='sideBeam'>
<Box size='0.3 0.6 8.8'/>
<Appearance DEF='WoodAppearance'>
<ImageTexture
  url=' "woodTexture.jpg " "https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/woodTexture.jpg " ' />

<Material diffuseColor='1 0 0'/>
</Appearance>
</Shape>
</Transform>
<!-- side beam2 -->
<Transform translation='-2.25 0 0'>
<Shape USE=' sideBeam'/>
</Transform>
<!-- back of the table -->
<Transform translation='0 -0.198 0'>
<Shape>
<Box size='4.5 0.2 7.6'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
<!-- circle -->
<Transform translation='0 .17 -0.72'>
<Shape DEF='cylinder'>
<Cylinder height='.15radius='.2'/>
<Appearance>
<!-- ROUTE information for BALL_COLOR_2 node:  [from COLOR_PATH_2.value_changed to set_emissiveColor ] -->
<Material DEF='BALL_COLOR_2'/>
</Appearance>
</Shape>
<Transform translation='-0.36 0 -0.66'>
<Shape USE=' cylinder'/>
</Transform>
<Transform translation='0.38 0 -0.82'>
<Shape USE=' cylinder'/>
</Transform>
<Transform translation='-1.57 0 -2.03'>
<Shape USE=' cylinder'/>
</Transform>
<!-- ROUTE information for CLOCK_2 node:  [from fraction_changed to COLOR_PATH_2.set_fraction ] -->
<TimeSensor DEF='CLOCK_2cycleInterval='2.4loop='true'/>

<!-- ROUTE information for COLOR_PATH_2 node:  [from CLOCK_2.fraction_changed to set_fraction ] [from value_changed to BALL_COLOR_2.set_emissiveColor ] -->
<ColorInterpolator DEF='COLOR_PATH_2key='0.0 0.5 0.5 1.0keyValue='0 1 0 0 1 0 0 0 1 0 0 1'/>
</Transform>
<!-- center circle -->
<Transform translation='0 .1 2.05'>
<Shape>
<Cylinder height='.2radius='.54'/>
<Appearance> </Appearance>
</Shape>
<!-- ROUTE information for CLOCK_1 node:  [from fraction_changed to COLOR_PATH_1.set_fraction ] -->
<TimeSensor DEF='CLOCK_1cycleInterval='2loop='true'/>

<!-- ROUTE information for COLOR_PATH_1 node:  [from CLOCK_1.fraction_changed to set_fraction ] [from value_changed to BALL_COLOR_1.set_emissiveColor ] -->
<ColorInterpolator DEF='COLOR_PATH_1key='0.0 0.5 0.5 1.0keyValue='1 0 0 1 0 0 0 0 1 0 0 1'/>
</Transform>
<!-- beam -->
<Transform translation='0 0 4.25'>
<Shape DEF='beam'>
<Box size='4.5 0.6 0.3'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
</Transform>
<!-- overhead light -->
<DirectionalLight direction='0 -1 0intensity='0.7'/>
<!-- blinking route for center -->
< ROUTE  fromNode=' CLOCK_1' fromField='fraction_changed' toNode=' COLOR_PATH_1' toField='set_fraction'/>
< ROUTE  fromNode=' COLOR_PATH_1' fromField='value_changed' toNode=' BALL_COLOR_1' toField='set_emissiveColor'/>
<!-- blinking route for small circle -->
< ROUTE  fromNode=' CLOCK_2' fromField='fraction_changed' toNode=' COLOR_PATH_2' toField='set_fraction'/>
< ROUTE  fromNode=' COLOR_PATH_2' fromField='value_changed' toNode=' BALL_COLOR_2' toField='set_emissiveColor'/>
</Group>
<!-- ball -->
<Group> </Group>
<!-- stick1 -->
<Group>
<!-- ROUTE information for stck1 node:  [from orienFlip1.value_changed to set_rotation ] -->
<Transform DEF='stck1rotation='0 1 0 .67scale='1 2 1translation='.5 .2 3.8'>
<Shape DEF='stick'>
<Appearance>
<Material diffuseColor='.8 .8 .8'/>
</Appearance>
<Extrusion creaseAngle='0.785crossSection='0 0.1 0.37 0.11 0.44 0.07 0.45 0 0.44 -0.07 0.37 -0.11 0 -0.1 -0.2 -0.08 -0.32 -0.06 -0.38 -0.04 -0.4 0 -0.38 0.04 -0.32 0.06 -0.2 0.08 0 0.1spine='0 -0.03 0 0 0.03 0'/>
</Shape>
</Transform>
<!-- ROUTE information for Touch1 node:  [from touchTime to routeSelecter1.set_startTime ] [from touchTime to ClockOrient1.set_startTime ] -->
<TouchSensor DEF='Touch1description='stick 1 - touch to activate'/>
</Group>
<!-- stick2 -->
<Group>
<!-- ROUTE information for stck2 node:  [from orienFlip2.value_changed to set_rotation ] -->
<Transform DEF='stck2rotation='0 1 0 2.47scale='1 2 1translation='-0.5 .2 3.8'>
<Shape USE=' stick'/>
</Transform>
<!-- ROUTE information for Touch2 node:  [from touchTime to routeSelecter2.set_startTime ] [from touchTime to ClockOrient2.set_startTime ] -->
<TouchSensor DEF='Touch2description='stick 2 - touch to activate'/>
</Group>
</Transform>
<!-- ROUTE information for Clock node:  [from Touch.touchTime to set_startTime ] [from fraction_changed to PosBall1.set_fraction ] -->
<TimeSensor DEF='ClockcycleInterval='6'/>

<!-- ROUTE information for Clock1_1 node:  [from routeSelecter1.startTime1 to set_startTime ] [from fraction_changed to PosFlip1_1.set_fraction ] -->
<TimeSensor DEF='Clock1_1cycleInterval='3'/>

<!-- ROUTE information for Clock1_2 node:  [from routeSelecter1.startTime2 to set_startTime ] [from fraction_changed to PosFlip1_2.set_fraction ] -->
<TimeSensor DEF='Clock1_2cycleInterval='3'/>

<!-- ROUTE information for Clock1_3 node:  [from routeSelecter1.startTime3 to set_startTime ] [from fraction_changed to PosFlip1_3.set_fraction ] -->
<TimeSensor DEF='Clock1_3cycleInterval='3'/>

<!-- ROUTE information for Clock1_4 node:  [from routeSelecter1.startTime4 to set_startTime ] [from fraction_changed to PosFlip1_4.set_fraction ] -->
<TimeSensor DEF='Clock1_4cycleInterval='3'/>

<!-- ROUTE information for Clock2_1 node:  [from routeSelecter2.startTime1 to set_startTime ] [from fraction_changed to PosFlip2_1.set_fraction ] -->
<TimeSensor DEF='Clock2_1cycleInterval='3'/>

<!-- ROUTE information for Clock2_2 node:  [from routeSelecter2.startTime2 to set_startTime ] [from fraction_changed to PosFlip2_2.set_fraction ] -->
<TimeSensor DEF='Clock2_2cycleInterval='3'/>

<!-- ROUTE information for Clock2_3 node:  [from routeSelecter2.startTime3 to set_startTime ] [from fraction_changed to PosFlip2_3.set_fraction ] -->
<TimeSensor DEF='Clock2_3cycleInterval='3'/>

<!-- ROUTE information for Clock2_4 node:  [from routeSelecter2.startTime4 to set_startTime ] [from fraction_changed to PosFlip2_4.set_fraction ] -->
<TimeSensor DEF='Clock2_4cycleInterval='3'/>

<!-- ROUTE information for ClockOrient1 node:  [from Touch1.touchTime to set_startTime ] [from fraction_changed to orienFlip1.set_fraction ] -->
<TimeSensor DEF='ClockOrient1'/>

<!-- ROUTE information for ClockOrient2 node:  [from Touch2.touchTime to set_startTime ] [from fraction_changed to orienFlip2.set_fraction ] -->
<TimeSensor DEF='ClockOrient2'/>

<!-- ROUTE information for PosBall1 node:  [from Clock.fraction_changed to set_fraction ] [from value_changed to BALL1.set_translation ] -->
<PositionInterpolator DEF='PosBall1key='0 0.0625 0.125 0.1875 0.25 0.3125 0.375 0.4375 0.5 0.5625 0.625 0.6875 0.75 0.8125 0.875 0.9375 1keyValue='1.8 .2 3.6 1.8 .2 -1.4 1.7 .2 -2.0 1.46 .2 -2.5 1.1 .2 -2.9 0.6 .2 -3.1 0 .2 -3.2 -0.6 .2 -3.1 -1.1 .2 -2.9 -1.5 .2 -2.5 -1.7 .2 -2.0 -1.8 .2 -1.4 -0.36 .2 -1.38 .36 .2 -1.54 0 .2 -0.74 0.562 .2 3.396 .242 .2 3.745'/>

<!-- ROUTE information for PosFlip1_1 node:  [from Clock1_1.fraction_changed to set_fraction ] [from value_changed to BALL1.set_translation ] -->
<PositionInterpolator DEF='PosFlip1_1key='0 0.25 0.5 0.75 1keyValue='1.2 .2 3.4 0.701 .2 -2.826 -1.774 .2 -0.675 -1.511 .2 2.791 -0.4 .2 3.6'/>

<!-- ROUTE information for PosFlip1_2 node:  [from Clock1_2.fraction_changed to set_fraction ] [from value_changed to BALL1.set_translation ] -->
<PositionInterpolator DEF='PosFlip1_2key='0 0.2 0.4 0.6 0.8 1keyValue='.242 .2 3.745 1 0.2 1 -1.2 0.2 0.8 0.8 0.2 -2.4 0.4 0.2 -2.6 -0.4 .2 3.6'/>

<!-- ROUTE information for PosFlip1_3 node:  [from Clock1_3.fraction_changed to set_fraction ] [from value_changed to BALL1.set_translation ] -->
<PositionInterpolator DEF='PosFlip1_3key='0 0.076923077 0.153846154 0.230769231 0.307692308 0.384615385 0.461538462 0.538461538 0.615384615 0.692307692 0.769230769 0.846153846 0.923076923 1keyValue='.242 .2 3.745 -1.5 0.2 0 0.3 0.2 -3.1 -1.4 0.2 -3.1 -0.2 0.2 -1 -0.3 0.2 -3.4 -1.8 0.2 -1.8 0.3 0.2 -2.8 -1.1 0.2 -3.4 -1.7 0.2 -2.4 1.8 0.2 -0.4 -0.8 0.2 1.8 2 0.2 -3.4 -0.4 .2 3.6'/>

<!-- ROUTE information for PosFlip1_4 node:  [from Clock1_4.fraction_changed to set_fraction ] [from value_changed to BALL1.set_translation ] -->
<PositionInterpolator DEF='PosFlip1_4key='0 0.2 0.4 0.6 0.8 1keyValue='.242 .2 3.745 2.2 0.2 1 0 0.2 0 1.5 0.2 -3 -1 0.2 2.5 -0.4 .2 3.6'/>

<!-- ROUTE information for PosFlip2_1 node:  [from Clock2_1.fraction_changed to set_fraction ] [from value_changed to BALL1.set_translation ] -->
<PositionInterpolator DEF='PosFlip2_1key='0 0.166666667 0.333333333 0.5 0.666666667 0.833333333 1keyValue='1.2 0.2 -3 -2 0.2 0.2 2 0.2 -0.6 -2.2 0.2 1.2 1.2 0.2 0.8 -1.2 0.2 -3.4 -0.4 .2 3.6'/>

<!-- ROUTE information for PosFlip2_2 node:  [from Clock2_2.fraction_changed to set_fraction ] [from value_changed to BALL1.set_translation ] -->
<PositionInterpolator DEF='PosFlip2_2key='0 0.066666667 0.129166667 0.191666667 0.254166667 0.316666667 0.379166667 0.441666667 0.504166667 0.566666667 0.629166667 0.691666667 0.754166667 0.816666667 0.879166667 0.941666667keyValue='0 .2 4.25 -2 0.2 -1 -1.8 0.2 -3.4 -0.4 0.2 -3.6 1.8 0.2 -3.4 1.6 0.2 -2 1 0.2 1 0 .2 4.25 -0.5 0.2 0 -1 0.2 -2 0.5 0.2 2.5 0.8 0.2 1 -2.2 0.2 1 2.2 0.2 -3.6 -0.5 0.2 3 -0.4 .2 3.6'/>

<!-- ROUTE information for PosFlip2_3 node:  [from Clock2_3.fraction_changed to set_fraction ] [from value_changed to BALL1.set_translation ] -->
<PositionInterpolator DEF='PosFlip2_3key='0 0.0625 0.125 0.1875 0.25 0.3125 0.375 0.4375 0.5 0.5625 0.625 0.6875 0.75 0.8125 0.875 0.9375 1keyValue='-1.6 0.2 0 -1.8 0.2 -1 -1.6 0.2 -2.4 -0.4 0.2 -2.5 0 0.2 -1.6 -0.2 0.2 -0.9 -1 0.2 -1.8 0.2 0.2 -2.2 0.2 0.2 -1.4 -0.6 0.2 -1.4 -0.6 0.2 -1.6 0 0.2 -1.4 -0.2 0.2 -1.3 0.8 0.2 0 -1 0.2 0.2 1.4 0.2 -1.6 -0.4 .2 3.6'/>

<!-- ROUTE information for PosFlip2_4 node:  [from Clock2_4.fraction_changed to set_fraction ] [from value_changed to BALL1.set_translation ] -->
<PositionInterpolator DEF='PosFlip2_4key='0 0.25 0.5 0.75 1keyValue='-0.4 .2 3.6 1.8 .2 0 0.936 .2 -2.842 0 .2 3.4 .242 .2 3.745'/>

<!-- ROUTE information for orienFlip1 node:  [from ClockOrient1.fraction_changed to set_fraction ] [from value_changed to stck1.set_rotation ] -->
<OrientationInterpolator DEF='orienFlip1key='0 0.25 0.5 0.75 1keyValue='0 1 0 -0.5 0 1 0 -1.0 0 1 0 -1.57 0 1 0 -1 0 1 0 0.5'/>

<!-- ROUTE information for orienFlip2 node:  [from ClockOrient2.fraction_changed to set_fraction ] [from value_changed to stck2.set_rotation ] -->
<OrientationInterpolator DEF='orienFlip2key='0 0.25 0.5 0.75 1keyValue='0 1 0 0.5 0 1 0 1.0 0 1 0 1.57 0 1 0 1 0 1 0 -0.5'/>

<!-- pinballBackground -->
<Group>
<!-- beam for pinballBackground -->
<!-- left beam -->
<Transform translation='2.245 2 -4'>
<Shape>
<Box size='.3 4.5 0.8'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
<!-- right beam -->
<Transform translation='-2.245 2 -4'>
<Shape>
<Box size='.3 4.5 0.8'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
<!-- upper beam -->
<Transform translation='0 4.4 -4'>
<Shape>
<Box size='4.81 0.3 0.8'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
<!-- back of pinballBackground -->
<Transform translation='0 -0.6 -4.5'>
<Shape>
<Box size='4.78 10.3 0.4'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
<!-- pinballBackground -->
<Transform translation='0 2 -3.95'>
<Shape>
<Box size='4.5 4.5 0.5'/>
<Appearance>
<ImageTexture USE=' TommyPinballGame'/>
<!-- animate color behind image -->
<!-- ROUTE information for BALL_COLOR_3 node:  [from COLOR_PATH_3.value_changed to set_emissiveColor ] -->
<Material DEF='BALL_COLOR_3'/>
</Appearance>
</Shape>
<!-- ROUTE information for CLOCK_3 node:  [from fraction_changed to COLOR_PATH_3.set_fraction ] -->
<TimeSensor DEF='CLOCK_3cycleInterval='5loop='true'/>

<!-- ROUTE information for COLOR_PATH_3 node:  [from CLOCK_3.fraction_changed to set_fraction ] [from value_changed to BALL_COLOR_3.set_emissiveColor ] -->
<ColorInterpolator DEF='COLOR_PATH_3key='0.0 0.5 0.5 1.0keyValue='0 0 0 .91 .98 .36 0 0 0 0 0 0'/>
</Transform>
<!-- Left front beam -->
<Transform translation='-2.25 -3.7 3.9'>
<Shape>
<Box size='0.3 3.8 0.6'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
<!-- right front beam -->
<Transform translation='2.25 -3.7 3.9'>
<Shape>
<Box size='0.3 3.8 0.6'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
< ROUTE  fromNode=' CLOCK_3' fromField='fraction_changed' toNode=' COLOR_PATH_3' toField='set_fraction'/>
< ROUTE  fromNode=' COLOR_PATH_3' fromField='value_changed' toNode=' BALL_COLOR_3' toField='set_emissiveColor'/>
</Group>
<!-- front -->
<Transform translation='0 -3.6 4'>
<Shape>
<Box size='4.2 2.8 .05'/>
<Appearance> </Appearance>
</Shape>
<Transform translation='0 -1.7 0'>
<Shape>
<Box size='4.5 0.6 0.3'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
</Transform>
<!-- pinballSide -->
<Group>
<!-- right side -->
<Transform rotation='0 1 0 -1.57translation='2.44 -5.6 4'>
<Shape>
<Appearance USE=' WoodAppearance'/>
<IndexedFaceSet coordIndex='0 1 2 3 0'>
<Coordinate point='0 0 0 -8.7 0 0 -8.7 5.5 0 0 3.35 0'/>
</IndexedFaceSet>
</Shape>
</Transform>
<!-- left side -->
<Transform rotation='0 1 0 -1.57translation='-2.43 -5.6 4'>
<Shape>
<Appearance USE=' WoodAppearance'/>
<IndexedFaceSet coordIndex='0 3 2 1 0'>
<Coordinate point='0 0 0 -8.7 0 0 -8.7 5.5 0 0 3.35 0'/>
</IndexedFaceSet>
</Shape>
</Transform>
<!-- floor -->
<Transform translation='0 -5.4 -0.3'>
<Shape>
<Box size='4.9 0.4 8.4'/>
<Appearance USE=' WoodAppearance'/>
</Shape>
</Transform>
</Group>
<!-- routeSelecter is used to select different routes when a player clicks on flippers. -->
<field name='set_startTimetype='SFTimeaccessType='inputOnly'/>
<field name='startTime1type='SFTimeaccessType='outputOnly'/>
<field name='startTime2type='SFTimeaccessType='outputOnly'/>
<field name='startTime3type='SFTimeaccessType='outputOnly'/>
<field name='startTime4type='SFTimeaccessType='outputOnly'/>
<![CDATA[
        
ecmascript:

function set_startTime( touchTime ) {
	prob= Math.random();

	if ( prob < 0.25 ) {
		startTime1 = touchTime;
	}
	else if ( (prob >= 0.25) && (prob < 0.50) ) {
		startTime2 = touchTime;
	}
	else if ( ( prob >= 0.50) && (prob < 0.75) ) {
		startTime3 = touchTime;
	}
	else {
		startTime4 = touchTime;	
	}
}

      
]]>
</Script>
<field name='set_startTimetype='SFTimeaccessType='inputOnly'/>
<field name='startTime1type='SFTimeaccessType='outputOnly'/>
<field name='startTime2type='SFTimeaccessType='outputOnly'/>
<field name='startTime3type='SFTimeaccessType='outputOnly'/>
<field name='startTime4type='SFTimeaccessType='outputOnly'/>
<![CDATA[
        
ecmascript:

function set_startTime( touchTime ) {
	prob= Math.random();
	if ( prob < 0.25 ) {
		startTime1 = touchTime;
	}
	else if ( (prob >= 0.25) && (prob < 0.50) ) {
		startTime2 = touchTime;
	}
	else if ( (prob >= 0.50) && (prob < 0.75) ) {
		startTime3 = touchTime;
	}
	else {
		startTime4 = touchTime;	
	}
}

      
]]>
</Script>
</Group>
<!-- Start game -->
< ROUTE  fromNode=' Touch' fromField='touchTime' toNode=' Clock' toField='set_startTime'/>
< ROUTE  fromNode=' Clock' fromField='fraction_changed' toNode=' PosBall1' toField='set_fraction'/>
< ROUTE  fromNode=' PosBall1' fromField='value_changed' toNode=' BALL1' toField='set_translation'/>
<!-- Path1 -->
< ROUTE  fromNode=' Touch1' fromField='touchTime' toNode=' routeSelecter1' toField='set_startTime'/>
< ROUTE  fromNode=' routeSelecter1' fromField='startTime1' toNode=' Clock1_1' toField='set_startTime'/>
< ROUTE  fromNode=' Clock1_1' fromField='fraction_changed' toNode=' PosFlip1_1' toField='set_fraction'/>
< ROUTE  fromNode=' PosFlip1_1' fromField='value_changed' toNode=' BALL1' toField='set_translation'/>
<!-- Path2 -->
< ROUTE  fromNode=' routeSelecter1' fromField='startTime2' toNode=' Clock1_2' toField='set_startTime'/>
< ROUTE  fromNode=' Clock1_2' fromField='fraction_changed' toNode=' PosFlip1_2' toField='set_fraction'/>
< ROUTE  fromNode=' PosFlip1_2' fromField='value_changed' toNode=' BALL1' toField='set_translation'/>
<!-- Path3 -->
< ROUTE  fromNode=' routeSelecter1' fromField='startTime3' toNode=' Clock1_3' toField='set_startTime'/>
< ROUTE  fromNode=' Clock1_3' fromField='fraction_changed' toNode=' PosFlip1_3' toField='set_fraction'/>
< ROUTE  fromNode=' PosFlip1_3' fromField='value_changed' toNode=' BALL1' toField='set_translation'/>
<!-- Path4 -->
< ROUTE  fromNode=' routeSelecter1' fromField='startTime4' toNode=' Clock1_4' toField='set_startTime'/>
< ROUTE  fromNode=' Clock1_4' fromField='fraction_changed' toNode=' PosFlip1_4' toField='set_fraction'/>
< ROUTE  fromNode=' PosFlip1_4' fromField='value_changed' toNode=' BALL1' toField='set_translation'/>
<!-- Path5 -->
< ROUTE  fromNode=' Touch2' fromField='touchTime' toNode=' routeSelecter2' toField='set_startTime'/>
< ROUTE  fromNode=' routeSelecter2' fromField='startTime1' toNode=' Clock2_1' toField='set_startTime'/>
< ROUTE  fromNode=' Clock2_1' fromField='fraction_changed' toNode=' PosFlip2_1' toField='set_fraction'/>
< ROUTE  fromNode=' PosFlip2_1' fromField='value_changed' toNode=' BALL1' toField='set_translation'/>
<!-- Path6 -->
< ROUTE  fromNode=' routeSelecter2' fromField='startTime2' toNode=' Clock2_2' toField='set_startTime'/>
< ROUTE  fromNode=' Clock2_2' fromField='fraction_changed' toNode=' PosFlip2_2' toField='set_fraction'/>
< ROUTE  fromNode=' PosFlip2_2' fromField='value_changed' toNode=' BALL1' toField='set_translation'/>
<!-- Path7 -->
< ROUTE  fromNode=' routeSelecter2' fromField='startTime3' toNode=' Clock2_3' toField='set_startTime'/>
< ROUTE  fromNode=' Clock2_3' fromField='fraction_changed' toNode=' PosFlip2_3' toField='set_fraction'/>
< ROUTE  fromNode=' PosFlip2_3' fromField='value_changed' toNode=' BALL1' toField='set_translation'/>
<!-- Path8 -->
< ROUTE  fromNode=' routeSelecter2' fromField='startTime4' toNode=' Clock2_4' toField='set_startTime'/>
< ROUTE  fromNode=' Clock2_4' fromField='fraction_changed' toNode=' PosFlip2_4' toField='set_fraction'/>
< ROUTE  fromNode=' PosFlip2_4' fromField='value_changed' toNode=' BALL1' toField='set_translation'/>
<!-- Rotating sticks -->
< ROUTE  fromNode=' Touch1' fromField='touchTime' toNode=' ClockOrient1' toField='set_startTime'/>
< ROUTE  fromNode=' ClockOrient1' fromField='fraction_changed' toNode=' orienFlip1' toField='set_fraction'/>
< ROUTE  fromNode=' orienFlip1' fromField='value_changed' toNode=' stck1' toField='set_rotation'/>
< ROUTE  fromNode=' Touch2' fromField='touchTime' toNode=' ClockOrient2' toField='set_startTime'/>
< ROUTE  fromNode=' ClockOrient2' fromField='fraction_changed' toNode=' orienFlip2' toField='set_fraction'/>
< ROUTE  fromNode=' orienFlip2' fromField='value_changed' toNode=' stck2' toField='set_rotation'/>
<!-- View Point -->
<Viewpoint description='normal viewposition='0 0 8.5'/>
<Viewpoint description='farposition='0 1 20'/>
<Viewpoint description='rightfieldOfView='0.7orientation='0 1 0 1.2position='15 0 15'/>
<Viewpoint description='leftorientation='0 1 0 -1.2position='-15 0 15'/>
<Viewpoint description='overorientation='1 0 0 -1.2position='0 17 5'/>
<Background groundAngle='1.309 1.570796groundColor='0 0 0skyAngle='1.309 1.571'
  backUrl=' "urn:web3d:media:textures/panoramas/space_1_back.jpg" "../UniversalMediaPanoramas/space_1_back.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_back.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_back.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_back.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_back.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_back.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_back.jpg " '
  bottomUrl=' "urn:web3d:media:textures/panoramas/space_1_bottom.jpg" "../UniversalMediaPanoramas/space_1_bottom.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_bottom.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_bottom.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_bottom.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_bottom.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_bottom.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_bottom.jpg " '
  frontUrl=' "urn:web3d:media:textures/panoramas/space_1_front.jpg" "../UniversalMediaPanoramas/space_1_front.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_front.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_front.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_front.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_front.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_front.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_front.jpg " '
  leftUrl=' "urn:web3d:media:textures/panoramas/space_1_left.jpg" "../UniversalMediaPanoramas/space_1_left.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_left.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_left.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_left.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_left.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_left.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_left.jpg " '
  rightUrl=' "urn:web3d:media:textures/panoramas/space_1_right.jpg" "../UniversalMediaPanoramas/space_1_right.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_right.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_right.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_right.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_right.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_right.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_right.jpg " '
  topUrl=' "urn:web3d:media:textures/panoramas/space_1_top.jpg" "../UniversalMediaPanoramas/space_1_top.jpg " "https://www.web3d.org/WorkingGroups/media/textures/panoramas/space_1_top.jpg " "https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/space_1_top.jpg " "http://www.web3dmedia.com/UniversalMedia/textures/panoramas/space_1_top.jpg " "http://www.officetowers.com/UniversalMedia/textures/panoramas/space_1_top.jpg " "http://geometrek.com/UniversalMedia/textures/panoramas/space_1_top.jpg " "http://www.sc.ehu.es/ccwgamoa/UniversalMedia/textures/panoramas/space_1_top.jpg " ' />
</Scene>
</X3D>
<!--

to top <!-- Event Graph ROUTE Table shows event connections -->
 
<!-- Index for DEF nodes: BALL_COLOR_1, BALL_COLOR_2, BALL_COLOR_3, BALL1, beam, Clock, CLOCK_1, CLOCK_2, CLOCK_3, Clock1_1, Clock1_2, Clock1_3, Clock1_4, Clock2_1, Clock2_2, Clock2_3, Clock2_4, ClockOrient1, ClockOrient2, COLOR_PATH_1, COLOR_PATH_2, COLOR_PATH_3, cylinder, orienFlip1, orienFlip2, PosBall1, PosFlip1_1, PosFlip1_2, PosFlip1_3, PosFlip1_4, PosFlip2_1, PosFlip2_2, PosFlip2_3, PosFlip2_4, routeSelecter1, routeSelecter2, sideBeam, stck1, stck2, stick, TommyPinballGame, Touch, Touch1, Touch2, WoodAppearance

Index for Viewpoint nodes: Viewpoint_1, Viewpoint_2, Viewpoint_3, Viewpoint_4, Viewpoint_5
-->

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

Touch
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
Clock
TimeSensor
set_startTime
SFTime

 
 
then
Clock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
PosBall1
PositionInterpolator
set_fraction
SFFloat

 
 
then
PosBall1
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
BALL1
Transform
set_translation
SFVec3f


Touch1
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
routeSelecter1
Script
set_startTime
SFTime

 
 
then
routeSelecter1
Script
startTime1
SFTime

ROUTE
event to
(2)
Clock1_1
TimeSensor
set_startTime
SFTime

 
 
then
Clock1_1
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(3)
PosFlip1_1
PositionInterpolator
set_fraction
SFFloat

 
 
then
PosFlip1_1
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(4)
BALL1
Transform
set_translation
SFVec3f
 
 
 
then
routeSelecter1
Script
startTime2
SFTime

ROUTE
event to
(2)
Clock1_2
TimeSensor
set_startTime
SFTime

 
 
then
Clock1_2
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(3)
PosFlip1_2
PositionInterpolator
set_fraction
SFFloat

 
 
then
PosFlip1_2
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(4)
BALL1
Transform
set_translation
SFVec3f
 
 
 
then
routeSelecter1
Script
startTime3
SFTime

ROUTE
event to
(2)
Clock1_3
TimeSensor
set_startTime
SFTime

 
 
then
Clock1_3
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(3)
PosFlip1_3
PositionInterpolator
set_fraction
SFFloat

 
 
then
PosFlip1_3
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(4)
BALL1
Transform
set_translation
SFVec3f
 
 
 
then
routeSelecter1
Script
startTime4
SFTime

ROUTE
event to
(2)
Clock1_4
TimeSensor
set_startTime
SFTime

 
 
then
Clock1_4
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(3)
PosFlip1_4
PositionInterpolator
set_fraction
SFFloat

 
 
then
PosFlip1_4
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(4)
BALL1
Transform
set_translation
SFVec3f
Touch1
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
ClockOrient1
TimeSensor
set_startTime
SFTime

 
 
then
ClockOrient1
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
orienFlip1
OrientationInterpolator
set_fraction
SFFloat

 
 
then
orienFlip1
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
stck1
Transform
set_rotation
SFRotation


Touch2
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
routeSelecter2
Script
set_startTime
SFTime

 
 
then
routeSelecter2
Script
startTime1
SFTime

ROUTE
event to
(2)
Clock2_1
TimeSensor
set_startTime
SFTime

 
 
then
Clock2_1
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(3)
PosFlip2_1
PositionInterpolator
set_fraction
SFFloat

 
 
then
PosFlip2_1
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(4)
BALL1
Transform
set_translation
SFVec3f
 
 
 
then
routeSelecter2
Script
startTime2
SFTime

ROUTE
event to
(2)
Clock2_2
TimeSensor
set_startTime
SFTime

 
 
then
Clock2_2
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(3)
PosFlip2_2
PositionInterpolator
set_fraction
SFFloat

 
 
then
PosFlip2_2
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(4)
BALL1
Transform
set_translation
SFVec3f
 
 
 
then
routeSelecter2
Script
startTime3
SFTime

ROUTE
event to
(2)
Clock2_3
TimeSensor
set_startTime
SFTime

 
 
then
Clock2_3
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(3)
PosFlip2_3
PositionInterpolator
set_fraction
SFFloat

 
 
then
PosFlip2_3
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(4)
BALL1
Transform
set_translation
SFVec3f
 
 
 
then
routeSelecter2
Script
startTime4
SFTime

ROUTE
event to
(2)
Clock2_4
TimeSensor
set_startTime
SFTime

 
 
then
Clock2_4
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(3)
PosFlip2_4
PositionInterpolator
set_fraction
SFFloat

 
 
then
PosFlip2_4
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(4)
BALL1
Transform
set_translation
SFVec3f
Touch2
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
ClockOrient2
TimeSensor
set_startTime
SFTime

 
 
then
ClockOrient2
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
orienFlip2
OrientationInterpolator
set_fraction
SFFloat

 
 
then
orienFlip2
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(3)
stck2
Transform
set_rotation
SFRotation


CLOCK_1
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
COLOR_PATH_1
ColorInterpolator
set_fraction
SFFloat

 
 
then
COLOR_PATH_1
ColorInterpolator
value_changed
SFColor

ROUTE
event to
(2)
BALL_COLOR_1
Material
set_emissiveColor
SFColor


CLOCK_2
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
COLOR_PATH_2
ColorInterpolator
set_fraction
SFFloat

 
 
then
COLOR_PATH_2
ColorInterpolator
value_changed
SFColor

ROUTE
event to
(2)
BALL_COLOR_2
Material
set_emissiveColor
SFColor


CLOCK_3
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
COLOR_PATH_3
ColorInterpolator
set_fraction
SFFloat

 
 
then
COLOR_PATH_3
ColorInterpolator
value_changed
SFColor

ROUTE
event to
(2)
BALL_COLOR_3
Material
set_emissiveColor
SFColor



-->

<!-- Online at
https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/PinballTableIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Basic/StudentProjects/PinballTable.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. -->