package Savage.ShipsMilitary.MissileAttackBoatOsaII;

import org.web3d.x3d.jsail.Core.*;
import org.web3d.x3d.jsail.EnvironmentalEffects.*;
import org.web3d.x3d.jsail.fields.*;
import org.web3d.x3d.jsail.Geometry3D.*;
import org.web3d.x3d.jsail.Grouping.*;
import org.web3d.x3d.jsail.Interpolation.*;
import org.web3d.x3d.jsail.Navigation.*;
import org.web3d.x3d.jsail.Networking.*;
import org.web3d.x3d.jsail.PointingDeviceSensor.*;
import org.web3d.x3d.jsail.Shape.*;
import org.web3d.x3d.jsail.Sound.*;
import org.web3d.x3d.jsail.Text.*;
import org.web3d.x3d.jsail.Time.*;

// Javadoc metadata annotations follow, see below for X3DJSAIL Java source code.
/**
 * <p> Model of OSA-II missile boat. </p>
 <p> Related links: Catalog page <a href="../../../../ShipsMilitary/MissileAttackBoatOsaII/OsaIIIndex.html" target="_blank">OsaII</a>,  source <a href="../../../../ShipsMilitary/MissileAttackBoatOsaII/OsaII.java">OsaII.java</a>, <a href="https://www.web3d.org/x3d/content/examples/X3dResources.html" target="_blank">X3D Resources</a>, <a href="https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html" target="_blank">X3D Scene Authoring Hints</a>, and <a href="https://www.web3d.org/x3d/content/X3dTooltips.html" target="_blank">X3D Tooltips</a>. </p>
	<table style="color:black; border:0px solid; border-spacing:10px 0px;">
        <caption>Scene Meta Information</caption>
		<tr style="background-color:silver; border-color:silver;">
			<td style="text-align:center; padding:10px 0px;"><i>meta tags</i></td>
			<td style="text-align:left;   padding:10px 0px;">&nbsp; Document Metadata </td>
		</tr>

		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> title </i> </td>
			<td> <a href="../../../../ShipsMilitary/MissileAttackBoatOsaII/OsaII.x3d">OsaII.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> description </i> </td>
			<td> Model of OSA-II missile boat. </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> creator </i> </td>
			<td> Scott Rosetti, LT USNR </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> created </i> </td>
			<td> 20 July 2003 </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> modified </i> </td>
			<td> 5 July 2025 </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> TODO </i> </td>
			<td> fix Viewpoints, check coordinate systems </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> Image </i> </td>
			<td> <a href="../../../../ShipsMilitary/MissileAttackBoatOsaII/OsaIISilhoutteStbdSideWhiteBackground.png">OsaIISilhoutteStbdSideWhiteBackground.png</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> Image </i> </td>
			<td> <a href="../../../../ShipsMilitary/MissileAttackBoatOsaII/OsaIISilhouttePortSideWhiteBackground.png">OsaIISilhouttePortSideWhiteBackground.png</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> Image </i> </td>
			<td> <a href="../../../../ShipsMilitary/MissileAttackBoatOsaII/OsaIISilhoutteOverheadWhiteBackground.png">OsaIISilhoutteOverheadWhiteBackground.png</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reviewed </i> </td>
			<td> Jeffrey Weekley </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> OSA-II missile boat </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> <a href="http://faculty.nps.edu/brutzman/ShipsMilitary/DDGArleighBurkeUnitedStates/Propellers.x3d" target="_blank">http://faculty.nps.edu/brutzman/ShipsMilitary/DDGArleighBurkeUnitedStates/Propellers.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> subject </i> </td>
			<td> Osa-II, missile boat, patrol craft, SAVAGE, X3D </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> identifier </i> </td>
			<td> <a href="https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/OsaII.x3d" target="_blank">https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/OsaII.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> generator </i> </td>
			<td> X3D-Edit 3.3, <a href="https://www.web3d.org/x3d/tools/X3D-Edit" target="_blank">https://www.web3d.org/x3d/tools/X3D-Edit</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> generator </i> </td>
			<td> X3D-Edit 3.2, <a href="https://www.web3d.org/x3d/tools/X3D-Edit" target="_blank">https://www.web3d.org/x3d/tools/X3D-Edit</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> <a href="https://www.web3d.org/x3d/content/examples/Savage/Weapons/Missiles/HarpoonExample.x3d" target="_blank">https://www.web3d.org/x3d/content/examples/Savage/Weapons/Missiles/HarpoonExample.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> reference </i> </td>
			<td> <a href="https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/DDGArleighBurkeUnitedStates/water.x3d" target="_blank">https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/DDGArleighBurkeUnitedStates/water.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> license </i> </td>
			<td> <a href="../../../../ShipsMilitary/MissileAttackBoatOsaII/../../license.html">../../license.html</a> </td>
		</tr>
		<tr style="background-color:silver; border-color:silver;">
			<td style="text-align:center;" colspan="2">  &nbsp; </td>
		</tr>
	</table>

	<p>
		This program uses the
		<a href="https://www.web3d.org/specifications/java/X3DJSAIL.html" target="_blank">X3D Java Scene Access Interface Library (X3DJSAIL)</a>.
		It has been produced using the 
		<a href="https://www.web3d.org/x3d/stylesheets/X3dToJava.xslt" target="_blank">X3dToJava.xslt</a>
		stylesheet
	       (<a href="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/X3dToJava.xslt" target="_blank">version control</a>)
                which is used to create Java source code from an original <code>.x3d</code> model.
	</p>

	* @author Scott Rosetti, LT USNR
 */

public class OsaII
{
	/** Default constructor to create this object. */
	public OsaII ()
	{
	  initialize();
	}

	/** Create and initialize the X3D model for this object. */
	public final void initialize()
	{
            try { // catch-all
  x3dModel = new X3D().setProfile(X3D.PROFILE_IMMERSIVE).setVersion(X3D.VERSION_3_0)
  .setHead(new head()
    .addMeta(new meta().setName(meta.NAME_TITLE      ).setContent("OsaII.x3d"))
    .addMeta(new meta().setName(meta.NAME_DESCRIPTION).setContent("Model of OSA-II missile boat."))
    .addMeta(new meta().setName(meta.NAME_CREATOR    ).setContent("Scott Rosetti, LT USNR"))
    .addMeta(new meta().setName(meta.NAME_CREATED    ).setContent("20 July 2003"))
    .addMeta(new meta().setName(meta.NAME_MODIFIED   ).setContent("5 July 2025"))
    .addMeta(new meta().setName(meta.NAME_TODO       ).setContent("fix Viewpoints, check coordinate systems"))
    .addMeta(new meta().setName(meta.NAME_IMAGE      ).setContent("OsaIISilhoutteStbdSideWhiteBackground.png"))
    .addMeta(new meta().setName(meta.NAME_IMAGE      ).setContent("OsaIISilhouttePortSideWhiteBackground.png"))
    .addMeta(new meta().setName(meta.NAME_IMAGE      ).setContent("OsaIISilhoutteOverheadWhiteBackground.png"))
    .addMeta(new meta().setName("reviewed").setContent("Jeffrey Weekley"))
    .addMeta(new meta().setName(meta.NAME_REFERENCE  ).setContent("OSA-II missile boat"))
    .addMeta(new meta().setName(meta.NAME_REFERENCE  ).setContent("http://faculty.nps.edu/brutzman/ShipsMilitary/DDGArleighBurkeUnitedStates/Propellers.x3d"))
    .addMeta(new meta().setName(meta.NAME_SUBJECT    ).setContent("Osa-II, missile boat, patrol craft, SAVAGE, X3D"))
    .addMeta(new meta().setName(meta.NAME_IDENTIFIER ).setContent("https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/OsaII.x3d"))
    .addMeta(new meta().setName(meta.NAME_GENERATOR  ).setContent("X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit"))
    .addMeta(new meta().setName(meta.NAME_GENERATOR  ).setContent("X3D-Edit 3.2, https://www.web3d.org/x3d/tools/X3D-Edit"))
    .addMeta(new meta().setName(meta.NAME_REFERENCE  ).setContent("https://www.web3d.org/x3d/content/examples/Savage/Weapons/Missiles/HarpoonExample.x3d"))
    .addMeta(new meta().setName(meta.NAME_REFERENCE  ).setContent("https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/DDGArleighBurkeUnitedStates/water.x3d"))
    .addMeta(new meta().setName(meta.NAME_LICENSE    ).setContent("../../license.html")))
  .setScene(new Scene()
    .addChild(new WorldInfo().setTitle("OsaII.x3d"))
    .addChild(new Background().setSkyColor(new MFColor(new double[] {0.0,0.3,1.0})))
    .addComments(" OSA-II missile boat ")
    .addChild(new ExternProtoDeclare("RGM84D").setName("RGM84D").setUrl(new String[] {"../../Weapons/Missiles/HarpoonPrototype.x3d#RGM84D","https://www.web3d.org/x3d/content/examples/Savage/Weapons/Missiles/HarpoonPrototype.x3d#RGM84D","../../Weapons/Missiles/HarpoonPrototype.wrl#RGM84D","https://www.web3d.org/x3d/content/examples/Savage/Weapons/Missiles/HarpoonPrototype.wrl#RGM84D"})
      .addField(new field().setName("STARTLAUNCH").setType(field.TYPE_SFBOOL).setAccessType(field.ACCESSTYPE_INPUTONLY))
      .addField(new field().setName("THETIME").setType(field.TYPE_SFTIME).setAccessType(field.ACCESSTYPE_INPUTONLY)))
    .addChild(new Transform("OSA_II").setScale(3.86,3.86,3.86)
      .addChild(new Transform("FREEBOARD")
        .addChild(new Shape()
          .setGeometry(new Extrusion().setCreaseAngle(.75).setCrossSection(new MFVec2f(new double[] {1.0,.4,-1.0,.4,-.8,-.1,.8,-.1,1.0,.4})).setOrientation(new MFRotation(new double[] {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,-.6})).setScale(new MFVec2f(new double[] {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,.001,1.4})).setSolid(false).setSpine(new MFVec3f(new double[] {-5.0,0.0,0.0,-4.6,0.0,0.0,0.0,0.0,0.0,2.0,0.0,0.0,3.0,0.0,0.0,5.0,0.0,0.0})))
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6))))
        .addComments(" Extrusion modeling above water portion of hull "))
      .addChild(new Transform("HULL")
        .addChild(new Shape()
          .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {-.8,-.1,-.7,-.3,0.0,-.5,.7,-.3,.8,-.1,-.8,-.1})).setOrientation(new MFRotation(new double[] {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,-.6})).setScale(new MFVec2f(new double[] {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,.001,1.4})).setSolid(false).setSpine(new MFVec3f(new double[] {-5.0,0.0,0.0,-4.6,0.0,0.0,0.0,0.0,0.0,2.0,0.0,0.0,3.0,0.0,0.0,5.0,0.0,0.0})))
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(1.0,0.0,0.0))))
        .addComments(" Extrusion modeling below-water portion of hull "))
      .addChild(new Transform("PILOT_HOUSE").setTranslation(0.0,0.0,.4)
        .addChild(new Shape()
          .setGeometry(new Extrusion().setCreaseAngle(.5).setCrossSection(new MFVec2f(new double[] {.6,0.0,.6,.70,.55,.75,-.55,.75,-.6,.65,-.6,0.0,.6,0.0})).setOrientation(new MFRotation(new double[] {0.0,0.0,0.0,0.0,1.0,0.0,0.0,.3})).setSolid(false).setSpine(new MFVec3f(new double[] {1.5,0.0,0.0,2.5,0.0,0.0})))
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6))))
        .addComments(" Pilot House - the front-most superstructure that includes bridge "))
      .addChild(new Transform("AFT_HOUSING").setTranslation(0.0,0.0,.4)
        .addChild(new Shape()
          .setGeometry(new Extrusion().setCreaseAngle(.5).setCrossSection(new MFVec2f(new double[] {.3,.5,-.3,.5,-.3,0.0,.3,0.0,.3,.5})).setOrientation(new MFRotation(new double[] {0.0,0.0,0.0,0.0,1.0,0.0,0.0,-.3})).setSolid(false).setSpine(new MFVec3f(new double[] {-3.5,0.0,0.0,1.8,0.0,0.0})))
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6))))
        .addComments(" Aft superstructure that runs down most of vessel "))
      .addChild(new Transform("FRONT_WINDOWS").setRotation(0.0,1.0,0.0,-.3)
        .addChild(new Transform().setScale(.005,.1,.05).setTranslation(2.51,0.0,.18)
          .addChild(new Shape("WINDOW")
            .setGeometry(new Box())
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(0.0,0.0,.6).setTransparency(.75)))))
        .addChild(new Transform().setScale(.005,.1,.05).setTranslation(2.51,.35,.18)
          .addChild(new Shape().setUSE("WINDOW")))
        .addChild(new Transform().setScale(.005,.1,.05).setTranslation(2.51,-.35,.18)
          .addChild(new Shape().setUSE("WINDOW"))))
      .addChild(new Transform("RIGHT_NO").setScale(.5,.5,.5).setTranslation(4.0,-.475,0.0)
        .addChild(new Transform().setRotation(0.0,0.0,1.0,.45)
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.8)
            .addChild(new Shape()
              .setGeometry(new Text().setString(new String[] {"78"}))
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(1.0,1.0,1.0)))))))
      .addChild(new Transform("LEFT_NO").setScale(.5,.5,.5).setTranslation(4.45,.315,.28)
        .addChild(new Transform().setRotation(0.0,0.0,1.0,-.45)
          .addChild(new Transform().setRotation(1.0,0.0,0.0,-1.8)
            .addChild(new Transform().setRotation(0.0,1.0,0.0,3.1416)
              .addChild(new Shape()
                .setGeometry(new Text().setString(new String[] {"78"}))
                .setAppearance(new Appearance()
                  .setMaterial(new Material().setDiffuseColor(1.0,1.0,1.0))))))))
      .addChild(new Transform("SIDE_WINDOWS")
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setScale(.005,.1,.05).setTranslation(2.1,.6,.91)
          .addChild(new Shape().setUSE("WINDOW")))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setScale(.005,.1,.05).setTranslation(2.1,-.6,.91)
          .addChild(new Shape().setUSE("WINDOW")))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setScale(.005,.1,.05).setTranslation(1.8,.6,.91)
          .addChild(new Shape().setUSE("WINDOW")))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setScale(.005,.1,.05).setTranslation(1.8,-.6,.91)
          .addChild(new Shape().setUSE("WINDOW"))))
      .addChild(new Transform("SIGNAL_HOUSE")
        .addChild(new Shape()
          .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {.45,0.0,.45,1.4,-.45,1.4,-.45,0.0,.45,0.0})).setScale(new MFVec2f(new double[] {1.0,.01,1.0,.8,1.0,1.0,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {.5,0.0,0.0,.75,0.0,0.0,1.3,0.0,0.0,1.7,0.0,0.0})))
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6))))
        .addComments(" Aft part of bridge by main mast "))
      .addChild(new Transform("LAUNCHER").setRotation(0.0,.16,1.0,-1.57).setTranslation(-3.2,-.65,.8)
        .addComments(" Styx launcher - Touch Missle cover to fire surface-to-surface missile ")
        .addChild(new Transform()
          .addComments(" Styx launcher ")
          .addChild(new Transform("MISSILE").setScale(.2,.2,.2).setTranslation(0.0,1.0,0.0)
            .addChild(new TouchSensor("MissileTouch").setDescription("triggers missile launch"))
            .addChild(new TimeSensor("MissileClock"))
            .addChild(new PositionInterpolator("MissilePath").setKey(new double[] {0.2,1.0}).setKeyValue(new MFVec3f(new double[] {0.0,.5,0.0,0.0,30.0,0.0})))
            .addChild(new ROUTE().setFromNode("MissileClock").setFromField("fraction_changed").setToNode("MissilePath").setToField("set_fraction"))
            .addChild(new ROUTE().setFromNode("MissilePath").setFromField("value_changed").setToNode("MISSILE").setToField("set_translation"))
            .addChild(new ROUTE().setFromNode("MissileTouch").setFromField("touchTime").setToNode("MissileClock").setToField("startTime"))
            .addChild(new Transform("STYX").setRotation(0.0,0.0,1.0,1.570796).setTranslation(0.0,-3.0,0.0)
              .addChild(new ProtoInstance("RGM84D").setContainerField("children")))
            .addChild(new Transform()
              .addChild(new Sound()
                .setSource(new AudioClip("MissileLaunch").setDescription("Missile launch audio").setUrl(new String[] {"https://www.web3d.org/x3d/content/examples/Savage/Weapons/Missiles/MISSILE1.WAV"})))
              .addChild(new ROUTE().setFromNode("MissileTouch").setFromField("touchTime").setToNode("MissileLaunch").setToField("set_startTime"))))
          .addChild(new Transform("STYX_LAUNCHER")
            .addChild(new Inline().setUrl(new String[] {"StyxMissileTube.x3d","https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/StyxMissileTube.x3d","StyxMissileTube.wrl","https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/StyxMissileTube.wrl"})))))
      .addChild(new Transform().setTranslation(0.0,1.3,0.0)
        .addChild(new Transform("LAUNCHER2").setRotation(0.0,.16,1.0,-1.57).setTranslation(-3.2,-.65,.8)
          .addComments(" Styx launcher ")
          .addChild(new Transform()
            .addComments(" Styx launcher ")
            .addChild(new Transform("MISSILE2").setScale(.2,.2,.2).setTranslation(0.0,1.0,0.0)
              .addChild(new TouchSensor("MissileTouch2").setDescription("triggers missile launch"))
              .addChild(new TimeSensor("MissileClock2"))
              .addChild(new PositionInterpolator("MissilePath2").setKey(new double[] {0.2,1.0}).setKeyValue(new MFVec3f(new double[] {0.0,.5,0.0,0.0,30.0,0.0})))
              .addChild(new ROUTE().setFromNode("MissileClock2").setFromField("fraction_changed").setToNode("MissilePath2").setToField("set_fraction"))
              .addChild(new ROUTE().setFromNode("MissilePath2").setFromField("value_changed").setToNode("MISSILE2").setToField("set_translation"))
              .addChild(new ROUTE().setFromNode("MissileTouch2").setFromField("touchTime").setToNode("MissileClock2").setToField("startTime"))
              .addChild(new Transform().setUSE("STYX")))
            .addChild(new Transform().setUSE("STYX_LAUNCHER")))))
      .addChild(new Transform().setTranslation(2.6,0.0,0.0)
        .addChild(new Transform("LAUNCHER3").setRotation(0.0,.16,1.0,-1.57).setTranslation(-3.2,-.65,.8)
          .addComments(" Styx launcher ")
          .addChild(new Transform()
            .addComments(" Styx launcher ")
            .addChild(new Transform("MISSILE3").setScale(.2,.2,.2).setTranslation(0.0,1.0,0.0)
              .addChild(new TouchSensor("MissileTouch3").setDescription("triggers missile launch"))
              .addChild(new TimeSensor("MissileClock3"))
              .addChild(new PositionInterpolator("MissilePath3").setKey(new double[] {0.2,1.0}).setKeyValue(new MFVec3f(new double[] {0.0,.5,0.0,0.0,30.0,0.0})))
              .addChild(new ROUTE().setFromNode("MissileClock3").setFromField("fraction_changed").setToNode("MissilePath3").setToField("set_fraction"))
              .addChild(new ROUTE().setFromNode("MissilePath3").setFromField("value_changed").setToNode("MISSILE3").setToField("set_translation"))
              .addChild(new ROUTE().setFromNode("MissileTouch3").setFromField("touchTime").setToNode("MissileClock3").setToField("startTime"))
              .addChild(new Transform().setUSE("STYX")))
            .addChild(new Transform().setUSE("STYX_LAUNCHER")))))
      .addChild(new Transform().setTranslation(2.6,1.3,0.0)
        .addChild(new Transform("LAUNCHER4").setRotation(0.0,.16,1.0,-1.57).setTranslation(-3.2,-.65,.8)
          .addComments(" Styx launcher ")
          .addChild(new Transform()
            .addComments(" Styx launcher ")
            .addChild(new Transform("MISSILE4").setScale(.2,.2,.2).setTranslation(0.0,1.0,0.0)
              .addChild(new TouchSensor("MissileTouch4").setDescription("triggers missile launch"))
              .addChild(new TimeSensor("MissileClock4"))
              .addChild(new PositionInterpolator("MissilePath4").setKey(new double[] {0.2,1.0}).setKeyValue(new MFVec3f(new double[] {0.0,.5,0.0,0.0,30.0,0.0})))
              .addChild(new ROUTE().setFromNode("MissileClock4").setFromField("fraction_changed").setToNode("MissilePath4").setToField("set_fraction"))
              .addChild(new ROUTE().setFromNode("MissilePath4").setFromField("value_changed").setToNode("MISSILE4").setToField("set_translation"))
              .addChild(new ROUTE().setFromNode("MissileTouch4").setFromField("touchTime").setToNode("MissileClock4").setToField("startTime"))
              .addChild(new Transform().setUSE("STYX")))
            .addChild(new Transform().setUSE("STYX_LAUNCHER")))))
      .addChild(new Transform("MAIN_MAST").setScale(.075,.075,1.0).setTranslation(.7,0.0,0.0)
        .addChild(new Shape()
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
          .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {4.0,3.0,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,3.0})))))
      .addChild(new Transform("LAUNCHER_BASE").setScale(.3,.15,.1).setTranslation(-1.2,-.65,.45)
        .addChild(new Shape()
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(1.0,1.0,1.0)))
          .setGeometry(new Box())))
      .addChild(new Transform().setTranslation(0.0,1.3,0.0)
        .addChild(new Transform().setUSE("LAUNCHER_BASE")))
      .addChild(new Transform().setTranslation(-2.55,1.3,0.0)
        .addChild(new Transform().setUSE("LAUNCHER_BASE")))
      .addChild(new Transform().setTranslation(-2.55,0.0,0.0)
        .addChild(new Transform().setUSE("LAUNCHER_BASE")))
      .addChild(new Transform("GUN_MOUNT")
        .addComments(" forward gun mount ")
        .addChild(new Inline().setUrl(new String[] {"GunMount.wrl","https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/GunMount.wrl","GunMount.x3d","https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/GunMount.x3d"})))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,3.14).setTranslation(-1.2,0.0,0.0)
        .addComments(" aft gun mount ")
        .addChild(new Transform().setUSE("GUN_MOUNT")))
      .addChild(new Transform("AFT_RADAR").setTranslation(-3.0,0.0,.8)
        .addChild(new Shape()
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
          .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.2,.2,.2,.2})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,.4}))))
        .addChild(new Shape()
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
          .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.3,.3,.3,.3})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,.4,0.0,0.0,.45}))))
        .addChild(new Shape()
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.3,.3,.3)))
          .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.1,.1,.1,.1})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,.45,0.0,0.0,.55}))))
        .addChild(new Transform().setRotation(0.0,1.0,0.0,-1.3).setTranslation(.68,0.0,.5)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.3,.3,.3)))
            .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.075,.075,.12,.12,.18,.18,.18,.18,.12,.12,.075,.075})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,.55,0.0,0.0,.58,0.0,0.0,.65,0.0,0.0,.80,0.0,0.0,.87,0.0,0.0,.9})))))
        .addChild(new Transform().setScale(.28,.28,.2).setTranslation(0.0,0.0,.6)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05})).setSolid(false).setSpine(new MFVec3f(new double[] {1.0,0.0,0.0,.707,.707,0.0,0.0,1.0,0.0,-.707,.707,0.0,-1.0,0.0,0.0,-.707,-.707,0.0,0.0,-1.0,0.0,.707,-.707,0.0,1.0,0.0,0.0})))))
        .addChild(new Transform()
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.27,0.0,.5)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.27,0.0,.5)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(0.0,.27,.5)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(0.0,-.27,.5)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.19,.19,.5)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.19,-.19,.5)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.19,.19,.5)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.19,-.19,.5)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01)))))
        .addComments(" aft radar located near rear of ship on platform "))
      .addChild(new Transform("MAST_FWD_RADAR").setRotation(0.0,0.0,1.0,1.17).setScale(.6,.6,.6).setTranslation(1.2,0.0,2.2)
        .addChild(new Transform().setScale(.28,.28,.2)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.05,.05,.05,.05,.05,.05,.05,.05})).setSolid(false).setSpine(new MFVec3f(new double[] {.707,.707,0.0,0.0,1.0,0.0,-.707,.707,0.0,-1.0,0.0,0.0})))))
        .addChild(new Transform().setScale(.28,.28,.2).setTranslation(0.0,0.0,.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.05,.05,.05,.05,.05,.05,.05,.05})).setSolid(false).setSpine(new MFVec3f(new double[] {.707,.707,0.0,0.0,1.0,0.0,-.707,.707,0.0,-1.0,0.0,0.0})))))
        .addChild(new Transform().setScale(.28,.28,.2).setTranslation(0.0,0.0,.2)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.05,.05,.05,.05,.05,.05,.05,.05})).setSolid(false).setSpine(new MFVec3f(new double[] {.707,.707,0.0,0.0,1.0,0.0,-.707,.707,0.0,-1.0,0.0,0.0})))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.252,.098,.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(0.0,.28,.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.28,0.0,.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.098,.2385,.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.197,.197,.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.197,.197,.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.098,.252,.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(0.0,0.0,.035)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Cone().setBottomRadius(.05).setHeight(.08))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,-1.21).setTranslation(-.04,.09,0.0)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Box().setSize(.3,.03,.01))))
        .addChild(new OrientationInterpolator("RadarPath").setKey(new double[] {0.0,0.50,1.0}).setKeyValue(new MFRotation(new double[] {0.0,0.0,1.0,0.0,0.0,0.0,1.0,3.14,0.0,0.0,1.0,6.28})))
        .addChild(new TimeSensor("Clock").setCycleInterval(4.0).setLoop(true))
        .addChild(new ROUTE().setFromNode("Clock").setFromField("fraction_changed").setToNode("RadarPath").setToField("set_fraction"))
        .addChild(new ROUTE().setFromNode("RadarPath").setFromField("value_changed").setToNode("MAST_FWD_RADAR").setToField("set_rotation"))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(0.0,0.0,-.03)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Cylinder().setHeight(.03).setRadius(.02))))
        .addComments(" forward main mast radar...rotates on time sensor "))
      .addChild(new Transform("MAST_FWD_BEAM").setScale(.8,.06,.02).setTranslation(.6,0.0,2.15)
        .addChild(new Shape()
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
          .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.2,1.2,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,1.0,0.0,0.0}))))
        .addComments(" beam which houses forward radar "))
      .addChild(new Transform("MAST_AFT_ARM").setRotation(0.0,0.0,1.0,3.14).setTranslation(1.4,0.0,-.25)
        .addChild(new Transform("MAST_AFT_BEAM").setScale(.8,.06,.02).setTranslation(.6,0.0,2.15)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.2,1.2,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,1.0,0.0,0.0})))))
        .addChild(new Transform("MAST_AFT_RADAR").setRotation(0.0,0.0,1.0,1.17).setScale(.6,.6,.6).setTranslation(1.2,0.0,2.2)
          .addChild(new Transform().setScale(.28,.28,.2)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.05,.05,.05,.05,.05,.05,.05,.05})).setSolid(false).setSpine(new MFVec3f(new double[] {.707,.707,0.0,0.0,1.0,0.0,-.707,.707,0.0,-1.0,0.0,0.0})))))
          .addChild(new Transform().setScale(.28,.28,.2).setTranslation(0.0,0.0,.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.05,.05,.05,.05,.05,.05,.05,.05})).setSolid(false).setSpine(new MFVec3f(new double[] {.707,.707,0.0,0.0,1.0,0.0,-.707,.707,0.0,-1.0,0.0,0.0})))))
          .addChild(new Transform().setScale(.28,.28,.2).setTranslation(0.0,0.0,.2)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.05,.05,.05,.05,.05,.05,.05,.05})).setSolid(false).setSpine(new MFVec3f(new double[] {.707,.707,0.0,0.0,1.0,0.0,-.707,.707,0.0,-1.0,0.0,0.0})))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.252,.098,.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(0.0,.28,.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.28,0.0,.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.098,.2385,.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.197,.197,.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.197,.197,.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(-.098,.252,.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(0.0,0.0,.035)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cone().setBottomRadius(.05).setHeight(.08))))
          .addChild(new Transform().setRotation(0.0,0.0,1.0,-1.21).setTranslation(-.04,.09,0.0)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Box().setSize(.3,.03,.01))))
          .addChild(new OrientationInterpolator("RadarPathB").setKey(new double[] {0.0,0.50,1.0}).setKeyValue(new MFRotation(new double[] {0.0,0.0,1.0,0.0,0.0,0.0,1.0,3.14,0.0,0.0,1.0,6.28})))
          .addChild(new TimeSensor("ClockB").setCycleInterval(4.0).setLoop(true))
          .addChild(new ROUTE().setFromNode("ClockB").setFromField("fraction_changed").setToNode("RadarPathB").setToField("set_fraction"))
          .addChild(new ROUTE().setFromNode("RadarPath").setFromField("value_changed").setToNode("MAST_AFT_RADAR").setToField("set_rotation"))
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(0.0,0.0,-.03)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Cylinder().setHeight(.03).setRadius(.02)))))
        .addChild(new Transform("SUPPORTS_LOWER")
          .addChild(new Transform().setRotation(0.0,1.0,0.0,1.36).setScale(.02,.02,.86).setTranslation(0.7,.03,2.0)
            .addChild(new Transform()
              .addChild(new Shape()
                .setAppearance(new Appearance()
                  .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
                .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.1,1.1,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,.8}))))))
          .addChild(new Transform().setRotation(0.0,1.0,0.0,1.36).setScale(.02,.02,.86).setTranslation(0.7,-.03,2.0)
            .addChild(new Transform()
              .addChild(new Shape()
                .setAppearance(new Appearance()
                  .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
                .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.1,1.1,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,.8})))))))
        .addComments(" includes beam and radar on aft part of main mast "))
      .addChild(new Transform("CROW_NEST").setScale(.1,.1,1.0).setTranslation(.7,0.0,2.93)
        .addChild(new Shape()
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
          .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05})).setSolid(false).setSpine(new MFVec3f(new double[] {1.0,0.0,0.0,.707,.707,0.0,0.0,1.0,0.0,-.707,.707,0.0,-1.0,0.0,0.0,-.707,-.707,0.0,0.0,-1.0,0.0,.707,-.707,0.0,1.0,0.0,0.0}))))
        .addChild(new Shape()
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
          .setGeometry(new Box().setSize(1.9,.2,.1)))
        .addComments(" mini-platform on top of main mast that houses main radar "))
      .addChild(new Transform("SUPPORTS_UPPER")
        .addChild(new Transform()
          .addChild(new Transform().setRotation(0.0,1.0,0.0,1.36).setScale(.02,.02,.86).setTranslation(0.7,.03,2.0)
            .addChild(new Transform()
              .addChild(new Shape()
                .setAppearance(new Appearance()
                  .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
                .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.1,1.1,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,.8}))))))
          .addChild(new Transform().setRotation(0.0,1.0,0.0,1.36).setScale(.02,.02,.86).setTranslation(0.7,-.03,2.0)
            .addChild(new Transform()
              .addChild(new Shape()
                .setAppearance(new Appearance()
                  .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
                .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.1,1.1,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,.8})))))))
        .addComments(" suppports for main mast beams "))
      .addChild(new Transform("LOWER_ARM").setScale(.6,1.0,1.0).setTranslation(.3,0.0,-.4)
        .addChild(new Transform()
          .addChild(new Transform()
            .addChild(new Transform().setRotation(0.0,1.0,0.0,1.36).setScale(.02,.02,.86).setTranslation(0.7,.03,2.0)
              .addChild(new Transform()
                .addChild(new Shape()
                  .setAppearance(new Appearance()
                    .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
                  .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.1,1.1,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,.8}))))))
            .addChild(new Transform().setRotation(0.0,1.0,0.0,1.36).setScale(.02,.02,.86).setTranslation(0.7,-.03,2.0)
              .addChild(new Transform()
                .addChild(new Shape()
                  .setAppearance(new Appearance()
                    .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
                  .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.1,1.1,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,.8}))))))))
        .addChild(new Transform().setScale(.8,.06,.02).setTranslation(.6,0.0,2.15)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.2,1.2,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,1.0,0.0,0.0})))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setScale(1.67,1.0,1.0).setTranslation(1.28,0.0,2.2)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.625,0.0,.125)))
            .setGeometry(new Cylinder().setHeight(.08).setRadius(.04).setTop(false)))
          .addChild(new Transform().setTranslation(0.0,0.04,0.0)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.625,0.0,.125)))
              .setGeometry(new Sphere().setRadius(.04)))))
        .addComments(" forward facing lower beam that houses signal light "))
      .addChild(new Transform("NON_SKID"))
      .addChild(new Switch().setWhichChoice(0)
        .addChild(new Transform().setTranslation(0.0,0.0,.01)
          .addChild(new Shape()
            .setGeometry(new Extrusion().setCreaseAngle(.75).setCrossSection(new MFVec2f(new double[] {1.0,.4,-1.0,.4,-.98,.38,.98,.38,1.0,.4})).setOrientation(new MFRotation(new double[] {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,-.6})).setScale(new MFVec2f(new double[] {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,.01,1.4})).setSolid(false).setSpine(new MFVec3f(new double[] {-5.0,0.0,0.0,-4.6,0.0,0.0,0.0,0.0,0.0,2.0,0.0,0.0,3.0,0.0,0.0,5.0,0.0,0.0})))
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.2,.2,.2)))))
        .addComments(" non-skid surface on weatherdecks "))
      .addChild(new Transform("YARDARM")
        .addChild(new Transform().setTranslation(.7,-.65,2.5)
          .addChild(new Transform("MAST_CROSS_BEAM").setRotation(0.0,0.0,1.0,1.57).setScale(.8,.06,.02)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.2,1.2,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,1.6,0.0,0.0}))))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,.2).setTranslation(0.0,.2,0.0)
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.7,-.3,1.6)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(1.0,1.0,1.0)))
              .setGeometry(new Cylinder().setRadius(.005)))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,.12).setTranslation(0.0,.25,-.05)
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.7,-.3,1.6)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(1.0,1.0,1.0)))
              .setGeometry(new Cylinder().setRadius(.005)))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,-.2).setTranslation(0.0,.37,-.1)
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.7,-.3,1.6)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(1.0,1.0,1.0)))
              .setGeometry(new Cylinder().setRadius(.005)))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,-.12).setTranslation(0.0,.33,-.1)
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57).setTranslation(.7,-.3,1.6)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(1.0,1.0,1.0)))
              .setGeometry(new Cylinder().setRadius(.005)))))
        .addComments(" main beam on main mast that is used as flaghoist "))
      .addChild(new Transform("MAST_LADDER")
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.55,0.0,1.2)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.555,0.0,1.3)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.56,0.0,1.4)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.565,0.0,1.5)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.57,0.0,1.6)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.575,0.0,1.7)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.605,0.0,2.0)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.61,0.0,2.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.615,0.0,2.2)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setRotation(0.0,0.0,1.0,1.57).setTranslation(.620,0.0,2.3)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addComments(" ladder going up aft part of main mast "))
      .addChild(new Transform("PORT_BRIDGE_LADDER").setTranslation(.8,.4,-.4)
        .addChild(new Transform().setTranslation(.55,0.0,1.2)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setTranslation(.555,0.0,1.3)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setTranslation(.56,0.0,1.4)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setTranslation(.565,0.0,1.5)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setTranslation(.57,0.0,1.6)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addChild(new Transform().setTranslation(.55,0.0,1.1)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
            .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
        .addComments(" ladder on port side of bridge "))
      .addChild(new Transform("STBD_BRIDGE_LADDER").setTranslation(1.9,-.4,-.4)
        .addChild(new Transform().setRotation(0.0,0.0,1.0,3.1416)
          .addChild(new Transform().setTranslation(.55,0.0,1.2)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
          .addChild(new Transform().setTranslation(.555,0.0,1.3)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
          .addChild(new Transform().setTranslation(.56,0.0,1.4)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
          .addChild(new Transform().setTranslation(.565,0.0,1.5)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
          .addChild(new Transform().setTranslation(.57,0.0,1.6)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0})))))
          .addChild(new Transform().setTranslation(.55,0.0,1.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {.01,.01,.01,.01,.01,.01,.01,.01})).setSolid(false).setSpine(new MFVec3f(new double[] {.08,0.0,0.0,.08,.08,0.0,-.08,.08,0.0,-.08,0.0,0.0}))))))
        .addComments(" ladder on starboard side of bridge "))
      .addChild(new Transform("FWD_ANT").setTranslation(1.85,0.0,1.157)
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
          .addChild(new Shape()
            .setGeometry(new Cylinder().setHeight(.1).setRadius(.02))
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
          .addChild(new Shape()
            .setGeometry(new Cylinder().setHeight(3).setRadius(.005))
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))))
        .addComments(" HF antenna above pilot house "))
      .addChild(new Transform("MID_ANT").setTranslation(-.65,0.0,.95)
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
          .addChild(new Shape()
            .setGeometry(new Cylinder().setHeight(.1).setRadius(.02))
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
          .addChild(new Shape()
            .setGeometry(new Cylinder().setHeight(2.8).setRadius(.005))
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))))
        .addComments(" HF antenna midships "))
      .addChild(new Transform("AFT_ANT").setTranslation(-2.2,0.0,.95)
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
          .addChild(new Shape()
            .setGeometry(new Cylinder().setHeight(.1).setRadius(.02))
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))))
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
          .addChild(new Shape()
            .setGeometry(new Cylinder().setHeight(2.8).setRadius(.005))
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))))
        .addComments(" HF antenna aft "))
      .addChild(new Transform()
        .addChild(new Shape()
          .setAppearance(new Appearance()
            .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))))
      .addChild(new Transform("MAIN_RADAR").setTranslation(.7,0.0,2.95)
        .addChild(new Transform().setScale(.25,.25,.25).setTranslation(.15,0.0,0.0)
          .addChild(new Transform().setRotation(0.0,1.0,0.0,-.15)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.3,.3,.3)))
              .setGeometry(new Extrusion().setCrossSection(new MFVec2f(new double[] {1.0,.3,.6,.7,-.6,.7,-1.0,.3,-1.0,-.3,-.6,-.7,.6,-.7,1.0,-.3,1.0,.3})).setScale(new MFVec2f(new double[] {1.0,1.0,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,.05,0.0,0.0})))))
          .addChild(new Transform().setTranslation(-1.3,0.0,-.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.3,.3,.3)))
              .setGeometry(new Box().setSize(.3,.3,.3))))
          .addChild(new Transform().setTranslation(-.2,0.0,0.0)
            .addChild(new Transform().setRotation(0.0,1.0,0.0,-.15)
              .addChild(new Shape()
                .setAppearance(new Appearance()
                  .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
                .setGeometry(new Box().setSize(.35,.7,.5)))))
          .addChild(new Transform().setRotation(0.0,1.0,0.0,1.57).setScale(.1,.1,2.0).setTranslation(-1.2,0.0,-.1)
            .addChild(new Shape()
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(.6,.6,.6)))
              .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {1.0,0.0,.707,.707,0.0,1.0,-.707,.707,-1.0,0.0,-.707,-.707,0.0,-1.0,.707,-.707,1.0,0.0})).setScale(new MFVec2f(new double[] {1.1,1.1,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,.3}))))))
        .addChild(new OrientationInterpolator("RadarPathC").setKey(new double[] {0.0,0.50,1.0}).setKeyValue(new MFRotation(new double[] {0.0,0.0,1.0,0.0,0.0,0.0,1.0,3.14,0.0,0.0,1.0,6.28})))
        .addChild(new TimeSensor("ClockC").setCycleInterval(4.0).setLoop(true))
        .addChild(new ROUTE().setFromNode("ClockC").setFromField("fraction_changed").setToNode("RadarPathC").setToField("set_fraction"))
        .addChild(new ROUTE().setFromNode("RadarPathC").setFromField("value_changed").setToNode("MAIN_RADAR").setToField("set_rotation"))
        .addComments(" main radar located on very top of main mast "))
      .addChild(new Transform("STBD_RUDDER").setTranslation(-4.65,-.4,-.77)
        .addChild(new Transform().setRotation(0.0,0.0,1.0,-1.57).setScale(2.0,1.0,.35)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(1.0,0.0,0.0)))
            .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {.01,.2,-.01,.2,-.012,.05,-.01,-.1,-.008,-.15,-.005,-.17,0.0,-.2,.005,-.17,.008,-.15,.01,-.1,.012,.05,.01,.2})).setScale(new MFVec2f(new double[] {1.0,1.0,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,1.0})))))
        .addChild(new Transform().setTranslation(.15,0.0,.32)
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
            .addChild(new Shape()
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(1.0,0.0,0.0))))))
        .addComments(" starboard rudder "))
      .addChild(new Transform("PORT_RUDDER").setTranslation(-4.65,.4,-.77)
        .addChild(new Transform().setRotation(0.0,0.0,1.0,-1.57).setScale(1.5,1.0,.35)
          .addChild(new Shape()
            .setAppearance(new Appearance()
              .setMaterial(new Material().setDiffuseColor(1.0,0.0,0.0)))
            .setGeometry(new Extrusion().setCreaseAngle(1.5).setCrossSection(new MFVec2f(new double[] {.01,.2,-.01,.2,-.012,.05,-.01,-.1,-.008,-.15,-.005,-.17,0.0,-.2,.005,-.17,.008,-.15,.01,-.1,.012,.05,.01,.2})).setScale(new MFVec2f(new double[] {1.0,1.0,1.0,1.0})).setSolid(false).setSpine(new MFVec3f(new double[] {0.0,0.0,0.0,0.0,0.0,1.0})))))
        .addChild(new Transform().setTranslation(.15,0.0,.32)
          .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
            .addChild(new Shape()
              .setGeometry(new Cylinder().setHeight(.2).setRadius(.01))
              .setAppearance(new Appearance()
                .setMaterial(new Material().setDiffuseColor(1.0,0.0,0.0))))))
        .addComments(" port rudder "))
      .addChild(new Transform()
        .addComments(" 3-shaft propulsion system to include shafts, propellers, and struts. Basis for shafts and propellers taken from James Harney DDG model (see reference). ")
        .addChild(new Inline().setUrl(new String[] {"Propulsion.x3d","https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/Propulsion.x3d","Propulsion.wrl","https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/Propulsion.wrl"})))
      .addChild(new Group("WATER")
        .addComments(" Switch added to turn off water for easy inlining. ")
        .addChild(new Switch().setWhichChoice(-1)
          .addChild(new Transform().setTranslation(0.0,-25.0,0.0)
            .addChild(new Inline().setUrl(new String[] {"Water.x3d","https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/Water.x3d","Water.wrl","https://www.web3d.org/x3d/content/examples/Savage/ShipsMilitary/MissileAttackBoatOsaII/Water.wrl"})))))
      .addChild(new Viewpoint().setDescription("Starboard Side").setOrientation(1.0,0.0,0.0,1.5).setPosition(0.0,-20.0,4.0))
      .addChild(new Viewpoint().setDescription("Port Side").setOrientation(1.0,0.0,0.0,-1.5).setPosition(0.0,20.0,4.0))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-1.57).setTranslation(2.5,0.0,-1.0)
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.57)
          .addChild(new Viewpoint().setDescription("props"))))
      .addChild(new Transform().setRotation(0.0,0.0,1.0,-1.57).setTranslation(3.0,0.0,1.0)
        .addChild(new Transform().setRotation(1.0,0.0,0.0,1.4)
          .addChild(new Viewpoint().setDescription("launcher"))))
      .addChild(new Transform()
        .addChild(new Transform().setTranslation(2.8,0.0,1.0)
          .addChild(new Transform().setRotation(0.0,0.0,1.0,-1.57)
            .addChild(new Transform().setRotation(1.0,0.0,0.0,1.3)
              .addChild(new Viewpoint().setDescription("bridge").setPosition(0.0,0.0,0.0))))))));
            }
            catch (Exception ex)
            {       
                System.err.println ("*** Further hints on X3DJSAIL errors and exceptions at");
                System.err.println ("*** https://www.web3d.org/specifications/java/X3DJSAIL.html");
                throw (ex);
            }
	}
	// end of initialize() method

	/** The initialized model object, created within initialize() method. */
	private X3D x3dModel;

	/** 
	 * Provide a 
	 * <a href="https://dzone.com/articles/java-copy-shallow-vs-deep-in-which-you-will-swim" target="_blank">shallow copy</a>
	 * of the X3D model.
	 * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3D.html">X3D</a>
	 * @return OsaII model
	 */
	public X3D getX3dModel()
	{	  
		return x3dModel;
	}
	   
    /** 
     * Default main() method provided for test purposes, uses CommandLine to set global ConfigurationProperties for this object.
     * @param args array of input parameters, provided as arguments
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3D.html#handleArguments-java.lang.String:A-">X3D.handleArguments(args)</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3D.html#validationReport--">X3D.validationReport()</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/CommandLine.html">CommandLine</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/CommandLine.html#USAGE">CommandLine.USAGE</a>
     * @see <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/ConfigurationProperties.html">ConfigurationProperties</a>
     */
    public static void main(String args[])
    {
        System.out.println("Build this X3D model, showing validation diagnostics...");
        X3D thisExampleX3dModel = new OsaII().getX3dModel();
//      System.out.println("X3D model construction complete.");
	
        // next handle command line arguments
        boolean hasArguments = (args != null) && (args.length > 0);
        boolean validate = true; // default
        boolean argumentsLoadNewModel = false;
        String  fileName = new String();

        if (args != null)
        {
                for (String arg : args)
                {
                        if (arg.toLowerCase().startsWith("-v") || arg.toLowerCase().contains("validate"))
                        {
                                validate = true; // making sure
                        }
                        if (arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_X3D) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_CLASSICVRML) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_X3DB) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_VRML97) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_EXI) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_GZIP) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_ZIP) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_HTML) ||
                                arg.toLowerCase().endsWith(X3D.FILE_EXTENSION_XHTML))
                        {
                                argumentsLoadNewModel = true;
                                fileName = arg;
                        }
                }
        }
        if      (argumentsLoadNewModel)
                System.out.println("WARNING: \"Savage.ShipsMilitary.MissileAttackBoatOsaII.OsaII\" model invocation is attempting to load file \"" + fileName + "\" instead of simply validating itself... file loading ignored.");
        else if (hasArguments) // if no arguments provided, this method produces usage warning
                thisExampleX3dModel.handleArguments(args);
	
        if (validate)
        {
            //  System.out.println("--- TODO fix duplicated outputs ---"); // omit when duplicated outputs problem is solved/refactored
		String validationResults = thisExampleX3dModel.validationReport();
            //  System.out.println("-----------------------------------"); // omit when duplicated outputs problem is solved/refactored
                System.out.print("Savage.ShipsMilitary.MissileAttackBoatOsaII.OsaII self-validation test confirmation: ");
                if (!validationResults.equals("success"))
                    System.out.println();
                System.out.println(validationResults.trim());

                // experimental: test X3DJSAIL output files
                // ShipsMilitary/MissileAttackBoatOsaII/OsaII_JavaExport.* file validation is checked when building X3D Example Archives
                String filenameX3D  = "ShipsMilitary/MissileAttackBoatOsaII/OsaII_JavaExport.x3d"; 
                String filenameX3DV = "ShipsMilitary/MissileAttackBoatOsaII/OsaII_JavaExport.x3dv"; 
                String filenameJSON = "ShipsMilitary/MissileAttackBoatOsaII/OsaII_JavaExport.json";
                thisExampleX3dModel.toFileX3D        (filenameX3D);
                thisExampleX3dModel.toFileClassicVRML(filenameX3DV);
// TODO         thisExampleX3dModel.toFileJSON       (filenameJSON);
        }
    }
}
