<?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 content='Desk.x3d' name='title'/>
    <meta content='A reusable desk prototype - click on drawers to open/shut.' name='description'/>
    <meta content='Frederic Roussille' name='creator'/>
    <meta content='1 April 2001' name='created'/>
    <meta content='20 October 2019' name='modified'/>
    <meta content='https://www.web3d.org/x3d/content/examples/Basic/StudentProjects/Desk.x3d' name='identifier'/>
    <meta content='X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit' name='generator'/>
    <meta content='../license.html' name='license'/>
  </head>
  <Scene>
    <WorldInfo title='Desk.x3d'/>
    <ProtoDeclare name='Desk'>
      <ProtoInterface>
        <field accessType='inputOutput' name='diffuseColor' type='SFColor' value='0.5 0.4 0.2'/>
      </ProtoInterface>
      <ProtoBody>
        <Group>
          <!-- top of the desk -->
          <Shape>
            <Appearance DEF='desk_color'>
              <Material DEF='color'>
                <IS>
                  <connect nodeField='diffuseColor' protoField='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.57' translation='-10 -10 -6.5'>
            <Shape>
              <Appearance USE='desk_color'/>
              <IndexedFaceSet DEF='box' coordIndex='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.57' translation='5 -10 -6.5'>
            <Shape>
              <Appearance USE='desk_color'/>
              <IndexedFaceSet USE='box'/>
            </Shape>
          </Transform>
          <!-- drawers -->
          <Transform DEF='drawer1' translation='-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.57' translation='1 2.125 -0.05'>
                <Shape>
                  <Appearance DEF='gray'>
                    <Material diffuseColor='0.5 0.5 0.5'/>
                  </Appearance>
                  <Extrusion creaseAngle='1.57' crossSection='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 0' spine='0 0 0 0.5 0.5 0 1.5 0.5 0 2 0 0'/>
                </Shape>
              </Transform>
            </Group>
            <TouchSensor DEF='touch_drawer1' description='touch to open close'/>
          </Transform>
          <Transform DEF='drawer2' translation='-9.5 -9.5 6'>
            <Group USE='drawer'/>
            <TouchSensor DEF='touch_drawer2' description='touch to open close'/>
          </Transform>
          <Transform DEF='drawer3' translation='5.5 -5.25 6'>
            <Group USE='drawer'/>
            <TouchSensor DEF='touch_drawer3' description='touch to open close'/>
          </Transform>
          <Transform DEF='drawer4' translation='5.5 -9.5 6'>
            <Group USE='drawer'/>
            <TouchSensor DEF='touch_drawer4' description='touch to open close'/>
          </Transform>
          <Group DEF='AnimationGroup'>
            <!-- path for drawer 1 -->
            <TimeSensor DEF='clock1'/>
            <PositionInterpolator DEF='drawer1_path' key='0 1' keyValue='0 0 0 0 0 0'/>
            <Script DEF='drawer1_path_js'>
              <field accessType='inputOnly' name='set_path' type='SFTime'/>
              <field accessType='outputOnly' name='keyValue_changed' type='MFVec3f'/>
              <field accessType='initializeOnly' name='open' type='SFBool' value='false'/>
              <![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 -->
            <TimeSensor DEF='clock3'/>
            <PositionInterpolator DEF='drawer3_path' key='0 1' keyValue='0 0 0 0 0 0'/>
            <Script DEF='drawer3_path_js'>
              <field accessType='inputOnly' name='set_path' type='SFTime'/>
              <field accessType='outputOnly' name='keyValue_changed' type='MFVec3f'/>
              <field accessType='initializeOnly' name='open' type='SFBool' value='false'/>
              <![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 -->
            <TimeSensor DEF='clock2'/>
            <PositionInterpolator DEF='drawer2_path' key='0 1' keyValue='0 0 0 0 0 0'/>
            <Script DEF='drawer2_path_js'>
              <field accessType='inputOnly' name='set_path' type='SFTime'/>
              <field accessType='outputOnly' name='keyValue_changed' type='MFVec3f'/>
              <field accessType='initializeOnly' name='open' type='SFBool' value='false'/>
              <![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 -->
            <TimeSensor DEF='clock4'/>
            <PositionInterpolator DEF='drawer4_path' key='0 1' keyValue='0 0 0 0 0 0'/>
            <Script DEF='drawer4_path_js'>
              <field accessType='inputOnly' name='set_path' type='SFTime'/>
              <field accessType='outputOnly' name='keyValue_changed' type='MFVec3f'/>
              <field accessType='initializeOnly' name='open' type='SFBool' value='false'/>
              <![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 fromField='touchTime' fromNode='touch_drawer1' toField='startTime' toNode='clock1'/>
            <ROUTE fromField='touchTime' fromNode='touch_drawer1' toField='set_path' toNode='drawer1_path_js'/>
            <ROUTE fromField='keyValue_changed' fromNode='drawer1_path_js' toField='set_keyValue' toNode='drawer1_path'/>
            <ROUTE fromField='fraction_changed' fromNode='clock1' toField='set_fraction' toNode='drawer1_path'/>
            <ROUTE fromField='value_changed' fromNode='drawer1_path' toField='set_translation' toNode='drawer1'/>
            <!-- Routes for drawer 3 -->
            <ROUTE fromField='touchTime' fromNode='touch_drawer3' toField='startTime' toNode='clock3'/>
            <ROUTE fromField='touchTime' fromNode='touch_drawer3' toField='set_path' toNode='drawer3_path_js'/>
            <ROUTE fromField='keyValue_changed' fromNode='drawer3_path_js' toField='set_keyValue' toNode='drawer3_path'/>
            <ROUTE fromField='fraction_changed' fromNode='clock3' toField='set_fraction' toNode='drawer3_path'/>
            <ROUTE fromField='value_changed' fromNode='drawer3_path' toField='set_translation' toNode='drawer3'/>
            <!-- Route for drawer 2 -->
            <ROUTE fromField='touchTime' fromNode='touch_drawer2' toField='startTime' toNode='clock2'/>
            <ROUTE fromField='touchTime' fromNode='touch_drawer2' toField='set_path' toNode='drawer2_path_js'/>
            <ROUTE fromField='keyValue_changed' fromNode='drawer2_path_js' toField='set_keyValue' toNode='drawer2_path'/>
            <ROUTE fromField='fraction_changed' fromNode='clock2' toField='set_fraction' toNode='drawer2_path'/>
            <ROUTE fromField='value_changed' fromNode='drawer2_path' toField='set_translation' toNode='drawer2'/>
            <!-- Route for drawer 4 -->
            <ROUTE fromField='touchTime' fromNode='touch_drawer4' toField='startTime' toNode='clock4'/>
            <ROUTE fromField='touchTime' fromNode='touch_drawer4' toField='set_path' toNode='drawer4_path_js'/>
            <ROUTE fromField='keyValue_changed' fromNode='drawer4_path_js' toField='set_keyValue' toNode='drawer4_path'/>
            <ROUTE fromField='fraction_changed' fromNode='clock4' toField='set_fraction' toNode='drawer4_path'/>
            <ROUTE fromField='value_changed' fromNode='drawer4_path' toField='set_translation' toNode='drawer4'/>
          </Group>
        </Group>
      </ProtoBody>
    </ProtoDeclare>
    <ProtoInstance name='Desk'/>
    <Viewpoint description='Entry' position='0 0 40'/>
  </Scene>
</X3D>