[x3d-public] X3D JSON encoding: refactoring, simplifying handling of #comment and #ROUTE
Don Brutzman
brutzman at nps.edu
Sun Dec 20 15:46:56 PST 2015
Yes I just posted one example, pending feedback. Thanks for the note Clement.
The hyphen is used for fields, i.e. -fieldName and the # is used for statements... we should look at this a bit further to see if 2 different symbols is helpful or not.
On 12/20/2015 4:13 AM, Roy Walmsley wrote:
> Don,
>
> On looking at your last example of alternative encoding for the earth image scene it seems to me to be inconsistent in its use of a -children field. For example, the Shape node, although you have given it #comments, hasn't got a -children field. Or, perhaps I'm just misunderstanding ...
>
> Then I got to thinking - why call it "-children". Why not "-comment"? There is no comment field in any node, so no conflict. But then I see that in an earlier example you are adding all child content into a -children field ...
>
> So, inconclusive ... But I would like to see the last example fully generated in your alternative format.
>
> Regards,
>
> Roy
>
> -----Original Message-----
> From: Don Brutzman [mailto:brutzman at nps.edu]
> Sent: 19 December 2015 21:09
> To: John Carlson; Roy Walmsley (roy.walmsley at ntlworld.com)
> Cc: X3D Graphics public mailing list
> Subject: X3D JSON encoding: refactoring, simplifying handling of #comment and #ROUTE
>
> 1. Am thinking about how we might improve the X3D JSON encoding by treating #comment and #ROUTE as objects in an array that is contained by parent. This would reduce problems with the partial resorting that currently occurs.
>
> Doing it as part of "-children" isn't particularly difficult; the trick will be doing it cleanly inside of nodes that contain other non-children nodes, e.g. Shape, Appearance, singleton nodes, etc. The path to success may lead through always treating any child content as part of an array.
>
> Continuing this line of inquiry: we could put them inside of a "-children" JSON field consistently throughout the scene graph. Use cases:
> a. Within "-children":[array] of Scene (which is already produced) b. Within "-children":[array] of grouping nodes (which is already produced) c. Within "-children":[array] of any node, even when they don't have a /children/ field
>
> 2. So let's look at an example, in detail.
>
> Example scene created is named HelloWorldCommented.x3d with XML source, current (original) JSON encoding, and alternative JSON encoding all attached.
>
> First excerpt follows, with the focus just for regular children (use cases 1.a and 1.b from above).
>
> =========================================
> *XML encoding*
> =========================================
> <X3D>
> <Scene>
> <!-- Example scene to illustrate comments interspersed among X3D nodes and fields (XML elements and attributes) -->
> <!-- WorldInfo begin -->
> <WorldInfo title='Hello world!'/>
> <!-- WorldInfo complete, Group begin -->
> <Group>
> <!-- Viewpoint begin -->
> <Viewpoint DEF='ViewUpClose' centerOfRotation='0 -1 0' description='Hello world!' position='0 -1 7'/>
> <!-- Viewpoint complete, Transform begin -->
> <Transform/>
> <!-- Transform complete, Transform begin -->
> <Transform/>
> <!-- Transform complete -->
> </Group>
> <!-- Group complete -->
> </Scene>
> </X3D>
> =========================================
>
> Now two corresponding JSON examples using #comment attached. (Net effect with #ROUTE would be the same.)
>
> Notice how comments are pulled up together in the current encoding (which partially re-sorts and thus changes the original order), but then comments are interspersed as expected in the second encoding:
> =========================================
> *current JSON encoding*
> =========================================
> { "X3D": {
> "Scene": {
> "#comment":[
> "Example scene to illustrate comments interspersed among X3D nodes and fields (XML elements and attributes)",
> "WorldInfo begin",
> "WorldInfo complete, Group begin",
> "Group complete"
> ],
> "-children":[
> { "WorldInfo":
> {
> "@title":"Hello world!"
> }
> },
> { "Group":
> {
> "#comment":[
> "Viewpoint begin",
> "Viewpoint complete, Transform begin",
> "Transform complete, Transform begin",
> "Transform complete"
> ],
> "-children":[
> { "Viewpoint": { }
> },
> { "Transform": { }
> },
> { "Transform": { }
> }
> ]
> }
> }
> ]
> }
> }
> }
> =========================================
> *alternative JSON encoding*
> =========================================
> { "X3D": {
> "Scene": {
> "-children":[
> { "#comment":"Example scene to illustrate comments interspersed among X3D nodes and fields (XML elements and attributes)"},
> { "#comment":"WorldInfo begin"},
> { "WorldInfo":
> {
> "@title":"Hello world!"
> }
> },
> { "#comment":"WorldInfo complete, Group begin"},
> { "Group":
> {
> "-children":[
> { "#comment":"Viewpoint begin"},
> { "Viewpoint": { }
> },
> { "#comment":"Viewpoint complete, Transform begin"},
> { "Transform": { }
> },
> { "#comment":"Transform complete, Transform begin"},
> { "Transform": { }
> },
> { "#comment":"Transform complete"}
> ]
> }
> },
> { "#comment":"Group complete"}
> ]
> }
> }
> }
> =========================================
>
> 2. So far so good. Now let's look at how this approach ripples through a Shape node, as an example of use case 1.c above.
>
> =========================================
> *XML encoding*
> =========================================
> <!-- Shape begin -->
> <Shape>
> <!-- Text begin -->
> <Text DEF='TextMessage' string='"Hello" "world!"'>
> <!-- FontStyle begin -->
> <FontStyle justify='"MIDDLE" "MIDDLE"'/>
> <!-- FontStyle complete -->
> </Text>
> <!-- Text complete, Appearance begin -->
> <Appearance>
> <!-- Material begin -->
> <Material USE='MaterialLightBlue'/>
> <!-- Material complete -->
> </Appearance>
> <!-- Material complete -->
> </Shape>
> <!-- Shape complete -->
> =========================================
>
> Once again the current/original X3D JSON encoding partially re-sorts the comments:
> =========================================
> *current JSON encoding*
> =========================================
> "#comment":[
> "Shape begin",
> "Shape complete"
> ],
> "-children":[
> { "Shape":
> {
> "#comment":[
> "Text begin",
> "Text complete, Appearance begin",
> "Material complete"
> ],
> "-geometry":[
> { "Text":
> {
> "@DEF":"TextMessage",
> "@string":["Hello","world!"],
> "#comment":[
> "FontStyle begin",
> "FontStyle complete"
> ],
> "-fontStyle":[
> { "FontStyle":
> {
> "@justify":["MIDDLE","MIDDLE"]
> }
> }
> ]
> }
> }
> ],
> "-appearance":[
> { "Appearance":
> {
> "#comment":[
> "Material begin",
> "Material complete"
> ],
> "-material":[
> { "Material":
> {
> "@USE":"MaterialLightBlue"
> }
> }
> ]
> }
> }
> ]
> }
> }
> ]
> =========================================
>
> And once again the alternative intersperses the comments as part of a "-children" JSON key. Not so very different.
>
> Notable is that Shape and Appearance do not have /children/ fields, but they do have child ("-children") comments. Thus scene graph structure is better (though not perfectly) preserved.
>
> Some re-sorting of comments prior to peer nodes still appears to be unavoidable, but it is reduced overall.
>
> The pattern for encoding comments (and ROUTEs) is fully consistent, so parsing should still be straightforward.
> =========================================
> *alternative JSON encoding*
> =========================================
> "-children":[
> { "#comment":"Shape begin"},
> { "Shape":
> {
> "#comment":[
> "Sphere begin",
> "Sphere complete, Appearance begin",
> "Appearance complete"
> ],
> "-geometry":[
> { "Sphere":
> {
> }
> }
> ],
> "-appearance":[
> { "Appearance":
> {
> "-children":[
> { "#comment":"Viewpoint begin"},
> { "#comment":"Material begin"},
> { "#comment":"Material complete, ImageTexture begin"},
> { "#comment":"ImageTexture complete"}
> ],
> "-material":[
> { "Material":
> {
> "@DEF":"MaterialLightBlue",
> "@diffuseColor":[0.1,0.5,1]
> }
> }
> ],
> "-texture":[
> { "ImageTexture":
> {
> "@DEF":"ImageCloudlessEarth",
> "@url":["earth-topo.png","earth-topo.jpg","earth-topo-small.gif","http://www.web3d.org/x3d/content/examples/Basic/earth-topo.png","http://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg","http://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif"]
> }
> }
> ]
> }
> }
> ]
> }
> },
> { "#comment":"Shape complete"}
> ]
> =========================================
>
> 3. Analysis and next steps.
>
> I think that this alternative approach further reduces the special-case handling of #comment and #ROUTE which exists in the current/original JSON encoding.
>
> A more consistent JSON encoding simplifies parsing rules and hopefully makes production/consumption easier to accomplish.
>
> Treating #comment and #ROUTE in the same fashion as other nodes, rather than as field keys, also is more consistent with the primary design pattern of the overall X3D JSON encoding.
>
> The alternative-encoding example was manually edited and validated using jslint in X3D-Edit. If group review indicates that this approach looks superior, I'll work on a refactoring of the X3dToJson.xslt stylesheet and re-build all the examples to support continued in-depth testing, implementation and evaluation.
>
> Thanks in advance for all scrutiny and review.
>
> all the best, Don
>
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
More information about the x3d-public
mailing list