[x3d-public] X3D JSON encoding: refactoring, simplifying handling of #comment and #ROUTE

John Carlson yottzumm at gmail.com
Mon Jan 4 05:06:54 PST 2016


If all else fails, we can think about adding an index to the comment that shows where it is.  Or #precomment and #postcomment.

John


> On Jan 4, 2016, at 12:26 AM, Don Brutzman <brutzman at nps.edu> wrote:
> 
> OK this sounds great - thanks John.  We will look at your attachments further during the morning call.  Will later proceed with trying to achieve the refactoring since you are ready to track along - that tandem progress is really valuable to make sure we are getting things right (and not digging a gigantic hole).  BCNU.
> 
> On 1/3/2016 4:28 PM, John Carlson wrote:
>> First example, Viewpoints are not the same.  Otherwise roundtrip is fine.  Second example doesn’t parse—it’s a fragment.  HelloWorld JSON converted to HelloWorldCommented.x3d2 and attached for your review.  No changed to X3D JSON Loader code yet—It appears like some comments are moved upward.  I believe this is due to the XML -> JSON conversion, not the JSON -> XML conversion.  Node.js script to convert JSON to X3D also attached.  I don’t see a problem with the new format as long as we can work out the XML -> JSON conversion.  I can’t magically figure out how to reattach comments in the old place when it’s not in the JSON document. I can make any necessary changes to the loader as long as I don’t run out of spare time. John
>> 
>> 
>>> On Dec 19, 2015, at 4:09 PM, Don Brutzman <brutzman at nps.edu> wrote:
>>> 
>>> 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
>>> --
>>> 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 roboticshttp://faculty.nps.edu/brutzman
>>> <HelloWorldCommented.x3d><HelloWorldCommentedOriginalEncoding.json><HelloWorldCommentedAlternativeEncoding.json>
>> 
> 
> 
> 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