<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd">
<X3D profile='Immersive' version='3.3' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.3.xsd'>
  <head>
    <meta content='SideScanSonarExample.x3d' name='title'/>
    <meta content='Produce wireframe or transparent sidescan sonar beams.' name='description'/>
    <meta content='Don Brutzman' name='creator'/>
    <meta content='15 March 2001' name='created'/>
    <meta content='20 October 2019' name='modified'/>
    <meta content='https://www.web3d.org/x3d/content/examples/Savage/Robots/UnmannedUnderwaterVehicles/RemusSideScan.x3d' name='reference'/>
    <meta content='https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Sonar/SideScanSonarExample.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>
    <Background skyColor='0.2 0.2 0.4'/>
    <WorldInfo info='"Produce wireframe or transparent beam cones"' title='BeamConeExample'/>
    <Viewpoint description='SideScanSonar example' orientation='0 1 0 -1.57' position='-40 0 0'/>
    <ExternProtoDeclare appinfo='Produce wireframe or semi-transparent sonar sidescan beams' name='SideScanSonar' url='"../../../Savage/CommunicationsAndSensors/Sonar/SideScanSonarPrototype.x3d#SideScanSonar" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Sonar/SideScanSonarPrototype.x3d#SideScanSonar" "../../../Savage/CommunicationsAndSensors/Sonar/SideScanSonarPrototype.wrl#SideScanSonar" "https://www.web3d.org/x3d/content/examples/Savage/CommunicationsAndSensors/Sonar/SideScanSonarPrototype.wrl#SideScanSonar"'>
      <field accessType='inputOnly' appinfo='vertical distance above bottom in meters along y axis' name='altitude' type='SFFloat'/>
      <field accessType='initializeOnly' appinfo='default vertical distance above bottom in meters along y axis' name='defaultAltitude' type='SFFloat'/>
      <field accessType='initializeOnly' appinfo='maximum effective altitude of sidescan sonar above bottom' name='maxAltitude' type='SFFloat'/>
      <field accessType='initializeOnly' appinfo='distance in meters from nadir to rightmost/leftmost edge when operating at defaultAltitude above the bottom' name='defaultCrossTrackHalfRange' type='SFFloat'/>
      <field accessType='initializeOnly' appinfo='longitudinal width of a single return' name='defaultTrackWidthMeters' type='SFFloat'/>
      <field accessType='initializeOnly' appinfo='width (or diameter) of vehicle carrying port/starboard sidescan sonar transducers' name='vehicleWidthMeters' type='SFFloat'/>
      <field accessType='inputOnly' appinfo='(communications) whether transmitted signal is in contact with receiver or (sensor) is a target return detected?' name='contact' type='SFBool'/>
      <field accessType='initializeOnly' appinfo='draw lines for tracking shape?' name='wireframe' type='SFBool'/>
      <field accessType='initializeOnly' appinfo='draw solid tracking shape?' name='solid' type='SFBool'/>
      <field accessType='initializeOnly' appinfo='rendering color when contact=true' name='contactColor' type='SFColor'/>
      <field accessType='initializeOnly' appinfo='rendering color when contact=false' name='noContactColor' type='SFColor'/>
      <field accessType='inputOutput' appinfo='1 = fully transparent wireframe only' name='transparency' type='SFFloat'/>
    </ExternProtoDeclare>
    <!-- Viewable geometry for this scene -->
    <Group>
      <ProtoInstance DEF='SideScanSonarBeam' name='SideScanSonar'>
        <fieldValue name='defaultTrackWidthMeters' value='1'/>
        <fieldValue name='transparency' value='0.5'/>
        <fieldValue name='wireframe' value='true'/>
        <fieldValue name='solid' value='true'/>
      </ProtoInstance>
      <Transform translation='0 4 0'>
        <Billboard>
          <Shape>
            <Appearance>
              <Material diffuseColor='.8 .8 0'/>
            </Appearance>
            <Text string='"touch text to activate contact-mode rendering"'>
              <FontStyle justify='"MIDDLE" "MIDDLE"' size='2'/>
            </Text>
          </Shape>
          <TouchSensor description='Hover over text to activate contact mode'/>
          <Shape>
            <!-- transparent Box as text-selection assist -->
            <Box size='32 2 .001'/>
            <Appearance>
              <Material transparency='1'/>
            </Appearance>
          </Shape>
        </Billboard>
        <TouchSensor DEF='TextTouch' description='touch text to toggle contact-mode rendering'/>
        <ROUTE fromField='isOver' fromNode='TextTouch' toField='contact' toNode='SideScanSonarBeam'/>
      </Transform>
    </Group>
    <Group DEF='AnimationGroup'>
      <TimeSensor DEF='SonarClock' cycleInterval='10' loop='true'/>
      <!-- note that this interpolator sets speed at (5m / 6sec) == 0.78 m/sec which is very very slow!! -->
      <!-- this example is not physically realistic but it helps visualize the propagation of sound energy -->
      <ScalarInterpolator DEF='RangeInterpolator' key='0 .2 0.8 1' keyValue='0 0.01 5 5'/>
      <ROUTE fromField='fraction_changed' fromNode='SonarClock' toField='set_fraction' toNode='RangeInterpolator'/>
      <ROUTE fromField='value_changed' fromNode='RangeInterpolator' toField='altitude' toNode='SideScanSonarBeam'/>
      <!-- ========== -->
      <ScalarInterpolator DEF='TransparencyInterpolator' key='0 .2 0.8 1' keyValue='0 0 1 1'/>
      <ROUTE fromField='fraction_changed' fromNode='SonarClock' toField='set_fraction' toNode='TransparencyInterpolator'/>
      <ROUTE fromField='value_changed' fromNode='TransparencyInterpolator' toField='transparency' toNode='SideScanSonarBeam'/>
    </Group>
  </Scene>
</X3D>