[x3d-public] working on JavaScript SAI example, without an SAI

Andreas Plesch andreasplesch at gmail.com
Tue Jan 14 12:16:12 PST 2020


Server side, node.js based x3d generation would be useful. It is
certainly already possible, either with xml and perhaps a virtual dom
(https://www.npmjs.com/package/jsdom) with d3 (or just dom methods) or
xml processing (https://www.npmjs.com/package/xmlbuilder), or with
json since it is a Javascript Object Notation. But a dedicated Scene
Generator Interface would have many benefits, as pointed out.

Since there is the JSON encoding, I think the natural assumption would
be that the generated x3d is a javascript object and that a simple
JSON.stringify(x3dobject) would produce valid json encoded x3d.
Similarly, a simple JSON.parse(x3dJsonString) would produce a x3d
javascript object which can be manipulated by the Interface, or which
the Interface could reproduce.

Trying some lines ...

x3d = require('x3dSGI');
myshape = new x3d.Shape(); // default Shape, is object with json properties
myshape["-geometry"] = new x3d.Box({ size: new x3d.SFVec3f( [1, 2, 3]
) }); // with constructor option;  would @size work better ?
myShapeClone = myshape.deepObjectCopy(); // .deepObjectCopy from elsewhere
myAppearance = new x3d.Appearance(); //
myAppearance["-material'] = new x3d.Material({ diffuseColor: new
x3d.SFColor( [0.1, 1, 1] ) }); // would @diffuseColor work better to
directly create json encoding ?
myShapeClone["-appearance"] = myAppearance;
myGroup = new x3d.Group( { children: [ myshape, myShapeClone ] } ); //
"-children" ?

x3djson = JSON.stringify(myGroup);
x3dxml = x3d.toXML (myGroup);

So this works pretty well, except for the decorations from the json
encoding which would be required for stringify. I guess there needs to
be a dedicated x3d.toJSON function.

Typescript and typings would let smart IDE like VSCode provide
automatically a lot of functionality.

some thoughts, -Andreas








On Tue, Jan 14, 2020 at 1:13 PM Don Brutzman <brutzman at nps.edu> wrote:
>
> John, thanks for looking at this.
>
> It certainly is interesting to consider that scene graph construction using JavaScript really is... approximately the same as the JSON encoding, which we already have. Hello World example:
>
> https://x3dgraphics.com/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorldIndex.html
> https://x3dgraphics.com/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorld.x3d
> https://x3dgraphics.com/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorld.json
>
> Still I could see where some JavaScript programmers might want something along the lines you are laying out.  We chould add predifined enumerations (e.g. COMPONENT_NAME_NAVIGATION) and so forth.  Could also add type checking and consistency checking to the getter/setter methods, similar to what exists already in the autogenerated Java and Python language implementations provided by X3DJSAIL and X3DPSAIL.  Those certainly can help during programmatic construction.  Could also add utility methods for import/export, again similar to other libraries.
>
> Use case: server-side JavaScript programming, for example using node.js as server or command line.  Not a use case: rendering or interaction.
>
> If we get the example syntax well defined, such as what you have below, then it is relatively straightforward for me to adapt our current XSLT stylesheets to autogenerate such an API, along with a X3dToJavaScript.xslt converter.  Adding a few small switches might make that further adaptable as a X3dToTypeScript.xslt converter.
>
> Looking at X3DOM and X_ITE is certainly good, examining good practices, but we are not "choosing" or adapting to either because they have different goals.
>
> So maybe the main idea is an X3D JavaScript library of Plain Old JavaScript Object (POJO) classes...
> https://masteringjs.io/tutorials/fundamentals/pojo
>
> Would that be useful, and used?
>
> On 1/13/2020 7:09 PM, John Carlson wrote:
> > Okay, I see a lot of problems straight off the bat.   There's this thing called the execution context which I am not too familiar with as the first parameter on the constructors.  I'm not quite sure where I'm going to get that from.   Please start editing the code below to give me a flavor of what I have to do.
> >
> > On Mon, Jan 13, 2020 at 6:38 PM John Carlson <yottzumm at gmail.com <mailto:yottzumm at gmail.com>> wrote:
> >
> >     Here's the current scenegraph as JavaScript:
> >
> >     I'm going to download the latest from X_ITE.
> >
> >     John
> >
> >
> >     X3D = require('X3Dautoclass');
> >     var X3D0 =  new X3D({profile:"Immersive",version:"3.3"}
> >            /* x3dVersionComparisonTest for this model: supportsX3dVersion(X3DObject.VERSION_3_0)=true */
> >     ,
> >            new head({}
> >              /* comment #1 */
> >
> >              /* comment #2 */
> >
> >              /* comment #3 */
> >
> >              /* comment #4 */
> >     ,
> >              new component({name:"Navigation",level:3}),
> >              new component({name:"Shaders",level:1}),
> >              new component({name:"CADGeometry",level:2}),
> >              new component({name:"DIS",level:2}),
> >              new component({name:"H-Anim",level:1}),
> >              new component({name:"Grouping",level:1}),
> >              new component({name:"Layering",level:1}),
> >              new unit({name:"AngleUnitConversion",category:"angle",conversionFactor:1.0}),
> >              new unit({name:"LengthUnitConversion",category:"length",conversionFactor:1.0}),
> >              new unit({name:"ForceFromPoundsToNewtons",category:"force",conversionFactor:4.4482}),
> >              new meta({content:"HelloWorldProgramOutput.x3d",name:"title"}),
> >              new meta({content:"continued development and testing in progress",name:"info"}),
> >              new meta({content:"Example HelloWorldProgram creates an X3D model using the X3D Java Scene Access Interface Library (X3DJSAIL)",name:"description"}),
> >              new meta({content:"https://www.web3d.org/specifications/java/X3DJSAIL.html",name:"reference"}),
> >              new meta({content:"HelloWorldProgramOutput.java",name:"generator"}),
> >              new meta({content:"6 September 2016",name:"created"}),
> >              new meta({content:"12 January 2020",name:"modified"}),
> >              new meta({content:"X3D Java Scene Access Interface Library (X3DJSAIL)",name:"generator"}),
> >              new meta({content:"https://www.web3d.org/specifications/java/examples/HelloWorldProgram.java",name:"generator"}),
> >              new meta({content:"Netbeans http://www.netbeans.org",name:"generator"}),
> >              new meta({content:"Don Brutzman",name:"creator"}),
> >              new meta({content:"https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/examples/HelloWorldProgramOutput.x3d",name:"reference"}),
> >              new meta({content:"Console output, ClassicVRML encoding, VRML97 encoding and pretty-print documentation:",name:"reference"}),
> >              new meta({content:"HelloWorldProgramOutput.txt",name:"reference"}),
> >              new meta({content:"HelloWorldProgramOutput.x3dv",name:"reference"}),
> >              new meta({content:"HelloWorldProgramOutput.wrl",name:"reference"}),
> >              new meta({content:"HelloWorldProgramOutput.html",name:"reference"}),
> >              new meta({content:"https://savage.nps.edu/X3dValidator?url=https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d",name:"reference"}),
> >              new meta({content:"https://www.web3d.org/specifications/java/examples/HelloWorldProgramOutput.x3d",name:"identifier"}),
> >              new meta({content:"../license.html",name:"license"})),
> >            new Scene({},
> >              new ViewpointGroup({description:"Available viewpoints"},
> >                new Viewpoint({DEF:"DefaultView",description:"Hello X3DJSAIL"}),
> >                new Viewpoint({DEF:"TopDownView",description:"top-down view from above",orientation:[1,0,0,-1.570796],position:[0,100,0]})),
> >              new NavigationInfo({type:["EXAMINE","FLY","ANY"],avatarSize:[0.25,1.6,0.75],transitionType:["LINEAR"]}),
> >              new WorldInfo({DEF:"WorldInfoDEF",title:"HelloWorldProgram produced by X3D Java SAI Library (X3DJSAIL)"}),
> >              new WorldInfo({USE:"WorldInfoDEF"}),
> >              new WorldInfo({USE:"WorldInfoDEF"}),
> >              new MetadataString({DEF:"scene.addChildMetadata",name:"test",value:["Top-level root Metadata node beneath Scene needs to be one of '-children' in JSON encoding"]}),
> >              new LayerSet({DEF:"scene.addChildLayerSetTest",order:[0]}),
> >              new Transform({DEF:"LogoGeometryTransform",translation:[0,1.5,0]},
> >                new Anchor({description:"select for X3D Java SAI Library (X3DJSAIL) description",url:["../X3DJSAIL.html","https://www.web3d.org/specifications/java/X3DJSAIL.html"]},
> >                  new Shape({DEF:"BoxShape"},
> >                    new Appearance({},
> >                      new Material({DEF:"GreenMaterial",diffuseColor:[0,1,1],emissiveColor:[0.8,0,0],transparency:0.1}),
> >                      new ImageTexture({url:["images/X3dJavaSceneAccessInterfaceSaiLibrary.png","https://www.web3d.org/specifications/java/examples/images/X3dJavaSceneAccessInterfaceSaiLibrary.png"]})),
> >                    new Box({DEF:"test-NMTOKEN_regex.0123456789",cssClass:"untextured"})))),
> >              new Shape({DEF:"LineShape"},
> >                new Appearance({},
> >                  new Material({emissiveColor:[0.6,0.19607843,0.8]})),
> >                new IndexedLineSet({coordIndex:[0,1,2,3,4,0]}
> >                  /* Coordinate 3-tuple point count: 6 */
> >     ,
> >                  new 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]}))),
> >              new PositionInterpolator({DEF:"BoxPathAnimator",key:[0,0.125,0.375,0.625,0.875,1],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]}),
> >              new TimeSensor({DEF:"OrbitClock",cycleInterval:8.0,loop:true}),
> >              new ROUTE({fromField:"fraction_changed",fromNode:"OrbitClock",toField:"set_fraction",toNode:"BoxPathAnimator"}),
> >              new ROUTE({fromField:"value_changed",fromNode:"BoxPathAnimator",toField:"set_translation",toNode:"LogoGeometryTransform"}),
> >              new Transform({DEF:"TextTransform",translation:[0,-1.5,0]},
> >                new Shape({},
> >                  new Appearance({},
> >                    new Material({USE:"GreenMaterial"})),
> >                  new 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, "Immel did it!" */
> >     ,
> >                    new MetadataSet({name:"EscapedQuotationMarksMetadataSet"},
> >                      new MetadataString({name:"quotesTestC",value:["MFString example C, backslash-escaped quotes: He said, \"Immel did it!\""]}),
> >                      new MetadataString({name:"extraChildTest",value:["checks MetadataSetObject addValue() method"]})),
> >                    new FontStyle({family:["SERIF"],justify:["MIDDLE","MIDDLE"]}))),
> >                new Collision({}
> >                  /* test containerField='proxy' */
> >     ,
> >                  new Shape({DEF:"ProxyShape"}
> >                    /* alternative XML encoding: Text string='\"One, Two, Comment\" \"\" \"He said, \\"Immel did it!\\"\"' */
> >
> >                    /* alternative XML encoding: Text string='\"One, Two, Comment\" \"\" \"He said, \\"Immel did it!\\"\" \"\"' */
> >
> >                    /* 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 */
> >     ,
> >                    new Text({string:["One, Two, Text","","He said, \"Immel did it!\" \"\""]})))
> >                /* It's a beautiful world */
> >
> >                /* ... for you! */
> >
> >                /* https://en.wikipedia.org/wiki/Beautiful_World_(Devo_song) */
> >     )
> >              /* repeatedly spin 180 degrees as a readable special effect */
> >     ,
> >              new OrientationInterpolator({DEF:"SpinInterpolator",key:[0,0.5,1],keyValue:[0,1,0,4.712389,0,1,0,0,0,1,0,1.5707964]}),
> >              new TimeSensor({DEF:"SpinClock",cycleInterval:5.0,loop:true}),
> >              new ROUTE({fromField:"fraction_changed",fromNode:"SpinClock",toField:"set_fraction",toNode:"SpinInterpolator"}),
> >              new ROUTE({fromField:"value_changed",fromNode:"SpinInterpolator",toField:"rotation",toNode:"TextTransform"}),
> >              new Group({DEF:"BackgroundGroup"},
> >                new Background({DEF:"GradualBackground"}),
> >                new Script({DEF:"colorTypeConversionScript"},
> >                  new field({type:field.TYPE_SFCOLOR,name:"colorInput",accessType:field.ACCESSTYPE_INPUTONLY}),
> >                  new field({type:field.TYPE_MFCOLOR,name:"colorsOutput",accessType:field.ACCESSTYPE_OUTPUTONLY}),
> >
> >     `
> >     ecmascript:
> >
> >     function colorInput (eventValue) // Example source code
> >     {
> >         colorsOutput = new MFColor(eventValue); // assigning value sends output event
> >     // Browser.print('colorInput=' + eventValue + ', colorsOutput=' + colorsOutput + '\\n');
> >     }
> >
> >     `),
> >                new ColorInterpolator({DEF:"ColorAnimator",key:[0,0.5,1],keyValue:[0.9411765,1,1,0.29411766,0,0.50980395,0.9411765,1,1]}
> >                  /* AZURE to INDIGO and back again */
> >     ),
> >                new TimeSensor({DEF:"ColorClock",cycleInterval:60.0,loop:true}),
> >                new ROUTE({fromField:"colorsOutput",fromNode:"colorTypeConversionScript",toField:"skyColor",toNode:"GradualBackground"}),
> >                new ROUTE({fromField:"value_changed",fromNode:"ColorAnimator",toField:"colorInput",toNode:"colorTypeConversionScript"}),
> >                new ROUTE({fromField:"fraction_changed",fromNode:"ColorClock",toField:"set_fraction",toNode:"ColorAnimator"})),
> >              new ProtoDeclare({name:"ArtDeco01Material",appinfo:"tooltip: ArtDeco01Material prototype is a Material node"},
> >                new ProtoInterface({},
> >                  new field({type:field.TYPE_SFSTRING,name:"description",accessType:field.ACCESSTYPE_INPUTOUTPUT,appinfo:"tooltip for descriptionField",value:"ArtDeco01Material prototype is a Material node"}),
> >                  new field({type:field.TYPE_SFBOOL,name:"enabled",accessType:field.ACCESSTYPE_INPUTOUTPUT,value:"true"})),
> >                new ProtoBody({}
> >                  /* Initial node of ProtoBody determines prototype node type */
> >     ,
> >                  new Material({ambientIntensity:0.25,diffuseColor:[0.282435,0.085159,0.134462],shininess:0.127273,specularColor:[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 */
> >     ,
> >                  new TouchSensor({description:"within ProtoBody"},
> >                    new IS({},
> >                      new connect({nodeField:"description",protoField:"description"}),
> >                      new connect({nodeField:"enabled",protoField:"enabled"}))))),
> >              new ExternProtoDeclare({name:"ArtDeco02Material",appinfo:"this is a different Material node",url:["http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/ArtDecoPrototypesExcerpt.x3d#ArtDeco02Material","http://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.\" */
> >     ,
> >                new field({type:field.TYPE_SFSTRING,name:"description",accessType:field.ACCESSTYPE_INPUTOUTPUT,appinfo:"tooltip for descriptionField"}))
> >              /* Tested ArtDeco01ProtoInstance, ArtDeco02ProtoInstance for improper node type when ProtoInstance is added in wrong place */
> >     ,
> >              new Shape({DEF:"TestShape1"},
> >                new Appearance({DEF:"TestAppearance1"}
> >                  /* ArtDeco01Material prototype goes here... TODO ensure setContainerField is handled in exported Java */
> >     ,
> >                  new ProtoInstance({name:"ArtDeco01Material"}
> >                    /* [HelloWorldProgram diagnostic] ArtDeco01ProtoInstance.getNodeType()=\"Material\" */
> >     ,
> >                    new fieldValue({name:"description",value:"ArtDeco01Material can substitute for a Material node"}))),
> >                new Sphere({radius:0.001})),
> >              new Shape({DEF:"TestShape2"},
> >                new Appearance({DEF:"TestAppearance2"}
> >                  /* ArtDeco02Material prototype goes here... TODO ensure setContainerField is handled in exported Java */
> >     ,
> >                  new ProtoInstance({DEF:"ArtDeco02MaterialDEF",name:"ArtDeco02Material"}
> >                    /* [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.\" */
> >     ,
> >                    new fieldValue({name:"description",value:"ArtDeco02Material can substitute for another Material node"}))),
> >                new Cone({bottomRadius:0.001,height:0.001})),
> >              new Shape({DEF:"TestShape3"},
> >                new Appearance({DEF:"TestAppearance3"}
> >                  /* ArtDeco02Material ProtoInstance USE goes here. Note that name field is NOT defined as part of ProtoInstance USE. */
> >     ,
> >                  new ProtoInstance({USE:"ArtDeco02MaterialDEF"})),
> >                new Cylinder({height:0.001,radius:0.001})),
> >              new Inline({DEF:"inlineSceneDef",url:["someOtherScene.x3d","https://www.web3d.org/specifications/java/examples/someOtherScene.x3d"]}),
> >              new IMPORT({AS:"WorldInfoDEF2",importedDEF:"WorldInfoDEF",inlineDEF:"inlineSceneDef"}),
> >              new EXPORT({AS:"WorldInfoDEF3",localDEF:"WorldInfoDEF"}),
> >              new ProtoDeclare({name:"MaterialModulator",appinfo:"mimic a Material node and modulate fields as an animation effect",documentation:"http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14Prototypes/MaterialModulatorIndex.html"},
> >                new ProtoInterface({},
> >                  new field({type:field.TYPE_SFBOOL,name:"enabled",accessType:field.ACCESSTYPE_INPUTOUTPUT,value:"true"}),
> >                  new field({type:field.TYPE_SFCOLOR,name:"diffuseColor",accessType:field.ACCESSTYPE_INPUTOUTPUT,value:"0 0 0"}),
> >                  new field({type:field.TYPE_SFCOLOR,name:"emissiveColor",accessType:field.ACCESSTYPE_INPUTOUTPUT,value:"0.05 0.05 0.5"}),
> >                  new field({type:field.TYPE_SFCOLOR,name:"specularColor",accessType:field.ACCESSTYPE_INPUTOUTPUT,value:"0 0 0"}),
> >                  new field({type:field.TYPE_SFFLOAT,name:"transparency",accessType:field.ACCESSTYPE_INPUTOUTPUT,value:"0.0"}),
> >                  new field({type:field.TYPE_SFFLOAT,name:"shininess",accessType:field.ACCESSTYPE_INPUTOUTPUT,value:"0.0"}),
> >                  new field({type:field.TYPE_SFFLOAT,name:"ambientIntensity",accessType:field.ACCESSTYPE_INPUTOUTPUT,value:"0.0"})),
> >                new ProtoBody({},
> >                  new Material({DEF:"MaterialNode"},
> >                    new IS({},
> >                      new connect({nodeField:"diffuseColor",protoField:"diffuseColor"}),
> >                      new connect({nodeField:"emissiveColor",protoField:"emissiveColor"}),
> >                      new connect({nodeField:"specularColor",protoField:"specularColor"}),
> >                      new connect({nodeField:"transparency",protoField:"transparency"}),
> >                      new connect({nodeField:"shininess",protoField:"shininess"}),
> >                      new connect({nodeField:"ambientIntensity",protoField:"ambientIntensity"})))
> >                  /* Only first node (the node type) is renderable, others are along for the ride */
> >     ,
> >                  new Script({DEF:"MaterialModulatorScript"},
> >                    new field({type:field.TYPE_SFBOOL,name:"enabled",accessType:field.ACCESSTYPE_INPUTOUTPUT}),
> >                    new field({type:field.TYPE_SFCOLOR,name:"diffuseColor",accessType:field.ACCESSTYPE_INPUTOUTPUT}),
> >                    new field({type:field.TYPE_SFCOLOR,name:"newColor",accessType:field.ACCESSTYPE_OUTPUTONLY}),
> >                    new field({type:field.TYPE_SFTIME,name:"clockTrigger",accessType:field.ACCESSTYPE_INPUTONLY}),
> >                    new IS({},
> >                      new connect({nodeField:"enabled",protoField:"enabled"}),
> >                      new connect({nodeField:"diffuseColor",protoField:"diffuseColor"})),
> >
> >     `
> >     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');
> >     }
> >     }
> >
> >     `)))
> >              /* Test success: declarative statement createDeclarativeShapeTests() */
> >     ,
> >              new Group({DEF:"DeclarativeGroupExample"},
> >                new Shape({},
> >                  new MetadataString({DEF:"FindableMetadataStringTest",name:"findThisNameValue",value:["test case"]}),
> >                  new Appearance({DEF:"DeclarativeAppearanceExample"}
> >                    /* DeclarativeMaterialExample gets overridden by subsequently added MaterialModulator ProtoInstance */
> >     ,
> >                    new ProtoInstance({DEF:"MyMaterialModulator",name:"MaterialModulator"})),
> >                  new Cone({bottom:false,bottomRadius:0.05,height:0.1}))
> >                /* Test success: declarativeGroup.addChild() singleton pipeline method */
> >     )
> >              /* 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 */
> >     ,
> >              new Group({DEF:"TestFieldObjectsGroup"}
> >                /* testFieldObjects() results */
> >
> >                /* SFBool default=true, 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 (SFRotationObject.matches(\"0 0 0 0\")=true, failure detecting illegal (zero axis) rotation value */
> >     ),
> >              new Sound({location:[0,1.6,0]}
> >                /* set sound-ellipsoid location height at 1.6m to match typical avatar height */
> >     ,
> >                new AudioClip({description:"chimes",url:["chimes.wav","https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/chimes.wav"]}
> >                  /* Scene example fragment from https://www.web3d.org/x3d/content/examples/ConformanceNist/Sounds/AudioClip/default.x3d */
> >     )),
> >              new Sound({location:[0,1.6,0]}
> >                /* set sound-ellipsoid location height at 1.6m to match typical avatar height */
> >     ,
> >                new MovieTexture({description:"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\" \"watchList\" */
> >     ))
> >              /* Test success: AnchorObject.isNode()=true, siteAnchor.isNode()=true */
> >
> >              /* Test success: AnchorObject.isStatement()=false, siteAnchor.isStatement()=false */
> >
> >              /* Test success: ROUTEObject.isNode()=false, orbitPositionROUTE.isNode()=false */
> >
> >              /* Test success: ROUTEObject.isStatement()=true, orbitPositionROUTE.isStatement()=true */
> >
> >              /* Test success: CommentsBlock.isNode()=false, testComments.isNode()=false */
> >
> >              /* Test failure: CommentsBlock.isStatement()=true, testComments.isStatement()=true */
> >     ,
> >              new 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]' */
> >     ,
> >                new Appearance({DEF:"TransparentAppearance"},
> >                  new Material({transparency:1.0})),
> >                new Extrusion({DEF:"ExampleExtrusion"})),
> >              new Group({}
> >                /* Test MFNode children array as an ordered list consisting of comments, statements, ProtoInstance and nodes */
> >     ,
> >                new ProtoDeclare({name:"NewWorldInfo"},
> >                  new ProtoInterface({},
> >                    new field({type:field.TYPE_SFSTRING,name:"description",accessType:field.ACCESSTYPE_INITIALIZEONLY})),
> >                  new ProtoBody({},
> >                    new WorldInfo({}))),
> >                new ProtoInstance({DEF:"Proto1",name:"NewWorldInfo"},
> >                  new fieldValue({name:"description",value:"testing 1 2 3"})),
> >                new Group({DEF:"Node2"}
> >                  /* intentionally empty */
> >     ),
> >                new ProtoInstance({DEF:"Proto3",name:"NewWorldInfo"}),
> >                new Transform({DEF:"Node4"}
> >                  /* intentionally empty */
> >     )
> >                /* Test satisfactorily creates MFNode children array as an ordered list with mixed content */
> >     ),
> >              new ProtoDeclare({name:"ShaderProto"},
> >                new ProtoBody({},
> >                  new ProgramShader({}))),
> >              new Shape({},
> >                new 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 */
> >     ,
> >                  new ProgramShader({DEF:"TestShader1"},
> >                    new ShaderProgram({DEF:"TestShader2"})),
> >                  new ProtoInstance({DEF:"TestShader3",name:"ShaderProto"}),
> >                  new ComposedShader({DEF:"TestShader4"},
> >                    new ShaderPart({DEF:"TestShader5"})))),
> >              new Transform({DEF:"SpecialtyNodes"},
> >                new CADLayer({},
> >                  new CADAssembly({},
> >                    new CADPart({},
> >                      new CADFace({})))),
> >                new EspduTransform({geoSystem:["GD","WE"]}),
> >                new ReceiverPdu({geoSystem:["GD","WE"]}),
> >                new SignalPdu({geoSystem:["GD","WE"]}),
> >                new TransmitterPdu({geoSystem:["GD","WE"]}),
> >                new DISEntityManager({},
> >                  new DISEntityTypeMapping({})))))      ;
> >     X3D0.toFileX3D("examples/HelloWorldProgramOutput.new.x3d");
> >     X3D0.toFileJSON("examples/HelloWorldProgramOutput.new.json");
> >
> >     On Mon, Jan 13, 2020 at 3:40 PM John Carlson <yottzumm at gmail.com <mailto:yottzumm at gmail.com>> wrote:
> >
> >         Ant build script (All found on X3D sourceforge project):
> >
> >         www.web3d.org/x3d/stylesheets/node/build.xml <http://www.web3d.org/x3d/stylesheets/node/build.xml>
> >
> >         (recommend "all" target). In that folder, run
> >
> >         ant all to compile and run the test, but first, look at hand generated example:
> >
> >         Example for those creating the node.js SAI library: (very buggy)
> >         www.web3d.org/x3d/stylesheets/node/examples/HelloWorldProgramOutput.js <http://www.web3d.org/x3d/stylesheets/node/examples/HelloWorldProgramOutput.js>
> >
> >         Code that ultimately needs work:
> >
> >         www.web3d.org/x3d/stylesheets/node/JavaScriptSerializer.js <http://www.web3d.org/x3d/stylesheets/node/JavaScriptSerializer.js>
> >
> >         Discussion:
> >         Does this look like a good style in the examples file?
> >         Does the style match the standard JavaScript SAI?
> >         What is needed to standardize JavaScript SAI for X3Dv4?
> >         How fast can we get a Hello World roundtrip working?
> >
> >         This is primarily a build integration release.  Please integrate the build.xml all target with the stylesheets build.xml.  Thanks, Don!
> >
> >         Don, I see your way ahead of me, integrating this into everything.
> >
> >         Can someone point me at a working JavaScript SAI?
> >
> >         Thanks,
> >
> >         John
> >
>
>
> all the best, Don
> --
> Don Brutzman  Naval Postgraduate School, Code USW/Br       brutzman at nps.edu
> Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA   +1.831.656.2149
> X3D graphics, virtual worlds, navy robotics http://faculty.nps.edu/brutzman



-- 
Andreas Plesch
Waltham, MA 02453



More information about the x3d-public mailing list