Extensible 3D (X3D) encodings
Part 1: Extensible Markup Language (XML) encoding

Annex A

(informative)

Document Type Definition (DTD)

--- X3D separator bar ---

cube A.1 Table of contents and introduction

A.1.1 Table of contents

This annex provides a detailed description of the grammar for each syntactic element in this part of ISO/IEC 19776. Table A.1 contains a table of contents that lists the topics in this clause:

Table A.1 — Table of contents

A.1 Table of contents and introduction
  A.1.1 Table of contents
  A.1.2 Introduction
A.2 Version 3.0 dtds
  A.2.1 x3d-3.0.dtd
  A.2.2 x3d-3.0-InputOutputFields.dtd
  A.2.3 x3d-3.0-Web3dExtensionsPublic.dtd
  A.2.4 x3d-3.0-Web3dExtensionsPrivate.dtd
A.3 Version 3.1 dtds
  A.3.1 x3d-3.1.dtd  
  A.3.2 x3d-3.1-InputOutputFields.dtd
  A.3.3 x3d-3.1-Web3dExtensionsPublic.dtd
  A.3.4 x3d-3.1-Web3dExtensionsPrivate.dtd
A.4 Version 3.2 dtds
  A.4.1 x3d-3.2.dtd
  A.4.2 x3d-3.2-InputOutputFields.dtd
  A.4.3 x3d-3.2-Web3dExtensionsPublic.dtd
  A.4.4 x3d-3.2-Web3dExtensionsPrivate.dtd
A.5 Version 3.3 dtds
  A.5.1 x3d-3.3.dtd
  A.5.2 x3d-3.3-InputOutputFields.dtd
  A.5.3 x3d-3.3-Web3dExtensionsPublic.dtd
  A.5.4 x3d-3.3-Web3dExtensionsPrivate.dtd

A.1.2 Introduction

An XML Document Type Definition (DTD) defines syntax of an XML tagset [XML].

The X3D DTD has sufficient expressive power to:

The X3D DTD does not have sufficient expressive power to:

A.2 Version 3.0 dtds

A.2.1 x3d-3.0.dtd

x3d-3.0.dtd is the X3D DTD that validates X3D version 3.0 content:

<!--
# Extensible 3D (X3D) Specification Document Type Definition (DTD) x3d-3.0.dtd
#
#	http://www.web3d.org/specifications/x3d-3.0.dtd
#
#	current version:  3.0.2
#
#	created:         30 April 2005
#	revised:          4 May 2008
#
#	Author:           Don Brutzman
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.0.dtd
#	http://www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPrivate.dtd
#
# X3D Revision DTDs:
#	http://www.web3d.org/x3d/content/x3d-3.0.dtd
#	http://www.web3d.org/x3d/content/x3d-3.0-InputOutputFields.dtd
#	http://www.web3d.org/x3d/content/x3d-3.0-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/x3d/content/x3d-3.0-Web3dExtensionsPrivate.dtd
#
# Final doctype:
#  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
#
# Transitional doctype:
#  <!DOCTYPE X3D PUBLIC "http://www.web3d.org/specifications/x3d-3.0.dtd" "file:///www.web3d.org/specifications/x3d-3.0.dtd">
#
# Typical system location for this resource:
#	file://c:/www.web3d.org/specifications/x3d-3.0.dtd
#	  file:///www.web3d.org/specifications/x3d-3.0.dtd
#
# Change log:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
# Further information on the Extensible 3D (X3D) specification is available at
#	http://www.web3D.org/x3d.html
-->

<!--	Profile:  default is Full profile and all components.
	Authors can override these default IGNORE/INCLUDE values.
	If InterchangeProfile or InteractiveProfile is INCLUDEd, then IGNORE all others. -->
<!ENTITY % ImmersiveProfile		"INCLUDE">
<!ENTITY % InterchangeProfile		"IGNORE">
<!ENTITY % InteractiveProfile		"IGNORE">
<!ENTITY % DISComponent 		"INCLUDE">
<!ENTITY % GeoSpatialComponent	"INCLUDE">
<!ENTITY % HAnimComponent 		"INCLUDE">
<!ENTITY % NurbsComponent 		"INCLUDE">
<!ENTITY % Web3dExtensionComponent	"INCLUDE">
<!ENTITY % X3dInputOutputFields		"INCLUDE">
<!ENTITY % X3dExtensions		"IGNORE">

<!ENTITY % profileNames "(Core|Interchange|Interactive|Immersive|Full|MPEG4Interactive)">

<!ENTITY % componentNames "(Core|DIS|EnvironmentalEffects|EnvironmentalSensor|EventUtilities|Geometry2D|Geometry3D|Geospatial|Grouping|H-Anim|Interpolation|KeyDeviceSensor|Lighting|Navigation|Networking|NURBS|PointingDeviceSensor|Rendering|Scripting|Shape|Sound|Text|Texturing|Time)">

<!ENTITY % componentLevels "(1|2|3|4)">

<!ENTITY % X3dFieldTypes "SFBool|MFBool|SFColor|MFColor|SFColorRGBA|MFColorRGBA|SFDouble|MFDouble|SFFloat|MFFloat|SFImage|MFImage|SFInt32|MFInt32|SFNode|MFNode|SFRotation|MFRotation|SFString|MFString|SFTime|MFTime|SFVec2f|MFVec2f|SFVec2d|MFVec2d|SFVec3f|MFVec3f|SFVec3d|MFVec3d ">

<!-- X3D type definitions as DTD types -->
<!ENTITY % SFBool	"(true|false)">
<!ENTITY % MFBool	"CDATA">
<!ENTITY % SFColor	"CDATA">
<!ENTITY % MFColor	"CDATA">
<!ENTITY % SFColorRGBA	"CDATA">
<!ENTITY % MFColorRGBA	"CDATA">
<!ENTITY % SFFloat	"CDATA">
<!ENTITY % MFFloat	"CDATA">
<!ENTITY % SFDouble	"CDATA">
<!ENTITY % MFDouble	"CDATA">
<!ENTITY % SFImage	"CDATA">
<!ENTITY % MFImage	"CDATA">
<!ENTITY % SFInt32	"CDATA">
<!ENTITY % MFInt32	"CDATA">
<!ENTITY % SFRotation	"CDATA">
<!ENTITY % MFRotation	"CDATA">
<!ENTITY % SFString	"CDATA">
<!ENTITY % MFString	"CDATA">
<!ENTITY % SFTime	"CDATA">
<!ENTITY % MFTime	"CDATA">
<!ENTITY % SFVec2f	"CDATA">
<!ENTITY % MFVec2f	"CDATA">
<!ENTITY % SFVec2d	"CDATA">
<!ENTITY % MFVec2d	"CDATA">
<!ENTITY % SFVec3f	"CDATA">
<!ENTITY % MFVec3f	"CDATA">
<!ENTITY % SFVec3d	"CDATA">
<!ENTITY % MFVec3d	"CDATA">

<!ENTITY % TextureCoordinateGeneratorModes	"(SPHERE|CAMERASPACENORMAL|CAMERASPACEPOSITION|CAMERASPACEREFLECTIONVECTOR|SPHERE-LOCAL|COORD|COORD-EYE|NOISE|NOISE-EYE|SPHERE-REFLECT|SPHERE-REFLECT-LOCAL)">

<!--	User needs to append | after listing each new node in any of these extensions.
	For an example, see examples/development/ProtoTagDtdDeclarationExamples.x3d   -->
<!ENTITY % AppearanceNodeExtensions "">
<!ENTITY % AudioClipNodeExtensions "">
<!ENTITY % BindableNodeExtensions "">
<!ENTITY % ColorNodeExtensions "">
<!ENTITY % CoordinateNodeExtensions "">
<!ENTITY % FontStyleNodeExtensions "">
<!ENTITY % EventUtilityNodeExtensions "">
<!ENTITY % GeometryNodeExtensions "">
<!ENTITY % GroupingNodeExtensions "">
<!ENTITY % InterpolatorNodeExtensions "">
<!ENTITY % LightNodeExtensions "">
<!ENTITY % MaterialNodeExtensions "">
<!ENTITY % MetadataNodeExtensions "">
<!ENTITY % NormalNodeExtensions "">
<!ENTITY % ScriptNodeExtensions "">
<!ENTITY % SensorNodeExtensions "">
<!ENTITY % ShapeNodeExtensions "">
<!ENTITY % SoundNodeExtensions "">
<!-- MovieTexture must be able to appear twice: -->
<!ENTITY % MovieTextureNodeExtensions "">
<!ENTITY % TextureNodeExtensions "">
<!ENTITY % TextureCoordinateNodeExtensions "">
<!ENTITY % TextureTransformNodeExtensions "">
<!ENTITY % NetworkSensorNodeExtensions "">
<!ENTITY % WorldInfoNodeExtensions "">
<!-- Users defining PROTOs do not override any of the following parameter entity declarations. -->
<![%ImmersiveProfile;[
<!ENTITY % WildcardNodes       	" (ProtoInstance) " >
]]>
<![%InterchangeProfile;[
<!ENTITY % WildcardNodes       	" " >
]]>
<![%DISComponent;[
<!ENTITY % DISGroupingNodes	" EspduTransform|SignalPdu|ReceiverPdu|TransmitterPdu|" >
]]>
<![%GeoSpatialComponent;[
<!ENTITY % GeoCoordinateNode		" GeoCoordinate|" >
<!ENTITY % GeoElevationGridNode		" GeoElevationGrid|" >
<!ENTITY % GeoGroupingNodes		" GeoLocation|GeoLOD|" >
<!ENTITY % GeoMetadataNode		" GeoMetadata|" >
<!ENTITY % GeoOriginNode		" GeoOrigin|" >
<!ENTITY % GeoBehaviorNodes		" GeoPositionInterpolator|GeoTouchSensor|" >
<!ENTITY % GeoViewpointNode		" GeoViewpoint|" >
]]>
<![%HAnimComponent;[
<!ENTITY % HAnimGroupingNodes		" HAnimJoint|HAnimSegment|HAnimSite|HAnimHumanoid|" >
<!ENTITY % DisplacerNode		" HAnimDisplacer|" >
]]>
<![%NurbsComponent;[
<!ENTITY % NurbsGeometryNodes	  " NurbsCurve|NurbsCurve2D|NurbsPatchSurface|NurbsSweptSurface|NurbsSwungSurface|NurbsTrimmedSurface|" >
<!ENTITY % NurbsInterpolators	  " NurbsPositionInterpolator|NurbsOrientationInterpolator|NurbsSurfaceInterpolator|" >
<!ENTITY % NurbsControlCurveNodes " NurbsCurve2D|Contour2D|ContourPolyline2D " >
]]>
<![%Web3dExtensionComponent;[
<!ENTITY % Web3dExtensionGeometryNodes	" XvlShell|" >
]]>
<!-- otherwise set tag lists to null strings if not previously defined -->
<!ENTITY % DISGroupingNodes "">
<!ENTITY % GeoCoordinateNode "">
<!ENTITY % GeoElevationGridNode "">
<!ENTITY % GeoGroupingNodes "">
<!ENTITY % GeoMetadataNode "">
<!ENTITY % GeoOriginNode "">
<!ENTITY % GeoBehaviorNodes "">
<!ENTITY % GeoViewpointNode "">
<!ENTITY % HAnimGroupingNodes "">
<!ENTITY % DisplacerNode "">
<!ENTITY % NurbsGeometryNodes "">
<!ENTITY % NurbsInterpolators "">
<!ENTITY % Web3dExtensionGroupingNodes "">
<!ENTITY % Web3dExtensionGeometryNodes "">
<!-- no further content-model extensions needed -->
<![%InterchangeProfile;[
<!ENTITY % AudioClipNodes "" >
<!ENTITY % FontStyleNodes "" >
<!ENTITY % EventUtilityNodes "" >
<!ENTITY % MovieTextureNodes "" >
<!ENTITY % NormalNodes "" >
<!ENTITY % ScriptNodes "" >
<!ENTITY % SoundNodes "" >
<!ENTITY % TextureCoordinateNodes "" >
<!ENTITY % TextureTransformNodes "" >
]]>
<!-- NetworkSensorNodes used by LoadSensor -->
<!ENTITY % NetworkSensorNodes " %NetworkSensorNodeExtensions; Anchor|AudioClip|GeoMetadata|ImageTexture|Inline|MovieTexture|ProtoInstance|Script ">

<![%ImmersiveProfile;[

<!ENTITY % AudioClipNodes		" %AudioClipNodeExtensions; AudioClip " >

<!ENTITY % FontStyleNodes		" %FontStyleNodeExtensions; FontStyle " >

<!ENTITY % EventUtilityNodes		" %EventUtilityNodeExtensions; BooleanFilter|BooleanSequencer|BooleanToggle|BooleanTrigger|IntegerSequencer|IntegerTrigger|TimeTrigger " >

<!ENTITY % MovieTextureNodes		" %MovieTextureNodeExtensions; MovieTexture " >

<!ENTITY % NormalNodes			" %NormalNodeExtensions; Normal " >

<!ENTITY % ScriptNodes			" %ScriptNodeExtensions; Script " >

<!ENTITY % SoundNodes			" %SoundNodeExtensions; Sound " >

<!ENTITY % TextureCoordinateNodes	" %TextureCoordinateNodeExtensions; TextureCoordinate|TextureCoordinateGenerator|MultiTextureCoordinate|NurbsTextureCoordinate " >

<!ENTITY % TextureTransformNodes	" %TextureTransformNodeExtensions; TextureTransform|MultiTextureTransform " >
]]>

<![%InterchangeProfile;[
<!ENTITY % AppearanceNodes  	" Appearance " >

<!ENTITY % BehaviorLeafNodes	" CoordinateInterpolator|KeySensor|OrientationInterpolator|PositionInterpolator|ScalarInterpolator|TimeSensor|TouchSensor " >

<!ENTITY % BindableNodes    	" Background|NavigationInfo|Viewpoint " >

<!ENTITY % ColorNodes       	" Color|ColorRGBA " >

<!ENTITY % CoordinateNodes  	" Coordinate|CoordinateDouble " >

<!ENTITY % GeometryNodes    	" IndexedFaceSet|IndexedLineSet|LineSet|PointSet " >

<!ENTITY % GroupingNodes    	" Anchor|Group|Inline|Transform " >

<!ENTITY % LightNodes       	" DirectionalLight " >

<!ENTITY % MaterialNodes    	" Material " >

<!ENTITY % ShapeNodes       	" Shape " >

<!ENTITY % Texture2DNodes     	" ImageTexture " >

<!ENTITY % WorldInfoNodes   	" WorldInfo " >
]]>
<![%ImmersiveProfile;[

<!ENTITY % AppearanceNodes  	" %AppearanceNodeExtensions; Appearance " >

<!ENTITY % BehaviorLeafNodes	" %InterpolatorNodeExtensions; %SensorNodeExtensions; %ScriptNodeExtensions; %GeoBehaviorNodes; %DisplacerNode; %NurbsInterpolators; %EventUtilityNodes;|ColorInterpolator|CoordinateInterpolator|CoordinateInterpolator2D|CylinderSensor|KeySensor|LoadSensor|NormalInterpolator|OrientationInterpolator|PlaneSensor|PositionInterpolator|PositionInterpolator2D|ProximitySensor|ScalarInterpolator|Script|SphereSensor|StringSensor|TimeSensor|TouchSensor|VisibilitySensor " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % BindableNodes    	" %BindableNodeExtensions; %GeoViewpointNode; Background|Fog|NavigationInfo|TextureBackground|Viewpoint " >

<!ENTITY % ColorNodes       	" %ColorNodeExtensions; Color|ColorRGBA " >

<!ENTITY % CoordinateNodes  	" %CoordinateNodeExtensions; %GeoCoordinateNode; Coordinate|CoordinateDouble " >

<!ENTITY % Geometry2DNodes    	" Arc2D|ArcClose2D|Circle2D|Disk2D|Polyline2D|Polypoint2D|Rectangle2D|TriangleSet2D " >

<!ENTITY % GeometryNodes    	" %GeometryNodeExtensions; %GeoElevationGridNode; %NurbsGeometryNodes; %Web3dExtensionGeometryNodes; %Geometry2DNodes;|Box|Cone|Cylinder|ElevationGrid|Extrusion|IndexedFaceSet|IndexedLineSet|LineSet|PointSet|Sphere|Text|IndexedTriangleFanSet|IndexedTriangleSet|IndexedTriangleStripSet|TriangleFanSet|TriangleSet|TriangleStripSet " >

<!ENTITY % GroupingNodes    	" %GroupingNodeExtensions; %DISGroupingNodes; %GeoGroupingNodes; %HAnimGroupingNodes; %Web3dExtensionGroupingNodes; Anchor|Billboard|Collision|Group|Inline|LOD|StaticGroup|Switch|Transform " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % LightNodes       	" %LightNodeExtensions; DirectionalLight|SpotLight|PointLight " >

<!ENTITY % MaterialNodes    	" %MaterialNodeExtensions; Material " >

<!ENTITY % ShapeNodes       	" %ShapeNodeExtensions; Shape " >

<!ENTITY % Texture2DNodes     	" %TextureNodeExtensions; ImageTexture|MovieTexture|MultiTexture|PixelTexture " >

<!ENTITY % MultiTextureChildTextures " %TextureNodeExtensions; ImageTexture|MovieTexture|PixelTexture " >

<!ENTITY % WorldInfoNodes   	  " %WorldInfoNodeExtensions; %GeoMetadataNode; WorldInfo " >
]]>
<![%InterchangeProfile;[
<!ENTITY % GeometricPropertyNodes " %ColorNodes; " >

<!ENTITY % AppearanceChildNodes	" %MaterialNodes; " >

<!ENTITY % SceneLeafNodes   	" %LightNodes;|%ShapeNodes;|%WorldInfoNodes; " >

<!ENTITY % MetadataNodes 	" %MetadataNodeExtensions; MetadataDouble|MetadataFloat|MetadataInteger|MetadataSet|MetadataString ">

<!ENTITY % ProtoNodes       	"" >
]]>
<![%ImmersiveProfile;[
<!ENTITY % GeometricPropertyNodes " %CoordinateNodes;|%ColorNodes;|%NormalNodes;|%TextureCoordinateNodes; " >

<!ENTITY % AppearanceChildNodes	" %MaterialNodes;|%Texture2DNodes;|%TextureTransformNodes; " >

<!ENTITY % SceneLeafNodes   	" %GeoOriginNode; %LightNodes;|%ShapeNodes;|%SoundNodes;|%WorldInfoNodes; " >

<!ENTITY % OtherLeafNodes   	" AudioClip|LineProperties|FillProperties " >

<!ENTITY % MetadataNodes 	" %MetadataNodeExtensions; MetadataDouble|MetadataFloat|MetadataInteger|MetadataSet|MetadataString ">

<!ENTITY % ProtoNodes       	" %OtherLeafNodes;|%AppearanceNodes;|%AppearanceChildNodes;|%BehaviorLeafNodes;|%BindableNodes;|%FontStyleNodes;|%GeometricPropertyNodes;|%GeometryNodes;|%GroupingNodes;|%MetadataNodes;|%SceneLeafNodes;|ProtoDeclare|ExternProtoDeclare|ProtoInstance " >
]]>

<!ENTITY % ChildrenNodes    	" %BehaviorLeafNodes;|%BindableNodes;|%GroupingNodes;|%SceneLeafNodes;|ROUTE|EXPORT|IMPORT " >

<![%InterchangeProfile;[
<!ENTITY % SceneNodes       	" %ChildrenNodes;|%WildcardNodes; " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % SceneNodes       	" ExternProtoDeclare|ProtoDeclare|%ChildrenNodes;|%WildcardNodes; " >
]]>
<!-- SensorNodes not used (yet, anyway) in tagset content-model definitions. -->
<!ENTITY % SensorNodes " Anchor|Collision|CylinderSensor|KeySensor|PlaneSensor|ProximitySensor|SphereSensor|StringSensor|TimeSensor|TouchSensor|VisibilitySensor ">
<!ENTITY % DragSensors " CylinderSensor|PlaneSensor|SphereSensor ">
<!ENTITY % EnvironmentalSensorNodes " Collision|ProximitySensor|TimeSensor|VisibilitySensor ">
<!ENTITY % PointingDeviceSensors " Anchor|CylinderSensor|PlaneSensor|SphereSensor|TouchSensor ">
<!ENTITY % KeyDeviceSensors " ">
<!ENTITY % InterpolatorNodes " ColorInterpolator|CoordinateInterpolator|CoordinateInterpolator2D|NormalInterpolator|OrientationInterpolator|PositionInterpolator|PositionInterpolator2D|ScalarInterpolator ">
<!ENTITY % TimeDependentNodes " AudioClip|MovieTexture|TimeSensor ">

<!-- ***** X3D DTD ***** -->
<![%ImmersiveProfile;[
<!ELEMENT Anchor (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST Anchor
	description %SFString; #IMPLIED
	parameter   %MFString; #IMPLIED
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED >
]]>
<![%InterchangeProfile;[
<!ELEMENT Anchor (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* >
<!ATTLIST Anchor
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED >
]]>
<![%ImmersiveProfile;[
<!-- Complete, unordered, concisely enumerated version of Appearance by Heiko Grussbach.  Prepended either-order FillProperties/LineProperties. -->
<!ELEMENT Appearance (IS?, (%MetadataNodes;)?,
(  (FillProperties, LineProperties?)|(LineProperties, FillProperties)? )?,
(  ((%MaterialNodes;), (
			((%Texture2DNodes;),((%TextureTransformNodes;)|%WildcardNodes;)?) |
			((%TextureTransformNodes;),((%Texture2DNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%Texture2DNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) )? )
|((%Texture2DNodes;), (
			((%MaterialNodes;),((%TextureTransformNodes;)|%WildcardNodes;)?) |
			((%TextureTransformNodes;),((%MaterialNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%MaterialNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) )? )
|((%TextureTransformNodes;), (
			((%MaterialNodes;),((%Texture2DNodes;)|%WildcardNodes;)?) |
			((%Texture2DNodes;),((%MaterialNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%MaterialNodes;)|(%Texture2DNodes;)|%WildcardNodes;)?) )? )
|(%WildcardNodes;, (
			((%MaterialNodes;),((%Texture2DNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) |
			((%Texture2DNodes;),((%MaterialNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) |
			((%TextureTransformNodes;),((%MaterialNodes;)|(%Texture2DNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%MaterialNodes;)|(%Texture2DNodes;)|(%TextureTransformNodes;)|%WildcardNodes;)?) )? )
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT Appearance ( (%MetadataNodes;)?,
(  ((%MaterialNodes;), (%Texture2DNodes;)?  )
|((%Texture2DNodes;),  (%MaterialNodes;)? )
)? ) >
]]>
<!ATTLIST Appearance
	containerField NMTOKEN "appearance"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT AudioClip ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST AudioClip
	description %SFString; #IMPLIED
	loop        %SFBool;   "false"
	pitch       %SFFloat;  "1.0"
	startTime   %SFTime;   "0"
	stopTime    %SFTime;   "0"
	pauseTime   %SFTime;   "0"
	resumeTime  %SFTime;   "0"
	url         %MFString; #IMPLIED
	containerField NMTOKEN "source"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED>
]]>
<!ELEMENT Background ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Background
	groundAngle %MFFloat; #IMPLIED
	groundColor %MFColor; #IMPLIED
	backUrl %MFString; #IMPLIED
	bottomUrl %MFString; #IMPLIED
	frontUrl %MFString; #IMPLIED
	leftUrl %MFString; #IMPLIED
	rightUrl %MFString; #IMPLIED
	topUrl %MFString; #IMPLIED
	skyAngle %MFFloat; #IMPLIED
	skyColor %MFColor; "0 0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT Billboard (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST Billboard
	axisOfRotation %SFVec3f; "0 1 0"
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class	 CDATA     #IMPLIED
	DEF            ID        #IMPLIED
	USE            IDREF     #IMPLIED>

<!ELEMENT BooleanFilter ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanFilter
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFBool; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanToggle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanToggle
	toggle      %SFBool;  "false"
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanTrigger
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!-- Geometry2D nodes -->

<!ELEMENT Arc2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Arc2D
	radius     %SFFloat; "1"
	startAngle %SFFloat; "0"
	endAngle   %SFFloat; "1.570796"
	containerField NMTOKEN "geometry"
	class      CDATA    #IMPLIED
	DEF  ID    #IMPLIED
	USE  IDREF #IMPLIED>

<!ELEMENT ArcClose2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ArcClose2D
	radius      %SFFloat; "1"
	startAngle  %SFFloat; "0"
	endAngle    %SFFloat; "1.570796"
	closureType (PIE|CHORD) "PIE"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class       CDATA    #IMPLIED
	DEF  ID     #IMPLIED
	USE  IDREF  #IMPLIED>

<!ELEMENT Circle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Circle2D
	radius     %SFFloat; "1"
	containerField NMTOKEN "geometry"
	class      CDATA    #IMPLIED
	DEF  ID    #IMPLIED
	USE  IDREF #IMPLIED>

<!ELEMENT Disk2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Disk2D
	innerRadius %SFFloat; "0"
	outerRadius %SFFloat; "1"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class       CDATA    #IMPLIED
	DEF  ID     #IMPLIED
	USE  IDREF  #IMPLIED>

<!ELEMENT Polyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polyline2D
	lineSegments %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT Polypoint2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polypoint2D
	point       %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT Rectangle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Rectangle2D
	size         %SFVec2f; "2 2"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT TriangleSet2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TriangleSet2D
	vertices     %MFVec2f; #IMPLIED
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT Box ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Box
	size  %SFVec3f; "2 2 2"
	solid %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF  ID        #IMPLIED
	USE  IDREF     #IMPLIED>

<!ELEMENT Collision ( (IS?), (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* )  >
<!ATTLIST Collision
	enabled     %SFBool;  "true"
	bboxCenter  %SFVec3f; "0 0 0"
	bboxSize    %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED >
]]>
<!ELEMENT Color ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Color
	color %MFColor; #IMPLIED
	class CDATA #IMPLIED
	containerField NMTOKEN "color"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ColorRGBA ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ColorRGBA
	color %MFColorRGBA; #IMPLIED
	containerField NMTOKEN "color"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT component EMPTY>
<!ATTLIST component
	name  %componentNames; #REQUIRED
	level %componentLevels; #REQUIRED>
<![%ImmersiveProfile;[
<!ELEMENT ColorInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ColorInterpolator
	key         %MFFloat; #IMPLIED
	keyValue    %MFColor; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT Cone ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cone
	bottomRadius %SFFloat; "1"
	height       %SFFloat; "2"
	side         %SFBool;  "true"
	bottom       %SFBool;  "true"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Coordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Coordinate
	point %MFVec3f; #IMPLIED
	containerField NMTOKEN "coord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CoordinateDouble ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateDouble
	point %MFVec3d; #IMPLIED
	containerField NMTOKEN "coord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CoordinateInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT CoordinateInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CoordinateInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT Cylinder ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cylinder
	bottom   %SFBool; "true"
	height   %SFFloat; "2"
	radius   %SFFloat; "1"
	side     %SFBool;  "true"
	top      %SFBool;  "true"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT CylinderSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CylinderSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	diskAngle  %SFFloat;    "0.26179167"
	maxAngle   %SFFloat;    "-1"
	minAngle   %SFFloat;    "0"
	offset     %SFFloat;    "0"
	enabled    %SFBool;     "true"
	containerField NMTOKEN "children"
	class	CDATA     #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>

<!ELEMENT DirectionalLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST DirectionalLight
	ambientIntensity %SFFloat; "0"
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[
<!ELEMENT DirectionalLight (%MetadataNodes;)? >
<!ATTLIST DirectionalLight
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!-- Complete, concisely enumerated unordered version of ElevationGrid by Heiko Grussbach -->
<!ELEMENT ElevationGrid (IS?, (%MetadataNodes;)?, (
   ((%ColorNodes;), (		((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
|((%NormalNodes;), (		((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
|((%TextureCoordinateNodes;), (((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
|(%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
)? ) >

<!ATTLIST ElevationGrid
	height          %MFFloat; #IMPLIED
	ccw             %SFBool;  "true"
	colorPerVertex  %SFBool;  "true"
	creaseAngle     %SFFloat; "0"
	normalPerVertex %SFBool;  "true"
	solid           %SFBool;  "true"
	xDimension      %SFInt32; "0"
	xSpacing        %SFFloat; "1.0"
	zDimension      %SFInt32; "0"
	zSpacing        %SFFloat; "1.0"
	containerField NMTOKEN "geometry"
	class	  CDATA     #IMPLIED
	DEF             ID        #IMPLIED
	USE             IDREF     #IMPLIED>

<!ELEMENT ExternProtoDeclare ( field* ) >
<!ATTLIST ExternProtoDeclare
	name		NMTOKEN		#REQUIRED
	url		%MFString;	#REQUIRED
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT Extrusion ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Extrusion
	beginCap     %SFBool;     "true"
	ccw          %SFBool;     "true"
	convex       %SFBool;     "true"
	creaseAngle  %SFFloat;    "0.0"
	crossSection %MFVec2f;    "1 1 1 -1 -1 -1 -1 1 1 1"
	endCap       %SFBool;     "true"
	orientation  %MFRotation; "0 0 1 0"
	scale        %MFVec2f;    "1 1"
	solid        %SFBool;     "true"
	spine        %MFVec3f;    "0 0 0 0 1 0"
	containerField NMTOKEN "geometry"
	class        CDATA        #IMPLIED
	DEF          ID           #IMPLIED
	USE          IDREF        #IMPLIED>

<!-- field is only used in a Script, ProtoDeclare or ExternProtoDeclare.
     Initialization values for simple types go in the value attribute.
     Contained content tags are only for initialization of SFNode or MFNode values. -->

<!ELEMENT field  ( %ProtoNodes; )* >
<!ATTLIST field
	name       	NMTOKEN  	#REQUIRED
	accessType (inputOnly|outputOnly|initializeOnly|inputOutput) #REQUIRED
	type 	   ( %X3dFieldTypes; ) #REQUIRED
	value      	CDATA   	#IMPLIED
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!-- fieldValue resets default field values inside a ProtoInstance.
     Initialization values for simple types go in the value attribute.  Otherwise
     contained-content tags are used for initialization of SFNode or MFNode values. -->

<!ELEMENT fieldValue ( %ProtoNodes; )* >
<!ATTLIST fieldValue
	name	NMTOKEN	#REQUIRED
	value	CDATA	#IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT FillProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FillProperties
	filled   %SFBool;   "true"
	hatched  %SFBool;   "true"
	hatchStyle  %SFInt32;      "1"
	hatchColor  %SFColor;      "1 1 1"
	containerField NMTOKEN "fillProperties"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT Fog ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Fog
	color           %SFColor;            "1 1 1"
	fogType         (LINEAR|EXPONENTIAL) "LINEAR"
	visibilityRange %SFFloat;            "0"
	containerField NMTOKEN "children"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT FontStyle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FontStyle
	family      %MFString; '"SERIF"'
	horizontal  %SFBool;   "true"
	justify     %MFString; '"BEGIN"'
	language    %SFString; #IMPLIED
	leftToRight %SFBool;   "true"
	size        %SFFloat;  "1.0"
	spacing     %SFFloat;  "1.0"
	style       (PLAIN|BOLD|ITALIC|BOLDITALIC) "PLAIN"
	topToBottom %SFBool;   "true"
	containerField NMTOKEN "fontStyle"
	class       CDATA       #IMPLIED
	DEF         ID          #IMPLIED
	USE         IDREF       #IMPLIED>
<!-- Minimum supported values:
	family  ' "SERIF" "SANS" "TYPEWRITER" '
	justify ' "FIRST" "BEGIN" "MIDDLE" "END" ' -->
]]>
<!ELEMENT Group (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|%WildcardNodes;)*) >
<!ATTLIST Group
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ImageTexture ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ImageTexture
	url %MFString; #IMPLIED
	repeatS %SFBool; "true"
	repeatT %SFBool; "true"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!-- Complete, unordered, concisely enumerated version of IndexedFaceSet content model by Heiko Grussbach -->
<!ENTITY % ColorCoordinateNormalTextureCoordinateContentModel "(IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	((%CoordinateNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	   			(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%CoordinateNodes;), (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%NormalNodes;),  (
 	((%ColorNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
|(%WildcardNodes;,  (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)?  )">
<![%ImmersiveProfile;[
<!ELEMENT IndexedFaceSet ( %ColorCoordinateNormalTextureCoordinateContentModel; ) >

<!ELEMENT IndexedLineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >

<!ELEMENT LineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT IndexedFaceSet ( (%MetadataNodes;)?, ((%ColorNodes;), Coordinate?)|(Coordinate, (%ColorNodes;)?) )? >

<!ELEMENT IndexedLineSet ( (%MetadataNodes;)?, ( Color, Coordinate? )|( Coordinate, Color?) )? >

<!ELEMENT LineSet ( (%MetadataNodes;)?, ( Color, Coordinate? )|( Coordinate, Color?) )? >
]]>
<!ATTLIST IndexedFaceSet
	ccw %SFBool; "true"
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	convex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	creaseAngle %SFFloat; "0"
	normalIndex %MFInt32; #IMPLIED
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	texCoordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ATTLIST IndexedLineSet
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ATTLIST LineSet
	vertexCount %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT Inline ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Inline
	load %SFBool; "true"
	url %MFString; #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT EXPORT EMPTY>
<!ATTLIST EXPORT
	localDEF IDREF #REQUIRED
	AS NMTOKEN #IMPLIED>
<!ELEMENT IMPORT EMPTY>
<!ATTLIST IMPORT
	InlineDEF IDREF #REQUIRED
	importedDEF NMTOKEN #REQUIRED
	AS ID #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT IntegerSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFInt32; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IntegerTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerTrigger
	integerKey   %SFInt32; "-1"
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IS (connect)+ >

<!ELEMENT connect EMPTY >
<!ATTLIST connect
	nodeField   NMTOKEN #REQUIRED
	protoField  NMTOKEN #REQUIRED>
]]>
<!ELEMENT KeySensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST KeySensor
	enabled %SFBool; "true"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT LineProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST LineProperties
	applied %SFBool; "true"
	linetype %SFInt32; "1"
	linewidthScaleFactor %SFFloat; "0"
	containerField NMTOKEN "lineProperties"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>
]]>
<!ELEMENT LoadSensor (IS?, (%MetadataNodes;)?, (%NetworkSensorNodes;|%WildcardNodes;)*)>
<!ATTLIST LoadSensor
	enabled %SFBool; "true"
	timeOut %SFTime; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT LOD (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST LOD
	center %SFVec3f; "0 0 0"
	range  %MFFloat; #IMPLIED
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT Material ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Material
	ambientIntensity %SFFloat; "0.2"
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	shininess        %SFFloat; "0.2"
	specularColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class       CDATA          #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[
<!ELEMENT Material ( (%MetadataNodes;)? ) >
<!ATTLIST Material
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class       	 CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<!-- *** XHTML exerpts to define meta tag *** -->
<!-- i18n, language, meta tag definitions from XHTML 1.0
     http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd -->
<!ENTITY % LanguageCode "NMTOKEN">
<!-- a language code, as per [IETF RFC3066/BCP47] ftp://ftp.isi.edu/in-notes/bcp/bcp47.txt -->
<!-- internationalization attributes
  lang        language code (backwards compatible)
  xml:lang    language code (as per XML 1.0 spec)
  dir         direction for weak/neutral text
-->
<!ENTITY % i18n "lang        %LanguageCode; #IMPLIED
  xml:lang    %LanguageCode; #IMPLIED
  dir         (ltr|rtl)      #IMPLIED">
<!ELEMENT head (component*, meta*)>
<!-- generic metadata information, matches HTML usage, made attribute 'name' required -->
<!ELEMENT meta EMPTY>
<!ATTLIST meta
	http-equiv CDATA #IMPLIED
	name CDATA #REQUIRED
	content CDATA #REQUIRED
	scheme CDATA #IMPLIED
	%i18n; >
<!-- formal X3D Metadata nodes -->
<!ELEMENT MetadataDouble (IS?, (%MetadataNodes;|%WildcardNodes;)?)>
<!ATTLIST MetadataDouble
	name %SFString; #IMPLIED
	value %MFDouble; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT MetadataFloat (IS?, (%MetadataNodes;|%WildcardNodes;)?)>
<!ATTLIST MetadataFloat
	name %SFString; #IMPLIED
	value %MFFloat; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT MetadataInteger (IS?, (%MetadataNodes;|%WildcardNodes;)?)>
<!ATTLIST MetadataInteger
	name %SFString; #IMPLIED
	value %MFInt32; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT MetadataString (IS?, (%MetadataNodes;|%WildcardNodes;)?)>
<!ATTLIST MetadataString
	name %SFString; #IMPLIED
	value %MFString; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!-- containerField discriminates whether child Metadata node(s) are 'metadata' or 'value' fields.
	NMTOKEN vice enumeration, since containerField might have another value as field in a ProtoInstance. -->
<!ELEMENT MetadataSet (IS?, (%MetadataNodes;|%WildcardNodes;)*)>
<!ATTLIST MetadataSet
	reference %SFString; #IMPLIED
	name %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!-- FAQ:  MovieTexture
	containerField='source'  when used as a Sound source,
	containerField='texture' when used as a Appearance texture source-->
<!ELEMENT MovieTexture ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST MovieTexture
	loop      %SFBool;   "false"
	speed     %SFFloat;  "1.0"
	startTime %SFTime;   "0"
	stopTime  %SFTime;   "0"
	url       %MFString; #IMPLIED
	repeatS   %SFBool;   "true"
	repeatT   %SFBool;   "true"
	pauseTime %SFTime;   "0"
	resumeTime %SFTime;  "0"
	containerField NMTOKEN "texture"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTexture ( (IS?), (%MetadataNodes;)?, (%MultiTextureChildTextures;|%WildcardNodes; )* ) >
<!ATTLIST MultiTexture
	mode           %MFString;	#IMPLIED
	source         %MFString;	#IMPLIED
	function       %MFString;	#IMPLIED
	color          %SFColor;  "1 1 1"
	alpha          %SFFloat;  "1.0"
	containerField NMTOKEN "texture"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTextureCoordinate ((IS?), (%MetadataNodes;)?, (TextureCoordinate|TextureCoordinateGenerator|ProtoInstance)* ) >
<!ATTLIST MultiTextureCoordinate
	containerField NMTOKEN "texCoord"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>
]]>
<!ELEMENT NavigationInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST NavigationInfo
	avatarSize %MFFloat; "0.25 1.6 0.75"
	headlight %SFBool; "true"
	speed %SFFloat; "1"
	type %MFString; ""EXAMINE" "ANY""
	transitionType %MFString; ""ANIMATE""
	visibilityLimit %SFFloat; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT Normal ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Normal
	vector    %MFVec3f; #IMPLIED
	containerField NMTOKEN "normal"
	class	  CDATA     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>

<!ELEMENT NormalInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NormalInterpolator
	key      %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<!ELEMENT OrientationInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST OrientationInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFRotation; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT PixelTexture ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PixelTexture
	image   %SFImage; "0 0 0"
	repeatS %SFBool;  "true"
	repeatT %SFBool;  "true"
	containerField NMTOKEN "texture"
	class   CDATA     #IMPLIED
	DEF     ID        #IMPLIED
	USE     IDREF     #IMPLIED>

<!ELEMENT PlaneSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PlaneSensor
	description %SFString; #IMPLIED
	autoOffset  %SFBool;  "true"
	enabled     %SFBool;  "true"
	maxPosition %SFVec2f; "-1 -1"
	minPosition %SFVec2f; "0 0"
	offset      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT PointLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PointLight
	ambientIntensity %SFFloat;	"0"
	attenuation      %SFVec3f;	"1 0 0"
	color            %SFColor;	"1 1 1"
	intensity        %SFFloat;	"1"
	location         %SFVec3f;	"0 0 0"
	on               %SFBool;	"true"
	radius	 	 %SFFloat;	"100"
	containerField NMTOKEN "children"
	class	   CDATA    	#IMPLIED
	DEF	  	 ID		#IMPLIED
	USE		 IDREF		#IMPLIED>

<!ELEMENT PointSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT PointSet ( (%MetadataNodes;)?, ( ( Color, Coordinate? )|( Coordinate, Color? ) )? ) >
]]>
<!ATTLIST PointSet
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT PositionInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST PositionInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT PositionInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PositionInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT ProtoInterface ( field* ) >

<!-- choice of required first node contained in ProtoBody constrained by valid ( %ProtoNodes; ) rather than %SceneNodes; ) >  -->

<!ELEMENT ProtoBody      ( ( %ProtoNodes; ), ( %SceneNodes; )* ) >

<!ELEMENT ProtoDeclare (ProtoInterface? , ProtoBody) > <!-- (|( field*, ( %ProtoNodes; ), ( %SceneNodes; )* )) -->
<!ATTLIST ProtoDeclare
	name 		NMTOKEN   	#REQUIRED
	appinfo		%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT ProtoInstance ( fieldValue* , (IS?) ) >
<!-- ( %SceneNodes; )* --><!-- direct children disallowed, let fieldValue name="children" handle them -->
<!ATTLIST ProtoInstance
	name     NMTOKEN           #REQUIRED
	containerField NMTOKEN "children"
	class	CDATA        #IMPLIED
	DEF      ID                #IMPLIED
	USE      IDREF             #IMPLIED>

<!ELEMENT ProximitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ProximitySensor
	center      %SFVec3f;    "0 0 0"
	size        %SFVec3f;    "0 0 0"
	enabled     %SFBool;     "true"
	containerField NMTOKEN "children"
	class       CDATA        #IMPLIED
	DEF         ID           #IMPLIED
	USE         IDREF        #IMPLIED>
]]>
<!ELEMENT ROUTE EMPTY>
<!ATTLIST ROUTE
	fromNode IDREF #REQUIRED
	fromField NMTOKEN #REQUIRED
	toNode IDREF #REQUIRED
	toField NMTOKEN #REQUIRED>
<!ELEMENT ScalarInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ScalarInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFFloat; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT Scene ((%MetadataNodes;)?, (%SceneNodes;)*)>
<!-- Script is similar to PROTO regarding user definition of multiple fields -->
<![%ImmersiveProfile;[
<!-- script code should be included as CDATA sections.  watch out on content-model order, originally ( #PCDATA|field )* -->

<!ELEMENT Script ( #PCDATA|%MetadataNodes;|field|IS )* >
<!ATTLIST Script
	url          %MFString; #IMPLIED
	directOutput %SFBool; "false"
	mustEvaluate %SFBool; "false"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
  	DEF ID       #IMPLIED
	USE IDREF    #IMPLIED>

<!ELEMENT Shape (IS?, (%MetadataNodes;)?, (
     ( (%AppearanceNodes;), (( %GeometryNodes; )|%WildcardNodes;)? ) |
     ( ( %GeometryNodes; ), ((%AppearanceNodes;)|%WildcardNodes;)? ) |
     ( %WildcardNodes;, (( %GeometryNodes; )|(%AppearanceNodes;)|%WildcardNodes;)? )
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT Shape ( (%MetadataNodes;)?,
	( (%AppearanceNodes;), ( %GeometryNodes; )? ) |
	( ( %GeometryNodes; ), (%AppearanceNodes;)? )
)? >
]]>
<!ATTLIST Shape
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT Sound (IS?, (%MetadataNodes;)?, ( %AudioClipNodes;|%MovieTextureNodes;|%WildcardNodes; )? ) >
<!ATTLIST Sound
	direction  %SFVec3f; "0 0 1"
	intensity  %SFFloat; "1"
	location   %SFVec3f; "0 0 0"
	maxBack    %SFFloat; "10"
	maxFront   %SFFloat; "10"
	minBack    %SFFloat; "1"
	minFront   %SFFloat; "1"
	priority   %SFFloat; "0"
	spatialize %SFBool;  "true"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT Sphere ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Sphere
	radius %SFFloat; "1"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT SphereSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SphereSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	enabled    %SFBool;     "true"
	offset     %SFRotation; "0 1 0 0"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT SpotLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SpotLight
	ambientIntensity %SFFloat; "0"
	attenuation      %SFVec3f; "1 0 0"
	beamWidth        %SFFloat; "1.570796"
	color            %SFColor; "1 1 1"
	cutOffAngle      %SFFloat; "0.785398"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	location         %SFVec3f; "0 0 0"
	on               %SFBool;  "true"
	radius           %SFFloat; "100"
	containerField NMTOKEN "children"
	class	   CDATA    #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>

<!ELEMENT StaticGroup (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST StaticGroup
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize   %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT StringSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST StringSensor
	enabled			%SFBool;	"true"
	deletionAllowed 	%SFBool;	"true"
	containerField NMTOKEN "children"
	class			CDATA    #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<!ELEMENT Switch (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|%WildcardNodes;)*)>
<!ATTLIST Switch
	whichChoice %SFInt32; "-1"
	containerField NMTOKEN "children"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT Text (IS?, (%MetadataNodes;)?, ( (%FontStyleNodes;)?|%WildcardNodes; ) ) >
<!ATTLIST Text
	string    %MFString; #IMPLIED
	length    %MFFloat;  #IMPLIED
	maxExtent %SFFloat;  "0.0"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!-- backTexture, bottomTexture, frontTexture, leftTexture, rightTexture, topTexture; could use rule for 0..6 children here -->
<!ELEMENT TextureBackground (IS?, (%MetadataNodes;)?, (%Texture2DNodes;)* )>
<!ATTLIST TextureBackground
	groundAngle  %MFFloat;  #IMPLIED
	groundColor  %MFColor;  #IMPLIED
	skyAngle     %MFFloat;  #IMPLIED
	skyColor     %MFColor;  "0 0 0"
	transparency %MFFloat;  "0"
	containerField NMTOKEN "children"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
]]>
<!ELEMENT TextureCoordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate
	point %MFVec2f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT TextureCoordinateGenerator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureCoordinateGenerator
	mode      %TextureCoordinateGeneratorModes;  "SPHERE"
	parameter %MFFloat;  #IMPLIED
	containerField NMTOKEN "texCoord"
	class       CDATA    #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT TextureTransform ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureTransform
	center      %SFVec2f; "0 0"
	rotation    %SFFloat; "0"
	scale       %SFVec2f; "1 1"
	translation %SFVec2f; "0 0"
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT MultiTextureTransform ((IS?), (TextureTransform|ProtoInstance)* ) >
<!ATTLIST MultiTextureTransform
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

]]>
<!ELEMENT TimeSensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TimeSensor
	cycleInterval %SFTime; "1.0"
	enabled %SFBool; "true"
	loop %SFBool; "false"
	startTime %SFTime; "0"
	stopTime %SFTime; "0"
	pauseTime %SFTime; "0"
	resumeTime %SFTime; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT TimeTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TimeTrigger
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT TouchSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TouchSensor
	description %SFString; #IMPLIED
	enabled      %SFBool;  "true"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Transform (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|%WildcardNodes;)*)>
<!ATTLIST Transform
	center %SFVec3f; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT IndexedTriangleFanSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST IndexedTriangleFanSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT IndexedTriangleSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST IndexedTriangleSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT IndexedTriangleStripSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST IndexedTriangleStripSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TriangleFanSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST TriangleFanSet
	fanCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TriangleSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST TriangleSet
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TriangleStripSet %ColorCoordinateNormalTextureCoordinateContentModel;>
<!ATTLIST TriangleStripSet
	stripCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT Viewpoint ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Viewpoint
	fieldOfView %SFFloat; "0.785398"
	jump %SFBool; "true"
	orientation %SFRotation; "0 0 1 0"
	position %SFVec3f; "0 0 10"
	description %SFString; #IMPLIED
	centerOfRotation %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!-- centerOfRotation point relates to NavigationInfo EXAMINE mode. -->
<![%ImmersiveProfile;[
<!ELEMENT VisibilitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST VisibilitySensor
	center    %SFVec3f; "0 0 0"
	enabled   %SFBool;  "true"
	size      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class     CDATA     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>
]]>
<!ELEMENT WorldInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST WorldInfo
	info %MFString; #IMPLIED
	title %SFString; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT X3D (head?, Scene)>
<!ATTLIST X3D
	xmlns:xsd CDATA "http://www.w3.org/2001/XMLSchema-instance"
	xsd:noNamespaceSchemaLocation CDATA "http://www.web3d.org/specifications/x3d-3.0.xsd"
	profile %profileNames; #REQUIRED
	version (3.0) #REQUIRED>
<!-- EspduTransform includes DIS CollisionPdu DetonatePdu FirePdu -->
<![%DISComponent;[
<!ELEMENT EspduTransform (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST EspduTransform
	enabled     %SFBool;  "true"
	marking 	 %SFString;	#IMPLIED
	siteID  	 %SFInt32;	"0"
	applicationID	 %SFInt32;	"1"
	entityID	 %SFInt32;	"0"
	forceID		 %SFInt32;	"0"
	entityKind	 %SFInt32;	"0"
	entityDomain	 %SFInt32;	"0"
	entityCountry	 %SFInt32;	"0"
	entityCategory	 %SFInt32;	"0"
	entitySubCategory %SFInt32;	"0"
	entitySpecific	 %SFInt32;	"0"
	entityExtra	 %SFInt32;	"0"
	readInterval	 %SFTime;	"0.1"
	writeInterval	 %SFTime;	"1.0"
	networkMode	 (standAlone|networkReader|networkWriter)	"standAlone"
	translation	 %SFVec3f;	"0 0 0"
	rotation	 %SFRotation;	"0 0 1 0"
	scale   	 %SFVec3f;	"1 1 1"
	scaleOrientation %SFRotation;	"0 0 1 0"
	bboxCenter	 %SFVec3f;	"0 0 0"
	bboxSize	 %SFVec3f;	"-1 -1 -1"
	center  	 %SFVec3f;	"0 0 0"
	address 	 	%SFString;	"localhost"
	port    	 	%SFInt32;	"0"
	multicastRelayHost 	%SFString;	#IMPLIED
	multicastRelayPort 	%SFInt32;	"0"
	rtpHeaderExpected  	%SFBool;	"false"
	deadReckoning  		%SFInt32;	"0"
	linearVelocity		%SFVec3f;	"0 0 0"
	linearAcceleration	%SFVec3f;	"0 0 0"
	fired1   		%SFBool;	"false"
	fired2   		%SFBool;	"false"
	collisionType	%SFInt32;	"0"
	detonationLocation	%SFVec3f;	"0 0 0"
	detonationRelativeLocation	%SFVec3f;	"0 0 0"
	detonationResult	%SFInt32;	"0"
	eventApplicationID	%SFInt32;	"1"
	eventEntityID	%SFInt32;	"0"
	eventNumber	%SFInt32;	"0"
	eventSiteID	%SFInt32;	"0"
	munitionStartPoint 	%SFVec3f;	"0 0 0"
	munitionEndPoint   	%SFVec3f;	"0 0 0"
	warhead			%SFInt32;	"0"
	fuse			%SFInt32;	"0"
	munitionQuantity	%SFInt32;	"0"
	firingRate		%SFInt32;	"0"
	firingRange		%SFFloat;	"0"
	munitionSiteID  	%SFInt32;	"0"
	munitionApplicationID	%SFInt32;	"1"
	munitionEntityID	%SFInt32;	"0"
	fireMissionIndex	%SFInt32;	"0"
	articulationParameterCount 		  %SFInt32;	"0"
	articulationParameterDesignatorArray 	  %MFInt32;	#IMPLIED
	articulationParameterChangeIndicatorArray %MFInt32;	#IMPLIED
	articulationParameterIdPartAttachedToArray  %MFInt32;	#IMPLIED
	articulationParameterTypeArray 		  %MFInt32;	#IMPLIED
	articulationParameterArray 		  %MFFloat;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED >

<!ELEMENT ReceiverPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ReceiverPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	receivedPower		%SFFloat;	"0.0"
	receiverState		%SFInt32;	"0"
	transmitterSiteID	%SFInt32;	"0"
	transmitterApplicationID %SFInt32;	"0"
	transmitterEntityID	%SFInt32;	"0"
	transmitterRadioID	%SFInt32;	"0"

	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

<!ELEMENT SignalPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SignalPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter		 %SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	encodingScheme		%SFInt32;	"0"
	tdlType			%SFInt32;	"0"
	sampleRate		%SFInt32;	"0"
	samples			%SFInt32;	"0"
	dataLength		%SFInt32;	"0"
	data			%MFInt32;	#IMPLIED

	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

<!ELEMENT TransmitterPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TransmitterPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	antennaLocation		%SFVec3f;	"0 0 0"
	antennaPatternLength	%SFInt32;	"0"
	antennaPatternType	%SFInt32;	"0"
	cryptoKeyID		%SFInt32;	"0"
	cryptoSystem		%SFInt32;	"0"
	frequency		%SFInt32;	"0"
	inputSource		%SFInt32;	"0"

	lengthOfModulationParameters	%SFInt32;	"0"
	modulationTypeDetail		%SFInt32;	"0"
	modulationTypeMajor		%SFInt32;	"0"
	modulationTypeSpreadSpectrum	%SFInt32;	"0"
	modulationTypeSystem		%SFInt32;	"0"
	power				%SFFloat;	"0.0"
	radioEntityTypeCategory		%SFInt32;	"0"
	radioEntityTypeCountry		%SFInt32;	"0"
	radioEntityTypeDomain		%SFInt32;	"0"
	radioEntityTypeKind		%SFInt32;	"0"
	radioEntityTypeNomenclature	%SFInt32;	"0"
	radioEntityTypeNomenclatureVersion %SFInt32;	"0"
	relativeAntennaLocation		%SFVec3f;	"0 0 0"
	transmitFrequencyBandwidth	%SFFloat;	"0.0"
	transmitState			%SFInt32;	"0"

	containerField NMTOKEN "children"
	class				CDATA		""
	DEF   				ID		#IMPLIED
	USE             		IDREF		#IMPLIED >
]]>
<![%GeoSpatialComponent;[
<!ELEMENT GeoCoordinate ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >  <!-- X3DCoordinateNodeType -->
<!ATTLIST GeoCoordinate
	geoSystem	%MFString; '"GD" "WE"'
	point		%MFVec3d;	#IMPLIED
	containerField NMTOKEN "coord"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- need to restrict GeoOrigin to first element, or relax schema restriction -->
<!ELEMENT GeoElevationGrid (IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	(GeoOrigin, (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
	   			(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|(GeoOrigin, (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%NormalNodes;),  (
 	((%ColorNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
|(%WildcardNodes;,  (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)? ) >

<!ATTLIST GeoElevationGrid
	geoSystem	%MFString; '"GD" "WE"'
	geoGridOrigin	%SFVec3d;	"0 0 0"
	xDimension	%SFInt32;	"0"
	xSpacing	%SFDouble;	"1.0"
	yScale		%SFFloat;	"1.0"
	zDimension	%SFInt32;	"0"
	zSpacing	%SFDouble;	"1.0"
	height		%MFDouble; 	"0 0"
	normalPerVertex	%SFBool;	"true"
	ccw		%SFBool;	"true"
	colorPerVertex	%SFBool;	"true"
	creaseAngle	%SFFloat;	"0"
	solid		%SFBool;	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLocation (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes;|%WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes;|%WildcardNodes; )* )? ) >
<!ATTLIST GeoLocation
	geoSystem	%MFString; '"GD" "WE"'
	geoCoords	%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLOD (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes;|%WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes;|%WildcardNodes; )* )? ) >
<!ATTLIST GeoLOD
	geoSystem	%MFString; '"GD" "WE"'
	rootUrl	 	%MFString;	#IMPLIED
	child1Url	%MFString;	#IMPLIED
	child2Url	%MFString;	#IMPLIED
	child3Url	%MFString;	#IMPLIED
	child4Url 	%MFString;	#IMPLIED
	range		%SFFloat;	"10"
	center		%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoMetadata ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST GeoMetadata
	url		%MFString;	#IMPLIED
	data		IDREFS		#IMPLIED
	summary		%MFString;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!--
	title			%SFString;	#IMPLIED
	description		%SFString;	#IMPLIED
	coordinateSystem 	%SFString;	#IMPLIED
	horizontalDatum		%SFString;	#IMPLIED
	verticalDatum		%SFString;	#IMPLIED
	ellipsoid		%SFString;	#IMPLIED
	extent			%SFString;	#IMPLIED
	resolution		%SFString;	#IMPLIED
	originator		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	date			%SFString;	#IMPLIED
	metadataFormat		%SFString;	#IMPLIED
	dataUrl			%SFString;	#IMPLIED
	dataFormat		%SFString;	#IMPLIED
-->

<!ELEMENT GeoOrigin ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST GeoOrigin
	geoSystem	%MFString; '"GD" "WE"'
	geoCoords	%SFVec3d;	"0 0 0"
	rotateYUp	%SFBool;	"false"
	containerField NMTOKEN "geoOrigin"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoPositionInterpolator ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoPositionInterpolator
	geoSystem	%MFString; '"GD" "WE"'
	key		%MFFloat;	#IMPLIED
	keyValue	%MFVec3d;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoTouchSensor ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoTouchSensor
	geoSystem	%MFString; '"GD" "WE"'
	enabled		%SFBool;	"true"
	description	%SFString;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoViewpoint ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoViewpoint
	geoSystem	%MFString; '"GD" "WE"'
	description	%SFString;	#IMPLIED
	position	%SFVec3d;	"0 0 100000"
	orientation	%SFRotation;	"0 0 1 0"
	fieldOfView	%SFFloat;	"0.785398"
	jump		%SFBool;	"true"
	navType		%MFString;	'"EXAMINE" "ANY"'
	headlight	%SFBool;	"true"
	speedFactor	%SFFloat;	"1.0"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>
]]>
<!-- Note that setting JointNames as enumerations does not permit validation of other names. -->
<![%HAnimComponent;[
<!ENTITY % JointNames "(
c1|c2|c3|c4|c5|c6|c7|jaw|HumanoidRoot|l_acromioclavicular|l_ankle|l_calf|
l_clavicle|l_elbow|l_eyeball|l_eyeball_joint|l_eyebrow|l_eyebrow_joint|
l_eyelid|l_eyelid_joint|l_forearm|l_forefoot|l_hand|l_hindfoot|l_hip|
l_index_distal|l_index_metacarpal|l_index_middle|l_index_proximal|
l_index0|l_index1|l_index2|l_index3|l_knee|l_metatarsal|l_middistal|
l_middle_distal|l_middle_metacarpal|l_middle_middle|l_middle_proximal|
l_middle0|l_middle1|l_middle2|l_middle3|l_midproximal|l_midtarsal|
l_pinky_distal|l_pinky_metacarpal|l_pinky_middle|l_pinky_proximal|
l_pinky0|l_pinky1|l_pinky2|l_pinky3|l_ring_distal|l_ring_metacarpal|
l_ring_middle|l_ring_proximal|l_ring0|l_ring1|l_ring2|l_ring3|l_scapula|
l_shoulder|l_sternoclavicular|l_subtalar|l_thigh|l_thumb_distal|
l_thumb_metacarpal|l_thumb_proximal|l_thumb1|l_thumb2|l_thumb3|
l_upperarm|l_wrist|l1|l2|l3|l4|l5|pelvis|r_acromioclavicular|r_ankle|
r_calf|r_clavicle|r_elbow|r_eyeball|r_eyeball_joint|r_eyebrow|
r_eyebrow_joint|r_eyelid|r_eyelid_joint|r_forearm|r_forefoot|r_hand|
r_hindfoot|r_hip|r_index_distal|r_index_metacarpal|r_index_middle|
r_index_proximal|r_index0|r_index1|r_index2|r_index3|r_knee|r_metatarsal|
r_middistal|r_middle_distal|r_middle_metacarpal|r_middle_middle|
r_middle_proximal|r_middle0|r_middle1|r_middle2|r_middle3|r_midproximal|
r_midtarsal|r_pinky_distal|r_pinky_metacarpal|r_pinky_middle|
r_pinky_proximal|r_pinky0|r_pinky1|r_pinky2|r_pinky3|r_ring_distal|
r_ring_metacarpal|r_ring_middle|r_ring_proximal|r_ring0|r_ring1|r_ring2|
r_ring3|r_scapula|r_shoulder|r_sternoclavicular|r_subtalar|r_thigh|
r_thumb_distal|r_thumb_metacarpal|r_thumb_proximal|r_thumb1|r_thumb2|
r_thumb3|r_upperarm|r_wrist|sacroiliac|sacrum|skull|skullbase|
t1|t2|t3|t4|t5|t6|t7|t8|t9|t10|t11|t12|temporomandibular|
vc1|vc2|vc3|vc4|vc5|vc6|vc7|vl1|vl2|vl3|vl4|vl5|
vt1|vt2|vt3|vt4|vt5|vt6|vt7|vt8|vt9|vt10|vt11|vt12)" >

<!ELEMENT HAnimDisplacer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST HAnimDisplacer
	name		%SFString;	#IMPLIED
	coordIndex	%MFInt32;	#IMPLIED
	displacements	%MFVec3f;	#IMPLIED
	weight		%SFFloat;	"0.0"
	containerField NMTOKEN "displacers"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT HAnimHumanoid (IS?, (%MetadataNodes;)?,
	(HAnimJoint*,	HAnimSegment*, HAnimSite*, (%CoordinateNodes;)?, (%NormalNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) ) >
<!-- skeleton/joints,	segments,      sites,      skinCoord,            skinNormal,       skin/viewpoints -->
<!-- note that joints, segments and sites should be USE nodes.  skin Shapes will USE preceding skinCoord, skinNormal definitions. -->
<!ATTLIST HAnimHumanoid
	name			%SFString;	#IMPLIED
	version			%SFString;	#IMPLIED
	info			%MFString;	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<!--	not treated as separate attributes, instead these are
	encoded as "attribute=value" SFString entries in the
	MFString info field.

	humanoidVersion		%SFString;	#IMPLIED
	authorName		%SFString;	#IMPLIED
	authorEmail		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	creationDate		%SFString;	#IMPLIED
	usageRestrictions	%SFString;	#IMPLIED
	age			%SFString;	#IMPLIED
	gender			%SFString;	#IMPLIED
	height			%SFString;	#IMPLIED
	weight			%SFString;	#IMPLIED
-->
<![%HAnimComponent;[
<!ELEMENT HAnimJoint (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|HAnimDisplacer|%WildcardNodes; )* ) >
<!ATTLIST HAnimJoint
	name			%JointNames;	#IMPLIED
	ulimit			%MFFloat;	#IMPLIED
	llimit			%MFFloat;	#IMPLIED
	limitOrientation	%SFRotation;	"0 0 1 0"
	skinCoordIndex		%MFInt32;	#IMPLIED
	skinCoordWeight		%MFFloat;	#IMPLIED
	stiffness		%MFFloat;	"0 0 0"
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!-- Multiple HAnimDisplacer nodes must appear consecutively inside HAnimSegment -->

<!ELEMENT HAnimSegment (IS?, (%MetadataNodes;)?, (
	((%ChildrenNodes;|%WildcardNodes;)*, ((Coordinate, HAnimDisplacer*)|(HAnimDisplacer+, Coordinate?))? ) |
	(Coordinate, (((%ChildrenNodes;)*, HAnimDisplacer*)|(HAnimDisplacer+, (%ChildrenNodes;|%WildcardNodes;)*))? ) |
	(HAnimDisplacer+, ((Coordinate, (%ChildrenNodes;|%WildcardNodes;)*)|((%ChildrenNodes;|%WildcardNodes;)*, Coordinate?))? )?
) ) >
<!ATTLIST HAnimSegment
	name			%JointNames;	#IMPLIED
	mass			%SFFloat;	"0"
	centerOfMass		%SFVec3f;	"0 0 0"
	momentsOfInertia	%MFFloat;	"0 0 0 0 0 0 0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT HAnimSite (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST HAnimSite
	name			%SFString;	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<![%NurbsComponent;[
<!ELEMENT Contour2D (IS?, (%MetadataNodes;)?, ( %NurbsControlCurveNodes;|%WildcardNodes; )* ) >
<!ATTLIST Contour2D
	containerField NMTOKEN "trimmingContour"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT ContourPolyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ContourPolyline2D
	point		%MFVec2f;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- child CoordinateNode has containerField controlPoint -->
<!ELEMENT NurbsCurve ( (IS?), (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )? ) >
<!ATTLIST NurbsCurve
	knot		%MFDouble;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFDouble;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN 		"geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsCurve2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NurbsCurve2D
	controlPoint	%MFVec2d;	#IMPLIED
	knot		%MFDouble;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFDouble;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsOrientationInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsOrientationInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsPositionInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsPositionInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsSurfaceInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsSurfaceInterpolator
	weight		%MFDouble;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT NurbsSet (IS?, (%MetadataNodes;)?, (NurbsPatchSurface|NurbsSweptSurface|NurbsSwungSurface|NurbsTrimmedSurface|%WildcardNodes; )* ) >
<!ATTLIST NurbsSet
	tessellationScale	%SFFloat;	"1.0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT NurbsPatchSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )?, ( %TextureCoordinateNodes;|NurbsTextureCoordinate)? ) >
<!ATTLIST NurbsPatchSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFDouble;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTrimmedSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )?, ( %TextureCoordinateNodes;|NurbsTextureCoordinate)?, Contour2D* ) >
<!ATTLIST NurbsTrimmedSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFDouble;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSweptSurface (IS?, (%MetadataNodes;)?, (NurbsCurve|%WildcardNodes; )?, ( %NurbsControlCurveNodes;|%WildcardNodes; )? ) >
<!ATTLIST NurbsSweptSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSwungSurface (IS?, (%MetadataNodes;)?, ( ( %NurbsControlCurveNodes;|%WildcardNodes; ), ( %NurbsControlCurveNodes;|%WildcardNodes; )? )? ) >
<!ATTLIST NurbsSwungSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTextureCoordinate ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsTextureCoordinate
	controlPoint	%MFVec2f;	#IMPLIED
	weight		%MFFloat;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "texCoord"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>
]]>

<!-- Finally, Web3dExtensionComponent from separate DTDs.  Note that Web3dExtensionComponent
     content-model extensions needed to be added at beginning,	prior to node-type definitions. -->
<![%Web3dExtensionComponent;[

<!ENTITY % Web3dExtensionsPublicDTD  SYSTEM "x3d-3.0-Web3dExtensionsPublic.dtd">
<!ENTITY % Web3dExtensionsPrivateDTD SYSTEM "x3d-3.0-Web3dExtensionsPrivate.dtd">

%Web3dExtensionsPublicDTD;
%Web3dExtensionsPrivateDTD;

]]>

A.2.2 x3d-3.0-InputOutputFields.dtd

x3d-3.0-InputOutputFields.dtd extends the X3D version 3.0 DTD by also including fields with accessType inputOnly and outputOnly. Although X3D scene files cannot validly set values for any of these attributes, the DTD defines names and relationships of all fields and can be used by DTD-aware processing tools.

<!--
#
# X3D InputOutputFields DTD:
#
#	http://www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
#
#	current version:  3.0.7
#
#	revised:          19 December 2005
#
#	Author:           Don Brutzman
#
# Purpose: the primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by field definitions in x3d-3.0-InputOutputFields.dtd
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.0.dtd
#	http://www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensions.dtd
#
# Typical system location for this resource is adjacent to x3d-3.0.dtd:
#	file://c:/www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
#	  file:///www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
#
# changelog:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
# Note on typing:
#	CDATA used for %SFBool; definitions to allow #FIXED "" initialization,
#	  since DTD rules otherwise require enumeration values to be 
#	  initialized to true|false.
#
-->

<!ATTLIST AudioClip
	elapsedTime   %SFTime;    #FIXED ""
	duration_changed %SFTime; #FIXED ""
	isPaused      CDATA       #FIXED ""
	isActive      CDATA       #FIXED "">
	
<!ATTLIST Background
	set_bind    CDATA      #FIXED ""
	bindTime    %SFTime;   #FIXED ""
	isBound     CDATA      #FIXED "">

<!ATTLIST BooleanFilter
	set_boolean CDATA #FIXED ""
	inputTrue   CDATA #FIXED ""
	inputFalse  CDATA #FIXED ""
	inputNegate CDATA #FIXED "">
	
<!-- value_changed is CDATA instead of %SFBool% in order to set empty value on an enumeration -->

<!ATTLIST BooleanSequencer
	set_fraction %SFFloat; #FIXED ""
	value_changed    CDATA  #FIXED ""
	previous CDATA   #FIXED ""
	next     CDATA   #FIXED "">

<!ATTLIST BooleanToggle
	set_boolean CDATA #FIXED "">
	
<!ATTLIST BooleanTrigger
	set_triggerTime %SFTime; #FIXED ""
	triggerTrue     CDATA    #FIXED "">

<!ATTLIST Collision
	collideTime %SFTime;   #FIXED ""
	isActive    CDATA      #FIXED "">

<!ATTLIST ColorInterpolator
	set_fraction    %SFFloat; #FIXED ""
	value_changed       %SFColor; #FIXED "">

<!ATTLIST CoordinateInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %MFVec3f; #FIXED "">

<!ATTLIST CoordinateInterpolator2D
	set_fraction %SFFloat; #FIXED ""
	value_changed    %MFVec2f; #FIXED "">

<!ATTLIST CylinderSensor
	isActive   CDATA     	#FIXED ""
	isOver     CDATA     	#FIXED ""
	rotation_changed   %SFRotation; #FIXED ""
	trackPoint_changed %SFVec3f;    #FIXED "">

<!ATTLIST ElevationGrid
	set_height      %MFFloat; #FIXED "">

<!ATTLIST Extrusion
	set_crossSection %MFVec2f;    #FIXED ""
	set_orientation  %MFRotation; #FIXED ""
	set_scale        %MFVec2f;    #FIXED ""
	set_spine        %MFVec3f;    #FIXED "">

<!ATTLIST Fog
	set_bind        CDATA      #FIXED ""
	bindTime        %SFTime;   #FIXED ""
	isBound         CDATA      #FIXED "">

<!ATTLIST IndexedFaceSet
	set_colorIndex      %MFInt32; #FIXED ""
	set_coordIndex      %MFInt32; #FIXED ""
	set_normalIndex     %MFInt32; #FIXED ""
	set_texCoordIndex   %MFInt32; #FIXED "">

<!ATTLIST IndexedLineSet
	set_colorIndex  %MFInt32; #FIXED ""
	set_coordIndex  %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleFanSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleStripSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST IntegerSequencer
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFInt32; #FIXED ""
	previous CDATA   #FIXED ""
	next     CDATA   #FIXED "">

<!ATTLIST IntegerTrigger
	set_boolean  CDATA #FIXED ""
	triggerValue %SFInt32;   #FIXED "">

<!ATTLIST KeySensor
	isActive		CDATA      	#FIXED ""
	keyPress		%SFString;	#FIXED ""
	keyRelease		%SFString;	#FIXED ""
	actionKeyPress		%SFInt32;	#FIXED ""
	actionKeyRelease	%SFInt32;	#FIXED ""
	altKey			CDATA  		#FIXED ""
	controlKey		CDATA  		#FIXED ""
	shiftKey		CDATA  		#FIXED "">

<!ATTLIST LoadSensor 
	isActive		CDATA       	#FIXED ""
	isLoaded		CDATA  		#FIXED ""
	loadTime		%SFTime;	#FIXED ""
	progress		%SFFloat;	#FIXED "">

<!ATTLIST MovieTexture
	elapsedTime       %SFTime;  #FIXED ""
	duration_changed  %SFTime;  #FIXED ""
	isPaused          CDATA     #FIXED ""
	isActive          CDATA     #FIXED "">

<!ATTLIST NavigationInfo
	set_bind        CDATA      #FIXED ""
	bindTime        %SFTime;   #FIXED ""
	isBound         CDATA      #FIXED "">

<!ATTLIST NormalInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %MFVec3f; #FIXED "">

<!ATTLIST OrientationInterpolator
	set_fraction %SFFloat;    #FIXED ""
	value_changed    %SFRotation; #FIXED "">

<!ATTLIST PlaneSensor
	isActive    CDATA  	#FIXED ""
	isOver      CDATA     	#FIXED ""
	trackPoint_changed  %SFVec3f; #FIXED ""
	translation_changed %SFVec3f; #FIXED "">

<!ATTLIST PositionInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFVec3f; #FIXED "">

<!ATTLIST PositionInterpolator2D
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFVec2f; #FIXED "">

<!ATTLIST ProximitySensor
	isActive    CDATA     	 #FIXED ""
	position_changed    %SFVec3f;    #FIXED ""
	orientation_changed %SFRotation; #FIXED ""
	centerOfRotation_changed  %SFVec3f;	#FIXED ""
	enterTime   %SFTime;     #FIXED ""
	exitTime    %SFTime;     #FIXED "">
	
<!ATTLIST ScalarInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFFloat; #FIXED "">

<!ATTLIST SphereSensor
	isActive   CDATA     	#FIXED ""
	isOver      CDATA     	#FIXED ""
	rotation_changed   %SFRotation; #FIXED ""
	trackPoint_changed %SFVec3f;    #FIXED "">

<!ATTLIST StringSensor
	isActive		CDATA     	#FIXED ""
	enteredText		%SFString;	#FIXED ""
	finalText		%SFString;	#FIXED "">

<!ATTLIST TextureBackground
	set_bind     CDATA      #FIXED ""
	bindTime     %SFTime;   #FIXED ""
	isBound      CDATA      #FIXED "">

<!ATTLIST TimeSensor
	elapsedTime   %SFTime;  #FIXED ""
	cycleTime     %SFTime;  #FIXED ""
	fraction_changed  %SFFloat; #FIXED ""
	isActive      CDATA    	#FIXED ""
	isPaused      CDATA    	#FIXED ""
	time          %SFTime;  #FIXED "">

<!ATTLIST TimeTrigger
	set_boolean  CDATA #FIXED ""
	triggerTime %SFTime;   #FIXED "">

<!ATTLIST TouchSensor
	hitNormal_changed    %SFVec3f; 	#FIXED ""
	hitPoint_changed     %SFVec3f; 	#FIXED ""
	hitTexCoord_changed  %SFVec2f; 	#FIXED ""
	isActive     CDATA     #FIXED ""
	isOver       CDATA     #FIXED ""
	touchTime    %SFTime;  #FIXED "">

<!ATTLIST Viewpoint
	set_bind    CDATA        #FIXED ""
	bindTime    %SFTime;     #FIXED ""
	isBound     CDATA        #FIXED "">

<!ATTLIST VisibilitySensor
	enterTime %SFTime;  #FIXED ""
	exitTime  %SFTime;  #FIXED ""
	isActive  CDATA     #FIXED "">

<!ATTLIST EspduTransform
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
	set_articulationParameterValue0		%SFFloat;	#FIXED ""
	set_articulationParameterValue1		%SFFloat;	#FIXED ""
	set_articulationParameterValue2		%SFFloat;	#FIXED ""
	set_articulationParameterValue3		%SFFloat;	#FIXED ""
	set_articulationParameterValue4		%SFFloat;	#FIXED ""
	set_articulationParameterValue5		%SFFloat;	#FIXED ""
	set_articulationParameterValue6		%SFFloat;	#FIXED ""
	set_articulationParameterValue7		%SFFloat;	#FIXED ""
	articulationParameterValue0_changed	%SFFloat;	#FIXED ""
	articulationParameterValue1_changed	%SFFloat;	#FIXED ""
	articulationParameterValue2_changed	%SFFloat;	#FIXED ""
	articulationParameterValue3_changed	%SFFloat;	#FIXED ""
	articulationParameterValue4_changed	%SFFloat;	#FIXED ""
	articulationParameterValue5_changed	%SFFloat;	#FIXED ""
	articulationParameterValue6_changed	%SFFloat;	#FIXED ""
	articulationParameterValue7_changed	%SFFloat;	#FIXED ""
	isCollided   				CDATA		#FIXED ""
	collideTime   				%SFTime;	#FIXED ""
	isDetonated   				CDATA		#FIXED ""
	detonateTime   				%SFTime;	#FIXED ""
	firedTime   				%SFTime;	#FIXED ""
>
<!ATTLIST ReceiverPdu 
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
>

<!ATTLIST SignalPdu
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
>

<!ATTLIST TransmitterPdu
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
>

<!ATTLIST GeoElevationGrid
	set_height	%MFDouble; 	#FIXED "">
	
<!ATTLIST GeoPositionInterpolator
	set_fraction	 %SFFloat;	#FIXED ""
	value_changed	 %SFVec3f;	#FIXED ""
	geovalue_changed %SFVec3d;	#FIXED "">

<!ATTLIST GeoTouchSensor
	isActive		CDATA		#FIXED ""
	isOver			CDATA		#FIXED ""
	touchTime		%SFTime;	#FIXED ""	
	hitGeoCoord_changed	%SFVec3d;	#FIXED ""
	hitNormal_changed	%SFVec3f;	#FIXED ""
	hitPoint_changed	%SFVec3f;	#FIXED ""
	hitTexCoord_changed 	%SFVec2f;	#FIXED "">
	
<!ATTLIST GeoViewpoint
	set_bind        CDATA        #FIXED ""
	set_orientation %SFRotation; #FIXED ""
	set_position    %SFVec3d;    #FIXED ""
	bindTime        %SFTime;     #FIXED ""
	isBound         CDATA        #FIXED "">

<!ATTLIST NurbsOrientationInterpolator
	set_fraction		%SFFloat;	#FIXED ""
	value_changed		%SFRotation;	#FIXED "">

<!ATTLIST NurbsPositionInterpolator
	set_fraction		%SFFloat;	#FIXED ""
	value_changed		%SFVec3f;	#FIXED "">

<!ATTLIST NurbsSurfaceInterpolator
	set_fraction		%SFVec2f;	#FIXED ""
	normal_changed		%SFVec3f;	#FIXED ""
	position_changed	%SFVec3f;	#FIXED "">

A.2.3 x3d-3.0-Web3dExtensionsPublic.dtd

The public X3D DTD extension will be used to contain approved extensions that have not yet been included in Part 1 of ISO/IEC 19775. The form of the public X3D DTD extension is depicted below:

<!--
#
# X3D Web3D Extensions Public DTD:
#
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPublic.dtd
#
#	current version:  3.0.2
#
#	created:          12 October 2003
#
#	revised:          16 September 2004
#
#	Maintainer:       Don Brutzman
#
# Purpose: support Web3D Consortium extensions to the X3D tagset.
# The primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by node definitions in x3d-3.0-Web3dExtensionsPublic.dtd
# and x3d-3.0-Web3dExtensionsPrivate.dtd
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.0.dtd
#	http://www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPrivate.dtd
#
# Web3D extensions update URL:
#	http://www.web3d.org/x3d/content/x3d-3.0-Web3dExtensionsPublic.dtd
#
# changelog:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
-->

<!-- ================================================================= -->

<!ENTITY % LatticeXvlComponent	"INCLUDE">

<!--
		LatticeXVL 1.0 Document Type Definition (DTD)

Description:	Define the XVL tag and attribute profile for X3D.
  
		This X3D native node corresponds to a VRML ExternProto
		declaration.

 		Elements in this tagset are enabled by setting the 
		XvlProfile entity to "INCLUDE" at the top of an 
		X3D scene file, as shown in several examples such as
		examples/LatticeXvl/XvlShellAll.x3d.  This flag then 
		triggers inclusion of the XVL tags in the 
		x3d-3.0.dtd tagset. 

 Status:	Complete

 Authors:	Lattice Technology, Inc. proposed the Xvl extensions,
		Makito Seki produced XML encoding of XVL nodes for X3D
		with additional work by Marc Jablonski and Don Brutzman

 Reference:	LatticeXvl extension for X3D
 		http://www.web3d.org/x3d/content/examples/LatticeXvl/doc/proposal/LatticeProposal.html
 		http://www.Xvl3D.com

 Issues:	Mark Jablonski maintains the list.

 Created:	10 May 2001
-->

<![%LatticeXvlComponent;[

<!-- for future: G1T1 level -->

<!ENTITY % XvlG1T1ShellTypes "" >

<!-- Types of XVL Shells -->

<!ENTITY % XvlShell.shellTypes " %XvlG1T1ShellTypes; POLYGON_MESH | LATTICE_MESH " >


<!ELEMENT   XvlShell (IS?, (%MetadataNodes;)?, (
	( (%TextureCoordinateNodes;), ((%CoordinateNodes;) | %WildcardNodes;)  ) |
	( (%CoordinateNodes;), ((%TextureCoordinateNodes;) | %WildcardNodes;)? ) |
	( %WildcardNodes;, ((%TextureCoordinateNodes;) | (%CoordinateNodes;) | %WildcardNodes;)?) )?
)>
<!ATTLIST   XvlShell
	shellType          ( %XvlShell.shellTypes; )  #IMPLIED
	numberOfDivisions  	%SFInt32;	#IMPLIED
	vertexRound        	%MFFloat;	#IMPLIED
	edgeBeginCoordIndex	%MFInt32;	#IMPLIED
	edgeEndCoordIndex  	%MFInt32;	#IMPLIED
	edgeRound          	%MFFloat;	#IMPLIED
	edgeBeginVector    	%MFVec3f;	#IMPLIED
	edgeEndVector      	%MFVec3f;	#IMPLIED
	faceCoordIndex     	%MFInt32;	#IMPLIED
	faceTexCoordIndex  	%MFInt32;	#IMPLIED
	faceEmpty          	%MFBool; 	#IMPLIED
	faceHidden         	%MFBool; 	#IMPLIED
	containerField 		NMTOKEN "geometry"
	class		 	CDATA		""
	DEF                	ID      	#IMPLIED
	USE                	IDREF   	#IMPLIED>

]]>

<!-- ================================================================= -->

A.2.4 x3d-3.0-Web3dExtensionsPrivate.dtd

The private X3D DTD extension will be used to contain X3D extensions that have not been approved but may exist for testing future development. The form of the private X3D DTD extension is depicted below:

<!--
#
# X3D Web3D Extensions Private DTD:
#
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPrivate.dtd
#
#	current version:  3.0.2
#
#	created:          12 October 2003
#
#	revised:          16 September 2004
#
#	Maintainer:       Don Brutzman
#
# Purpose: support Web3D Consortium extensions to the X3D tagset.
# The primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by node definitions in x3d-3.0-Web3dExtensionsPublic.dtd
# and x3d-3.0-Web3dExtensionsPrivate.dtd
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.0.dtd
#	http://www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPrivate.dtd
#
# Web3D extensions update URL:
#	http://www.web3d.org/x3d/content/x3d-3.0-Web3dExtensionsPublic.dtd
#
# changelog:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
-->

<!-- ================================================================= -->

	<!-- Enter ELEMENT and ATTLIST definitions here -->

<!-- ================================================================= -->

A.3 Version 3.1 dtds

A.3.1 x3d-3.1.dtd

x3d-3.1.dtd is the X3D DTD that validates X3D version 3.1 content:

<!--
# Extensible 3D (X3D) Specification Document Type Definition (DTD) x3d-3.1.dtd
#
#	http://www.web3d.org/specifications/x3d-3.1.dtd
#
#	current version:  3.1.2
#
#	created:          30 April 2005
#	revised:          9 October 2007
#
#	Author:           Don Brutzman
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.1.dtd
#	http://www.web3d.org/specifications/x3d-3.1-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.1-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.1-Web3dExtensionsPrivate.dtd
#
# X3D Revision DTDs:
#	http://www.web3d.org/x3d/content/x3d-3.1.dtd
#	http://www.web3d.org/x3d/content/x3d-3.1-InputOutputFields.dtd
#	http://www.web3d.org/x3d/content/x3d-3.1-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/x3d/content/x3d-3.1-Web3dExtensionsPrivate.dtd
#
# Final doctype:
#  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.1//EN" "http://www.web3d.org/specifications/x3d-3.1.dtd">
#
# Transitional doctype:
#  <!DOCTYPE X3D PUBLIC "http://www.web3d.org/specifications/x3d-3.1.dtd" "file:///www.web3d.org/specifications/x3d-3.1.dtd">
#
# Typical system location for this resource:
#	file://c:/www.web3d.org/specifications/x3d-3.1.dtd
#	  file:///www.web3d.org/specifications/x3d-3.1.dtd
#
# Change log:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
# Further information on the Extensible 3D (X3D) specification is available at
#	http://www.web3D.org/x3d.html
-->

<!--	Profile:  default is Full profile and all components.
	Authors can override these default IGNORE/INCLUDE values.
	If InterchangeProfile or InteractiveProfile is INCLUDEd, then IGNORE all others. -->
<!ENTITY % ImmersiveProfile		"INCLUDE">
<!ENTITY % InterchangeProfile		"IGNORE">
<!ENTITY % InteractiveProfile		"IGNORE">
<!ENTITY % CadComponent 		"INCLUDE">
<!ENTITY % CubeMapTexturingComponent 	"INCLUDE">
<!ENTITY % DISComponent 		"INCLUDE">
<!ENTITY % GeoSpatialComponent	"INCLUDE">
<!ENTITY % HAnimComponent 		"INCLUDE">
<!ENTITY % NurbsComponent 		"INCLUDE">
<!ENTITY % ShadersComponent 		"INCLUDE">
<!ENTITY % Texture3DComponent 	"INCLUDE">
<!ENTITY % Web3dExtensionComponent	"INCLUDE">
<!ENTITY % X3dInputOutputFields		"INCLUDE">
<!ENTITY % X3dExtensions		"IGNORE">

<!ENTITY % profileNames "(Core|Interchange|CADInterchange|Interactive|Immersive|Full|MPEG4Interactive)">

<!ENTITY % componentNames "(Core|CADGeometry|CubeMapTexturing|DIS|EnvironmentalEffects|EnvironmentalSensor|EventUtilities|Geometry2D|Geometry3D|Geospatial|Grouping|H-Anim|Interpolation|KeyDeviceSensor|Lighting|Navigation|Networking|NURBS|PointingDeviceSensor|Rendering|Scripting|Shaders|Shape|Sound|Text|Texturing|Texturing3D|Time)">

<!ENTITY % componentLevels "(1|2|3|4)">

<!ENTITY % X3dFieldTypes "SFBool|MFBool|SFColor|MFColor|SFColorRGBA|MFColorRGBA|SFDouble|MFDouble|SFFloat|MFFloat|SFImage|MFImage|SFInt32|MFInt32|SFNode|MFNode|SFRotation|MFRotation|SFString|MFString|SFTime|MFTime|SFVec2f|MFVec2f|SFVec2d|MFVec2d|SFVec3f|MFVec3f|SFVec3d|MFVec3d|SFMatrix3d|MFMatrix3d|SFMatrix3f|MFMatrix3f|SFMatrix4d|MFMatrix4d|SFMatrix4f|MFMatrix4f|SFVec4d|MFVec4d|SFVec4f|MFVec4f">

<!-- X3D type definitions as DTD types -->
<!ENTITY % SFBool	"(true|false)">
<!ENTITY % MFBool	"CDATA">
<!ENTITY % SFColor	"CDATA">
<!ENTITY % MFColor	"CDATA">
<!ENTITY % SFColorRGBA	"CDATA">
<!ENTITY % MFColorRGBA	"CDATA">
<!ENTITY % SFFloat	"CDATA">
<!ENTITY % MFFloat	"CDATA">
<!ENTITY % SFDouble	"CDATA">
<!ENTITY % MFDouble	"CDATA">
<!ENTITY % SFImage	"CDATA">
<!ENTITY % MFImage	"CDATA">
<!ENTITY % SFInt32	"CDATA">
<!ENTITY % MFInt32	"CDATA">
<!ENTITY % SFRotation	"CDATA">
<!ENTITY % MFRotation	"CDATA">
<!ENTITY % SFString	"CDATA">
<!ENTITY % MFString	"CDATA">
<!ENTITY % SFTime	"CDATA">
<!ENTITY % MFTime	"CDATA">
<!ENTITY % SFVec2f	"CDATA">
<!ENTITY % MFVec2f	"CDATA">
<!ENTITY % SFVec2d	"CDATA">
<!ENTITY % MFVec2d	"CDATA">
<!ENTITY % SFVec3f	"CDATA">
<!ENTITY % MFVec3f	"CDATA">
<!ENTITY % SFVec3d	"CDATA">
<!ENTITY % MFVec3d	"CDATA">
<!ENTITY % SFVec4f	"CDATA">
<!ENTITY % MFVec4f	"CDATA">
<!ENTITY % SFVec4d	"CDATA">
<!ENTITY % MFVec4d	"CDATA">
<!ENTITY % SFMatrix3f	"CDATA">
<!ENTITY % MFMatrix3f	"CDATA">
<!ENTITY % SFMatrix3d	"CDATA">
<!ENTITY % MFMatrix3d	"CDATA">
<!ENTITY % SFMatrix4f	"CDATA">
<!ENTITY % MFMatrix4f	"CDATA">
<!ENTITY % SFMatrix4d	"CDATA">
<!ENTITY % MFMatrix4d	"CDATA">

<!ENTITY % TextureCoordinateGeneratorModes	"(SPHERE|CAMERASPACENORMAL|CAMERASPACEPOSITION|CAMERASPACEREFLECTIONVECTOR|SPHERE-LOCAL|COORD|COORD-EYE|NOISE|NOISE-EYE|SPHERE-REFLECT|SPHERE-REFLECT-LOCAL)">

<!--	User needs to append | after listing each new node in any of these extensions.
	For an example, see examples/development/ProtoTagDtdDeclarationExamples.x3d   -->
<!ENTITY % AppearanceNodeExtensions "">
<!ENTITY % AudioClipNodeExtensions "">
<!ENTITY % BindableNodeExtensions "">
<!ENTITY % ColorNodeExtensions "">
<!ENTITY % CoordinateNodeExtensions "">
<!ENTITY % FontStyleNodeExtensions "">
<!ENTITY % EventUtilityNodeExtensions "">
<!ENTITY % GeometryNodeExtensions "">
<!ENTITY % GroupingNodeExtensions "">
<!ENTITY % InterpolatorNodeExtensions "">
<!ENTITY % LightNodeExtensions "">
<!ENTITY % MaterialNodeExtensions "">
<!ENTITY % MetadataNodeExtensions "">
<!ENTITY % NormalNodeExtensions "">
<!ENTITY % ScriptNodeExtensions "">
<!ENTITY % SensorNodeExtensions "">
<!ENTITY % ShapeNodeExtensions "">
<!ENTITY % SoundNodeExtensions "">
<!-- MovieTexture must be able to appear twice: -->
<!ENTITY % MovieTextureNodeExtensions "">
<!ENTITY % TextureNodeExtensions "">
<!ENTITY % TextureCoordinateNodeExtensions "">
<!ENTITY % TextureTransformNodeExtensions "">
<!ENTITY % NetworkSensorNodeExtensions "">
<!ENTITY % WorldInfoNodeExtensions "">
<!-- Users defining PROTOs do not override any of the following parameter entity declarations. -->
<![%ImmersiveProfile;[
<!ENTITY % WildcardNodes       	" (ProtoInstance) " >
]]>
<![%InterchangeProfile;[
<!ENTITY % WildcardNodes       	" " >
]]>
<![%DISComponent;[
<!ENTITY % DISGroupingNodes	" EspduTransform|SignalPdu|ReceiverPdu|TransmitterPdu|" >
]]>
<![%GeoSpatialComponent;[
<!ENTITY % GeoCoordinateNode		" GeoCoordinate|" >
<!ENTITY % GeoElevationGridNode		" GeoElevationGrid|" >
<!ENTITY % GeoGroupingNodes		" GeoLocation|GeoLOD|" >
<!ENTITY % GeoMetadataNode		" GeoMetadata|" >
<!ENTITY % GeoOriginNode		" GeoOrigin|" >
<!ENTITY % GeoBehaviorNodes		" GeoPositionInterpolator|GeoTouchSensor|" >
<!ENTITY % GeoViewpointNode		" GeoViewpoint|" >
]]>
<![%HAnimComponent;[
<!ENTITY % HAnimGroupingNodes		" HAnimJoint|HAnimSegment|HAnimSite|HAnimHumanoid|" >
<!ENTITY % DisplacerNode		" HAnimDisplacer|" >
]]>
<![%NurbsComponent;[
<!ENTITY % NurbsGeometryNodes	  " NurbsCurve|NurbsCurve2D|NurbsPatchSurface|NurbsSweptSurface|NurbsSwungSurface|NurbsTrimmedSurface|" >
<!ENTITY % NurbsInterpolators	  	  " NurbsPositionInterpolator|NurbsOrientationInterpolator|NurbsSurfaceInterpolator|" >
<!ENTITY % NurbsControlCurveNodes " NurbsCurve2D|Contour2D|ContourPolyline2D " >
]]>
<![%CadComponent;[
<!ENTITY % CadGeometryNodes	  " QuadSet|IndexedQuadSet|" >
<!ENTITY % CadGroupingNodes	  " CADAssembly|CADLayer|" >
]]>
<![%CubeMapTexturingComponent;[
<!ENTITY % CubeMapTextureNodes	  " ComposedCubeMapTexture|GeneratedCubeMapTexture|ImageCubeMapTexture " >
]]>
<![%ShadersComponent;[
<!ENTITY % ShaderNodes	  " ComposedShader|PackagedShader|ProgramShader " >
<!ENTITY % ShaderAttributeNodes	  " FloatVertexAttribute|Matrix3VertexAttribute|Matrix4VertexAttribute" >
]]>
<![%Texture3DComponent;[
<!ENTITY % Texture3DTextureNodes		" Composed3DTexture|Image3DTexture|Pixel3DTexture " >
<!ENTITY % Texture3DTextureCoordinateNodes	  " TextureCoordinate3D|TextureCoordinate4D| " >
<!ENTITY % Texture3DTextureTransformNodes	  " TextureMatrixTransform|TextureTransform3D " >
]]>
<![%Web3dExtensionComponent;[
<!ENTITY % Web3dExtensionGeometryNodes	" XvlShell|" >
]]>
<!-- otherwise set tag lists to null strings if not previously defined -->
<!ENTITY % DISGroupingNodes "">
<!ENTITY % GeoCoordinateNode "">
<!ENTITY % GeoElevationGridNode "">
<!ENTITY % GeoGroupingNodes "">
<!ENTITY % GeoMetadataNode "">
<!ENTITY % GeoOriginNode "">
<!ENTITY % GeoBehaviorNodes "">
<!ENTITY % GeoViewpointNode "">
<!ENTITY % HAnimGroupingNodes "">
<!ENTITY % DisplacerNode "">
<!ENTITY % NurbsGeometryNodes "">
<!ENTITY % NurbsInterpolators "">
<!ENTITY % CadGroupingNodes   "">
<!ENTITY % CadGeometryNodes   "">
<!ENTITY % CubeMapTextureNodes   "">
<!ENTITY % ShaderNodes   "">
<!ENTITY % ShaderAttributeNodes   "">
<!ENTITY % Texture3DTextureNodes		"" >
<!ENTITY % Texture3DTextureCoordinateNodes	  "" >
<!ENTITY % Texture3DTextureTransformNodes	  "" >
<!ENTITY % Web3dExtensionGroupingNodes "">
<!ENTITY % Web3dExtensionGeometryNodes "">
<!-- no further content-model extensions needed -->
<![%InterchangeProfile;[
<!ENTITY % AudioClipNodes "" >
<!ENTITY % FontStyleNodes "" >
<!ENTITY % EventUtilityNodes "" >
<!ENTITY % MovieTextureNodes "" >
<!ENTITY % NormalNodes "" >
<!ENTITY % ScriptNodes "" >
<!ENTITY % SoundNodes "" >
<!ENTITY % TextureCoordinateNodes "" >
<!ENTITY % TextureTransformNodes "" >
]]>
<!-- NetworkSensorNodes used by LoadSensor -->
<!ENTITY % NetworkSensorNodes " %NetworkSensorNodeExtensions; Anchor|AudioClip|GeoMetadata|ImageCubeMapTexture|ImageTexture|Image3DTexture|Inline|MovieTexture|PackagedShader|ProtoInstance|Script|ShaderPart|ShaderProgram ">

<![%ImmersiveProfile;[

<!ENTITY % AudioClipNodes		" %AudioClipNodeExtensions; AudioClip " >

<!ENTITY % FontStyleNodes		" %FontStyleNodeExtensions; FontStyle " >

<!ENTITY % EventUtilityNodes		" %EventUtilityNodeExtensions; BooleanFilter|BooleanSequencer|BooleanToggle|BooleanTrigger|IntegerSequencer|IntegerTrigger|TimeTrigger " >

<!ENTITY % MovieTextureNodes		" %MovieTextureNodeExtensions; MovieTexture " >

<!ENTITY % NormalNodes			" %NormalNodeExtensions; Normal " >

<!ENTITY % ScriptNodes			" %ScriptNodeExtensions; Script " >

<!ENTITY % SoundNodes			" %SoundNodeExtensions; Sound " >

<!ENTITY % TextureCoordinateNodes	" %TextureCoordinateNodeExtensions; %Texture3DTextureCoordinateNodes; TextureCoordinate|TextureCoordinateGenerator|MultiTextureCoordinate|NurbsTextureCoordinate " >

<!ENTITY % TextureTransformNodes	" %TextureTransformNodeExtensions; TextureTransform|MultiTextureTransform " >

<!ENTITY % AllTextureTransformNodes	" %TextureTransformNodes;|%Texture3DTextureTransformNodes; " >
]]>

<![%InterchangeProfile;[
<!ENTITY % AppearanceNodes  	" Appearance " >

<!ENTITY % BehaviorLeafNodes	" CoordinateInterpolator|KeySensor|OrientationInterpolator|PositionInterpolator|ScalarInterpolator|TimeSensor|TouchSensor " >

<!ENTITY % BindableNodes    	" Background|NavigationInfo|Viewpoint " >

<!ENTITY % ColorNodes       	" Color|ColorRGBA " >

<!ENTITY % CoordinateNodes  	" Coordinate|CoordinateDouble|FogCoordinate " >

<!ENTITY % GeometryNodes    	" IndexedFaceSet|IndexedLineSet|LineSet|PointSet " >

<!ENTITY % GroupingNodes    	" Anchor|Group|Inline|Transform " >

<!ENTITY % LightNodes       	" DirectionalLight " >

<!ENTITY % MaterialNodes    	" Material " >

<!ENTITY % ShapeNodes       	" Shape " >

<!ENTITY % Texture2DNodes     	" ImageTexture " >

<!ENTITY % WorldInfoNodes   	" WorldInfo " >
]]>
<![%ImmersiveProfile;[

<!ENTITY % AppearanceNodes  	" %AppearanceNodeExtensions; Appearance " >

<!ENTITY % BehaviorLeafNodes	" %InterpolatorNodeExtensions; %SensorNodeExtensions; %ScriptNodeExtensions; %GeoBehaviorNodes; %DisplacerNode; %NurbsInterpolators; %EventUtilityNodes;|ColorInterpolator|CoordinateInterpolator|CoordinateInterpolator2D|CylinderSensor|KeySensor|LoadSensor|LocalFog|NormalInterpolator|OrientationInterpolator|PlaneSensor|PositionInterpolator|PositionInterpolator2D|ProximitySensor|ScalarInterpolator|Script|SphereSensor|StringSensor|TimeSensor|TouchSensor|VisibilitySensor " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % BindableNodes    	" %BindableNodeExtensions; %GeoViewpointNode; Background|Fog|NavigationInfo|TextureBackground|Viewpoint " >

<!ENTITY % ColorNodes       	" %ColorNodeExtensions; Color|ColorRGBA " >

<!ENTITY % CoordinateNodes  	" %CoordinateNodeExtensions; %GeoCoordinateNode; Coordinate|CoordinateDouble " >

<!ENTITY % Geometry2DNodes    	" Arc2D|ArcClose2D|Circle2D|Disk2D|Polyline2D|Polypoint2D|Rectangle2D|TriangleSet2D " >

<!ENTITY % GeometryNodes    	" %GeometryNodeExtensions; %GeoElevationGridNode; %NurbsGeometryNodes; %CadGeometryNodes; %Web3dExtensionGeometryNodes; %Geometry2DNodes;|Box|Cone|Cylinder|ElevationGrid|Extrusion|IndexedFaceSet|IndexedLineSet|LineSet|PointSet|Sphere|Text|IndexedTriangleFanSet|IndexedTriangleSet|IndexedTriangleStripSet|TriangleFanSet|TriangleSet|TriangleStripSet " >

<!ENTITY % GroupingNodes    	" %GroupingNodeExtensions; %DISGroupingNodes; %GeoGroupingNodes; %HAnimGroupingNodes; %CadGroupingNodes; %Web3dExtensionGroupingNodes; Anchor|Billboard|Collision|Group|Inline|LOD|StaticGroup|Switch|Transform " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % LightNodes       	" %LightNodeExtensions; DirectionalLight|SpotLight|PointLight " >

<!ENTITY % MaterialNodes    	" %MaterialNodeExtensions; Material " >

<!ENTITY % ShapeNodes       	" %ShapeNodeExtensions; Shape " >

<!ENTITY % Texture2DNodes     	" %TextureNodeExtensions; ImageTexture|MovieTexture|MultiTexture|PixelTexture " >

<!ENTITY % AllTextureNodes     	" %Texture2DNodes;|%CubeMapTextureNodes;|%Texture3DTextureNodes; " >

<!ENTITY % MultiTextureChildTextures " %TextureNodeExtensions; ImageTexture|MovieTexture|PixelTexture " >

<!ENTITY % WorldInfoNodes   	  " %WorldInfoNodeExtensions; %GeoMetadataNode; WorldInfo " >
]]>
<![%InterchangeProfile;[
<!ENTITY % ComposedGeometryNodes " %ColorNodes; " >

<!ENTITY % AppearanceChildNodes	" %MaterialNodes; " >

<!ENTITY % SceneLeafNodes   	" %LightNodes;|%ShapeNodes;|%WorldInfoNodes; " >

<!ENTITY % MetadataNodes 	" %MetadataNodeExtensions; MetadataDouble|MetadataFloat|MetadataInteger|MetadataSet|MetadataString ">

<!ENTITY % ProtoNodes       	"" >
]]>
<![%ImmersiveProfile;[
<!ENTITY % ComposedGeometryNodes " %ShaderAttributeNodes;|%CoordinateNodes;|%ColorNodes;|%NormalNodes;|%TextureCoordinateNodes;|FogCoordinate " >

<!ENTITY % AppearanceChildNodes	" LineProperties|FillProperties|%MaterialNodes;|%Texture2DNodes;|%CubeMapTextureNodes;|%ShaderNodes;|%Texture3DTextureNodes;|%TextureTransformNodes;|%Texture3DTextureTransformNodes; " >

<!ENTITY % SceneLeafNodes   	" %GeoOriginNode; %LightNodes;|%ShapeNodes;|%SoundNodes;|%WorldInfoNodes; " >

<!ENTITY % OtherLeafNodes   	" AudioClip|LineProperties|FillProperties " >

<!ENTITY % MetadataNodes 	" %MetadataNodeExtensions; MetadataDouble|MetadataFloat|MetadataInteger|MetadataSet|MetadataString ">

<!ENTITY % ProtoNodes       	" %OtherLeafNodes;|%AppearanceNodes;|%AppearanceChildNodes;|%BehaviorLeafNodes;|%BindableNodes;|%CubeMapTextureNodes;|%FontStyleNodes;|%ComposedGeometryNodes;|%GeometryNodes;|%GroupingNodes;|ShaderPart|ShaderProgram|%MetadataNodes;|%SceneLeafNodes;|%Texture3DTextureNodes;|%Texture3DTextureTransformNodes;|ProtoDeclare|ExternProtoDeclare|ProtoInstance " >
]]>

<!ENTITY % ChildrenNodes    	" %BehaviorLeafNodes;|%BindableNodes;|%GroupingNodes;|%SceneLeafNodes;|ROUTE|EXPORT|IMPORT " >

<![%InterchangeProfile;[
<!ENTITY % SceneNodes       	" %ChildrenNodes;|%WildcardNodes; " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % SceneNodes       	" ExternProtoDeclare|ProtoDeclare|%ChildrenNodes;|%WildcardNodes; " >
]]>
<!-- SensorNodes not used (yet, anyway) in tagset content-model definitions. -->
<!ENTITY % SensorNodes " Anchor|Collision|CylinderSensor|KeySensor|PlaneSensor|ProximitySensor|SphereSensor|StringSensor|TimeSensor|TouchSensor|VisibilitySensor ">
<!ENTITY % DragSensors " CylinderSensor|PlaneSensor|SphereSensor ">
<!ENTITY % EnvironmentalSensorNodes " Collision|ProximitySensor|TimeSensor|VisibilitySensor ">
<!ENTITY % PointingDeviceSensors " Anchor|CylinderSensor|PlaneSensor|SphereSensor|TouchSensor ">
<!ENTITY % KeyDeviceSensors " ">
<!ENTITY % InterpolatorNodes " ColorInterpolator|CoordinateInterpolator|CoordinateInterpolator2D|NormalInterpolator|OrientationInterpolator|PositionInterpolator|PositionInterpolator2D|ScalarInterpolator ">
<!ENTITY % TimeDependentNodes " AudioClip|MovieTexture|TimeSensor ">

<!-- ***** X3D DTD ***** -->
<![%ImmersiveProfile;[
<!ELEMENT Anchor (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST Anchor
	description %SFString; #IMPLIED
	parameter   %MFString; #IMPLIED
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED >
]]>
<![%InterchangeProfile;[
<!ELEMENT Anchor (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* >
<!ATTLIST Anchor
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED >
]]>
<![%InterchangeProfile;[
<!ELEMENT Appearance ( (%MetadataNodes;)?,
(  ((%MaterialNodes;), (%Texture2DNodes;)?  )
|((%Texture2DNodes;),  (%MaterialNodes;)? )
)? ) >
]]>
<!ELEMENT Appearance (IS?, (%MetadataNodes;)?, (%AppearanceChildNodes;|%WildcardNodes;)* ) >
<!ATTLIST Appearance
	containerField NMTOKEN "appearance"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT AudioClip ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST AudioClip
	description %SFString; #IMPLIED
	loop        %SFBool;   "false"
	pitch       %SFFloat;  "1.0"
	startTime   %SFTime;   "0"
	stopTime    %SFTime;   "0"
	pauseTime   %SFTime;   "0"
	resumeTime  %SFTime;   "0"
	url         %MFString; #IMPLIED
	containerField NMTOKEN "source"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED>
]]>
<!ELEMENT Background ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Background
	groundAngle %MFFloat; #IMPLIED
	groundColor %MFColor; #IMPLIED
	backUrl %MFString; #IMPLIED
	bottomUrl %MFString; #IMPLIED
	frontUrl %MFString; #IMPLIED
	leftUrl %MFString; #IMPLIED
	rightUrl %MFString; #IMPLIED
	topUrl %MFString; #IMPLIED
	skyAngle %MFFloat; #IMPLIED
	skyColor %MFColor; "0 0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT Billboard (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST Billboard
	axisOfRotation %SFVec3f; "0 1 0"
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class	 CDATA     #IMPLIED
	DEF            ID        #IMPLIED
	USE            IDREF     #IMPLIED>

<!ELEMENT BooleanFilter ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanFilter
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFBool; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanToggle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanToggle
	toggle      %SFBool;  "false"
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanTrigger
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!-- Geometry2D nodes -->

<!ELEMENT Arc2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Arc2D
	radius     %SFFloat; "1"
	startAngle %SFFloat; "0"
	endAngle   %SFFloat; "1.570796"
	containerField NMTOKEN "geometry"
	class      CDATA    #IMPLIED
	DEF  ID    #IMPLIED
	USE  IDREF #IMPLIED>

<!ELEMENT ArcClose2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ArcClose2D
	radius      %SFFloat; "1"
	startAngle  %SFFloat; "0"
	endAngle    %SFFloat; "1.570796"
	closureType (PIE|CHORD) "PIE"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class       CDATA    #IMPLIED
	DEF  ID     #IMPLIED
	USE  IDREF  #IMPLIED>

<!ELEMENT Circle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Circle2D
	radius     %SFFloat; "1"
	containerField NMTOKEN "geometry"
	class      CDATA    #IMPLIED
	DEF  ID    #IMPLIED
	USE  IDREF #IMPLIED>

<!ELEMENT Disk2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Disk2D
	innerRadius %SFFloat; "0"
	outerRadius %SFFloat; "1"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class       CDATA    #IMPLIED
	DEF  ID     #IMPLIED
	USE  IDREF  #IMPLIED>

<!ELEMENT Polyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polyline2D
	lineSegments %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT Polypoint2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polypoint2D
	point       %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT Rectangle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Rectangle2D
	size         %SFVec2f; "2 2"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT TriangleSet2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TriangleSet2D
	vertices     %MFVec2f; #IMPLIED
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT Box ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Box
	size  %SFVec3f; "2 2 2"
	solid %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF  ID        #IMPLIED
	USE  IDREF     #IMPLIED>

<!ELEMENT Collision ( (IS?), (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* )  >
<!ATTLIST Collision
	enabled     %SFBool;  "true"
	bboxCenter  %SFVec3f; "0 0 0"
	bboxSize    %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED >
]]>
<!ELEMENT Color ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Color
	color %MFColor; #IMPLIED
	class CDATA #IMPLIED
	containerField NMTOKEN "color"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ColorRGBA ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ColorRGBA
	color %MFColorRGBA; #IMPLIED
	containerField NMTOKEN "color"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT component EMPTY>
<!ATTLIST component
	name  %componentNames; #REQUIRED
	level %componentLevels; #REQUIRED>
<![%ImmersiveProfile;[
<!ELEMENT ColorInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ColorInterpolator
	key         %MFFloat; #IMPLIED
	keyValue    %MFColor; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT Cone ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cone
	bottomRadius %SFFloat; "1"
	height       %SFFloat; "2"
	side         %SFBool;  "true"
	bottom       %SFBool;  "true"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Coordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Coordinate
	point %MFVec3f; #IMPLIED
	containerField NMTOKEN "coord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CoordinateDouble ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateDouble
	point %MFVec3d; #IMPLIED
	containerField NMTOKEN "coord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CoordinateInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT CoordinateInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CoordinateInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT Cylinder ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cylinder
	bottom   %SFBool; "true"
	height   %SFFloat; "2"
	radius   %SFFloat; "1"
	side     %SFBool;  "true"
	top      %SFBool;  "true"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT CylinderSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CylinderSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	diskAngle  %SFFloat;    "0.26179167"
	maxAngle   %SFFloat;    "-1"
	minAngle   %SFFloat;    "0"
	offset     %SFFloat;    "0"
	enabled    %SFBool;     "true"
	containerField NMTOKEN "children"
	class	CDATA     #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>

<!ELEMENT DirectionalLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST DirectionalLight
	ambientIntensity %SFFloat; "0"
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	global         %SFBool;  "false"
	containerField NMTOKEN "children"
	class	   CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[
<!ELEMENT DirectionalLight (%MetadataNodes;)? >
<!ATTLIST DirectionalLight
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!-- Complete, concisely enumerated unordered version of ElevationGrid by Heiko Grussbach -->
<!ELEMENT ElevationGrid (IS?, (%MetadataNodes;)?, (
   ((%ColorNodes;), (		((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
|((%NormalNodes;), (		((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
|((%TextureCoordinateNodes;), (((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
|(%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
)?, (FogCoordinate)? ) >

<!ATTLIST ElevationGrid
	height          %MFFloat; #IMPLIED
	ccw             %SFBool;  "true"
	colorPerVertex  %SFBool;  "true"
	creaseAngle     %SFFloat; "0"
	normalPerVertex %SFBool;  "true"
	solid           %SFBool;  "true"
	xDimension      %SFInt32; "0"
	xSpacing        %SFFloat; "1.0"
	zDimension      %SFInt32; "0"
	zSpacing        %SFFloat; "1.0"
	containerField NMTOKEN "geometry"
	class	  CDATA     #IMPLIED
	DEF             ID        #IMPLIED
	USE             IDREF     #IMPLIED>

<!ELEMENT ExternProtoDeclare ( field* ) >
<!ATTLIST ExternProtoDeclare
	name		NMTOKEN		#REQUIRED
	url		%MFString;	#REQUIRED
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT Extrusion ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Extrusion
	beginCap     %SFBool;     "true"
	ccw          %SFBool;     "true"
	convex       %SFBool;     "true"
	creaseAngle  %SFFloat;    "0.0"
	crossSection %MFVec2f;    "1 1 1 -1 -1 -1 -1 1 1 1"
	endCap       %SFBool;     "true"
	orientation  %MFRotation; "0 0 1 0"
	scale        %MFVec2f;    "1 1"
	solid        %SFBool;     "true"
	spine        %MFVec3f;    "0 0 0 0 1 0"
	containerField NMTOKEN "geometry"
	class        CDATA        #IMPLIED
	DEF          ID           #IMPLIED
	USE          IDREF        #IMPLIED>

<!-- field is only used in a Script, ProtoDeclare or ExternProtoDeclare.
     Initialization values for simple types go in the value attribute.
     Contained content tags are only for initialization of SFNode or MFNode values. -->

<!ELEMENT field  ( %ProtoNodes; )* >
<!ATTLIST field
	name       	NMTOKEN  	#REQUIRED
	accessType (inputOnly|outputOnly|initializeOnly|inputOutput) #REQUIRED
	type 	   ( %X3dFieldTypes; ) #REQUIRED
	value      	CDATA   	#IMPLIED
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!-- fieldValue resets default field values inside a ProtoInstance.
     Initialization values for simple types go in the value attribute.  Otherwise
     contained-content tags are used for initialization of SFNode or MFNode values. -->

<!ELEMENT fieldValue ( %ProtoNodes; )* >
<!ATTLIST fieldValue
	name	NMTOKEN	#REQUIRED
	value	CDATA	#IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT FillProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FillProperties
	filled   %SFBool;   "true"
	hatched  %SFBool;   "true"
	hatchStyle  %SFInt32;      "1"
	hatchColor  %SFColor;      "1 1 1"
	containerField NMTOKEN "fillProperties"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT Fog ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Fog
	color           %SFColor;            "1 1 1"
	fogType         (LINEAR|EXPONENTIAL) "LINEAR"
	visibilityRange %SFFloat;            "0"
	containerField NMTOKEN "children"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT FontStyle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FontStyle
	family      %MFString; '"SERIF"'
	horizontal  %SFBool;   "true"
	justify     %MFString; '"BEGIN"'
	language    %SFString; #IMPLIED
	leftToRight %SFBool;   "true"
	size        %SFFloat;  "1.0"
	spacing     %SFFloat;  "1.0"
	style       (PLAIN|BOLD|ITALIC|BOLDITALIC) "PLAIN"
	topToBottom %SFBool;   "true"
	containerField NMTOKEN "fontStyle"
	class       CDATA       #IMPLIED
	DEF         ID          #IMPLIED
	USE         IDREF       #IMPLIED>
<!-- Minimum supported values:
	family  ' "SERIF" "SANS" "TYPEWRITER" '
	justify ' "FIRST" "BEGIN" "MIDDLE" "END" ' -->
]]>
<!ELEMENT Group (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|%WildcardNodes;)*) >
<!ATTLIST Group
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ImageTexture ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ImageTexture
	url %MFString; #IMPLIED
	repeatS %SFBool; "true"
	repeatT %SFBool; "true"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!-- Complete, unordered, concisely enumerated version of IndexedFaceSet content model by Heiko Grussbach -->
<!ENTITY % ColorCoordinateNormalTextureCoordinateContentModel "(IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	((%CoordinateNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	   			(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%CoordinateNodes;), (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%NormalNodes;),  (
 	((%ColorNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
|(%WildcardNodes;,  (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)?, (FogCoordinate)? )">
<![%ImmersiveProfile;[
<!ELEMENT IndexedFaceSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*) >

<!ELEMENT IndexedLineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >

<!ELEMENT LineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT IndexedFaceSet ( (%MetadataNodes;)?, ((%ColorNodes;), Coordinate?)|(Coordinate, (%ColorNodes;)?) )? >

<!ELEMENT IndexedLineSet ( (%MetadataNodes;)?, ( Color, Coordinate? )|( Coordinate, Color?) )? >

<!ELEMENT LineSet ( (%MetadataNodes;)?, ( Color, Coordinate? )|( Coordinate, Color?) )? >
]]>
<!ATTLIST IndexedFaceSet
	ccw %SFBool; "true"
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	convex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	creaseAngle %SFFloat; "0"
	normalIndex %MFInt32; #IMPLIED
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	texCoordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ATTLIST IndexedLineSet
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ATTLIST LineSet
	vertexCount %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT Inline ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Inline
	load %SFBool; "true"
	url %MFString; #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT EXPORT EMPTY>
<!ATTLIST EXPORT
	localDEF IDREF #REQUIRED
	AS NMTOKEN #IMPLIED>
<!ELEMENT IMPORT EMPTY>
<!ATTLIST IMPORT
	inlineDEF IDREF #REQUIRED
	importedDEF NMTOKEN #REQUIRED
	AS ID #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT IntegerSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFInt32; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IntegerTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerTrigger
	integerKey   %SFInt32; "-1"
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IS (connect)+ >

<!ELEMENT connect EMPTY >
<!ATTLIST connect
	nodeField   NMTOKEN #REQUIRED
	protoField  NMTOKEN #REQUIRED>
]]>
<!ELEMENT KeySensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST KeySensor
	enabled %SFBool; "true"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT LineProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST LineProperties
	applied %SFBool; "true"
	linetype %SFInt32; "1"
	linewidthScaleFactor %SFFloat; "0"
	containerField NMTOKEN "lineProperties"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>
]]>
<!ELEMENT LoadSensor (IS?, (%MetadataNodes;)?, (%NetworkSensorNodes;|%WildcardNodes;)*)>
<!ATTLIST LoadSensor
	enabled %SFBool; "true"
	timeOut %SFTime; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT LOD (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST LOD
	forceTransitions %SFBool; "false"
	center %SFVec3f; "0 0 0"
	range  %MFFloat; #IMPLIED
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT Material ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Material
	ambientIntensity %SFFloat; "0.2"
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	shininess        %SFFloat; "0.2"
	specularColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class       CDATA          #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[
<!ELEMENT Material ( (%MetadataNodes;)? ) >
<!ATTLIST Material
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class       	 CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<!-- *** XHTML exerpts to define meta tag *** -->
<!-- i18n, language, meta tag definitions from XHTML 1.0
     http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd -->
<!ENTITY % LanguageCode "NMTOKEN">
<!-- a language code, as per [IETF RFC3066/BCP47] ftp://ftp.isi.edu/in-notes/bcp/bcp47.txt -->
<!-- internationalization attributes
  lang        language code (backwards compatible)
  xml:lang    language code (as per XML 1.0 spec)
  dir         direction for weak/neutral text
-->
<!ENTITY % i18n "lang        %LanguageCode; #IMPLIED
  xml:lang    %LanguageCode; #IMPLIED
  dir         (ltr|rtl)      #IMPLIED">
<!ELEMENT head (component*, meta*)>
<!-- generic metadata information, matches HTML usage, made attribute 'name' required -->
<!ELEMENT meta EMPTY>
<!ATTLIST meta
	http-equiv CDATA #IMPLIED
	name CDATA #REQUIRED
	content CDATA #REQUIRED
	scheme CDATA #IMPLIED
	%i18n; >
<!-- formal X3D Metadata nodes -->
<!ELEMENT MetadataDouble (IS?, (%MetadataNodes;|%WildcardNodes;)?)>
<!ATTLIST MetadataDouble
	name %SFString; #IMPLIED
	value %MFDouble; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT MetadataFloat (IS?, (%MetadataNodes;|%WildcardNodes;)?)>
<!ATTLIST MetadataFloat
	name %SFString; #IMPLIED
	value %MFFloat; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT MetadataInteger (IS?, (%MetadataNodes;|%WildcardNodes;)?)>
<!ATTLIST MetadataInteger
	name %SFString; #IMPLIED
	value %MFInt32; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT MetadataString (IS?, (%MetadataNodes;|%WildcardNodes;)?)>
<!ATTLIST MetadataString
	name %SFString; #IMPLIED
	value %MFString; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!-- containerField discriminates whether child Metadata node(s) are 'metadata' or 'value' fields.
	NMTOKEN vice enumeration, since containerField might have another value as field in a ProtoInstance. -->
<!ELEMENT MetadataSet (IS?, (%MetadataNodes;|%WildcardNodes;)*)>
<!ATTLIST MetadataSet
	reference %SFString; #IMPLIED
	name %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!-- FAQ:  MovieTexture
	containerField='source'  when used as a Sound source,
	containerField='texture' when used as a Appearance texture source-->
<!ELEMENT MovieTexture ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST MovieTexture
	loop      %SFBool;   "false"
	speed     %SFFloat;  "1.0"
	startTime %SFTime;   "0"
	stopTime  %SFTime;   "0"
	url       %MFString; #IMPLIED
	repeatS   %SFBool;   "true"
	repeatT   %SFBool;   "true"
	pauseTime %SFTime;   "0"
	resumeTime %SFTime;  "0"
	containerField NMTOKEN "texture"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTexture ( (IS?), (%MetadataNodes;)?, (%MultiTextureChildTextures;|%WildcardNodes; )* ) >
<!ATTLIST MultiTexture
	mode           %MFString;	#IMPLIED
	source         %MFString;	#IMPLIED
	function       %MFString;	#IMPLIED
	color          %SFColor;  "1 1 1"
	alpha          %SFFloat;  "1.0"
	containerField NMTOKEN "texture"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTextureCoordinate ((IS?), (%MetadataNodes;)?, (TextureCoordinate|TextureCoordinateGenerator|ProtoInstance)* ) >
<!ATTLIST MultiTextureCoordinate
	containerField NMTOKEN "texCoord"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>
]]>
<!ELEMENT NavigationInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST NavigationInfo
	avatarSize %MFFloat; "0.25 1.6 0.75"
	headlight %SFBool; "true"
	speed %SFFloat; "1"
	type %MFString; ""EXAMINE" "ANY""
	transitionType %MFString; ""ANIMATE""
	transitionTime %MFFloat; "1.0"
	visibilityLimit %SFFloat; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT Normal ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Normal
	vector    %MFVec3f; #IMPLIED
	containerField NMTOKEN "normal"
	class	  CDATA     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>

<!ELEMENT NormalInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NormalInterpolator
	key      %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<!ELEMENT OrientationInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST OrientationInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFRotation; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT PixelTexture ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PixelTexture
	image   %SFImage; "0 0 0"
	repeatS %SFBool;  "true"
	repeatT %SFBool;  "true"
	containerField NMTOKEN "texture"
	class   CDATA     #IMPLIED
	DEF     ID        #IMPLIED
	USE     IDREF     #IMPLIED>

<!ELEMENT PlaneSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PlaneSensor
	description %SFString; #IMPLIED
	autoOffset  %SFBool;  "true"
	enabled     %SFBool;  "true"
	maxPosition %SFVec2f; "-1 -1"
	minPosition %SFVec2f; "0 0"
	offset      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT PointLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PointLight
	ambientIntensity %SFFloat;	"0"
	attenuation      %SFVec3f;	"1 0 0"
	color            %SFColor;	"1 1 1"
	intensity        %SFFloat;	"1"
	location         %SFVec3f;	"0 0 0"
	on               %SFBool;	"true"
	radius	 	 %SFFloat;	"100"
	global         %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA    	#IMPLIED
	DEF	  	 ID		#IMPLIED
	USE		 IDREF		#IMPLIED>

<!ELEMENT PointSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT PointSet ( (%MetadataNodes;)?, ( ( Color, Coordinate? )|( Coordinate, Color? ) )? ) >
]]>
<!ATTLIST PointSet
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT PositionInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST PositionInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT PositionInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PositionInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT ProtoInterface ( field* ) >

<!-- choice of required first node contained in ProtoBody constrained by valid ( %ProtoNodes; ) rather than %SceneNodes; ) >  -->

<!ELEMENT ProtoBody      ( ( %ProtoNodes; ), ( %SceneNodes; )* ) >

<!ELEMENT ProtoDeclare (ProtoInterface? , ProtoBody) > <!-- (|( field*, ( %ProtoNodes; ), ( %SceneNodes; )* )) -->
<!ATTLIST ProtoDeclare
	name 		NMTOKEN   	#REQUIRED
	appinfo		%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT ProtoInstance ( fieldValue* , (IS?) ) >
<!-- ( %SceneNodes; )* --><!-- direct children disallowed, let fieldValue name="children" handle them -->
<!ATTLIST ProtoInstance
	name     NMTOKEN           #REQUIRED
	containerField NMTOKEN "children"
	class	CDATA        #IMPLIED
	DEF      ID                #IMPLIED
	USE      IDREF             #IMPLIED>

<!ELEMENT ProximitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ProximitySensor
	center      %SFVec3f;    "0 0 0"
	size        %SFVec3f;    "0 0 0"
	enabled     %SFBool;     "true"
	containerField NMTOKEN "children"
	class       CDATA        #IMPLIED
	DEF         ID           #IMPLIED
	USE         IDREF        #IMPLIED>
]]>
<!ELEMENT ROUTE EMPTY>
<!ATTLIST ROUTE
	fromNode IDREF #REQUIRED
	fromField NMTOKEN #REQUIRED
	toNode IDREF #REQUIRED
	toField NMTOKEN #REQUIRED>
<!ELEMENT ScalarInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ScalarInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFFloat; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT Scene ((%MetadataNodes;)?, (%SceneNodes;)*)>
<!-- Script is similar to PROTO regarding user definition of multiple fields -->
<![%ImmersiveProfile;[
<!-- script code should be included as CDATA sections.  watch out on content-model order, originally ( #PCDATA|field )* -->

<!ELEMENT Script ( #PCDATA|%MetadataNodes;|field|IS )* >
<!ATTLIST Script
	url          %MFString; #IMPLIED
	directOutput %SFBool; "false"
	mustEvaluate %SFBool; "false"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
  	DEF ID       #IMPLIED
	USE IDREF    #IMPLIED>

<!ELEMENT Shape (IS?, (%MetadataNodes;)?, (
     ( (%AppearanceNodes;), (( %GeometryNodes; )|%WildcardNodes;)? ) |
     ( ( %GeometryNodes; ), ((%AppearanceNodes;)|%WildcardNodes;)? ) |
     ( %WildcardNodes;, (( %GeometryNodes; )|(%AppearanceNodes;)|%WildcardNodes;)? )
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT Shape ( (%MetadataNodes;)?,
	( (%AppearanceNodes;), ( %GeometryNodes; )? ) |
	( ( %GeometryNodes; ), (%AppearanceNodes;)? )
)? >
]]>
<!ATTLIST Shape
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT Sound (IS?, (%MetadataNodes;)?, ( %AudioClipNodes;|%MovieTextureNodes;|%WildcardNodes; )? ) >
<!ATTLIST Sound
	direction  %SFVec3f; "0 0 1"
	intensity  %SFFloat; "1"
	location   %SFVec3f; "0 0 0"
	maxBack    %SFFloat; "10"
	maxFront   %SFFloat; "10"
	minBack    %SFFloat; "1"
	minFront   %SFFloat; "1"
	priority   %SFFloat; "0"
	spatialize %SFBool;  "true"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT Sphere ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Sphere
	radius %SFFloat; "1"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT SphereSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SphereSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	enabled    %SFBool;     "true"
	offset     %SFRotation; "0 1 0 0"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT SpotLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SpotLight
	ambientIntensity %SFFloat; "0"
	attenuation      %SFVec3f; "1 0 0"
	beamWidth        %SFFloat; "1.570796"
	color            %SFColor; "1 1 1"
	cutOffAngle      %SFFloat; "0.785398"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	location         %SFVec3f; "0 0 0"
	on               %SFBool;  "true"
	radius           %SFFloat; "100"
	global         %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA    #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>

<!ELEMENT StaticGroup (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST StaticGroup
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize   %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT StringSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST StringSensor
	enabled			%SFBool;	"true"
	deletionAllowed 	%SFBool;	"true"
	containerField NMTOKEN "children"
	class			CDATA    #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<!ELEMENT Switch (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|%WildcardNodes;)*)>
<!ATTLIST Switch
	whichChoice %SFInt32; "-1"
	containerField NMTOKEN "children"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT Text (IS?, (%MetadataNodes;)?, ( (%FontStyleNodes;)?|%WildcardNodes; ) ) >
<!ATTLIST Text
	string    %MFString; #IMPLIED
	length    %MFFloat;  #IMPLIED
	maxExtent %SFFloat;  "0.0"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!-- backTexture, bottomTexture, frontTexture, leftTexture, rightTexture, topTexture; could use rule for 0..6 children here -->
<!ELEMENT TextureBackground (IS?, (%MetadataNodes;)?, (%Texture2DNodes;)* )>
<!ATTLIST TextureBackground
	groundAngle  %MFFloat;  #IMPLIED
	groundColor  %MFColor;  #IMPLIED
	skyAngle     %MFFloat;  #IMPLIED
	skyColor     %MFColor;  "0 0 0"
	transparency %MFFloat;  "0"
	containerField NMTOKEN "children"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
]]>
<!ELEMENT TextureCoordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate
	point %MFVec2f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT TextureCoordinateGenerator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureCoordinateGenerator
	mode      %TextureCoordinateGeneratorModes;  "SPHERE"
	parameter %MFFloat;  #IMPLIED
	containerField NMTOKEN "texCoord"
	class       CDATA    #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT TextureTransform ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureTransform
	center      %SFVec2f; "0 0"
	rotation    %SFFloat; "0"
	scale       %SFVec2f; "1 1"
	translation %SFVec2f; "0 0"
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT MultiTextureTransform ((IS?), (TextureTransform|ProtoInstance)* ) >
<!ATTLIST MultiTextureTransform
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

]]>
<!ELEMENT TimeSensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TimeSensor
	cycleInterval %SFTime; "1.0"
	enabled %SFBool; "true"
	loop %SFBool; "false"
	startTime %SFTime; "0"
	stopTime %SFTime; "0"
	pauseTime %SFTime; "0"
	resumeTime %SFTime; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<![%ImmersiveProfile;[
<!ELEMENT TimeTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TimeTrigger
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT TouchSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TouchSensor
	description %SFString; #IMPLIED
	enabled      %SFBool;  "true"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Transform (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|%WildcardNodes;)*)>
<!ATTLIST Transform
	center %SFVec3f; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT IndexedTriangleFanSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*)>
<!ATTLIST IndexedTriangleFanSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT IndexedTriangleSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*)>
<!ATTLIST IndexedTriangleSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT IndexedTriangleStripSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*)>
<!ATTLIST IndexedTriangleStripSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TriangleFanSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*)>
<!ATTLIST TriangleFanSet
	fanCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TriangleSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*)>
<!ATTLIST TriangleSet
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TriangleStripSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*)>
<!ATTLIST TriangleStripSet
	stripCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT Viewpoint ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Viewpoint
	fieldOfView %SFFloat; "0.785398"
	jump %SFBool; "true"
	orientation %SFRotation; "0 0 1 0"
	position %SFVec3f; "0 0 10"
	description %SFString; #IMPLIED
	centerOfRotation %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!-- centerOfRotation point relates to NavigationInfo EXAMINE mode. -->
<![%ImmersiveProfile;[
<!ELEMENT VisibilitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST VisibilitySensor
	center    %SFVec3f; "0 0 0"
	enabled   %SFBool;  "true"
	size      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class     CDATA     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>
]]>
<!ELEMENT WorldInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST WorldInfo
	info %MFString; #IMPLIED
	title %SFString; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT X3D (head?, Scene)>
<!ATTLIST X3D
	xmlns:xsd CDATA "http://www.w3.org/2001/XMLSchema-instance"
	xsd:noNamespaceSchemaLocation CDATA "http://www.web3d.org/specifications/x3d-3.1.xsd"
	profile %profileNames; #REQUIRED
	version (3.0|3.1) #REQUIRED>
<!-- EspduTransform includes DIS CollisionPdu DetonatePdu FirePdu -->
<![%DISComponent;[
<!ELEMENT EspduTransform (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST EspduTransform
	enabled     %SFBool;  "true"
	marking 	 %SFString;	#IMPLIED
	siteID  	 %SFInt32;	"0"
	applicationID	 %SFInt32;	"1"
	entityID	 %SFInt32;	"0"
	forceID		 %SFInt32;	"0"
	entityKind	 %SFInt32;	"0"
	entityDomain	 %SFInt32;	"0"
	entityCountry	 %SFInt32;	"0"
	entityCategory	 %SFInt32;	"0"
	entitySubCategory %SFInt32;	"0"
	entitySpecific	 %SFInt32;	"0"
	entityExtra	 %SFInt32;	"0"
	readInterval	 %SFTime;	"0.1"
	writeInterval	 %SFTime;	"1.0"
	networkMode	 (standAlone|networkReader|networkWriter)	"standAlone"
	translation	 %SFVec3f;	"0 0 0"
	rotation	 %SFRotation;	"0 0 1 0"
	scale   	 %SFVec3f;	"1 1 1"
	scaleOrientation %SFRotation;	"0 0 1 0"
	bboxCenter	 %SFVec3f;	"0 0 0"
	bboxSize	 %SFVec3f;	"-1 -1 -1"
	center  	 %SFVec3f;	"0 0 0"
	address 	 	%SFString;	"localhost"
	port    	 	%SFInt32;	"0"
	multicastRelayHost 	%SFString;	#IMPLIED
	multicastRelayPort 	%SFInt32;	"0"
	rtpHeaderExpected  	%SFBool;	"false"
	deadReckoning  		%SFInt32;	"0"
	linearVelocity		%SFVec3f;	"0 0 0"
	linearAcceleration	%SFVec3f;	"0 0 0"
	fired1   		%SFBool;	"false"
	fired2   		%SFBool;	"false"
	collisionType	%SFInt32;	"0"
	detonationLocation	%SFVec3f;	"0 0 0"
	detonationRelativeLocation	%SFVec3f;	"0 0 0"
	detonationResult	%SFInt32;	"0"
	eventApplicationID	%SFInt32;	"1"
	eventEntityID	%SFInt32;	"0"
	eventNumber	%SFInt32;	"0"
	eventSiteID	%SFInt32;	"0"
	munitionStartPoint 	%SFVec3f;	"0 0 0"
	munitionEndPoint   	%SFVec3f;	"0 0 0"
	warhead			%SFInt32;	"0"
	fuse			%SFInt32;	"0"
	munitionQuantity	%SFInt32;	"0"
	firingRate		%SFInt32;	"0"
	firingRange		%SFFloat;	"0"
	munitionSiteID  	%SFInt32;	"0"
	munitionApplicationID	%SFInt32;	"1"
	munitionEntityID	%SFInt32;	"0"
	fireMissionIndex	%SFInt32;	"0"
	articulationParameterCount 		  %SFInt32;	"0"
	articulationParameterDesignatorArray 	  %MFInt32;	#IMPLIED
	articulationParameterChangeIndicatorArray %MFInt32;	#IMPLIED
	articulationParameterIdPartAttachedToArray  %MFInt32;	#IMPLIED
	articulationParameterTypeArray 		  %MFInt32;	#IMPLIED
	articulationParameterArray 		  %MFFloat;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED >

<!ELEMENT ReceiverPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ReceiverPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	receivedPower		%SFFloat;	"0.0"
	receiverState		%SFInt32;	"0"
	transmitterSiteID	%SFInt32;	"0"
	transmitterApplicationID %SFInt32;	"0"
	transmitterEntityID	%SFInt32;	"0"
	transmitterRadioID	%SFInt32;	"0"

	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

<!ELEMENT SignalPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SignalPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter		 %SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	encodingScheme		%SFInt32;	"0"
	tdlType			%SFInt32;	"0"
	sampleRate		%SFInt32;	"0"
	samples			%SFInt32;	"0"
	dataLength		%SFInt32;	"0"
	data			%MFInt32;	#IMPLIED

	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

<!ELEMENT TransmitterPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TransmitterPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	antennaLocation		%SFVec3f;	"0 0 0"
	antennaPatternLength	%SFInt32;	"0"
	antennaPatternType	%SFInt32;	"0"
	cryptoKeyID		%SFInt32;	"0"
	cryptoSystem		%SFInt32;	"0"
	frequency		%SFInt32;	"0"
	inputSource		%SFInt32;	"0"

	lengthOfModulationParameters	%SFInt32;	"0"
	modulationTypeDetail		%SFInt32;	"0"
	modulationTypeMajor		%SFInt32;	"0"
	modulationTypeSpreadSpectrum	%SFInt32;	"0"
	modulationTypeSystem		%SFInt32;	"0"
	power				%SFFloat;	"0.0"
	radioEntityTypeCategory		%SFInt32;	"0"
	radioEntityTypeCountry		%SFInt32;	"0"
	radioEntityTypeDomain		%SFInt32;	"0"
	radioEntityTypeKind		%SFInt32;	"0"
	radioEntityTypeNomenclature	%SFInt32;	"0"
	radioEntityTypeNomenclatureVersion %SFInt32;	"0"
	relativeAntennaLocation		%SFVec3f;	"0 0 0"
	transmitFrequencyBandwidth	%SFFloat;	"0.0"
	transmitState			%SFInt32;	"0"

	containerField NMTOKEN "children"
	class				CDATA		""
	DEF   				ID		#IMPLIED
	USE             		IDREF		#IMPLIED >
]]>
<![%GeoSpatialComponent;[
<!ELEMENT GeoCoordinate ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >  <!-- X3DCoordinateNodeType -->
<!ATTLIST GeoCoordinate
	geoSystem	%MFString; '"GD" "WE"'
	point		%MFVec3d;	#IMPLIED
	containerField NMTOKEN "coord"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- need to restrict GeoOrigin to first element, or relax schema restriction -->
<!ELEMENT GeoElevationGrid (IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	(GeoOrigin, (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
	   			(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|(GeoOrigin, (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%NormalNodes;),  (
 	((%ColorNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
|(%WildcardNodes;,  (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)? ) >

<!ATTLIST GeoElevationGrid
	geoSystem	%MFString; '"GD" "WE"'
	geoGridOrigin	%SFVec3d;	"0 0 0"
	xDimension	%SFInt32;	"0"
	xSpacing	%SFDouble;	"1.0"
	yScale		%SFFloat;	"1.0"
	zDimension	%SFInt32;	"0"
	zSpacing	%SFDouble;	"1.0"
	height		%MFDouble; 	"0 0"
	normalPerVertex	%SFBool;	"true"
	ccw		%SFBool;	"true"
	colorPerVertex	%SFBool;	"true"
	creaseAngle	%SFFloat;	"0"
	solid		%SFBool;	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLocation (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes;|%WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes;|%WildcardNodes; )* )? ) >
<!ATTLIST GeoLocation
	geoSystem	%MFString; '"GD" "WE"'
	geoCoords	%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLOD (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes;|%WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes;|%WildcardNodes; )* )? ) >
<!ATTLIST GeoLOD
	geoSystem	%MFString; '"GD" "WE"'
	rootUrl	 	%MFString;	#IMPLIED
	child1Url	%MFString;	#IMPLIED
	child2Url	%MFString;	#IMPLIED
	child3Url	%MFString;	#IMPLIED
	child4Url 	%MFString;	#IMPLIED
	range		%SFFloat;	"10"
	center		%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoMetadata ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST GeoMetadata
	url		%MFString;	#IMPLIED
	data		IDREFS		#IMPLIED
	summary		%MFString;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!--
	title			%SFString;	#IMPLIED
	description		%SFString;	#IMPLIED
	coordinateSystem 	%SFString;	#IMPLIED
	horizontalDatum		%SFString;	#IMPLIED
	verticalDatum		%SFString;	#IMPLIED
	ellipsoid		%SFString;	#IMPLIED
	extent			%SFString;	#IMPLIED
	resolution		%SFString;	#IMPLIED
	originator		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	date			%SFString;	#IMPLIED
	metadataFormat		%SFString;	#IMPLIED
	dataUrl			%SFString;	#IMPLIED
	dataFormat		%SFString;	#IMPLIED
-->

<!ELEMENT GeoOrigin ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST GeoOrigin
	geoSystem	%MFString; '"GD" "WE"'
	geoCoords	%SFVec3d;	"0 0 0"
	rotateYUp	%SFBool;	"false"
	containerField NMTOKEN "geoOrigin"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoPositionInterpolator ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoPositionInterpolator
	geoSystem	%MFString; '"GD" "WE"'
	key		%MFFloat;	#IMPLIED
	keyValue	%MFVec3d;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoTouchSensor ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoTouchSensor
	geoSystem	%MFString; '"GD" "WE"'
	enabled		%SFBool;	"true"
	description	%SFString;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoViewpoint ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoViewpoint
	geoSystem	%MFString; '"GD" "WE"'
	description	%SFString;	#IMPLIED
	position	%SFVec3d;	"0 0 100000"
	orientation	%SFRotation;	"0 0 1 0"
	fieldOfView	%SFFloat;	"0.785398"
	jump		%SFBool;	"true"
	navType		%MFString;	'"EXAMINE" "ANY"'
	headlight	%SFBool;	"true"
	speedFactor	%SFFloat;	"1.0"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>
]]>
<!-- Note that setting JointNames as enumerations does not permit validation of other names. -->
<![%HAnimComponent;[
<!ENTITY % JointNames "(
c1|c2|c3|c4|c5|c6|c7|jaw|HumanoidRoot|l_acromioclavicular|l_ankle|l_calf|
l_clavicle|l_elbow|l_eyeball|l_eyeball_joint|l_eyebrow|l_eyebrow_joint|
l_eyelid|l_eyelid_joint|l_forearm|l_forefoot|l_hand|l_hindfoot|l_hip|
l_index_distal|l_index_metacarpal|l_index_middle|l_index_proximal|
l_index0|l_index1|l_index2|l_index3|l_knee|l_metatarsal|l_middistal|
l_middle_distal|l_middle_metacarpal|l_middle_middle|l_middle_proximal|
l_middle0|l_middle1|l_middle2|l_middle3|l_midproximal|l_midtarsal|
l_pinky_distal|l_pinky_metacarpal|l_pinky_middle|l_pinky_proximal|
l_pinky0|l_pinky1|l_pinky2|l_pinky3|l_ring_distal|l_ring_metacarpal|
l_ring_middle|l_ring_proximal|l_ring0|l_ring1|l_ring2|l_ring3|l_scapula|
l_shoulder|l_sternoclavicular|l_subtalar|l_thigh|l_thumb_distal|
l_thumb_metacarpal|l_thumb_proximal|l_thumb1|l_thumb2|l_thumb3|
l_upperarm|l_wrist|l1|l2|l3|l4|l5|pelvis|r_acromioclavicular|r_ankle|
r_calf|r_clavicle|r_elbow|r_eyeball|r_eyeball_joint|r_eyebrow|
r_eyebrow_joint|r_eyelid|r_eyelid_joint|r_forearm|r_forefoot|r_hand|
r_hindfoot|r_hip|r_index_distal|r_index_metacarpal|r_index_middle|
r_index_proximal|r_index0|r_index1|r_index2|r_index3|r_knee|r_metatarsal|
r_middistal|r_middle_distal|r_middle_metacarpal|r_middle_middle|
r_middle_proximal|r_middle0|r_middle1|r_middle2|r_middle3|r_midproximal|
r_midtarsal|r_pinky_distal|r_pinky_metacarpal|r_pinky_middle|
r_pinky_proximal|r_pinky0|r_pinky1|r_pinky2|r_pinky3|r_ring_distal|
r_ring_metacarpal|r_ring_middle|r_ring_proximal|r_ring0|r_ring1|r_ring2|
r_ring3|r_scapula|r_shoulder|r_sternoclavicular|r_subtalar|r_thigh|
r_thumb_distal|r_thumb_metacarpal|r_thumb_proximal|r_thumb1|r_thumb2|
r_thumb3|r_upperarm|r_wrist|sacroiliac|sacrum|skull|skullbase|
t1|t2|t3|t4|t5|t6|t7|t8|t9|t10|t11|t12|temporomandibular|
vc1|vc2|vc3|vc4|vc5|vc6|vc7|vl1|vl2|vl3|vl4|vl5|
vt1|vt2|vt3|vt4|vt5|vt6|vt7|vt8|vt9|vt10|vt11|vt12)" >

<!ELEMENT HAnimDisplacer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST HAnimDisplacer
	name		%SFString;	#IMPLIED
	coordIndex	%MFInt32;	#IMPLIED
	displacements	%MFVec3f;	#IMPLIED
	weight		%SFFloat;	"0.0"
	containerField NMTOKEN "displacers"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT HAnimHumanoid (IS?, (%MetadataNodes;)?,
	(HAnimJoint*,	HAnimSegment*, HAnimSite*, (%CoordinateNodes;)?, (%NormalNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) ) >
<!-- skeleton/joints,	segments,      sites,      skinCoord,            skinNormal,       skin/viewpoints -->
<!-- note that joints, segments and sites should be USE nodes.  skin Shapes will USE preceding skinCoord, skinNormal definitions. -->
<!ATTLIST HAnimHumanoid
	name			%SFString;	#IMPLIED
	version			%SFString;	#IMPLIED
	info			%MFString;	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<!--	not treated as separate attributes, instead these are
	encoded as "attribute=value" SFString entries in the
	MFString info field.

	humanoidVersion		%SFString;	#IMPLIED
	authorName		%SFString;	#IMPLIED
	authorEmail		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	creationDate		%SFString;	#IMPLIED
	usageRestrictions	%SFString;	#IMPLIED
	age			%SFString;	#IMPLIED
	gender			%SFString;	#IMPLIED
	height			%SFString;	#IMPLIED
	weight			%SFString;	#IMPLIED
-->
<![%HAnimComponent;[
<!ELEMENT HAnimJoint (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|HAnimDisplacer|%WildcardNodes; )* ) >
<!ATTLIST HAnimJoint
	name			%JointNames;	#IMPLIED
	ulimit			%MFFloat;	#IMPLIED
	llimit			%MFFloat;	#IMPLIED
	limitOrientation	%SFRotation;	"0 0 1 0"
	skinCoordIndex		%MFInt32;	#IMPLIED
	skinCoordWeight		%MFFloat;	#IMPLIED
	stiffness		%MFFloat;	"0 0 0"
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!-- Multiple HAnimDisplacer nodes must appear consecutively inside HAnimSegment -->

<!ELEMENT HAnimSegment (IS?, (%MetadataNodes;)?, (
	((%ChildrenNodes;|%WildcardNodes;)*, ((Coordinate, HAnimDisplacer*)|(HAnimDisplacer+, Coordinate?))? ) |
	(Coordinate, (((%ChildrenNodes;)*, HAnimDisplacer*)|(HAnimDisplacer+, (%ChildrenNodes;|%WildcardNodes;)*))? ) |
	(HAnimDisplacer+, ((Coordinate, (%ChildrenNodes;|%WildcardNodes;)*)|((%ChildrenNodes;|%WildcardNodes;)*, Coordinate?))? )?
) ) >
<!ATTLIST HAnimSegment
	name			%JointNames;	#IMPLIED
	mass			%SFFloat;	"0"
	centerOfMass		%SFVec3f;	"0 0 0"
	momentsOfInertia	%MFFloat;	"0 0 0 0 0 0 0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT HAnimSite (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST HAnimSite
	name			%SFString;	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<![%NurbsComponent;[
<!ELEMENT Contour2D (IS?, (%MetadataNodes;)?, ( %NurbsControlCurveNodes;|%WildcardNodes; )* ) >
<!ATTLIST Contour2D
	containerField NMTOKEN "trimmingContour"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT ContourPolyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ContourPolyline2D
	point		%MFVec2f;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- child CoordinateNode has containerField controlPoint -->
<!ELEMENT NurbsCurve ( (IS?), (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )? ) >
<!ATTLIST NurbsCurve
	knot		%MFDouble;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFDouble;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN 		"geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsCurve2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NurbsCurve2D
	controlPoint	%MFVec2d;	#IMPLIED
	knot		%MFDouble;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFDouble;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsOrientationInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsOrientationInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsPositionInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsPositionInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsSurfaceInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsSurfaceInterpolator
	weight		%MFDouble;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT NurbsSet (IS?, (%MetadataNodes;)?, (NurbsPatchSurface|NurbsSweptSurface|NurbsSwungSurface|NurbsTrimmedSurface|%WildcardNodes; )* ) >
<!ATTLIST NurbsSet
	tessellationScale	%SFFloat;	"1.0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT NurbsPatchSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )?, ( %TextureCoordinateNodes;|NurbsTextureCoordinate)? ) >
<!ATTLIST NurbsPatchSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFDouble;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTrimmedSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )?, ( %TextureCoordinateNodes;|NurbsTextureCoordinate)?, Contour2D* ) >
<!ATTLIST NurbsTrimmedSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFDouble;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSweptSurface (IS?, (%MetadataNodes;)?, (NurbsCurve|%WildcardNodes; )?, ( %NurbsControlCurveNodes;|%WildcardNodes; )? ) >
<!ATTLIST NurbsSweptSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSwungSurface (IS?, (%MetadataNodes;)?, ( ( %NurbsControlCurveNodes;|%WildcardNodes; ), ( %NurbsControlCurveNodes;|%WildcardNodes; )? )? ) >
<!ATTLIST NurbsSwungSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTextureCoordinate ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsTextureCoordinate
	controlPoint	%MFVec2f;	#IMPLIED
	weight		%MFFloat;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "texCoord"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>
]]>
<![%CadComponent;[
<!ELEMENT CADAssembly (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|CADPart|%WildcardNodes;)*)>
<!ATTLIST CADAssembly
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	name	 %SFString;  #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CADFace (IS?, (%MetadataNodes;)?, (Shape|LOD|%WildcardNodes;)*)>
<!ATTLIST CADFace
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	name	 %SFString;  #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CADLayer (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|%WildcardNodes;)*)>
<!ATTLIST CADLayer
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	name	 %SFString;  #IMPLIED
	visible	 %MFBool;  #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CADPart (IS?, (%MetadataNodes;)?, (CADFace|%WildcardNodes;)*)>
<!ATTLIST CADPart
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	center %SFVec3f; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	name	 %SFString;  #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT QuadSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*)>
<!ATTLIST QuadSet
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT IndexedQuadSet ( (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*) ) >
<!ATTLIST IndexedQuadSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
]]>
<![%CubeMapTexturingComponent;[
<!-- containerField values:  front back left right top bottom.  could use rule for 0..6 children here -->
<!ELEMENT ComposedCubeMapTexture (IS?, (%MetadataNodes;)?, (%Texture2DNodes;)* )>
<!ATTLIST ComposedCubeMapTexture
	containerField NMTOKEN "texture"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
<!ELEMENT GeneratedCubeMapTexture (IS?, (%MetadataNodes;)? )>
<!ATTLIST GeneratedCubeMapTexture
	update (NONE|NEXT_FRAME_ONLY|ALWAYS)            "NONE"
	size	%SFInt32;	"128"
	containerField NMTOKEN "texture"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
<!ELEMENT ImageCubeMapTexture  (IS?, (%MetadataNodes;)? )>
<!ATTLIST ImageCubeMapTexture
	url		%MFString;	#IMPLIED
	containerField NMTOKEN "texture"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
]]>
<!-- parent content model and default containerField names for most ShadersComponent nodes is not clear.. -->
<![%ShadersComponent;[
<!ELEMENT ComposedShader ( (IS?), (%MetadataNodes;)?, (ShaderPart|%WildcardNodes;)*, (field)* ) >
<!ATTLIST ComposedShader
	language	 %SFString;  #IMPLIED
	containerField CDATA "shaders"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT FloatVertexAttribute ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FloatVertexAttribute
	value		%MFFloat; #IMPLIED
	name		%SFString; #IMPLIED
	numComponents (1|2|3|4)            "4"
	containerField CDATA "attrib"
	class	CDATA	#IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>
<!ELEMENT Matrix3VertexAttribute ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Matrix3VertexAttribute
	value		%MFMatrix3f; #IMPLIED
	name		%SFString; #IMPLIED
	containerField CDATA "attrib"
	class	CDATA	#IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>
<!ELEMENT Matrix4VertexAttribute ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Matrix4VertexAttribute
	value		%MFMatrix4f; #IMPLIED
	name		%SFString; #IMPLIED
	containerField CDATA "attrib"
	class	CDATA	#IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>
<!ELEMENT PackagedShader ( (IS?), (%MetadataNodes;)?, (field)* ) >
<!ATTLIST PackagedShader
	language	 %SFString;  #IMPLIED
	containerField CDATA "shaders"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ProgramShader ( (IS?), (%MetadataNodes;)?, (ShaderProgram|%WildcardNodes;)*, (field)* ) >
<!ATTLIST ProgramShader
	language	 %SFString;  #IMPLIED
	containerField CDATA "shaders"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ShaderPart ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ShaderPart
	url		%MFString;	#IMPLIED
	type	 ( VERTEX|FRAGMENT )  #IMPLIED
	containerField NMTOKEN "parts"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ShaderProgram ( (IS?), (%MetadataNodes;)?, (field)* ) >
<!ATTLIST ShaderProgram
	url		%MFString;	#IMPLIED
	type	 ( VERTEX|FRAGMENT )  #IMPLIED
	containerField NMTOKEN "programs"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
]]>
<![%Texture3DComponent;[
<!ELEMENT Composed3DTexture ((IS?), (%MetadataNodes;)?, (%Texture2DNodes;)*)>
<!ATTLIST Composed3DTexture
	repeatS %SFBool; "false"
	repeatT %SFBool; "false"
	repeatR %SFBool; "false"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT Image3DTexture ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Image3DTexture
	url %MFString; #IMPLIED
	repeatS %SFBool; "false"
	repeatT %SFBool; "false"
	repeatR %SFBool; "false"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT Pixel3DTexture ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Pixel3DTexture
	image %MFInt32; "0 0 0 0"
	repeatS %SFBool; "false"
	repeatT %SFBool; "false"
	repeatR %SFBool; "false"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TextureCoordinate3D ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate3D
	point %MFVec3f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TextureCoordinate4D ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate4D
	point %MFVec4f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TextureMatrixTransform ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureMatrixTransform
	matrix      %SFMatrix4f; "1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>
<!ELEMENT TextureTransform3D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureTransform3D
	center      %SFVec3f; "0 0 0"
	rotation    %SFRotation; "0 0 1 0"
	scale       %SFVec3f; "1 1 1"
	translation %SFVec3f; "0 0 0"
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT LocalFog ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST LocalFog
	enabled		%SFBool; "true"
	color		%SFColor; "1 1 1"
	fogType 	(LINEAR|EXPONENTIAL) "LINEAR"
	visibilityRange %SFFloat;            "0"
	containerField NMTOKEN "children"
	class	CDATA	#IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>

<!ELEMENT FogCoordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST FogCoordinate
	depth %MFVec3f; #IMPLIED
	containerField NMTOKEN "fogCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
]]>

<!-- Finally, Web3dExtensionComponent from separate DTDs.  Note that Web3dExtensionComponent
     content-model extensions needed to be added at beginning,	prior to node-type definitions. -->
<![%Web3dExtensionComponent;[

<!ENTITY % Web3dExtensionsPublicDTD  SYSTEM "x3d-3.1-Web3dExtensionsPublic.dtd">
<!ENTITY % Web3dExtensionsPrivateDTD SYSTEM "x3d-3.1-Web3dExtensionsPrivate.dtd">

%Web3dExtensionsPublicDTD;
%Web3dExtensionsPrivateDTD;

]]>

A.3.2 x3d-3.1-InputOutputFields.dtd

x3d-3.1-InputOutputFields.dtd extends the X3D version 3.1 DTD by also including fields with accessType inputOnly and outputOnly. Although X3D scene files cannot validly set values for any of these attributes, the DTD defines names and relationships of all fields and can be used by DTD-aware processing tools.

<!--
#
# X3D InputOutputFields DTD:
#
#	http://www.web3d.org/specifications/x3d-3.1-InputOutputFields.dtd
#
#	current version:  3.1.0
#
#	revised:          2 September 2007
#
#	Author:           Don Brutzman
#
# Purpose: the primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by field definitions in x3d-3.1-InputOutputFields.dtd
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.1.dtd
#	http://www.web3d.org/specifications/x3d-3.1-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.1-Web3dExtensions.dtd
#
# Typical system location for this resource is adjacent to x3d-3.1.dtd:
#	file://c:/www.web3d.org/specifications/x3d-3.1-InputOutputFields.dtd
#	  file:///www.web3d.org/specifications/x3d-3.1-InputOutputFields.dtd
#
# changelog:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
# Note on typing:
#	CDATA used for %SFBool; definitions to allow #FIXED "" initialization,
#	  since DTD rules otherwise require enumeration values to be
#	  initialized to true|false.
#
-->

<!ATTLIST AudioClip
	elapsedTime   %SFTime;    #FIXED ""
	duration_changed %SFTime; #FIXED ""
	isPaused      CDATA       #FIXED ""
	isActive      CDATA       #FIXED "">

<!ATTLIST Background
	set_bind    CDATA      #FIXED ""
	bindTime    %SFTime;   #FIXED ""
	isBound     CDATA      #FIXED "">

<!ATTLIST BooleanFilter
	set_boolean CDATA #FIXED ""
	inputTrue   CDATA #FIXED ""
	inputFalse  CDATA #FIXED ""
	inputNegate CDATA #FIXED "">

<!-- value_changed is CDATA instead of %SFBool% in order to set empty value on an enumeration -->

<!ATTLIST BooleanSequencer
	set_fraction %SFFloat; #FIXED ""
	value_changed    CDATA  #FIXED ""
	previous CDATA   #FIXED ""
	next     CDATA   #FIXED "">

<!ATTLIST BooleanToggle
	set_boolean CDATA #FIXED "">

<!ATTLIST BooleanTrigger
	set_triggerTime %SFTime; #FIXED ""
	triggerTrue     CDATA    #FIXED "">

<!ATTLIST Collision
	collideTime %SFTime;   #FIXED ""
	isActive    CDATA      #FIXED "">

<!ATTLIST ColorInterpolator
	set_fraction    %SFFloat; #FIXED ""
	value_changed       %SFColor; #FIXED "">

<!ATTLIST CoordinateInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %MFVec3f; #FIXED "">

<!ATTLIST CoordinateInterpolator2D
	set_fraction %SFFloat; #FIXED ""
	value_changed    %MFVec2f; #FIXED "">

<!ATTLIST CylinderSensor
	isActive   CDATA     	#FIXED ""
	isOver     CDATA     	#FIXED ""
	rotation_changed   %SFRotation; #FIXED ""
	trackPoint_changed %SFVec3f;    #FIXED "">

<!ATTLIST ElevationGrid
	set_height      %MFFloat; #FIXED "">

<!ATTLIST Extrusion
	set_crossSection %MFVec2f;    #FIXED ""
	set_orientation  %MFRotation; #FIXED ""
	set_scale        %MFVec2f;    #FIXED ""
	set_spine        %MFVec3f;    #FIXED "">

<!ATTLIST Fog
	set_bind        CDATA      #FIXED ""
	bindTime        %SFTime;   #FIXED ""
	isBound         CDATA      #FIXED "">

<!ATTLIST IndexedFaceSet
	set_colorIndex      %MFInt32; #FIXED ""
	set_coordIndex      %MFInt32; #FIXED ""
	set_normalIndex     %MFInt32; #FIXED ""
	set_texCoordIndex   %MFInt32; #FIXED "">

<!ATTLIST IndexedLineSet
	set_colorIndex  %MFInt32; #FIXED ""
	set_coordIndex  %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleFanSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleStripSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST IntegerSequencer
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFInt32; #FIXED ""
	previous CDATA   #FIXED ""
	next     CDATA   #FIXED "">

<!ATTLIST IntegerTrigger
	set_boolean  CDATA #FIXED ""
	triggerValue %SFInt32;   #FIXED "">

<!ATTLIST KeySensor
	isActive		CDATA      	#FIXED ""
	keyPress		%SFString;	#FIXED ""
	keyRelease		%SFString;	#FIXED ""
	actionKeyPress		%SFInt32;	#FIXED ""
	actionKeyRelease	%SFInt32;	#FIXED ""
	altKey			CDATA  		#FIXED ""
	controlKey		CDATA  		#FIXED ""
	shiftKey		CDATA  		#FIXED "">

<!ATTLIST LoadSensor
	isActive		CDATA       	#FIXED ""
	isLoaded		CDATA  		#FIXED ""
	loadTime		%SFTime;	#FIXED ""
	progress		%SFFloat;	#FIXED "">

<!ATTLIST LOD
	level_changed		%SFInt32;	#FIXED "">

<!ATTLIST MovieTexture
	elapsedTime       %SFTime;  #FIXED ""
	duration_changed  %SFTime;  #FIXED ""
	isPaused          CDATA     #FIXED ""
	isActive          CDATA     #FIXED "">

<!ATTLIST NavigationInfo
	set_bind        CDATA      #FIXED ""
	bindTime        %SFTime;   #FIXED ""
	transitionComplete         CDATA      #FIXED ""
	isBound         CDATA      #FIXED "">

<!ATTLIST NormalInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %MFVec3f; #FIXED "">

<!ATTLIST OrientationInterpolator
	set_fraction %SFFloat;    #FIXED ""
	value_changed    %SFRotation; #FIXED "">

<!ATTLIST PlaneSensor
	isActive    CDATA  	#FIXED ""
	isOver      CDATA     	#FIXED ""
	trackPoint_changed  %SFVec3f; #FIXED ""
	translation_changed %SFVec3f; #FIXED "">

<!ATTLIST PositionInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFVec3f; #FIXED "">

<!ATTLIST PositionInterpolator2D
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFVec2f; #FIXED "">

<!ATTLIST ProximitySensor
	isActive    CDATA     	 #FIXED ""
	position_changed    %SFVec3f;    #FIXED ""
	orientation_changed %SFRotation; #FIXED ""
	centerOfRotation_changed  %SFVec3f;	#FIXED ""
	enterTime   %SFTime;     #FIXED ""
	exitTime    %SFTime;     #FIXED "">

<!ATTLIST ScalarInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFFloat; #FIXED "">

<!ATTLIST SphereSensor
	isActive   CDATA     	#FIXED ""
	isOver      CDATA     	#FIXED ""
	rotation_changed   %SFRotation; #FIXED ""
	trackPoint_changed %SFVec3f;    #FIXED "">

<!ATTLIST StringSensor
	isActive		CDATA     	#FIXED ""
	enteredText		%SFString;	#FIXED ""
	finalText		%SFString;	#FIXED "">

<!ATTLIST Text
	lineBounds     %MFVec2f;   #FIXED ""
	textBounds     %SFVec2f;   #FIXED "">

<!ATTLIST TextureBackground
	set_bind     CDATA      #FIXED ""
	bindTime     %SFTime;   #FIXED ""
	isBound      CDATA      #FIXED "">

<!ATTLIST TimeSensor
	elapsedTime   %SFTime;  #FIXED ""
	cycleTime     %SFTime;  #FIXED ""
	fraction_changed  %SFFloat; #FIXED ""
	isActive      CDATA    	#FIXED ""
	isPaused      CDATA    	#FIXED ""
	time          %SFTime;  #FIXED "">

<!ATTLIST TimeTrigger
	set_boolean  CDATA #FIXED ""
	triggerTime %SFTime;   #FIXED "">

<!ATTLIST TouchSensor
	hitNormal_changed    %SFVec3f; 	#FIXED ""
	hitPoint_changed     %SFVec3f; 	#FIXED ""
	hitTexCoord_changed  %SFVec2f; 	#FIXED ""
	isActive     CDATA     #FIXED ""
	isOver       CDATA     #FIXED ""
	touchTime    %SFTime;  #FIXED "">

<!ATTLIST Viewpoint
	set_bind    CDATA        #FIXED ""
	bindTime    %SFTime;     #FIXED ""
	isBound     CDATA        #FIXED "">

<!ATTLIST VisibilitySensor
	enterTime %SFTime;  #FIXED ""
	exitTime  %SFTime;  #FIXED ""
	isActive  CDATA     #FIXED "">

<!ATTLIST EspduTransform
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
	set_articulationParameterValue0		%SFFloat;	#FIXED ""
	set_articulationParameterValue1		%SFFloat;	#FIXED ""
	set_articulationParameterValue2		%SFFloat;	#FIXED ""
	set_articulationParameterValue3		%SFFloat;	#FIXED ""
	set_articulationParameterValue4		%SFFloat;	#FIXED ""
	set_articulationParameterValue5		%SFFloat;	#FIXED ""
	set_articulationParameterValue6		%SFFloat;	#FIXED ""
	set_articulationParameterValue7		%SFFloat;	#FIXED ""
	articulationParameterValue0_changed	%SFFloat;	#FIXED ""
	articulationParameterValue1_changed	%SFFloat;	#FIXED ""
	articulationParameterValue2_changed	%SFFloat;	#FIXED ""
	articulationParameterValue3_changed	%SFFloat;	#FIXED ""
	articulationParameterValue4_changed	%SFFloat;	#FIXED ""
	articulationParameterValue5_changed	%SFFloat;	#FIXED ""
	articulationParameterValue6_changed	%SFFloat;	#FIXED ""
	articulationParameterValue7_changed	%SFFloat;	#FIXED ""
	isCollided   				CDATA		#FIXED ""
	collideTime   				%SFTime;	#FIXED ""
	isDetonated   				CDATA		#FIXED ""
	detonateTime   				%SFTime;	#FIXED ""
	firedTime   				%SFTime;	#FIXED ""
>
<!ATTLIST ReceiverPdu
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
>

<!ATTLIST SignalPdu
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
>

<!ATTLIST TransmitterPdu
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
>

<!ATTLIST GeoElevationGrid
	set_height	%MFDouble; 	#FIXED "">

<!ATTLIST GeoPositionInterpolator
	set_fraction	 %SFFloat;	#FIXED ""
	value_changed	 %SFVec3f;	#FIXED ""
	geovalue_changed %SFVec3d;	#FIXED "">

<!ATTLIST GeoTouchSensor
	isActive		CDATA		#FIXED ""
	isOver			CDATA		#FIXED ""
	touchTime		%SFTime;	#FIXED ""
	hitGeoCoord_changed	%SFVec3d;	#FIXED ""
	hitNormal_changed	%SFVec3f;	#FIXED ""
	hitPoint_changed	%SFVec3f;	#FIXED ""
	hitTexCoord_changed 	%SFVec2f;	#FIXED "">

<!ATTLIST GeoViewpoint
	set_bind        CDATA        #FIXED ""
	set_orientation %SFRotation; #FIXED ""
	set_position    %SFVec3d;    #FIXED ""
	bindTime        %SFTime;     #FIXED ""
	isBound         CDATA        #FIXED "">

<!ATTLIST NurbsOrientationInterpolator
	set_fraction		%SFFloat;	#FIXED ""
	value_changed		%SFRotation;	#FIXED "">

<!ATTLIST NurbsPositionInterpolator
	set_fraction		%SFFloat;	#FIXED ""
	value_changed		%SFVec3f;	#FIXED "">

<!ATTLIST NurbsSurfaceInterpolator
	set_fraction		%SFVec2f;	#FIXED ""
	normal_changed		%SFVec3f;	#FIXED ""
	position_changed	%SFVec3f;	#FIXED "">

<!ATTLIST IndexedQuadSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST ComposedShader
	isSelected  CDATA #FIXED ""
	isValid  CDATA #FIXED ""
	activate CDATA #FIXED "">

<!ATTLIST PackagedShader
	isSelected  CDATA #FIXED ""
	isValid  CDATA #FIXED ""
	activate CDATA #FIXED "">

<!ATTLIST ProgramShader
	isSelected  CDATA #FIXED ""
	isValid  CDATA #FIXED ""
	activate CDATA #FIXED "">

A.3.3 x3d-3.1-Web3dExtensionsPublic.dtd

The public X3D DTD extension will be used to contain approved extensions that have not yet been included in Part 1 of ISO/IEC 19775. The form of the public X3D DTD extension is depicted below:

<!--
#
# X3D Web3D Extensions Public DTD:
#
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPublic.dtd
#
#	current version:  3.1.0
#
#	created:          30 April 2005
#	revised:          30 April 2005
#
#	Maintainer:       Don Brutzman
#
# Purpose: support Web3D Consortium extensions to the X3D tagset.
# The primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by node definitions in x3d-3.0-Web3dExtensionsPublic.dtd
# and x3d-3.0-Web3dExtensionsPrivate.dtd
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.0.dtd
#	http://www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPrivate.dtd
#
# Web3D extensions update URL:
#	http://www.web3d.org/x3d/content/x3d-3.0-Web3dExtensionsPublic.dtd
#
# changelog:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
-->

<!-- ================================================================= -->

<!ENTITY % LatticeXvlComponent	"INCLUDE">

<!--
		LatticeXVL 1.0 Document Type Definition (DTD)

Description:	Define the XVL tag and attribute profile for X3D.
  
		This X3D native node corresponds to a VRML ExternProto
		declaration.

 		Elements in this tagset are enabled by setting the 
		XvlProfile entity to "INCLUDE" at the top of an 
		X3D scene file, as shown in several examples such as
		examples/LatticeXvl/XvlShellAll.x3d.  This flag then 
		triggers inclusion of the XVL tags in the 
		x3d-3.0.dtd tagset. 

 Status:	Complete

 Authors:	Lattice Technology, Inc. proposed the Xvl extensions,
		Makito Seki produced XML encoding of XVL nodes for X3D
		with additional work by Marc Jablonski and Don Brutzman

 Reference:	LatticeXvl extension for X3D
 		http://www.web3d.org/x3d/content/examples/LatticeXvl/doc/proposal/LatticeProposal.html
 		http://www.Xvl3D.com

 Issues:	Mark Jablonski maintains the list.

 Created:	10 May 2001
-->

<![%LatticeXvlComponent;[

<!-- for future: G1T1 level -->

<!ENTITY % XvlG1T1ShellTypes "" >

<!-- Types of XVL Shells -->

<!ENTITY % XvlShell.shellTypes " %XvlG1T1ShellTypes; POLYGON_MESH | LATTICE_MESH " >


<!ELEMENT   XvlShell (IS?, (%MetadataNodes;)?, (
	( (%TextureCoordinateNodes;), ((%CoordinateNodes;) | %WildcardNodes;)  ) |
	( (%CoordinateNodes;), ((%TextureCoordinateNodes;) | %WildcardNodes;)? ) |
	( %WildcardNodes;, ((%TextureCoordinateNodes;) | (%CoordinateNodes;) | %WildcardNodes;)?) )?
)>
<!ATTLIST   XvlShell
	shellType          ( %XvlShell.shellTypes; )  #IMPLIED
	numberOfDivisions  	%SFInt32;	#IMPLIED
	vertexRound        	%MFFloat;	#IMPLIED
	edgeBeginCoordIndex	%MFInt32;	#IMPLIED
	edgeEndCoordIndex  	%MFInt32;	#IMPLIED
	edgeRound          	%MFFloat;	#IMPLIED
	edgeBeginVector    	%MFVec3f;	#IMPLIED
	edgeEndVector      	%MFVec3f;	#IMPLIED
	faceCoordIndex     	%MFInt32;	#IMPLIED
	faceTexCoordIndex  	%MFInt32;	#IMPLIED
	faceEmpty          	%MFBool; 	#IMPLIED
	faceHidden         	%MFBool; 	#IMPLIED
	containerField 		NMTOKEN "geometry"
	class		 	CDATA		""
	DEF                	ID      	#IMPLIED
	USE                	IDREF   	#IMPLIED>

]]>

<!-- ================================================================= -->

A.3.4 x3d-3.1-Web3dExtensionsPrivate.dtd

The private X3D DTD extension will be used to contain X3D extensions that have not been approved but may exist for testing future development. The form of the private X3D DTD extension is depicted below:

<!--
#
# X3D Web3D Extensions Private DTD:
#
#	http://www.web3d.org/specifications/x3d-3.1-Web3dExtensionsPrivate.dtd
#
#	current version:  3.1.0
#
#	created:          30 April 2005
#	revised:          30 April 2005
#
#	Maintainer:       Don Brutzman
#
# Purpose: support Web3D Consortium extensions to the X3D tagset.
# The primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by node definitions in x3d-3.1-Web3dExtensionsPublic.dtd
# and x3d-3.1-Web3dExtensionsPrivate.dtd
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.1.dtd
#	http://www.web3d.org/specifications/x3d-3.1-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.1-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.1-Web3dExtensionsPrivate.dtd
#
# Web3D extensions update URL:
#	http://www.web3d.org/x3d/content/x3d-3.1-Web3dExtensionsPublic.dtd
#
# changelog:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
-->

<!-- ================================================================= -->

	<!-- Enter ELEMENT and ATTLIST definitions here -->

<!-- ================================================================= -->

A.4 Version 3.2 dtds

A.4.1 x3d-3.2.dtd

x3d-3.2.dtd is the X3D DTD that validates X3D version 3.2 content:

<!--
# Extensible 3D (X3D) Specification Document Type Definition (DTD) x3d-3.2.dtd
#
#	http://www.web3d.org/specifications/x3d-3.2.dtd
#
#	current version:  3.2.2
#
#	created:          30 April 2005
#
#	Author:           Don Brutzman
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.2.dtd
#	http://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPrivate.dtd
#
# X3D Revision DTDs:
#	http://www.web3d.org/x3d/content/x3d-3.2.dtd
#	http://www.web3d.org/x3d/content/x3d-3.2-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/x3d/content/x3d-3.2-Web3dExtensionsPrivate.dtd
#
# Final doctype:
#  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.2//EN" "http://www.web3d.org/specifications/x3d-3.2.dtd">
#
# Transitional doctype:
#  <!DOCTYPE X3D PUBLIC "http://www.web3d.org/specifications/x3d-3.2.dtd" "file:///www.web3d.org/specifications/x3d-3.2.dtd">
#
# Typical system location for this resource:
#	file://c:/www.web3d.org/specifications/x3d-3.2.dtd
#	  file:///www.web3d.org/specifications/x3d-3.2.dtd
#
# Change log:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
# Further information on the Extensible 3D (X3D) specification is available at
#	http://www.web3D.org/x3d.html
-->
<!--	Profile:  default is Full profile and all components.
	Authors can override these default IGNORE/INCLUDE values.
	If InterchangeProfile or InteractiveProfile is INCLUDEd, then IGNORE all others. -->
<!ENTITY % FullProfile "INCLUDE">
<!ENTITY % ImmersiveProfile "INCLUDE">
<!ENTITY % InterchangeProfile "IGNORE">
<!ENTITY % InteractiveProfile "IGNORE">
<!ENTITY % CadComponent "INCLUDE">
<!ENTITY % CubeMapTexturingComponent "INCLUDE">
<!ENTITY % DISComponent "INCLUDE">
<!ENTITY % GeoSpatialComponent "INCLUDE">
<!ENTITY % HAnimComponent "INCLUDE">
<!ENTITY % NurbsComponent "INCLUDE">
<!ENTITY % ShadersComponent "INCLUDE">
<!ENTITY % Texture3DComponent "INCLUDE">
<!ENTITY % LayeringComponent "INCLUDE">
<!ENTITY % LayoutComponent "INCLUDE">
<!ENTITY % RigidBodyPhysicsComponent "INCLUDE">
<!ENTITY % PickingSensorComponent "INCLUDE">
<!ENTITY % FollowersComponent "INCLUDE">
<!ENTITY % ParticleSystemsComponent "INCLUDE">
<!ENTITY % Web3dExtensionComponent "INCLUDE">
<!ENTITY % X3dInputOutputFields "INCLUDE">
<!ENTITY % X3dExtensions "IGNORE">
<!ENTITY % profileNames "(Core|Interchange|CADInterchange|Interactive|Immersive|Full|MPEG4Interactive)">
<!ENTITY % componentNames "(Core|CADGeometry|CubeMapTexturing|DIS|EnvironmentalEffects|EnvironmentalSensor|EventUtilities|Followers|Geometry2D|Geometry3D|Geospatial|Grouping|H-Anim|Interpolation|KeyDeviceSensor|Layering|Layout|Lighting|Navigation|Networking|NURBS|PointingDeviceSensor|Rendering|RigidBodyPhysics|Scripting|Shaders|Shape|Sound|Text|Texturing|Texturing3D|Time)">
<!ENTITY % componentLevels "(1|2|3|4|5)">
<!ENTITY % X3dFieldTypes "SFBool|MFBool|SFColor|MFColor|SFColorRGBA|MFColorRGBA|SFDouble|MFDouble|SFFloat|MFFloat|SFImage|MFImage|SFInt32|MFInt32|SFNode|MFNode|SFRotation|MFRotation|SFString|MFString|SFTime|MFTime|SFVec2f|MFVec2f|SFVec2d|MFVec2d|SFVec3f|MFVec3f|SFVec3d|MFVec3d|SFMatrix3d|MFMatrix3d|SFMatrix3f|MFMatrix3f|SFMatrix4d|MFMatrix4d|SFMatrix4f|MFMatrix4f|SFVec4d|MFVec4d|SFVec4f|MFVec4f">
<!-- X3D type definitions as DTD types -->
<!ENTITY % SFBool "(true|false)">
<!ENTITY % MFBool "CDATA">
<!ENTITY % SFColor "CDATA">
<!ENTITY % MFColor "CDATA">
<!ENTITY % SFColorRGBA "CDATA">
<!ENTITY % MFColorRGBA "CDATA">
<!ENTITY % SFFloat "CDATA">
<!ENTITY % MFFloat "CDATA">
<!ENTITY % SFDouble "CDATA">
<!ENTITY % MFDouble "CDATA">
<!ENTITY % SFImage "CDATA">
<!ENTITY % MFImage "CDATA">
<!ENTITY % SFInt32 "CDATA">
<!ENTITY % MFInt32 "CDATA">
<!ENTITY % SFRotation "CDATA">
<!ENTITY % MFRotation "CDATA">
<!ENTITY % SFString "CDATA">
<!ENTITY % MFString "CDATA">
<!ENTITY % SFTime "CDATA">
<!ENTITY % MFTime "CDATA">
<!ENTITY % SFVec2f "CDATA">
<!ENTITY % MFVec2f "CDATA">
<!ENTITY % SFVec2d "CDATA">
<!ENTITY % MFVec2d "CDATA">
<!ENTITY % SFVec3f "CDATA">
<!ENTITY % MFVec3f "CDATA">
<!ENTITY % SFVec3d "CDATA">
<!ENTITY % MFVec3d "CDATA">
<!ENTITY % SFVec4f "CDATA">
<!ENTITY % MFVec4f "CDATA">
<!ENTITY % SFVec4d "CDATA">
<!ENTITY % MFVec4d "CDATA">
<!ENTITY % SFMatrix3f "CDATA">
<!ENTITY % MFMatrix3f "CDATA">
<!ENTITY % SFMatrix3d "CDATA">
<!ENTITY % MFMatrix3d "CDATA">
<!ENTITY % SFMatrix4f "CDATA">
<!ENTITY % MFMatrix4f "CDATA">
<!ENTITY % SFMatrix4d "CDATA">
<!ENTITY % MFMatrix4d "CDATA">
<!ENTITY % TextureCoordinateGeneratorModes "(SPHERE|CAMERASPACENORMAL|CAMERASPACEPOSITION|CAMERASPACEREFLECTIONVECTOR|SPHERE-LOCAL|COORD|COORD-EYE|NOISE|NOISE-EYE|SPHERE-REFLECT|SPHERE-REFLECT-LOCAL)">
<!--	User needs to append | after listing each new node in any of these extensions.
	For an example, see examples/development/ProtoTagDtdDeclarationExamples.x3d   -->
<!ENTITY % AppearanceNodeExtensions "">
<!ENTITY % AudioClipNodeExtensions "">
<!ENTITY % BindableNodeExtensions "">
<!ENTITY % ColorNodeExtensions "">
<!ENTITY % CoordinateNodeExtensions "">
<!ENTITY % FontStyleNodeExtensions "">
<!ENTITY % EventUtilityNodeExtensions "">
<!ENTITY % GeometryNodeExtensions "">
<!ENTITY % GroupingNodeExtensions "">
<!ENTITY % InterpolatorNodeExtensions "">
<!ENTITY % LightNodeExtensions "">
<!ENTITY % MaterialNodeExtensions "">
<!ENTITY % MetadataNodeExtensions "">
<!ENTITY % NormalNodeExtensions "">
<!ENTITY % ScriptNodeExtensions "">
<!ENTITY % SensorNodeExtensions "">
<!ENTITY % ShapeNodeExtensions "">
<!ENTITY % SoundNodeExtensions "">
<!-- MovieTexture must be able to appear twice: -->
<!ENTITY % MovieTextureNodeExtensions "">
<!ENTITY % TextureNodeExtensions "">
<!ENTITY % TextureCoordinateNodeExtensions "">
<!ENTITY % TextureTransformNodeExtensions "">
<!ENTITY % NetworkSensorNodeExtensions "">
<!ENTITY % WorldInfoNodeExtensions "">
<!-- Users defining PROTOs do not override any of the following parameter entity declarations. -->
<![%ImmersiveProfile;[
<!ENTITY % WildcardNodes       	" (ProtoInstance) " >
]]>
<![%InterchangeProfile;[
<!ENTITY % WildcardNodes       	" " >
]]>
<![%DISComponent;[
<!ENTITY % DISGroupingNodes	" EspduTransform|SignalPdu|ReceiverPdu|TransmitterPdu|DISEntityManager|" >
]]>
<![%GeoSpatialComponent;[
<!ENTITY % GeoCoordinateNode		" GeoCoordinate|" >
<!ENTITY % GeoElevationGridNode		" GeoElevationGrid|" >
<!ENTITY % GeoGroupingNodes		" GeoLocation|GeoLOD|GeoTransform|" >
<!ENTITY % GeoMetadataNode		" GeoMetadata|" >
<!ENTITY % GeoOriginNode		" GeoOrigin|" >
<!ENTITY % GeoBehaviorNodes		" GeoPositionInterpolator|GeoTouchSensor|GeoProximitySensor|" >
<!ENTITY % GeoViewpointNode		" GeoViewpoint|" >
]]>
<![%HAnimComponent;[
<!ENTITY % HAnimGroupingNodes		" HAnimJoint|HAnimSegment|HAnimSite|HAnimHumanoid|" >
<!ENTITY % DisplacerNode		" HAnimDisplacer|" >
]]>
<![%NurbsComponent;[
<!ENTITY % NurbsGeometryNodes	  " NurbsCurve|NurbsCurve2D|NurbsPatchSurface|NurbsSweptSurface|NurbsSwungSurface|NurbsTrimmedSurface|" >
<!ENTITY % NurbsInterpolators	  " NurbsPositionInterpolator|NurbsOrientationInterpolator|NurbsSurfaceInterpolator|" >
<!ENTITY % NurbsControlCurveNodes " NurbsCurve2D|Contour2D|ContourPolyline2D " >
]]>
<![%CadComponent;[
<!ENTITY % CadGeometryNodes	  " QuadSet|IndexedQuadSet|" >
<!ENTITY % CadGroupingNodes	  " CADAssembly|CADLayer|" >
]]>
<![%RigidBodyPhysicsComponent;[
<!ENTITY % RigidBodyPhysicsGroupingNodes	  " CollidableShape|CollisionSensor|RigidBodyCollection| " >
]]>
<![%CubeMapTexturingComponent;[
<!ENTITY % CubeMapTextureNodes	  " ComposedCubeMapTexture|GeneratedCubeMapTexture|ImageCubeMapTexture " >
]]>
<![%ShadersComponent;[
<!ENTITY % ShaderNodes	  " ComposedShader|PackagedShader|ProgramShader " >
<!ENTITY % ShaderAttributeNodes	  " FloatVertexAttribute|Matrix3VertexAttribute|Matrix4VertexAttribute" >
]]>
<![%Texture3DComponent;[
<!ENTITY % Texture3DTextureNodes		" ComposedTexture3D|ImageTexture3D|PixelTexture3D " >
<!ENTITY % Texture3DTextureCoordinateNodes	  " TextureCoordinate3D|TextureCoordinate4D| " >
<!ENTITY % Texture3DTextureTransformNodes	  " TextureMatrixTransform|TextureTransform3D " >
]]>
<![%FollowersComponent;[
<!ENTITY % FollowerNodes  "ColorDamper|CoordinateDamper|OrientationChaser|OrientationDamper|PositionChaser|PositionChaser2D|PositionDamper|PositionDamper2D|ScalarChaser|TexCoordDamper2D" >
]]>
<![%Web3dExtensionComponent;[
<!--
<!ENTITY % Web3dExtensionGeometryNodes	" XvlShell|" >
-->
]]>
<!-- otherwise set tag lists to null strings if not previously defined -->
<!ENTITY % DISGroupingNodes "">
<!ENTITY % GeoCoordinateNode "">
<!ENTITY % GeoElevationGridNode "">
<!ENTITY % GeoGroupingNodes "">
<!ENTITY % GeoMetadataNode "">
<!ENTITY % GeoOriginNode "">
<!ENTITY % GeoBehaviorNodes "">
<!ENTITY % GeoViewpointNode "">
<!ENTITY % HAnimGroupingNodes "">
<!ENTITY % DisplacerNode "">
<!ENTITY % NurbsGeometryNodes "">
<!ENTITY % NurbsInterpolators "">
<!ENTITY % CadGroupingNodes "">
<!ENTITY % RigidBodyPhysicsGroupingNodes "">
<!ENTITY % CadGeometryNodes "">
<!ENTITY % CubeMapTextureNodes "">
<!ENTITY % ShaderNodes "">
<!ENTITY % ShaderAttributeNodes "">
<!ENTITY % Texture3DTextureNodes "">
<!ENTITY % Texture3DTextureCoordinateNodes "">
<!ENTITY % Texture3DTextureTransformNodes "">
<!ENTITY % FollowerNodes "">
<!ENTITY % Web3dExtensionGroupingNodes "">
<!ENTITY % Web3dExtensionGeometryNodes "">
<!-- no further content-model extensions needed -->
<![%InterchangeProfile;[
<!ENTITY % AudioClipNodes "" >
<!ENTITY % FontStyleNodes "" >
<!ENTITY % EventUtilityNodes "" >
<!ENTITY % MovieTextureNodes "" >
<!ENTITY % NormalNodes "" >
<!ENTITY % ScriptNodes "" >
<!ENTITY % SoundNodes "" >
<!ENTITY % TextureCoordinateNodes "" >
<!ENTITY % TextureTransformNodes "" >
]]>
<!-- NetworkSensorNodes used by LoadSensor -->
<!ENTITY % NetworkSensorNodes " %NetworkSensorNodeExtensions; AudioClip|ImageCubeMapTexture|ImageTexture|ImageTexture3D|Inline|MovieTexture|PackagedShader|ShaderPart|ShaderProgram ">
<![%ImmersiveProfile;[

<!ENTITY % AudioClipNodes		" %AudioClipNodeExtensions; AudioClip " >

<!ENTITY % FontStyleNodes		" %FontStyleNodeExtensions; FontStyle " >

<!ENTITY % EventUtilityNodes		" %EventUtilityNodeExtensions; BooleanFilter|BooleanSequencer|BooleanToggle|BooleanTrigger|IntegerSequencer|IntegerTrigger|TimeTrigger " >

<!ENTITY % MovieTextureNodes		" %MovieTextureNodeExtensions; MovieTexture " >

<!ENTITY % NormalNodes			" %NormalNodeExtensions; Normal " >

<!ENTITY % ScriptNodes			" %ScriptNodeExtensions; Script " >

<!ENTITY % SoundNodes			" %SoundNodeExtensions; Sound " >

<!ENTITY % TextureCoordinateNodes	" %TextureCoordinateNodeExtensions; %Texture3DTextureCoordinateNodes; TextureCoordinate|TextureCoordinateGenerator|MultiTextureCoordinate|NurbsTextureCoordinate " >

<!ENTITY % TextureTransformNodes	" %TextureTransformNodeExtensions; TextureTransform|MultiTextureTransform " >

<!ENTITY % AllTextureTransformNodes	" %TextureTransformNodes;|%Texture3DTextureTransformNodes; " >
]]>
<![%InterchangeProfile;[
<!ENTITY % AppearanceNodes  	" Appearance " >

<!ENTITY % BehaviorLeafNodes	" CoordinateInterpolator|KeySensor|OrientationInterpolator|PositionInterpolator|ScalarInterpolator|TimeSensor|TouchSensor " >

<!ENTITY % BindableNodes    	" Background|NavigationInfo|Viewpoint " >

<!ENTITY % ColorNodes       	" Color|ColorRGBA " >

<!ENTITY % CoordinateNodes  	" Coordinate|CoordinateDouble|FogCoordinate " >

<!ENTITY % GeometryNodes    	" IndexedFaceSet|IndexedLineSet|LineSet|PointSet " >

<!ENTITY % GroupingNodes    	" Anchor|Group|Inline|Transform " >

<!ENTITY % LightNodes       	" DirectionalLight " >

<!ENTITY % MaterialNodes    	" Material|TwoSidedMaterial " >

<!ENTITY % ShapeNodes       	" Shape " >

<!ENTITY % Texture2DNodes     " ImageTexture " >

<!ENTITY % WorldInfoNodes   	" WorldInfo " >
]]>
<![%ImmersiveProfile;[

<!ENTITY % AppearanceNodes  	" %AppearanceNodeExtensions; Appearance " >

<!ENTITY % BehaviorLeafNodes	" %InterpolatorNodeExtensions; %SensorNodeExtensions; %ScriptNodeExtensions; %GeoBehaviorNodes; %DisplacerNode; %NurbsInterpolators; %EventUtilityNodes;|ColorInterpolator|CoordinateInterpolator|CoordinateInterpolator2D|CylinderSensor|KeySensor|LoadSensor|LocalFog|NormalInterpolator|OrientationInterpolator|PlaneSensor|PositionInterpolator|PositionInterpolator2D|ProximitySensor|ScalarInterpolator|Script|SphereSensor|SquadOrientationInterpolator|StringSensor|TimeSensor|TouchSensor|VisibilitySensor " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % BindableNodes    	" %BindableNodeExtensions; %GeoViewpointNode; Background|Fog|NavigationInfo|TextureBackground|Viewpoint|OrthoViewpoint " >

<!ENTITY % ColorNodes       	" %ColorNodeExtensions; Color|ColorRGBA " >

<!ENTITY % CoordinateNodes  	" %CoordinateNodeExtensions; %GeoCoordinateNode; Coordinate|CoordinateDouble " >

<!ENTITY % Geometry2DNodes    " Arc2D|ArcClose2D|Circle2D|Disk2D|Polyline2D|Polypoint2D|Rectangle2D|TriangleSet2D| " >

<!ENTITY % GeometryNodes    	" %GeometryNodeExtensions; %GeoElevationGridNode; %NurbsGeometryNodes; %CadGeometryNodes; %Web3dExtensionGeometryNodes; %Geometry2DNodes; Box|Cone|Cylinder|ElevationGrid|Extrusion|IndexedFaceSet|IndexedLineSet|LineSet|PointSet|Sphere|Text|IndexedTriangleFanSet|IndexedTriangleSet|IndexedTriangleStripSet|TriangleFanSet|TriangleSet|TriangleStripSet " >

<!ENTITY % GroupingNodes    	" %GroupingNodeExtensions; %DISGroupingNodes; %GeoGroupingNodes; %HAnimGroupingNodes; %CadGroupingNodes; %RigidBodyPhysicsGroupingNodes; %Web3dExtensionGroupingNodes; Anchor|Billboard|Collision|Group|Inline|LOD|StaticGroup|Switch|Transform|ViewpointGroup " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % LightNodes       	" %LightNodeExtensions; DirectionalLight|SpotLight|PointLight " >

<!ENTITY % MaterialNodes    	" %MaterialNodeExtensions; Material|TwoSidedMaterial " >

<!ENTITY % ShapeNodes       	" %ShapeNodeExtensions; Shape " >

<!ENTITY % Texture2DNodes     " %TextureNodeExtensions; ImageTexture|MovieTexture|MultiTexture|PixelTexture " >

<!ENTITY % AllTextureNodes    " %Texture2DNodes;|%CubeMapTextureNodes;|%Texture3DTextureNodes; " >

<!ENTITY % MultiTextureChildTextures " %TextureNodeExtensions; ImageTexture|MovieTexture|PixelTexture " >

<!ENTITY % WorldInfoNodes   	" %WorldInfoNodeExtensions; %GeoMetadataNode; WorldInfo " >
]]>
<![%InterchangeProfile;[
<!ENTITY % ComposedGeometryNodes " %ColorNodes; " >

<!ENTITY % AppearanceChildNodes	" %MaterialNodes; " >

<!ENTITY % SceneLeafNodes   	" %LightNodes;|%ShapeNodes;|%WorldInfoNodes; " >

<!ENTITY % MetadataNodes 	" %MetadataNodeExtensions; MetadataDouble|MetadataFloat|MetadataInteger|MetadataSet|MetadataString ">

<!ENTITY % ProtoNodes       	"" >
]]>
<![%ImmersiveProfile;[
<!ENTITY % ComposedGeometryNodes " %ShaderAttributeNodes;|%CoordinateNodes;|%ColorNodes;|%NormalNodes;|%TextureCoordinateNodes;|FogCoordinate " >

<!ENTITY % AppearanceChildNodes	" LineProperties|FillProperties|%MaterialNodes;|%Texture2DNodes;|%CubeMapTextureNodes;|%ShaderNodes;|%Texture3DTextureNodes;|%TextureTransformNodes;|%Texture3DTextureTransformNodes; " >

<!ENTITY % SceneLeafNodes   	" %GeoOriginNode; %LightNodes;|%ShapeNodes;|%SoundNodes;|%WorldInfoNodes; " >

<!ENTITY % OtherLeafNodes   	" AudioClip|LineProperties|FillProperties " >

<!ENTITY % MetadataNodes 	" %MetadataNodeExtensions; MetadataDouble|MetadataFloat|MetadataInteger|MetadataSet|MetadataString ">

<!ENTITY % ProtoNodes       	" %OtherLeafNodes;|%AppearanceNodes;|%AppearanceChildNodes;|%BehaviorLeafNodes;|%BindableNodes;|%CubeMapTextureNodes;|%FontStyleNodes;|%ComposedGeometryNodes;|%GeometryNodes;|%GroupingNodes;|ShaderPart|ShaderProgram|%MetadataNodes;|%SceneLeafNodes;|%Texture3DTextureNodes;|%Texture3DTextureTransformNodes;|Contour2D|ContourPolyline2D|%FollowerNodes;|BallJoint|CollidableOffset|CollisionCollection|CollisionSpace|Contact|DoubleAxisHingeJoint|MotorJoint|RigidBody|SingleAxisHingeJoint|SliderJoint|UniversalJoint|ProtoDeclare|ExternProtoDeclare|ProtoInstance " >
]]>
<!ENTITY % ChildrenNodes " %BehaviorLeafNodes;|%BindableNodes;|%GroupingNodes;|%SceneLeafNodes;|%FollowerNodes;|ProtoDeclare|ExternProtoDeclare|ROUTE|EXPORT|IMPORT ">
<![%InterchangeProfile;[
<!ENTITY % SceneNodes       	" %ChildrenNodes;|%WildcardNodes; " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % SceneNodes       	" ExternProtoDeclare|ProtoDeclare|%ChildrenNodes;|%WildcardNodes; " >
]]>
<!-- SensorNodes not used (yet, anyway) in tagset content-model definitions. -->
<!ENTITY % SensorNodes " Anchor|Collision|CylinderSensor|KeySensor|PlaneSensor|ProximitySensor|SphereSensor|StringSensor|TimeSensor|TouchSensor|VisibilitySensor ">
<!ENTITY % DragSensors " CylinderSensor|PlaneSensor|SphereSensor ">
<!ENTITY % EnvironmentalSensorNodes " Collision|ProximitySensor|TimeSensor|VisibilitySensor ">
<!ENTITY % PointingDeviceSensors " Anchor|CylinderSensor|PlaneSensor|SphereSensor|TouchSensor ">
<!ENTITY % KeyDeviceSensors " ">
<!ENTITY % InterpolatorNodes " ColorInterpolator|CoordinateInterpolator|CoordinateInterpolator2D|NormalInterpolator|OrientationInterpolator|PositionInterpolator|PositionInterpolator2D|ScalarInterpolator |SquadOrientationInterpolator">
<!ENTITY % TimeDependentNodes " AudioClip|MovieTexture|TimeSensor ">
<!-- ***** X3D DTD ***** -->
<![%ImmersiveProfile;[
<!ELEMENT Anchor (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST Anchor
	description %SFString; #IMPLIED
	parameter   %MFString; #IMPLIED
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED >
]]>
<![%InterchangeProfile;[
<!ELEMENT Anchor (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* >
<!ATTLIST Anchor
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED >
]]>
<![%InterchangeProfile;[
<!ELEMENT Appearance ( (%MetadataNodes;)?,
(  ((%MaterialNodes;), (%Texture2DNodes;)?  )
 | ((%Texture2DNodes;),  (%MaterialNodes;)? )
)? ) >
]]>
<!-- TODO restore

 -->
<!ELEMENT Appearance (IS?, (%MetadataNodes;)?, (%AppearanceChildNodes; | %WildcardNodes;)*)>
<!ATTLIST Appearance
	containerField NMTOKEN "appearance"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT AudioClip ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST AudioClip
	description %SFString; #IMPLIED
	loop        %SFBool;   "false"
	pitch       %SFFloat;  "1.0"
	startTime   %SFTime;   "0"
	stopTime    %SFTime;   "0"
	pauseTime   %SFTime;   "0"
	resumeTime  %SFTime;   "0"
	url         %MFString; #IMPLIED
	containerField NMTOKEN "source"
	class       CDATA      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED>
]]>
<!ELEMENT Background ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Background
	groundAngle %MFFloat; #IMPLIED
	groundColor %MFColor; #IMPLIED
	backUrl %MFString; #IMPLIED
	bottomUrl %MFString; #IMPLIED
	frontUrl %MFString; #IMPLIED
	leftUrl %MFString; #IMPLIED
	rightUrl %MFString; #IMPLIED
	topUrl %MFString; #IMPLIED
	skyAngle %MFFloat; #IMPLIED
	skyColor %MFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT Billboard (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST Billboard
	axisOfRotation %SFVec3f; "0 1 0"
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class	 CDATA     #IMPLIED
	DEF            ID        #IMPLIED
	USE            IDREF     #IMPLIED>

<!ELEMENT BooleanFilter ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanFilter
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFBool; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanToggle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanToggle
	toggle      %SFBool;  "false"
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanTrigger
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!-- Geometry2D nodes -->

<!ELEMENT Arc2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Arc2D
	radius     %SFFloat; "1"
	startAngle %SFFloat; "0"
	endAngle   %SFFloat; "1.570796"
	containerField NMTOKEN "geometry"
	class      CDATA    #IMPLIED
	DEF  ID    #IMPLIED
	USE  IDREF #IMPLIED>

<!ELEMENT ArcClose2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ArcClose2D
	radius      %SFFloat; "1"
	startAngle  %SFFloat; "0"
	endAngle    %SFFloat; "1.570796"
	closureType (PIE|CHORD) "PIE"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class       CDATA    #IMPLIED
	DEF  ID     #IMPLIED
	USE  IDREF  #IMPLIED>

<!ELEMENT Circle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Circle2D
	radius     %SFFloat; "1"
	containerField NMTOKEN "geometry"
	class      CDATA    #IMPLIED
	DEF  ID    #IMPLIED
	USE  IDREF #IMPLIED>

<!ELEMENT Disk2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Disk2D
	innerRadius %SFFloat; "0"
	outerRadius %SFFloat; "1"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class       CDATA    #IMPLIED
	DEF  ID     #IMPLIED
	USE  IDREF  #IMPLIED>

<!ELEMENT Polyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polyline2D
	lineSegments %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT Polypoint2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polypoint2D
	point       %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT Rectangle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Rectangle2D
	size         %SFVec2f; "2 2"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT TriangleSet2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TriangleSet2D
	vertices     %MFVec2f; #IMPLIED
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT Box ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Box
	size  %SFVec3f; "2 2 2"
	solid %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF  ID        #IMPLIED
	USE  IDREF     #IMPLIED>

<!ELEMENT Collision ( (IS?), (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* )  >
<!ATTLIST Collision
	enabled     %SFBool;  "true"
	bboxCenter  %SFVec3f; "0 0 0"
	bboxSize    %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED >
]]>
<!ELEMENT Color ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Color
	color %MFColor; #IMPLIED
	class CDATA #IMPLIED
	containerField NMTOKEN "color"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ColorRGBA ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ColorRGBA
	color %MFColorRGBA; #IMPLIED
	containerField NMTOKEN "color"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT component EMPTY>
<!ATTLIST component
	name %componentNames; #REQUIRED
	level %componentLevels; #REQUIRED
>
<![%ImmersiveProfile;[
<!ELEMENT ColorInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ColorInterpolator
	key         %MFFloat; #IMPLIED
	keyValue    %MFColor; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT Cone ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cone
	bottomRadius %SFFloat; "1"
	height       %SFFloat; "2"
	side         %SFBool;  "true"
	bottom       %SFBool;  "true"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Coordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Coordinate
	point %MFVec3f; #IMPLIED
	containerField NMTOKEN "coord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CoordinateDouble ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateDouble
	point %MFVec3d; #IMPLIED
	containerField NMTOKEN "coord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CoordinateInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT CoordinateInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CoordinateInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT Cylinder ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cylinder
	bottom   %SFBool; "true"
	height   %SFFloat; "2"
	radius   %SFFloat; "1"
	side     %SFBool;  "true"
	top      %SFBool;  "true"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT CylinderSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CylinderSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	diskAngle  %SFFloat;    "0.26179167"
	maxAngle   %SFFloat;    "-1"
	minAngle   %SFFloat;    "0"
	offset     %SFFloat;    "0"
	enabled    %SFBool;     "true"
	containerField NMTOKEN "children"
	class	CDATA     #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>

<!ELEMENT DirectionalLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST DirectionalLight
	ambientIntensity %SFFloat; "0"
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	global         %SFBool;  "false"
	containerField NMTOKEN "children"
	class	   CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[
<!ELEMENT DirectionalLight (%MetadataNodes;)? >
<!ATTLIST DirectionalLight
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!-- Complete, concisely enumerated unordered version of ElevationGrid by Heiko Grussbach -->
<!ELEMENT ElevationGrid (IS?, (%MetadataNodes;)?, (
   ((%ColorNodes;), (		((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
|((%NormalNodes;), (		((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
|((%TextureCoordinateNodes;), (((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
|(%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
)?, (FogCoordinate)? ) >

<!ATTLIST ElevationGrid
	height          %MFFloat; #IMPLIED
	ccw             %SFBool;  "true"
	colorPerVertex  %SFBool;  "true"
	creaseAngle     %SFFloat; "0"
	normalPerVertex %SFBool;  "true"
	solid           %SFBool;  "true"
	xDimension      %SFInt32; "0"
	xSpacing        %SFFloat; "1.0"
	zDimension      %SFInt32; "0"
	zSpacing        %SFFloat; "1.0"
	containerField NMTOKEN "geometry"
	class	  CDATA     #IMPLIED
	DEF             ID        #IMPLIED
	USE             IDREF     #IMPLIED>

<!ELEMENT ExternProtoDeclare ( field* ) >
<!ATTLIST ExternProtoDeclare
	name		NMTOKEN		#REQUIRED
	url		%MFString;	#REQUIRED
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT Extrusion ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Extrusion
	beginCap     %SFBool;     "true"
	ccw          %SFBool;     "true"
	convex       %SFBool;     "true"
	creaseAngle  %SFFloat;    "0.0"
	crossSection %MFVec2f;    "1 1 1 -1 -1 -1 -1 1 1 1"
	endCap       %SFBool;     "true"
	orientation  %MFRotation; "0 0 1 0"
	scale        %MFVec2f;    "1 1"
	solid        %SFBool;     "true"
	spine        %MFVec3f;    "0 0 0 0 1 0"
	containerField NMTOKEN "geometry"
	class        CDATA        #IMPLIED
	DEF          ID           #IMPLIED
	USE          IDREF        #IMPLIED>

<!-- field is only used in a Script, ProtoDeclare or ExternProtoDeclare.
     Initialization values for simple types go in the value attribute.
     Contained content tags are only for initialization of SFNode or MFNode values. -->

<!ELEMENT field  ( %ProtoNodes; )* >
<!ATTLIST field
	name       	NMTOKEN  	#REQUIRED
	accessType (inputOnly|outputOnly|initializeOnly|inputOutput) #REQUIRED
	type 	   ( %X3dFieldTypes; ) #REQUIRED
	value      	CDATA   	#IMPLIED
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!-- fieldValue resets default field values inside a ProtoInstance.
     Initialization values for simple types go in the value attribute.  Otherwise
     contained-content tags are used for initialization of SFNode or MFNode values. -->

<!ELEMENT fieldValue ( %ProtoNodes; )* >
<!ATTLIST fieldValue
	name	NMTOKEN	#REQUIRED
	value	CDATA	#IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT FillProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FillProperties
	filled   %SFBool;   "true"
	hatched  %SFBool;   "true"
	hatchStyle  %SFInt32;      "1"
	hatchColor  %SFColor;      "1 1 1"
	containerField NMTOKEN "fillProperties"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT Fog ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Fog
	color           %SFColor;            "1 1 1"
	fogType         (LINEAR|EXPONENTIAL) "LINEAR"
	visibilityRange %SFFloat;            "0"
	containerField NMTOKEN "children"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT FontStyle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FontStyle
	family      %MFString; '"SERIF"'
	horizontal  %SFBool;   "true"
	justify     %MFString; '"BEGIN"'
	language    %SFString; #IMPLIED
	leftToRight %SFBool;   "true"
	size        %SFFloat;  "1.0"
	spacing     %SFFloat;  "1.0"
	style       (PLAIN|BOLD|ITALIC|BOLDITALIC) "PLAIN"
	topToBottom %SFBool;   "true"
	containerField NMTOKEN "fontStyle"
	class       CDATA       #IMPLIED
	DEF         ID          #IMPLIED
	USE         IDREF       #IMPLIED>
<!-- Minimum supported values:
	family  ' "SERIF" "SANS" "TYPEWRITER" '
	justify ' "FIRST" "BEGIN" "MIDDLE" "END" ' -->
]]>
<!ELEMENT Group (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Group
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ImageTexture ((IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)?)>
<!ATTLIST ImageTexture
	url %MFString; #IMPLIED
	repeatS %SFBool; "true"
	repeatT %SFBool; "true"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- Complete, unordered, concisely enumerated version of IndexedFaceSet content model by Heiko Grussbach -->
<!ENTITY % ColorCoordinateNormalTextureCoordinateContentModel "(IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	((%CoordinateNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	   			(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%CoordinateNodes;), (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%NormalNodes;),  (
 	((%ColorNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
|(%WildcardNodes;,  (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)?, (FogCoordinate)? )">
<![%ImmersiveProfile;[
<!ELEMENT IndexedFaceSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*) >

<!ELEMENT IndexedLineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >

<!ELEMENT LineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT IndexedFaceSet ( (%MetadataNodes;)?, ((%ColorNodes;), Coordinate?)|(Coordinate, (%ColorNodes;)?) )? >

<!ELEMENT IndexedLineSet ( (%MetadataNodes;)?, ( Color, Coordinate? )|( Coordinate, Color?) )? >

<!ELEMENT LineSet ( (%MetadataNodes;)?, ( Color, Coordinate? )|( Coordinate, Color?) )? >
]]>
<!ATTLIST IndexedFaceSet
	ccw %SFBool; "true"
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	convex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	creaseAngle %SFFloat; "0"
	normalIndex %MFInt32; #IMPLIED
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	texCoordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ATTLIST IndexedLineSet
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ATTLIST LineSet
	vertexCount %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Inline ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Inline
	load %SFBool; "true"
	url %MFString; #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT EXPORT EMPTY>
<!ATTLIST EXPORT
	localDEF IDREF #REQUIRED
	AS NMTOKEN #IMPLIED
>
<!ELEMENT IMPORT EMPTY>
<!ATTLIST IMPORT
	inlineDEF IDREF #REQUIRED
	importedDEF NMTOKEN #REQUIRED
	AS ID #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT IntegerSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFInt32; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IntegerTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerTrigger
	integerKey   %SFInt32; "-1"
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IS (connect)+ >

<!ELEMENT connect EMPTY >
<!ATTLIST connect
	nodeField   NMTOKEN #REQUIRED
	protoField  NMTOKEN #REQUIRED>
]]>
<!ELEMENT KeySensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST KeySensor
	enabled %SFBool; "true"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT LineProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST LineProperties
	applied %SFBool; "true"
	linetype %SFInt32; "1"
	linewidthScaleFactor %SFFloat; "0"
	containerField NMTOKEN "lineProperties"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>
]]>
<!ELEMENT LoadSensor (IS?, (%MetadataNodes;)?, (%NetworkSensorNodes; | %WildcardNodes;)*)>
<!ATTLIST LoadSensor
	enabled %SFBool; "true"
	timeOut %SFTime; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT LOD (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST LOD
	forceTransitions %SFBool; "false"
	center %SFVec3f; "0 0 0"
	range  %MFFloat; #IMPLIED
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT Material ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Material
	ambientIntensity %SFFloat; "0.2"
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	shininess        %SFFloat; "0.2"
	specularColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class       CDATA          #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[
<!ELEMENT Material ( (%MetadataNodes;)? ) >
<!ATTLIST Material
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class       	 CDATA     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<!-- *** XHTML exerpts to define meta tag *** -->
<!-- i18n, language, meta tag definitions from XHTML 1.0
     http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd -->
<!ENTITY % LanguageCode "NMTOKEN">
<!-- a language code, as per [IETF RFC3066/BCP47] ftp://ftp.isi.edu/in-notes/bcp/bcp47.txt -->
<!-- internationalization attributes
  lang        language code (backwards compatible)
  xml:lang    language code (as per XML 1.0 spec)
  dir         direction for weak/neutral text
-->
<!ENTITY % i18n "lang        %LanguageCode; #IMPLIED
  xml:lang    %LanguageCode; #IMPLIED
  dir         (ltr|rtl)      #IMPLIED">
<!ELEMENT head (component*, meta*)>
<!-- generic metadata information, matches HTML usage, made attribute 'name' required -->
<!ELEMENT meta EMPTY>
<!ATTLIST meta
	http-equiv CDATA #IMPLIED
	name CDATA #REQUIRED
	content CDATA #REQUIRED
	scheme CDATA #IMPLIED
	%i18n;
>
<!-- formal X3D Metadata nodes -->
<!ELEMENT MetadataDouble (IS?, (%MetadataNodes; | %WildcardNodes;)?)>
<!ATTLIST MetadataDouble
	name %SFString; #IMPLIED
	value %MFDouble; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MetadataFloat (IS?, (%MetadataNodes; | %WildcardNodes;)?)>
<!ATTLIST MetadataFloat
	name %SFString; #IMPLIED
	value %MFFloat; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MetadataInteger (IS?, (%MetadataNodes; | %WildcardNodes;)?)>
<!ATTLIST MetadataInteger
	name %SFString; #IMPLIED
	value %MFInt32; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MetadataString (IS?, (%MetadataNodes; | %WildcardNodes;)?)>
<!ATTLIST MetadataString
	name %SFString; #IMPLIED
	value %MFString; #IMPLIED
	reference %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- containerField discriminates whether child Metadata node(s) are 'metadata' or 'value' fields.
	NMTOKEN vice enumeration, since containerField might have another value as field in a ProtoInstance. -->
<!ELEMENT MetadataSet (IS?, (%MetadataNodes; | %WildcardNodes;)*)>
<!ATTLIST MetadataSet
	reference %SFString; #IMPLIED
	name %SFString; #IMPLIED
	containerField NMTOKEN "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!-- FAQ:  MovieTexture
	containerField='source'  when used as a Sound source,
	containerField='texture' when used as a Appearance texture source-->
<!ELEMENT MovieTexture ( (IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)? ) >
<!ATTLIST MovieTexture
	loop      %SFBool;   "false"
	speed     %SFFloat;  "1.0"
	startTime %SFTime;   "0"
	stopTime  %SFTime;   "0"
	url       %MFString; #IMPLIED
	repeatS   %SFBool;   "true"
	repeatT   %SFBool;   "true"
	pauseTime %SFTime;   "0"
	resumeTime %SFTime;  "0"
	containerField NMTOKEN "texture"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTexture ( (IS?), (%MetadataNodes;)?, (%MultiTextureChildTextures;|%WildcardNodes; )* ) >
<!ATTLIST MultiTexture
	mode           %MFString;	#IMPLIED
	source         %MFString;	#IMPLIED
	function       %MFString;	#IMPLIED
	color          %SFColor;  "1 1 1"
	alpha          %SFFloat;  "1.0"
	containerField NMTOKEN "texture"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTextureCoordinate ((IS?), (%MetadataNodes;)?, (TextureCoordinate|TextureCoordinateGenerator|ProtoInstance)* ) >
<!ATTLIST MultiTextureCoordinate
	containerField NMTOKEN "texCoord"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>
]]>
<!ELEMENT NavigationInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST NavigationInfo
	avatarSize %MFFloat; "0.25 1.6 0.75"
	headlight %SFBool; "true"
	speed %SFFloat; "1"
	type %MFString; ""EXAMINE" "ANY""
	transitionType %MFString; ""ANIMATE""
	transitionTime %MFFloat; "1.0"
	visibilityLimit %SFFloat; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT Normal ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Normal
	vector    %MFVec3f; #IMPLIED
	containerField NMTOKEN "normal"
	class	  CDATA     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>

<!ELEMENT NormalInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NormalInterpolator
	key      %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<!ELEMENT OrientationInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST OrientationInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFRotation; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT SquadOrientationInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST SquadOrientationInterpolator
	closed %SFBool;  "false"
	key %MFFloat; #IMPLIED
	keyValue %MFRotation; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PixelTexture ( (IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)? ) >
<!ATTLIST PixelTexture
	image   %SFImage; "0 0 0"
	repeatS %SFBool;  "true"
	repeatT %SFBool;  "true"
	containerField NMTOKEN "texture"
	class   CDATA     #IMPLIED
	DEF     ID        #IMPLIED
	USE     IDREF     #IMPLIED>

<!ELEMENT PlaneSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PlaneSensor
	description %SFString; #IMPLIED
	autoOffset  %SFBool;  "true"
	enabled     %SFBool;  "true"
	maxPosition %SFVec2f; "-1 -1"
	minPosition %SFVec2f; "0 0"
	offset      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT PointLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PointLight
	ambientIntensity %SFFloat;	"0"
	attenuation      %SFVec3f;	"1 0 0"
	color            %SFColor;	"1 1 1"
	intensity        %SFFloat;	"1"
	location         %SFVec3f;	"0 0 0"
	on               %SFBool;	"true"
	radius	 	 %SFFloat;	"100"
	global         %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA    	#IMPLIED
	DEF	  	 ID		#IMPLIED
	USE		 IDREF		#IMPLIED>

<!ELEMENT PointSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT PointSet ( (%MetadataNodes;)?, ( ( Color, Coordinate? )|( Coordinate, Color? ) )? ) >
]]>
<!ATTLIST PointSet
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST PositionInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT PositionInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PositionInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT ProtoInterface ( field* ) >

<!-- choice of required first node contained in ProtoBody constrained by valid ( %ProtoNodes; ) rather than %SceneNodes; ) >  -->

<!ELEMENT ProtoBody      ( ( %ProtoNodes; ), ( %SceneNodes; )* ) >

<!ELEMENT ProtoDeclare (ProtoInterface? , ProtoBody) > <!-- (|( field*, ( %ProtoNodes; ), ( %SceneNodes; )* )) -->
<!ATTLIST ProtoDeclare
	name 		NMTOKEN   	#REQUIRED
	appinfo		%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT ProtoInstance ( fieldValue* , (IS?) ) >
<!-- ( %SceneNodes; )* --><!-- direct children disallowed, let fieldValue name="children" handle them -->
<!ATTLIST ProtoInstance
	name     NMTOKEN           #REQUIRED
	containerField NMTOKEN "children"
	class	CDATA        #IMPLIED
	DEF      ID                #IMPLIED
	USE      IDREF             #IMPLIED>

<!ELEMENT ProximitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ProximitySensor
	center      %SFVec3f;    "0 0 0"
	size        %SFVec3f;    "0 0 0"
	enabled     %SFBool;     "true"
	containerField NMTOKEN "children"
	class       CDATA        #IMPLIED
	DEF         ID           #IMPLIED
	USE         IDREF        #IMPLIED>
]]>
<!ELEMENT ROUTE EMPTY>
<!ATTLIST ROUTE
	fromNode IDREF #REQUIRED
	fromField NMTOKEN #REQUIRED
	toNode IDREF #REQUIRED
	toField NMTOKEN #REQUIRED
>
<!ELEMENT ScalarInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ScalarInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFFloat; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Scene ((%MetadataNodes;)?, (%SceneNodes;)*)>
<!-- Script is similar to PROTO regarding user definition of multiple fields -->
<![%ImmersiveProfile;[
<!-- script code should be included as CDATA sections.  watch out on content-model order, originally ( #PCDATA|field )* -->

<!ELEMENT Script ( #PCDATA|%MetadataNodes;|field|IS )* >
<!ATTLIST Script
	url          %MFString; #IMPLIED
	directOutput %SFBool; "false"
	mustEvaluate %SFBool; "false"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
  	DEF ID       #IMPLIED
	USE IDREF    #IMPLIED>

<!ELEMENT Shape

((IS?, (%MetadataNodes;)?),
  (
     ( %AppearanceNodes;, ( %GeometryNodes;   | %WildcardNodes;  )? ) |
     ( (%GeometryNodes;), ( %AppearanceNodes; | %WildcardNodes;  )? ) |
     ( %WildcardNodes;,   ( %GeometryNodes;   | %AppearanceNodes; | %WildcardNodes; )? )
  )?
)
>
]]>
<![%InterchangeProfile;[
<!ELEMENT Shape ( (%MetadataNodes;)?,
	( (%AppearanceNodes;), ( %GeometryNodes; )? ) |
	( ( %GeometryNodes; ), (%AppearanceNodes;)? )?
) >
]]>
<!ATTLIST Shape
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT Sound (IS?, (%MetadataNodes;)?, ( %AudioClipNodes;|%MovieTextureNodes;|%WildcardNodes; )? ) >
<!ATTLIST Sound
	direction  %SFVec3f; "0 0 1"
	intensity  %SFFloat; "1"
	location   %SFVec3f; "0 0 0"
	maxBack    %SFFloat; "10"
	maxFront   %SFFloat; "10"
	minBack    %SFFloat; "1"
	minFront   %SFFloat; "1"
	priority   %SFFloat; "0"
	spatialize %SFBool;  "true"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT Sphere ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Sphere
	radius %SFFloat; "1"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT SphereSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SphereSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	enabled    %SFBool;     "true"
	offset     %SFRotation; "0 1 0 0"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT SpotLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SpotLight
	ambientIntensity %SFFloat; "0"
	attenuation      %SFVec3f; "1 0 0"
	beamWidth        %SFFloat; "1.570796"
	color            %SFColor; "1 1 1"
	cutOffAngle      %SFFloat; "0.785398"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	location         %SFVec3f; "0 0 0"
	on               %SFBool;  "true"
	radius           %SFFloat; "100"
	global         %SFBool;  "true"
	containerField NMTOKEN "children"
	class	   CDATA    #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>

<!ELEMENT StaticGroup (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST StaticGroup
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize   %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       CDATA       #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT StringSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST StringSensor
	enabled			%SFBool;	"true"
	deletionAllowed 	%SFBool;	"true"
	containerField NMTOKEN "children"
	class			CDATA    #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<!ELEMENT Switch (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Switch
	whichChoice %SFInt32; "-1"
	containerField NMTOKEN "children"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT Text (IS?, (%MetadataNodes;)?, ( (%FontStyleNodes;)?|%WildcardNodes; ) ) >
<!ATTLIST Text
	string    %MFString; #IMPLIED
	length    %MFFloat;  #IMPLIED
	maxExtent %SFFloat;  "0.0"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class       CDATA       #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!-- backTexture, bottomTexture, frontTexture, leftTexture, rightTexture, topTexture; could use rule for 0..6 children here -->
<!ELEMENT TextureBackground (IS?, (%MetadataNodes;)?, (%Texture2DNodes;)* )>
<!ATTLIST TextureBackground
	groundAngle  %MFFloat;  #IMPLIED
	groundColor  %MFColor;  #IMPLIED
	skyAngle     %MFFloat;  #IMPLIED
	skyColor     %MFColor;  "0 0 0"
	transparency %SFFloat;  "0"
	containerField NMTOKEN "children"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
]]>
<!ELEMENT TextureCoordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate
	point %MFVec2f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT TextureCoordinateGenerator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureCoordinateGenerator
	mode      %TextureCoordinateGeneratorModes;  "SPHERE"
	parameter %MFFloat;  #IMPLIED
	containerField NMTOKEN "texCoord"
	class       CDATA    #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>
	
<!ELEMENT TextureProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureProperties
	anisotropicDegree %SFFloat; "1.0"
	borderColor %SFColorRGBA; "0 0 0 0"
	borderWidth (0 | 1) "0"
	boundaryModeS %SFString; "REPEAT"
	boundaryModeT %SFString; "REPEAT"
	boundaryModeR %SFString; "REPEAT"
	magnificationFilter %SFString; "FASTEST"
	minificationFilter %SFString; "FASTEST"
	textureCompression %SFString; "FASTEST"
	texturePriority %SFFloat; "0.0"
	generateMipMaps %SFBool; "false"
	containerField NMTOKEN "textureProperties"
	class	  CDATA    #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT TextureTransform ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureTransform
	center      %SFVec2f; "0 0"
	rotation    %SFFloat; "0"
	scale       %SFVec2f; "1 1"
	translation %SFVec2f; "0 0"
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT MultiTextureTransform ((IS?), (TextureTransform|ProtoInstance)* ) >
<!ATTLIST MultiTextureTransform
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

]]>
<!ELEMENT TimeSensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TimeSensor
	cycleInterval %SFTime; "1.0"
	enabled %SFBool; "true"
	loop %SFBool; "false"
	startTime %SFTime; "0"
	stopTime %SFTime; "0"
	pauseTime %SFTime; "0"
	resumeTime %SFTime; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT TimeTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TimeTrigger
	containerField NMTOKEN "children"
	class    CDATA     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT TouchSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TouchSensor
	description %SFString; #IMPLIED
	enabled      %SFBool;  "true"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Transform (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Transform
	center %SFVec3f; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT IndexedTriangleFanSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST IndexedTriangleFanSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT IndexedTriangleSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST IndexedTriangleSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT IndexedTriangleStripSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST IndexedTriangleStripSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TriangleFanSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST TriangleFanSet
	fanCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TriangleSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST TriangleSet
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TriangleStripSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST TriangleStripSet
	stripCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Viewpoint ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Viewpoint
	fieldOfView %SFFloat; "0.785398"
	jump %SFBool; "true"
	orientation %SFRotation; "0 0 1 0"
	position %SFVec3f; "0 0 10"
	description %SFString; #IMPLIED
	centerOfRotation %SFVec3f; "0 0 0"
	retainUserOffsets %SFBool; "false"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- centerOfRotation point relates to NavigationInfo EXAMINE mode. -->
<![%ImmersiveProfile;[
<!ELEMENT OrthoViewpoint ((IS?), (%MetadataNodes;)?)>
<!ATTLIST OrthoViewpoint
	fieldOfView %MFFloat; "-1 -1 1 1"
	jump %SFBool; "true"
	orientation %SFRotation; "0 0 1 0"
	position %SFVec3f; "0 0 10"
	description %SFString; #IMPLIED
	centerOfRotation %SFVec3f; "0 0 0"
	retainUserOffsets %SFBool; "false"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ViewpointGroup ((IS?), (%MetadataNodes;)?, (Viewpoint | OrthoViewpoint | ViewpointGroup)* )>
<!ATTLIST ViewpointGroup
	center %SFVec3f; "0 0 0"
	description %SFString; #IMPLIED
	displayed %SFBool; "true"
	retainUserOffsets %SFBool; "false"
	size %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT VisibilitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST VisibilitySensor
	center    %SFVec3f; "0 0 0"
	enabled   %SFBool;  "true"
	size      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class     CDATA     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>
]]>
<!ELEMENT WorldInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST WorldInfo
	info %MFString; #IMPLIED
	title %SFString; #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT X3D (head?, Scene, ds:Signature?)>
<!ATTLIST X3D
	xmlns:xsd CDATA "http://www.w3.org/2001/XMLSchema-instance"
	xsd:noNamespaceSchemaLocation CDATA "http://www.web3d.org/specifications/x3d-3.2.xsd"
	profile %profileNames; #REQUIRED
	version (3.0 | 3.1 | 3.2) #REQUIRED
	xmlns:ds   CDATA "http://www.w3.org/2000/09/xmldsig#"
	xmlns:xenc CDATA "http://www.w3.org/2001/04/xmlenc#"
>
<!-- XML security:  digital signature (ds), encryption (xenc) -->

<!-- EspduTransform includes DIS CollisionPdu DetonatePdu FirePdu -->
<![%DISComponent;[
<!ELEMENT EspduTransform (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST EspduTransform
	enabled     %SFBool;  "true"
	marking 	 %SFString;	#IMPLIED
	siteID  	 %SFInt32;	"0"
	applicationID	 %SFInt32;	"1"
	entityID	 %SFInt32;	"0"
	forceID		 %SFInt32;	"0"
	entityKind	 %SFInt32;	"0"
	entityDomain	 %SFInt32;	"0"
	entityCountry	 %SFInt32;	"0"
	entityCategory	 %SFInt32;	"0"
	entitySubCategory %SFInt32;	"0"
	entitySpecific	 %SFInt32;	"0"
	entityExtra	 %SFInt32;	"0"
	readInterval	 %SFTime;	"0.1"
	writeInterval	 %SFTime;	"1.0"
	networkMode	 (standAlone|networkReader|networkWriter)	"standAlone"
	translation	 %SFVec3f;	"0 0 0"
	rotation	 %SFRotation;	"0 0 1 0"
	scale   	 %SFVec3f;	"1 1 1"
	scaleOrientation %SFRotation;	"0 0 1 0"
	bboxCenter	 %SFVec3f;	"0 0 0"
	bboxSize	 %SFVec3f;	"-1 -1 -1"
	center  	 %SFVec3f;	"0 0 0"
	address 	 	%SFString;	"localhost"
	port    	 	%SFInt32;	"0"
	multicastRelayHost 	%SFString;	#IMPLIED
	multicastRelayPort 	%SFInt32;	"0"
	rtpHeaderExpected  	%SFBool;	"false"
	deadReckoning  		%SFInt32;	"0"
	linearVelocity		%SFVec3f;	"0 0 0"
	linearAcceleration	%SFVec3f;	"0 0 0"
	fired1   		%SFBool;	"false"
	fired2   		%SFBool;	"false"
	collisionType	%SFInt32;	"0"
	detonationLocation	%SFVec3f;	"0 0 0"
	detonationRelativeLocation	%SFVec3f;	"0 0 0"
	detonationResult	%SFInt32;	"0"
	eventApplicationID	%SFInt32;	"1"
	eventEntityID	%SFInt32;	"0"
	eventNumber	%SFInt32;	"0"
	eventSiteID	%SFInt32;	"0"
	munitionStartPoint 	%SFVec3f;	"0 0 0"
	munitionEndPoint   	%SFVec3f;	"0 0 0"
	warhead			%SFInt32;	"0"
	fuse			%SFInt32;	"0"
	munitionQuantity	%SFInt32;	"0"
	firingRate		%SFInt32;	"0"
	firingRange		%SFFloat;	"0"
	munitionSiteID  	%SFInt32;	"0"
	munitionApplicationID	%SFInt32;	"1"
	munitionEntityID	%SFInt32;	"0"
	fireMissionIndex	%SFInt32;	"0"
	articulationParameterCount 		  %SFInt32;	"0"
	articulationParameterDesignatorArray 	  %MFInt32;	#IMPLIED
	articulationParameterChangeIndicatorArray %MFInt32;	#IMPLIED
	articulationParameterIdPartAttachedToArray  %MFInt32;	#IMPLIED
	articulationParameterTypeArray 		  %MFInt32;	#IMPLIED
	articulationParameterArray 		  %MFFloat;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED >

<!ELEMENT ReceiverPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ReceiverPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	receivedPower		%SFFloat;	"0.0"
	receiverState		%SFInt32;	"0"
	transmitterSiteID	%SFInt32;	"0"
	transmitterApplicationID %SFInt32;	"0"
	transmitterEntityID	%SFInt32;	"0"
	transmitterRadioID	%SFInt32;	"0"

	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

<!ELEMENT SignalPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SignalPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter		 %SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	encodingScheme		%SFInt32;	"0"
	tdlType			%SFInt32;	"0"
	sampleRate		%SFInt32;	"0"
	samples			%SFInt32;	"0"
	dataLength		%SFInt32;	"0"
	data			%MFInt32;	#IMPLIED

	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

<!ELEMENT TransmitterPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TransmitterPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	(standAlone|networkReader|networkWriter)	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	antennaLocation		%SFVec3f;	"0 0 0"
	antennaPatternLength	%SFInt32;	"0"
	antennaPatternType	%SFInt32;	"0"
	cryptoKeyID		%SFInt32;	"0"
	cryptoSystem		%SFInt32;	"0"
	frequency		%SFInt32;	"0"
	inputSource		%SFInt32;	"0"

	lengthOfModulationParameters	%SFInt32;	"0"
	modulationTypeDetail		%SFInt32;	"0"
	modulationTypeMajor		%SFInt32;	"0"
	modulationTypeSpreadSpectrum	%SFInt32;	"0"
	modulationTypeSystem		%SFInt32;	"0"
	power				%SFFloat;	"0.0"
	radioEntityTypeCategory		%SFInt32;	"0"
	radioEntityTypeCountry		%SFInt32;	"0"
	radioEntityTypeDomain		%SFInt32;	"0"
	radioEntityTypeKind		%SFInt32;	"0"
	radioEntityTypeNomenclature	%SFInt32;	"0"
	radioEntityTypeNomenclatureVersion %SFInt32;	"0"
	relativeAntennaLocation		%SFVec3f;	"0 0 0"
	transmitFrequencyBandwidth	%SFFloat;	"0.0"
	transmitState			%SFInt32;	"0"

	containerField NMTOKEN "children"
	class				CDATA		""
	DEF   				ID		#IMPLIED
	USE             		IDREF		#IMPLIED >
	
<!ELEMENT DISEntityManager ( (IS?), (%MetadataNodes;)?, (DISEntityTypeMapping|%WildcardNodes;)* ) >	
<!ATTLIST DISEntityManager
	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"1"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"

	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >
	
<!ELEMENT DISEntityTypeMapping ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST DISEntityTypeMapping
	category	 %SFInt32;	"0"
	country	 %SFInt32;	"0"
	domain	 %SFInt32;	"0"
	extra	 %SFInt32;	"0"
	kind	 %SFInt32;	"0"
	specific	 %SFInt32;	"0"
	subcategory	 %SFInt32;	"0"
	url		%MFString;	#IMPLIED

	containerField NMTOKEN "mapping"
	class        CDATA     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

]]>
<![%GeoSpatialComponent;[
<!ELEMENT GeoCoordinate ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >  <!-- X3DCoordinateNodeType -->
<!ATTLIST GeoCoordinate
	geoSystem	%MFString; '"GD" "WE"'
	point		%MFVec3d;	#IMPLIED
	containerField NMTOKEN "coord"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- need to restrict GeoOrigin to first element, or relax schema restriction -->
<!ELEMENT GeoElevationGrid (IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	(GeoOrigin, (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
	   			(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|(GeoOrigin, (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%NormalNodes;),  (
 	((%ColorNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
|(%WildcardNodes;,  (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)? ) >

<!ATTLIST GeoElevationGrid
	geoSystem	%MFString; '"GD" "WE"'
	geoGridOrigin	%SFVec3d;	"0 0 0"
	xDimension	%SFInt32;	"0"
	xSpacing	%SFDouble;	"1.0"
	yScale		%SFFloat;	"1.0"
	zDimension	%SFInt32;	"0"
	zSpacing	%SFDouble;	"1.0"
	height		%MFDouble; 	"0 0"
	normalPerVertex	%SFBool;	"true"
	ccw		%SFBool;	"true"
	colorPerVertex	%SFBool;	"true"
	creaseAngle	%SFFloat;	"0"
	solid		%SFBool;	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLocation (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes;|%WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes;|%WildcardNodes; )* )? ) >
<!ATTLIST GeoLocation
	geoSystem	%MFString; '"GD" "WE"'
	geoCoords	%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLOD (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes;|%WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes;|%WildcardNodes; )* )? ) >
<!ATTLIST GeoLOD
	geoSystem	%MFString; '"GD" "WE"'
	rootUrl	 	%MFString;	#IMPLIED
	child1Url	%MFString;	#IMPLIED
	child2Url	%MFString;	#IMPLIED
	child3Url	%MFString;	#IMPLIED
	child4Url 	%MFString;	#IMPLIED
	range		%SFFloat;	"10"
	center		%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoMetadata ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST GeoMetadata
	url		%MFString;	#IMPLIED
	data		IDREFS		#IMPLIED
	summary		%MFString;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!--
	title			%SFString;	#IMPLIED
	description		%SFString;	#IMPLIED
	coordinateSystem 	%SFString;	#IMPLIED
	horizontalDatum		%SFString;	#IMPLIED
	verticalDatum		%SFString;	#IMPLIED
	ellipsoid		%SFString;	#IMPLIED
	extent			%SFString;	#IMPLIED
	resolution		%SFString;	#IMPLIED
	originator		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	date			%SFString;	#IMPLIED
	metadataFormat		%SFString;	#IMPLIED
	dataUrl			%SFString;	#IMPLIED
	dataFormat		%SFString;	#IMPLIED
-->

<!ELEMENT GeoOrigin ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST GeoOrigin
	geoSystem	%MFString; '"GD" "WE"'
	geoCoords	%SFVec3d;	"0 0 0"
	rotateYUp	%SFBool;	"false"
	containerField NMTOKEN "geoOrigin"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoPositionInterpolator ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoPositionInterpolator
	geoSystem	%MFString; '"GD" "WE"'
	key		%MFFloat;	#IMPLIED
	keyValue	%MFVec3d;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoProximitySensor ( (IS?), (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoProximitySensor
	geoSystem	%MFString; '"GD" "WE"'
	geoCenter      %MFDouble;    "0 0 0"
	size        %SFVec3f;    "0 0 0"
	enabled     %SFBool;     "true"
	containerField NMTOKEN "children"
	class       CDATA        #IMPLIED
	DEF         ID           #IMPLIED
	USE         IDREF        #IMPLIED>

<!ELEMENT GeoTouchSensor ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoTouchSensor
	geoSystem	%MFString; '"GD" "WE"'
	enabled		%SFBool;	"true"
	description	%SFString;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoTransform (IS?, (%MetadataNodes;)?, GeoOrigin?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST GeoTransform
	geoSystem	%MFString; '"GD" "WE"'
	geoCenter %SFVec3d; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT GeoViewpoint ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoViewpoint
	geoSystem	%MFString; '"GD" "WE"'
	description	%SFString;	#IMPLIED
	position	%SFVec3d;	"0 0 100000"
	orientation	%SFRotation;	"0 0 1 0"
	fieldOfView	%SFFloat;	"0.785398"
	jump		%SFBool;	"true"
	navType		%MFString;	'"EXAMINE" "ANY"'
	headlight	%SFBool;	"true"
	speedFactor	%SFFloat;	"1.0"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>
]]>
<!-- Note that setting JointNames as enumerations does not permit validation of other names. -->
<![%HAnimComponent;[
<!ENTITY % JointNames "(
c1|c2|c3|c4|c5|c6|c7|jaw|HumanoidRoot|l_acromioclavicular|l_ankle|l_calf|
l_clavicle|l_elbow|l_eyeball|l_eyeball_joint|l_eyebrow|l_eyebrow_joint|
l_eyelid|l_eyelid_joint|l_forearm|l_forefoot|l_hand|l_hindfoot|l_hip|
l_index_distal|l_index_metacarpal|l_index_middle|l_index_proximal|
l_index0|l_index1|l_index2|l_index3|l_knee|l_metatarsal|l_middistal|
l_middle_distal|l_middle_metacarpal|l_middle_middle|l_middle_proximal|
l_middle0|l_middle1|l_middle2|l_middle3|l_midproximal|l_midtarsal|
l_pinky_distal|l_pinky_metacarpal|l_pinky_middle|l_pinky_proximal|
l_pinky0|l_pinky1|l_pinky2|l_pinky3|l_ring_distal|l_ring_metacarpal|
l_ring_middle|l_ring_proximal|l_ring0|l_ring1|l_ring2|l_ring3|l_scapula|
l_shoulder|l_sternoclavicular|l_subtalar|l_thigh|l_thumb_distal|
l_thumb_metacarpal|l_thumb_proximal|l_thumb1|l_thumb2|l_thumb3|
l_upperarm|l_wrist|l1|l2|l3|l4|l5|pelvis|r_acromioclavicular|r_ankle|
r_calf|r_clavicle|r_elbow|r_eyeball|r_eyeball_joint|r_eyebrow|
r_eyebrow_joint|r_eyelid|r_eyelid_joint|r_forearm|r_forefoot|r_hand|
r_hindfoot|r_hip|r_index_distal|r_index_metacarpal|r_index_middle|
r_index_proximal|r_index0|r_index1|r_index2|r_index3|r_knee|r_metatarsal|
r_middistal|r_middle_distal|r_middle_metacarpal|r_middle_middle|
r_middle_proximal|r_middle0|r_middle1|r_middle2|r_middle3|r_midproximal|
r_midtarsal|r_pinky_distal|r_pinky_metacarpal|r_pinky_middle|
r_pinky_proximal|r_pinky0|r_pinky1|r_pinky2|r_pinky3|r_ring_distal|
r_ring_metacarpal|r_ring_middle|r_ring_proximal|r_ring0|r_ring1|r_ring2|
r_ring3|r_scapula|r_shoulder|r_sternoclavicular|r_subtalar|r_thigh|
r_thumb_distal|r_thumb_metacarpal|r_thumb_proximal|r_thumb1|r_thumb2|
r_thumb3|r_upperarm|r_wrist|sacroiliac|sacrum|skull|skullbase|
t1|t2|t3|t4|t5|t6|t7|t8|t9|t10|t11|t12|temporomandibular|
vc1|vc2|vc3|vc4|vc5|vc6|vc7|vl1|vl2|vl3|vl4|vl5|
vt1|vt2|vt3|vt4|vt5|vt6|vt7|vt8|vt9|vt10|vt11|vt12)" >

<!ELEMENT HAnimDisplacer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST HAnimDisplacer
	name		%SFString;	#IMPLIED
	coordIndex	%MFInt32;	#IMPLIED
	displacements	%MFVec3f;	#IMPLIED
	weight		%SFFloat;	"0.0"
	containerField NMTOKEN "displacers"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT HAnimHumanoid (IS?, (%MetadataNodes;)?,
	(HAnimJoint*,	HAnimSegment*, HAnimSite*, (%CoordinateNodes;)?, (%NormalNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) ) >
<!-- skeleton/joints,	segments,      sites,      skinCoord,            skinNormal,       skin/viewpoints -->
<!-- note that joints, segments and sites should be USE nodes.  skin Shapes will USE preceding skinCoord, skinNormal definitions. -->
<!ATTLIST HAnimHumanoid
	name			%SFString;	#IMPLIED
	version			%SFString;	#IMPLIED
	info			%MFString;	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<!--	not treated as separate attributes, instead these are
	encoded as "attribute=value" SFString entries in the
	MFString info field.

	humanoidVersion		%SFString;	#IMPLIED
	authorName		%SFString;	#IMPLIED
	authorEmail		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	creationDate		%SFString;	#IMPLIED
	usageRestrictions	%SFString;	#IMPLIED
	age			%SFString;	#IMPLIED
	gender			%SFString;	#IMPLIED
	height			%SFString;	#IMPLIED
	weight			%SFString;	#IMPLIED
-->
<![%HAnimComponent;[
<!ELEMENT HAnimJoint (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|HAnimDisplacer|%WildcardNodes; )* ) >
<!ATTLIST HAnimJoint
	name			%JointNames;	#IMPLIED
	ulimit			%MFFloat;	#IMPLIED
	llimit			%MFFloat;	#IMPLIED
	limitOrientation	%SFRotation;	"0 0 1 0"
	skinCoordIndex		%MFInt32;	#IMPLIED
	skinCoordWeight		%MFFloat;	#IMPLIED
	stiffness		%MFFloat;	"0 0 0"
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!-- Multiple HAnimDisplacer nodes must appear consecutively inside HAnimSegment -->

<!ELEMENT HAnimSegment (IS?, (%MetadataNodes;)?, (
	((%ChildrenNodes;|%WildcardNodes;)*, ((Coordinate, HAnimDisplacer*)|(HAnimDisplacer+, Coordinate?))? ) |
	(Coordinate, (((%ChildrenNodes;)*, HAnimDisplacer*)|(HAnimDisplacer+, (%ChildrenNodes;|%WildcardNodes;)*))? ) |
	(HAnimDisplacer+, ((Coordinate, (%ChildrenNodes;|%WildcardNodes;)*)|((%ChildrenNodes;|%WildcardNodes;)*, Coordinate?))? )?
) ) >
<!ATTLIST HAnimSegment
	name			%JointNames;	#IMPLIED
	mass			%SFFloat;	"0"
	centerOfMass		%SFVec3f;	"0 0 0"
	momentsOfInertia	%MFFloat;	"0 0 0 0 0 0 0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT HAnimSite (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST HAnimSite
	name			%SFString;	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<![%NurbsComponent;[
<!ELEMENT Contour2D (IS?, (%MetadataNodes;)?, ( %NurbsControlCurveNodes;|%WildcardNodes; )* ) >
<!ATTLIST Contour2D
	containerField NMTOKEN "trimmingContour"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT ContourPolyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ContourPolyline2D
	point		%MFVec2f;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- child CoordinateNode has containerField controlPoint -->
<!ELEMENT NurbsCurve ( (IS?), (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )? ) >
<!ATTLIST NurbsCurve
	knot		%MFDouble;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFDouble;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN 		"geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsCurve2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NurbsCurve2D
	controlPoint	%MFVec2d;	#IMPLIED
	knot		%MFDouble;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFDouble;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsOrientationInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsOrientationInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsPositionInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsPositionInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsSurfaceInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsSurfaceInterpolator
	weight		%MFDouble;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT NurbsSet (IS?, (%MetadataNodes;)?, (NurbsPatchSurface|NurbsSweptSurface|NurbsSwungSurface|NurbsTrimmedSurface|%WildcardNodes; )* ) >
<!ATTLIST NurbsSet
	tessellationScale	%SFFloat;	"1.0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        CDATA     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT NurbsPatchSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )?, ( %TextureCoordinateNodes;|NurbsTextureCoordinate)? ) >
<!ATTLIST NurbsPatchSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFDouble;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTrimmedSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )?, ( %TextureCoordinateNodes;|NurbsTextureCoordinate)?, Contour2D* ) >
<!ATTLIST NurbsTrimmedSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFDouble;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSweptSurface (IS?, (%MetadataNodes;)?, (NurbsCurve|%WildcardNodes; )?, ( %NurbsControlCurveNodes;|%WildcardNodes; )? ) >
<!ATTLIST NurbsSweptSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSwungSurface (IS?, (%MetadataNodes;)?, ( ( %NurbsControlCurveNodes;|%WildcardNodes; ), ( %NurbsControlCurveNodes;|%WildcardNodes; )? )? ) >
<!ATTLIST NurbsSwungSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        CDATA     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTextureCoordinate ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsTextureCoordinate
	controlPoint	%MFVec2f;	#IMPLIED
	weight		%MFFloat;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "texCoord"
	class        CDATA     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>
]]>
<![%CadComponent;[
<!ELEMENT CADAssembly (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|CADPart|%WildcardNodes;)*)>
<!ATTLIST CADAssembly
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	name	 %SFString;  #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CADFace (IS?, (%MetadataNodes;)?, (Shape|LOD|%WildcardNodes;)*)>
<!ATTLIST CADFace
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	name	 %SFString;  #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CADLayer (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|%WildcardNodes;)*)>
<!ATTLIST CADLayer
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	name	 %SFString;  #IMPLIED
	visible	 %MFBool;  #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CADPart (IS?, (%MetadataNodes;)?, (CADFace|%WildcardNodes;)*)>
<!ATTLIST CADPart
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	center %SFVec3f; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	name	 %SFString;  #IMPLIED
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT QuadSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*)>
<!ATTLIST QuadSet
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT IndexedQuadSet ( (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*) ) >
<!ATTLIST IndexedQuadSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
]]>
<![%CubeMapTexturingComponent;[
<!-- containerField values:  front back left right top bottom.  could use rule for 0..6 children here -->
<!ELEMENT ComposedCubeMapTexture (IS?, (%MetadataNodes;)?, (%Texture2DNodes;)* )>
<!ATTLIST ComposedCubeMapTexture
	containerField NMTOKEN "texture"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
<!ELEMENT GeneratedCubeMapTexture (IS?, (%MetadataNodes;)? )>
<!ATTLIST GeneratedCubeMapTexture
	update (NONE|NEXT_FRAME_ONLY|ALWAYS)            "NONE"
	size	%SFInt32;	"128"
	containerField NMTOKEN "texture"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
<!ELEMENT ImageCubeMapTexture  (IS?, (%MetadataNodes;)? )>
<!ATTLIST ImageCubeMapTexture
	url		%MFString;	#IMPLIED
	containerField NMTOKEN "texture"
	class        CDATA      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
]]>
<!-- parent content model and default containerField names for most ShadersComponent nodes is not clear.. -->
<![%ShadersComponent;[
<!ELEMENT ComposedShader ( (IS?), (%MetadataNodes;)?, (ShaderPart|%WildcardNodes;)*, (field)* ) >
<!ATTLIST ComposedShader
	language	 %SFString;  #IMPLIED
	containerField CDATA "shaders"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT FloatVertexAttribute ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FloatVertexAttribute
	value		%MFFloat; #IMPLIED
	name		%SFString; #IMPLIED
	numComponents (1|2|3|4)            "4"
	containerField CDATA "attrib"
	class	CDATA	#IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>
<!ELEMENT Matrix3VertexAttribute ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Matrix3VertexAttribute
	value		%MFMatrix3f; #IMPLIED
	name		%SFString; #IMPLIED
	containerField CDATA "attrib"
	class	CDATA	#IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>
<!ELEMENT Matrix4VertexAttribute ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Matrix4VertexAttribute
	value		%MFMatrix4f; #IMPLIED
	name		%SFString; #IMPLIED
	containerField CDATA "attrib"
	class	CDATA	#IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>
<!ELEMENT PackagedShader ( (IS?), (%MetadataNodes;)?, (field)* ) >
<!ATTLIST PackagedShader
	language	 %SFString;  #IMPLIED
	containerField CDATA "shaders"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ProgramShader ( (IS?), (%MetadataNodes;)?, (ShaderProgram|%WildcardNodes;)*, (field)* ) >
<!ATTLIST ProgramShader
	language	 %SFString;  #IMPLIED
	containerField CDATA "shaders"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ShaderPart ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ShaderPart
	url		%MFString;	#IMPLIED
	type	 ( VERTEX|FRAGMENT )  #IMPLIED
	containerField NMTOKEN "parts"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ShaderProgram ( (IS?), (%MetadataNodes;)?, (field)* ) >
<!ATTLIST ShaderProgram
	url		%MFString;	#IMPLIED
	type	 ( VERTEX|FRAGMENT )  #IMPLIED
	containerField NMTOKEN "programs"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
]]>
<![%Texture3DComponent;[
<!ELEMENT ComposedTexture3D ((IS?), (%MetadataNodes;)?, (%Texture2DNodes;)*)>
<!ATTLIST ComposedTexture3D
	repeatS %SFBool; "false"
	repeatT %SFBool; "false"
	repeatR %SFBool; "false"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ImageTexture3D ((IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)?)>
<!ATTLIST ImageTexture3D
	url %MFString; #IMPLIED
	repeatS %SFBool; "false"
	repeatT %SFBool; "false"
	repeatR %SFBool; "false"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT PixelTexture3D ((IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)?)>
<!ATTLIST PixelTexture3D
	image %MFInt32; "0 0 0 0"
	repeatS %SFBool; "false"
	repeatT %SFBool; "false"
	repeatR %SFBool; "false"
	containerField NMTOKEN "texture"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TextureCoordinate3D ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate3D
	point %MFVec3f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TextureCoordinate4D ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate4D
	point %MFVec4f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TextureMatrixTransform ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureMatrixTransform
	matrix      %SFMatrix4f; "1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>
<!ELEMENT TextureTransform3D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureTransform3D
	center      %SFVec3f; "0 0 0"
	rotation    %SFRotation; "0 0 1 0"
	scale       %SFVec3f; "1 1 1"
	translation %SFVec3f; "0 0 0"
	containerField NMTOKEN "textureTransform"
	class       CDATA     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT LocalFog ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST LocalFog
	enabled		%SFBool; "true"
	color		%SFColor; "1 1 1"
	fogType 	(LINEAR|EXPONENTIAL) "LINEAR"
	visibilityRange %SFFloat;            "0"
	containerField NMTOKEN "children"
	class	CDATA	#IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>

<!ELEMENT FogCoordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST FogCoordinate
	depth %MFVec3f; #IMPLIED
	containerField NMTOKEN "fogCoord"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
]]>
<!-- v3.2 -->
<![%FullProfile;[
<!ELEMENT TwoSidedMaterial ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TwoSidedMaterial
	ambientIntensity %SFFloat; "0.2"
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	shininess        %SFFloat; "0.2"
	specularColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	backAmbientIntensity %SFFloat; "0.2"
	backDiffuseColor     %SFColor; "0.8 0.8 0.8"
	backEmissiveColor    %SFColor; "0 0 0"
	backShininess        %SFFloat; "0.2"
	backSpecularColor    %SFColor; "0 0 0"
	backTransparency     %SFFloat; "0"
	separateBackColor     %SFBool; "false"
	containerField NMTOKEN "material"
	class       CDATA          #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%LayeringComponent;[

<!-- TODO:  any order for SFNode child Viewport -->
<!ELEMENT Layer (IS?, (%MetadataNodes;)?, Viewport, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Layer
	isPickable %SFBool; "true"
	containerField NMTOKEN "layers"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT LayerSet (IS?, (%MetadataNodes;)?, (Layer | %WildcardNodes;)*)>
<!ATTLIST LayerSet
	activeLayer %SFInt32; "0"
	order %MFInt32; "0"
	containerField NMTOKEN "layers"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Viewport (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Viewport
	clipBoundary %MFFloat; "0 1 0 1"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "viewport"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%LayoutComponent;[

<!ELEMENT Layout ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Layout
	align             %MFString; '"CENTER" "CENTER"'
	offsetUnits  %MFString; '"WORLD" "WORLD"'
	scaleMode     %MFString; '"NONE" "NONE"'
	sizeUnits     %MFString; '"WORLD" "WORLD"'
	offset     %MFFloat;  "0 0"
	size        %SFFloat;  "1.0"
	containerField NMTOKEN "layout"
	class       CDATA       #IMPLIED
	DEF         ID          #IMPLIED
	USE         IDREF       #IMPLIED>
<!-- Minimum supported values:
	align  ' "LEFT" "CENTER" "RIGHT" "BOTTOM" "CENTER" "TOP" '
	offsetUnits ' "WORLD" "FRACTION" "PIXEL" '
	scaleMode ' "NONE" "FRACTION" "STRETCH" "PIXEL" '
	sizeUnits ' "WORLD" "FRACTION" "PIXEL" ' -->

<!-- TODO:  any order for SFNode children Layout and Viewport -->
<!ELEMENT LayoutGroup (IS?, (%MetadataNodes;)?, Layout, Viewport, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST LayoutGroup
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- TODO:  any order for SFNode children Layout and Viewport -->
<!ELEMENT LayoutLayer (IS?, (%MetadataNodes;)?, Layout, Viewport, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST LayoutLayer
	isPickable %SFBool; "true"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ScreenFontStyle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ScreenFontStyle
	family      %MFString; '"SERIF"'
	horizontal  %SFBool;   "true"
	justify     %MFString; '"BEGIN"'
	language    %SFString; #IMPLIED
	leftToRight %SFBool;   "true"
	pointSize        %SFFloat;  "1.0"
	spacing     %SFFloat;  "1.0"
	style       (PLAIN|BOLD|ITALIC|BOLDITALIC) "PLAIN"
	topToBottom %SFBool;   "true"
	containerField NMTOKEN "fontStyle"
	class       CDATA       #IMPLIED
	DEF         ID          #IMPLIED
	USE         IDREF       #IMPLIED>
<!-- Minimum supported values:
	family  ' "SERIF" "SANS" "TYPEWRITER" '
	justify ' "FIRST" "BEGIN" "MIDDLE" "END" ' -->

<!ELEMENT ScreenGroup (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST ScreenGroup
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%RigidBodyPhysicsComponent;[

<!ELEMENT BallJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)*)>
<!ATTLIST BallJoint
	anchorPoint %SFVec3f; "0 0 0"
	mustOutput %MFString; "NONE"
	containerField NMTOKEN "joints"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollidableOffset (IS?, (%MetadataNodes;)?, (CollidableOffset | CollidableShape | %WildcardNodes;)? )>
<!ATTLIST CollidableOffset
	enabled %SFBool; "true"
	rotation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollidableShape (IS?, (%MetadataNodes;)?, (Shape | %WildcardNodes;)? )>
<!ATTLIST CollidableShape
	enabled %SFBool; "true"
	rotation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollisionCollection (IS?, (%MetadataNodes;)?, (CollidableOffset | CollidableShape | CollisionSpace | %WildcardNodes;)* )>
<!ATTLIST CollisionCollection
	appliedParameters %MFString; "BOUNCE"
	bounce %SFFloat; "0"
	enabled %SFBool; "true"
	frictionCoefficients %SFVec2f; "0 0"
	minBounceSpeed %SFFloat; "0.1"
	slipFactors %SFVec2f; "0 0"
	softnessConstantForceMix %SFFloat; "0.0001"
	softnessErrorCorrection %SFFloat; "0.8"
	surfaceSpeed %SFVec2f; "0 0"
	containerField NMTOKEN "collidables"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollisionSensor (IS?, (%MetadataNodes;)?, (CollisionCollection | %WildcardNodes;)? )>
<!ATTLIST CollisionSensor
	enabled %SFBool; "true"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollisionSpace (IS?, (%MetadataNodes;)?, (CollidableOffset | CollidableShape | CollisionSpace | %WildcardNodes;)* )>
<!ATTLIST CollisionSpace
	useGeometry %SFBool; "false"
	enabled %SFBool; "true"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Contact (IS?, (%MetadataNodes;)?, (RigidBody | CollidableOffset | CollidableShape | %WildcardNodes;)* )>
<!ATTLIST Contact
	appliedParameters %MFString; "BOUNCE"
	bounce %SFFloat; "0"
	contactNormal %SFVec3f; "0 1 0"
	depth %SFFloat; "0"
	frictionCoefficients %SFVec2f; "0 0"
	frictionDirection %SFVec3f; "0 1 0"
	minBounceSpeed %SFFloat; "0"
	position %SFVec3f; "0 0 0"
	slipCoefficients %SFVec2f; "0 0"
	softnessConstantForceMix %SFFloat; "0.0001"
	softnessErrorCorrection %SFFloat; "0.8"
	surfaceSpeed %SFVec2f; "0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT DoubleAxisHingeJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST DoubleAxisHingeJoint
	anchorPoint %SFVec3f; "0 1 0"
	axis1 %SFVec3f; "0 1 0"
	axis2 %SFVec3f; "0 1 0"
	desiredAngularVelocity1 %SFFloat; "0"
	desiredAngularVelocity2 %SFFloat; "0"
	maxAngle1 %SFFloat; "3.1416"
	maxTorque1 %SFFloat; "0"
	maxTorque2 %SFFloat; "0"
	minAngle1 %SFFloat; "-3.1416"
	mustOutput %MFString; "NONE"
	stopBounce1 %SFFloat; "0"
	stopConstantForceMix1 %SFFloat; "0.001"
	stopErrorCorrection1 %SFFloat; "0.8"
	suspensionErrorCorrection %SFFloat; "0.8"
	suspensionForce %SFFloat; "0"
	containerField NMTOKEN "joints"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MotorJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST MotorJoint
	autoCalc %SFBool; "false"
	axis1Angle %SFFloat; "0"
	axis1Torque %SFFloat; "0"
	axis2Angle %SFFloat; "0"
	axis2Torque %SFFloat; "0"
	axis3Angle %SFFloat; "0"
	axis3Torque %SFFloat; "0"
	enabledAxes (0|1|2|3) "1"
	mustOutput%MFString; "NONE"
	motor1Axis %SFVec3f; "0 0 0"
	motor2Axis %SFVec3f; "0 0 0"
	motor3Axis %SFVec3f; "0 0 0"
	stop1Bounce %SFFloat; "0"
	stop1ErrorCorrection %SFFloat; "0.8"
	stop2Bounce %SFFloat; "0"
	stop2ErrorCorrection %SFFloat; "0.8"
	stop3Bounce %SFFloat; "0"
	stop3ErrorCorrection %SFFloat; "0.8"
	containerField NMTOKEN "joints"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT RigidBody (IS?, (%MetadataNodes;)?, (Sphere | Box | Cone )?, (CollidableOffset | CollidableShape | %WildcardNodes;)* )>
<!ATTLIST RigidBody
	angularDampingFactor %SFFloat; "0.001"
	angularVelocity %SFVec3f; "0 0 0"
	autoDamp %SFBool; "false"
	autoDisable %SFBool; "false"
	centerOfMass %SFVec3f; "0 0 0"
	disableAngularSpeed %SFFloat; "0"
	disableLinearSpeed %SFFloat; "0"
	disableTime %SFTime; "0"
	enabled %SFBool; "true"
	finiteRotationAxis %SFVec3f; "0 0 0"
	fixed %SFBool; "false"
	forces %MFVec3f; #IMPLIED
	inertia %SFMatrix3f; "1 0 0 0 1 0 0 0 1"
	linearDampingFactor %SFFloat; "0.001"
	linearVelocity %SFVec3f; "0 0 0"
	mass %SFFloat; "1"
	orientation %SFRotation; "0 0 1 0"
	position %SFVec3f; "0 0 0"
	torques %MFVec3f; #IMPLIED
	useFiniteRotation %SFBool; "false"
	useGlobalGravity %SFBool; "true"
	containerField (body1 | body2 | bodies) "bodies"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT RigidBodyCollection (IS?, (%MetadataNodes;)?, (RigidBody | BallJoint | DoubleAxisHingeJoint | MotorJoint | SingleAxisHingeJoint | SliderJoint |  UniversalJoint | CollisionCollection | %WildcardNodes;)* )>
<!ATTLIST RigidBodyCollection
	autoDisable %SFBool; "false"
	constantForceMix %SFFloat; "0.0001"
	contactSurfaceThickness %SFFloat; "0"
	disableAngularSpeed %SFFloat; "0"
	disableLinearSpeed %SFFloat; "0"
	disableTime %SFTime; "0"
	enabled %SFBool; "true"
	errorCorrection %SFFloat; "0.8"
	gravity %SFVec3f; "0 -9.8 0"
	iterations %SFInt32; "10"
	maxCorrectionSpeed %SFFloat; "-1"
	preferAccuracy %SFBool; "false"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT SingleAxisHingeJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST SingleAxisHingeJoint
	anchorPoint %SFVec3f; "0 0 0"
	axis %SFVec3f; "0 0 0"
	maxAngle %SFFloat; "3.1416"
	minAngle %SFFloat; "-3.1416"
	mustOutput%MFString; "NONE"
	stopBounce %SFFloat; "0"
	stopErrorCorrection %SFFloat; "0.8"
	containerField NMTOKEN "joints"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT SliderJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST SliderJoint
	axis %SFVec3f; "0 1 0"
	mustOutput%MFString; "NONE"
	maxSeparation %SFFloat; "1"
	minSeparation %SFFloat; "0"
	stopBounce %SFFloat; "0"
	stopErrorCorrection %SFFloat; "1"
	containerField NMTOKEN "joints"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT UniversalJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST UniversalJoint
	anchorPoint %SFVec3f; "0 0 0"
	axis1 %SFVec3f; "0 0 0"
	axis2 %SFVec3f; "0 0 0"
	mustOutput%MFString; "NONE"
	stop1Bounce %SFFloat; "0"
	stop1ErrorCorrection %SFFloat; "0.8"
	stop2Bounce %SFFloat; "0"
	stop2ErrorCorrection %SFFloat; "0.8"
	containerField NMTOKEN "joints"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%PickingSensorComponent;[

<!ELEMENT LinePickSensor (IS?, (%MetadataNodes;)?, (IndexedLineSet | LineSet | %WildcardNodes;), (%GroupingNodes; | Inline | %WildcardNodes;)* )>
<!ATTLIST LinePickSensor
	enabled %SFBool; "true"
	objectType %MFString; "ALL"
	intersectionType %SFString; "BOUNDS"
	sortOrder %SFString; "CLOSEST"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PickableGroup (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST PickableGroup
	objectType %MFString; "ALL"
	pickable %SFBool; "true"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PrimitivePickSensor (IS?, (%MetadataNodes;)?, (Cone|Cylinder|Sphere|Box)?, (%GroupingNodes; | Shape | Inline | %WildcardNodes;)* )>
<!ATTLIST PrimitivePickSensor
	enabled %SFBool; "true"
	objectType %MFString; "ALL"
	intersectionType %SFString; "BOUNDS"
	sortOrder %SFString; "CLOSEST"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT VolumePickSensor (IS?, (%MetadataNodes;)?, (%GeometryNodes; | %WildcardNodes;)?, (%GroupingNodes; | Shape | Inline | %WildcardNodes;)* )>
<!ATTLIST VolumePickSensor
	enabled %SFBool; "true"
	objectType %MFString; "ALL"
	intersectionType %SFString; "BOUNDS"
	sortOrder %SFString; "CLOSEST"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%FollowersComponent;[

<!ELEMENT ColorDamper (IS?, (%MetadataNodes;)? )>
<!ATTLIST ColorDamper
	tau %SFTime; "0"
	tolerance %SFFloat; "-1"
	initialDestination %SFColor; "0.8 0.8 0.8"
	initialValue %SFColor; "0.8 0.8 0.8"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CoordinateDamper (IS?, (%MetadataNodes;)? )>
<!ATTLIST CoordinateDamper
	tau %SFTime; "0"
	tolerance %SFFloat; "-1"
	initialDestination %MFVec3f; "0 0 0"
	initialValue %MFVec3f; "0 0 0"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT OrientationChaser (IS?, (%MetadataNodes;)? )>
<!ATTLIST OrientationChaser
	duration %SFTime; "0"
	initialDestination %MFVec3f; "0 1 0 0"
	initialValue %MFVec3f; "0 1 0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT OrientationDamper (IS?, (%MetadataNodes;)? )>
<!ATTLIST OrientationDamper
	tau %SFTime; "0"
	tolerance %SFFloat; "-1"
	initialDestination %SFRotation; "0 1 0 0"
	initialValue %SFRotation; "0 1 0 0"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionChaser (IS?, (%MetadataNodes;)? )>
<!ATTLIST PositionChaser
	duration %SFTime; "0"
	initialDestination %SFVec3f; "0 0 0"
	initialValue %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionChaser2D (IS?, (%MetadataNodes;)? )>
<!ATTLIST PositionChaser2D
	duration %SFTime; "0"
	initialDestination %SFVec2f; "0 0"
	initialValue %SFVec2f; "0 0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionDamper (IS?, (%MetadataNodes;)? )>
<!ATTLIST PositionDamper
	tau %SFTime; "0"
	tolerance %SFFloat; "-1"
	initialDestination %SFVec3f; "0 0 0"
	initialValue %SFVec3f; "0 0 0"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionDamper2D (IS?, (%MetadataNodes;)? )>
<!ATTLIST PositionDamper2D
	tau %SFTime; "0"
	tolerance %SFFloat; "-1"
	initialDestination %SFVec2f; "0 0"
	initialValue %SFVec2f; "0 0"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ScalarChaser (IS?, (%MetadataNodes;)? )>
<!ATTLIST ScalarChaser
	duration %SFTime; "0"
	initialDestination %SFFloat; "0"
	initialValue %SFFloat; "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TexCoordDamper2D (IS?, (%MetadataNodes;)? )>
<!ATTLIST TexCoordDamper2D
	tau %SFTime; "0"
	tolerance %SFFloat; "-1"
	initialDestination %MFVec2f; #IMPLIED
	initialValue %MFVec2f; #IMPLIED
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%ParticleSystemsComponent;[

<!ELEMENT BoundedPhysicsModel (IS?, (%MetadataNodes;)?, (%GeometryNodes; | %WildcardNodes;)? )>
<!ATTLIST BoundedPhysicsModel
	enabled %SFBool; "true"
	containerField NMTOKEN "physics"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ForcePhysicsModel (IS?, (%MetadataNodes;)? )>
<!ATTLIST ForcePhysicsModel
	enabled %SFBool; "true"
	force %SFVec3f; "0 -9.8 0"
	containerField NMTOKEN "physics"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT WindPhysicsModel (IS?, (%MetadataNodes;)? )>
<!ATTLIST WindPhysicsModel
	direction %SFVec3f; "1 0 0"
	enabled %SFBool; "true"
	gustiness %SFFloat; "0.1"
	speed %SFFloat; "0.1"
	turbulence %SFFloat; "0"
	containerField NMTOKEN "physics"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ConeEmitter (IS?, (%MetadataNodes;)? )>
<!ATTLIST ConeEmitter
	angle %SFFloat; "0.785398"
	direction %SFVec3f; "0 1 0"
	position %SFVec3f; "0 0 0"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ExplosionEmitter (IS?, (%MetadataNodes;)? )>
<!ATTLIST ExplosionEmitter
	position %SFVec3f; "0 0 0"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PointEmitter (IS?, (%MetadataNodes;)? )>
<!ATTLIST PointEmitter
	direction %SFVec3f; "0 1 0"
	position %SFVec3f; "0 0 0"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PolylineEmitter (IS?, (%MetadataNodes;)?, (Coordinate | CoordinateDouble | %WildcardNodes;)? )>
<!ATTLIST PolylineEmitter
	direction %SFVec3f; "0 1 0"
	coordIndex %MFInt32; "-1"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT SurfaceEmitter (IS?, (%MetadataNodes;)?, (%GeometryNodes; | %WildcardNodes;)? )>
<!ATTLIST SurfaceEmitter
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT VolumeEmitter (IS?, (%MetadataNodes;)?, (Coordinate | CoordinateDouble | %WildcardNodes;)? )>
<!ATTLIST VolumeEmitter
	direction %SFVec3f; "0 1 0"
	coordIndex %MFInt32; "-1"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ParticleSystem
((IS?, (%MetadataNodes;)?),
  (
     ( %AppearanceNodes;, ( %GeometryNodes;   | %WildcardNodes;  )? ) |
     ( (%GeometryNodes;), ( %AppearanceNodes; | %WildcardNodes;  )? ) |
     ( %WildcardNodes;,   ( %GeometryNodes;   | %AppearanceNodes; | %WildcardNodes; )? )
  )?,
  (Color | ColorRGBA),
  (PointEmitter | PolylineEmitter | SurfaceEmitter | VolumeEmitter)?,
 ( BoundedPhysicsModel | ForcePhysicsModel | WindPhysicsModel)*,
 TextureCoordinate?
)
>
<!ATTLIST ParticleSystem
	createParticles %SFBool; "true"
	enabled %SFBool; "true"
	lifetimeVariation %SFFloat; "0.25"
	maxParticles %SFInt32; "200"
	particleLifetime %SFFloat; "5"
	particleSize %SFVec2f; "0.02 0.02"
	colorKey %MFFloat; #IMPLIED
	texCoordKey %MFFloat; #IMPLIED
	geometryType %SFString; "QUAD"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "emitter"
	class CDATA #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<!-- Finally, Web3dExtensionComponent from separate DTDs.  Note that Web3dExtensionComponent
     content-model extensions needed to be added at beginning,	prior to node-type definitions. -->
<![%Web3dExtensionComponent;[

<!ENTITY % Web3dExtensionsPublicDTD  SYSTEM "x3d-3.2-Web3dExtensionsPublic.dtd">
<!ENTITY % Web3dExtensionsPrivateDTD SYSTEM "x3d-3.2-Web3dExtensionsPrivate.dtd">

%Web3dExtensionsPublicDTD;
%Web3dExtensionsPrivateDTD;

]]>

A.4.2 x3d-3.2-InputOutputFields.dtd

x3d-3.2-InputOutputFields.dtd extends the X3D version 3.2 DTD by also including fields with accessType inputOnly and outputOnly. Although X3D scene files cannot validly set values for any of these attributes, the DTD defines names and relationships of all fields and can be used by DTD-aware processing tools.

<!--
#
# X3D InputOutputFields DTD:
#
#	http://www.web3d.org/specifications/x3d-3.2-InputOutputFields.dtd
#
#	current version:  3.2.0
#
#	revised:          2 September 2007
#
#	Author:           Don Brutzman
#
# Purpose: the primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by field definitions in x3d-3.2-InputOutputFields.dtd
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.2.dtd
#	http://www.web3d.org/specifications/x3d-3.2-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.2-Web3dExtensions.dtd
#
# Typical system location for this resource is adjacent to x3d-3.2.dtd:
#	file://c:/www.web3d.org/specifications/x3d-3.2-InputOutputFields.dtd
#	  file:///www.web3d.org/specifications/x3d-3.2-InputOutputFields.dtd
#
# changelog:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
# Note on typing:
#	CDATA used for %SFBool; definitions to allow #FIXED "" initialization,
#	  since DTD rules otherwise require enumeration values to be
#	  initialized to true|false.
#
-->

<!ATTLIST AudioClip
	elapsedTime   %SFTime;    #FIXED ""
	duration_changed %SFTime; #FIXED ""
	isPaused      CDATA       #FIXED ""
	isActive      CDATA       #FIXED "">

<!ATTLIST Background
	set_bind    CDATA      #FIXED ""
	bindTime    %SFTime;   #FIXED ""
	isBound     CDATA      #FIXED "">

<!ATTLIST BooleanFilter
	set_boolean CDATA #FIXED ""
	inputTrue   CDATA #FIXED ""
	inputFalse  CDATA #FIXED ""
	inputNegate CDATA #FIXED "">

<!-- value_changed is CDATA instead of %SFBool% in order to set empty value on an enumeration -->

<!ATTLIST BooleanSequencer
	set_fraction %SFFloat; #FIXED ""
	value_changed    CDATA  #FIXED ""
	previous CDATA   #FIXED ""
	next     CDATA   #FIXED "">

<!ATTLIST BooleanToggle
	set_boolean CDATA #FIXED "">

<!ATTLIST BooleanTrigger
	set_triggerTime %SFTime; #FIXED ""
	triggerTrue     CDATA    #FIXED "">

<!ATTLIST Collision
	collideTime %SFTime;   #FIXED ""
	isActive    CDATA      #FIXED "">

<!ATTLIST ColorInterpolator
	set_fraction    %SFFloat; #FIXED ""
	value_changed       %SFColor; #FIXED "">

<!ATTLIST CoordinateInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %MFVec3f; #FIXED "">

<!ATTLIST CoordinateInterpolator2D
	set_fraction %SFFloat; #FIXED ""
	value_changed    %MFVec2f; #FIXED "">

<!ATTLIST CylinderSensor
	isActive   CDATA     	#FIXED ""
	isOver     CDATA     	#FIXED ""
	rotation_changed   %SFRotation; #FIXED ""
	trackPoint_changed %SFVec3f;    #FIXED "">

<!ATTLIST ElevationGrid
	set_height      %MFFloat; #FIXED "">

<!ATTLIST Extrusion
	set_crossSection %MFVec2f;    #FIXED ""
	set_orientation  %MFRotation; #FIXED ""
	set_scale        %MFVec2f;    #FIXED ""
	set_spine        %MFVec3f;    #FIXED "">

<!ATTLIST Fog
	set_bind        CDATA      #FIXED ""
	bindTime        %SFTime;   #FIXED ""
	isBound         CDATA      #FIXED "">

<!ATTLIST IndexedFaceSet
	set_colorIndex      %MFInt32; #FIXED ""
	set_coordIndex      %MFInt32; #FIXED ""
	set_normalIndex     %MFInt32; #FIXED ""
	set_texCoordIndex   %MFInt32; #FIXED "">

<!ATTLIST IndexedLineSet
	set_colorIndex  %MFInt32; #FIXED ""
	set_coordIndex  %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleFanSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleStripSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST IntegerSequencer
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFInt32; #FIXED ""
	previous CDATA   #FIXED ""
	next     CDATA   #FIXED "">

<!ATTLIST IntegerTrigger
	set_boolean  CDATA #FIXED ""
	triggerValue %SFInt32;   #FIXED "">

<!ATTLIST KeySensor
	isActive		CDATA      	#FIXED ""
	keyPress		%SFString;	#FIXED ""
	keyRelease		%SFString;	#FIXED ""
	actionKeyPress		%SFInt32;	#FIXED ""
	actionKeyRelease	%SFInt32;	#FIXED ""
	altKey			CDATA  		#FIXED ""
	controlKey		CDATA  		#FIXED ""
	shiftKey		CDATA  		#FIXED "">

<!ATTLIST LoadSensor
	isActive		CDATA       	#FIXED ""
	isLoaded		CDATA  		#FIXED ""
	loadTime		%SFTime;	#FIXED ""
	progress		%SFFloat;	#FIXED "">

<!ATTLIST LOD
	level_changed		%SFInt32;	#FIXED "">

<!ATTLIST MovieTexture
	elapsedTime       %SFTime;  #FIXED ""
	duration_changed  %SFTime;  #FIXED ""
	isPaused          CDATA     #FIXED ""
	isActive          CDATA     #FIXED "">

<!ATTLIST NavigationInfo
	set_bind        CDATA      #FIXED ""
	bindTime        %SFTime;   #FIXED ""
	transitionComplete         CDATA      #FIXED ""
	isBound         CDATA      #FIXED "">

<!ATTLIST NormalInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %MFVec3f; #FIXED "">

<!ATTLIST OrientationInterpolator
	set_fraction %SFFloat;    #FIXED ""
	value_changed    %SFRotation; #FIXED "">

<!ATTLIST PlaneSensor
	isActive    CDATA  	#FIXED ""
	isOver      CDATA     	#FIXED ""
	trackPoint_changed  %SFVec3f; #FIXED ""
	translation_changed %SFVec3f; #FIXED "">

<!ATTLIST PositionInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFVec3f; #FIXED "">

<!ATTLIST PositionInterpolator2D
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFVec2f; #FIXED "">

<!ATTLIST ProximitySensor
	isActive    CDATA     	 #FIXED ""
	position_changed    %SFVec3f;    #FIXED ""
	orientation_changed %SFRotation; #FIXED ""
	centerOfRotation_changed  %SFVec3f;	#FIXED ""
	enterTime   %SFTime;     #FIXED ""
	exitTime    %SFTime;     #FIXED "">

<!ATTLIST ScalarInterpolator
	set_fraction %SFFloat; #FIXED ""
	value_changed    %SFFloat; #FIXED "">

<!ATTLIST SphereSensor
	isActive   CDATA     	#FIXED ""
	isOver      CDATA     	#FIXED ""
	rotation_changed   %SFRotation; #FIXED ""
	trackPoint_changed %SFVec3f;    #FIXED "">

<!ATTLIST StringSensor
	isActive		CDATA     	#FIXED ""
	enteredText		%SFString;	#FIXED ""
	finalText		%SFString;	#FIXED "">

<!ATTLIST Text
	lineBounds     %MFVec2f;   #FIXED ""
	textBounds     %SFVec2f;   #FIXED "">

<!ATTLIST TextureBackground
	set_bind     CDATA      #FIXED ""
	bindTime     %SFTime;   #FIXED ""
	isBound      CDATA      #FIXED "">

<!ATTLIST TimeSensor
	elapsedTime   %SFTime;  #FIXED ""
	cycleTime     %SFTime;  #FIXED ""
	fraction_changed  %SFFloat; #FIXED ""
	isActive      CDATA    	#FIXED ""
	isPaused      CDATA    	#FIXED ""
	time          %SFTime;  #FIXED "">

<!ATTLIST TimeTrigger
	set_boolean  CDATA #FIXED ""
	triggerTime %SFTime;   #FIXED "">

<!ATTLIST TouchSensor
	hitNormal_changed    %SFVec3f; 	#FIXED ""
	hitPoint_changed     %SFVec3f; 	#FIXED ""
	hitTexCoord_changed  %SFVec2f; 	#FIXED ""
	isActive     CDATA     #FIXED ""
	isOver       CDATA     #FIXED ""
	touchTime    %SFTime;  #FIXED "">

<!ATTLIST Viewpoint
	set_bind    CDATA        #FIXED ""
	bindTime    %SFTime;     #FIXED ""
	isBound     CDATA        #FIXED "">

<!ATTLIST VisibilitySensor
	enterTime %SFTime;  #FIXED ""
	exitTime  %SFTime;  #FIXED ""
	isActive  CDATA     #FIXED "">

<!ATTLIST EspduTransform
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
	set_articulationParameterValue0		%SFFloat;	#FIXED ""
	set_articulationParameterValue1		%SFFloat;	#FIXED ""
	set_articulationParameterValue2		%SFFloat;	#FIXED ""
	set_articulationParameterValue3		%SFFloat;	#FIXED ""
	set_articulationParameterValue4		%SFFloat;	#FIXED ""
	set_articulationParameterValue5		%SFFloat;	#FIXED ""
	set_articulationParameterValue6		%SFFloat;	#FIXED ""
	set_articulationParameterValue7		%SFFloat;	#FIXED ""
	articulationParameterValue0_changed	%SFFloat;	#FIXED ""
	articulationParameterValue1_changed	%SFFloat;	#FIXED ""
	articulationParameterValue2_changed	%SFFloat;	#FIXED ""
	articulationParameterValue3_changed	%SFFloat;	#FIXED ""
	articulationParameterValue4_changed	%SFFloat;	#FIXED ""
	articulationParameterValue5_changed	%SFFloat;	#FIXED ""
	articulationParameterValue6_changed	%SFFloat;	#FIXED ""
	articulationParameterValue7_changed	%SFFloat;	#FIXED ""
	isCollided   				CDATA		#FIXED ""
	collideTime   				%SFTime;	#FIXED ""
	isDetonated   				CDATA		#FIXED ""
	detonateTime   				%SFTime;	#FIXED ""
	firedTime   				%SFTime;	#FIXED ""
>
<!ATTLIST ReceiverPdu
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
>

<!ATTLIST SignalPdu
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
>

<!ATTLIST TransmitterPdu
	isStandAlone		 		CDATA		#FIXED ""
	isNetworkReader	 			CDATA		#FIXED ""
	isNetworkWriter	 			CDATA		#FIXED ""
	isRtpHeaderHeard     			CDATA		#FIXED ""
	isActive   				CDATA		#FIXED ""
	timestamp	 			%SFTime;	#FIXED ""
>

<!ATTLIST GeoElevationGrid
	set_height	%MFDouble; 	#FIXED "">

<!ATTLIST GeoPositionInterpolator
	set_fraction	 %SFFloat;	#FIXED ""
	value_changed	 %SFVec3f;	#FIXED ""
	geovalue_changed %SFVec3d;	#FIXED "">

<!ATTLIST GeoTouchSensor
	isActive		CDATA		#FIXED ""
	isOver			CDATA		#FIXED ""
	touchTime		%SFTime;	#FIXED ""
	hitGeoCoord_changed	%SFVec3d;	#FIXED ""
	hitNormal_changed	%SFVec3f;	#FIXED ""
	hitPoint_changed	%SFVec3f;	#FIXED ""
	hitTexCoord_changed 	%SFVec2f;	#FIXED "">

<!ATTLIST GeoViewpoint
	set_bind        CDATA        #FIXED ""
	set_orientation %SFRotation; #FIXED ""
	set_position    %SFVec3d;    #FIXED ""
	bindTime        %SFTime;     #FIXED ""
	isBound         CDATA        #FIXED "">

<!ATTLIST NurbsOrientationInterpolator
	set_fraction		%SFFloat;	#FIXED ""
	value_changed		%SFRotation;	#FIXED "">

<!ATTLIST NurbsPositionInterpolator
	set_fraction		%SFFloat;	#FIXED ""
	value_changed		%SFVec3f;	#FIXED "">

<!ATTLIST NurbsSurfaceInterpolator
	set_fraction		%SFVec2f;	#FIXED ""
	normal_changed		%SFVec3f;	#FIXED ""
	position_changed	%SFVec3f;	#FIXED "">

<!ATTLIST IndexedQuadSet
	set_index  %MFInt32; #FIXED "">

<!ATTLIST ComposedShader
	isSelected  CDATA #FIXED ""
	isValid  CDATA #FIXED ""
	activate CDATA #FIXED "">

<!ATTLIST PackagedShader
	isSelected  CDATA #FIXED ""
	isValid  CDATA #FIXED ""
	activate CDATA #FIXED "">

<!ATTLIST ProgramShader
	isSelected  CDATA #FIXED ""
	isValid  CDATA #FIXED ""
	activate CDATA #FIXED "">

A.4.3 x3d-3.2-Web3dExtensionsPublic.dtd

The public X3D DTD extension will be used to contain approved extensions that have not yet been included in Part 1 of ISO/IEC 19775. The form of the public X3D DTD extension is depicted below:

<!--
#
# X3D Web3D Extensions Public DTD:
#
#	http://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPublic.dtd
#
#	current version:  3.2.0
#
#	created:          30 April 2005
#	revised:          2 September 2007
#
#	Maintainer:       Don Brutzman
#
# Purpose: support Web3D Consortium extensions to the X3D tagset.
# The primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by node definitions in x3d-3.2-Web3dExtensionsPublic.dtd
# and x3d-3.2-Web3dExtensionsPrivate.dtd
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.2.dtd
#	http://www.web3d.org/specifications/x3d-3.2-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPrivate.dtd
#
# Web3D extensions update URL:
#	http://www.web3d.org/x3d/content/x3d-3.2-Web3dExtensionsPublic.dtd
#
# changelog:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
-->

<!-- ================================================================= -->

<!ENTITY % LatticeXvlComponent	"INCLUDE">

<!--
		LatticeXVL 1.0 Document Type Definition (DTD)

Description:	Define the XVL tag and attribute profile for X3D.

		This X3D native node corresponds to a VRML ExternProto
		declaration.

 		Elements in this tagset are enabled by setting the
		XvlProfile entity to "INCLUDE" at the top of an
		X3D scene file, as shown in several examples such as
		examples/LatticeXvl/XvlShellAll.x3d.  This flag then
		triggers inclusion of the XVL tags in the
		x3d-3.2.dtd tagset.

 Status:	Complete

 Authors:	Lattice Technology, Inc. proposed the Xvl extensions,
		Makito Seki produced XML encoding of XVL nodes for X3D
		with additional work by Marc Jablonski and Don Brutzman

 Reference:	LatticeXvl extension for X3D
 		http://www.web3d.org/x3d/content/examples/LatticeXvl/doc/proposal/LatticeProposal.html
 		http://www.Xvl3D.com

 Issues:	Mark Jablonski maintains the list.

 Created:	10 May 2001
-->

<![%LatticeXvlComponent;[

<!-- for future: G1T1 level -->

<!ENTITY % XvlG1T1ShellTypes "" >

<!-- Types of XVL Shells -->

<!ENTITY % XvlShell.shellTypes " %XvlG1T1ShellTypes; POLYGON_MESH | LATTICE_MESH " >


<!ELEMENT   XvlShell (IS?, (%MetadataNodes;)?, (
	( (%TextureCoordinateNodes;), ((%CoordinateNodes;) | %WildcardNodes;)  ) |
	( (%CoordinateNodes;), ((%TextureCoordinateNodes;) | %WildcardNodes;)? ) |
	( %WildcardNodes;, ((%TextureCoordinateNodes;) | (%CoordinateNodes;) | %WildcardNodes;)?) )?
)>
<!ATTLIST   XvlShell
	shellType          ( %XvlShell.shellTypes; )  #IMPLIED
	numberOfDivisions  	%SFInt32;	#IMPLIED
	vertexRound        	%MFFloat;	#IMPLIED
	edgeBeginCoordIndex	%MFInt32;	#IMPLIED
	edgeEndCoordIndex  	%MFInt32;	#IMPLIED
	edgeRound          	%MFFloat;	#IMPLIED
	edgeBeginVector    	%MFVec3f;	#IMPLIED
	edgeEndVector      	%MFVec3f;	#IMPLIED
	faceCoordIndex     	%MFInt32;	#IMPLIED
	faceTexCoordIndex  	%MFInt32;	#IMPLIED
	faceEmpty          	%MFBool; 	#IMPLIED
	faceHidden         	%MFBool; 	#IMPLIED
	containerField 	NMTOKEN 	"geometry"
	class		 	CDATA		""
	DEF                	ID      	#IMPLIED
	USE                	IDREF   	#IMPLIED>

]]>

<!-- ================================================================= -->

A.4.4 x3d-3.2-Web3dExtensionsPrivate.dtd

The private X3D DTD extension will be used to contain X3D extensions that have not been approved but may exist for testing future development. The form of the private X3D DTD extension is depicted below:

<!--
#
# X3D Web3D Extensions Private DTD:
#
#	http://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPrivate.dtd
#
#	current version:  3.2.0
#
#	created:          30 April 2005
#	revised:          2 September 2007
#
#	Maintainer:       Don Brutzman
#
# Purpose: support Web3D Consortium extensions to the X3D tagset.
# The primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by node definitions in x3d-3.2-Web3dExtensionsPublic.dtd
# and x3d-3.2-Web3dExtensionsPrivate.dtd
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.2.dtd
#	http://www.web3d.org/specifications/x3d-3.2-InputOutputFields.dtd
#	http://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPrivate.dtd
#
# Web3D extensions update URL:
#	http://www.web3d.org/x3d/content/x3d-3.2-Web3dExtensionsPublic.dtd
#
# changelog:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
-->

<!-- ================================================================= -->

	<!-- Enter ELEMENT and ATTLIST definitions here -->

<!-- ================================================================= -->

A.5 Version 3.3 dtds

A.5.1 x3d-3.3.dtd

x3d-3.3.dtd is the X3D DTD that validates X3D version 3.3 content:

<!--
# Extensible 3D (X3D) Specification Document Type Definition (DTD) x3d-3.3.dtd
#
#	http://www.web3d.org/specifications/x3d-3.3.dtd
#
#	current version:  3.3.0
#
#	created:          30 April 2005
#
#	Author:           Don Brutzman
#
# X3D Specification DTDs:
#	http://www.web3d.org/specifications/x3d-3.3.dtd
#	http://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPrivate.dtd
#
# X3D Revision DTDs:
#	http://www.web3d.org/x3d/content/x3d-3.3.dtd
#	http://www.web3d.org/x3d/content/x3d-3.3-Web3dExtensionsPublic.dtd
#	http://www.web3d.org/x3d/content/x3d-3.3-Web3dExtensionsPrivate.dtd
#
# Final doctype:
#  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "http://www.web3d.org/specifications/x3d-3.3.dtd">
#
# Transitional doctype:
#  <!DOCTYPE X3D PUBLIC "http://www.web3d.org/specifications/x3d-3.3.dtd" "file:///www.web3d.org/specifications/x3d-3.3.dtd">
#
# Typical system location for this resource:
#	file://c:/www.web3d.org/specifications/x3d-3.3.dtd
#	  file:///www.web3d.org/specifications/x3d-3.3.dtd
#
# Change log:
#	http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
# Further information on the Extensible 3D (X3D) specification is available at
#	http://www.web3D.org/x3d.html
-->
<!--	Profile:  default is Full profile and all components.
	Authors can override these default IGNORE/INCLUDE values.
	If InterchangeProfile or InteractiveProfile is INCLUDEd, then IGNORE all others.
-->
<!ENTITY % FullProfile "INCLUDE">
<!ENTITY % ImmersiveProfile "INCLUDE">
<!ENTITY % InterchangeProfile "IGNORE">
<!ENTITY % InteractiveProfile "IGNORE">
<!ENTITY % CadComponent "INCLUDE">
<!ENTITY % CubeMapTexturingComponent "INCLUDE">
<!ENTITY % DISComponent "INCLUDE">
<!ENTITY % GeoSpatialComponent "INCLUDE">
<!ENTITY % HAnimComponent "INCLUDE">
<!ENTITY % NurbsComponent "INCLUDE">
<!ENTITY % ShadersComponent "INCLUDE">
<!ENTITY % Texture3DComponent "INCLUDE">
<!ENTITY % LayeringComponent "INCLUDE">
<!ENTITY % LayoutComponent "INCLUDE">
<!ENTITY % RigidBodyPhysicsComponent "INCLUDE">
<!ENTITY % PickingSensorComponent "INCLUDE">
<!ENTITY % FollowersComponent "INCLUDE">
<!ENTITY % ParticleSystemsComponent "INCLUDE">
<!ENTITY % VolumeRenderComponent "INCLUDE">
<!ENTITY % Web3dExtensionComponent "INCLUDE">
<!ENTITY % X3dInputOutputFields "INCLUDE">
<!ENTITY % X3dExtensions "IGNORE">
<!ENTITY % profileNames "(Core|Interchange|CADInterchange|Interactive|Immersive|MedicalInterchange|MPEG4Interactive|Full)">
<!ENTITY % componentNames "(Core|CADGeometry|CubeMapTexturing|DIS|EnvironmentalEffects|EnvironmentalSensor|EventUtilities|Followers|Geometry2D|Geometry3D|Geospatial|Grouping|H-Anim|Interpolation|KeyDeviceSensor|Layering|Layout|Lighting|Navigation|Networking|NURBS|ParticleSystems|Picking|PointingDeviceSensor|Rendering|RigidBodyPhysics|Scripting|Shaders|Shape|Sound|Text|Texturing|Texturing3D|Time|VolumeRendering)">
<!ENTITY % componentLevels "(1|2|3|4|5)">
<!ENTITY % X3dFieldTypes "SFBool|MFBool|SFColor|MFColor|SFColorRGBA|MFColorRGBA|SFDouble|MFDouble|SFFloat|MFFloat|SFImage|MFImage|SFInt32|MFInt32|SFNode|MFNode|SFRotation|MFRotation|SFString|MFString|SFTime|MFTime|SFVec2f|MFVec2f|SFVec2d|MFVec2d|SFVec3f|MFVec3f|SFVec3d|MFVec3d|SFMatrix3d|MFMatrix3d|SFMatrix3f|MFMatrix3f|SFMatrix4d|MFMatrix4d|SFMatrix4f|MFMatrix4f|SFVec4d|MFVec4d|SFVec4f|MFVec4f">
<!-- X3D type definitions as DTD types -->
<!ENTITY % SFBool "(true|false)">
<!ENTITY % MFBool "CDATA">
<!ENTITY % SFColor "CDATA">
<!ENTITY % MFColor "CDATA">
<!ENTITY % SFColorRGBA "CDATA">
<!ENTITY % MFColorRGBA "CDATA">
<!ENTITY % SFFloat "CDATA">
<!ENTITY % MFFloat "CDATA">
<!ENTITY % SFDouble "CDATA">
<!ENTITY % MFDouble "CDATA">
<!ENTITY % SFImage "CDATA">
<!ENTITY % MFImage "CDATA">
<!ENTITY % SFInt32 "CDATA">
<!ENTITY % MFInt32 "CDATA">
<!ENTITY % SFRotation "CDATA">
<!ENTITY % MFRotation "CDATA">
<!ENTITY % SFString "CDATA">
<!ENTITY % MFString "CDATA">
<!ENTITY % SFTime "CDATA">
<!ENTITY % MFTime "CDATA">
<!ENTITY % SFVec2f "CDATA">
<!ENTITY % MFVec2f "CDATA">
<!ENTITY % SFVec2d "CDATA">
<!ENTITY % MFVec2d "CDATA">
<!ENTITY % SFVec3f "CDATA">
<!ENTITY % MFVec3f "CDATA">
<!ENTITY % SFVec3d "CDATA">
<!ENTITY % MFVec3d "CDATA">
<!ENTITY % SFVec4f "CDATA">
<!ENTITY % MFVec4f "CDATA">
<!ENTITY % SFVec4d "CDATA">
<!ENTITY % MFVec4d "CDATA">
<!ENTITY % SFMatrix3f "CDATA">
<!ENTITY % MFMatrix3f "CDATA">
<!ENTITY % SFMatrix3d "CDATA">
<!ENTITY % MFMatrix3d "CDATA">
<!ENTITY % SFMatrix4f "CDATA">
<!ENTITY % MFMatrix4f "CDATA">
<!ENTITY % SFMatrix4d "CDATA">
<!ENTITY % MFMatrix4d "CDATA">
<!ENTITY % DisNetworkModeValues             "(standAlone|networkReader|networkWriter)" >
<!ENTITY % MetadataContainerFieldValues     "(metadata|value)" >
<!ENTITY % TextureBoundaryModeValues        "(CLAMP|CLAMP_TO_EDGE|CLAMP_TO_BOUNDARY|MIRRORED_REPEAT|REPEAT)">
<!ENTITY % TextureMagnificationModeValues   "(AVG_PIXEL|DEFAULT|FASTEST|NEAREST_PIXEL|NICEST)">
<!ENTITY % TextureMinificationModeValues    "(AVG_PIXEL|AVG_PIXEL_AVG_MIPMAP|AVG_PIXEL_NEAREST_MIPMAP|DEFAULT|FASTEST|NEAREST_PIXEL|NEAREST_PIXEL_AVG_MIPMAP|NEAREST_PIXEL_NEAREST_MIPMAP|NICEST)">
<!ENTITY % TextureCompressionModeValues     "(DEFAULT|FASTEST|HIGH|LOW|MEDIUM|NICEST)">
<!ENTITY % TextureCoordinateGeneratorModes  "(SPHERE|CAMERASPACENORMAL|CAMERASPACEPOSITION|CAMERASPACEREFLECTIONVECTOR|SPHERE-LOCAL|COORD|COORD-EYE|NOISE|NOISE-EYE|SPHERE-REFLECT|SPHERE-REFLECT-LOCAL)">

<!--	DTD authors making modifications need to append | after listing each new node in any of these extensions.
	For an example, see examples/development/ProtoTagDtdDeclarationExamples.x3d   -->
<!ENTITY % AppearanceNodeExtensions "">
<!ENTITY % AudioClipNodeExtensions "">
<!ENTITY % BindableNodeExtensions "">
<!ENTITY % ColorNodeExtensions "">
<!ENTITY % CoordinateNodeExtensions "">
<!ENTITY % FontStyleNodeExtensions "">
<!ENTITY % EventUtilityNodeExtensions "">
<!ENTITY % GeometryNodeExtensions "">
<!ENTITY % GroupingNodeExtensions "">
<!ENTITY % InterpolatorNodeExtensions "">
<!ENTITY % LightNodeExtensions "">
<!ENTITY % MaterialNodeExtensions "">
<!ENTITY % MetadataNodeExtensions "">
<!ENTITY % NormalNodeExtensions "">
<!ENTITY % ScriptNodeExtensions "">
<!ENTITY % SensorNodeExtensions "">
<!ENTITY % ShapeNodeExtensions "">
<!ENTITY % SoundNodeExtensions "">
<!-- MovieTexture must be able to appear twice: -->
<!ENTITY % MovieTextureNodeExtensions "">
<!ENTITY % TextureNodeExtensions "">
<!ENTITY % TextureCoordinateNodeExtensions "">
<!ENTITY % TextureTransformNodeExtensions "">
<!ENTITY % NetworkSensorNodeExtensions "">
<!ENTITY % WorldInfoNodeExtensions "">
<!-- Users defining PROTOs do not override any of the following parameter entity declarations. -->
<![%ImmersiveProfile;[
<!ENTITY % WildcardNodes       	" (ProtoInstance) " >
]]>
<![%InterchangeProfile;[
<!ENTITY % WildcardNodes       	" " >
]]>
<![%DISComponent;[
<!ENTITY % DISGroupingNodes	" EspduTransform|SignalPdu|ReceiverPdu|TransmitterPdu|DISEntityManager|" >
]]>
<![%GeoSpatialComponent;[
<!ENTITY % GeoCoordinateNode		" GeoCoordinate|" >
<!ENTITY % GeoElevationGridNode		" GeoElevationGrid|" >
<!ENTITY % GeoGroupingNodes		" GeoLocation|GeoLOD|GeoTransform|" >
<!ENTITY % GeoMetadataNode		" GeoMetadata|" >
<!ENTITY % GeoOriginNode		" GeoOrigin|" >
<!ENTITY % GeoBehaviorNodes		" GeoPositionInterpolator|GeoTouchSensor|GeoProximitySensor|" >
<!ENTITY % GeoViewpointNode		" GeoViewpoint|" >
]]>
<![%HAnimComponent;[
<!ENTITY % HAnimGroupingNodes		" HAnimJoint|HAnimSegment|HAnimSite|HAnimHumanoid|" >
<!ENTITY % DisplacerNode		" HAnimDisplacer|" >
]]>
<![%NurbsComponent;[
<!ENTITY % NurbsGeometryNodes	  " NurbsCurve|NurbsPatchSurface|NurbsSweptSurface|NurbsSwungSurface|NurbsTrimmedSurface|" >
<!ENTITY % NurbsInterpolators	  " NurbsPositionInterpolator|NurbsOrientationInterpolator|NurbsSurfaceInterpolator|" >
<!ENTITY % NurbsControlCurveNodes " NurbsCurve2D|Contour2D|ContourPolyline2D " >
]]>
<![%CadComponent;[
<!ENTITY % CadGeometryNodes	  " QuadSet|IndexedQuadSet|" >
<!ENTITY % CadGroupingNodes	  " CADAssembly|CADLayer|CADPart|" >
]]>
<![%RigidBodyPhysicsComponent;[
<!ENTITY % RigidBodyPhysicsGroupingNodes	  " CollidableShape|CollisionSensor|RigidBodyCollection| " >
]]>
<![%CubeMapTexturingComponent;[
<!ENTITY % CubeMapTextureNodes	  " ComposedCubeMapTexture|GeneratedCubeMapTexture|ImageCubeMapTexture " >
]]>
<![%ShadersComponent;[
<!ENTITY % ShaderNodes	          " ComposedShader|PackagedShader|ProgramShader " >
<!ENTITY % ShaderAttributeNodes	  " FloatVertexAttribute|Matrix3VertexAttribute|Matrix4VertexAttribute" >
]]>
<![%Texture3DComponent;[
<!ENTITY % Texture3DTextureNodes		" ComposedTexture3D|ImageTexture3D|PixelTexture3D " >
<!ENTITY % Texture3DTextureCoordinateNodes	" TextureCoordinate3D|TextureCoordinate4D| " >
<!ENTITY % Texture3DTextureTransformNodes	" TextureTransformMatrix3D|TextureTransform3D " >
]]>
<![%FollowersComponent;[
<!ENTITY % FollowerNodes  "ColorChaser|ColorDamper|CoordinateChaser|CoordinateDamper|OrientationChaser|OrientationDamper|PositionChaser|PositionChaser2D|PositionDamper|PositionDamper2D|ScalarChaser|ScalarDamper|TexCoordChaser2D|TexCoordDamper2D" >
]]>
<![%VolumeRenderComponent;[
<!ENTITY % X3DComposableVolumeRenderStyleNodeExtensions "" >
<!ENTITY % X3DComposableVolumeRenderStyleNode " %X3DComposableVolumeRenderStyleNodeExtensions; BlendedVolumeStyle|BoundaryEnhancementVolumeStyle|CartoonVolumeStyle|ComposedVolumeStyle|EdgeEnhancementVolumeStyle|OpacityMapVolumeStyle|ProjectionVolumeStyle|ShadedVolumeStyle|SilhouetteEnhancementVolumeStyle|ToneMappedVolumeStyle " >
<!ENTITY % X3DVolumeDataNodeExtensions "" >
<!ENTITY % X3DVolumeDataNodes " %X3DVolumeDataNodeExtensions; IsoSurfaceVolumeData|SegmentedVolumeData|VolumeData| " >
]]>

<![%Web3dExtensionComponent;[
<!--
<!ENTITY % Web3dExtensionGeometryNodes	" XvlShell|" >
-->
]]>
<!-- otherwise set tag lists to null strings if not previously defined -->
<!ENTITY % DISGroupingNodes "">
<!ENTITY % GeoCoordinateNode "">
<!ENTITY % GeoElevationGridNode "">
<!ENTITY % GeoGroupingNodes "">
<!ENTITY % GeoMetadataNode "">
<!ENTITY % GeoOriginNode "">
<!ENTITY % GeoBehaviorNodes "">
<!ENTITY % GeoViewpointNode "">
<!ENTITY % HAnimGroupingNodes "">
<!ENTITY % DisplacerNode "">
<!ENTITY % NurbsGeometryNodes "">
<!ENTITY % NurbsInterpolators "">
<!ENTITY % CadGroupingNodes "">
<!ENTITY % RigidBodyPhysicsGroupingNodes "">
<!ENTITY % CadGeometryNodes "">
<!ENTITY % CubeMapTextureNodes "">
<!ENTITY % ShaderNodes "">
<!ENTITY % ShaderAttributeNodes "">
<!ENTITY % Texture3DTextureNodes "">
<!ENTITY % Texture3DTextureCoordinateNodes "">
<!ENTITY % Texture3DTextureTransformNodes "">
<!ENTITY % FollowerNodes "">
<!ENTITY % Web3dExtensionGroupingNodes "">
<!ENTITY % Web3dExtensionGeometryNodes "">
<!-- no further content-model extensions needed -->
<![%InterchangeProfile;[
<!ENTITY % AudioClipNodes "" >
<!ENTITY % FontStyleNodes "" >
<!ENTITY % EventUtilityNodes "" >
<!ENTITY % MovieTextureNodes "" >
<!ENTITY % NormalNodes "" >
<!ENTITY % ScriptNodes "" >
<!ENTITY % SoundNodes "" >
<!ENTITY % TextureCoordinateNodes "" >
<!ENTITY % TextureTransformNodes "" >
]]>
<!-- NetworkSensorNodes used by LoadSensor -->
<!ENTITY % NetworkSensorNodes " %NetworkSensorNodeExtensions; AudioClip|ImageCubeMapTexture|ImageTexture|ImageTexture3D|Inline|MovieTexture|PackagedShader|ShaderPart|ShaderProgram ">

<![%ImmersiveProfile;[

<!ENTITY % AudioClipNodes		" %AudioClipNodeExtensions; AudioClip " >

<!ENTITY % FontStyleNodes		" %FontStyleNodeExtensions; FontStyle|ScreenFontStyle " >

<!ENTITY % EventUtilityNodes		" %EventUtilityNodeExtensions; BooleanFilter|BooleanSequencer|BooleanToggle|BooleanTrigger|IntegerSequencer|IntegerTrigger|TimeTrigger " >

<!ENTITY % MovieTextureNodes		" %MovieTextureNodeExtensions; MovieTexture " >

<!ENTITY % NormalNodes			" %NormalNodeExtensions; Normal " >

<!ENTITY % ScriptNodes			" %ScriptNodeExtensions; Script " >

<!ENTITY % SoundNodes			" %SoundNodeExtensions; Sound " >

<!ENTITY % TextureCoordinateNodes	" %TextureCoordinateNodeExtensions; %Texture3DTextureCoordinateNodes; TextureCoordinate|TextureCoordinateGenerator|MultiTextureCoordinate|NurbsTextureCoordinate " >

<!ENTITY % TextureTransformNodes	" %TextureTransformNodeExtensions; TextureTransform|MultiTextureTransform " >
]]>
<![%InterchangeProfile;[
<!ENTITY % AppearanceNodes  	" Appearance " >

<!ENTITY % BehaviorLeafNodes	" CoordinateInterpolator|KeySensor|OrientationInterpolator|PositionInterpolator|ScalarInterpolator|TimeSensor|TouchSensor " >

<!ENTITY % BindableNodes    	" Background|NavigationInfo|Viewpoint " >

<!ENTITY % ColorNodes       	" Color|ColorRGBA " >

<!ENTITY % CoordinateNodes  	" Coordinate|CoordinateDouble|FogCoordinate " >

<!ENTITY % GeometryNodes    	" IndexedFaceSet|IndexedLineSet|LineSet|PointSet " >

<!ENTITY % GroupingNodes    	" Anchor|Group|Inline|Transform " >

<!ENTITY % LightNodes       	" DirectionalLight " >

<!ENTITY % MaterialNodes    	" Material|TwoSidedMaterial " >

<!ENTITY % ShapeNodes       	" Shape " >

<!ENTITY % Texture2DNodes   	" ImageTexture " >

<!ENTITY % WorldInfoNodes   	" WorldInfo " >
]]>
<![%ImmersiveProfile;[

<!ENTITY % AppearanceNodes  	" %AppearanceNodeExtensions; Appearance " >

<!ENTITY % BehaviorLeafNodes	" %InterpolatorNodeExtensions; %SensorNodeExtensions; %ScriptNodeExtensions; %GeoBehaviorNodes; %DisplacerNode; %NurbsInterpolators; %EventUtilityNodes;|ColorInterpolator|CoordinateInterpolator|CoordinateInterpolator2D|CylinderSensor|KeySensor|LoadSensor|LocalFog|NormalInterpolator|OrientationInterpolator|PlaneSensor|PositionInterpolator|PositionInterpolator2D|ProximitySensor|ScalarInterpolator|Script|SphereSensor|StringSensor|TimeSensor|TouchSensor|VisibilitySensor " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % BindableNodes    	" %BindableNodeExtensions; %GeoViewpointNode; Background|Fog|NavigationInfo|TextureBackground|Viewpoint|OrthoViewpoint " >

<!ENTITY % ColorNodes       	" %ColorNodeExtensions; Color|ColorRGBA " >

<!ENTITY % CoordinateNodes  	" %CoordinateNodeExtensions; %GeoCoordinateNode; Coordinate|CoordinateDouble " >

<!ENTITY % Geometry2DNodes      " Arc2D|ArcClose2D|Circle2D|Disk2D|Polyline2D|Polypoint2D|Rectangle2D|TriangleSet2D| " >

<!ENTITY % GeometryNodes    	" %GeometryNodeExtensions; %GeoElevationGridNode; %NurbsGeometryNodes; %CadGeometryNodes; %Web3dExtensionGeometryNodes; %Geometry2DNodes; Box|Cone|Cylinder|ElevationGrid|Extrusion|IndexedFaceSet|IndexedLineSet|LineSet|PointSet|Sphere|Text|IndexedTriangleFanSet|IndexedTriangleSet|IndexedTriangleStripSet|TriangleFanSet|TriangleSet|TriangleStripSet " >

<!ENTITY % GroupingNodes    	" %GroupingNodeExtensions; %DISGroupingNodes; %GeoGroupingNodes; %HAnimGroupingNodes; %CadGroupingNodes; %RigidBodyPhysicsGroupingNodes; %Web3dExtensionGroupingNodes; Anchor|Billboard|Collision|Group|Inline|LOD|StaticGroup|Switch|Transform " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % LightNodes       	" %LightNodeExtensions; DirectionalLight|SpotLight|PointLight " >

<!ENTITY % MaterialNodes    	" %MaterialNodeExtensions; Material|TwoSidedMaterial " >

<!ENTITY % ShapeNodes       	" %ShapeNodeExtensions; %X3DVolumeDataNodes; Shape " >

<!ENTITY % Texture2DNodes   	" %TextureNodeExtensions; ImageTexture|MovieTexture|PixelTexture " >

<!ENTITY % MultiTextureChildTextures " %TextureNodeExtensions; ImageTexture|MovieTexture|PixelTexture " >

<!ENTITY % WorldInfoNodes   	" %WorldInfoNodeExtensions; %GeoMetadataNode; WorldInfo " >
]]>
<![%InterchangeProfile;[
<!ENTITY % ComposedGeometryNodes " %ColorNodes; " >

<!ENTITY % AppearanceChildNodes	" %MaterialNodes; " >

<!ENTITY % SceneLeafNodes   	" %LightNodes;|%ShapeNodes;|%WorldInfoNodes; " >

<!ENTITY % MetadataNodes 	" %MetadataNodeExtensions; MetadataBoolean|MetadataDouble|MetadataFloat|MetadataInteger|MetadataSet|MetadataString ">

<!ENTITY % ProtoNodes       	"" >
]]>
<![%ImmersiveProfile;[
<!ENTITY % ComposedGeometryNodes " %ShaderAttributeNodes;|%CoordinateNodes;|%ColorNodes;|%NormalNodes;|%TextureCoordinateNodes;|FogCoordinate " >

<!-- weak validation: allows multiple copies of any given node -->
<!ENTITY % AppearanceChildNodes  " LineProperties|FillProperties|%MaterialNodes;|%Texture2DNodes;|MultiTexture|%CubeMapTextureNodes;|%ShaderNodes;|%Texture3DTextureNodes;|%TextureTransformNodes;|%Texture3DTextureTransformNodes; " >

<!ENTITY % SceneLeafNodes   	 " %LightNodes;|%ShapeNodes;|%SoundNodes;|%WorldInfoNodes; " >

<!ENTITY % OtherLeafNodes   	 " AudioClip|LineProperties|FillProperties " >

<!ENTITY % MetadataNodes 	 " %MetadataNodeExtensions; MetadataBoolean|MetadataDouble|MetadataFloat|MetadataInteger|MetadataSet|MetadataString ">
]]>
<![%FullProfile;[
<!ENTITY % PickingNodes          " LinePickSensor|PointPickSensor|PrimitivePickSensor|VolumePickSensor| ">
<!ENTITY % AdvancedInterpolators " EaseInEaseOut|SplinePositionInterpolator|SplinePositionInterpolator2D|SplineScalarInterpolator|SquadOrientationInterpolator| ">
]]>
<!ENTITY % PickingNodes          " ">
<!ENTITY % AdvancedInterpolators " ">

<!-- Full Profile -->

<!ENTITY % BehaviorLeafNodes	 " %InterpolatorNodeExtensions; %SensorNodeExtensions; %ScriptNodeExtensions; %GeoBehaviorNodes; %DisplacerNode; %NurbsInterpolators; %EventUtilityNodes;|ColorInterpolator|CoordinateInterpolator|CoordinateInterpolator2D|CylinderSensor|KeySensor|LoadSensor|LocalFog|NormalInterpolator|OrientationInterpolator|PlaneSensor|PositionInterpolator|PositionInterpolator2D|ProximitySensor|ScalarInterpolator|Script|SphereSensor|StringSensor|TimeSensor|TouchSensor|VisibilitySensor " >

<!ENTITY % ChildrenNodes         " %BehaviorLeafNodes;|%BindableNodes;|%GroupingNodes;|%SceneLeafNodes;|%FollowerNodes;|ClipPlane|LayerSet|TransformSensor|ViewpointGroup|%PickingNodes; %AdvancedInterpolators; ProtoDeclare|ExternProtoDeclare|ROUTE|EXPORT|IMPORT ">

<!ENTITY % ProtoNodes       	 " %OtherLeafNodes;|%AppearanceNodes;|%AppearanceChildNodes;|%BehaviorLeafNodes;|%BindableNodes;|%CubeMapTextureNodes;|%FontStyleNodes;|%ComposedGeometryNodes;|%GeometryNodes;|%GroupingNodes;|ShaderPart|ShaderProgram|%MetadataNodes;|%SceneLeafNodes;|%Texture3DTextureNodes;|%Texture3DTextureTransformNodes;|%GeoOriginNode;Contour2D|ContourPolyline2D|%FollowerNodes;|BallJoint|CollidableOffset|CollisionCollection|CollisionSpace|Contact|DoubleAxisHingeJoint|MotorJoint|RigidBody|SingleAxisHingeJoint|SliderJoint|UniversalJoint|ProtoDeclare|ExternProtoDeclare|ProtoInstance " >

<![%InterchangeProfile;[
<!ENTITY % SceneNodes       	 " %ChildrenNodes;|%WildcardNodes; " >
]]>
<![%ImmersiveProfile;[
<!ENTITY % SceneNodes       	 " ExternProtoDeclare|ProtoDeclare|%ChildrenNodes;|%WildcardNodes; " >
]]>
<!-- Additional SensorNode definitions not used (yet, anyway) in tagset content-model definitions. -->
<!ENTITY % SensorNodes " Anchor|Collision|CylinderSensor|KeySensor|PlaneSensor|ProximitySensor|SphereSensor|StringSensor|TimeSensor|TouchSensor|VisibilitySensor ">
<!ENTITY % DragSensors " CylinderSensor|PlaneSensor|SphereSensor ">
<!ENTITY % EnvironmentalSensorNodes " Collision|ProximitySensor|TimeSensor|VisibilitySensor ">
<!ENTITY % PickSensors " LinePickSensor|PointPickSensor|PrimitivePickSensor|VolumePickSensor ">
<!ENTITY % PointingDeviceSensors " Anchor|CylinderSensor|PlaneSensor|SphereSensor|TouchSensor ">
<!ENTITY % KeyDeviceSensors " ">
<!ENTITY % InterpolatorNodes " ColorInterpolator|CoordinateInterpolator|CoordinateInterpolator2D|NormalInterpolator|OrientationInterpolator|PositionInterpolator|PositionInterpolator2D|ScalarInterpolator|SplinePositionInterpolator|SplinePositionInterpolator2D|SplineScalarInterpolator|SquadOrientationInterpolator">
<!ENTITY % TimeDependentNodes " AudioClip|MovieTexture|TimeSensor ">
<!-- ***** X3D DTD ***** -->
<![%ImmersiveProfile;[
<!ELEMENT Anchor (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST Anchor
	description %SFString; #IMPLIED
	parameter   %MFString; #IMPLIED
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       NMTOKENS      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED >
]]>
<![%InterchangeProfile;[
<!ELEMENT Anchor (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* >
<!ATTLIST Anchor
	url         %MFString; #IMPLIED
	bboxCenter  %SFVec3f;  "0 0 0"
	bboxSize    %SFVec3f;  "-1 -1 -1"
	containerField NMTOKEN "children"
	class       NMTOKENS      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED >
]]>
<![%InterchangeProfile;[
<!ELEMENT Appearance ( (%MetadataNodes;)?,
(  ((%MaterialNodes;), (%Texture2DNodes; | MultiTexture)?  )
 | ((%Texture2DNodes; | MultiTexture),  (%MaterialNodes;)? )
)? ) >
]]>
<!ELEMENT Appearance (IS?, (%MetadataNodes;)?, (%AppearanceChildNodes; | %WildcardNodes;)*)>
<!ATTLIST Appearance
	containerField NMTOKEN "appearance"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT AudioClip ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST AudioClip
	description %SFString; #IMPLIED
	loop        %SFBool;   "false"
	pitch       %SFFloat;  "1.0"
	startTime   %SFTime;   "0"
	stopTime    %SFTime;   "0"
	pauseTime   %SFTime;   "0"
	resumeTime  %SFTime;   "0"
	url         %MFString; #IMPLIED
	containerField NMTOKEN "source"
	class       NMTOKENS      #IMPLIED
	DEF         ID         #IMPLIED
	USE         IDREF      #IMPLIED>
]]>
<!ELEMENT Background ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Background
	groundAngle %MFFloat; #IMPLIED
	groundColor %MFColor; #IMPLIED
	backUrl %MFString; #IMPLIED
	bottomUrl %MFString; #IMPLIED
	frontUrl %MFString; #IMPLIED
	leftUrl %MFString; #IMPLIED
	rightUrl %MFString; #IMPLIED
	topUrl %MFString; #IMPLIED
	skyAngle %MFFloat; #IMPLIED
	skyColor %MFColor; "0 0 0"
	transparency %SFFloat; "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT Billboard (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST Billboard
	axisOfRotation %SFVec3f; "0 1 0"
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF            ID        #IMPLIED
	USE            IDREF     #IMPLIED>

<!ELEMENT BooleanFilter ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanFilter
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFBool; #IMPLIED
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanToggle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanToggle
	toggle      %SFBool;  "false"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT BooleanTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST BooleanTrigger
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!-- Geometry2D nodes -->

<!ELEMENT Arc2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Arc2D
	radius     %SFFloat; "1"
	startAngle %SFFloat; "0"
	endAngle   %SFFloat; "1.570796"
	containerField NMTOKEN "geometry"
	class      NMTOKENS    #IMPLIED
	DEF  ID    #IMPLIED
	USE  IDREF #IMPLIED>

<!ELEMENT ArcClose2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ArcClose2D
	radius      %SFFloat; "1"
	startAngle  %SFFloat; "0"
	endAngle    %SFFloat; "1.570796"
	closureType (PIE|CHORD) "PIE"
	solid %SFBool; "false"
	containerField NMTOKEN "geometry"
	class       NMTOKENS    #IMPLIED
	DEF  ID     #IMPLIED
	USE  IDREF  #IMPLIED>

<!ELEMENT Circle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Circle2D
	radius     %SFFloat; "1"
	containerField NMTOKEN "geometry"
	class      NMTOKENS    #IMPLIED
	DEF  ID    #IMPLIED
	USE  IDREF #IMPLIED>

<!ELEMENT Disk2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Disk2D
	innerRadius %SFFloat; "0"
	outerRadius %SFFloat; "1"
	solid %SFBool; "false"
	containerField NMTOKEN "geometry"
	class       NMTOKENS    #IMPLIED
	DEF  ID     #IMPLIED
	USE  IDREF  #IMPLIED>

<!ELEMENT Polyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polyline2D
	lineSegments %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT Polypoint2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Polypoint2D
	point       %MFVec2f; #IMPLIED
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT Rectangle2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Rectangle2D
	size         %SFVec2f; "2 2"
	solid %SFBool; "false"
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>

<!ELEMENT TriangleSet2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TriangleSet2D
	vertices     %MFVec2f; #IMPLIED
	solid %SFBool; "false"
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF  ID      #IMPLIED
	USE  IDREF   #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT Box ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Box
	size  %SFVec3f; "2 2 2"
	solid %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       NMTOKENS       #IMPLIED
	DEF  ID        #IMPLIED
	USE  IDREF     #IMPLIED>

<!ELEMENT Collision ( (IS?), (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* )  >
<!ATTLIST Collision
	enabled     %SFBool;  "true"
	bboxCenter  %SFVec3f; "0 0 0"
	bboxSize    %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class       NMTOKENS       #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED >
]]>
<!ELEMENT Color ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Color
	color %MFColor; #IMPLIED
	class NMTOKENS #IMPLIED
	containerField NMTOKEN "color"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ColorRGBA ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ColorRGBA
	color %MFColorRGBA; #IMPLIED
	containerField NMTOKEN "color"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT component EMPTY>
<!ATTLIST component
	name  %componentNames;  #REQUIRED
	level %componentLevels; #REQUIRED
>
<![%ImmersiveProfile;[
<!ELEMENT ColorInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ColorInterpolator
	key         %MFFloat; #IMPLIED
	keyValue    %MFColor; #IMPLIED
	containerField NMTOKEN "children"
	class       NMTOKENS       #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT Cone ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cone
	bottomRadius %SFFloat; "1"
	height       %SFFloat; "2"
	side         %SFBool;  "true"
	bottom       %SFBool;  "true"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class       NMTOKENS       #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Coordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Coordinate
	point %MFVec3f; #IMPLIED
	containerField NMTOKEN "coord"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CoordinateDouble ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateDouble
	point %MFVec3d; #IMPLIED
	containerField NMTOKEN "coord"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CoordinateInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST CoordinateInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT CoordinateInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CoordinateInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT Cylinder ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Cylinder
	bottom   %SFBool; "true"
	height   %SFFloat; "2"
	radius   %SFFloat; "1"
	side     %SFBool;  "true"
	top      %SFBool;  "true"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class    NMTOKENS  #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT CylinderSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST CylinderSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	axisRotation %SFRotation; "0 1 0 0"
	diskAngle  %SFFloat;    "0.26179167"
	maxAngle   %SFFloat;    "-1"
	minAngle   %SFFloat;    "0"
	offset     %SFFloat;    "0"
	enabled    %SFBool;     "true"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>

<!ELEMENT DirectionalLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST DirectionalLight
	ambientIntensity %SFFloat; "0"
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	global         %SFBool;  "false"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[
<!ELEMENT DirectionalLight (%MetadataNodes;)? >
<!ATTLIST DirectionalLight
	color            %SFColor; "1 1 1"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	on               %SFBool;  "true"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!-- Complete, concisely enumerated unordered version of ElevationGrid by Heiko Grussbach -->
<!ELEMENT ElevationGrid (IS?, (%MetadataNodes;)?, (
   ((%ColorNodes;), (		((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
|((%NormalNodes;), (		((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
|((%TextureCoordinateNodes;), (((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
|(%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
			((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
)?, (FogCoordinate)? ) >

<!ATTLIST ElevationGrid
	height          %MFFloat; #IMPLIED
	ccw             %SFBool;  "true"
	colorPerVertex  %SFBool;  "true"
	creaseAngle     %SFFloat; "0"
	normalPerVertex %SFBool;  "true"
	solid           %SFBool;  "true"
	xDimension      %SFInt32; "0"
	xSpacing        %SFFloat; "1.0"
	zDimension      %SFInt32; "0"
	zSpacing        %SFFloat; "1.0"
	containerField NMTOKEN "geometry"
	class    NMTOKENS     #IMPLIED
	DEF             ID        #IMPLIED
	USE             IDREF     #IMPLIED>

<!ELEMENT ExternProtoDeclare ( field* ) >
<!ATTLIST ExternProtoDeclare
	name		NMTOKEN		#REQUIRED
	url		%MFString;	#REQUIRED
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT Extrusion ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Extrusion
	beginCap     %SFBool;     "true"
	ccw          %SFBool;     "true"
	convex       %SFBool;     "true"
	creaseAngle  %SFFloat;    "0.0"
	crossSection %MFVec2f;    "1 1 1 -1 -1 -1 -1 1 1 1"
	endCap       %SFBool;     "true"
	orientation  %MFRotation; "0 0 1 0"
	scale        %MFVec2f;    "1 1"
	solid        %SFBool;     "true"
	spine        %MFVec3f;    "0 0 0 0 1 0"
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF          ID           #IMPLIED
	USE          IDREF        #IMPLIED>

<!-- field is only used in a Script, ProtoDeclare or ExternProtoDeclare.
     Initialization values for simple types go in the value attribute.
     Contained content tags are only for initialization of SFNode or MFNode values. -->

<!ELEMENT field  ( %ProtoNodes; )* >
<!ATTLIST field
	name       	NMTOKEN  	#REQUIRED
	accessType (inputOnly|outputOnly|initializeOnly|inputOutput) #REQUIRED
	type 	   ( %X3dFieldTypes; ) #REQUIRED
	value      	CDATA   	#IMPLIED
	appinfo 	%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!-- fieldValue resets default field values inside a ProtoInstance.
     Initialization values for simple types go in the value attribute.  Otherwise
     contained-content tags are used for initialization of SFNode or MFNode values. -->

<!ELEMENT fieldValue ( %ProtoNodes; )* >
<!ATTLIST fieldValue
	name	NMTOKEN	#REQUIRED
	value	CDATA	#IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT FillProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FillProperties
	filled   %SFBool;   "true"
	hatched  %SFBool;   "true"
	hatchStyle  %SFInt32;      "1"
	hatchColor  %SFColor;      "1 1 1"
	containerField NMTOKEN "fillProperties"
	class    NMTOKENS     #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT Fog ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Fog
	color           %SFColor;            "1 1 1"
	fogType         (LINEAR|EXPONENTIAL) "LINEAR"
	visibilityRange %SFFloat;            "0"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT FontStyle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FontStyle
	family      %MFString; '&quot;SERIF&quot;'
	horizontal  %SFBool;   "true"
	justify     %MFString; '&quot;BEGIN&quot;'
	language    %SFString; #IMPLIED
	leftToRight %SFBool;   "true"
	size        %SFFloat;  "1.0"
	spacing     %SFFloat;  "1.0"
	style       (PLAIN|BOLD|ITALIC|BOLDITALIC) "PLAIN"
	topToBottom %SFBool;   "true"
	containerField NMTOKEN "fontStyle"
	class       NMTOKENS    #IMPLIED
	DEF         ID          #IMPLIED
	USE         IDREF       #IMPLIED>
<!-- Minimum supported values:
	family  ' "SERIF" "SANS" "TYPEWRITER" '
	justify ' "FIRST" "BEGIN" "MIDDLE" "END" ' -->
]]>
<!ELEMENT Group (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Group
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ImageTexture ((IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)?)>
<!ATTLIST ImageTexture
	url %MFString; #IMPLIED
	repeatS %SFBool; "true"
	repeatT %SFBool; "true"
	containerField NMTOKEN "texture"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- Complete, unordered, concisely enumerated version of IndexedFaceSet content model by Heiko Grussbach -->
<!ENTITY % ColorCoordinateNormalTextureCoordinateContentModel "(IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	((%CoordinateNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	   			(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%CoordinateNodes;), (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%NormalNodes;),  (
 	((%ColorNodes;), (	((%CoordinateNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
|(%WildcardNodes;,  (
	((%ColorNodes;), (	((%CoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%CoordinateNodes;),(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%CoordinateNodes;)|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%CoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%CoordinateNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)?, (FogCoordinate)? )">
<![%ImmersiveProfile;[
<!ELEMENT IndexedFaceSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*) >

<!ELEMENT IndexedLineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >

<!ELEMENT LineSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT IndexedFaceSet ( (%MetadataNodes;)?, ((%ColorNodes;), Coordinate?)|(Coordinate, (%ColorNodes;)?) )? >

<!ELEMENT IndexedLineSet ( (%MetadataNodes;)?, ( Color, Coordinate? )|( Coordinate, Color?) )? >

<!ELEMENT LineSet ( (%MetadataNodes;)?, ( Color, Coordinate? )|( Coordinate, Color?) )? >
]]>
<!ATTLIST IndexedFaceSet
	ccw %SFBool; "true"
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	convex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	creaseAngle %SFFloat; "0"
	normalIndex %MFInt32; #IMPLIED
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	texCoordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ATTLIST IndexedLineSet
	colorIndex %MFInt32; #IMPLIED
	colorPerVertex %SFBool; "true"
	coordIndex %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ATTLIST LineSet
	vertexCount %MFInt32; #IMPLIED
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Inline ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Inline
	load %SFBool; "true"
	url %MFString; #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT EXPORT EMPTY>
<!ATTLIST EXPORT
	localDEF IDREF #REQUIRED
	AS NMTOKEN #IMPLIED
>
<!ELEMENT IMPORT EMPTY>
<!ATTLIST IMPORT
	inlineDEF IDREF #REQUIRED
	importedDEF NMTOKEN #REQUIRED
	AS ID #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT IntegerSequencer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerSequencer
	key      %MFFloat; #IMPLIED
	keyValue %MFInt32; #IMPLIED
	containerField NMTOKEN "children"
	class    NMTOKENS  #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IntegerTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST IntegerTrigger
	integerKey   %SFInt32; "-1"
	containerField NMTOKEN "children"
	class    NMTOKENS  #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT IS (connect)+ >

<!ELEMENT connect EMPTY >
<!ATTLIST connect
	nodeField   NMTOKEN #REQUIRED
	protoField  NMTOKEN #REQUIRED>
]]>
<!ELEMENT KeySensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST KeySensor
	enabled %SFBool; "true"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT LineProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST LineProperties
	applied %SFBool; "true"
	linetype %SFInt32; "1"
	linewidthScaleFactor %SFFloat; "0"
	containerField NMTOKEN "lineProperties"
	class    NMTOKENS     #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>
]]>
<!ELEMENT LoadSensor (IS?, (%MetadataNodes;)?, (%NetworkSensorNodes; | %WildcardNodes;)*)>
<!ATTLIST LoadSensor
	enabled %SFBool; "true"
	timeOut %SFTime; "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT LOD (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST LOD
	forceTransitions %SFBool; "false"
	center %SFVec3f; "0 0 0"
	range  %MFFloat; #IMPLIED
	bboxCenter     %SFVec3f; "0 0 0"
	bboxSize       %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class  NMTOKENS  #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT Material ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Material
	ambientIntensity %SFFloat; "0.2"
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	shininess        %SFFloat; "0.2"
	specularColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class       NMTOKENS  #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>
]]>
<![%InterchangeProfile;[
<!ELEMENT Material ( (%MetadataNodes;)? ) >
<!ATTLIST Material
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	containerField NMTOKEN "material"
	class    NMTOKENS     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<!-- *** XHTML exerpts to define meta tag *** -->
<!-- i18n, language, meta tag definitions from XHTML 1.0
     http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd -->
<!ENTITY % LanguageCode "NMTOKEN">
<!-- a language code, as per [IETF RFC3066/BCP47] http://www.rfc-editor.org/bcp/bcp47.txt -->
<!-- internationalization attributes
  lang        language code (backwards compatible)
  xml:lang    language code (as per XML 1.0 spec)
  dir         direction for weak/neutral text
-->
<!ENTITY % i18n "lang        %LanguageCode; #IMPLIED
  xml:lang    %LanguageCode; #IMPLIED
  dir         (ltr|rtl)      #IMPLIED">
<!ELEMENT head (component*, unit*, meta*)>
<!-- generic metadata information, matches HTML usage, made attribute 'name' required -->
<!ELEMENT meta EMPTY>
<!ATTLIST meta
	http-equiv CDATA #IMPLIED
	name CDATA #IMPLIED
	content CDATA #REQUIRED
	scheme CDATA #IMPLIED
	%i18n;
>
<!-- formal X3D Metadata nodes -->
<!-- cannot require @name field or else USE nodes fail to validate -->
<!ELEMENT MetadataDouble (IS?, (%MetadataNodes; | %WildcardNodes;)?)>
<!ATTLIST MetadataDouble
	name %SFString; #IMPLIED
	value %MFDouble; #IMPLIED
	reference %SFString; #IMPLIED
	containerField %MetadataContainerFieldValues; "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MetadataFloat (IS?, (%MetadataNodes; | %WildcardNodes;)?)>
<!ATTLIST MetadataFloat
	name %SFString; #IMPLIED
	value %MFFloat; #IMPLIED
	reference %SFString; #IMPLIED
	containerField %MetadataContainerFieldValues; "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MetadataInteger (IS?, (%MetadataNodes; | %WildcardNodes;)?)>
<!ATTLIST MetadataInteger
	name %SFString; #IMPLIED
	value %MFInt32; #IMPLIED
	reference %SFString; #IMPLIED
	containerField %MetadataContainerFieldValues; "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MetadataString (IS?, (%MetadataNodes; | %WildcardNodes;)?)>
<!ATTLIST MetadataString
	name %SFString; #IMPLIED
	value %MFString; #IMPLIED
	reference %SFString; #IMPLIED
	containerField %MetadataContainerFieldValues; "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- containerField discriminates whether child Metadata node(s) are 'metadata' or 'value' fields. -->
<!ELEMENT MetadataSet (IS?, (%MetadataNodes; | %WildcardNodes;)*)>
<!ATTLIST MetadataSet
	reference %SFString; #IMPLIED
	name %SFString; #IMPLIED
	containerField %MetadataContainerFieldValues; "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!-- FAQ:  MovieTexture
	containerField='source'  when used as a Sound source,
	containerField='texture' when used as a Appearance texture source-->
<!ELEMENT MovieTexture ( (IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)? ) >
<!ATTLIST MovieTexture
	loop      %SFBool;   "false"
	speed     %SFFloat;  "1.0"
	startTime %SFTime;   "0"
	stopTime  %SFTime;   "0"
	url       %MFString; #IMPLIED
	repeatS   %SFBool;   "true"
	repeatT   %SFBool;   "true"
	pauseTime %SFTime;   "0"
	resumeTime %SFTime;  "0"
	containerField NMTOKEN "texture"
	class     NMTOKENS   #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTexture ( (IS?), (%MetadataNodes;)?, (%MultiTextureChildTextures;|%WildcardNodes; )* ) >
<!ATTLIST MultiTexture
	mode           %MFString;	#IMPLIED
	source         %MFString;	#IMPLIED
	function       %MFString;	#IMPLIED
	color          %SFColor;  "1 1 1"
	alpha          %SFFloat;  "1.0"
	containerField NMTOKEN "texture"
	class     NMTOKENS   #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!ELEMENT MultiTextureCoordinate ((IS?), (%MetadataNodes;)?, (TextureCoordinate|TextureCoordinateGenerator|ProtoInstance)* ) >
<!ATTLIST MultiTextureCoordinate
	containerField NMTOKEN "texCoord"
	class     NMTOKENS   #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>
]]>
<!ELEMENT NavigationInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST NavigationInfo
	avatarSize %MFFloat; "0.25 1.6 0.75"
	headlight %SFBool; "true"
	speed %SFFloat; "1"
	type %MFString; "&quot;EXAMINE&quot; &quot;ANY&quot;"
	transitionType %MFString; "&quot;LINEAR&quot;"
	transitionTime %MFFloat; "1.0"
	visibilityLimit %SFFloat; "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT Normal ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Normal
	vector    %MFVec3f; #IMPLIED
	containerField NMTOKEN "normal"
	class    NMTOKENS     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>

<!ELEMENT NormalInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NormalInterpolator
	key      %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class    NMTOKENS  #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<!ELEMENT OrientationInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST OrientationInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFRotation; #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT PixelTexture ( (IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)? ) >
<!ATTLIST PixelTexture
	image   %SFImage; "0 0 0"
	repeatS %SFBool;  "true"
	repeatT %SFBool;  "true"
	containerField NMTOKEN "texture"
	class   NMTOKENS  #IMPLIED
	DEF     ID        #IMPLIED
	USE     IDREF     #IMPLIED>

<!ELEMENT PlaneSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PlaneSensor
	description %SFString; #IMPLIED
	autoOffset  %SFBool;  "true"
	axisRotation %SFRotation; "0 1 0 0"
	enabled     %SFBool;  "true"
	maxPosition %SFVec2f; "-1 -1"
	minPosition %SFVec2f; "0 0"
	offset      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class       NMTOKENS  #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT PointLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PointLight
	ambientIntensity %SFFloat;	"0"
	attenuation      %SFVec3f;	"1 0 0"
	color            %SFColor;	"1 1 1"
	intensity        %SFFloat;	"1"
	location         %SFVec3f;	"0 0 0"
	on               %SFBool;	"true"
	radius	 	 %SFFloat;	"100"
	global         %SFBool;  "true"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF	  	 ID		#IMPLIED
	USE		 IDREF		#IMPLIED>

<!ELEMENT PointSet (IS?, (%MetadataNodes;)?, (
	( (%ColorNodes;), ((%CoordinateNodes;)|%WildcardNodes;)? ) |
	( (%CoordinateNodes;), ((%ColorNodes;)|%WildcardNodes;)? ) |
	( %WildcardNodes;, ((%ColorNodes;)|(%CoordinateNodes;)|%WildcardNodes;)?)
)? ) >
]]>
<![%InterchangeProfile;[
<!ELEMENT PointSet ( (%MetadataNodes;)?, ( ( Color, Coordinate? )|( Coordinate, Color? ) )? ) >
]]>
<!ATTLIST PointSet
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST PositionInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFVec3f; #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT PositionInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PositionInterpolator2D
	key      %MFFloat; #IMPLIED
	keyValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class    NMTOKENS  #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT ProtoInterface ( field* ) >

<!-- choice of required first node contained in ProtoBody constrained by valid ( %ProtoNodes; ) rather than %SceneNodes; ) >  -->

<!ELEMENT ProtoBody      ( ( %ProtoNodes; ), ( %SceneNodes; )* ) >

<!ELEMENT ProtoDeclare (ProtoInterface? , ProtoBody) > <!-- (|( field*, ( %ProtoNodes; ), ( %SceneNodes; )* )) -->
<!ATTLIST ProtoDeclare
	name 		NMTOKEN   	#REQUIRED
	appinfo		%SFString;	#IMPLIED
	documentation	%SFString;	#IMPLIED>

<!ELEMENT ProtoInstance ( fieldValue* , (IS?) ) >
<!-- ( %SceneNodes; )* --><!-- direct children disallowed, let fieldValue name="children" handle them -->
<!ATTLIST ProtoInstance
	name     NMTOKEN           #REQUIRED
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF      ID                #IMPLIED
	USE      IDREF             #IMPLIED>

<!ELEMENT ProximitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ProximitySensor
	center      %SFVec3f;    "0 0 0"
	size        %SFVec3f;    "0 0 0"
	enabled     %SFBool;     "true"
	containerField NMTOKEN "children"
	class       NMTOKENS     #IMPLIED
	DEF         ID           #IMPLIED
	USE         IDREF        #IMPLIED>
]]>
<!ELEMENT ROUTE EMPTY>
<!ATTLIST ROUTE
	fromNode IDREF #REQUIRED
	fromField NMTOKEN #REQUIRED
	toNode IDREF #REQUIRED
	toField NMTOKEN #REQUIRED
>
<!ELEMENT ScalarInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST ScalarInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFFloat; #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Scene ((%MetadataNodes; | %SceneNodes;)*)>

<!-- Script is similar to PROTO regarding user definition of multiple fields -->
<![%ImmersiveProfile;[
<!-- Script source code is included as a CDATA section, which actually follows content-model order:
     first field* definitions, one IS? definition and one Metadata node definition can appear.
     However DOCTYPE expressive power cannot provide more restrictive validation than their presence.
     X3D Schema checks both order and numbering of those contained elements.  -->

<!ELEMENT Script ( #PCDATA|field|IS|%MetadataNodes; )* >
<!ATTLIST Script
	url          %MFString; #IMPLIED
	directOutput %SFBool; "false"
	mustEvaluate %SFBool; "false"
	containerField NMTOKEN "children"
	class        NMTOKENS       #IMPLIED
  	DEF ID       #IMPLIED
	USE IDREF    #IMPLIED>

<!ELEMENT Shape
((IS?, (%MetadataNodes;)?),
  (
     ( %AppearanceNodes;, ( %GeometryNodes;   | %WildcardNodes;  )? ) |
     ( (%GeometryNodes;), ( %AppearanceNodes; | %WildcardNodes;  )? ) |
     ( %WildcardNodes;,   ( %GeometryNodes;   | %AppearanceNodes; | %WildcardNodes; )? )
  )?
)
>
]]>
<![%InterchangeProfile;[
<!ELEMENT Shape ( (%MetadataNodes;)?,
	( (%AppearanceNodes;), ( %GeometryNodes; )? ) |
	( ( %GeometryNodes; ), (%AppearanceNodes;)? )?
) >
]]>
<!ATTLIST Shape
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT Sound (IS?, (%MetadataNodes;)?, ( %AudioClipNodes;|%MovieTextureNodes;|%WildcardNodes; )? ) >
<!ATTLIST Sound
	direction  %SFVec3f; "0 0 1"
	intensity  %SFFloat; "1"
	location   %SFVec3f; "0 0 0"
	maxBack    %SFFloat; "10"
	maxFront   %SFFloat; "10"
	minBack    %SFFloat; "1"
	minFront   %SFFloat; "1"
	priority   %SFFloat; "0"
	spatialize %SFBool;  "true"
	containerField NMTOKEN "children"
	class       NMTOKENS       #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT Sphere ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Sphere
	radius %SFFloat; "1"
	solid           %SFBool;  "true"
	containerField NMTOKEN "geometry"
	class  NMTOKENS  #IMPLIED
	DEF    ID        #IMPLIED
	USE    IDREF     #IMPLIED>

<!ELEMENT SphereSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SphereSensor
	description %SFString; #IMPLIED
	autoOffset %SFBool;     "true"
	enabled    %SFBool;     "true"
	offset     %SFRotation; "0 1 0 0"
	containerField NMTOKEN "children"
	class      NMTOKENS     #IMPLIED
	DEF        ID           #IMPLIED
	USE        IDREF        #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT SpotLight ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SpotLight
	ambientIntensity %SFFloat; "0"
	attenuation      %SFVec3f; "1 0 0"
	beamWidth        %SFFloat; "0.7854"
	color            %SFColor; "1 1 1"
	cutOffAngle      %SFFloat; "1.570796"
	direction        %SFVec3f; "0 0 -1"
	intensity        %SFFloat; "1"
	location         %SFVec3f; "0 0 0"
	on               %SFBool;  "true"
	radius           %SFFloat; "100"
	global         %SFBool;  "true"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>

<!ELEMENT StaticGroup (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST StaticGroup
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize   %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class      NMTOKENS  #IMPLIED
	DEF        ID        #IMPLIED
	USE        IDREF     #IMPLIED>

<!ELEMENT StringSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST StringSensor
	enabled			%SFBool;	"true"
	deletionAllowed 	%SFBool;	"true"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<!ELEMENT Switch (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Switch
	whichChoice %SFInt32; "-1"
	containerField NMTOKEN "children"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT Text (IS?, (%MetadataNodes;)?, ( (%FontStyleNodes;)?|%WildcardNodes; ) ) >
<!ATTLIST Text
	string    %MFString; #IMPLIED
	length    %MFFloat;  #IMPLIED
	maxExtent %SFFloat;  "0.0"
	solid %SFBool; "false"
	containerField NMTOKEN "geometry"
	class     NMTOKENS   #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>

<!-- backTexture, bottomTexture, frontTexture, leftTexture, rightTexture, topTexture; could use rule for 0..6 children here -->
<!ELEMENT TextureBackground (IS?, (%MetadataNodes;)?, (%Texture2DNodes; | MultiTexture)* )>
<!ATTLIST TextureBackground
	groundAngle  %MFFloat;  #IMPLIED
	groundColor  %MFColor;  #IMPLIED
	skyAngle     %MFFloat;  #IMPLIED
	skyColor     %MFColor;  "0 0 0"
	transparency %SFFloat;  "0"
	containerField NMTOKEN "children"
	class        NMTOKENS      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
]]>
<!ELEMENT TextureCoordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate
	point %MFVec2f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT TextureCoordinateGenerator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureCoordinateGenerator
	mode      %TextureCoordinateGeneratorModes;  "SPHERE"
	parameter %MFFloat;  #IMPLIED
	containerField NMTOKEN "texCoord"
	class       NMTOKENS    #IMPLIED
	DEF       ID         #IMPLIED
	USE       IDREF      #IMPLIED>
	
<!ELEMENT TextureProperties ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureProperties
	anisotropicDegree %SFFloat; "1.0"
	borderColor %SFColorRGBA; "0 0 0 0"
	borderWidth (0 | 1) "0"
	boundaryModeS %TextureBoundaryModeValues; "REPEAT"
	boundaryModeT %TextureBoundaryModeValues; "REPEAT"
	boundaryModeR %TextureBoundaryModeValues; "REPEAT"
	magnificationFilter %TextureMagnificationModeValues; "FASTEST"
	minificationFilter %TextureMinificationModeValues; "FASTEST"
	textureCompression %TextureCompressionModeValues; "FASTEST"
	texturePriority %SFFloat; "0.0"
	generateMipMaps %SFBool; "false"
	containerField NMTOKEN "textureProperties"
	class    NMTOKENS     #IMPLIED
	DEF             ID                   #IMPLIED
	USE             IDREF                #IMPLIED>

<!ELEMENT TextureTransform ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureTransform
	center      %SFVec2f; "0 0"
	rotation    %SFFloat; "0"
	scale       %SFVec2f; "1 1"
	translation %SFVec2f; "0 0"
	containerField NMTOKEN "textureTransform"
	class       NMTOKENS     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

<!ELEMENT MultiTextureTransform ((IS?), (TextureTransform|ProtoInstance)* ) >
<!ATTLIST MultiTextureTransform
	containerField NMTOKEN "textureTransform"
	class       NMTOKENS     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>

]]>
<!ELEMENT TimeSensor ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TimeSensor
	cycleInterval %SFTime; "1.0"
	enabled %SFBool; "true"
	loop %SFBool; "false"
	startTime %SFTime; "0"
	stopTime %SFTime; "0"
	pauseTime %SFTime; "0"
	resumeTime %SFTime; "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<![%ImmersiveProfile;[
<!ELEMENT TimeTrigger ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TimeTrigger
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT TouchSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TouchSensor
	description %SFString; #IMPLIED
	enabled      %SFBool;  "true"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF          ID        #IMPLIED
	USE          IDREF     #IMPLIED>
]]>
<!ELEMENT Transform (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Transform
	center %SFVec3f; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT IndexedTriangleFanSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST IndexedTriangleFanSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT IndexedTriangleSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST IndexedTriangleSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT IndexedTriangleStripSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST IndexedTriangleStripSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TriangleFanSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST TriangleFanSet
	fanCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TriangleSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST TriangleSet
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TriangleStripSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes; | %WildcardNodes;)*)>
<!ATTLIST TriangleStripSet
	stripCount %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Viewpoint ((IS?), (%MetadataNodes;)?)>
<!ATTLIST Viewpoint
	fieldOfView %SFFloat; "0.7854"
	jump %SFBool; "true"
	orientation %SFRotation; "0 0 1 0"
	position %SFVec3f; "0 0 10"
	description %SFString; #IMPLIED
	centerOfRotation %SFVec3f; "0 0 0"
	retainUserOffsets %SFBool; "false"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- centerOfRotation point relates to NavigationInfo EXAMINE mode. -->
<![%ImmersiveProfile;[
<!ELEMENT OrthoViewpoint ((IS?), (%MetadataNodes;)?)>
<!ATTLIST OrthoViewpoint
	fieldOfView %MFFloat; "-1 -1 1 1"
	jump %SFBool; "true"
	orientation %SFRotation; "0 0 1 0"
	position %SFVec3f; "0 0 10"
	description %SFString; #IMPLIED
	centerOfRotation %SFVec3f; "0 0 0"
	retainUserOffsets %SFBool; "false"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ViewpointGroup ((IS?), (%MetadataNodes;)?, (Viewpoint | OrthoViewpoint | ViewpointGroup | %WildcardNodes;)* )>
<!ATTLIST ViewpointGroup
	center %SFVec3f; "0 0 0"
	description %SFString; #IMPLIED
	displayed %SFBool; "true"
	retainUserOffsets %SFBool; "false"
	size %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT VisibilitySensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST VisibilitySensor
	center    %SFVec3f; "0 0 0"
	enabled   %SFBool;  "true"
	size      %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class     NMTOKENS     #IMPLIED
	DEF       ID        #IMPLIED
	USE       IDREF     #IMPLIED>
]]>
<!ELEMENT WorldInfo ((IS?), (%MetadataNodes;)?)>
<!ATTLIST WorldInfo
	info %MFString; #IMPLIED
	title %SFString; #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT X3D (head?, Scene, ds:Signature?)>
<!ATTLIST X3D
	xmlns:xsd CDATA "http://www.w3.org/2001/XMLSchema-instance"
	xsd:noNamespaceSchemaLocation CDATA "http://www.web3d.org/specifications/x3d-3.3.xsd"
	profile %profileNames; #REQUIRED
	version (3.0 | 3.1 | 3.2 | 3.3) #REQUIRED
	xmlns:ds CDATA "http://www.w3.org/2000/09/xmldsig#"
	xmlns:xenc CDATA "http://www.w3.org/2001/04/xmlenc#"
>
<!-- XML security:  digital signature (ds), encryption (xenc) -->
<!-- EspduTransform includes DIS CollisionPdu DetonatePdu FirePdu -->
<![%DISComponent;[
<!ELEMENT EspduTransform (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST EspduTransform
	enabled     %SFBool;  "true"
	marking 	 %SFString;	#IMPLIED
	siteID  	 %SFInt32;	"0"
	applicationID	 %SFInt32;	"0"
	entityID	 %SFInt32;	"0"
	forceID		 %SFInt32;	"0"
	entityKind	 %SFInt32;	"0"
	entityDomain	 %SFInt32;	"0"
	entityCountry	 %SFInt32;	"0"
	entityCategory	 %SFInt32;	"0"
	entitySubcategory %SFInt32;	"0"
	entitySpecific	 %SFInt32;	"0"
	entityExtra	 %SFInt32;	"0"
	readInterval	 %SFTime;	"0.1"
	writeInterval	 %SFTime;	"1.0"
	networkMode	 %DisNetworkModeValues;	"standAlone"
	translation	 %SFVec3f;	"0 0 0"
	rotation	 %SFRotation;	"0 0 1 0"
	scale   	 %SFVec3f;	"1 1 1"
	scaleOrientation %SFRotation;	"0 0 1 0"
	bboxCenter	 %SFVec3f;	"0 0 0"
	bboxSize	 %SFVec3f;	"-1 -1 -1"
	center  	 %SFVec3f;	"0 0 0"
	address 	 	%SFString;	"localhost"
	port    	 	%SFInt32;	"0"
	multicastRelayHost 	%SFString;	#IMPLIED
	multicastRelayPort 	%SFInt32;	"0"
	rtpHeaderExpected  	%SFBool;	"false"
	deadReckoning  		%SFInt32;	"0"
	linearVelocity		%SFVec3f;	"0 0 0"
	linearAcceleration	%SFVec3f;	"0 0 0"
	fired1   		%SFBool;	"false"
	fired2   		%SFBool;	"false"
	collisionType	%SFInt32;	"0"
	detonationLocation	%SFVec3f;	"0 0 0"
	detonationRelativeLocation	%SFVec3f;	"0 0 0"
	detonationResult	%SFInt32;	"0"
	eventApplicationID	%SFInt32;	"0"
	eventEntityID	%SFInt32;	"0"
	eventNumber	%SFInt32;	"0"
	eventSiteID	%SFInt32;	"0"
	munitionStartPoint 	%SFVec3f;	"0 0 0"
	munitionEndPoint   	%SFVec3f;	"0 0 0"
	warhead			%SFInt32;	"0"
	fuse			%SFInt32;	"0"
	munitionQuantity	%SFInt32;	"0"
	firingRate		%SFInt32;	"0"
	firingRange		%SFFloat;	"0"
	munitionSiteID  	%SFInt32;	"0"
	munitionApplicationID	%SFInt32;	"0"
	munitionEntityID	%SFInt32;	"0"
	fireMissionIndex	%SFInt32;	"0"
	articulationParameterCount 		  %SFInt32;	"0"
	articulationParameterDesignatorArray 	  %MFInt32;	#IMPLIED
	articulationParameterChangeIndicatorArray %MFInt32;	#IMPLIED
	articulationParameterIdPartAttachedToArray  %MFInt32;	#IMPLIED
	articulationParameterTypeArray 		  %MFInt32;	#IMPLIED
	articulationParameterArray 		  %MFFloat;	#IMPLIED
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	geoCoords	%SFVec3d;	"0 0 0"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED >

<!ELEMENT ReceiverPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ReceiverPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"0"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	%DisNetworkModeValues;	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	receivedPower		%SFFloat;	"0.0"
	receiverState		%SFInt32;	"0"
	transmitterSiteID	%SFInt32;	"0"
	transmitterApplicationID %SFInt32;	"0"
	transmitterEntityID	%SFInt32;	"0"
	transmitterRadioID	%SFInt32;	"0"
	
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	geoCoords	%SFVec3d;	"0 0 0"

	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

<!ELEMENT SignalPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SignalPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter		 %SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"0"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	%DisNetworkModeValues;	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	encodingScheme		%SFInt32;	"0"
	tdlType			%SFInt32;	"0"
	sampleRate		%SFInt32;	"0"
	samples			%SFInt32;	"0"
	dataLength		%SFInt32;	"0"
	data			%MFInt32;	#IMPLIED
	
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	geoCoords	%SFVec3d;	"0 0 0"

	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

<!ELEMENT TransmitterPdu ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TransmitterPdu
	enabled     %SFBool;  "true"
	whichGeometry		%SFInt32;	"1"
	bboxCenter	 	%SFVec3f;	"0 0 0"
	bboxSize	 	%SFVec3f;	"-1 -1 -1"

	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"0"
	entityID		%SFInt32;	"0"
	readInterval		%SFTime;	"0.1"
	writeInterval		%SFTime;	"1.0"
	networkMode	 	%DisNetworkModeValues;	"standAlone"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"
	multicastRelayHost	%SFString;	#IMPLIED
	multicastRelayPort	%SFInt32;	"0"
	rtpHeaderExpected	%SFBool;	"false"

	radioID			%SFInt32;	"0"
	antennaLocation		%SFVec3f;	"0 0 0"
	antennaPatternLength	%SFInt32;	"0"
	antennaPatternType	%SFInt32;	"0"
	cryptoKeyID		%SFInt32;	"0"
	cryptoSystem		%SFInt32;	"0"
	frequency		%SFInt32;	"0"
	inputSource		%SFInt32;	"0"

	lengthOfModulationParameters	%SFInt32;	"0"
	modulationTypeDetail		%SFInt32;	"0"
	modulationTypeMajor		%SFInt32;	"0"
	modulationTypeSpreadSpectrum	%SFInt32;	"0"
	modulationTypeSystem		%SFInt32;	"0"
	power				%SFFloat;	"0.0"
	radioEntityTypeCategory		%SFInt32;	"0"
	radioEntityTypeCountry		%SFInt32;	"0"
	radioEntityTypeDomain		%SFInt32;	"0"
	radioEntityTypeKind		%SFInt32;	"0"
	radioEntityTypeNomenclature	%SFInt32;	"0"
	radioEntityTypeNomenclatureVersion %SFInt32;	"0"
	relativeAntennaLocation		%SFVec3f;	"0 0 0"
	transmitFrequencyBandwidth	%SFFloat;	"0.0"
	transmitState			%SFInt32;	"0"
	
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	geoCoords	%SFVec3d;	"0 0 0"

	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF   				ID		#IMPLIED
	USE             		IDREF		#IMPLIED >
	
<!ELEMENT DISEntityManager ( (IS?), (%MetadataNodes;)?, (DISEntityTypeMapping|%WildcardNodes;)* ) >	
<!ATTLIST DISEntityManager
	siteID			%SFInt32;	"0"
	applicationID		%SFInt32;	"0"

	address			%SFString;	"localhost"
	port			%SFInt32;	"0"

	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >
	
<!ELEMENT DISEntityTypeMapping ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST DISEntityTypeMapping
	category	 %SFInt32;	"0"
	country	 %SFInt32;	"0"
	domain	 %SFInt32;	"0"
	extra	 %SFInt32;	"0"
	kind	 %SFInt32;	"0"
	specific	 %SFInt32;	"0"
	subcategory	 %SFInt32;	"0"
	url		%MFString;	#IMPLIED

	containerField NMTOKEN "mapping"
	class        NMTOKENS     #IMPLIED
	DEF   			ID		#IMPLIED
	USE             	IDREF		#IMPLIED >

]]>
<![%GeoSpatialComponent;[
<!ELEMENT GeoCoordinate ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >  <!-- X3DCoordinateNodeType -->
<!ATTLIST GeoCoordinate
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	point		%MFVec3d;	#IMPLIED
	containerField NMTOKEN "coord"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- need to restrict GeoOrigin to first element, or relax schema restriction -->
<!ELEMENT GeoElevationGrid (IS?, (%MetadataNodes;)?, (
 ((%ColorNodes;), (
 	(GeoOrigin, (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	   			((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
	   			(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	 			(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|(GeoOrigin, (
	((%ColorNodes;), (	((%NormalNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
	  			((%TextureCoordinateNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
	  			(%WildcardNodes;,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%NormalNodes;),  (
 	((%ColorNodes;), (	(GeoOrigin,((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
 	| ((%TextureCoordinateNodes;), (
 				((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
 	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
 				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
|((%TextureCoordinateNodes;), (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|%WildcardNodes;)?) |
 				((%NormalNodes;),((%ColorNodes;)|%WildcardNodes;)?) |
 				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) )? )
 	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? ) )? )
|(%WildcardNodes;,  (
	((%ColorNodes;), (	(GeoOrigin,((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| (GeoOrigin,(((%ColorNodes;),((%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%NormalNodes;), (	((%ColorNodes;),(GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,(GeoOrigin|(%ColorNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? )
	| ((%TextureCoordinateNodes;), (
				((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) )? )
	| (%WildcardNodes;, (	((%ColorNodes;),(GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				(GeoOrigin,((%ColorNodes;)|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%NormalNodes;),((%ColorNodes;)|GeoOrigin|(%TextureCoordinateNodes;)|%WildcardNodes;)?) |
				((%TextureCoordinateNodes;),((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|%WildcardNodes;)?) |
				(%WildcardNodes;,((%ColorNodes;)|GeoOrigin|(%NormalNodes;)|(%TextureCoordinateNodes;)|%WildcardNodes;)?) )? ) )? )
)? ) >

<!ATTLIST GeoElevationGrid
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	geoGridOrigin	%SFVec3d;	"0 0 0"
	xDimension	%SFInt32;	"0"
	xSpacing	%SFDouble;	"1.0"
	yScale		%SFFloat;	"1.0"
	zDimension	%SFInt32;	"0"
	zSpacing	%SFDouble;	"1.0"
	height		%MFDouble; 	"0 0"
	normalPerVertex	%SFBool;	"true"
	ccw		%SFBool;	"true"
	colorPerVertex	%SFBool;	"true"
	creaseAngle	%SFFloat;	"0"
	solid		%SFBool;	"true"
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLocation (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes;|%WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes;|%WildcardNodes; )* )? ) >
<!ATTLIST GeoLocation
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	geoCoords	%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoLOD (IS?, (%MetadataNodes;)?,
	( %ChildrenNodes;|%WildcardNodes; )*, (GeoOrigin, ( %ChildrenNodes;|%WildcardNodes; )* )? ) >
<!ATTLIST GeoLOD
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	rootUrl	 	%MFString;	#IMPLIED
	child1Url	%MFString;	#IMPLIED
	child2Url	%MFString;	#IMPLIED
	child3Url	%MFString;	#IMPLIED
	child4Url 	%MFString;	#IMPLIED
	range		%SFFloat;	"10"
	center		%SFVec3d;	"0 0 0"
	bboxCenter	%SFVec3f;	"0 0 0"
	bboxSize	%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoMetadata ( (IS?), (%MetadataNodes;)?,
    (GeoCoordinate, GeoElevationGrid, GeoLocation, GeoOrigin, GeoLOD, GeoPositionInterpolator, GeoProximitySensor, GeoTouchSensor, GeoTransform, GeoViewpoint, %WildcardNodes;)* ) >
<!ATTLIST GeoMetadata
	url		%MFString;	#IMPLIED
	summary		%MFString;	#IMPLIED
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!--
	title			%SFString;	#IMPLIED
	description		%SFString;	#IMPLIED
	coordinateSystem 	%SFString;	#IMPLIED
	horizontalDatum		%SFString;	#IMPLIED
	verticalDatum		%SFString;	#IMPLIED
	ellipsoid		%SFString;	#IMPLIED
	extent			%SFString;	#IMPLIED
	resolution		%SFString;	#IMPLIED
	originator		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	date			%SFString;	#IMPLIED
	metadataFormat		%SFString;	#IMPLIED
	dataUrl			%SFString;	#IMPLIED
	dataFormat		%SFString;	#IMPLIED
-->

<!-- GeoOrigin is deprecated and discouraged (but nevertheless allowed) in X3D v3.3 -->
<!ELEMENT GeoOrigin ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST GeoOrigin
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	geoCoords	%SFVec3d;	"0 0 0"
	rotateYUp	%SFBool;	"false"
	containerField NMTOKEN "geoOrigin"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT GeoPositionInterpolator ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoPositionInterpolator
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	key		%MFFloat;	#IMPLIED
	keyValue	%MFVec3d;	#IMPLIED
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoProximitySensor ( (IS?), (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoProximitySensor
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	geoCenter      %MFDouble;    "0 0 0"
	size        %SFVec3f;    "0 0 0"
	enabled     %SFBool;     "true"
	containerField NMTOKEN "children"
	class       NMTOKENS        #IMPLIED
	DEF         ID           #IMPLIED
	USE         IDREF        #IMPLIED>

<!ELEMENT GeoTouchSensor ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoTouchSensor
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	enabled		%SFBool;	"true"
	description	%SFString;	#IMPLIED
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT GeoTransform (IS?, (%MetadataNodes;)?, GeoOrigin?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST GeoTransform
	geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
	geoCenter %SFVec3d; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- X3D v3.3 GeoViewpoint changes: added centerOfRotation and retainUserOffsets, removed navType and headlight -->
<!ELEMENT GeoViewpoint ( IS?, (%MetadataNodes;)?, GeoOrigin? ) >
<!ATTLIST GeoViewpoint
	geoSystem	  %MFString; '&quot;GD&quot; &quot;WE&quot;'
	centerOfRotation  %SFVec3d;	"0 0 0"
	description	  %SFString;	#IMPLIED
	position	  %SFVec3d;	"0 0 100000"
	orientation	  %SFRotation;	"0 0 1 0"
	fieldOfView	  %SFFloat;	"0.7854"
	jump		  %SFBool;	"true"
	retainUserOffsets %SFBool;	"false"
	speedFactor	  %SFFloat;	"1.0"
	containerField NMTOKEN  "children"
	class          NMTOKENS #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>
]]>
<!-- Note that setting JointNames, SegmentNames and FeaturePoints as enumerations does not permit validation of other names. -->
<![%HAnimComponent;[
<!ENTITY % JointNames "(
HumanoidRoot|sacroiliac|l_hip|l_knee|l_ankle|l_subtalar|l_midtarsal|l_metatarsal|r_hip|r_knee|r_ankle|r_subtalar|r_midtarsal|r_metatarsal|
vl5|vl4|vl3|vl2|vl1|vt12|vt11|vt10|vt9|vt8|vt7|vt6|vt5|vt4|vt3|vt2|vt1|vc7|vc6|vc5|vc4|vc3|vc2|vc1|
skullbase|l_eyelid_joint|r_eyelid_joint|l_eyeball_joint|r_eyeball_joint|l_eyebrow_joint|r_eyebrow_joint|temporomandibular|
l_sternoclavicular|l_acromioclavicular|l_shoulder|l_elbow|l_wrist|l_thumb1|l_thumb2|l_thumb3|
l_index0|l_index1|l_index2|l_index3|l_middle0|l_middle1|l_middle2|l_middle3|l_ring0|l_ring1|l_ring2|l_ring3|l_pinky0|l_pinky1|l_pinky2|l_pinky3|
r_sternoclavicular|r_acromioclavicular|r_shoulder|r_elbow|r_wrist|r_thumb1|r_thumb2|r_thumb3|
r_index0|r_index1|r_index2|r_index3|r_middle0|r_middle1|r_middle2|r_middle3|r_ring0|r_ring1|r_ring2|r_ring3|r_pinky0|r_pinky1|r_pinky2|r_pinky3)" >
<!ENTITY % SegmentNames "(
sacrum|pelvis|l_thigh|l_calf|l_hindfoot|l_midproximal|l_middistal|l_forefoot|r_thigh|r_calf|r_hindfoot|r_midproximal|r_middistal|r_forefoot|
l5|l4|l3|l2|l1|
t12|t11|t10|t9|t8|t7|t6|t5|t4|t3|t2|t1|
c7|c6|c5|c4|c3|c2|c1|
skull|l_eyelid|r_eyelid|l_eyeball|r_eyeball|l_eyebrow|r_eyebrow|jaw|
l_clavicle|l_scapula|l_upperarm|l_forearm|l_hand|
l_thumb_metacarpal|l_thumb_proximal|l_thumb_distal|
l_index_metacarpal|l_index_proximal|l_index_middle|l_index_distal|
l_middle_metacarpal|l_middle_proximal|l_middle_middle|l_middle_distal|
l_ring_metacarpal|l_ring_proximal|l_ring_middle|l_ring_distal|
l_pinky_metacarpal|l_pinky_proximal|l_pinky_middle|l_pinky_distal|
r_clavicle|r_scapula|r_upperarm|r_forearm|r_hand|
r_thumb_metacarpal|r_thumb_proximal|r_thumb_distal|r_index_metacarpal|
r_index_proximal|r_index_middle|r_index_distal|r_middle_metacarpal|
r_middle_proximal|r_middle_middle|r_middle_distal|
r_ring_metacarpal|r_ring_proximal|r_ring_middle|r_ring_distal|
r_pinky_metacarpal|r_pinky_proximal|r_pinky_middle|r_pinky_distal)" >
<!ENTITY % FeaturePointNames "(
sellion|r_infraorbitale|l_infraorbitale|supramenton|r_tragion|r_gonion1|l_tragion|l_gonion|nuchale|r_clavicale|suprasternale|l_clavicale|
r_thelion|bustpoin2t|l_thelion|bustpoint|substernale|r_rib10|r_asis|l_rib10|l_asis|r_iliocristal3e|r_trochanterion|l_iliocristale|l_trochanterion|
cervicale|rib10_midspine|r_psis|l_psi4s|waist_preferred_post|r_acromion|r_axilla_ant|r_radial_styloid|r_axilla_post|r_olecranon|
r_humeral_lateral_ep5icn|r_humeral_medial_epicn|r_radiale|r_metacarpal_pha2|r_dactylion|r_ulnar_styloid|r_metacarpal_pha5|l_acromio6n|
l_axilla_ant|l_radial_styloid|l_axilla_post|l_olecranon|l_humeral_lateral_epicn|l_humeral_medial_epicn|l_radial7e|l_metacarpal_pha2|
l_dactylion|l_ulnar_styloid|l_metacarpal_pha5|r_knee_crease|r_femoral_lateral_epicn|r_femora8l_medial_epicn|r_metatarsal_pha5|r_lateral_malleolus|
r_medial_malleolus|r_sphyrion|r_metatarsal_pha1|r_calcaneous_post.|r_digit92|l_knee_crease|l_femoral_lateral_epicn|l_femoral_medial_epicn|
l_metatarsal_pha5|l_lateral_malleolus|l_medial_malleolus|l_sphyrion|l_metatarsal_pha1|l_calcaneous_post|l_digit2|crotch|r_neck_base|l_neck_base|navel)" >
<!-- HAnimSite name fields can also include name="somelocation_view" and so SiteNames validation is turned off by default -->
<!ENTITY % SiteNames "(
cervicale|crotch|l_acromion|l_asis|l_axilla_ant|l_axilla_post|l_calcaneous_post|l_clavicale|l_dactylion|l_digit2|
l_femoral_lateral_epicn|l_femoral_medial_epicn|l_forefoot_tip|l_gonion|l_hand_tip|
l_humeral_lateral_epicn|l_humeral_medial_epicn|l_iliocristale|l_index_distal_tip|
l_infraorbitale|l_knee_crease|l_lateral_malleolus|l_medial_malleolus|l_metacarpal_pha2|l_metacarpal_pha5|
l_metatarsal_pha1|l_metatarsal_pha5|l_middle_distal_tip|l_neck_base|l_olecranon|l_pinky_distal_tip|
l_psis|l_radial_styloid|l_radiale|l_rib10|l_ring_distal_tip|l_sphyrion|l_thelion|l_thumb_distal_tip|
l_tragion|l_trochanterion|l_ulnar_styloid|
navel|nuchale|r_acromion|r_asis|r_axilla_ant|r_axilla_post|r_calcaneous_post|r_clavicale|r_dactylion|r_digit2|
r_femoral_lateral_epicn|r_femoral_medial_epicn|r_forefoot_tip|r_gonion|r_hand_tip|
r_humeral_lateral_epicn|r_humeral_medial_epicn|r_iliocristale|r_index_distal_tip|
r_infraorbitale|r_knee_crease|r_lateral_malleolus|r_medial_malleolus|r_metacarpal_pha2|r_metacarpal_pha5|
r_metatarsal_pha1|r_metatarsal_pha5|r_middle_distal_tip|r_neck_base|r_olecranon|r_pinky_distal_tip|
r_psis|r_radial_styloid|r_radiale|r_rib10|r_ring_distal_tip|r_sphyrion|r_thelion|r_thumb_distal_tip|
r_tragion|r_trochanterion|r_ulnar_styloid|
rib10_midspine|sellion|skull_tip|substernale|supramenton|suprasternale|waist_preferred_post)" >

<!ELEMENT HAnimDisplacer ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST HAnimDisplacer
	name		%FeaturePointNames;	#IMPLIED
	coordIndex	%MFInt32;	#IMPLIED
	displacements	%MFVec3f;	#IMPLIED
	weight		%SFFloat;	"0.0"
	containerField NMTOKEN "displacers"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT HAnimHumanoid (IS?, (%MetadataNodes;)?,
	(HAnimJoint*,	HAnimSegment*, HAnimSite*, (%CoordinateNodes;)?, (%NormalNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) ) >
<!-- skeleton/joints,	segments,      sites,      skinCoord,            skinNormal,       skin/viewpoints -->
<!-- Note that version 2.0 is approved, while versions 1.0/1.1 are incompatible and version 2.2 is experimental. -->
<!-- Note that joints, segments and sites should be USE nodes.  skin Shapes will USE preceding skinCoord, skinNormal definitions. -->
<!-- Design limitation: cannot require @name field or else USE nodes fail to validate. -->
<!ATTLIST HAnimHumanoid
	name			%SFString;	#IMPLIED
	version                 (2.0 | 2.2)       #IMPLIED
	info			%MFString;	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>
<!--	not treated as separate attributes, instead these are
	encoded as "attribute=value" SFString entries in the
	MFString info field.

	humanoidVersion		%SFString;	#IMPLIED
	authorName		%SFString;	#IMPLIED
	authorEmail		%SFString;	#IMPLIED
	copyright		%SFString;	#IMPLIED
	creationDate		%SFString;	#IMPLIED
	usageRestrictions	%SFString;	#IMPLIED
	age			%SFString;	#IMPLIED
	gender			%SFString;	#IMPLIED
	height			%SFString;	#IMPLIED
	weight			%SFString;	#IMPLIED
-->
<![%HAnimComponent;[
<!ELEMENT HAnimJoint (IS?, (%MetadataNodes;)?, ( HAnimJoint|HAnimSegment|%WildcardNodes; )* ) >
<!ATTLIST HAnimJoint
	name			%JointNames;	#IMPLIED
	ulimit			%MFFloat;	#IMPLIED
	llimit			%MFFloat;	#IMPLIED
	limitOrientation	%SFRotation;	"0 0 1 0"
	skinCoordIndex		%MFInt32;	#IMPLIED
	skinCoordWeight		%MFFloat;	#IMPLIED
	stiffness		%MFFloat;	"0 0 0"
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!-- Multiple HAnimDisplacer nodes must appear consecutively inside HAnimSegment -->

<!ELEMENT HAnimSegment (IS?, (%MetadataNodes;)?, (
	((%ChildrenNodes;|%WildcardNodes;)*, ((Coordinate, HAnimDisplacer*)|(HAnimDisplacer+, Coordinate?))? ) |
	(Coordinate, (((%ChildrenNodes;)*, HAnimDisplacer*)|(HAnimDisplacer+, (%ChildrenNodes;|%WildcardNodes;)*))? ) |
	(HAnimDisplacer+, ((Coordinate, (%ChildrenNodes;|%WildcardNodes;)*)|((%ChildrenNodes;|%WildcardNodes;)*, Coordinate?))? )?
) ) >
<!ATTLIST HAnimSegment
	name			%SegmentNames;	#IMPLIED
	mass			%SFFloat;	"0"
	centerOfMass		%SFVec3f;	"0 0 0"
	momentsOfInertia	%MFFloat;	"0 0 0 0 0 0 0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT HAnimSite (IS?, (%MetadataNodes;)?, ( %ChildrenNodes;|%WildcardNodes; )* ) >
<!ATTLIST HAnimSite
	name			NMTOKEN 	#IMPLIED
	translation		%SFVec3f;	"0 0 0"
	rotation		%SFRotation;	"0 0 1 0"
	scale			%SFVec3f;	"1 1 1"
	scaleOrientation	%SFRotation;	"0 0 1 0"
	center			%SFVec3f;	"0 0 0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>
]]>

<![%NurbsComponent;[
<!ELEMENT Contour2D (IS?, (%MetadataNodes;)?, ( %NurbsControlCurveNodes;|%WildcardNodes; )* ) >
<!ATTLIST Contour2D
	containerField NMTOKEN "trimmingContour"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT ContourPolyline2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ContourPolyline2D
	controlPoint		%MFVec2d;	#IMPLIED
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!-- child CoordinateNode has containerField controlPoint -->
<!ELEMENT NurbsCurve ( (IS?), (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )? ) >
<!ATTLIST NurbsCurve
	knot		%MFDouble;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFDouble;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN 		"geometry"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsCurve2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST NurbsCurve2D
	controlPoint	%MFVec2d;	#IMPLIED
	knot		%MFDouble;	#IMPLIED
	order		%SFInt32;	"3"
	weight		%MFDouble;	#IMPLIED
	tessellation	%SFInt32;	"0"
	closed		%SFBool;	"false"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsOrientationInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsOrientationInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsPositionInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsPositionInterpolator
	knot			%MFDouble;	#IMPLIED
	order			%SFInt32;	"3"
	weight			%MFDouble;	#IMPLIED
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF			ID	#IMPLIED
	USE			IDREF	#IMPLIED>

<!ELEMENT NurbsSurfaceInterpolator ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsSurfaceInterpolator
	weight		%MFDouble;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>

<!ELEMENT NurbsSet (IS?, (%MetadataNodes;)?, (NurbsPatchSurface|NurbsSweptSurface|NurbsSwungSurface|NurbsTrimmedSurface|%WildcardNodes; )* ) >
<!ATTLIST NurbsSet
	tessellationScale	%SFFloat;	"1.0"
	bboxCenter		%SFVec3f;	"0 0 0"
	bboxSize		%SFVec3f;	"-1 -1 -1"
	containerField NMTOKEN "children"
	class        NMTOKENS     #IMPLIED
	DEF			ID		#IMPLIED
	USE			IDREF		#IMPLIED>

<!ELEMENT NurbsPatchSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )?, ( %TextureCoordinateNodes;|NurbsTextureCoordinate)? ) >
<!ATTLIST NurbsPatchSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFDouble;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTrimmedSurface (IS?, (%MetadataNodes;)?, ( %CoordinateNodes;|%WildcardNodes; )?, ( %TextureCoordinateNodes;|NurbsTextureCoordinate)?, Contour2D* ) >
<!ATTLIST NurbsTrimmedSurface
	uClosed		%SFBool;	"false"
	vClosed		%SFBool;	"false"
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	uTessellation	%SFInt32;	"0"
	vTessellation	%SFInt32;	"0"
	weight		%MFDouble;	#IMPLIED
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSweptSurface (IS?, (%MetadataNodes;)?, (NurbsCurve|%WildcardNodes; )?, ( %NurbsControlCurveNodes;|%WildcardNodes; )? ) >
<!ATTLIST NurbsSweptSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsSwungSurface (IS?, (%MetadataNodes;)?, ( ( %NurbsControlCurveNodes;|%WildcardNodes; ), ( %NurbsControlCurveNodes;|%WildcardNodes; )? )? ) >
<!ATTLIST NurbsSwungSurface
	ccw		%SFBool;  	"true"
	solid		%SFBool;  	"true"
	containerField NMTOKEN "geometry"
	class        NMTOKENS     #IMPLIED
	DEF		ID		#IMPLIED
	USE		IDREF		#IMPLIED>

<!ELEMENT NurbsTextureCoordinate ( (IS?), (%MetadataNodes;)?, (%CoordinateNodes;)? ) >
<!ATTLIST NurbsTextureCoordinate
	controlPoint	%MFVec2f;	#IMPLIED
	weight		%MFFloat;	#IMPLIED
	uDimension	%SFInt32;	"0"
	vDimension	%SFInt32;	"0"
	uKnot		%MFDouble;	#IMPLIED
	vKnot		%MFDouble;	#IMPLIED
	uOrder		%SFInt32;	"3"
	vOrder		%SFInt32;	"3"
	containerField NMTOKEN "texCoord"
	class        NMTOKENS     #IMPLIED
	DEF		ID	#IMPLIED
	USE		IDREF	#IMPLIED>
]]>
<![%CadComponent;[
<!ELEMENT CADAssembly (IS?, (%MetadataNodes;)?, (CADAssembly|CADPart|Anchor|Billboard|Collision|Group|Inline|LOD|Transform|DirectionalLight|NavigationInfo|OrthoViewpoint|Viewpoint|ViewpointGroup|WorldInfo|%WildcardNodes;)*)>
<!-- ViewpointGroup and OrthoViewpoint require Navigation component level 3, which is higher than CADInterchange profile -->
<!ATTLIST CADAssembly
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	name	 %SFString;  #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CADFace (IS?, (%MetadataNodes;)?, (Shape|LOD|Transform|%WildcardNodes;)?)>
<!ATTLIST CADFace
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	name	 %SFString;  #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CADLayer (IS?, (%MetadataNodes;)?, (%ChildrenNodes;|%WildcardNodes;)*)>
<!ATTLIST CADLayer
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	name	 %SFString;  #IMPLIED
	visible	 %MFBool;  #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT CADPart (IS?, (%MetadataNodes;)?, (CADFace|%WildcardNodes;)*)>
<!ATTLIST CADPart
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	center %SFVec3f; "0 0 0"
	rotation %SFRotation; "0 0 1 0"
	scale %SFVec3f; "1 1 1"
	scaleOrientation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	name	 %SFString;  #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT QuadSet (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*)>
<!ATTLIST QuadSet
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT IndexedQuadSet ( (IS?, (%MetadataNodes;)?, (%ComposedGeometryNodes;|%WildcardNodes;)*) ) >
<!ATTLIST IndexedQuadSet
	index %MFInt32; #IMPLIED
	ccw %SFBool; "true"
	colorPerVertex %SFBool; "true"
	normalPerVertex %SFBool; "true"
	solid %SFBool; "true"
	containerField NMTOKEN "geometry"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
]]>
<![%CubeMapTexturingComponent;[
<!-- containerField values:  front back left right top bottom.  could use rule for 0..6 children here -->
<!ELEMENT ComposedCubeMapTexture (IS?, (%MetadataNodes;)?, (%Texture2DNodes;)* )>
<!ATTLIST ComposedCubeMapTexture
	containerField NMTOKEN "texture"
	class        NMTOKENS      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
<!ELEMENT GeneratedCubeMapTexture (IS?, (%MetadataNodes;)? )>
<!ATTLIST GeneratedCubeMapTexture
	update (NONE|NEXT_FRAME_ONLY|ALWAYS)            "NONE"
	size	%SFInt32;	"128"
	containerField NMTOKEN "texture"
	class        NMTOKENS      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
<!ELEMENT ImageCubeMapTexture  (IS?, (%MetadataNodes;)? )>
<!ATTLIST ImageCubeMapTexture
	url		%MFString;	#IMPLIED
	containerField NMTOKEN "texture"
	class        NMTOKENS      #IMPLIED
	DEF          ID         #IMPLIED
	USE          IDREF      #IMPLIED >
]]>
<![%ShadersComponent;[
<!-- TODO fix shader mixed-content models, see Script and corresonding X3D schemas for examples -->
<!ELEMENT ComposedShader ( (field)*, (IS?), (%MetadataNodes;)?, (ShaderPart|%WildcardNodes;)* ) >
<!ATTLIST ComposedShader
	language	 %SFString;  #IMPLIED
	containerField CDATA "shaders"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT FloatVertexAttribute ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST FloatVertexAttribute
	value		%MFFloat; #IMPLIED
	name		%SFString; #IMPLIED
	numComponents (1|2|3|4)            "4"
	containerField CDATA "attrib"
	class    NMTOKENS     #IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>
<!ELEMENT Matrix3VertexAttribute ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Matrix3VertexAttribute
	value		%MFMatrix3f; #IMPLIED
	name		%SFString; #IMPLIED
	containerField CDATA "attrib"
	class    NMTOKENS     #IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>
<!ELEMENT Matrix4VertexAttribute ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Matrix4VertexAttribute
	value		%MFMatrix4f; #IMPLIED
	name		%SFString; #IMPLIED
	containerField CDATA "attrib"
	class    NMTOKENS     #IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>
<!ELEMENT PackagedShader ((field)*, (IS?), (%MetadataNodes;)? ) >
<!ATTLIST PackagedShader
	language	 %SFString;  #IMPLIED
	containerField CDATA "shaders"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ProgramShader ((IS?), (%MetadataNodes;)?, (ShaderProgram|%WildcardNodes;)* ) >
<!ATTLIST ProgramShader
	language	 %SFString;  #IMPLIED
	containerField CDATA "shaders"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ShaderPart ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ShaderPart
	url		%MFString;	#IMPLIED
	type	 ( VERTEX|FRAGMENT )  #IMPLIED
	containerField NMTOKEN "parts"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ShaderProgram ((field)*, (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ShaderProgram
	url		%MFString;	#IMPLIED
	type	 ( VERTEX|FRAGMENT )  #IMPLIED
	containerField NMTOKEN "programs"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
]]>
<![%Texture3DComponent;[
<!ELEMENT ComposedTexture3D ((IS?), (%MetadataNodes;)?, (%Texture2DNodes;)*)>
<!ATTLIST ComposedTexture3D
	repeatS %SFBool; "false"
	repeatT %SFBool; "false"
	repeatR %SFBool; "false"
	containerField NMTOKEN "texture"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT ImageTexture3D ((IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)?)>
<!ATTLIST ImageTexture3D
	url %MFString; #IMPLIED
	repeatS %SFBool; "false"
	repeatT %SFBool; "false"
	repeatR %SFBool; "false"
	containerField NMTOKEN "texture"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT PixelTexture3D ((IS?), (%MetadataNodes;)?, (TextureProperties | %WildcardNodes;)?)>
<!ATTLIST PixelTexture3D
	image %MFInt32; "0 0 0 0"
	repeatS %SFBool; "false"
	repeatT %SFBool; "false"
	repeatR %SFBool; "false"
	containerField NMTOKEN "texture"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TextureCoordinate3D ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate3D
	point %MFVec3f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TextureCoordinate4D ((IS?), (%MetadataNodes;)?)>
<!ATTLIST TextureCoordinate4D
	point %MFVec4f; #IMPLIED
	containerField NMTOKEN "texCoord"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
<!ELEMENT TextureTransformMatrix3D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureTransformMatrix3D
	matrix      %SFMatrix4f; "1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"
	containerField NMTOKEN "textureTransform"
	class       NMTOKENS     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>
<!ELEMENT TextureTransform3D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TextureTransform3D
	center      %SFVec3f; "0 0 0"
	rotation    %SFRotation; "0 0 1 0"
	scale       %SFVec3f; "1 1 1"
	translation %SFVec3f; "0 0 0"
	containerField NMTOKEN "textureTransform"
	class       NMTOKENS     #IMPLIED
	DEF         ID        #IMPLIED
	USE         IDREF     #IMPLIED>
]]>
<![%ImmersiveProfile;[
<!ELEMENT LocalFog ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST LocalFog
	enabled		%SFBool; "true"
	color		%SFColor; "1 1 1"
	fogType 	(LINEAR|EXPONENTIAL) "LINEAR"
	visibilityRange %SFFloat;            "0"
	containerField NMTOKEN "children"
	class    NMTOKENS     #IMPLIED
	DEF	ID	#IMPLIED
	USE	IDREF	#IMPLIED>

<!ELEMENT FogCoordinate ((IS?), (%MetadataNodes;)?)>
<!ATTLIST FogCoordinate
	depth %MFFloat; #IMPLIED
	containerField NMTOKEN "fogCoord"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>
]]>
<!-- v3.2 -->
<![%FullProfile;[
<!ELEMENT ClipPlane ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ClipPlane
	enabled     %SFBool;  "true"
	plane %SFVec4f; "0 1 0 0"
        containerField NMTOKEN "children"
	class       NMTOKENS          #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>

<!ELEMENT EaseInEaseOut ((IS?), (%MetadataNodes;)?)>
<!ATTLIST EaseInEaseOut
	key %MFFloat; #IMPLIED
	easeInEaseOut %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>

<!ELEMENT SplinePositionInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST SplinePositionInterpolator
	closed %SFBool;  "false"
	key %MFFloat; #IMPLIED
	keyValue    %MFVec3f; #IMPLIED
	keyVelocity %MFVec3f; #IMPLIED
	normalizeVelocity %SFBool;  "false"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>

<!ELEMENT SplinePositionInterpolator2D ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SplinePositionInterpolator2D
	closed %SFBool;  "false"
	key      %MFFloat; #IMPLIED
	keyValue    %MFVec2f; #IMPLIED
	keyVelocity %MFVec2f; #IMPLIED
	normalizeVelocity %SFBool;  "false"
	containerField NMTOKEN "children"
	class    NMTOKENS  #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT SplineScalarInterpolator ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST SplineScalarInterpolator
	closed %SFBool;  "false"
	key      %MFFloat; #IMPLIED
	keyValue    %MFFloat; #IMPLIED
	keyVelocity %MFFloat; #IMPLIED
	normalizeVelocity %SFBool;  "false"
	containerField NMTOKEN "children"
	class    NMTOKENS  #IMPLIED
	DEF      ID        #IMPLIED
	USE      IDREF     #IMPLIED>

<!ELEMENT SquadOrientationInterpolator ((IS?), (%MetadataNodes;)?)>
<!ATTLIST SquadOrientationInterpolator
	key %MFFloat; #IMPLIED
	keyValue %MFRotation; #IMPLIED
	normalizeVelocity %SFBool;  "false"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED>

<!ELEMENT TransformSensor ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TransformSensor
	center      %SFVec3f;    "0 0 0"
	size        %SFVec3f;    "0 0 0"
	enabled     %SFBool;     "true"
	containerField NMTOKEN "children"
	class       NMTOKENS     #IMPLIED
	DEF         ID           #IMPLIED
	USE         IDREF        #IMPLIED>

<!ELEMENT TwoSidedMaterial ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST TwoSidedMaterial
	ambientIntensity %SFFloat; "0.2"
	diffuseColor     %SFColor; "0.8 0.8 0.8"
	emissiveColor    %SFColor; "0 0 0"
	shininess        %SFFloat; "0.2"
	specularColor    %SFColor; "0 0 0"
	transparency     %SFFloat; "0"
	backAmbientIntensity %SFFloat; "0.2"
	backDiffuseColor     %SFColor; "0.8 0.8 0.8"
	backEmissiveColor    %SFColor; "0 0 0"
	backShininess        %SFFloat; "0.2"
	backSpecularColor    %SFColor; "0 0 0"
	backTransparency     %SFFloat; "0"
	separateBackColor     %SFBool; "false"
	containerField NMTOKEN "material"
	class       NMTOKENS          #IMPLIED
	DEF              ID        #IMPLIED
	USE              IDREF     #IMPLIED>
]]>
<![%LayeringComponent;[

<!-- TODO: Schematron rule regarding order for SFNode child Viewport -->
<!ELEMENT Layer (IS?, (%MetadataNodes;)?, Viewport?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Layer
	isPickable %SFBool; "true"
	containerField NMTOKEN "layers"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT LayerSet (IS?, (%MetadataNodes;)?, (Layer | LayoutLayer | %WildcardNodes;)*)>
<!ATTLIST LayerSet
	activeLayer %SFInt32; "0"
	order %MFInt32; "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Viewport (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST Viewport
	clipBoundary %MFFloat; "0 1 0 1"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "viewport"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%LayoutComponent;[

<!ELEMENT Layout ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST Layout
	align             %MFString; '&quot;CENTER&quot; &quot;CENTER&quot;'
	offsetUnits  %MFString; '&quot;WORLD&quot; &quot;WORLD&quot;'
	scaleMode     %MFString; '&quot;NONE&quot; &quot;NONE&quot;'
	sizeUnits     %MFString; '&quot;WORLD&quot; &quot;WORLD&quot;'
	offset     %MFFloat;  "0 0"
	size        %SFFloat;  "1.0"
	containerField NMTOKEN "layout"
	class       NMTOKENS       #IMPLIED
	DEF         ID          #IMPLIED
	USE         IDREF       #IMPLIED>
<!-- Minimum supported values:
	align  ' "LEFT" "CENTER" "RIGHT" "BOTTOM" "CENTER" "TOP" '
	offsetUnits ' "WORLD" "FRACTION" "PIXEL" '
	scaleMode ' "NONE" "FRACTION" "STRETCH" "PIXEL" '
	sizeUnits ' "WORLD" "FRACTION" "PIXEL" ' -->

<!-- TODO: Schematron rule regarding order for SFNode children Layout and Viewport -->
<!ELEMENT LayoutGroup (IS?, (%MetadataNodes;)?, Layout, Viewport?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST LayoutGroup
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- TODO: Schematron rule regarding order for SFNode children Layout and Viewport -->
<!ELEMENT LayoutLayer (IS?, (%MetadataNodes;)?, Layout, Viewport?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST LayoutLayer
	isPickable %SFBool; "true"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ScreenFontStyle ( (IS?), (%MetadataNodes;)? ) >
<!ATTLIST ScreenFontStyle
	family      %MFString; '&quot;SERIF&quot;'
	horizontal  %SFBool;   "true"
	justify     %MFString; '&quot;BEGIN&quot;'
	language    %SFString; #IMPLIED
	leftToRight %SFBool;   "true"
	pointSize        %SFFloat;  "1.0"
	spacing     %SFFloat;  "1.0"
	style       (PLAIN|BOLD|ITALIC|BOLDITALIC) "PLAIN"
	topToBottom %SFBool;   "true"
	containerField NMTOKEN "fontStyle"
	class       NMTOKENS       #IMPLIED
	DEF         ID          #IMPLIED
	USE         IDREF       #IMPLIED>
<!-- Minimum supported values:
	family  ' "SERIF" "SANS" "TYPEWRITER" '
	justify ' "FIRST" "BEGIN" "MIDDLE" "END" ' -->

<!ELEMENT ScreenGroup (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST ScreenGroup
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%RigidBodyPhysicsComponent;[

<!ELEMENT BallJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)*)>
<!ATTLIST BallJoint
	anchorPoint %SFVec3f; "0 0 0"
	forceOutput %MFString; "NONE"
	containerField NMTOKEN "joints"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollidableOffset (IS?, (%MetadataNodes;)?, (CollidableOffset | CollidableShape | %WildcardNodes;)? )>
<!ATTLIST CollidableOffset
	enabled %SFBool; "true"
	rotation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollidableShape (IS?, (%MetadataNodes;)?, (Shape | %WildcardNodes;)? )>
<!ATTLIST CollidableShape
	enabled %SFBool; "true"
	rotation %SFRotation; "0 0 1 0"
	translation %SFVec3f; "0 0 0"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollisionCollection (IS?, (%MetadataNodes;)?, (CollidableOffset | CollidableShape | CollisionSpace | %WildcardNodes;)* )>
<!ATTLIST CollisionCollection
	appliedParameters %MFString; "BOUNCE"
	bounce %SFFloat; "0"
	enabled %SFBool; "true"
	frictionCoefficients %SFVec2f; "0 0"
	minBounceSpeed %SFFloat; "0.1"
	slipFactors %SFVec2f; "0 0"
	softnessConstantForceMix %SFFloat; "0.0001"
	softnessErrorCorrection %SFFloat; "0.8"
	surfaceSpeed %SFVec2f; "0 0"
	containerField NMTOKEN "collider"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollisionSensor (IS?, (%MetadataNodes;)?, (CollisionCollection | %WildcardNodes;)? )>
<!ATTLIST CollisionSensor
	enabled %SFBool; "true"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CollisionSpace (IS?, (%MetadataNodes;)?, (CollidableOffset | CollidableShape | CollisionSpace | %WildcardNodes;)* )>
<!ATTLIST CollisionSpace
	useGeometry %SFBool; "false"
	enabled %SFBool; "true"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT Contact (IS?, (%MetadataNodes;)?, (RigidBody | CollidableOffset | CollidableShape | %WildcardNodes;)* )>
<!ATTLIST Contact
	appliedParameters %MFString; "BOUNCE"
	bounce %SFFloat; "0"
	contactNormal %SFVec3f; "0 1 0"
	depth %SFFloat; "0"
	frictionCoefficients %SFVec2f; "0 0"
	frictionDirection %SFVec3f; "0 1 0"
	minBounceSpeed %SFFloat; "0"
	position %SFVec3f; "0 0 0"
	slipCoefficients %SFVec2f; "0 0"
	softnessConstantForceMix %SFFloat; "0.0001"
	softnessErrorCorrection %SFFloat; "0.8"
	surfaceSpeed %SFVec2f; "0 0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT DoubleAxisHingeJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST DoubleAxisHingeJoint
	anchorPoint %SFVec3f; "0 1 0"
	axis1 %SFVec3f; "0 1 0"
	axis2 %SFVec3f; "0 1 0"
	desiredAngularVelocity1 %SFFloat; "0"
	desiredAngularVelocity2 %SFFloat; "0"
	maxAngle1 %SFFloat; "3.141592653"
	maxTorque1 %SFFloat; "0"
	maxTorque2 %SFFloat; "0"
	minAngle1 %SFFloat; "-3.141592653"
	forceOutput %MFString; "NONE"
	stop1Bounce %SFFloat; "0"
	stop1ConstantForceMix %SFFloat; "0.001"
	stop1ErrorCorrection %SFFloat; "0.8"
	suspensionErrorCorrection %SFFloat; "0.8"
	suspensionForce %SFFloat; "0"
	containerField NMTOKEN "joints"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT MotorJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST MotorJoint
	autoCalc %SFBool; "false"
	axis1Angle %SFFloat; "0"
	axis1Torque %SFFloat; "0"
	axis2Angle %SFFloat; "0"
	axis2Torque %SFFloat; "0"
	axis3Angle %SFFloat; "0"
	axis3Torque %SFFloat; "0"
	enabledAxes (0|1|2|3) "1"
	forceOutput %MFString; "NONE"
	motor1Axis %SFVec3f; "0 0 0"
	motor2Axis %SFVec3f; "0 0 0"
	motor3Axis %SFVec3f; "0 0 0"
	stop1Bounce %SFFloat; "0"
	stop1ErrorCorrection %SFFloat; "0.8"
	stop2Bounce %SFFloat; "0"
	stop2ErrorCorrection %SFFloat; "0.8"
	stop3Bounce %SFFloat; "0"
	stop3ErrorCorrection %SFFloat; "0.8"
	containerField NMTOKEN "joints"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT RigidBody (IS?, (%MetadataNodes;)?, (Sphere | Box | Cone )?, (CollidableOffset | CollidableShape | %WildcardNodes;)* )>
<!ATTLIST RigidBody
	angularDampingFactor %SFFloat; "0.001"
	angularVelocity %SFVec3f; "0 0 0"
	autoDamp %SFBool; "false"
	autoDisable %SFBool; "false"
	centerOfMass %SFVec3f; "0 0 0"
	disableAngularSpeed %SFFloat; "0"
	disableLinearSpeed %SFFloat; "0"
	disableTime %SFTime; "0"
	enabled %SFBool; "true"
	finiteRotationAxis %SFVec3f; "0 1 0"
	fixed %SFBool; "false"
	forces %MFVec3f; #IMPLIED
	inertia %SFMatrix3f; "1 0 0 0 1 0 0 0 1"
	linearDampingFactor %SFFloat; "0.001"
	linearVelocity %SFVec3f; "0 0 0"
	mass %SFFloat; "1"
	orientation %SFRotation; "0 0 1 0"
	position %SFVec3f; "0 0 0"
	torques %MFVec3f; #IMPLIED
	useFiniteRotation %SFBool; "false"
	useGlobalGravity %SFBool; "true"
	containerField (body1 | body2 | bodies) "bodies"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT RigidBodyCollection (IS?, (%MetadataNodes;)?, (RigidBody | BallJoint | DoubleAxisHingeJoint | MotorJoint | SingleAxisHingeJoint | SliderJoint |  UniversalJoint | CollisionCollection | %WildcardNodes;)* )>
<!ATTLIST RigidBodyCollection
	autoDisable %SFBool; "false"
	constantForceMix %SFFloat; "0.0001"
	contactSurfaceThickness %SFFloat; "0"
	disableAngularSpeed %SFFloat; "0"
	disableLinearSpeed %SFFloat; "0"
	disableTime %SFTime; "0"
	enabled %SFBool; "true"
	errorCorrection %SFFloat; "0.8"
	gravity %SFVec3f; "0 -9.8 0"
	iterations %SFInt32; "10"
	maxCorrectionSpeed %SFFloat; "-1"
	preferAccuracy %SFBool; "false"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT SingleAxisHingeJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST SingleAxisHingeJoint
	anchorPoint %SFVec3f; "0 0 0"
	axis %SFVec3f; "0 0 0"
	maxAngle %SFFloat; "3.141592653"
	minAngle %SFFloat; "-3.141592653"
	forceOutput %MFString; "NONE"
	stopBounce %SFFloat; "0"
	stopErrorCorrection %SFFloat; "0.8"
	containerField NMTOKEN "joints"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT SliderJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST SliderJoint
	axis %SFVec3f; "0 1 0"
	forceOutput %MFString; "NONE"
	maxSeparation %SFFloat; "1"
	minSeparation %SFFloat; "0"
	sliderForce %SFFloat; "0"
	stopBounce %SFFloat; "0"
	stopErrorCorrection %SFFloat; "1"
	containerField NMTOKEN "joints"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT UniversalJoint (IS?, (%MetadataNodes;)?, (RigidBody | %WildcardNodes;)* )>
<!ATTLIST UniversalJoint
	anchorPoint %SFVec3f; "0 0 0"
	axis1 %SFVec3f; "0 0 0"
	axis2 %SFVec3f; "0 0 0"
	forceOutput %MFString; "NONE"
	stop1Bounce %SFFloat; "0"
	stop1ErrorCorrection %SFFloat; "0.8"
	stop2Bounce %SFFloat; "0"
	stop2ErrorCorrection %SFFloat; "0.8"
	containerField NMTOKEN "joints"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%PickingSensorComponent;[

<!-- Content model for X3DPickingSensorNode types first has varied singleton pickingGeometry node, followed by pickTarget -->
<!ELEMENT LinePickSensor (IS?, (%MetadataNodes;)?, (IndexedLineSet | LineSet | %WildcardNodes;)?, (%GroupingNodes; | Inline | %WildcardNodes;)* )>
<!ATTLIST LinePickSensor
	enabled %SFBool; "true"
	objectType %MFString; "ALL"
	intersectionType %SFString; "BOUNDS"
	sortOrder %SFString; "CLOSEST"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PickableGroup (IS?, (%MetadataNodes;)?, (%ChildrenNodes; | %WildcardNodes;)*)>
<!ATTLIST PickableGroup
	objectType %MFString; "ALL"
	pickable %SFBool; "true"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PointPickSensor (IS?, (%MetadataNodes;)?, (PointSet | %WildcardNodes;)?, (%GroupingNodes; | Shape | Inline | %WildcardNodes;)* )>
<!ATTLIST PointPickSensor
	enabled %SFBool; "true"
	objectType %MFString; "ALL"
	intersectionType %SFString; "BOUNDS"
	sortOrder %SFString; "CLOSEST"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PrimitivePickSensor (IS?, (%MetadataNodes;)?, (Box|Cone|Cylinder|Sphere)?, (%GroupingNodes; | Shape | Inline | %WildcardNodes;)* )>
<!ATTLIST PrimitivePickSensor
	enabled %SFBool; "true"
	objectType %MFString; "ALL"
	intersectionType %SFString; "BOUNDS"
	sortOrder %SFString; "CLOSEST"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT VolumePickSensor (IS?, (%MetadataNodes;)?, (%GeometryNodes; | %WildcardNodes;)?, (%GroupingNodes; | Shape | Inline | %WildcardNodes;)* )>
<!ATTLIST VolumePickSensor
	enabled %SFBool; "true"
	objectType %MFString; "ALL"
	intersectionType %SFString; "BOUNDS"
	sortOrder %SFString; "CLOSEST"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%FollowersComponent;[

<!ELEMENT ColorChaser (IS?, (%MetadataNodes;)? )>
<!ATTLIST ColorChaser
	duration %SFTime; "1"
	initialDestination %SFColor; "0.8 0.8 0.8"
	initialValue %SFColor; "0.8 0.8 0.8"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ColorDamper (IS?, (%MetadataNodes;)? )>
<!ATTLIST ColorDamper
	tau %SFTime; "0.3"
	tolerance %SFFloat; "-1"
	initialDestination %SFColor; "0.8 0.8 0.8"
	initialValue %SFColor; "0.8 0.8 0.8"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CoordinateChaser (IS?, (%MetadataNodes;)? )>
<!ATTLIST CoordinateChaser
	duration %SFTime; "1"
	initialDestination %MFVec3f; "0 0 0"
	initialValue %MFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT CoordinateDamper (IS?, (%MetadataNodes;)? )>
<!ATTLIST CoordinateDamper
	tau %SFTime; "0.3"
	tolerance %SFFloat; "-1"
	initialDestination %MFVec3f; "0 0 0"
	initialValue %MFVec3f; "0 0 0"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT OrientationChaser (IS?, (%MetadataNodes;)? )>
<!ATTLIST OrientationChaser
	duration %SFTime; "1"
	initialDestination %MFVec3f; "0 1 0 0"
	initialValue %MFVec3f; "0 1 0 0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT OrientationDamper (IS?, (%MetadataNodes;)? )>
<!ATTLIST OrientationDamper
	tau %SFTime; "0.3"
	tolerance %SFFloat; "-1"
	initialDestination %SFRotation; "0 1 0 0"
	initialValue %SFRotation; "0 1 0 0"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionChaser (IS?, (%MetadataNodes;)? )>
<!ATTLIST PositionChaser
	duration %SFTime; "1"
	initialDestination %SFVec3f; "0 0 0"
	initialValue %SFVec3f; "0 0 0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionChaser2D (IS?, (%MetadataNodes;)? )>
<!ATTLIST PositionChaser2D
	duration %SFTime; "1"
	initialDestination %SFVec2f; "0 0"
	initialValue %SFVec2f; "0 0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionDamper (IS?, (%MetadataNodes;)? )>
<!ATTLIST PositionDamper
	tau %SFTime; "0.3"
	tolerance %SFFloat; "-1"
	initialDestination %SFVec3f; "0 0 0"
	initialValue %SFVec3f; "0 0 0"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PositionDamper2D (IS?, (%MetadataNodes;)? )>
<!ATTLIST PositionDamper2D
	tau %SFTime; "0.3"
	tolerance %SFFloat; "-1"
	initialDestination %SFVec2f; "0 0"
	initialValue %SFVec2f; "0 0"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ScalarChaser (IS?, (%MetadataNodes;)? )>
<!ATTLIST ScalarChaser
	duration %SFTime; "1"
	initialDestination %SFFloat; "0"
	initialValue %SFFloat; "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ScalarDamper (IS?, (%MetadataNodes;)? )>
<!ATTLIST ScalarDamper
	tau %SFTime; "0.3"
	tolerance %SFFloat; "-1"
	initialDestination %SFFloat; "0"
	initialValue %SFFloat; "0"
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TexCoordChaser2D (IS?, (%MetadataNodes;)? )>
<!ATTLIST TexCoordChaser2D
	duration %SFTime; "1"
	initialDestination %MFVec2f; #IMPLIED
	initialValue %MFVec2f; #IMPLIED
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT TexCoordDamper2D (IS?, (%MetadataNodes;)? )>
<!ATTLIST TexCoordDamper2D
	tau %SFTime; "0.3"
	tolerance %SFFloat; "-1"
	initialDestination %MFVec2f; #IMPLIED
	initialValue %MFVec2f; #IMPLIED
	order (0 | 1 | 2 | 3 | 4 | 5) "0"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>
<![%ParticleSystemsComponent;[

<!ELEMENT BoundedPhysicsModel (IS?, (%MetadataNodes;)?, (%GeometryNodes; | %WildcardNodes;)? )>
<!ATTLIST BoundedPhysicsModel
	enabled %SFBool; "true"
	containerField NMTOKEN "physics"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ForcePhysicsModel (IS?, (%MetadataNodes;)? )>
<!ATTLIST ForcePhysicsModel
	enabled %SFBool; "true"
	force %SFVec3f; "0 -9.8 0"
	containerField NMTOKEN "physics"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT WindPhysicsModel (IS?, (%MetadataNodes;)? )>
<!ATTLIST WindPhysicsModel
	direction %SFVec3f; "1 0 0"
	enabled %SFBool; "true"
	gustiness %SFFloat; "0.1"
	speed %SFFloat; "0.1"
	turbulence %SFFloat; "0"
	containerField NMTOKEN "physics"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ConeEmitter (IS?, (%MetadataNodes;)? )>
<!ATTLIST ConeEmitter
	angle %SFFloat; "0.7854"
	direction %SFVec3f; "0 1 0"
	position %SFVec3f; "0 0 0"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ExplosionEmitter (IS?, (%MetadataNodes;)? )>
<!ATTLIST ExplosionEmitter
	position %SFVec3f; "0 0 0"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PointEmitter (IS?, (%MetadataNodes;)? )>
<!ATTLIST PointEmitter
	direction %SFVec3f; "0 1 0"
	position %SFVec3f; "0 0 0"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT PolylineEmitter (IS?, (%MetadataNodes;)?, (Coordinate | CoordinateDouble | %WildcardNodes;)? )>
<!ATTLIST PolylineEmitter
	direction %SFVec3f; "0 1 0"
	coordIndex %MFInt32; "-1"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT SurfaceEmitter (IS?, (%MetadataNodes;)?, (%GeometryNodes; | %WildcardNodes;)? )>
<!ATTLIST SurfaceEmitter
	coordIndex %MFInt32; "-1"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT VolumeEmitter (IS?, (%MetadataNodes;)?, (Coordinate | CoordinateDouble | %WildcardNodes;)? )>
<!ATTLIST VolumeEmitter
	direction %SFVec3f; "0 1 0"
	coordIndex %MFInt32; "-1"
        internal %SFBool; "true"
	speed %SFFloat; "0"
	variation %SFFloat; "0.25"
	mass %SFFloat; "0"
	surfaceArea %SFFloat; "0"
	containerField NMTOKEN "emitter"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!ELEMENT ParticleSystem
((IS?, (%MetadataNodes;)?),
  (
     ( %AppearanceNodes;, ( %GeometryNodes;   | %WildcardNodes;  )? ) |
     ( (%GeometryNodes;), ( %AppearanceNodes; | %WildcardNodes;  )? ) |
     ( %WildcardNodes;,   ( %GeometryNodes;   | %AppearanceNodes; | %WildcardNodes; )? )
  )?,
  (Color | ColorRGBA | %WildcardNodes;),
  (ConeEmitter | ExplosionEmitter | PointEmitter | PolylineEmitter | SurfaceEmitter | VolumeEmitter | %WildcardNodes;)?,
  (BoundedPhysicsModel | ForcePhysicsModel | WindPhysicsModel | %WildcardNodes;)*,
  (TextureCoordinate | %WildcardNodes;)?
)
>
<!ATTLIST ParticleSystem
	createParticles %SFBool; "true"
	enabled %SFBool; "true"
	lifetimeVariation %SFFloat; "0.25"
	maxParticles %SFInt32; "200"
	particleLifetime %SFFloat; "5"
	particleSize %SFVec2f; "0.02 0.02"
	colorKey %MFFloat; #IMPLIED
	texCoordKey %MFFloat; #IMPLIED
	geometryType %SFString; "QUAD"
	bboxCenter %SFVec3f; "0 0 0"
	bboxSize %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	class NMTOKENS #IMPLIED
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
]]>

<!-- v3.3 -->

<!ENTITY % unitCategories "(angle|force|length|mass)">

<!ELEMENT unit EMPTY>
<!ATTLIST unit
	category %unitCategories;   #REQUIRED
	name     NMTOKEN            #REQUIRED
    conversionFactor %SFDouble; #REQUIRED>

<!ELEMENT MetadataBoolean (IS?, (%MetadataNodes; | %WildcardNodes;)?)>
<!ATTLIST MetadataBoolean
	name %SFString; #IMPLIED
	value %MFBool; #IMPLIED
	reference %SFString; #IMPLIED
	containerField %MetadataContainerFieldValues; "metadata"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<![%VolumeRenderComponent;[

<!ELEMENT BlendedVolumeStyle (IS?, (%MetadataNodes;)?, (%X3DComposableVolumeRenderStyleNode; | %Texture2DNodes; | %Texture3DTextureNodes; | %WildcardNodes;)* )>
<!ATTLIST BlendedVolumeStyle
	enabled         %SFBool;  "true"
	weightConstant1 %SFFloat; "0.5"
	weightConstant2 %SFFloat; "0.5"
	weightFunction1 (CONSTANT|ALPHA0|ALPHA1|TABLE|ONE_MINUS_ALPHA0|ONE_MINUS_ALPHA1) "CONSTANT"
	weightFunction2 (CONSTANT|ALPHA0|ALPHA1|TABLE|ONE_MINUS_ALPHA0|ONE_MINUS_ALPHA1) "CONSTANT"
	containerField NMTOKEN "renderStyle"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT BoundaryEnhancementVolumeStyle (IS?, (%MetadataNodes;)?)>
<!ATTLIST BoundaryEnhancementVolumeStyle
	enabled         %SFBool;  "true"
	boundaryOpacity %SFFloat; "0.9"
	opacityFactor   %SFFloat; "2"
	retainedOpacity %SFFloat; "0.2"
	containerField NMTOKEN "renderStyle"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT CartoonVolumeStyle (IS?, (%MetadataNodes;)?, (%Texture3DTextureNodes; | %WildcardNodes;)? )>
<!ATTLIST CartoonVolumeStyle
	enabled         %SFBool;  "true"
	colorSteps      (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64) "4"
	orthogonalColor %SFColorRGBA; "1 1 1 1"
	parallelColor   %SFColorRGBA; "0 0 0 1"
	containerField NMTOKEN "renderStyle"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT ComposedVolumeStyle (IS?, (%MetadataNodes;)?, (%X3DComposableVolumeRenderStyleNode; | %WildcardNodes;)* )>
<!ATTLIST ComposedVolumeStyle
	enabled         %SFBool;  "true"
	containerField NMTOKEN "renderStyle"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT EdgeEnhancementVolumeStyle (IS?, (%MetadataNodes;)?, (%Texture3DTextureNodes; | %WildcardNodes;)? )>
<!ATTLIST EdgeEnhancementVolumeStyle
	enabled           %SFBool;      "true"
	edgeColor         %SFColorRGBA; "0 0 0 1"
	gradientThreshold %SFFloat;     "0.4"
	containerField NMTOKEN "renderStyle"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT OpacityMapVolumeStyle (IS?, (%MetadataNodes;)?, (%Texture3DTextureNodes; | %WildcardNodes;)? )>
<!ATTLIST OpacityMapVolumeStyle
	enabled           %SFBool;      "true"
	containerField NMTOKEN "renderStyle"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- TODO can transferFunction field hold 2D textures? spec unclear... -->

<!ELEMENT ProjectionVolumeStyle (IS?, (%MetadataNodes;)?)>
<!ATTLIST ProjectionVolumeStyle
	enabled            %SFBool;      "true"
	intensityThreshold %SFFloat;     "0"
	type (MAX|MIN|AVERAGE) "MAX"
	containerField NMTOKEN "renderStyle"
        DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT ShadedVolumeStyle (IS?, (%MetadataNodes;)?, (%MaterialNodes;)?, (%Texture3DTextureNodes; | %WildcardNodes;)? )>
<!ATTLIST ShadedVolumeStyle
	enabled            %SFBool;      "true"
	lighting           %SFBool;      "false"
	shadows            %SFBool;      "false"
	enabled            %SFBool;      "true"
	phaseFunction      (NONE|Henyey-Greenstein)    "Henyey-Greenstein"
	containerField NMTOKEN "renderStyle"
        DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- TODO consider allowing alternate ordering of content model -->

<!ELEMENT SilhouetteEnhancementVolumeStyle (IS?, (%MetadataNodes;)?, (%Texture3DTextureNodes; | %WildcardNodes;)? )>
<!ATTLIST SilhouetteEnhancementVolumeStyle
	enabled                   %SFBool;  "true"
	silhouetteBoundaryOpacity %SFFloat; "0"
	silhouetteRetainedOpacity %SFFloat; "1"
	silhouetteSharpness       %SFFloat; "0.5"
	containerField NMTOKEN "renderStyle"
        DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT ToneMappedVolumeStyle (IS?, (%MetadataNodes;)?, (%Texture3DTextureNodes; | %WildcardNodes;)? )>
<!ATTLIST ToneMappedVolumeStyle
	enabled                   %SFBool;  "true"
	coolColor %SFColorRGBA; "0 0 1 0"
	warmColor %SFColorRGBA; "1 1 0 0"
	containerField NMTOKEN "renderStyle"
        DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT IsoSurfaceVolumeData (IS?, (%MetadataNodes;)?, (%X3DComposableVolumeRenderStyleNode; | %Texture2DNodes; | %Texture3DTextureNodes; | %WildcardNodes;)* )>
<!ATTLIST IsoSurfaceVolumeData
	contourStepSize  %SFFloat; "0"
	dimensions       %SFVec3f; "1 1 1"
	surfaceTolerance %SFFloat; "0"
	surfaceValues    %MFFloat; #IMPLIED
	bboxCenter       %SFVec3f; "0 0 0"
	bboxSize         %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT SegmentedVolumeData (IS?, (%MetadataNodes;)?, (%X3DComposableVolumeRenderStyleNode; | %Texture2DNodes; | %Texture3DTextureNodes; | %WildcardNodes;)* )>
<!ATTLIST SegmentedVolumeData
	dimensions       %SFVec3f; "1 1 1"
	segmentEnabled   %MFBool;  #IMPLIED
	bboxCenter       %SFVec3f; "0 0 0"
	bboxSize         %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>

<!ELEMENT VolumeData (IS?, (%MetadataNodes;)?, (%X3DComposableVolumeRenderStyleNode; | %Texture2DNodes; | %Texture3DTextureNodes; | %WildcardNodes;)* )>
<!ATTLIST VolumeData
	dimensions       %SFVec3f; "1 1 1"
	bboxCenter       %SFVec3f; "0 0 0"
	bboxSize         %SFVec3f; "-1 -1 -1"
	containerField NMTOKEN "children"
	DEF ID #IMPLIED
	USE IDREF #IMPLIED
>
<!-- TODO consider allowing alternate ordering of content model -->

]]>

<!-- ============= -->

<!-- Finally, Web3dExtensionComponent from separate DTDs.  Note that Web3dExtensionComponent
     content-model extensions needed to be added at beginning,	prior to node-type definitions. -->
<![%Web3dExtensionComponent;[

<!ENTITY % Web3dExtensionsPublicDTD  SYSTEM "x3d-3.3-Web3dExtensionsPublic.dtd">
<!ENTITY % Web3dExtensionsPrivateDTD SYSTEM "x3d-3.3-Web3dExtensionsPrivate.dtd">

%Web3dExtensionsPublicDTD;
%Web3dExtensionsPrivateDTD;

]]>

A.5.2 x3d-3.3-InputOutputFields.dtd

x3d-3.3-InputOutputFields.dtd extends the X3D version 3.3 DTD by also including fields with accessType inputOnly and outputOnly. Although X3D scene files cannot validly set values for any of these attributes, the DTD defines names and relationships of all fields and can be used by DTD-aware processing tools.

<!--
#
# X3D InputOutputFields DTD:
#
# http://www.web3d.org/specifications/x3d-3.3-InputOutputFields.dtd
#
# current version: 3.3.0
#
# revised: 18 July 2011
#
# Author: Don Brutzman
#
# Purpose: the primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by field definitions in x3d-3.3-InputOutputFields.dtd
#
# X3D Specification DTDs:
# http://www.web3d.org/specifications/x3d-3.3.dtd
# http://www.web3d.org/specifications/x3d-3.3-InputOutputFields.dtd
# http://www.web3d.org/specifications/x3d-3.3-Web3dExtensions.dtd
#
# Typical system location for this resource is adjacent to x3d-3.3.dtd:
# file://c:/www.web3d.org/specifications/x3d-3.3-InputOutputFields.dtd
# file:///www.web3d.org/specifications/x3d-3.3-InputOutputFields.dtd
#
# changelog:
# http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
# Note on typing:
# CDATA used for %SFBool; definitions to allow #FIXED "" initialization,
# since DTD rules otherwise require enumeration values to be
# initialized to true|false.
#
-->

<!ATTLIST AudioClip
elapsedTime %SFTime; #FIXED ""
duration_changed %SFTime; #FIXED ""
isPaused CDATA #FIXED ""
isActive CDATA #FIXED "">

<!ATTLIST Background
set_bind CDATA #FIXED ""
bindTime %SFTime; #FIXED ""
isBound CDATA #FIXED "">

<!ATTLIST BooleanFilter
set_boolean CDATA #FIXED ""
inputTrue CDATA #FIXED ""
inputFalse CDATA #FIXED ""
inputNegate CDATA #FIXED "">

<!-- value_changed is CDATA instead of %SFBool% in order to set empty value on an enumeration -->

<!ATTLIST BooleanSequencer
set_fraction %SFFloat; #FIXED ""
value_changed CDATA #FIXED ""
previous CDATA #FIXED ""
next CDATA #FIXED "">

<!ATTLIST BooleanToggle
set_boolean CDATA #FIXED "">

<!ATTLIST BooleanTrigger
set_triggerTime %SFTime; #FIXED ""
triggerTrue CDATA #FIXED "">

<!ATTLIST Collision
collideTime %SFTime; #FIXED ""
isActive CDATA #FIXED "">

<!ATTLIST ColorInterpolator
set_fraction %SFFloat; #FIXED ""
value_changed %SFColor; #FIXED "">

<!ATTLIST CoordinateInterpolator
set_fraction %SFFloat; #FIXED ""
value_changed %MFVec3f; #FIXED "">

<!ATTLIST CoordinateInterpolator2D
set_fraction %SFFloat; #FIXED ""
value_changed %MFVec2f; #FIXED "">

<!ATTLIST CylinderSensor
isActive CDATA #FIXED ""
isOver CDATA #FIXED ""
rotation_changed %SFRotation; #FIXED ""
trackPoint_changed %SFVec3f; #FIXED "">

<!ATTLIST ElevationGrid
set_height %MFFloat; #FIXED "">

<!ATTLIST Extrusion
set_crossSection %MFVec2f; #FIXED ""
set_orientation %MFRotation; #FIXED ""
set_scale %MFVec2f; #FIXED ""
set_spine %MFVec3f; #FIXED "">

<!ATTLIST Fog
set_bind CDATA #FIXED ""
bindTime %SFTime; #FIXED ""
isBound CDATA #FIXED "">

<!ATTLIST IndexedFaceSet
set_colorIndex %MFInt32; #FIXED ""
set_coordIndex %MFInt32; #FIXED ""
set_normalIndex %MFInt32; #FIXED ""
set_texCoordIndex %MFInt32; #FIXED "">

<!ATTLIST IndexedLineSet
set_colorIndex %MFInt32; #FIXED ""
set_coordIndex %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleFanSet
set_index %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleSet
set_index %MFInt32; #FIXED "">

<!ATTLIST IndexedTriangleStripSet
set_index %MFInt32; #FIXED "">

<!ATTLIST IntegerSequencer
set_fraction %SFFloat; #FIXED ""
value_changed %SFInt32; #FIXED ""
previous CDATA #FIXED ""
next CDATA #FIXED "">

<!ATTLIST IntegerTrigger
set_boolean CDATA #FIXED ""
triggerValue %SFInt32; #FIXED "">

<!ATTLIST KeySensor
isActive CDATA #FIXED ""
keyPress %SFString; #FIXED ""
keyRelease %SFString; #FIXED ""
actionKeyPress %SFInt32; #FIXED ""
actionKeyRelease %SFInt32; #FIXED ""
altKey CDATA #FIXED ""
controlKey CDATA #FIXED ""
shiftKey CDATA #FIXED "">

<!ATTLIST LoadSensor
isActive CDATA #FIXED ""
isLoaded CDATA #FIXED ""
loadTime %SFTime; #FIXED ""
progress %SFFloat; #FIXED "">

<!ATTLIST LOD
level_changed %SFInt32; #FIXED "">

<!ATTLIST MovieTexture
elapsedTime %SFTime; #FIXED ""
duration_changed %SFTime; #FIXED ""
isPaused CDATA #FIXED ""
isActive CDATA #FIXED "">

<!ATTLIST NavigationInfo
set_bind CDATA #FIXED ""
bindTime %SFTime; #FIXED ""
transitionComplete CDATA #FIXED ""
isBound CDATA #FIXED "">

<!ATTLIST NormalInterpolator
set_fraction %SFFloat; #FIXED ""
value_changed %MFVec3f; #FIXED "">

<!ATTLIST OrientationInterpolator
set_fraction %SFFloat; #FIXED ""
value_changed %SFRotation; #FIXED "">

<!ATTLIST PlaneSensor
isActive CDATA #FIXED ""
isOver CDATA #FIXED ""
trackPoint_changed %SFVec3f; #FIXED ""
translation_changed %SFVec3f; #FIXED "">

<!ATTLIST PositionInterpolator
set_fraction %SFFloat; #FIXED ""
value_changed %SFVec3f; #FIXED "">

<!ATTLIST PositionInterpolator2D
set_fraction %SFFloat; #FIXED ""
value_changed %SFVec2f; #FIXED "">

<!ATTLIST ProximitySensor
isActive CDATA #FIXED ""
position_changed %SFVec3f; #FIXED ""
orientation_changed %SFRotation; #FIXED ""
centerOfRotation_changed %SFVec3f; #FIXED ""
enterTime %SFTime; #FIXED ""
exitTime %SFTime; #FIXED "">

<!ATTLIST ScalarInterpolator
set_fraction %SFFloat; #FIXED ""
value_changed %SFFloat; #FIXED "">

<!ATTLIST SphereSensor
isActive CDATA #FIXED ""
isOver CDATA #FIXED ""
rotation_changed %SFRotation; #FIXED ""
trackPoint_changed %SFVec3f; #FIXED "">

<!ATTLIST StringSensor
isActive CDATA #FIXED ""
enteredText %SFString; #FIXED ""
finalText %SFString; #FIXED "">

<!ATTLIST Text
lineBounds %MFVec2f; #FIXED ""
textBounds %SFVec2f; #FIXED "">

<!ATTLIST TextureBackground
set_bind CDATA #FIXED ""
bindTime %SFTime; #FIXED ""
isBound CDATA #FIXED "">

<!ATTLIST TimeSensor
elapsedTime %SFTime; #FIXED ""
cycleTime %SFTime; #FIXED ""
fraction_changed %SFFloat; #FIXED ""
isActive CDATA #FIXED ""
isPaused CDATA #FIXED ""
time %SFTime; #FIXED "">

<!ATTLIST TimeTrigger
set_boolean CDATA #FIXED ""
triggerTime %SFTime; #FIXED "">

<!ATTLIST TouchSensor
hitNormal_changed %SFVec3f; #FIXED ""
hitPoint_changed %SFVec3f; #FIXED ""
hitTexCoord_changed %SFVec2f; #FIXED ""
isActive CDATA #FIXED ""
isOver CDATA #FIXED ""
touchTime %SFTime; #FIXED "">

<!ATTLIST Viewpoint
set_bind CDATA #FIXED ""
bindTime %SFTime; #FIXED ""
isBound CDATA #FIXED "">

<!ATTLIST VisibilitySensor
enterTime %SFTime; #FIXED ""
exitTime %SFTime; #FIXED ""
isActive CDATA #FIXED "">

<!ATTLIST EspduTransform
isStandAlone CDATA #FIXED ""
isNetworkReader CDATA #FIXED ""
isNetworkWriter CDATA #FIXED ""
isRtpHeaderHeard CDATA #FIXED ""
isActive CDATA #FIXED ""
timestamp %SFTime; #FIXED ""
set_articulationParameterValue0 %SFFloat; #FIXED ""
set_articulationParameterValue1 %SFFloat; #FIXED ""
set_articulationParameterValue2 %SFFloat; #FIXED ""
set_articulationParameterValue3 %SFFloat; #FIXED ""
set_articulationParameterValue4 %SFFloat; #FIXED ""
set_articulationParameterValue5 %SFFloat; #FIXED ""
set_articulationParameterValue6 %SFFloat; #FIXED ""
set_articulationParameterValue7 %SFFloat; #FIXED ""
articulationParameterValue0_changed %SFFloat; #FIXED ""
articulationParameterValue1_changed %SFFloat; #FIXED ""
articulationParameterValue2_changed %SFFloat; #FIXED ""
articulationParameterValue3_changed %SFFloat; #FIXED ""
articulationParameterValue4_changed %SFFloat; #FIXED ""
articulationParameterValue5_changed %SFFloat; #FIXED ""
articulationParameterValue6_changed %SFFloat; #FIXED ""
articulationParameterValue7_changed %SFFloat; #FIXED ""
isCollided CDATA #FIXED ""
collideTime %SFTime; #FIXED ""
isDetonated CDATA #FIXED ""
detonateTime %SFTime; #FIXED ""
firedTime %SFTime; #FIXED ""
>
<!ATTLIST ReceiverPdu
isStandAlone CDATA #FIXED ""
isNetworkReader CDATA #FIXED ""
isNetworkWriter CDATA #FIXED ""
isRtpHeaderHeard CDATA #FIXED ""
isActive CDATA #FIXED ""
timestamp %SFTime; #FIXED ""
>

<!ATTLIST SignalPdu
isStandAlone CDATA #FIXED ""
isNetworkReader CDATA #FIXED ""
isNetworkWriter CDATA #FIXED ""
isRtpHeaderHeard CDATA #FIXED ""
isActive CDATA #FIXED ""
timestamp %SFTime; #FIXED ""
>

<!ATTLIST TransmitterPdu
isStandAlone CDATA #FIXED ""
isNetworkReader CDATA #FIXED ""
isNetworkWriter CDATA #FIXED ""
isRtpHeaderHeard CDATA #FIXED ""
isActive CDATA #FIXED ""
timestamp %SFTime; #FIXED ""
>

<!ATTLIST GeoElevationGrid
set_height %MFDouble; #FIXED "">

<!ATTLIST GeoPositionInterpolator
set_fraction %SFFloat; #FIXED ""
value_changed %SFVec3f; #FIXED ""
geovalue_changed %SFVec3d; #FIXED "">

<!ATTLIST GeoTouchSensor
isActive CDATA #FIXED ""
isOver CDATA #FIXED ""
touchTime %SFTime; #FIXED ""
hitGeoCoord_changed %SFVec3d; #FIXED ""
hitNormal_changed %SFVec3f; #FIXED ""
hitPoint_changed %SFVec3f; #FIXED ""
hitTexCoord_changed %SFVec2f; #FIXED "">

<!ATTLIST GeoViewpoint
set_bind CDATA #FIXED ""
set_orientation %SFRotation; #FIXED ""
set_position %SFVec3d; #FIXED ""
bindTime %SFTime; #FIXED ""
isBound CDATA #FIXED "">

<!ATTLIST NurbsOrientationInterpolator
set_fraction %SFFloat; #FIXED ""
value_changed %SFRotation; #FIXED "">

<!ATTLIST NurbsPositionInterpolator
set_fraction %SFFloat; #FIXED ""
value_changed %SFVec3f; #FIXED "">

<!ATTLIST NurbsSurfaceInterpolator
set_fraction %SFVec2f; #FIXED ""
normal_changed %SFVec3f; #FIXED ""
position_changed %SFVec3f; #FIXED "">

<!ATTLIST IndexedQuadSet
set_index %MFInt32; #FIXED "">

<!ATTLIST ComposedShader
isSelected CDATA #FIXED ""
isValid CDATA #FIXED ""
activate CDATA #FIXED "">

<!ATTLIST PackagedShader
isSelected CDATA #FIXED ""
isValid CDATA #FIXED ""
activate CDATA #FIXED "">

<!ATTLIST ProgramShader
isSelected CDATA #FIXED ""
isValid CDATA #FIXED ""
activate CDATA #FIXED "">

A.5.3 x3d-3.3-Web3dExtensionsPublic.dtd

The public X3D DTD extension will be used to contain approved extensions that have not yet been included in Part 1 of ISO/IEC 19775. The form of the public X3D DTD extension is depicted below:

<!--
#
# X3D Web3D Extensions Public DTD:
#
# http://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPublic.dtd
#
# current version: 3.3.0
#
# created: 30 April 2005
# revised: 18 July 2011
#
# Maintainer: Don Brutzman
#
# Purpose: support Web3D Consortium extensions to the X3D tagset.
# The primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by node definitions in x3d-3.3-Web3dExtensionsPublic.dtd
# and x3d-3.3-Web3dExtensionsPrivate.dtd
#
# X3D Specification DTDs:
# http://www.web3d.org/specifications/x3d-3.3.dtd
# http://www.web3d.org/specifications/x3d-3.3-InputOutputFields.dtd
# http://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPublic.dtd
# http://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPrivate.dtd
#
# Web3D extensions update URL:
# http://www.web3d.org/x3d/content/x3d-3.3-Web3dExtensionsPublic.dtd
#
# changelog:
# http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
-->

<!-- ================================================================= -->

<!ENTITY % LatticeXvlComponent "INCLUDE">

<!--
LatticeXVL 1.0 Document Type Definition (DTD)

Description: Define the XVL tag and attribute profile for X3D.

This X3D native node corresponds to a VRML ExternProto
declaration.

Elements in this tagset are enabled by setting the
XvlProfile entity to "INCLUDE" at the top of an
X3D scene file, as shown in several examples such as
examples/LatticeXvl/XvlShellAll.x3d. This flag then
triggers inclusion of the XVL tags in the
x3d-3.3.dtd tagset.

Status: Complete

Authors: Lattice Technology, Inc. proposed the Xvl extensions,
Makito Seki produced XML encoding of XVL nodes for X3D
with additional work by Marc Jablonski and Don Brutzman

Reference: LatticeXvl extension for X3D
http://www.web3d.org/x3d/content/examples/LatticeXvl/doc/proposal/LatticeProposal.html
http://www.Xvl3D.com

Issues: Mark Jablonski maintains the list.

Created: 10 May 2001
-->

<![%LatticeXvlComponent;[

<!-- for future: G1T1 level -->

<!ENTITY % XvlG1T1ShellTypes "" >

<!-- Types of XVL Shells -->

<!ENTITY % XvlShell.shellTypes " %XvlG1T1ShellTypes; POLYGON_MESH | LATTICE_MESH " >


<!ELEMENT XvlShell (IS?, (%MetadataNodes;)?, (
( (%TextureCoordinateNodes;), ((%CoordinateNodes;) | %WildcardNodes;) ) |
( (%CoordinateNodes;), ((%TextureCoordinateNodes;) | %WildcardNodes;)? ) |
( %WildcardNodes;, ((%TextureCoordinateNodes;) | (%CoordinateNodes;) | %WildcardNodes;)?) )?
)>
<!ATTLIST XvlShell
shellType ( %XvlShell.shellTypes; ) #IMPLIED
numberOfDivisions %SFInt32; #IMPLIED
vertexRound %MFFloat; #IMPLIED
edgeBeginCoordIndex %MFInt32; #IMPLIED
edgeEndCoordIndex %MFInt32; #IMPLIED
edgeRound %MFFloat; #IMPLIED
edgeBeginVector %MFVec3f; #IMPLIED
edgeEndVector %MFVec3f; #IMPLIED
faceCoordIndex %MFInt32; #IMPLIED
faceTexCoordIndex %MFInt32; #IMPLIED
faceEmpty %MFBool; #IMPLIED
faceHidden %MFBool; #IMPLIED
containerField NMTOKEN "geometry"
class CDATA ""
DEF ID #IMPLIED
USE IDREF #IMPLIED>

]]>

<!-- ================================================================= -->

A.5.4 x3d-3.3-Web3dExtensionsPrivate.dtd

The private X3D DTD extension will be used to contain X3D extensions that have not been approved but may exist for testing future development. The form of the private X3D DTD extension is depicted below:

<!--
#
# X3D Web3D Extensions Private DTD:
#
# http://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPrivate.dtd
#
# current version: 3.3.0
#
# created: 30 April 2005
# revised: 18 July 2011
#
# Maintainer: Don Brutzman
#
# Purpose: support Web3D Consortium extensions to the X3D tagset.
# The primary Extensible 3D (X3D) Document Type Definition (DTD)
# is augmented by node definitions in x3d-3.3-Web3dExtensionsPublic.dtd
# and x3d-3.3-Web3dExtensionsPrivate.dtd
#
# X3D Specification DTDs:
# http://www.web3d.org/specifications/x3d-3.3.dtd
# http://www.web3d.org/specifications/x3d-3.3-InputOutputFields.dtd
# http://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPublic.dtd
# http://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPrivate.dtd
#
# Web3D extensions update URL:
# http://www.web3d.org/x3d/content/x3d-3.3-Web3dExtensionsPublic.dtd
#
# changelog:
# http://www.web3d.org/specifications/x3d-dtd-changelog.txt
#
-->

<!-- ================================================================= -->

<!-- Enter ELEMENT and ATTLIST definitions here -->

<!-- ================================================================= -->

--- X3D separator bar ---