The following excerpt from QuadTreeExamples.xml (autotranslated to VRML as QuadTreeExamplesTranslated.wrl) explains
<fieldValue>
tag
(originally named <defaultValue>
), and
First: field-name information for the new extension
is provided either via a <ProtoDeclaration>
tag (example 3)
or via a native DTD declaration (example 4):
<!-- Example solution approach #3 --> <ProtoDeclare name="QuadTree-TagChildren"> <field type="Nodes" name="upperLeftNode" IS="GroupE.children"/> <field type="Nodes" name="upperRightNode" IS="GroupF.children"/> <field type="Nodes" name="lowerLeftNode" IS="GroupG.children"/> <field type="Nodes" name="lowerRightNode" IS="GroupH.children"/> <field type="Nodes" name="children"/> <!-- PROTO body follows. --> <Group> <Group DEF="GroupE" /> <Group DEF="GroupF" /> <Group DEF="GroupG" /> <Group DEF="GroupH" /> </Group> </ProtoDeclare> <!-- example solution definition #4 --> <!ELEMENT QuadTree-TagChildren ( <!-- list of all nodes goes here --> )* > <!ATTLIST QuadTree-TagChildren upperLeftNode IDREF #IMPLIED upperRightNode IDREF #IMPLIED lowerLeftNode IDREF #IMPLIED lowerRightNode IDREF #IMPLIED nodeTypeHint NMTOKEN #FIXED "Group" DEF ID #IMPLIED USE IDREF #IMPLIED>
Next: the X3D scene instantiates the extension,
either via a <ProtoInstance>
tag (example 3)
or via a native XML tag (example 4):
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- Examples 3 and 4 use actual nodes for subtree references, via PROTOs or XML tags. --> <Transform DEF="Example_3" translation="0 -2 0"> <ProtoInstance name="QuadTree-TagChildren"> <fieldValue fieldName="upperLeftNode"><Transform USE="UPPER_LEFT"//fieldValue> <fieldValue fieldName="upperRightNode"><Transform USE="UPPER_RIGHT"/></fieldValue> <fieldValue fieldName="lowerLeftNode"><Transform USE="LOWER_LEFT"/></fieldValue> <fieldValue fieldName="lowerRightNode"> <Transform translation="-6 0 4"> <Shape> <Text string=' "QuadTree-TagChildren" "ProtoInstance" '/> <Appearance USE="WHITE"/> </Shape> </Transform> </fieldValue> </ProtoInstance> </Transform> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <Transform DEF="Example_4" translation="0 -6 0"> <QuadTree-TagChildren> <fieldValue fieldName="upperLeftNode"><Transform USE="UPPER_LEFT"/></fieldValue> <fieldValue fieldName="upperRightNode"><Transform USE="UPPER_RIGHT"/></fieldValue> <fieldValue fieldName="lowerLeftNode"><Transform USE="LOWER_LEFT"/></fieldValue> <fieldValue fieldName="lowerRightNode"> <Transform translation="-6 0 4"> <Shape> <Text string=' "QuadTree-TagChildren" "Native tags" '/> <Appearance USE="WHITE"/> </Shape> </Transform> <WorldInfo info="this WorldInfo is here to demonstrate that the example is type MFNode/Nodes" /> </fieldValue> </QuadTree-TagChildren> </Transform> </Group> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
Finally: excerpts from the autotranslated VRML shows preservation of customized field names in the PROTO:
PROTO QuadTree-TagChildren [ exposedField MFNode upperLeftNode [ ] # IS GroupE.children exposedField MFNode upperRightNode [ ] # IS GroupF.children exposedField MFNode lowerLeftNode [ ] # IS GroupG.children exposedField MFNode lowerRightNode [ ] # IS GroupH.children exposedField MFNode children [ ] ] { Group { children [ DEF GroupE Group { children IS upperLeftNode } DEF GroupF Group { children IS upperRightNode } DEF GroupG Group { children IS lowerLeftNode } DEF GroupH Group { children IS lowerRightNode } ] } } # ... omitted examples 1 and 2 ... DEF Example_3 Transform { children [ QuadTree-TagChildren { children [ ] upperLeftNode USE UPPER_LEFT upperRightNode USE UPPER_RIGHT lowerLeftNode USE LOWER_LEFT lowerRightNode Transform { children [ Shape { geometry Text { string [ "QuadTree-TagChildren" "ProtoInstance" ] } appearance USE WHITE } ] translation -6 0 4 } } ] translation 0 -2 0 } DEF Example_4 Transform { children [ QuadTree-TagChildren { children [ ] upperLeftNode USE UPPER_LEFT upperRightNode USE UPPER_RIGHT lowerLeftNode USE LOWER_LEFT lowerRightNode [ Transform { children [ Shape { geometry Text { string [ "QuadTree-TagChildren" "Native tags" ] } appearance USE WHITE } ] translation -6 0 4 } WorldInfo { info [ "this WorldInfo is here to demonstrate that the example is MFNode/Nodes" ] } ] } ] translation 0 -6 0 } ] }
Conclusion:
the <fieldValue>
tag
(originally named <defaultValue>
)
enables the parser to disambiguate contained field data from
contained content, just as field-name wrapper tags do.
A further advantage of this approach is that strong typing of nodes is retained throughout the scene.
Revised: 22 April 2000
Uniform Resource Locator (URL): www.web3D.org/TaskGroups/x3d/translation/example/QuadTreeExamplesExplanation.html
Author: Don Brutzman