<div dir="ltr">Please test/review this HelloWorld example code in your ECMAScript SAI environments.  I know it's not perfect yet, but much improved after taking that nodejs detour.  I will continue revising as we find problems! I know that embedded scripts are not treated properly yet! Discussion on how to embed a script in a script is welcome! There's also multiline comments that are not handled properly, it looks like!<div><br>Thanks,</div><div><br></div><div>John</div><div><br></div><div><div>var browser = X3D.getBrowser();<br>var scene = browser.currentScene;<br>X3D0 = scene.createNode("X3D"); // suggest using document.querySelector("X3D");<br>X3D0.profile = "Immersive";<br>X3D0.version = "3.3";<br>// x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true <br>head1 = scene.createNode("head");<br>// comment #1 <br>// comment #2 <br>// comment #3 <br>// comment #4 <br>component2 = scene.createNode("component");<br><a href="http://component2.name">component2.name</a> = "Navigation";<br>component2.level = 3;<br>head1.component[0] = component2;<br><br>component3 = scene.createNode("component");<br><a href="http://component3.name">component3.name</a> = "Shaders";<br>component3.level = 1;<br>head1.component[1] = component3;<br><br>component4 = scene.createNode("component");<br><a href="http://component4.name">component4.name</a> = "CADGeometry";<br>component4.level = 2;<br>head1.component[2] = component4;<br><br>component5 = scene.createNode("component");<br><a href="http://component5.name">component5.name</a> = "DIS";<br>component5.level = 2;<br>head1.component[3] = component5;<br><br>component6 = scene.createNode("component");<br><a href="http://component6.name">component6.name</a> = "H-Anim";<br>component6.level = 1;<br>head1.component[4] = component6;<br><br>component7 = scene.createNode("component");<br><a href="http://component7.name">component7.name</a> = "Grouping";<br>component7.level = 1;<br>head1.component[5] = component7;<br><br>component8 = scene.createNode("component");<br><a href="http://component8.name">component8.name</a> = "Layering";<br>component8.level = 1;<br>head1.component[6] = component8;<br><br>unit9 = scene.createNode("unit");<br><a href="http://unit9.name">unit9.name</a> = "AngleUnitConversion";<br>unit9.category = "angle";<br>unit9.conversionFactor = 1.0;<br>head1.unit[7] = unit9;<br><br>unit10 = scene.createNode("unit");<br><a href="http://unit10.name">unit10.name</a> = "LengthUnitConversion";<br>unit10.category = "length";<br>unit10.conversionFactor = 1.0;<br>head1.unit[8] = unit10;<br><br>unit11 = scene.createNode("unit");<br><a href="http://unit11.name">unit11.name</a> = "ForceFromPoundsToNewtons";<br>unit11.category = "force";<br>unit11.conversionFactor = 4.4482;<br>head1.unit[9] = unit11;<br><br>meta12 = scene.createNode("meta");<br>meta12.content = "HelloWorldProgramOutput.x3d";<br><a href="http://meta12.name">meta12.name</a> = "title";<br>head1.meta[10] = meta12;<br><br>meta13 = scene.createNode("meta");<br>meta13.content = "continued development and testing in progress";<br><a href="http://meta13.name">meta13.name</a> = "info";<br>head1.meta[11] = meta13;<br><br>meta14 = scene.createNode("meta");<br>meta14.content = "Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)";<br><a href="http://meta14.name">meta14.name</a> = "description";<br>head1.meta[12] = meta14;<br><br>meta15 = scene.createNode("meta");<br>meta15.content = "<a href="https://www.web3d.org/specifications/java/X3DJSAIL.html">https://www.web3d.org/specifications/java/X3DJSAIL.html</a>";<br><a href="http://meta15.name">meta15.name</a> = "reference";<br>head1.meta[13] = meta15;<br><br>meta16 = scene.createNode("meta");<br>meta16.content = "HelloWorldProgramOutput.java";<br><a href="http://meta16.name">meta16.name</a> = "generator";<br>head1.meta[14] = meta16;<br><br>meta17 = scene.createNode("meta");<br>meta17.content = "6 September 2016";<br><a href="http://meta17.name">meta17.name</a> = "created";<br>head1.meta[15] = meta17;<br><br>meta18 = scene.createNode("meta");<br>meta18.content = "12 January 2020";<br><a href="http://meta18.name">meta18.name</a> = "modified";<br>head1.meta[16] = meta18;<br><br>meta19 = scene.createNode("meta");<br>meta19.content = "X3D Java Scene Access Interface Library (X3DJSAIL)";<br><a href="http://meta19.name">meta19.name</a> = "generator";<br>head1.meta[17] = meta19;<br><br>meta20 = scene.createNode("meta");<br>meta20.content = "<a href="https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java">https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java</a>";<br><a href="http://meta20.name">meta20.name</a> = "generator";<br>head1.meta[18] = meta20;<br><br>meta21 = scene.createNode("meta");<br>meta21.content = "Netbeans <a href="http://www.netbeans.org">http://www.netbeans.org</a>";<br><a href="http://meta21.name">meta21.name</a> = "generator";<br>head1.meta[19] = meta21;<br><br>meta22 = scene.createNode("meta");<br>meta22.content = "Don Brutzman";<br><a href="http://meta22.name">meta22.name</a> = "creator";<br>head1.meta[20] = meta22;<br><br>meta23 = scene.createNode("meta");<br>meta23.content = "<a href="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d">https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d</a>";<br><a href="http://meta23.name">meta23.name</a> = "reference";<br>head1.meta[21] = meta23;<br><br>meta24 = scene.createNode("meta");<br>meta24.content = "Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:";<br><a href="http://meta24.name">meta24.name</a> = "reference";<br>head1.meta[22] = meta24;<br><br>meta25 = scene.createNode("meta");<br>meta25.content = "HelloWorldProgramOutput.txt";<br><a href="http://meta25.name">meta25.name</a> = "reference";<br>head1.meta[23] = meta25;<br><br>meta26 = scene.createNode("meta");<br>meta26.content = "HelloWorldProgramOutput.x3dv";<br><a href="http://meta26.name">meta26.name</a> = "reference";<br>head1.meta[24] = meta26;<br><br>meta27 = scene.createNode("meta");<br>meta27.content = "HelloWorldProgramOutput.wrl";<br><a href="http://meta27.name">meta27.name</a> = "reference";<br>head1.meta[25] = meta27;<br><br>meta28 = scene.createNode("meta");<br>meta28.content = "HelloWorldProgramOutput.html";<br><a href="http://meta28.name">meta28.name</a> = "reference";<br>head1.meta[26] = meta28;<br><br>meta29 = scene.createNode("meta");<br>meta29.content = "<a href="https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d">https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d</a>";<br><a href="http://meta29.name">meta29.name</a> = "reference";<br>head1.meta[27] = meta29;<br><br>meta30 = scene.createNode("meta");<br>meta30.content = "<a href="https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d">https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d</a>";<br><a href="http://meta30.name">meta30.name</a> = "identifier";<br>head1.meta[28] = meta30;<br><br>meta31 = scene.createNode("meta");<br>meta31.content = "../license.html";<br><a href="http://meta31.name">meta31.name</a> = "license";<br>head1.meta[29] = meta31;<br><br>X3D0.head = head1;<br><br>Scene32 = scene.createNode("Scene");<br>ViewpointGroup33 = scene.createNode("ViewpointGroup");<br>ViewpointGroup33.description = "Available viewpoints";<br>Viewpoint34 = scene.createNode("Viewpoint");<br>Viewpoint34.DEF = "DefaultView";<br>Viewpoint34.description = "Hello X3DJSAIL";<br>ViewpointGroup33.children[0] = Viewpoint34;<br><br>Viewpoint35 = scene.createNode("Viewpoint");<br>Viewpoint35.DEF = "TopDownView";<br>Viewpoint35.description = "top-down view from above";<br>Viewpoint35.orientation = [1,0,0,-1.570796];<br>Viewpoint35.position = [0,100,0];<br>ViewpointGroup33.children[1] = Viewpoint35;<br><br>Scene32.children[0] = ViewpointGroup33;<br><br>NavigationInfo36 = scene.createNode("NavigationInfo");<br>NavigationInfo36.avatarSize = [0.25,1.6,0.75];<br>NavigationInfo36.transitionType = ["LINEAR"];<br>NavigationInfo36.type = ["EXAMINE","FLY","ANY"];<br>Scene32.children[1] = NavigationInfo36;<br><br>WorldInfo37 = scene.createNode("WorldInfo");<br>WorldInfo37.DEF = "WorldInfoDEF";<br>WorldInfo37.title = "HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)";<br>Scene32.children[2] = WorldInfo37;<br><br>WorldInfo38 = scene.createNode("WorldInfo");<br>WorldInfo38.USE = "WorldInfoDEF";<br>Scene32.children[3] = WorldInfo38;<br><br>WorldInfo39 = scene.createNode("WorldInfo");<br>WorldInfo39.USE = "WorldInfoDEF";<br>Scene32.children[4] = WorldInfo39;<br><br>MetadataString40 = scene.createNode("MetadataString");<br>MetadataString40.DEF = "scene.addChildMetadata";<br>MetadataString40.name = "test";<br>MetadataString40.value = ["Top-level root Metadata node beneath Scene needs to be one of '-children' in JSON encoding"];<br>Scene32.metadata[5] = MetadataString40;<br><br>LayerSet41 = scene.createNode("LayerSet");<br>LayerSet41.DEF = "scene.addChildLayerSetTest";<br>LayerSet41.order = [0];<br>Scene32.layerSet[6] = LayerSet41;<br><br>Transform42 = scene.createNode("Transform");<br>Transform42.DEF = "LogoGeometryTransform";<br>Transform42.translation = [0,1.5,0];<br>Anchor43 = scene.createNode("Anchor");<br>Anchor43.description = "select for X3D Java SAI Library (X3DJSAIL) description";<br>Anchor43.url = ["../X3DJSAIL.html","<a href="https://www.web3d.org/specifications/java/X3DJSAIL.html">https://www.web3d.org/specifications/java/X3DJSAIL.html</a>"];<br>Shape44 = scene.createNode("Shape");<br>Shape44.DEF = "BoxShape";<br>Appearance45 = scene.createNode("Appearance");<br>Material46 = scene.createNode("Material");<br>Material46.DEF = "GreenMaterial";<br>Material46.diffuseColor = [0,1,1];<br>Material46.emissiveColor = [0.8,0,0];<br>Material46.transparency = 0.1;<br>Appearance45.material = Material46;<br><br>ImageTexture47 = scene.createNode("ImageTexture");<br>ImageTexture47.url = ["images/X3dJavaSceneAccessInterfaceSaiLibrary.png","<a href="https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png">https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png</a>"];<br>Appearance45.texture = ImageTexture47;<br><br>Shape44.appearance = Appearance45;<br><br>Box48 = scene.createNode("Box");<br>Box48.DEF = "test-NMTOKEN_regex.0123456789";<br>Box48.CssClass = "untextured";<br>Shape44.geometry = Box48;<br><br>Anchor43.children[0] = Shape44;<br><br>Transform42.children[0] = Anchor43;<br><br>Scene32.children[7] = Transform42;<br><br>Shape49 = scene.createNode("Shape");<br>Shape49.DEF = "LineShape";<br>Appearance50 = scene.createNode("Appearance");<br>Material51 = scene.createNode("Material");<br>Material51.emissiveColor = [0.6,0.19607843,0.8];<br>Appearance50.material = Material51;<br><br>Shape49.appearance = Appearance50;<br><br>IndexedLineSet52 = scene.createNode("IndexedLineSet");<br>IndexedLineSet52.coordIndex = [0,1,2,3,4,0];<br>// Coordinate 3-tuple point count: 6 <br>Coordinate53 = scene.createNode("Coordinate");<br>Coordinate53.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];<br>IndexedLineSet52.coord = Coordinate53;<br><br>Shape49.geometry = IndexedLineSet52;<br><br>Scene32.children[8] = Shape49;<br><br>PositionInterpolator54 = scene.createNode("PositionInterpolator");<br>PositionInterpolator54.DEF = "BoxPathAnimator";<br>PositionInterpolator54.key = [0,0.125,0.375,0.625,0.875,1];<br>PositionInterpolator54.keyValue = [0,1.5,0,2,1.5,0,2,1.5,-2,-2,1.5,-2,-2,1.5,0,0,1.5,0];<br>Scene32.children[9] = PositionInterpolator54;<br><br>TimeSensor55 = scene.createNode("TimeSensor");<br>TimeSensor55.DEF = "OrbitClock";<br>TimeSensor55.cycleInterval = 8.0;<br>TimeSensor55.loop = True;<br>Scene32.children[10] = TimeSensor55;<br><br>ROUTE56 = scene.createNode("ROUTE");<br>ROUTE56.fromField = "fraction_changed";<br>ROUTE56.fromNode = "OrbitClock";<br>ROUTE56.toField = "set_fraction";<br>ROUTE56.toNode = "BoxPathAnimator";<br>Scene32.children[11] = ROUTE56;<br><br>ROUTE57 = scene.createNode("ROUTE");<br>ROUTE57.fromField = "value_changed";<br>ROUTE57.fromNode = "BoxPathAnimator";<br>ROUTE57.toField = "set_translation";<br>ROUTE57.toNode = "LogoGeometryTransform";<br>Scene32.children[12] = ROUTE57;<br><br>Transform58 = scene.createNode("Transform");<br>Transform58.DEF = "TextTransform";<br>Transform58.translation = [0,-1.5,0];<br>Shape59 = scene.createNode("Shape");<br>Appearance60 = scene.createNode("Appearance");<br>Material61 = scene.createNode("Material");<br>Material61.USE = "GreenMaterial";<br>Appearance60.material = Material61;<br><br>Shape59.appearance = Appearance60;<br><br>Text62 = scene.createNode("Text");<br>Text62.string = ["X3D Java","SAI Library","X3DJSAIL"];<br>// Comment example A, plain quotation marks: He said, \"Immel did it!\" <br>// Comment example B, XML character entities: He said, &quot;Immel did it!&quot; <br>MetadataSet63 = scene.createNode("MetadataSet");<br>MetadataSet63.name = "EscapedQuotationMarksMetadataSet";<br>MetadataString64 = scene.createNode("MetadataString");<br>MetadataString64.name = "quotesTestC";<br>MetadataString64.value = ["MFString example C, backslash-escaped quotes: He said, \"Immel did it!\""];<br>MetadataSet63.e[0] = MetadataString64;<br><br>MetadataString65 = scene.createNode("MetadataString");<br>MetadataString65.name = "extraChildTest";<br>MetadataString65.value = ["checks MetadataSetObject addValue() method"];<br>MetadataSet63.e[1] = MetadataString65;<br><br>Text62.metadata = MetadataSet63;<br><br>FontStyle66 = scene.createNode("FontStyle");<br>FontStyle66.family = ["SERIF"];<br>FontStyle66.justify = ["MIDDLE","MIDDLE"];<br>Text62.fontStyle = FontStyle66;<br><br>Shape59.geometry = Text62;<br><br>Transform58.children[0] = Shape59;<br><br>Collision67 = scene.createNode("Collision");<br>// test containerField='proxy' <br>Shape68 = scene.createNode("Shape");<br>Shape68.DEF = "ProxyShape";<br>// alternative XML encoding: Text string='\"One, Two, Comment\" \"\" \"He said, \\&quot;Immel did it!\\&quot;\"' <br>// alternative XML encoding: Text string='\"One, Two, Comment\" \"\" \"He said, \\&quot;Immel did it!\\&quot;\" \"\"' <br>// alternative Java source: .setString(new String [] {\"One, Two, Comment\", \"\", \"He said, \\\"Immel did it!\\\"\"}) <br>// reference: <a href="https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html">https://www.web3d.org/x3d/content/examples/Basic/X3dSpecifications/StringArrayEncodingExamplesIndex.html</a> <br>Text69 = scene.createNode("Text");<br>Text69.string = ["One, Two, Text","","He said, \"Immel did it!\" \"\""];<br>Shape68.geometry = Text69;<br><br>Collision67.proxy = Shape68;<br><br>Transform58.children[1] = Collision67;<br><br>// It's a beautiful world <br>// ... for you! <br>// <a href="https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song)">https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song)</a> <br>Scene32.children[13] = Transform58;<br><br>// repeatedly spin 180 degrees as a readable special effect <br>OrientationInterpolator70 = scene.createNode("OrientationInterpolator");<br>OrientationInterpolator70.DEF = "SpinInterpolator";<br>OrientationInterpolator70.key = [0,0.5,1];<br>OrientationInterpolator70.keyValue = [0,1,0,4.712389,0,1,0,0,0,1,0,1.5707964];<br>Scene32.children[14] = OrientationInterpolator70;<br><br>TimeSensor71 = scene.createNode("TimeSensor");<br>TimeSensor71.DEF = "SpinClock";<br>TimeSensor71.cycleInterval = 5.0;<br>TimeSensor71.loop = True;<br>Scene32.children[15] = TimeSensor71;<br><br>ROUTE72 = scene.createNode("ROUTE");<br>ROUTE72.fromField = "fraction_changed";<br>ROUTE72.fromNode = "SpinClock";<br>ROUTE72.toField = "set_fraction";<br>ROUTE72.toNode = "SpinInterpolator";<br>Scene32.children[16] = ROUTE72;<br><br>ROUTE73 = scene.createNode("ROUTE");<br>ROUTE73.fromField = "value_changed";<br>ROUTE73.fromNode = "SpinInterpolator";<br>ROUTE73.toField = "rotation";<br>ROUTE73.toNode = "TextTransform";<br>Scene32.children[17] = ROUTE73;<br><br>Group74 = scene.createNode("Group");<br>Group74.DEF = "BackgroundGroup";<br>Background75 = scene.createNode("Background");<br>Background75.DEF = "GradualBackground";<br>Group74.children[0] = Background75;<br><br>Script76 = scene.createNode("Script");<br>Script76.DEF = "colorTypeConversionScript";<br>field77 = scene.createNode("field");<br><a href="http://field77.name">field77.name</a> = "colorInput";<br>field77.accessType = "inputOnly";<br>field77.type = "SFColor";<br>Script76.field[0] = field77;<br><br>field78 = scene.createNode("field");<br><a href="http://field78.name">field78.name</a> = "colorsOutput";<br>field78.accessType = "outputOnly";<br>field78.type = "MFColor";<br>Script76.field[1] = field78;<br><br><br>Script76.setSourceCode(`\n"+<br>"ecmascript:\n"+<br>"\n"+<br>"function colorInput (eventValue) // Example source code\n"+<br>"{\n"+<br>"   colorsOutput = new MFColor(eventValue); // assigning value sends output event\n"+<br>"// Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\\n');\n"+<br>"}\n"+<br>"`)<br>Group74.children[1] = Script76;<br><br>ColorInterpolator79 = scene.createNode("ColorInterpolator");<br>ColorInterpolator79.DEF = "ColorAnimator";<br>ColorInterpolator79.key = [0,0.5,1];<br>ColorInterpolator79.keyValue = [0.9411765,1,1,0.29411766,0,0.50980395,0.9411765,1,1];<br>// AZURE to INDIGO and back again <br>Group74.children[2] = ColorInterpolator79;<br><br>TimeSensor80 = scene.createNode("TimeSensor");<br>TimeSensor80.DEF = "ColorClock";<br>TimeSensor80.cycleInterval = 60.0;<br>TimeSensor80.loop = True;<br>Group74.children[3] = TimeSensor80;<br><br>ROUTE81 = scene.createNode("ROUTE");<br>ROUTE81.fromField = "colorsOutput";<br>ROUTE81.fromNode = "colorTypeConversionScript";<br>ROUTE81.toField = "skyColor";<br>ROUTE81.toNode = "GradualBackground";<br>Group74.children[4] = ROUTE81;<br><br>ROUTE82 = scene.createNode("ROUTE");<br>ROUTE82.fromField = "value_changed";<br>ROUTE82.fromNode = "ColorAnimator";<br>ROUTE82.toField = "colorInput";<br>ROUTE82.toNode = "colorTypeConversionScript";<br>Group74.children[5] = ROUTE82;<br><br>ROUTE83 = scene.createNode("ROUTE");<br>ROUTE83.fromField = "fraction_changed";<br>ROUTE83.fromNode = "ColorClock";<br>ROUTE83.toField = "set_fraction";<br>ROUTE83.toNode = "ColorAnimator";<br>Group74.children[6] = ROUTE83;<br><br>Scene32.children[18] = Group74;<br><br>ProtoDeclare84 = scene.createNode("ProtoDeclare");<br>ProtoDeclare84.name = "ArtDeco01Material";<br>ProtoDeclare84.appinfo = "tooltip: ArtDeco01Material prototype is a Material node";<br>ProtoInterface85 = scene.createNode("ProtoInterface");<br>field86 = scene.createNode("field");<br><a href="http://field86.name">field86.name</a> = "description";<br>field86.accessType = "inputOutput";<br>field86.appinfo = "tooltip for descriptionField";<br>field86.type = "SFString";<br>field86.value = "ArtDeco01Material prototype is a Material node";<br>ProtoInterface85.field[0] = field86;<br><br>field87 = scene.createNode("field");<br><a href="http://field87.name">field87.name</a> = "enabled";<br>field87.accessType = "inputOutput";<br>field87.type = "SFBool";<br>field87.value = "true";<br>ProtoInterface85.field[1] = field87;<br><br>ProtoDeclare84.protoInterface = ProtoInterface85;<br><br>ProtoBody88 = scene.createNode("ProtoBody");<br>// Initial node of ProtoBody determines prototype node type <br>Material89 = scene.createNode("Material");<br>Material89.ambientIntensity = 0.25;<br>Material89.diffuseColor = [0.282435,0.085159,0.134462];<br>Material89.shininess = 0.127273;<br>Material89.specularColor = [0.276305,0.11431,0.139857];<br>ProtoBody88.children[0] = Material89;<br><br>// [HelloWorldProgram diagnostic] should be connected to scene graph: artDeco01ProtoDeclare.getNodeType()=\"Material\" <br>// presence of follow-on TouchSensor shows that additional nodes are allowed in ProtoBody after initial node, regardless of node types <br>TouchSensor90 = scene.createNode("TouchSensor");<br>TouchSensor90.description = "within ProtoBody";<br>IS91 = scene.createNode("IS");<br>connect92 = scene.createNode("connect");<br>connect92.nodeField = "description";<br>connect92.protoField = "description";<br>IS91.connect[0] = connect92;<br><br>connect93 = scene.createNode("connect");<br>connect93.nodeField = "enabled";<br>connect93.protoField = "enabled";<br>IS91.connect[1] = connect93;<br><br>TouchSensor90.iS = IS91;<br><br>ProtoBody88.children[1] = TouchSensor90;<br><br>ProtoDeclare84.protoBody = ProtoBody88;<br><br>Scene32.children[19] = ProtoDeclare84;<br><br>ExternProtoDeclare94 = scene.createNode("ExternProtoDeclare");<br>ExternProtoDeclare94.name = "ArtDeco02Material";<br>ExternProtoDeclare94.appinfo = "this is a different Material node";<br>ExternProtoDeclare94.url = ["<a href="http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material">http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material</a>","<a href="http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material">http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3dv#ArtDeco02Material</a>"];<br>// [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.\" <br>field95 = scene.createNode("field");<br><a href="http://field95.name">field95.name</a> = "description";<br>field95.accessType = "inputOutput";<br>field95.appinfo = "tooltip for descriptionField";<br>field95.type = "SFString";<br>ExternProtoDeclare94.field[0] = field95;<br><br>Scene32.children[20] = ExternProtoDeclare94;<br><br>// Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place <br>Shape96 = scene.createNode("Shape");<br>Shape96.DEF = "TestShape1";<br>Appearance97 = scene.createNode("Appearance");<br>Appearance97.DEF = "TestAppearance1";<br>// ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java <br>ProtoInstance98 = scene.createNode("ProtoInstance");<br>ProtoInstance98.name = "ArtDeco01Material";<br>// [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()=\"Material\" <br>fieldValue99 = scene.createNode("fieldValue");<br>fieldValue99.name = "description";<br>fieldValue99.value = "ArtDeco01Material can substitute for a Material node";<br>ProtoInstance98.fieldValue[0] = fieldValue99;<br><br>Appearance97.material = ProtoInstance98;<br><br>Shape96.appearance = Appearance97;<br><br>Sphere100 = scene.createNode("Sphere");<br>Sphere100.radius = 0.001;<br>Shape96.geometry = Sphere100;<br><br>Scene32.children[21] = Shape96;<br><br>Shape101 = scene.createNode("Shape");<br>Shape101.DEF = "TestShape2";<br>Appearance102 = scene.createNode("Appearance");<br>Appearance102.DEF = "TestAppearance2";<br>// ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java <br>ProtoInstance103 = scene.createNode("ProtoInstance");<br>ProtoInstance103.DEF = "ArtDeco02MaterialDEF";<br>ProtoInstance103.name = "ArtDeco02Material";<br>// [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.\" <br>fieldValue104 = scene.createNode("fieldValue");<br>fieldValue104.name = "description";<br>fieldValue104.value = "ArtDeco02Material can substitute for another Material node";<br>ProtoInstance103.fieldValue[0] = fieldValue104;<br><br>Appearance102.material = ProtoInstance103;<br><br>Shape101.appearance = Appearance102;<br><br>Cone105 = scene.createNode("Cone");<br>Cone105.bottomRadius = 0.001;<br>Cone105.height = 0.001;<br>Shape101.geometry = Cone105;<br><br>Scene32.children[22] = Shape101;<br><br>Shape106 = scene.createNode("Shape");<br>Shape106.DEF = "TestShape3";<br>Appearance107 = scene.createNode("Appearance");<br>Appearance107.DEF = "TestAppearance3";<br>// ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. <br>ProtoInstance108 = scene.createNode("ProtoInstance");<br>ProtoInstance108.USE = "ArtDeco02MaterialDEF";<br>Appearance107.material = ProtoInstance108;<br><br>Shape106.appearance = Appearance107;<br><br>Cylinder109 = scene.createNode("Cylinder");<br>Cylinder109.height = 0.001;<br>Cylinder109.radius = 0.001;<br>Shape106.geometry = Cylinder109;<br><br>Scene32.children[23] = Shape106;<br><br>Inline110 = scene.createNode("Inline");<br>Inline110.DEF = "inlineSceneDef";<br>Inline110.url = ["someOtherScene.x3d","<a href="https://www.web3d.org/specifications/java/examples/someOtherScene.x3d">https://www.web3d.org/specifications/java/examples/someOtherScene.x3d</a>"];<br>Scene32.children[24] = Inline110;<br><br>IMPORT111 = scene.createNode("IMPORT");<br><a href="http://IMPORT111.AS">IMPORT111.AS</a> = "WorldInfoDEF2";<br>IMPORT111.importedDEF = "WorldInfoDEF";<br>IMPORT111.inlineDEF = "inlineSceneDef";<br>Scene32.children[25] = IMPORT111;<br><br>EXPORT112 = scene.createNode("EXPORT");<br><a href="http://EXPORT112.AS">EXPORT112.AS</a> = "WorldInfoDEF3";<br>EXPORT112.localDEF = "WorldInfoDEF";<br>Scene32.children[26] = EXPORT112;<br><br>ProtoDeclare113 = scene.createNode("ProtoDeclare");<br>ProtoDeclare113.name = "MaterialModulator";<br>ProtoDeclare113.appinfo = "mimic a Material node and modulate fields as an animation effect";<br>ProtoDeclare113.documentation = "<a href="http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html">http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html</a>";<br>ProtoInterface114 = scene.createNode("ProtoInterface");<br>field115 = scene.createNode("field");<br><a href="http://field115.name">field115.name</a> = "enabled";<br>field115.accessType = "inputOutput";<br>field115.type = "SFBool";<br>field115.value = "true";<br>ProtoInterface114.field[0] = field115;<br><br>field116 = scene.createNode("field");<br><a href="http://field116.name">field116.name</a> = "diffuseColor";<br>field116.accessType = "inputOutput";<br>field116.type = "SFColor";<br>field116.value = "0 0 0";<br>ProtoInterface114.field[1] = field116;<br><br>field117 = scene.createNode("field");<br><a href="http://field117.name">field117.name</a> = "emissiveColor";<br>field117.accessType = "inputOutput";<br>field117.type = "SFColor";<br>field117.value = "0.05 0.05 0.5";<br>ProtoInterface114.field[2] = field117;<br><br>field118 = scene.createNode("field");<br><a href="http://field118.name">field118.name</a> = "specularColor";<br>field118.accessType = "inputOutput";<br>field118.type = "SFColor";<br>field118.value = "0 0 0";<br>ProtoInterface114.field[3] = field118;<br><br>field119 = scene.createNode("field");<br><a href="http://field119.name">field119.name</a> = "transparency";<br>field119.accessType = "inputOutput";<br>field119.type = "SFFloat";<br>field119.value = "0.0";<br>ProtoInterface114.field[4] = field119;<br><br>field120 = scene.createNode("field");<br><a href="http://field120.name">field120.name</a> = "shininess";<br>field120.accessType = "inputOutput";<br>field120.type = "SFFloat";<br>field120.value = "0.0";<br>ProtoInterface114.field[5] = field120;<br><br>field121 = scene.createNode("field");<br><a href="http://field121.name">field121.name</a> = "ambientIntensity";<br>field121.accessType = "inputOutput";<br>field121.type = "SFFloat";<br>field121.value = "0.0";<br>ProtoInterface114.field[6] = field121;<br><br>ProtoDeclare113.protoInterface = ProtoInterface114;<br><br>ProtoBody122 = scene.createNode("ProtoBody");<br>Material123 = scene.createNode("Material");<br>Material123.DEF = "MaterialNode";<br>IS124 = scene.createNode("IS");<br>connect125 = scene.createNode("connect");<br>connect125.nodeField = "diffuseColor";<br>connect125.protoField = "diffuseColor";<br>IS124.connect[0] = connect125;<br><br>connect126 = scene.createNode("connect");<br>connect126.nodeField = "emissiveColor";<br>connect126.protoField = "emissiveColor";<br>IS124.connect[1] = connect126;<br><br>connect127 = scene.createNode("connect");<br>connect127.nodeField = "specularColor";<br>connect127.protoField = "specularColor";<br>IS124.connect[2] = connect127;<br><br>connect128 = scene.createNode("connect");<br>connect128.nodeField = "transparency";<br>connect128.protoField = "transparency";<br>IS124.connect[3] = connect128;<br><br>connect129 = scene.createNode("connect");<br>connect129.nodeField = "shininess";<br>connect129.protoField = "shininess";<br>IS124.connect[4] = connect129;<br><br>connect130 = scene.createNode("connect");<br>connect130.nodeField = "ambientIntensity";<br>connect130.protoField = "ambientIntensity";<br>IS124.connect[5] = connect130;<br><br>Material123.iS = IS124;<br><br>ProtoBody122.children[0] = Material123;<br><br>// Only first node (the node type) is renderable, others are along for the ride <br>Script131 = scene.createNode("Script");<br>Script131.DEF = "MaterialModulatorScript";<br>field132 = scene.createNode("field");<br><a href="http://field132.name">field132.name</a> = "enabled";<br>field132.accessType = "inputOutput";<br>field132.type = "SFBool";<br>Script131.field[0] = field132;<br><br>field133 = scene.createNode("field");<br><a href="http://field133.name">field133.name</a> = "diffuseColor";<br>field133.accessType = "inputOutput";<br>field133.type = "SFColor";<br>Script131.field[1] = field133;<br><br>field134 = scene.createNode("field");<br><a href="http://field134.name">field134.name</a> = "newColor";<br>field134.accessType = "outputOnly";<br>field134.type = "SFColor";<br>Script131.field[2] = field134;<br><br>field135 = scene.createNode("field");<br><a href="http://field135.name">field135.name</a> = "clockTrigger";<br>field135.accessType = "inputOnly";<br>field135.type = "SFTime";<br>Script131.field[3] = field135;<br><br>IS136 = scene.createNode("IS");<br>connect137 = scene.createNode("connect");<br>connect137.nodeField = "enabled";<br>connect137.protoField = "enabled";<br>IS136.connect[0] = connect137;<br><br>connect138 = scene.createNode("connect");<br>connect138.nodeField = "diffuseColor";<br>connect138.protoField = "diffuseColor";<br>IS136.connect[1] = connect138;<br><br>Script131.iS = IS136;<br><br><br>Script131.setSourceCode(`\n"+<br>"ecmascript:\n"+<br>"function initialize ()\n"+<br>"{\n"+<br>"    newColor = diffuseColor; // start with correct color\n"+<br>"}\n"+<br>"function set_enabled (newValue)\n"+<br>"{\n"+<br>"   enabled = newValue;\n"+<br>"}\n"+<br>"function clockTrigger (timeValue)\n"+<br>"{\n"+<br>"    if (!enabled) return;\n"+<br>"    red   = newColor.r;\n"+<br>"    green = newColor.g;\n"+<br>"    blue  = newColor.b;\n"+<br>"    \n"+<br>"    // note different modulation rates for each color component, % is modulus operator\n"+<br>"    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);\n"+<br>"  if (enabled)\n"+<br>"   {\n"+<br>"              Browser.print ('diffuseColor=(' + red + ',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\\n');\n"+<br>"       }\n"+<br>"}\n"+<br>"`)<br>ProtoBody122.children[1] = Script131;<br><br>ProtoDeclare113.protoBody = ProtoBody122;<br><br>Scene32.children[27] = ProtoDeclare113;<br><br>// Test success: declarative statement createDeclarativeShapeTests() <br>Group139 = scene.createNode("Group");<br>Group139.DEF = "DeclarativeGroupExample";<br>Shape140 = scene.createNode("Shape");<br>MetadataString141 = scene.createNode("MetadataString");<br>MetadataString141.DEF = "FindableMetadataStringTest";<br>MetadataString141.name = "findThisNameValue";<br>MetadataString141.value = ["test case"];<br>Shape140.metadata = MetadataString141;<br><br>Appearance142 = scene.createNode("Appearance");<br>Appearance142.DEF = "DeclarativeAppearanceExample";<br>// DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance <br>ProtoInstance143 = scene.createNode("ProtoInstance");<br>ProtoInstance143.DEF = "MyMaterialModulator";<br>ProtoInstance143.name = "MaterialModulator";<br>Appearance142.material = ProtoInstance143;<br><br>Shape140.appearance = Appearance142;<br><br>Cone144 = scene.createNode("Cone");<br>Cone144.bottom = False;<br>Cone144.bottomRadius = 0.05;<br>Cone144.height = 0.1;<br>Shape140.geometry = Cone144;<br><br>Group139.children[0] = Shape140;<br><br>// Test success: declarativeGroup.addChild() singleton pipeline method <br>Scene32.children[28] = Group139;<br><br>// Test success: declarative statement addChild() <br>// 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> <br>// Test success: x3dModel.findElementByNameValue(findThisNameValue) = <MetadataString DEF='FindableMetadataStringTest' name='findThisNameValue' value='\"test case\"'/> <br>// Test success: x3dModel.findElementByNameValue(\"ArtDeco01Material\", \"ProtoDeclare\") found <br>// Test success: x3dModel.findElementByNameValue(\"MaterialModulator\", \"ProtoDeclare\") found <br>// Test success: x3dModel.findElementByNameValue(\"MaterialModulator\", \"ProtoInstance\") found <br>Group145 = scene.createNode("Group");<br>Group145.DEF = "TestFieldObjectsGroup";<br>// testFieldObjects() results <br>// SFBool default=true, true=true, false=false, negate()=true <br>// MFBool default=, initial=true false true, negate()=false true false <br>// SFFloat default=0.0, initial=1.0, setValue(2)=2.0, setValue(3.0f)=3.0, setValue(4.0)=4.0 <br>// 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 <br>// ... 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= <br>// 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 <br>// regex test SFVec3f().matches(\"1 2 3\")=true, regex test SFVec3f().matches(\"1 2 3 4\")=false, regex test (SFRotationObject.matches(\"0 0 0 0\")=true, failure detecting illegal (zero axis) rotation value <br>Scene32.children[29] = Group145;<br><br>Sound146 = scene.createNode("Sound");<br>Sound146.location = [0,1.6,0];<br>// set sound-ellipsoid location height at 1.6m to match typical avatar height <br>AudioClip147 = scene.createNode("AudioClip");<br>AudioClip147.description = "chimes";<br>AudioClip147.url = ["chimes.wav","<a href="https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav">https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav</a>"];<br>// Scene example fragment from <a href="https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d">https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d</a> <br>Sound146.source = AudioClip147;<br><br>Scene32.children[30] = Sound146;<br><br>Sound148 = scene.createNode("Sound");<br>Sound148.location = [0,1.6,0];<br>// set sound-ellipsoid location height at 1.6m to match typical avatar height <br>MovieTexture149 = scene.createNode("MovieTexture");<br>MovieTexture149.description = "mpgsys.mpg from ConformanceNist suite";<br>MovieTexture149.url = ["mpgsys.mpg","<a href="https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg">https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpgsys.mpg</a>"];<br>// Scene example fragment from <a href="https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d">https://www.web3d.org/x3d/content/examples/ConformanceNist/Appearance/MovieTexture/mpeg1-systems.x3d</a> <br>// Expected containerField='source', allowed containerField values=\"texture\" \"source\" \"back\" \"bottom\" \"front\" \"left\" \"right\" \"top\" \"backTexture\" \"bottomTexture\" \"frontTexture\" \"leftTexture\" \"rightTexture\" \"topTexture\" \"watchList\" <br>Sound148.source = MovieTexture149;<br><br>Scene32.children[31] = Sound148;<br><br>// Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true <br>// Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false <br>// Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false <br>// Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true <br>// Test success: CommentsBlock.isNode()=false, testComments.isNode()=false <br>// Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true <br>Shape150 = scene.createNode("Shape");<br>Shape150.DEF = "ExtrusionShape";<br>// ExampleExtrusion isCrossSectionClosed()=true, crossSection='[1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0]' <br>// ExampleExtrusion isSpineClosed()=false, spine='[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]' <br>Appearance151 = scene.createNode("Appearance");<br>Appearance151.DEF = "TransparentAppearance";<br>Material152 = scene.createNode("Material");<br>Material152.transparency = 1.0;<br>Appearance151.material = Material152;<br><br>Shape150.appearance = Appearance151;<br><br>Extrusion153 = scene.createNode("Extrusion");<br>Extrusion153.DEF = "ExampleExtrusion";<br>Shape150.geometry = Extrusion153;<br><br>Scene32.children[32] = Shape150;<br><br>Group154 = scene.createNode("Group");<br>// Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes <br>ProtoDeclare155 = scene.createNode("ProtoDeclare");<br>ProtoDeclare155.name = "NewWorldInfo";<br>ProtoInterface156 = scene.createNode("ProtoInterface");<br>field157 = scene.createNode("field");<br><a href="http://field157.name">field157.name</a> = "description";<br>field157.accessType = "initializeOnly";<br>field157.type = "SFString";<br>ProtoInterface156.field[0] = field157;<br><br>ProtoDeclare155.protoInterface = ProtoInterface156;<br><br>ProtoBody158 = scene.createNode("ProtoBody");<br>WorldInfo159 = scene.createNode("WorldInfo");<br>ProtoBody158.children[0] = WorldInfo159;<br><br>ProtoDeclare155.protoBody = ProtoBody158;<br><br>Group154.children[0] = ProtoDeclare155;<br><br>ProtoInstance160 = scene.createNode("ProtoInstance");<br>ProtoInstance160.DEF = "Proto1";<br>ProtoInstance160.name = "NewWorldInfo";<br>fieldValue161 = scene.createNode("fieldValue");<br>fieldValue161.name = "description";<br>fieldValue161.value = "testing 1 2 3";<br>ProtoInstance160.fieldValue[0] = fieldValue161;<br><br>Group154.children[1] = ProtoInstance160;<br><br>Group162 = scene.createNode("Group");<br>Group162.DEF = "Node2";<br>// intentionally empty <br>Group154.children[2] = Group162;<br><br>ProtoInstance163 = scene.createNode("ProtoInstance");<br>ProtoInstance163.DEF = "Proto3";<br>ProtoInstance163.name = "NewWorldInfo";<br>Group154.children[3] = ProtoInstance163;<br><br>Transform164 = scene.createNode("Transform");<br>Transform164.DEF = "Node4";<br>// intentionally empty <br>Group154.children[4] = Transform164;<br><br>// Test satisfactorily creates MFNode children array as an ordered list with mixed content <br>Scene32.children[33] = Group154;<br><br>ProtoDeclare165 = scene.createNode("ProtoDeclare");<br>ProtoDeclare165.name = "ShaderProto";<br>ProtoBody166 = scene.createNode("ProtoBody");<br>ProgramShader167 = scene.createNode("ProgramShader");<br>ProtoBody166.child[0] = ProgramShader167;<br><br>ProtoDeclare165.protoBody = ProtoBody166;<br><br>Scene32.children[34] = ProtoDeclare165;<br><br>Shape168 = scene.createNode("Shape");<br>Appearance169 = scene.createNode("Appearance");<br>// Test MFNode shaders array as an ordered list consisting of comments, ProtoInstance and nodes <br>// Test satisfactorily creates MFNode shaders array as an ordered list with mixed content <br>ProgramShader170 = scene.createNode("ProgramShader");<br>ProgramShader170.DEF = "TestShader1";<br>ShaderProgram171 = scene.createNode("ShaderProgram");<br>ShaderProgram171.DEF = "TestShader2";<br>ProgramShader170.programs[0] = ShaderProgram171;<br><br>Appearance169.shaders[0] = ProgramShader170;<br><br>ProtoInstance172 = scene.createNode("ProtoInstance");<br>ProtoInstance172.DEF = "TestShader3";<br>ProtoInstance172.name = "ShaderProto";<br>Appearance169.material = ProtoInstance172;<br><br>ComposedShader173 = scene.createNode("ComposedShader");<br>ComposedShader173.DEF = "TestShader4";<br>ShaderPart174 = scene.createNode("ShaderPart");<br>ShaderPart174.DEF = "TestShader5";<br>ComposedShader173.parts[0] = ShaderPart174;<br><br>Appearance169.shaders[1] = ComposedShader173;<br><br>Shape168.appearance = Appearance169;<br><br>Scene32.children[35] = Shape168;<br><br>Transform175 = scene.createNode("Transform");<br>Transform175.DEF = "SpecialtyNodes";<br>CADLayer176 = scene.createNode("CADLayer");<br>CADAssembly177 = scene.createNode("CADAssembly");<br>CADPart178 = scene.createNode("CADPart");<br>CADFace179 = scene.createNode("CADFace");<br>CADPart178.children[0] = CADFace179;<br><br>CADAssembly177.children[0] = CADPart178;<br><br>CADLayer176.children[0] = CADAssembly177;<br><br>Transform175.children[0] = CADLayer176;<br><br>EspduTransform180 = scene.createNode("EspduTransform");<br>EspduTransform180.geoSystem = ["GD","WE"];<br>Transform175.children[1] = EspduTransform180;<br><br>ReceiverPdu181 = scene.createNode("ReceiverPdu");<br>ReceiverPdu181.geoSystem = ["GD","WE"];<br>Transform175.children[2] = ReceiverPdu181;<br><br>SignalPdu182 = scene.createNode("SignalPdu");<br>SignalPdu182.geoSystem = ["GD","WE"];<br>Transform175.children[3] = SignalPdu182;<br><br>TransmitterPdu183 = scene.createNode("TransmitterPdu");<br>TransmitterPdu183.geoSystem = ["GD","WE"];<br>Transform175.children[4] = TransmitterPdu183;<br><br>DISEntityManager184 = scene.createNode("DISEntityManager");<br>DISEntityTypeMapping185 = scene.createNode("DISEntityTypeMapping");<br>DISEntityManager184.mapping[0] = DISEntityTypeMapping185;<br><br>Transform175.children[5] = DISEntityManager184;<br><br>Scene32.children[36] = Transform175;<br><br>X3D0.scene = Scene32;<br><br></div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Apr 11, 2020 at 8:40 AM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com">andreasplesch@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi John,<br>
<br>
x_ite just follows standard SAI, internal or external:<br>
<br>
//get Browser<br>
browser=X3D.getBrowser(); //X3D is global defined by x_ite.js<br>
//get current scene<br>
scene=browser.currentScene;<br>
//make shape node<br>
shape=scene.createNode('Shape');<br>
//make box node<br>
box=scene.createNode('Box');<br>
//set geometry field<br>
shape.geometry=box;<br>
//add as root node (for example)<br>
scene.addRootNode(shape);<br>
<br>
For me the easiest way to experiment with scripting like this, is to<br>
use the Chrome dev tools console with a simple scene like:<br>
<a href="https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/desert3X_ITE.html" rel="noreferrer" target="_blank">https://www.web3d.org/x3d/content/examples/Basic/UniversalMediaPanoramas/desert3X_ITE.html</a><br>
Following the steps will give you a white box visible in the active scene.<br>
<br>
x3dom uses the DOM as an interface to the scene. So you create DOM<br>
elements using HTML5 methods and add those to the Scene DOM element.<br>
There may be a way to avoid using the DOM and use internal, SAI like<br>
functions. For example, the javascript domNode._x3dom property gives<br>
you access to fields and methods for a node. But usually it is easiest<br>
and most interoperable on a HTML5 page to use the DOM.<br>
<br>
The field names are the same across browser but the internal<br>
representation of field values (as a javascript object) is very<br>
different. So one cannot use the results of SAI x_ite calls directly<br>
with x3dom, or vice versa. It is necesssary to go through encodings.<br>
<br>
I do not think X3DJSAIL deals a lot with Browser or ExecutionContext<br>
SAI functions since they are tied to the specific browser but I may be<br>
wrong.<br>
<br>
Andreas<br>
<br>
On Sat, Apr 11, 2020 at 2:58 AM John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank">yottzumm@gmail.com</a>> wrote:<br>
><br>
> Could Andreas explain how to use createNode in the context of X_ITE SAI?<br>
> I think that createNode may be the one significant thing missing from X3DOM SAI.<br>
> There's an unrelated one in the physics code.<br>
><br>
> That is, you use createNode to createNodes in SAI, then you use the fields of the returned object.  Are these the same across browsers?<br>
><br>
> Here's how to get a node from the standard:<br>
><br>
> Browser.currentScene.createNode('Shape');<br>
><br>
> Again, there is no createNode in X3DJSAIL to speak of.<br>
><br>
> Thanks,<br>
><br>
> John<br>
><br>
> On Sat, Apr 11, 2020 at 1:24 AM John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank">yottzumm@gmail.com</a>> wrote:<br>
>><br>
>> We have 2 versions of  JavaScript server side API, Nashorn and Node, both dependent on X3DJSAIL, and the code looks similar.  However, we do not have a JavaScript native version yet, even with JSweet (it's incomplete).<br>
>><br>
>> I believe that we should pursue an external SAI compatible with X_ITE, since X3DOM already has an external SAI.<br>
>><br>
>> Below is an example of "External" with X_ITE. Note that X3D is required to be defined, and x_ite.js should be loaded before X3D is called.  So how do we do that in node?  This is why I've been suggesting headless browsers!<br>
>><br>
>> ...so...I need to figure out an example of Transform in the standard.  It would seem like the thing to do would be to implement createNode?  Are there any examples of createNode?  Yes, in X_ITE at least.  Do we need to create an execution context to use it?  Yes!<br>
>><br>
>> Is there an X_ITE example of external createNode?<br>
>><br>
>> Yes!<br>
>><br>
>> As far as I can tell there is not a X3DOM version of ECMAScript SAI's createNode.<br>
>><br>
>> So I think we should start with X_ITE as I said before, and try to create an External ECMAScript SAI script (not DOM).<br>
>><br>
>> Do people agree that we should try to create an ECMAScript SAI example from outside X_ITE?<br>
>><br>
>> It appears that we either have to start from X3D(), below.   Can we make X3D() into an external SAI?<br>
>><br>
>> Do we need a browser in nodejs?<br>
>><br>
>> has anyone looked into chrome embedded framework?<br>
>><br>
>> John<br>
>><br>
>><br>
>><br>
>> -----------------------------------------------------------------------------<br>
>> function load_X_ITE_XML(content, selector) {<br>
>>         X3D(function() {<br>
>>                 var browser = X3D.getBrowser(selector);<br>
>>                 browser.replaceWorld(browser.createX3DFromString(content));<br>
>>         }, function() {<br>
>>                 alert("Failed to render XML to X_ITE");<br>
>>         });<br>
>> }<br>
>><br>
>> function load_X_ITE_DOM(element, selector) {<br>
>>         X3D(function() {<br>
>>                 if (typeof X3D.getBrowser !== 'undefined') {<br>
>>                         var browser = X3D.getBrowser(selector);<br>
>>                         if (typeof browser !== 'undefined' && typeof browser.importDocument !== 'undefined') {<br>
>>                                 var importedScene = browser.importDocument(element);<br>
>>                                 browser.replaceWorld(importedScene);<br>
>>                         }<br>
>>                 }<br>
>>         }, function() {<br>
>>                 alert("Failed to render DOM to X_ITE");<br>
>>         });<br>
>> }<br>
>><br>
>> function load_X_ITE_JS(jsobj, selector) {<br>
>>         X3D(function() {<br>
>>                 if (typeof X3D.getBrowser !== 'undefined') {<br>
>>                         var browser = X3D.getBrowser(selector);<br>
>>                         if (typeof browser !== 'undefined' && typeof browser.importJS !== 'undefined') {<br>
>>                                 var importedScene = browser.importJS(jsobj);<br>
>>                                 browser.replaceWorld(importedScene);<br>
>>                         }<br>
>>                 }<br>
>>         }, function() {<br>
>>                 alert("Failed to render JSON to X_ITE");<br>
>>         });<br>
>> }<br>
>> -------------------------------------------------------------------------------------------------------------<br>
>> John<br>
<br>
<br>
<br>
-- <br>
Andreas Plesch<br>
Waltham, MA 02453<br>
</blockquote></div>