[x3d-public] working on JavaScript SAI example, without an SAI
John Carlson
yottzumm at gmail.com
Mon Jan 13 16:38:01 PST 2020
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> wrote:
> Ant build script (All found on X3D sourceforge project):
>
> 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
>
> Code that ultimately needs work:
>
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20200113/9d193c2f/attachment-0001.html>
More information about the x3d-public
mailing list