<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:inherit;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"inherit",serif;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"inherit",serif;}
span.od
        {mso-style-name:od;}
span.ev
        {mso-style-name:ev;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=EN-US link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>From X3DUOM:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><div><table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0><tr><td style='padding:0in 0in 0in 0in'><div style='border:solid windowtext 1.0pt;padding:1.0pt 1.0pt 1.0pt 1.0pt' id=vt100><pre style='line-height:111%;background:black'><span class=od><span style='color:#BFBFBF'>      name="containerFieldChoicesMetadata"                          </span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=ev><span style='color:#BFBFBF'>                  baseTy</span><span style='color:black'>p</span><span style='color:#BFBFBF'>e="xs:NMTOKEN"                                         </span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=od><span style='color:#BFBFBF'>                  appinfo="containerFieldChoicesMetadata lists the allowed conta</span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=ev><span style='color:#BFBFBF'>inerField enumeration values for Metadata nodes: &#34;value&#34; if providing in</span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=od><span style='color:#BFBFBF'>formation and parent node is MetadataSet collection, otherwise default &#34;meta</span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=ev><span style='color:#BFBFBF'>data&#34; if providing information about parent node."                          </span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=od><span style='color:#BFBFBF'>                  documentation="http://www.web3d.org/x3d/content/examples/X3dSc</span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=ev><span style='color:#BFBFBF'>eneAuthoringHints.html#containerField">                                         </span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=od><span style='color:#BFBFBF'>         value="metadata"                                          </span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=ev><span style='color:#BFBFBF'>                      appinfo="this node provides metadata information regarding</span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=od><span style='color:#BFBFBF'> its parent node."/>                                                            </span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=ev><span style='color:#BFBFBF'>         value="value"                                             </span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=od><span style='color:#BFBFBF'>                      appinfo="parent node is MetadataSet, this node is providin</span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=ev><span style='color:#BFBFBF'>g information as part of a MetadataSet collection."/>                           </span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre><pre style='line-height:111%;background:black'><span class=od><span style='color:#BFBFBF'>                                                                   </span></span><span style='color:#BFBFBF'><o:p></o:p></span></pre></div></td></tr></table></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='border:none;padding:0in'><b>From: </b><a href="mailto:yottzumm@gmail.com">John Carlson</a><br><b>Sent: </b>Friday, February 1, 2019 10:26 AM<br><b>To: </b><a href="mailto:andreasplesch@gmail.com">Andreas Plesch</a>; <a href="mailto:x3d-public@web3d.org">X3D Graphics public mailing list</a>; <a href="mailto:brutzman@nps.edu">Don Brutzman</a><br><b>Subject: </b>RE: [x3d-public] gltf metadata</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>JSON Schema has value.  OK.  I must have misunderstood.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>John<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b>From: </b><a href="mailto:yottzumm@gmail.com">John Carlson</a><br><b>Sent: </b>Friday, February 1, 2019 10:04 AM<br><b>To: </b><a href="mailto:andreasplesch@gmail.com">Andreas Plesch</a>; <a href="mailto:x3d-public@web3d.org">X3D Graphics public mailing list</a>; <a href="mailto:brutzman@nps.edu">Don Brutzman</a><br><b>Subject: </b>RE: [x3d-public] gltf metadata<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Re: containerField of value (oops)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>You might check the JSON schema, but I’m not sure “value” is the preferred name for a containerField. “children” may be preferred. That is, convert the X3D to JSON, and then check against the JSON 3.3 schema.  Generally “value” => 1 value and “children” =>  >1  value<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b>From: </b><a href="mailto:andreasplesch@gmail.com">Andreas Plesch</a><br><b>Sent: </b>Friday, February 1, 2019 9:43 AM<br><b>To: </b><a href="mailto:x3d-public@web3d.org">X3D Graphics public mailing list</a><br><b>Subject: </b>[x3d-public] gltf metadata<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Here is how x3dom currently translates gltf metadata into x3d. Since<o:p></o:p></p><p class=MsoNormal>x3dom translates the non-binary gltf data into dom and makes it<o:p></o:p></p><p class=MsoNormal>(optionally) available as a dom node tree under the inline, translated<o:p></o:p></p><p class=MsoNormal>metadata can then be accessed as well, to show somewhere or do<o:p></o:p></p><p class=MsoNormal>whatever.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>gltf has the ability to provide unstructured or optionally structured<o:p></o:p></p><p class=MsoNormal>metadata for the global asset and for each resource. This is similar<o:p></o:p></p><p class=MsoNormal>to the Metadata nodes in x3d.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>glTF metadata can be provided in an 'extras' property which is<o:p></o:p></p><p class=MsoNormal>available to each kind of node. In addition, the toplevel asset node<o:p></o:p></p><p class=MsoNormal>contains metadata in defined properties.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The asset node data is translated into a WorldInfo node in the following way.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The copyright, generator, version, and minversion properties of the<o:p></o:p></p><p class=MsoNormal>toplevel asset node go into WorldInfo as a MFString info field: '<o:p></o:p></p><p class=MsoNormal>"copyright:(c)2020 sb" "version:2.0" ..' .The property name is joined<o:p></o:p></p><p class=MsoNormal>together with its value by a colon. [ There are alternatives, such as<o:p></o:p></p><p class=MsoNormal>property name followed by property value. ]<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>extras of the toplevel asset node go into the WorldInfo metadata field<o:p></o:p></p><p class=MsoNormal>packaged inside a MetadataSet holding node with name 'global':<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><WorldInfo info= ' "copyright:(c)2020 sb" "version:2.0" '<o:p></o:p></p><p class=MsoNormal>title='asset.extras.title value if given'><o:p></o:p></p><p class=MsoNormal>  <MetadataSet name='global' containerfield='metadata'><o:p></o:p></p><p class=MsoNormal>    <MetadataSet name='asset-extras' containerfield='value'><o:p></o:p></p><p class=MsoNormal>      extras (see below)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The asset extras metadata are named 'asset-extras'.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>There is no defined 'title' property in gltf but if there is an<o:p></o:p></p><p class=MsoNormal>asset.extras.title string property it goes in the title field of<o:p></o:p></p><p class=MsoNormal>WorldInfo.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>[ I am starting to think that it would be better to not use the info<o:p></o:p></p><p class=MsoNormal>field and just have an additional entry into the global MetadataSet,<o:p></o:p></p><p class=MsoNormal>an 'asset-properties' entry ].<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The 'global' holding node also contains the extras of the gltf scene node.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><WorldInfo><o:p></o:p></p><p class=MsoNormal>  <MetadataSet name='global' containerfield='metadata'><o:p></o:p></p><p class=MsoNormal>    <MetadataSet name='asset-extras' containerfield='value'><o:p></o:p></p><p class=MsoNormal>      extras (see below)<o:p></o:p></p><p class=MsoNormal>    <MetadataSet name='scene-extras' containerfield='value'><o:p></o:p></p><p class=MsoNormal>      extras (see below)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The scene extras metadata are name 'scene-extras'.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The scene metadata are put into WorldInfo metadata because X3D Scene<o:p></o:p></p><p class=MsoNormal>itself cannot have a Metadata node (X3D Metadata nodes are not child<o:p></o:p></p><p class=MsoNormal>nodes) and because using the META statements in the X3D header would<o:p></o:p></p><p class=MsoNormal>then require managing the X3D header. Also, it seems logical to group<o:p></o:p></p><p class=MsoNormal>all scene-wide data together.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>All other extras properties in nodes go into metadata nodes as<o:p></o:p></p><p class=MsoNormal>required in the following way. The gltf extras json property can have<o:p></o:p></p><p class=MsoNormal>any json value, including arrays and objects. It is recommended to use<o:p></o:p></p><p class=MsoNormal>a json object as name:value map but any json value is allowed.<o:p></o:p></p><p class=MsoNormal>A json string becomes a MetadataString.<o:p></o:p></p><p class=MsoNormal>A json number becomes a MetadataFloat.<o:p></o:p></p><p class=MsoNormal>A json boolean becomes a MetadataBoolean.<o:p></o:p></p><p class=MsoNormal>A json array or object becomes a MetadataSet. An array is actually an<o:p></o:p></p><p class=MsoNormal>object with numerical, ordered keys: {'0':v0, '1':v1 ..}. It can be<o:p></o:p></p><p class=MsoNormal>treated as an object.<o:p></o:p></p><p class=MsoNormal>The name field for each metadata node is 'extras' by default or the<o:p></o:p></p><p class=MsoNormal>key name in case of values for MetadataSet.<o:p></o:p></p><p class=MsoNormal>Here are examples:<o:p></o:p></p><p class=MsoNormal><Transform><o:p></o:p></p><p class=MsoNormal>  <MetadataString name='extras' value='extras_value_string'<o:p></o:p></p><p class=MsoNormal>containerfield='metadata'/><o:p></o:p></p><p class=MsoNormal>----<o:p></o:p></p><p class=MsoNormal><Transform><o:p></o:p></p><p class=MsoNormal>  <MetadataSet name='extras'  containerfield='metadata'><o:p></o:p></p><p class=MsoNormal>    <MetadataString name='component' value='rotor' containerfield='value'/><o:p></o:p></p><p class=MsoNormal>    <MetadataString name='warehouse' value='StarlingCity'<o:p></o:p></p><p class=MsoNormal>containerfield='value'/><o:p></o:p></p><p class=MsoNormal>----<o:p></o:p></p><p class=MsoNormal><WorldInfo><o:p></o:p></p><p class=MsoNormal>  <MetadataSet name='global' containerfield='metadata'><o:p></o:p></p><p class=MsoNormal>    <MetadataSet name='asset-extras' containerfield='value'><o:p></o:p></p><p class=MsoNormal>      <MetadataString name='created' value='2/3/2345' containerfield='value'/><o:p></o:p></p><p class=MsoNormal>      <MetadataString name='author' value='art artist' containerfield='value'/><o:p></o:p></p><p class=MsoNormal>      <MetadataString name='license' value='CC 4.0,<o:p></o:p></p><p class=MsoNormal>http://license.org/CC' containerfield='value'/><o:p></o:p></p><p class=MsoNormal>-----<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This description is probably longer than the lines of code it takes to<o:p></o:p></p><p class=MsoNormal>implement this kind of translation.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Any input or feedback much appreciated while this effort is underway.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-Andreas<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-- <o:p></o:p></p><p class=MsoNormal>Andreas Plesch<o:p></o:p></p><p class=MsoNormal>Waltham, MA 02453<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>_______________________________________________<o:p></o:p></p><p class=MsoNormal>x3d-public mailing list<o:p></o:p></p><p class=MsoNormal>x3d-public@web3d.org<o:p></o:p></p><p class=MsoNormal>http://web3d.org/mailman/listinfo/x3d-public_web3d.org<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>