<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "https://www.web3d.org/specifications/x3d-4.0.dtd">
<X3D profile='Immersive' version='4.0' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-4.0.xsd'>
  <head>
    <meta content='ExecutionModel.x3d' name='title'/>
    <meta content='X3D encodings example: execution model demonstrated. Click ball to see script-generated text appear.' name='description'/>
    <meta content='Don Brutzman and Joe Williams' name='creator'/>
    <meta content='1 June 2002' name='created'/>
    <meta content='28 September 2025' name='modified'/>
    <meta content='X3D encodings, ISO/IEC 19776-1.3, Part 1: XML encoding, Annex C.19 Execution model' name='specificationSection'/>
    <meta content='https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19776-1v4.0-CD/Part01/examples.html#ExecutionModel' name='specificationUrl'/>
    <meta content='https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/ExecutionModel.x3d' name='identifier'/>
    <meta content='X3D-Edit 4.0, https://www.web3d.org/x3d/tools/X3D-Edit' name='generator'/>
    <meta content='../license.html' name='license'/>
  </head>
  <Scene>
    <WorldInfo title='ExecutionModel.x3d'/>
    <TouchSensor DEF='TS' description='click to animate'/>
    <Script DEF='Script1'>
      <field accessType='inputOnly' name='touchTime' type='SFTime'/>
      <field accessType='outputOnly' name='toScript2' type='SFBool'/>
      <field accessType='outputOnly' name='toScript3' type='SFBool'/>
      <field accessType='outputOnly' name='string' type='SFString'/>
      <![CDATA[
ecmascript:
      function touchTime() {
        toScript2 = true;
      }
      function eventsProcessed() {
        string = 'Script1.eventsProcessed';
        toScript3 = true;
      }
]]>
    </Script>
    <Script DEF='Script2'>
      <field accessType='inputOnly' name='fromScript1' type='SFBool'/>
      <field accessType='outputOnly' name='toScript4' type='SFBool'/>
      <field accessType='outputOnly' name='string' type='SFString'/>
      <![CDATA[
ecmascript:
      function fromScript1() {
      }
      function eventsProcessed() {
        string = 'Script2.eventsProcessed';
        toScript4 = true;
      }
]]>
    </Script>
    <Script DEF='Script3'>
      <field accessType='inputOnly' name='fromScript1' type='SFBool'/>
      <field accessType='outputOnly' name='toScript5' type='SFBool'/>
      <field accessType='outputOnly' name='toScript6' type='SFBool'/>
      <field accessType='outputOnly' name='string' type='SFString'/>
      <![CDATA[
ecmascript:
      function fromScript1() {
        toScript5 = true;
      }
      function eventsProcessed() {
        string = 'Script3.eventsProcessed';
        toScript6 = true;
      }
]]>
    </Script>
    <Script DEF='Script4'>
      <field accessType='inputOnly' name='fromScript2' type='SFBool'/>
      <![CDATA[
ecmascript:
      function fromScript2() {
      }
]]>
    </Script>
    <Script DEF='Script5'>
      <field accessType='inputOnly' name='fromScript3' type='SFBool'/>
      <![CDATA[
ecmascript:
       function fromScript3() {
      }
]]>
    </Script>
    <Script DEF='Script6'>
      <field accessType='inputOnly' name='fromScript3' type='SFBool'/>
      <field accessType='outputOnly' name='toScript7' type='SFBool'/>
      <field accessType='outputOnly' name='string' type='SFString'/>
      <![CDATA[
ecmascript:
      function fromScript3() {
        toScript7 = true;
      }
      function eventsProcessed() {
        string = 'Script6.eventsProcessed';
      }
]]>
    </Script>
    <Script DEF='Script7'>
      <field accessType='inputOnly' name='fromScript6' type='SFBool'/>
      <![CDATA[
ecmascript:
      function fromScript6 () {
      }
]]>
    </Script>
    <!-- Display the results -->
    <Script DEF='Collector'>
      <field accessType='outputOnly' name='string' type='MFString'/>
      <field accessType='inputOnly' name='fromString' type='SFString'/>
      <![CDATA[
ecmascript:
      function initialize() {
        string[0] = 'Event Sequence:';
      }
      function fromString(s) {
        i = string.length;
        string[i] = ' ( ' + i + ' ) ' + s + ' occurred';
      }
]]>
    </Script>
    <Transform translation='0 2 0'>
      <Shape>
        <Appearance>
          <Material diffuseColor='0 0.6 0'/>
        </Appearance>
        <Sphere/>
      </Shape>
    </Transform>
    <Shape>
      <Text DEF='Result'/>
      <Appearance>
        <Material diffuseColor='0.101961 0.839216 1'/>
      </Appearance>
    </Shape>
    <Viewpoint description='Execution model example' position='7 -1 18'/>
    <ROUTE fromField='touchTime' fromNode='TS' toField='touchTime' toNode='Script1'/>
    <ROUTE fromField='toScript2' fromNode='Script1' toField='fromScript1' toNode='Script2'/>
    <ROUTE fromField='toScript3' fromNode='Script1' toField='fromScript1' toNode='Script3'/>
    <ROUTE fromField='toScript4' fromNode='Script2' toField='fromScript2' toNode='Script4'/>
    <ROUTE fromField='toScript5' fromNode='Script3' toField='fromScript3' toNode='Script5'/>
    <ROUTE fromField='toScript6' fromNode='Script3' toField='fromScript3' toNode='Script6'/>
    <ROUTE fromField='toScript7' fromNode='Script6' toField='fromScript6' toNode='Script7'/>
    <ROUTE fromField='string' fromNode='Script1' toField='fromString' toNode='Collector'/>
    <ROUTE fromField='string' fromNode='Script2' toField='fromString' toNode='Collector'/>
    <ROUTE fromField='string' fromNode='Script3' toField='fromString' toNode='Collector'/>
    <ROUTE fromField='string' fromNode='Script6' toField='fromString' toNode='Collector'/>
    <ROUTE fromField='string' fromNode='Collector' toField='string' toNode='Result'/>
  </Scene>
</X3D>