<?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='Figure30.1ScriptSlidingBall.x3d' name='title'/>
    <meta content='Figure 30.1, The VRML 2.0 Sourcebook, Copyright [1997] By Andrea L. Ames, David R. Nadeau, and John L. Moreland' name='creator'/>
    <meta content='http://www.wiley.com/legacy/compbooks/vrml2sbk/ch30/30fig01.htm' name='reference'/>
    <meta content='Don Brutzman' name='translator'/>
    <meta content='28 November 2000' name='created'/>
    <meta content='4 February 2014' name='modified'/>
    <meta content='A sliding red sphere and a custom interpolation script. Three ways to include ECMAScript (JavaScript) programming are compared: external file, url script code, and embedded script code. Recommendation: use embedded script code inside a CDATA block.' name='description'/>
    <meta content='http://www.web3d.org/x3d/content/examples/Vrml2Sourcebook/Chapter30-Scripts/Figure30.1ScriptSlidingBall.x3d' name='identifier'/>
    <meta content='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit' name='generator'/>
    <meta content='../../license.html' name='license'/>
  </head>
  <Scene>
    <Viewpoint description='sliding ball' orientation='1 0 0 -0.2' position='0.5 0.5 1.5'/>
    <!-- Background nodes are usually best placed at the top of the scene since they have global effect and are bindable nodes. -->
    <Background groundAngle='1.309 1.570796' groundColor='0 0 0.1 0 0.1 0.3 0.3 0.3 0.6' skyAngle='1.309 1.571' skyColor='1 0 0.8 0.5 0 0.8 0 0 0.8'/>
    <Group>
      <Transform DEF='Floor' translation='0.5 -0.005 0'>
        <Shape>
          <Box size='1 0.01 0.5'/>
          <Appearance>
            <Material diffuseColor='0.7 0.7 0.7'/>
          </Appearance>
        </Shape>
      </Transform>
      <Transform translation='0 0.1 0'>
        <Transform DEF='BallTransform'>
          <Shape>
            <Sphere radius='0.1'/>
            <Appearance>
              <Material diffuseColor='1 0.3 0.3'/>
            </Appearance>
          </Shape>
        </Transform>
      </Transform>
      <TimeSensor DEF='Clock' cycleInterval='4' loop='true'/>
      <!-- In this example, each Script node can serve as a simple replacement for a PositionInterpolator node. -->
      <!-- First Script example: external .js javascript file. This can be helpful if multiple Script nodes (perhaps in multiple scenes) reuse the same code, allowing any changes to occur in a single .js ecmascript file. -->
      <Script DEF='MoverUsingExternalScriptFile' url='"Figure30.1ScriptSlidingBall.js" "http://www.web3d.org/x3d/content/examples/Vrml2Sourcebook/Chapter30-Scripts/Figure30.1ScriptSlidingBall.js"'>
        <field accessType='inputOnly' name='set_fraction' type='SFFloat'/>
        <field accessType='outputOnly' name='value_changed' type='SFVec3f'/>
      </Script>
      <!-- Second Script example: executable code is placed in url field. This is legal, but no longer a recommended approach. -->
      <!-- Warning: avoid // inline comments or else canonicalization will hide all follow-on code! -->
      <Script DEF='MoverUsingUrlScript' url='"ecmascript: function set_fraction( fraction eventTime ) { value_changed[0] = fraction; value_changed[1] = 0.0; value_changed[2] = 0.0; }"'>
        <field accessType='inputOnly' name='set_fraction' type='SFFloat'/>
        <field accessType='outputOnly' name='value_changed' type='SFVec3f'/>
      </Script>
      <!-- Third Script example, using preferred method: script code contained in CDATA block -->
      <Script DEF='MoverUsingContainedScript'>
        <field accessType='inputOnly' appinfo='receive fraction from clock' name='set_fraction' type='SFFloat'/>
        <field accessType='outputOnly' appinfo='produce output position to move the ball' name='value_changed' type='SFVec3f'/>
        <![CDATA[
ecmascript:

// Move a shape in a straight path
function set_fraction( fraction, eventTime ) {
	value_changed[0] = fraction;    // X component
	value_changed[1] = 0.0;         // Y component
	value_changed[2] = 0.0;         // Z component
}
]]>
      </Script>
    </Group>
    <!-- Any one of the three Mover script alternatives can drive the ball - modify both ROUTEs to test -->
    <ROUTE fromField='fraction_changed' fromNode='Clock' toField='set_fraction' toNode='MoverUsingContainedScript'/>
    <ROUTE fromField='value_changed' fromNode='MoverUsingContainedScript' toField='set_translation' toNode='BallTransform'/>
  </Scene>
</X3D>