<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;}
/* 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;}
.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>Re: containerField of value (oops)</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</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: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</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Here is how x3dom currently translates gltf metadata into x3d. Since</p><p class=MsoNormal>x3dom translates the non-binary gltf data into dom and makes it</p><p class=MsoNormal>(optionally) available as a dom node tree under the inline, translated</p><p class=MsoNormal>metadata can then be accessed as well, to show somewhere or do</p><p class=MsoNormal>whatever.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>gltf has the ability to provide unstructured or optionally structured</p><p class=MsoNormal>metadata for the global asset and for each resource. This is similar</p><p class=MsoNormal>to the Metadata nodes in x3d.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>glTF metadata can be provided in an 'extras' property which is</p><p class=MsoNormal>available to each kind of node. In addition, the toplevel asset node</p><p class=MsoNormal>contains metadata in defined properties.</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.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The copyright, generator, version, and minversion properties of the</p><p class=MsoNormal>toplevel asset node go into WorldInfo as a MFString info field: '</p><p class=MsoNormal>"copyright:(c)2020 sb" "version:2.0" ..' .The property name is joined</p><p class=MsoNormal>together with its value by a colon. [ There are alternatives, such as</p><p class=MsoNormal>property name followed by property value. ]</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>extras of the toplevel asset node go into the WorldInfo metadata field</p><p class=MsoNormal>packaged inside a MetadataSet holding node with name 'global':</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><WorldInfo info= ' "copyright:(c)2020 sb" "version:2.0" '</p><p class=MsoNormal>title='asset.extras.title value if given'></p><p class=MsoNormal>  <MetadataSet name='global' containerfield='metadata'></p><p class=MsoNormal>    <MetadataSet name='asset-extras' containerfield='value'></p><p class=MsoNormal>      extras (see below)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The asset extras metadata are named 'asset-extras'.</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</p><p class=MsoNormal>asset.extras.title string property it goes in the title field of</p><p class=MsoNormal>WorldInfo.</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</p><p class=MsoNormal>field and just have an additional entry into the global MetadataSet,</p><p class=MsoNormal>an 'asset-properties' entry ].</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.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><WorldInfo></p><p class=MsoNormal>  <MetadataSet name='global' containerfield='metadata'></p><p class=MsoNormal>    <MetadataSet name='asset-extras' containerfield='value'></p><p class=MsoNormal>      extras (see below)</p><p class=MsoNormal>    <MetadataSet name='scene-extras' containerfield='value'></p><p class=MsoNormal>      extras (see below)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The scene extras metadata are name 'scene-extras'.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The scene metadata are put into WorldInfo metadata because X3D Scene</p><p class=MsoNormal>itself cannot have a Metadata node (X3D Metadata nodes are not child</p><p class=MsoNormal>nodes) and because using the META statements in the X3D header would</p><p class=MsoNormal>then require managing the X3D header. Also, it seems logical to group</p><p class=MsoNormal>all scene-wide data together.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>All other extras properties in nodes go into metadata nodes as</p><p class=MsoNormal>required in the following way. The gltf extras json property can have</p><p class=MsoNormal>any json value, including arrays and objects. It is recommended to use</p><p class=MsoNormal>a json object as name:value map but any json value is allowed.</p><p class=MsoNormal>A json string becomes a MetadataString.</p><p class=MsoNormal>A json number becomes a MetadataFloat.</p><p class=MsoNormal>A json boolean becomes a MetadataBoolean.</p><p class=MsoNormal>A json array or object becomes a MetadataSet. An array is actually an</p><p class=MsoNormal>object with numerical, ordered keys: {'0':v0, '1':v1 ..}. It can be</p><p class=MsoNormal>treated as an object.</p><p class=MsoNormal>The name field for each metadata node is 'extras' by default or the</p><p class=MsoNormal>key name in case of values for MetadataSet.</p><p class=MsoNormal>Here are examples:</p><p class=MsoNormal><Transform></p><p class=MsoNormal>  <MetadataString name='extras' value='extras_value_string'</p><p class=MsoNormal>containerfield='metadata'/></p><p class=MsoNormal>----</p><p class=MsoNormal><Transform></p><p class=MsoNormal>  <MetadataSet name='extras'  containerfield='metadata'></p><p class=MsoNormal>    <MetadataString name='component' value='rotor' containerfield='value'/></p><p class=MsoNormal>    <MetadataString name='warehouse' value='StarlingCity'</p><p class=MsoNormal>containerfield='value'/></p><p class=MsoNormal>----</p><p class=MsoNormal><WorldInfo></p><p class=MsoNormal>  <MetadataSet name='global' containerfield='metadata'></p><p class=MsoNormal>    <MetadataSet name='asset-extras' containerfield='value'></p><p class=MsoNormal>      <MetadataString name='created' value='2/3/2345' containerfield='value'/></p><p class=MsoNormal>      <MetadataString name='author' value='art artist' containerfield='value'/></p><p class=MsoNormal>      <MetadataString name='license' value='CC 4.0,</p><p class=MsoNormal>http://license.org/CC' containerfield='value'/></p><p class=MsoNormal>-----</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</p><p class=MsoNormal>implement this kind of translation.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Any input or feedback much appreciated while this effort is underway.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-Andreas</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-- </p><p class=MsoNormal>Andreas Plesch</p><p class=MsoNormal>Waltham, MA 02453</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>_______________________________________________</p><p class=MsoNormal>x3d-public mailing list</p><p class=MsoNormal>x3d-public@web3d.org</p><p class=MsoNormal>http://web3d.org/mailman/listinfo/x3d-public_web3d.org</p><p class=MsoNormal><o:p> </o:p></p></div></body></html>