<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "https://www.web3d.org/specifications/x3d-4.0.dtd">
<X3D class='x3dModel.classid='x3dModel.idprofile='Full'  style='x3dModel.styleversion='4.0xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation=' https://www.web3d.org/specifications/x3d-4.0.xsd ' >
<!-- x3dVersionComparisonTest for this model: supportsX3dVersion(X3D.VERSION_3_0)=true -->
<head>
<!-- comment #1 -->
<!-- comment #2 -->
<!-- comment #3 -->
<!-- comment #4 -->
<component name='Navigationlevel='3'/>
<component name='Shaderslevel='1'/>
<component name='CADGeometrylevel='2'/>
<component name='DISlevel='2'/>
<component name='HAnimlevel='1'/>
<component name='Groupinglevel='1'/>
<component name='Layeringlevel='1'/>
<unit name='AngleUnitConversioncategory='angleconversionFactor='1.0'/>
<unit name='LengthUnitConversioncategory='lengthconversionFactor='1.0'/>
<unit name='ForceFromPoundsToNewtonscategory='forceconversionFactor='4.4482'/>
<meta name='titlecontent='HelloWorldProgramOutput.x3d'/>
<meta name='infocontent='continued development and testing in progress'/>
<meta name='descriptioncontent='Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)'/>
<meta name='referencecontent='https://www.web3d.org/specifications/java/X3DJSAIL.html '/>
<meta name='generatorcontent='HelloWorldProgramOutput.java'/>
<meta name='createdcontent='6 September 2016'/>
<meta name='modifiedcontent='5 May 2024'/>
<meta name='generatorcontent='X3D Java Scene Access Interface Library (X3DJSAIL)'/>
<meta name='generatorcontent='https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java '/>
<meta name='generatorcontent='Netbeans https://www.netbeans.org'/>
<meta name='creatorcontent='Don Brutzman'/>
<meta name='referencecontent='https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d '/>
<meta name='referencecontent='Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:'/>
<meta name='referencecontent='HelloWorldProgramOutput.txt'/>
<meta name='referencecontent='HelloWorldProgramOutput.x3dv'/>
<meta name='referencecontent='HelloWorldProgramOutput.wrl'/>
<meta name='referencecontent='HelloWorldProgramOutput.html'/>
<meta name='referencecontent='https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d '/>
<meta name='identifiercontent='https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d '/>
<meta name='licensecontent=' ../license.html'/>
</head>
<!-- -->
<Scene>
<MetadataSet name='topLevelSceneMetadata'/>
<ViewpointGroup description='Available viewpointscontainerField='children'>
<Viewpoint DEF='DefaultViewdescription='Hello X3DJSAIL'/>
<Viewpoint DEF='TopDownViewdescription='top-down view from aboveorientation='1 0 0 -1.570796position='0 100 0'/>
</ViewpointGroup>
<NavigationInfo type='"EXAMINE" "FLY" "ANY"'/>
<WorldInfo DEF='WorldInfoDEFclass='worldInfoNode.classid='worldInfoNode.idstyle='worldInfoNode.styletitle='HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)'/>
<WorldInfo USE=' WorldInfoDEF'/>
<WorldInfo USE=' WorldInfoDEF'/>
<MetadataString DEF='scene.addChildMetadataname='testvalue='"Top-level root Metadata node beneath Scene needs to be one of '-children' in JSON encoding"'/>
<LayerSet DEF='scene.addChildLayerSetTestcontainerField='children'/>
<!-- ROUTE information for LogoGeometryTransform node:  [from BoxPathAnimator.value_changed to set_translation] -->
<Transform DEF='LogoGeometryTransformtranslation='0 1.5 0'>
<Anchor DEF='siteAnchordescription='select for X3D Java SAI Library (X3DJSAIL) description'
  url=' "../X3DJSAIL.html" "https://www.web3d.org/specifications/java/X3DJSAIL.html" ' >
<Shape DEF='BoxShapeid='BoxShapeID'>
<Appearance>
<Material DEF='GreenMaterialdiffuseColor='0 1 1emissiveColor='0.8 0 0transparency='0.1'/>
<ImageTexture
  url=' "images/X3dJavaSceneAccessInterfaceSaiLibrary.png" "https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png" ' />
</Appearance>
<Box DEF='test-NMTOKEN_regex.0123456789class='untextured'/>
</Shape>
</Anchor>
</Transform>
<Shape DEF='LineShape'>
<Appearance>
<Material emissiveColor='0.6 0.19607843 0.8'/>
</Appearance>
<IndexedLineSet coordIndex='0 1 2 3 4 0'>
<!-- Coordinate 3-tuple point count: 6 -->
<Coordinate point='0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0'/>
</IndexedLineSet>
</Shape>
<!-- ROUTE information for BoxPathAnimator node:  [from OrbitClock.fraction_changed to set_fraction] [from value_changed to LogoGeometryTransform.set_translation] -->
<PositionInterpolator DEF='BoxPathAnimatorkey='0 0.125 0.375 0.625 0.875 1keyValue='0 1.5 0 2 1.5 0 2 1.5 -2 -2 1.5 -2 -2 1.5 0 0 1.5 0'/>

<!-- ROUTE information for OrbitClock node:  [from fraction_changed to BoxPathAnimator.set_fraction] -->
<TimeSensor DEF='OrbitClockcycleInterval='8.0loop='true'/>

<ROUTE fromNode=' OrbitClock' fromField='fraction_changed' toNode=' BoxPathAnimator' toField='set_fraction'/>
<ROUTE fromNode=' BoxPathAnimator' fromField='value_changed' toNode=' LogoGeometryTransform' toField='set_translation'/>
<!-- ROUTE information for TextTransform node:  [from SpinInterpolator.value_changed to rotation] -->
<Transform DEF='TextTransformtranslation='0 -1.5 0'>
<Shape>
<Appearance>
<Material USE=' GreenMaterial'/>
</Appearance>
<Text string='"X3D Java" "SAI Library" "X3DJSAIL"'>
<!-- Comment example A, plain quotation marks: He said, "Immel did it!"
-->

<!-- Comment example B, XML character entities: He said, &quot;Immel did it!&quot; -->
<MetadataSet name='EscapedQuotationMarksMetadataSetcontainerField='metadata'>
<MetadataString name='quotesTestCvalue='"MFString example C, backslash-escaped quotes: He said, \"Immel did it!\""'/>
<MetadataString name='extraChildTestvalue='"checks MetadataSet addValue() method"'/>
</MetadataSet>
<FontStyle justify='"MIDDLE" "MIDDLE"'/>
</Text>
</Shape>
<Collision>
<!-- test containerField='proxy' -->
<Shape DEF='ProxyShapecontainerField='proxy'>
<!-- alternative XML encoding: Text string='"One, Two, Comment"
""
"He said, \&quot;Immel did it!\&quot;"' -->

<!-- alternative XML encoding: Text string='"One, Two, Comment"
""
"He said, \&quot;Immel did it!\&quot;"
""' -->

<!-- alternative Java source: .setString(new String [] {"One, Two, Comment", "", "He said, \"Immel did it!\""}) -->
<!-- reference: https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html -->
<Text string='"One, Two, Text" "" "He said, \"Immel did it!\" \"\""'/>
</Shape>
</Collision>
<!-- It's a beautiful world -->
<!-- ... for you! -->
<!-- https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song) -->
</Transform>
<!-- repeatedly spin 180 degrees as a readable special effect -->
<!-- ROUTE information for SpinInterpolator node:  [from SpinClock.fraction_changed to set_fraction] [from value_changed to TextTransform.rotation] -->
<OrientationInterpolator DEF='SpinInterpolatorkey='0 0.5 1keyValue='0 1 0 4.712389 0 1 0 0 0 1 0 1.5707964'/>

<!-- ROUTE information for SpinClock node:  [from fraction_changed to SpinInterpolator.set_fraction] -->
<TimeSensor DEF='SpinClockcycleInterval='5.0loop='true'/>

<ROUTE fromNode=' SpinClock' fromField='fraction_changed' toNode=' SpinInterpolator' toField='set_fraction'/>
<ROUTE fromNode=' SpinInterpolator' fromField='value_changed' toNode=' TextTransform' toField='rotation'/>
<Group DEF='BackgroundGroup'>
<!-- ROUTE information for GradualBackground node:  [from colorTypeConversionScript.colorsOutput to skyColor] -->
<Background DEF='GradualBackground'/>

<!-- ROUTE information for colorTypeConversionScript node:  [from ColorAnimator.value_changed to colorInput] [from colorsOutput to GradualBackground.skyColor] -->
<Script DEF='colorTypeConversionScript'>
<field name='colorInputtype='SFColoraccessType='inputOnly'/>
<field name='colorsOutputtype='MFColoraccessType='outputOnly'/>
<![CDATA[

ecmascript:

function colorInput (eventValue) // Example source code
{
   colorsOutput = new MFColor(eventValue); // assigning value sends output event
// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\n');
}

      
]]>
</Script>
<!-- ROUTE information for ColorAnimator node:  [from ColorClock.fraction_changed to set_fraction] [from value_changed to colorTypeConversionScript.colorInput] -->
<ColorInterpolator DEF='ColorAnimatorkey='0 0.5 1keyValue='0.9411765 1 1 0.29411766 0 0.50980395 0.9411765 1 1'>
<!-- AZURE to INDIGO and back again -->
</ColorInterpolator>
<!-- ROUTE information for ColorClock node:  [from fraction_changed to ColorAnimator.set_fraction] -->
<TimeSensor DEF='ColorClockcycleInterval='60.0loop='true'/>

<ROUTE fromNode=' colorTypeConversionScript' fromField='colorsOutput' toNode=' GradualBackground' toField='skyColor'/>
<ROUTE fromNode=' ColorAnimator' fromField='value_changed' toNode=' colorTypeConversionScript' toField='colorInput'/>
<ROUTE fromNode=' ColorClock' fromField='fraction_changed' toNode=' ColorAnimator' toField='set_fraction'/>
</Group>
<ProtoDeclare name='ArtDeco01Materialappinfo='tooltip: ArtDeco01Material prototype is a Material node' >
<ProtoInterface>
<field name='descriptiontype='SFStringvalue='ArtDeco01Material prototype is a Material nodeaccessType='inputOutput'
 appinfo='tooltip for descriptionField' />

<field name='enabledtype='SFBoolvalue='trueaccessType='inputOutput'/>
</ProtoInterface>
<ProtoBody>
<!-- Initial node of ProtoBody determines prototype node type -->
<Material ambientIntensity='0.25diffuseColor='0.282435 0.085159 0.134462shininess='0.127273specularColor='0.276305 0.11431 0.139857'/>
<!-- [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()="Material"
-->

<!-- presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types -->
<TouchSensor description='within ProtoBody'>
<IS>
<connect nodeField='descriptionprotoField='description'/>
<connect nodeField='enabledprotoField='enabled'/>
</IS>
</TouchSensor>
</ProtoBody>
</ProtoDeclare>
<ExternProtoDeclare name='ArtDeco02Materialappinfo='this is a different Material node'
  url=' "https://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material" "https://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material" ' >
<!-- [HelloWorldProgram diagnostic] artDeco02ExternProtoDeclare.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file."
-->

<field name='descriptiontype='SFStringaccessType='inputOutput'
 appinfo='tooltip for descriptionField' />
</ExternProtoDeclare>
<!-- Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place -->
<Shape DEF='TestShape1'>
<Appearance DEF='TestAppearance1'>
<!-- ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
<ProtoInstance name='ArtDeco01MaterialcontainerField='material'>
<!-- [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()="Material"
-->

<fieldValue name='descriptionvalue='ArtDeco01Material can substitute for a Material node'/>
</ProtoInstance>
</Appearance>
<Sphere radius='0.001'/>
</Shape>
<Shape DEF='TestShape2'>
<Appearance DEF='TestAppearance2'>
<!-- ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java -->
<ProtoInstance name='ArtDeco02MaterialDEF='ArtDeco02MaterialDEFcontainerField='material'>
<!-- [HelloWorldProgram diagnostic] ArtDeco02ProtoInstance.getNodeType()="ERROR_UNKNOWN_EXTERNPROTODECLARE_NODE_TYPE: ExternProtoDeclare name='ArtDeco02Material' type cannot be remotely accessed at run time. TODO X3DJSAIL needs to add further capability that retrieves the ExternProtoDeclare file."
-->

<fieldValue name='descriptionvalue='ArtDeco02Material can substitute for another Material node'/>
</ProtoInstance>
</Appearance>
<Cone bottomRadius='0.001height='0.001'/>
</Shape>
<Shape DEF='TestShape3'>
<Appearance DEF='TestAppearance3'>
<!-- ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. -->
<ProtoInstance USE=' ArtDeco02MaterialDEFcontainerField='material'/>
</Appearance>
<Cylinder height='0.001radius='0.001'/>
</Shape>
<Inline DEF='inlineScene'
  url=' someOtherScene.x3d"https://www.web3d.org/specifications/java/examples/someOtherScene.x3d" ' />

<IMPORT inlineDEF='inlineSceneimportedDEF='WorldInfoDEFAS='WorldInfoDEF2'/>
<EXPORT localDEF='WorldInfoDEFAS='WorldInfoDEF3'/>
<ProtoDeclare name='MaterialModulatorappinfo='mimic a Material node and modulate fields as an animation effect'  documentation=' https://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html ' >
<ProtoInterface>
<field name='enabledtype='SFBoolvalue='trueaccessType='inputOutput'/>
<field name='diffuseColortype='SFColorvalue='0 0 0accessType='inputOutput'/>
<field name='emissiveColortype='SFColorvalue='0.05 0.05 0.5accessType='inputOutput'/>
<field name='specularColortype='SFColorvalue='0 0 0accessType='inputOutput'/>
<field name='transparencytype='SFFloatvalue='0.0accessType='inputOutput'/>
<field name='shininesstype='SFFloatvalue='0.0accessType='inputOutput'/>
<field name='ambientIntensitytype='SFFloatvalue='0.0accessType='inputOutput'/>
</ProtoInterface>
<ProtoBody>
<Material DEF='MaterialNode'>
<IS>
<connect nodeField='diffuseColorprotoField='diffuseColor'/>
<connect nodeField='emissiveColorprotoField='emissiveColor'/>
<connect nodeField='specularColorprotoField='specularColor'/>
<connect nodeField='transparencyprotoField='transparency'/>
<connect nodeField='shininessprotoField='shininess'/>
<connect nodeField='ambientIntensityprotoField='ambientIntensity'/>
</IS>
</Material>
<!-- Only first node (the node type) is renderable, others are along for the ride -->
<Script DEF='MaterialModulatorScript'>
<field name='enabledtype='SFBoolaccessType='inputOutput'/>
<field name='diffuseColortype='SFColoraccessType='inputOutput'/>
<field name='newColortype='SFColoraccessType='outputOnly'/>
<field name='clockTriggertype='SFTimeaccessType='inputOnly'/>
<IS>
<connect nodeField='enabledprotoField='enabled'/>
<connect nodeField='diffuseColorprotoField='diffuseColor'/>
</IS>
<![CDATA[

ecmascript:
function initialize ()
{
    newColor = diffuseColor; // start with correct color
}
function set_enabled (newValue)
{
	enabled = newValue;
}
function clockTrigger (timeValue)
{
    if (!enabled) return;
    red   = newColor.r;
    green = newColor.g;
    blue  = newColor.b;

    // note different modulation rates for each color component, % is modulus operator
    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);
	if (enabled)
	{
		Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\n');
	}
}

        
]]>
</Script>
</ProtoBody>
</ProtoDeclare>
<!-- Test success: declarative statement createDeclarativeShapeTests() -->
<Group DEF='DeclarativeGroupExample'>
<Shape>
<MetadataString DEF='FindableMetadataStringTestname='findThisNameValuevalue='"test case"'/>
<Appearance DEF='DeclarativeAppearanceExample'>
<!-- DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance -->
<ProtoInstance name='MaterialModulatorDEF='MyMaterialModulatorcontainerField='material'/>
</Appearance>
<Cone bottom='falsebottomRadius='0.05height='0.1'/>
</Shape>
<!-- Test success: declarativeGroup.addChild() singleton pipeline method -->
</Group>
<!-- Test success: declarative statement addChild() -->
<!-- Test success: x3dModel.findNodeByDEF(DeclarativeAppearanceExample) = <Appearance DEF='DeclarativeAppearanceExample'/> i.e. <Appearance DEF='DeclarativeAppearanceExample'> <!- - DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance - -> <ProtoInstance DEF='MyMaterialModulator' name='MaterialModulator' containerField='material'/> </Appearance> -->
<!-- Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='"test case"'/> -->
<!-- Test success: x3dModel.findElementByNameValue("ArtDeco01Material", "ProtoDeclare") found -->
<!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoDeclare") found -->
<!-- Test success: x3dModel.findElementByNameValue("MaterialModulator", "ProtoInstance") found -->
<Group DEF='TestFieldObjectsGroup'>
<!-- testFieldObjects() results -->
<!-- SFBool default=false, true=true, false=false, negate()=true -->
<!-- MFBool default=, initial=true false true, negate()=false true false -->
<!-- SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0 -->
<!-- MFFloat default=, initial=1 2 3, append(5)=1 2 3 5, inserts(3,4)(0,0)=0 1 2 3 4 5, append(6)=0 1 2 3 4 5 6, size()=7 -->
<!-- ... get1Value[3]=3.0, remove[1]=0 2 3 4 5 6, set1Value(0,10)=10 2 3 4 5 6, multiply(2)=20 4 6 8 10 12, clear= -->
<!-- SFVec3f default=0 0 0, initial=1 2 3, setValue=4 5 6, multiply(2)=8 10 12, normalize()=0.45584232 0.5698029 0.68376344, regex matches()=true -->
<!-- regex test SFVec3f().matches("1 2 3")=true, regex test SFVec3f().matches("1 2 3 4")=false, regex test (SFRotation.matches("0 0 0 0")=true, failure detecting illegal (zero axis) rotation value -->
</Group>
<Sound location='0 1.6 0'>
<!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
<AudioClip description='chimes'
  url=' "chimes.wav" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav" ' >
</AudioClip>
</Sound>
<Sound location='0 1.6 0'>
<!-- set sound-ellipsoid location height at 1.6m to match typical avatar height -->
<MovieTexture containerField='sourcedescription='mpgsys.mpg from ConformanceNist suite'
  url=' "mpgsys.mpg" "https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg" ' >
<!-- Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d -->
<!-- Expected containerField='source', allowed containerField values="texture"
"source"
"back"
"bottom"
"front"
"left"
"right"
"top"
"backTexture"
"bottomTexture"
"frontTexture"
"leftTexture"
"rightTexture"
"topTexture"
"children"
-->
</MovieTexture>
</Sound>
<!-- Test success: Anchor.isNode()=true, siteAnchor.isNode()=true -->
<!-- Test success: Anchor.isStatement()=false, siteAnchor.isStatement()=false -->
<!-- Test success: ROUTE.isNode()=false, orbitPositionROUTE.isNode()=false -->
<!-- Test success: ROUTE.isStatement()=true, orbitPositionROUTE.isStatement()=true -->
<!-- Test success: CommentsBlock.isNode()=false, testComments.isNode()=false -->
<!-- Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true -->
<Shape DEF='ExtrusionShape'>
<!-- ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]' -->
<!-- ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]' -->
<Appearance DEF='TransparentAppearance'>
<Material transparency='1.0'/>
</Appearance>
<Extrusion DEF='ExampleExtrusion'/>
</Shape>
<Group>
<!-- Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes -->
<ProtoDeclare name='NewWorldInfo'>
<ProtoInterface>
<field name='descriptiontype='SFStringaccessType='initializeOnly'/>
</ProtoInterface>
<ProtoBody>
<WorldInfo/>
</ProtoBody>
</ProtoDeclare>
<ProtoInstance name='NewWorldInfoDEF='Proto1'>
<fieldValue name='descriptionvalue='testing 1 2 3'/>
</ProtoInstance>
<Group DEF='Node2'>
<!-- intentionally empty -->
</Group>
<ProtoInstance name='NewWorldInfoDEF='Proto3'/>
<Transform DEF='Node4'>
<!-- intentionally empty -->
</Transform>
<!-- Test satisfactorily creates MFNode children array as an ordered list with mixed content -->
</Group>
<ProtoDeclare name='ShaderProto'>
<ProtoBody>
<ProgramShader containerField='shaders'/>
</ProtoBody>
</ProtoDeclare>
<Shape>
<Appearance>
<!-- Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes -->
<!-- Test satisfactorily creates MFNode shaders array as an ordered list with mixed content -->
<ProgramShader DEF='TestShader1containerField='shaders'>
<ShaderProgram DEF='TestShader2containerField='programs'>
</ShaderProgram>
</ProgramShader>
<ProtoInstance name='ShaderProtoDEF='TestShader3containerField='shaders'/>
<ComposedShader DEF='TestShader4containerField='shaders'>
<ShaderPart DEF='TestShader5containerField='parts'>
</ShaderPart>
</ComposedShader>
</Appearance>
</Shape>
<Transform DEF='SpecialtyNodes'>
<CADLayer>
<CADAssembly>
<CADPart>
<CADFace/>
</CADPart>
</CADAssembly>
</CADLayer>
<EspduTransform containerField='children'/>
<ReceiverPdu receivedPower='0.0containerField='children'/>
<SignalPdu containerField='children'/>
<TransmitterPdu relativeAntennaLocation='0 0 0transmitFrequencyBandwidth='0.0containerField='children'/>
<DISEntityManager containerField='children'>
<DISEntityTypeMapping containerField='children'/>
</DISEntityManager>
</Transform>
<EspduTransform containerField='children'>
<WorldInfo/>
</EspduTransform>
<ReceiverPdu receivedPower='0.0containerField='children'/>
<SignalPdu containerField='children'/>
<TransmitterPdu relativeAntennaLocation='0 0 0transmitFrequencyBandwidth='0.0containerField='children'/>
<DISEntityManager containerField='children'>
<DISEntityTypeMapping containerField='children'/>
</DISEntityManager>
<LoadSensor>
<!-- Contained nodes typically must be USE references for nodes previously DEFined in the scene -->
<!-- The following nodes are test cases for all X3DUrlObject nodes -->
<Anchor USE=' siteAnchor'/>
<Inline USE=' inlineScene'/>
<DISEntityTypeMapping containerField='children'/>
<GeoMetadata containerField='children'/>
<AudioClip containerField='children'/>
<ImageCubeMapTexture containerField='children'/>
<ImageTexture3D containerField='children'/>
<ImageTexture containerField='children'/>
<MovieTexture containerField='children'/>
<Script DEF='DummyScript'>

<![CDATA[

ecmascript:
/* dummy test source code */

      
]]>
</Script>
<PackagedShader containerField='children'/>
<ShaderPart containerField='children'>
</ShaderPart>
<ShaderProgram containerField='children'>
</ShaderProgram>
</LoadSensor>
</Scene>
</X3D>
<!--

to top <!-- Event Graph ROUTE Table shows event connections -->
 
<!-- Index for DEF nodes: ArtDeco02MaterialDEF, BackgroundGroup, BoxPathAnimator, BoxShape, ColorAnimator, ColorClock, colorTypeConversionScript, DeclarativeAppearanceExample, DeclarativeGroupExample, DefaultView, DummyScript, ExampleExtrusion, ExtrusionShape, FindableMetadataStringTest, GradualBackground, GreenMaterial, inlineScene, LineShape, LogoGeometryTransform, MaterialModulatorScript, MaterialNode, MyMaterialModulator, Node2, Node4, OrbitClock, Proto1, Proto3, ProxyShape, scene.addChildLayerSetTest, scene.addChildMetadata, siteAnchor, SpecialtyNodes, SpinClock, SpinInterpolator, TestAppearance1, TestAppearance2, TestAppearance3, TestFieldObjectsGroup, test-NMTOKEN_regex.0123456789, TestShader1, TestShader2, TestShader3, TestShader4, TestShader5, TestShape1, TestShape2, TestShape3, TextTransform, TopDownView, TransparentAppearance, WorldInfoDEF Index for ExternProtoDeclare definition: ArtDeco02Material

Index for ProtoDeclare definitions: ArtDeco01Material, MaterialModulator, NewWorldInfo, ShaderProto
-->

Event Graph ROUTE Table entries with 7 ROUTE connections total, showing X3D event-model relationships for this scene.

Each row shows an event cascade that may occur during a single timestamp interval between frame renderings, as part of the X3D execution model.

ColorClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
ColorAnimator
ColorInterpolator
set_fraction
SFFloat

 
 
then
ColorAnimator
ColorInterpolator
value_changed
SFColor

ROUTE
event to
(2)
colorTypeConversionScript
Script
colorInput
SFColor

 
 
then
colorTypeConversionScript
Script
colorsOutput
MFColor

ROUTE
event to
(3)
GradualBackground
Background
skyColor
MFColor


OrbitClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
BoxPathAnimator
PositionInterpolator
set_fraction
SFFloat

 
 
then
BoxPathAnimator
PositionInterpolator
value_changed
SFVec3f

ROUTE
event to
(2)
LogoGeometryTransform
Transform
set_translation
SFVec3f


SpinClock
TimeSensor
fraction_changed
SFFloat

ROUTE
event to
(1)
SpinInterpolator
OrientationInterpolator
set_fraction
SFFloat

 
 
then
SpinInterpolator
OrientationInterpolator
value_changed
SFRotation

ROUTE
event to
(2)
TextTransform
Transform
rotation
SFRotation


MaterialModulatorScript
Script
No ROUTE connection found for output from this node.
 



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


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


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


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


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


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



-->

<!-- Color legend: X3D terminology <X3dNode DEF='idName' field='value'/> matches XML terminology <XmlElement DEF='idName' attribute='value'/>
(Light-blue background: event-based behavior node or statement) (Grey background inside box: inserted documentation) (Magenta background: X3D Extensibility)
    <ProtoInstance name='ProtoName'> <fieldname='fieldName'/> </ProtoInstance> -->

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