package Savage.HarborEquipment.Barrier;

import org.web3d.x3d.jsail.Core.*;
import org.web3d.x3d.jsail.fields.*;
import org.web3d.x3d.jsail.Geometry3D.*;
import org.web3d.x3d.jsail.Grouping.*;
import org.web3d.x3d.jsail.Rendering.*;
import org.web3d.x3d.jsail.Shape.*;

// Javadoc metadata annotations follow, see below for X3DJSAIL Java source code.
/**
 * <p> A barrier commonly used for force protection by US Navy ships. </p>
 <p> Related links: Catalog page <a href="../../../../HarborEquipment/Barrier/BarrierIndex.html" target="_blank">Barrier</a>,  source <a href="../../../../HarborEquipment/Barrier/barrier.java">barrier.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="../../../../HarborEquipment/Barrier/Barrier.x3d">Barrier.x3d</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> description </i> </td>
			<td> A barrier commonly used for force protection by US Navy ships </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> creator </i> </td>
			<td> LT Patrick Sullivan </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> created </i> </td>
			<td> 23 March 2005 </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> modified </i> </td>
			<td> 20 October 2019 </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/HarborEquipment/Barrier/Barrier.x3d" target="_blank">https://www.web3d.org/x3d/content/examples/Savage/HarborEquipment/Barrier/Barrier.x3d</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> generator </i> </td>
			<td> VizX3D, <a href="http://www.vivaty.com/downloads/studio" target="_blank">http://www.vivaty.com/downloads/studio</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> generator </i> </td>
			<td> Wings3D, <a href="http://www.wings3d.com" target="_blank">http://www.wings3d.com</a> </td>
		</tr>
		<tr>
			<td style="text-align:right; vertical-align: text-top;"> <i> license </i> </td>
			<td> <a href="../../../../HarborEquipment/Barrier/../../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 LT Patrick Sullivan
 */

public class barrier
{
	/** Default constructor to create this object. */
	public barrier ()
	{
	  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_1)
  .setHead(new head()
    .addMeta(new meta().setName(meta.NAME_TITLE      ).setContent("Barrier.x3d"))
    .addMeta(new meta().setName(meta.NAME_DESCRIPTION).setContent("A barrier commonly used for force protection by US Navy ships"))
    .addMeta(new meta().setName(meta.NAME_CREATOR    ).setContent("LT Patrick Sullivan"))
    .addMeta(new meta().setName(meta.NAME_CREATED    ).setContent("23 March 2005"))
    .addMeta(new meta().setName(meta.NAME_MODIFIED   ).setContent("20 October 2019"))
    .addMeta(new meta().setName(meta.NAME_IDENTIFIER ).setContent("https://www.web3d.org/x3d/content/examples/Savage/HarborEquipment/Barrier/Barrier.x3d"))
    .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_GENERATOR  ).setContent("VizX3D, http://www.vivaty.com/downloads/studio"))
    .addMeta(new meta().setName(meta.NAME_GENERATOR  ).setContent("Wings3D, http://www.wings3d.com"))
    .addMeta(new meta().setName(meta.NAME_LICENSE    ).setContent("../../license.html")))
  .setScene(new Scene()
    .addChild(new WorldInfo().setTitle("Barrier.x3d"))
    .addChild(new Transform("barrier")
      .addChild(new Shape("cube1")
        .setAppearance(new Appearance()
          .setMaterial(new Material("yellowPlastic_mat").setAmbientIntensity(0.624).setDiffuseColor(1.0,.87333,0.0).setShininess(0.000)))
        .setGeometry(new IndexedFaceSet().setCreaseAngle(0.524).setCoordIndex(getIndexedFaceSet_5_15_coordIndex())
          .setCoord(new Coordinate().setPoint(getCoordinate_6_15_point()))))));
            }
            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

		/** Define subarrays using type int[] */
		private int[] getIndexedFaceSet_5_15_coordIndex_1()
		{
			int[] value = {0,1,2,-1,0,2,3,-1,0,3,4,-1,0,4,5,-1,0,5,6,-1,0,6,7,-1,0,7,8,-1,0,8,9,-1,0,9,10,-1,0,10,11,-1,0,12,13,-1,0,13,1,-1,16,12,0,-1,16,0,14,-1,16,14,15,-1,0,11,17,-1,0,17,15,-1,0,15,14,-1,1,13,18,-1,1,18,2,-1,13,12,19,-1,13,19,20,-1,13,20,21,-1,13,21,22,-1,13,22,23,-1,13,23,24,-1,13,24,25,-1,13,25,26,-1,13,26,27,-1,13,27,18,-1,12,16,28,-1,12,28,19,-1,3,2,18,-1,3,18,27,-1,29,30,31,-1,29,31,3,-1,29,3,27,-1,3,31,30,-1,3,30,32,-1,3,32,4,-1,27,26,33,-1,27,33,29,-1,16,15,34,-1,16,34,35,-1,16,35,36,-1,16,36,37,-1,16,37,38,-1,16,38,39,-1,16,39,40,-1,16,40,41,-1,16,41,42,-1,16,42,29,-1,16,29,33,-1,16,33,43,-1,16,43,44,-1,16,44,45,-1,16,45,46,-1,16,46,47,-1,16,47,48,-1,16,48,28,-1,15,17,49,-1,15,49,50,-1,15,50,51,-1,15,51,52,-1,15,52,53,-1,15,53,54,-1,15,54,32,-1,15,32,30,-1,15,30,55,-1,15,55,56,-1,15,56,57,-1,15,57,58,-1,15,58,59,-1,15,59,60,-1,15,60,61,-1,15,61,34,-1,30,29,42,-1,30,42,55,-1,35,34,62,-1,35,62,63,-1,35,63,64,-1,35,64,36,-1,34,61,65,-1,34,65,62,-1,55,42,66,-1,55,66,67,-1,55,67,68,-1,55,68,56,-1,42,41,69,-1,42,69,66,-1,11,10,70,-1,11,70,71,-1,11,71,72,-1,11,72,17,-1,10,9,50,-1,10,50,49,-1,10,49,73,-1,10,73,70,-1,9,8,74,-1,9,74,75,-1,9,75,76,-1,9,76,50,-1,8,7,52,-1,8,52,51,-1,8,51,77,-1,8,77,74,-1,7,6,78,-1,7,78,79,-1,7,79,80,-1,7,80,52,-1,6,5,54,-1,6,54,53,-1,6,53,81,-1,6,81,78,-1,5,4,82,-1,5,82,83,-1,5,83,84,-1,5,84,54,-1,4,32,85,-1,4,85,82,-1,87,19,28,-1,87,28,86,-1,19,87,88,-1,19,88,20,-1,20,48,47,-1,20,47,21,-1,48,20,88,-1,48,88,89,-1,91,21,47,-1,91,47,90,-1,21,91,92,-1,21,92,22,-1,22,46,45,-1,22,45,23,-1,46,22,92,-1,46,92,93,-1,95,23,45,-1,95,45,94,-1,23,95,96,-1,23,96,24,-1,24,44,43,-1,24,43,25,-1,44,24,96,-1,44,96,97,-1,99,25,43,-1,99,43,98,-1,25,99,100,-1,25,100,26,-1,33,26,100,-1,33,100,101,-1,32,54,84,-1,32,84,85,-1,53,52,80,-1,53,80,81,-1,51,50,76,-1,51,76,77,-1,49,17,72,-1,49,72,73,-1,28,48,89,-1,28,89,86,-1,47,46,93,-1,47,93,90,-1,45,44,97,-1,45,97,94,-1,43,33,101,-1,43,101,98,-1,88,87,86,-1,88,86,89,-1,92,91,90,-1,92,90,93,-1,96,95,94,-1,96,94,97,-1,100,99,98,-1,100,98,101,-1,83,82,85,-1,83,85,84,-1,79,78,81,-1,79,81,80,-1,75,74,77,-1,75,77,76,-1,71,70,73,-1,71,73,72,-1,56,41,40,-1,56,40,57,-1,56,68,69,-1,56,69,41,-1,57,40,102,-1,57,102,103,-1,57,103,104,-1,57,104,58,-1,58,39,38,-1,58,38,59,-1,58,104,105,-1,58,105,39,-1,59,38,106,-1,59,106,107,-1,59,107,108,-1,59,108,60,-1,60,37,36,-1,60,36,61,-1,60,108,109,-1,60,109,37,-1,61,36,64,-1,61,64,65,-1,37,109,106,-1,37,106,38,-1,39,105,102,-1,39,102,40,-1,63,62,65,-1,63,65,64,-1,108,107,106,-1,108,106,109,-1,104,103,102,-1,104,102,105,-1,68,67,66,-1,68,66,69,-1};
			return value;
		}


		/** Define subarrays using type double[] */
		private double[] getCoordinate_6_15_point_1()
		{
			double[] value = {-.094,.552,1.0,-.094,1.0,1.0,-.094,1.0,-1.0,-.094,.552,-1.0,-.094,.552,-.69511,-.094,.552,-.49511,-.094,.552,-.29511,-.094,.552,-.09511,-.094,.552,.10489,-.094,.552,.30489,-.094,.552,.50489,-.094,.552,.70489,.094,.552,1.0,.094,1.0,1.0,-.1488,.38933,1.0,-.2036,.22667,1.0,.2036,.22667,1.0,-.2036,.22667,.70489,.094,1.0,-1.0,.094,.552,.70489,.094,.552,.50489,.094,.552,.30489,.094,.552,.10489,.094,.552,-.09511,.094,.552,-.29511,.094,.552,-.49511,.094,.552,-.69511,.094,.552,-1.0,.2036,.22667,.70489,.2036,.22667,-1.0,-.2036,.22667,-1.0,-.1488,.38933,-1.0,-.2036,.22667,-.69511,.2036,.22667,-.69511,-.2036,.05067,1.0,.2036,.05067,1.0,.2036,.05067,.89067,.2036,.05067,.53422,.2036,.05067,.10311,.2036,.05067,-.05067,.2036,.05067,-.56978,.2036,.05067,-.87467,.2036,.05067,-1.0,.2036,.22667,-.49511,.2036,.22667,-.29511,.2036,.22667,-.09511,.2036,.22667,.10489,.2036,.22667,.30489,.2036,.22667,.50489,-.2036,.22667,.50489,-.2036,.22667,.30489,-.2036,.22667,.10489,-.2036,.22667,-.09511,-.2036,.22667,-.29511,-.2036,.22667,-.49511,-.2036,.05067,-1.0,-.2036,.05067,-.87467,-.2036,.05067,-.56978,-.2036,.05067,-.05067,-.2036,.05067,.10311,-.2036,.05067,.53422,-.2036,.05067,.89067,-.2036,-.05956,1.0,.2036,-.05956,1.0,.2036,-.05956,.89067,-.2036,-.05956,.89067,.2036,-.05956,-1.0,-.2036,-.05956,-1.0,-.2036,-.05956,-.87467,.2036,-.05956,-.87467,-.02568,.50978,.52309,-.02568,.50978,.68669,-.12367,.21894,.68669,-.12367,.21894,.52309,-.02568,.50978,.12309,-.02568,.50978,.28669,-.12367,.21894,.28669,-.12367,.21894,.12309,-.02568,.50978,-.27691,-.02568,.50978,-.11331,-.12367,.21894,-.11331,-.12367,.21894,-.27691,-.02568,.50978,-.67691,-.02568,.50978,-.51331,-.12367,.21894,-.51331,-.12367,.21894,-.67691,.12367,.21894,.68669,.1039,.50978,.68669,.1039,.50978,.52309,.12367,.21894,.52309,.12367,.21894,.28669,.1039,.50978,.28669,.1039,.50978,.12309,.12367,.21894,.12309,.12367,.21894,-.11331,.1039,.50978,-.11331,.1039,.50978,-.27691,.12367,.21894,-.27691,.12367,.21894,-.51331,.1039,.50978,-.51331};
			return value;
		}
		private double[] getCoordinate_6_15_point_2()
		{
			double[] value = {.1039,.50978,-.67691,.12367,.21894,-.67691,.2036,-.05956,-.56978,-.2036,-.05956,-.56978,-.2036,-.05956,-.05067,.2036,-.05956,-.05067,.2036,-.05956,.10311,-.2036,-.05956,.10311,-.2036,-.05956,.53422,.2036,-.05956,.53422};
			return value;
		}

		/** Large attribute array: IndexedFaceSet coordIndex field, scene-graph level=5, element #15, 864 total numbers.
		 * Reassemble split array as single method to improve readability and runnability.
		 * Provide large array values via separate methods, hoping to avoid 'code too large' Java compilation errors. 
		 * Individual Java methods (including aggregated initializations) are limited to 64KB.
		 * @see https://stackoverflow.com/questions/2407912/code-too-large-compilation-error-in-java
		 * @see https://stackoverflow.com/questions/11437905/java-too-many-constants-jvm-error
		 */
		private MFInt32 getIndexedFaceSet_5_15_coordIndex()
		{
			MFInt32 IndexedFaceSet_5_15_coordIndex = new MFInt32()/*2.finalize*/
				.append(new MFInt32(getIndexedFaceSet_5_15_coordIndex_1()));
			return IndexedFaceSet_5_15_coordIndex;
		}
		/** Large attribute array: Coordinate point field, scene-graph level=6, element #15, 330 total numbers made up of 110 3-tuple values.
		 * Reassemble split array as single method to improve readability and runnability.
		 * Provide large array values via separate methods, hoping to avoid 'code too large' Java compilation errors. 
		 * Individual Java methods (including aggregated initializations) are limited to 64KB.
		 * @see https://stackoverflow.com/questions/2407912/code-too-large-compilation-error-in-java
		 * @see https://stackoverflow.com/questions/11437905/java-too-many-constants-jvm-error
		 */
		private MFVec3f getCoordinate_6_15_point()
		{
			MFVec3f Coordinate_6_15_point = new MFVec3f()/*2.finalize*/
				.append(new MFVec3f(getCoordinate_6_15_point_1()))
				.append(new MFVec3f(getCoordinate_6_15_point_2()));
			return Coordinate_6_15_point;
		}

	/** 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 barrier 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 barrier().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.HarborEquipment.Barrier.barrier\" 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.HarborEquipment.Barrier.barrier self-validation test confirmation: ");
                if (!validationResults.equals("success"))
                    System.out.println();
                System.out.println(validationResults.trim());

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