<?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=' Desk.x3d '/>
<meta name='descriptioncontent='A reusable desk prototype - click on drawers to open/shut.'/>
<meta name='creatorcontent='Frederic Roussille'/>
<meta name='createdcontent='1 April 2001'/>
<meta name='modifiedcontent='20 October 2019'/>
<meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/Desk.x3d '/>
<meta name='generatorcontent='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit'/>
<meta name='licensecontent=' ../license.html'/>
</head>
<!-- -->
<Scene>
<WorldInfo title='Desk.x3d'/>
<ProtoDeclare name='Desk'>
<ProtoInterface>
<field name='diffuseColortype='SFColorvalue='0.5 0.4 0.2accessType='inputOutput'/>
</ProtoInterface>
<ProtoBody>
<Group>
<!-- top of the desk -->
<Shape>
<Appearance DEF='desk_color'>
<Material DEF='color'>
<IS>
<connect nodeField='diffuseColorprotoField='diffuseColor'/>
</IS>
</Material>
</Appearance>
<Box size='20 1 13'/>
</Shape>
<Transform translation='0 -5 -6'>
<!-- back of the desk -->
<Shape>
<Appearance USE=' desk_color'/>
<Box size='20 10 1'/>
</Shape>
</Transform>
<!-- left box -->
<Transform rotation='1 0 0 1.57translation='-10 -10 -6.5'>
<Shape>
<Appearance USE=' desk_color'/>
<IndexedFaceSet DEF='boxcoordIndex='0 1 2 3 -1 1 5 6 2 -1 5 4 7 6 -1 4 0 3 7 -1 4 5 1 0 -1 9 8 11 10 -1 13 9 10 14 -1 12 13 14 15 -1 8 12 15 3 -1 9 13 12 8 -1 3 2 10 11 -1 2 6 14 10 -1 6 7 15 14 -1 7 3 11 15 -1'>
<Coordinate point='0 0 0 5 0 0 5 12.5 0 0 12.5 0 0 0 -9.5 5 0 -9.5 5 12.5 -9.5 0 12.5 -9.5 0.5 0.5 -0.5 4.5 0.5 -0.5 4.5 12.5 -0.5 0.5 12.5 -0.5 0.5 0.5 -9 4.5 0.5 -9 4.5 12.5 -9 0.5 12.5 -9'/>
</IndexedFaceSet>
</Shape>
</Transform>
<!-- right box -->
<Transform rotation='1 0 0 1.57translation='5 -10 -6.5'>
<Shape>
<Appearance USE=' desk_color'/>
<IndexedFaceSet USE=' box'/>
</Shape>
</Transform>
<!-- drawers -->
<!-- ROUTE information for drawer1 node:  [from drawer1_path.value_changed to set_translation ] -->
<Transform DEF='drawer1translation='-9.5 -5.25 6'>
<Group DEF='drawer'>
<Transform scale='0.8 0.34 1.2105'>
<Shape>
<Appearance USE=' desk_color'/>
<IndexedFaceSet USE=' box'/>
</Shape>
</Transform>
<Transform rotation='1 0 0 1.57translation='1 2.125 -0.05'>
<Shape>
<Appearance DEF='gray'>
<Material diffuseColor='0.5 0.5 0.5'/>
</Appearance>
<Extrusion creaseAngle='1.57crossSection='0.1 0 0.092 -0.038 0.071 -0.071 0.038 -0.092 0 -0.1 -0.038 -0.092 -0.071 -0.071 -0.092 -0.038 -0.1 0 -0.092 0.038 -0.071 0.071 -0.038 0.092 0 0.1 0.038 0.092 0.071 0.071 0.092 0.038 0.1 0spine='0 0 0 0.5 0.5 0 1.5 0.5 0 2 0 0'/>
</Shape>
</Transform>
</Group>
<!-- ROUTE information for touch_drawer1 node:  [from touchTime to clock1.startTime ] [from touchTime to drawer1_path_js.set_path ] -->
<TouchSensor DEF='touch_drawer1description='touch to open close'/>
</Transform>
<!-- ROUTE information for drawer2 node:  [from drawer2_path.value_changed to set_translation ] -->
<Transform DEF='drawer2translation='-9.5 -9.5 6'>
<Group USE=' drawer'/>
<!-- ROUTE information for touch_drawer2 node:  [from touchTime to clock2.startTime ] [from touchTime to drawer2_path_js.set_path ] -->
<TouchSensor DEF='touch_drawer2description='touch to open close'/>
</Transform>
<!-- ROUTE information for drawer3 node:  [from drawer3_path.value_changed to set_translation ] -->
<Transform DEF='drawer3translation='5.5 -5.25 6'>
<Group USE=' drawer'/>
<!-- ROUTE information for touch_drawer3 node:  [from touchTime to clock3.startTime ] [from touchTime to drawer3_path_js.set_path ] -->
<TouchSensor DEF='touch_drawer3description='touch to open close'/>
</Transform>
<!-- ROUTE information for drawer4 node:  [from drawer4_path.value_changed to set_translation ] -->
<Transform DEF='drawer4translation='5.5 -9.5 6'>
<Group USE=' drawer'/>
<!-- ROUTE information for touch_drawer4 node:  [from touchTime to clock4.startTime ] [from touchTime to drawer4_path_js.set_path ] -->
<TouchSensor DEF='touch_drawer4description='touch to open close'/>
</Transform>
<Group DEF='AnimationGroup'>
<!-- path for drawer 1 -->
<!-- ROUTE information for clock1 node:  [from touch_drawer1.touchTime to startTime ] [from fraction_changed to drawer1_path.set_fraction ] -->
<TimeSensor DEF='clock1'/>

<!-- ROUTE information for drawer1_path node:  [from drawer1_path_js.keyValue_changed to set_keyValue ] [from clock1.fraction_changed to set_fraction ] [from value_changed to drawer1.set_translation ] -->
<PositionInterpolator DEF='drawer1_pathkey='0 1keyValue='0 0 0 0 0 0'/>

<!-- ROUTE information for drawer1_path_js node:  [from touch_drawer1.touchTime to set_path ] [from keyValue_changed to drawer1_path.set_keyValue ] -->
<Script DEF='drawer1_path_js'>
<field name='set_pathtype='SFTimeaccessType='inputOnly'/>
<field name='keyValue_changedtype='MFVec3faccessType='outputOnly'/>
<field name='opentype='SFBoolvalue='falseaccessType='initializeOnly'/>
<![CDATA[
              
ecmascript:
function set_path() {
  keyValue_changed[0][0]= -9.5;
  keyValue_changed[0][1]= -5.25;
  keyValue_changed[1][0]= -9.5;
  keyValue_changed[1][1]= -5.25;
  if (open==false) {
    keyValue_changed[0][2]= 6;
    keyValue_changed[1][2]= 12;
    open = true;
  } else {
     if (open==true) {
       keyValue_changed[0][2]= 12;
       keyValue_changed[1][2]= 6;
       open = false;
     }
    }
}

            
]]>
</Script>
<!-- path for drawer 3 -->
<!-- ROUTE information for clock3 node:  [from touch_drawer3.touchTime to startTime ] [from fraction_changed to drawer3_path.set_fraction ] -->
<TimeSensor DEF='clock3'/>

<!-- ROUTE information for drawer3_path node:  [from drawer3_path_js.keyValue_changed to set_keyValue ] [from clock3.fraction_changed to set_fraction ] [from value_changed to drawer3.set_translation ] -->
<PositionInterpolator DEF='drawer3_pathkey='0 1keyValue='0 0 0 0 0 0'/>

<!-- ROUTE information for drawer3_path_js node:  [from touch_drawer3.touchTime to set_path ] [from keyValue_changed to drawer3_path.set_keyValue ] -->
<Script DEF='drawer3_path_js'>
<field name='set_pathtype='SFTimeaccessType='inputOnly'/>
<field name='keyValue_changedtype='MFVec3faccessType='outputOnly'/>
<field name='opentype='SFBoolvalue='falseaccessType='initializeOnly'/>
<![CDATA[
              
ecmascript:
function set_path() {
  keyValue_changed[0][0]= 5.5;
  keyValue_changed[0][1]= -5.25;
  keyValue_changed[1][0]= 5.5;
  keyValue_changed[1][1]= -5.25;
  if (open==false) {
    keyValue_changed[0][2]= 6;
    keyValue_changed[1][2]= 12;
    open = true;
  } else {
     if (open==true) {
       keyValue_changed[0][2]= 12;
       keyValue_changed[1][2]= 6;
       open = false;
     }
    }
}

            
]]>
</Script>
<!-- path for drawer 2 -->
<!-- ROUTE information for clock2 node:  [from touch_drawer2.touchTime to startTime ] [from fraction_changed to drawer2_path.set_fraction ] -->
<TimeSensor DEF='clock2'/>

<!-- ROUTE information for drawer2_path node:  [from drawer2_path_js.keyValue_changed to set_keyValue ] [from clock2.fraction_changed to set_fraction ] [from value_changed to drawer2.set_translation ] -->
<PositionInterpolator DEF='drawer2_pathkey='0 1keyValue='0 0 0 0 0 0'/>

<!-- ROUTE information for drawer2_path_js node:  [from touch_drawer2.touchTime to set_path ] [from keyValue_changed to drawer2_path.set_keyValue ] -->
<Script DEF='drawer2_path_js'>
<field name='set_pathtype='SFTimeaccessType='inputOnly'/>
<field name='keyValue_changedtype='MFVec3faccessType='outputOnly'/>
<field name='opentype='SFBoolvalue='falseaccessType='initializeOnly'/>
<![CDATA[
              
ecmascript:
function set_path() {
  keyValue_changed[0][0]= -9.5;
  keyValue_changed[0][1]= -9.5;
  keyValue_changed[1][0]= -9.5;
  keyValue_changed[1][1]= -9.5;
  if (open==false) {
    keyValue_changed[0][2]= 6;
    keyValue_changed[1][2]= 12;
    open = true;
  } else {
     if (open==true) {
       keyValue_changed[0][2]= 12;
       keyValue_changed[1][2]= 6;
       open = false;
     }
    }
}

            
]]>
</Script>
<!-- path for drawer 4 -->
<!-- ROUTE information for clock4 node:  [from touch_drawer4.touchTime to startTime ] [from fraction_changed to drawer4_path.set_fraction ] -->
<TimeSensor DEF='clock4'/>

<!-- ROUTE information for drawer4_path node:  [from drawer4_path_js.keyValue_changed to set_keyValue ] [from clock4.fraction_changed to set_fraction ] [from value_changed to drawer4.set_translation ] -->
<PositionInterpolator DEF='drawer4_pathkey='0 1keyValue='0 0 0 0 0 0'/>

<!-- ROUTE information for drawer4_path_js node:  [from touch_drawer4.touchTime to set_path ] [from keyValue_changed to drawer4_path.set_keyValue ] -->
<Script DEF='drawer4_path_js'>
<field name='set_pathtype='SFTimeaccessType='inputOnly'/>
<field name='keyValue_changedtype='MFVec3faccessType='outputOnly'/>
<field name='opentype='SFBoolvalue='falseaccessType='initializeOnly'/>
<![CDATA[
              
ecmascript:
function set_path() {
  keyValue_changed[0][0]= 5.5;
  keyValue_changed[0][1]= -9.5;
  keyValue_changed[1][0]= 5.5;
  keyValue_changed[1][1]= -9.5;
  if (open==false) {
    keyValue_changed[0][2]= 6;
    keyValue_changed[1][2]= 12;
    open = true;
  } else {
     if (open==true) {
       keyValue_changed[0][2]= 12;
       keyValue_changed[1][2]= 6;
       open = false;
     }
    }
}

            
]]>
</Script>
<!-- Routes for drawer 1 -->
< ROUTE  fromNode=' touch_drawer1' fromField='touchTime' toNode=' clock1' toField='startTime'/>
< ROUTE  fromNode=' touch_drawer1' fromField='touchTime' toNode=' drawer1_path_js' toField='set_path'/>
< ROUTE  fromNode=' drawer1_path_js' fromField='keyValue_changed' toNode=' drawer1_path' toField='set_keyValue'/>
< ROUTE  fromNode=' clock1' fromField='fraction_changed' toNode=' drawer1_path' toField='set_fraction'/>
< ROUTE  fromNode=' drawer1_path' fromField='value_changed' toNode=' drawer1' toField='set_translation'/>
<!-- Routes for drawer 3 -->
< ROUTE  fromNode=' touch_drawer3' fromField='touchTime' toNode=' clock3' toField='startTime'/>
< ROUTE  fromNode=' touch_drawer3' fromField='touchTime' toNode=' drawer3_path_js' toField='set_path'/>
< ROUTE  fromNode=' drawer3_path_js' fromField='keyValue_changed' toNode=' drawer3_path' toField='set_keyValue'/>
< ROUTE  fromNode=' clock3' fromField='fraction_changed' toNode=' drawer3_path' toField='set_fraction'/>
< ROUTE  fromNode=' drawer3_path' fromField='value_changed' toNode=' drawer3' toField='set_translation'/>
<!-- Route for drawer 2 -->
< ROUTE  fromNode=' touch_drawer2' fromField='touchTime' toNode=' clock2' toField='startTime'/>
< ROUTE  fromNode=' touch_drawer2' fromField='touchTime' toNode=' drawer2_path_js' toField='set_path'/>
< ROUTE  fromNode=' drawer2_path_js' fromField='keyValue_changed' toNode=' drawer2_path' toField='set_keyValue'/>
< ROUTE  fromNode=' clock2' fromField='fraction_changed' toNode=' drawer2_path' toField='set_fraction'/>
< ROUTE  fromNode=' drawer2_path' fromField='value_changed' toNode=' drawer2' toField='set_translation'/>
<!-- Route for drawer 4 -->
< ROUTE  fromNode=' touch_drawer4' fromField='touchTime' toNode=' clock4' toField='startTime'/>
< ROUTE  fromNode=' touch_drawer4' fromField='touchTime' toNode=' drawer4_path_js' toField='set_path'/>
< ROUTE  fromNode=' drawer4_path_js' fromField='keyValue_changed' toNode=' drawer4_path' toField='set_keyValue'/>
< ROUTE  fromNode=' clock4' fromField='fraction_changed' toNode=' drawer4_path' toField='set_fraction'/>
< ROUTE  fromNode=' drawer4_path' fromField='value_changed' toNode=' drawer4' toField='set_translation'/>
</Group>
</Group>
</ProtoBody>
</ProtoDeclare>
<ProtoInstance name='Desk'/>
<Viewpoint description='Entryposition='0 0 40'/>
</Scene>
</X3D>
<!--

to top <!-- Event Graph ROUTE Table shows event connections -->
 
<!-- Index for DEF nodes: AnimationGroup, box, clock1, clock2, clock3, clock4, color, desk_color, drawer, drawer1, drawer1_path, drawer1_path_js, drawer2, drawer2_path, drawer2_path_js, drawer3, drawer3_path, drawer3_path_js, drawer4, drawer4_path, drawer4_path_js, gray, touch_drawer1, touch_drawer2, touch_drawer3, touch_drawer4

Index for Viewpoint node: Viewpoint_1

Index for ProtoDeclare definition: Desk
-->

Event Graph ROUTE Table entries with 20 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_drawer1
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
clock1
TimeSensor
startTime
SFTime

 
 
then
clock1
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
drawer1_path
PositionInterpolator
set_fraction
SFFloat

 
 
then
drawer1_path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
drawer1
Transform
set_translation
SFVec3f
touch_drawer1
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
drawer1_path_js
Script
set_path
SFTime

 
 
then
drawer1_path_js
Script
keyValue_changed
MFVec3f

ROUTE
event to
(2)
drawer1_path
PositionInterpolator
set_keyValue
MFVec3f

 
 
then
drawer1_path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
drawer1
Transform
set_translation
SFVec3f


touch_drawer2
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
clock2
TimeSensor
startTime
SFTime

 
 
then
clock2
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
drawer2_path
PositionInterpolator
set_fraction
SFFloat

 
 
then
drawer2_path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
drawer2
Transform
set_translation
SFVec3f
touch_drawer2
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
drawer2_path_js
Script
set_path
SFTime

 
 
then
drawer2_path_js
Script
keyValue_changed
MFVec3f

ROUTE
event to
(2)
drawer2_path
PositionInterpolator
set_keyValue
MFVec3f

 
 
then
drawer2_path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
drawer2
Transform
set_translation
SFVec3f


touch_drawer3
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
clock3
TimeSensor
startTime
SFTime

 
 
then
clock3
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
drawer3_path
PositionInterpolator
set_fraction
SFFloat

 
 
then
drawer3_path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
drawer3
Transform
set_translation
SFVec3f
touch_drawer3
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
drawer3_path_js
Script
set_path
SFTime

 
 
then
drawer3_path_js
Script
keyValue_changed
MFVec3f

ROUTE
event to
(2)
drawer3_path
PositionInterpolator
set_keyValue
MFVec3f

 
 
then
drawer3_path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
drawer3
Transform
set_translation
SFVec3f


touch_drawer4
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
clock4
TimeSensor
startTime
SFTime

 
 
then
clock4
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(2)
drawer4_path
PositionInterpolator
set_fraction
SFFloat

 
 
then
drawer4_path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
drawer4
Transform
set_translation
SFVec3f
touch_drawer4
TouchSensor
touchTime
SFTime

ROUTE
event to
(1)
drawer4_path_js
Script
set_path
SFTime

 
 
then
drawer4_path_js
Script
keyValue_changed
MFVec3f

ROUTE
event to
(2)
drawer4_path
PositionInterpolator
set_keyValue
MFVec3f

 
 
then
drawer4_path
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(3)
drawer4
Transform
set_translation
SFVec3f



ProtoInstance
Desk
No ROUTE connection found for output from this node.
Contains SFNode/MFNode field with indirect access to other nodes. 


-->

<!-- Online at
https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/DeskIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Basic/StudentProjects/Desk.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)
    <ProtoInstance name='ProtoName'> <field name='fieldName'/> </ProtoInstance> -->

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