<!--
X3D DTD changelog:
    https://www.web3d.org/specifications/x3d-dtd-changelog.txt
Version control:
    https://svn.code.sf.net/p/x3d/code/www.web3d.org/specifications
Documentation:
    https://www.web3d.org/specifications/X3dDoctypeDocumentation4.0.html

X3D Specification DTDs:
	https://www.web3d.org/specifications/x3d-4.0.dtd
	https://www.web3d.org/specifications/x3d-4.0-InputOutputFields.dtd
	https://www.web3d.org/specifications/x3d-4.0-Web3dExtensionsPublic.dtd
	https://www.web3d.org/specifications/x3d-4.0-Web3dExtensionsPrivate.dtd
	https://www.web3d.org/specifications/x3d-3.3.dtd
	https://www.web3d.org/specifications/x3d-3.3-InputOutputFields.dtd
	https://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPublic.dtd
	https://www.web3d.org/specifications/x3d-3.3-Web3dExtensionsPrivate.dtd
	https://www.web3d.org/specifications/x3d-3.2.dtd
	https://www.web3d.org/specifications/x3d-3.2-InputOutputFields.dtd
	https://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPublic.dtd
	https://www.web3d.org/specifications/x3d-3.2-Web3dExtensionsPrivate.dtd
	https://www.web3d.org/specifications/x3d-3.1.dtd
	https://www.web3d.org/specifications/x3d-3.1-InputOutputFields.dtd
	https://www.web3d.org/specifications/x3d-3.1-Web3dExtensionsPublic.dtd
	https://www.web3d.org/specifications/x3d-3.1-Web3dExtensionsPrivate.dtd
	https://www.web3d.org/specifications/x3d-3.0.dtd
	https://www.web3d.org/specifications/x3d-3.0-InputOutputFields.dtd
	https://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPublic.dtd
	https://www.web3d.org/specifications/x3d-3.0-Web3dExtensionsPrivate.dtd

Final doctype:
  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "https://www.web3d.org/specifications/x3d-4.0.dtd">
  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd">
  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.2//EN" "https://www.web3d.org/specifications/x3d-3.2.dtd">
  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.1//EN" "https://www.web3d.org/specifications/x3d-3.1.dtd">
  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">

Transitional doctype (3.0 and 3.1, no longer supported):
  <!DOCTYPE X3D PUBLIC "https://www.web3d.org/specifications/x3d-3.0.dtd" "file:///www.web3d.org/TaskGroups/x3d/translation/x3d-3.0.dtd">

Open-source license:
	https://www.web3d.org/specifications/license.html
	https://www.web3d.org/specifications/license.txt

DTD development tools:
   Netbeans https://www.netbeans.org
   XML Spy  https://www.xmlspy.com
   Ant      https://ant.apache.org

X3D editor for testing usage of these DTDs and schemas:
   X3D-Edit https://savage.nps.edu/X3D-Edit

X3D DTD version numbering:
- initial well-defined DTD                                      0.5
- all nodes available in test scene and checked in DTD          0.6
- Xeena able to present translated X3D scene using DTD          0.7
- DTD compliance exercised by NIST's VRML & XML test suites		0.8
-  pre-SIGGRAPH 2002 change series                              0.8.x
- post-SIGGRAPH 2002 change series                              0.9.x
- matching X3D abstract specification, consolidation of parts   3.0
- possibility of several profile-customized DTDs
- approval by task group, community, Web3D Consortium, ISO      3.0.11 - Fall 2003
- approval by ISO - Summer 2004                                 3.0.16
- approved versions:                                            3.0, 3.1, 3.2, 3.3
- future versions:                                              4.0, 4.1

===================================================================================
X3D Scene Authoring Hints: Validation of X3D Scenes using DTD and XML Schema
https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Validation

X3D for Web Authors, Chapter 1, Technical Introduction
https://x3dgraphics.com/chapters/Chapter01-Technical_Introduction.pdf
=================================================================================================

Author:				Don Brutzman

Example use referencing the X3D DOCTYPE and Schema in an X3D source scene:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd">
<X3D profile='Immersive' version='3.3' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.3.xsd'
     xmlns:xsd='https://www.w3.org/2001/XMLSchema-instance'>
  <head>
    <meta content='example X3D DOCTYPE and Schema use' name='description'/>
  </head>
  <Scene>
    <!-- Scene graph nodes are added here -->
  </Scene>
</X3D>

=============================================================================

Maintainers:
Don Brutzman and Dick Puk, X3D Standards Working Group

Contributors:
Henry Boccon-Gibod, Don Brutzman, John Carlson, Justin Couch, Leonard Daly,
Rick Goldberg, Alan Hudson, Michalis Kamburelis, HyoKwang Lee, Myeong Wong Lee,
Rick Lentz, Vince Marchetti, Mike McCann, Christophe Mouton, Terry Norbraten,
Marc Petit, Andreas Plesch, Nicholas Polys, Dick Puk, Peter Ryan, Holger Seelig,
Keith Victor, Roy Walmsley, Joe D. Williams, Changhua Wu, Byounghyun Yoo,
Kwan Hee Yoo, and members of the X3D Working Group.

=============================================================================

TODO identified issues:
- Need to integrate content models with %LayeringComponent; %LayoutComponent; %RigidBodyPhysicsComponent; %PickingSensorComponent; %FollowersComponent; %ParticleSystemsComponent;
- TODO fix shader mixed-content models, see Script and corresponding X3D schemas for examples
- allow other values for ShadedVolumeStyle phaseFunction

Specification issues, clarifications and change resolutions are maintained by the X3D Working Group
in the Web3D Consortium's Mantis issue tracking system. Feedback and improvements are always welcome.
https://www.web3d.org/x3d/content/examples/X3dResources.html#Feedback

=============================================================================

X3D DTD update activity:
https://www.web3d.org/specifications/x3d-dtd-changelog.txt

16 DEC 2025, brutzman
- (v3.0)       remove GeneratedCubeMapTexture from GeoMetadata, not defined until X3D v3.1
- (v3.0, v3.1) remove GeoProximitySensor from GeoMetadata,      not defined until X3D v3.2
- (v3.1)       remove TextureProperties  from ImageTexture,     not defined until X3D v3.2
- (v3.2)       remove MetadataBoolean from MetadataNodes macro, not defined until X3D v3.3
- (all) <!ELEMENT X3D (head?, Scene)>
  note DOCTYPE entries not defined for ds:Signature family of elements, attributes,
  note namespace prefixes for xmlns: and xsd: attributes are fixed
  all DTDs now validate in LiquidXML
- (v4.1)       added new node FontLibrary
- (v4.1)       added new node Tangent

14 DEC 2025, brutzman
- (v4.1) created draft version 4.1 based on stable version 4.0
- (v4.0, v4.1) LiquidXML diagnostics: remove duplicate attribute definitions for
  CylinderSensor description, Material transparency, ProtoInstance class id style,
  SpatialSound id
- (v4.1) added new node HAnimPose

23 AUG 2025, brutzman, carlson
- (v4.0) add missing enumerations for unique fields in Material node,
  defined in containerFieldChoicesX3DUrlObjectTexture:
  ambientTexture, diffuseTexture, shininessTexture, specularTexture

17 AUG 2025, brutzman
- (v4.0) Web Audio API nodes, channelInterpretation choices (SPEAKERS|DISCRETE)
  vice (SPEAKERS|EXPLICIT)
- (v4.0) add Sound node description field
- (v4.0) PeriodicWave has no gain field

28 JUL 2025, brutzman
- (v3.2-4.0) add ScreenGroup to list of allowed GroupingNodes

31 DEC 2024, brutzman
- (4.0) ProtoInstance name attribute is required in X3D XML encoding
  https://mantis.web3d.org/view.php?id=678

10 DEC 2024, brutzman
- (4.0) errata: upVector now part of TextureProjector and TextureProjectorParallel
  consistently with default 0 1 0

4 JUL 2024, brutzman
- meta name attribute is #REQUIRED (matching schema requirement)

17 DEC 2023, brutzman
- (4.0) capitalization of WaveShaper oversample allowed parameters (NONE|2X|4X)

20 NOV 2023, seelig, brutzman
- ArcClose2D Disk2D Rectangle2D TriangleSet2D field solid has default value false
- HAnimMotion field enabled has default value true

5 NOV 2023, seelig, brutzman
- (4.0) added ComposedCubeMapTexture textureProperties, must follow other textures
- ElevationGrid    default values xDimension 0, zDimension 0, height is empty array
- GeoElevationGrid default values xDimension 0, zDimension 0, height is [0 0]
  with difference noted as X3D 4.1 erratum in issue tracker under Mantis 1447.
- note fieldOfView default values set to 0.7854 rather than spec value 0.785398
  in order to avoid false-positive validation errors, also avoid roundoff errors in tools
- (4.0) OrthoViewpoint fieldOfView has type MFFloat even though SFVec3f is more
  correct to prevent modeling errors, deficiency recorded as Mantis 1398
- SurfaceEmitter has no coordIndex field, removed
- CylinderSensor, PlaneSensor field axisRotation default value 0 0 1 0
- (4.0) added TextureTransform3D, TextureTransformMatrix3D mapping field

2 JUL 2023, brutzman
- (4.0) HAnimMotion skeletalConfiguration removed, not supported in final
  version of X3D 4.0 Architecture
- (4.0) HAnimMotion frameCount is outputOnly and not a legal value in an
  X3D model, also removed prior spelling totalFrameCount
- (4.0) HAnimMotion default containerField is motions

23 APR 2023, brutzman
- consistent use of https (only http within schema references to support tools)

30 MAR 2023, brutzman, puk
- (4.0) Mantis 1435, fixed duration field DynamicsCompressor attack: SFTime
  vice SFFloat
- (4.0) Mantis 1410, included IndexedLineSet as one of numerous possible nodes
  for HAnimHumanoid skin

31 JAN 2023, norbraten, brutzman
- add XML Security namespaces for digital signature and encryption:
  allow XML Signature ds:Signature after X3D head Scene. note namespace values fixed.
  https://stackoverflow.com/questions/2096505/document-type-declaration-and-namespaces

29 JAN 2023, carlson, williams brutzman
- HAnimJoint can contain HAnimDisplacer nodes

13 JAN 2023, brutzman, puk, myeong won lee, ryan
- (X3D 4.0 Architecture DIS ISO Editor review)
- (v4.0) add TextureProjection component
- (v4.0) add CollisionCollection description field
- (v4.0) HAnimMotion rename frameCount to totalFrameCount, accessType inputOutput
- (v4.0) HAnimMotion allow skeletalConfiguration in order to allow compatibility
         testing with HAnimHumanoid node pending final acceptance in HAnim2.1
         and X3D4.1 specifications, Mantis 1415
- (v4.0) Mantis 1398, OrthoViewpoint fieldOfView remains type SFVec4f for strict
         validation though X3D4 specification allows MFFloat for legacy tools
- (v4.0) Mantis 1411 capitalize Web Audio enumerations, also change hyphens
         to underscores, in order to match X3D naming conventions
- (v4.0) TODO Mantis 1420: Missing 5 enumeration sets (and likely fields) from
         Web Audio interfaces: AudioContextState, AudioContextLatencyCategory, 
         AutomationRate, PanningModelType, DistanceModelType.

29 DEC 2022, brutzman
- (v4.0) allowed HAnimMotion containerField values: children, motions
- (v4.0) allowed Switch, LOD containerField values: children, skin (Mantis 1410)
- (v4.0) corrected list of allowed nodes for HAnimHumanoid SFNode skin field
- (v4.0) confirmed HAnimMotion frameCount field change from outputOnly to inputOutput

4 JUL 2022, carlson seelig brutzman
- (v4.0) Mantis 1398, OrthoViewpoint fieldOfView needs type SFVec4f

12 JUN 2022, brutzman
- (v4.0) Mantis 641, HAnim version 1.0 not allowed since incompatible with HAnim 2.0.

21 APR 2022, kamburelis polys puk brutzman
- (v4.0) Mantis 1336, defer EnvironmentLight to X3D4.1 

14 APR 2022, brutzman puk
- (v4.0) Mantis 1255, fix fields for TextureProjector, TextureProjectorParallel
- (v4.0) Mantis 1347, UnlitMaterial emissiveColor default is 1 1 1
- (v4.0) Mantis 1393, remove PointProperties markertype, deferred to X3D4.1

2 APR 2022, brutzman puk
- (v4.0) Mantis 1393 add PointProperties markertype field

19 MAR 2022, brutzman puk
- (v4.0) Mantis 799 allow GeoCoordinate as coord field for Nurbs nodes,
  also PolylineEmitter and VolumeEmitter
- (v4.0) Mantis 491, include description field in all 4 DIS PDU nodes

14 MAR 2022, brutzman
- Mantis 655, HAnimJoint cannot contain HAnimSite or HAnimDisplacer

4 MAR 2022, brutzman
- (v4.0) SpotLight default value beamWidth = pi * 3 / 16 = 0.589049
- (v4.0) Add 'on' field to all nodes implementing X3DParticleEmitterNode
- (v4.0) OscillatorSource frequency default value 440.0
- (v4.0) Add ParticleSystem field castShadow

3 FEB 2022, brutzman puk
- Added X3DBoundedObject to RigidBody, RigidBodyCollection since they contained
  bounded child nodes (similar to NurbsSet, CollisionCollection, Mantis 1275)
- Changed/confirmed default values for axis fields in DoubleAxisHingeJoint,
  MotorJoint, RigidBody, SingleAxisHingeJoint, SliderJoint, UniversalJoint

7 JAN 2022, X3D Working group
- types remain unchanged for HAnimJoint ulimit llimit stiffness fields as MFFloat,
  each field has default value 0 0 0, only empty or 3-tuple arrays are valid,
  less restrictive typing maintained for backwards compatibility with X3D3 despite
  mismatch with HAnim 2.0 design patterns.

27 NOV 2021, brutzman
- (v4.0) change enableDoppler to dopplerEnabled, matching X3D4 Architecture
- (v4.0) default containerField=value for Metadata* nodes to reduce verboseness,
  this is a difference with respect to X3D3 XML validation defaults
- (v4.0) consistent definition of HTML5-related attributes: 
  "class NMTOKENS #IMPLIED", "id NMTOKEN #IMPLIED", "style %SFString; #IMPLIED"

30 OCT 2021, lakka brutzman
- (v4.0) add AudioGraphNodes to SceneLeafNodes, matching schema

29 SEP 2021, lentz kamburelis brutzman
- (v4.0) add enumerations for containerFieldChoicesX3DUrlObjectTexture and
  containerFieldChoicesX3DTexture2DNode: baseTexture, emissiveTexture,
  metallicRoughnessTexture, normalTexture, occlusionTexture

25 SEP 2021, brutzman
- (v3.1-v4.0) MultiTexture texture field has type X3DSingleTextureNode and can include
  ComposedCubeMapTexture, GeneratedCubeMapTexture, ImageCubeMapTexture,
  ComposedTexture3D, ImageTexture3D, PixelTexture3D

2 AUG 2021, brutzman lentz polys puk
- (v4.0) mediaDeviceID is inputOutput field, assignable by author 
  (X3DSoundDestinationNode, AudioDestination, StreamAudioDestination)
- MultiTexture texture field has type X3DSingleTextureNode and can include
  ComposedCubeMapTexture, GeneratedCubeMapTexture, ImageCubeMapTexture,
  ComposedTexture3D, ImageTexture3D, PixelTexture3D
- (v4.0) X3D statements include attributes id, class and style.
  These globalAttributes can appear on any X3D4 element but are only functional
  when included as XML within HTML5 page. See Annex L of X3D4 specification.

16 MAY 2021, brutzman
- (v4.0) StreamAudioDestination, StreamAudioSource: added streamIdentifier field,
  removed mediaStream field
- (v4.0) added EnvironmentLight to Full Profile ChildrenNodes

7 MAY 2021, brutzman
- HAnimJoint stiffness default 0 0 0

20 APR 2021, brutzman
- (v4.0) add AudioClip, MovieTexture, Sound, SpatialSound to AudioGraphNodes

13 MAR 2021, brutzman
- (v4.0) add PointProperties to AppearanceChildNodes

21 FEB 2021, brutzman
- (v4.0) EnvironmentLight complete signature

4 FEB 2021, brutzman puk
- (v4.0) HAnim motion startFrame, endFrame fields
- (v4.0) Inline global field controls external scoping of included lights,
         default false
- (v4.0) HAnimHumanoid SFNode field names skinBindingCoord, skinBindingNormal
         now singular for clarity, Mantis 1314
- (v4.0) EnvironmentLight initial signature, TODO add contained node fields

28 JAN 2021, kamburelis brutzman
- (v4.0) Appearance alphaMode with choices "AUTO" "OPAQUE" "MASK" "BLEND"
         with default "AUTO"
- (v4.0) Appearance alphaCutoff for threshold associated with alphaMode

19 DEC 2020, brutzman
- (v4.0) ComposedCubeMapTexture fields now match TextureBackground: backTexture
         bottomTexture frontTexture leftTexture rightTexture topTexture (Mantis 1331)
- (v4.0) DISEntityManager mapping field renamed as children (Mantis 1331)
- (v4.0) LoadSensor watchList field renamed as children (Mantis 1331)
- (v4.0) ParticleSystem colorRamp field renamed as color (Mantis 1331) and is
         MFNode vice SFNode, also texCoordRamp renamed as texCoord
- (v4.0) ParticleSystem can contain TextureCoordinateGenerator in addition to
         TextureCoordinate (Mantis 1332)
- (v4.0) add style attribute to all elements (can override FontStyle, ScreenFontStyle)
         FontStyle/ScreenFontStyle style->glyphStyle renaming rejected, instead
         can accept any kind of value for style field, Mantis 1335

6 DEC 2020, puk, brutzman
- (v4.0) rename X3DUrlObject refresh as autoRefresh, add autoRefreshTimeLimit

7 NOV 2020, brutzman, puk, malamos, lakka
- (v4.0) BufferAudioSource url load refresh fields
- (v4.0) SpatialSound, ListenerPointSource add field enableDoppler default false
- (v4.0) X3DSoundNode refactoring, PeriodicWave description and enabled fields,
         remove gain field from Sound, retain gain field in SpatialSound
- (v4.0) rename AudioBufferSource to BufferAudioSource for clarity, similar to
         StreamAudioSource
- (v4.0) rename ListenerPoint as ListenerPointSource for clarity, consistency
- (v4.0) rename ChannelSelector field channelNumber as channelSelection for clarity
- (v4.0) AudioBufferSource includes boolean field 'loop'
- pitch field missing from MovieTexture, corrected

1 NOV 2020, brutzman, puk, kamburelis, plesch
- (v4.0) X3DLightNode shadowIntensity, shadows (enabled); X3DShapeNode castShadow
- (v4.0) TextureProjectorPerspective renamed as TextureProjector,
         TextureProjectorParallel    remains as originally named
- (v4.0) Sound component audio graphs: all node types and nodes
- (v4.0) Shape component audio graphs: AcousticProperties
- (v4.0) PointProperties pointSizeAttenuation -> attenuation, type SFVec3f
- (v4.0) PointProperties omit colorMode
- (v4.0) corrected refresh field as SFTime (not SFFloat)
- (v4.0) remove incorrect fields metallic and roughness from Material
- (v4.0) revise default values for nearDistance/farDistance

13 OCT 2020, brutzman
- (v4.0) update documentation urls to X3D4 WD2
- (v4.0) add ProjectiveTextureMapping (PTM) component: TextureProjectorParallel
         and TextureProjectorPerspective, further changes under consideration
- (v4.0) X3DViewpointNode near/farClippingPlane renamed as nearDistance/farDistance

28 SEP 2020, kamburelis tolk puk brutzman
- (v4.0) add Physically Based Rendering (PBR) Material, PhysicalMaterial, and
  Non-photorealistic (NPR) UnlitMaterial
- (v4.0) add mapping field to TextureCoordinate, TextureCoordinateGenerator,
  TextureTransform

20 SEP 2020, brutzman
- (v4.0) add description, enabled fields to X3DTimeDependentNode, TimeSensor (Mantis 1323)
- (v4.0) add description, load, refresh  to X3DUrlOject nodes (Mantis 1262)

2 JUL 2020, brutzman
- (v4.0) add description field to HAnim nodes

6 JUN 2020, brutzman
- (v4.0) add nearClippingPlane farClippingPlane to Viewpoint, OrthoViewpoint,
  GeoViewpoint (Mantis 1320)
- (v4.0) add bboxDisplay, visible to RigidBody, RigidBodyCollection  (Mantis 1275)

14 JUN 2020, brutzman
- (v4.0) add viewAll, navigationInfo field to X3DViewpointNode (Mantis 1194, 1305)
- (v4.0) add Normal to LineSet, IndexedLineSet, PointSet (Mantis 1252)

25 MAY 2020, brutzman
- HAnimHumanoid version default is 2.0 for X3D4 and 1.0 for X3D3
- bboxDisplay implemented as consistent field name rather than displayBBox (Mantis 1277)
- only allow HAnim versions 1.0 and 2.0 (not 1.1 draft)
- allow either enumeration value for HAnim component: HAnim or H-Anim
- (v4.0) HAnimMotion allowed as valid content for X3DChildNode and HAnimHumanoid
- (v4.0) HAnimMotion frameCount is accessType inputOutput

7 APR 2020, brutzman
- (v4.0) add displayBBox field to X3DBoundedObject, Mantis 1277
- (v4.0) rename isPickable as pickable for naming consistency, Mantis 1287
- (v4.0) X3DLayerNode, Layer, LayoutLayer implements X3DPickableObject with
  fields objectType pickable and visible, Mantis 1287

18 JAN 2020, brutzman
- fix content model for GeoOrigin (which is X3DNode, not X3DChildNode)
- (v4.0) add visible field to X3DBoundedObject, Mantis 1271
  https://www.web3d.org/member-only/mantis/view.php?id=1271 (no longer named 'hidden')
- ((v3.2+) CollisionCollection contains nodes with X3DBoundedObject interfaces, so
  TODO CollisionCollection needs to be marked in specification as X3DBoundedObject as well.
- TODO (v4.0) PointSet, LineSet, IndexedLineSet implement X3DComposedGeometryNode
  similar to other geometry nodes, allowing Normal and texture coordinate children

12 JAN 2020, brutzman
- (v4.0) Enumeration, component name "HAnim" added, "H-Anim" remains an allowed value
  for backwards validation of X3Dv3 HAnimv1 models.

11 JAN 2020, brutzman
- added containerFieldChoicesX3DCoordinateNode and containerFieldChoicesX3DNormalNode
  also (v4.0) adding new HAnim v2 skinBinding fields for HAnimHumanoid
- (v3.0-3.3) HAnimHumanoid only includes 1 Coordinate, 1 Normal (skinCoord, skinNormal)
- (v4.0)     HAnimHumanoid  now includes 2 Coordinate, 2 Normal (skinCoord/SkinBindingCoords,
  skinNormal/skinBindingNormals)
- (v4.0) TODO PointProperties inconsistent camel-case spelling, should be lineType and lineWidthScaleFactor: Mantis 1252

13 JUL 2019, brutzman
- change documentation links https://www.web3d.org to https://www.web3d.org
  but leave schema, DTD reference links unchanged

4 MAY 2019, marchetti puk brutzman
- (v4.0) added PointProperties

10 FEB 2019, brutzman williams
- HAnim joint name humanoidroot corrected as humanoid_root
- (v4.0) TODO Update simpleType jointNameValues, segmentNameValues, featurePointNameValues
  to match HAnim 2.0 FDIS specification
- HAnimJoint ulimit, llimit, stiffness changed to SFVec3f rather than MFFloat
  as part of HAnim 2.0 review, reapplied missing correction from 27 SEP 2018

27 SEP 2018, brutzman
- Match v4.0 improvements for containerField choice types and LoadSensor watchlist nodes
  in v3.0 through v3.3 schemas

16 AUG 2018, brutzman
- humanoid_root is lower case (as are all HAnim names)

 8 JUL 2018, brutzman
- (v4.0) added rootNode (for parent GeoLOD) to containerFieldChoicesGroupLODShapeTransform
- (v4.0) (v3.2+) ParticleSystem: add containerFieldChoicesColor for Color, ColorRGBA
- (v4.0) (v3.2+) ParticleSystem: add containerFieldChoicesTextureCoordinate for TextureCoordinate, TextureCoordinateGenerator

 4 JUL 2018, brutzman
- (v4.0) add containerFieldChoicesX3DTexture3DNode (texture|gradients|segmentIdentifiers|surfaceNormals|voxels|watchList))
- (v4.0) rename containerFieldChoicesTexture as containerFieldChoicesX3DTexture2DNode
- (v4.0) rename containerFieldChoicesUrlObjectTexture as containerFieldChoicesX3DUrlObjectTexture
- (v4.0) fixed syntax error in Group containerField substitution

29 JUN 2018, brutzman
- added url field to PackagedShader
- (v4.0) added various non-default containerFieldChoices
- (v4.0) corrected HAnimMotion default containerField to motions

27 MAY 2018 brutzman, puk, lee, HAnim working group review
- (v4.0) added HAnimHumanoid fields for motions, motionsEnabled
- (v4.0) added/revised HAnimMotion fields for frameIncrement, frameIndex,
  loop, startFrame, endFrame (plus outputOnly fields cycleTime, elapsedTime)
- (v3.0-v3.3) HAnimHumanoid correct choices for version values (1.0 1.1 2.0)

13 MAY 2018 brutzman, puk, lee, HAnim working group review
- (v4.0) HAnimMotion added startFrame/endFrame fields,
  current draft set of fields include frameCount, frameDuration, frameIndex

3 MAY 2018 brutzman, HAnim working group
- (v4.0) HAnimMotion frameTime (original BVH name) renamed as frameDuration,
  added enabled field (default false), renamed frameTime as frameNumber

26 APR 2018 brutzman, puk
- (v4.0) Change HAnimJoint ulimit and llimit to type MFVec3F (vice MFFloat),
  see Mantis 774
- (v4.0) HAnimHumanoid fields loa, motions, motionsEnabled fields added
- (v4.0) HAnimMotion node added

6 JAN 2018 brutzman
- Allow HAnimHumanoid skin field to contain Group|Transform|Shape|IndexedFaceSet

30 DEC 2017 brutzman
- HAnimJoint can also contain HAnimSite in children field
- HAnimHumanoid can only contain IndexedFaceSet in skin field, not X3DChildNode
  (TODO allow other indexed meshes once HAnim and mantis reviews are complete)

7 September 2017 brutzman walmsley puk
- ProtoInstance name field not required, in order to support USE instance without name.
  Note that initial ProtoInstance (with optional DEF) must include name field regardless.

24 July 2017 seelig walmsley brutzman
- Layout size is MFFloat with default array value "1 1"
- (v3.2+) Add quotes to default MFString values for
  forceOutput %MFString; "&quot;NONE&quot;" (BallJoint, DoubleAxisHingeJoint, MotorJoint, SingleAxisHingeJoint, SliderJoint, UniversalJoint)
  appliedParameters %MFString; "&quot;BOUNCE&quot;" (CollisionCollection, Contact)
  objectType %MFString; "&quot;ALL&quot;" (LinePickSensor, PickableGroup, PointPickSensor, PrimitivePickSensor, VolumePickSensor, )

15 June 2017 seelig walmsley brutzman puk
- (v3.2+) fixed inconsistencies in anchorPoint default value, all now equal 0 0 0
- (v3.2+) fixed default ScreenFontStyle pointSize 12

29 May 2017 brutzman walmsley
- name attribute not required for Metadata* and *VertexAttribute (v3.1+) nodes,
  since cannot REQUIRE @name field or else USE nodes fail to validate
- changed *VertexAttribute name fields to NMTOKEN for stricter name checks

23 April 2017 brutzman walmsley puk
- name attribute required for Metadata* and *VertexAttribute (v3.1+) nodes (but see 29 May 2017)
- Metadata* and LayerSet nodes allowed as top-level children of Scene and ProtoBody
- LayerSet (v3.2+) can only appear at root of Scene, thus removed from ChildContentModelFull
- ProtoBody must have at least one element (rather than permitting zero)

4 April 2017 brutzman
- GeoElevationGrid creaseAngle is type SFDouble (see Mantis issue 264)

1 March 2017, danek, brutzman, walmsley
- include pickingTarget %ShapeNodes% as part of content model for *PickSensor nodes

26 December 2016, brutzman, walmsley
- HAnimDisplacer, HAnimHumanoid, HAnimJoint, HAnimSegment, HAnimSite names match NMTOKEN,
  enumeration list values not required
- HAnimJoint stiffness default value set to [1 1 1] to better support inverse kinematics (IK)

19 October 2016, sanden, brutzman, walmsley, polys
- (v3.3+) BlendedVolumeStyle weightFunction enumeration constants for ALPHA0/ALPHA1
  corrected to ALPHA1/ALPHA2

24 September 2016, brutzman
- (v3.1+) allow CDATA content for script source code within ShaderPart, ShaderProgram
- (v3.0)  allow MultiTexture in AppearanceChildNodes

28 August 2016, walmsley brutzman
- Attempted to define strict justifyValues enumeration list to only allow correct values
  for FontStyle/ScreenFontStyle justify attribute.  However, they failed validation
  and are not included in the DTD.
- Entity declaration for MFString enumerations won't work, according to XML Recommendation,
  because " is not a NameStartChar
     https://www.w3.org/TR/REC-xml/#sec-entity-decl
     https://www.w3.org/TR/REC-xml/#NT-Name
     https://www.w3.org/TR/REC-xml/#NT-NameStartChar
  Example definition matching schema follows.
  <!ENTITY % justifyValues '("BEGIN"|"BEGIN" "BEGIN"|"BEGIN" "END"|"BEGIN" "FIRST"|"BEGIN" "MIDDLE"|"END"|"END" "BEGIN"|"END" "END"|"END" "FIRST"|"END" "MIDDLE"|"FIRST"|"FIRST" "BEGIN"|"FIRST" "END"|"FIRST" "FIRST"|"FIRST" "MIDDLE"|"MIDDLE"|"MIDDLE" "BEGIN"|"MIDDLE" "END"|"MIDDLE" "FIRST"|"MIDDLE" "MIDDLE")' >
- Corrected names for r_thelion/l_thelion (omitting "bustpoint")

9 July 2016, brutzman
- Remove extraneous . character in HAnim enumeration names

1 April 2016, marchetti walmsley brutzman
- (v3.1+) CADAssembly content model is now permissive: X3DChildNode.  This is
  consistent with CADLayer.  Restrictive content rules go in CAD profiles instead.

3 March 2016, walmsley, brutzman
- Fix extension syntax for AppearanceNodes/AppearanceNodeExtensions within Shape

25 February 2016, walmsley, brutzman
- ShaderPart, ShaderProgram: default value is type="VERTEX"
- MetadataNodes now allows ProtoInstance

27 January 2015, brutzman
- GeoOrigin allowed in ChildrenNodes, matching X3D Schema.  
  GeoLocation, GeoLOD, GeoTransform content model simplified to match.
- (v3.2+) TextureProperties borderWidth type changed to SFInt32, anticipating specification change

13 January 2015, walmsley, brutzman
- (v3.2+) GeneratedCubeMapTexture, ImageCubeMapTexture: added SFNode TextureProperties as contained content
- (v3.2+) Contact node default containerField="contacts"
- (v3.3+) Added class attribute to MetadataBoolean and VolumeRendering component nodes
- (v3.3+) Remove duplicate enabled attribute from ShadedVolumeStyle
- insertion of comments to indicate which version of X3D includes addition of new elements/attributes,
  in order to facilitate diffing and maintenance of successive DTD versions

28 December 2015, seelig, walmsley, brutzman
- (v3.2+) LayoutLayer containerField corrected as "layers"

23 December 2015, walmsley, puk, daly, brutzman
- ElevationGrid/GeoElevationGrid defaults for xDimension/zDimension set to 2, height array set to [0 0 0 0]
  showing unit grid as default node.

7 December 2015, walmsley, brutzman
- (v3.2+) added matchCriterion field to LinePickSensor PointPickSensor PrimitivePickSensor VolumePickSensor

31 October 2015, brutzman
- updated version and revision information
- X3D version 3.4 no longer planned, going straight to version 4.0

19 October 2015, walmsley brutzman
- ProtoInstance now includes child metadata node

15 August 2015, walmsley, brutzman
- Allow ProtoInstance nodes as texture children for ComposedTexture3D (v3.1+),
  ComposedCubeMapTexture (v3.1+) and TextureBackground (v3.0+).

3 August 2015, walmsley, brutzman
- (v3.2+) X3DColorDamper nodes: default value for order field is 3, not 0
- Noted in comments that, unlike Schema, the DTD content model for Script node
  is not ordered

27 July 2015, walmsley brutzman
- MovieTexture: add description field
- HAnimJoint content model: add HAnimDisplacer node (but not HAnimSite, see Mantis Issue 655)
- NurbsTextureCoordinate removed from TextureCoordinateNodes

8 June 2015, walmsley brutzman
- corrected MultiTexture not part of Texture2DNodes, instead part of AppearanceChildNodes etc.
- (v3.3+) corrected content model for VolumeStyle nodes, omitting MultiTexture
- (v3.2+) CollisionCollection default containerField="collider"
- Added MedicalInterchange profile

27 May 2015, walmsley brutzman
- (v3.1+) Added axisRotation to CylinderSensor and PlaneSensor.
- Note that CADAssembly children ViewpointGroup and OrthoViewpoint require Navigation component level 3,
  which is higher than CADInterchange profile
- removed SquadOrientationInterpolator closed field, erroneous; added normalizeVelocity field
- various DIS *applicationID defaults now 0 (meaning no value specified) in order to match IEEE DIS defaults.
- NurbsCurve2D is not a renderable geometry node, removed from content model.
- PointPickSensor contains PointSet
- Added missing fields: SurfaceEmitter coordIndex, VolumeEmitter internal
- BoundaryEnhancementVolumeStyle content model fixed/simplified

15 May 2015, walmsley brutzman
- (v3.2+) X3DRigidJointNode corrected field naming from mustOutput to forceOutput

17 March, walmsley, brutzman
- (v3.2+) add ParticleSystems and Picking to component names

 2 February 2015, kwan hee yoo, brutzman
- (v3.4) add jointNames, segmentNames for improved LOA4 Humanoid Animation (H-Anim) hands, feet

27 January 2015, brutzman
- commenced work on experimental X3D v3.4 files, created as a direct copy of all v3.3 constructs.
  these will be maintained consistently with corresponding versions 3.3, 3.2, 3.1 and 3.0.

18 January 2015, walmsley, brutzman
- FogCoordinate depth field as type MFFloat
- Metadata*, HAnim* nodes: cannot require @name field or else USE nodes fail to validate

13 December 2014, brutzman
- consistent definition of class attribute throughout:  class NMTOKENS #IMPLIED

1 December 2014, norbraten daly brutzman
- entitySubCategory recapitalized as entitySubcategory to match capitalization of subcategory

27 May 2014, brutzman
- Metadata containerField choices are (metadata|value) with default remaining "metadata"
    to match X3D specification

12 April 2014, brutzman
- (v3.0) changed Appearance child nodes content model to match design pattern used in versions 3.1-3.3
  Reference: Mantis issue 675, https://www.web3d.org/realtime-3d/member-only/mantis/view.php?id=675

3 February 2014, brutzman puk
- removed ComposedVolumeStyle "ordered" field to match X3D v3.3 Web3D/ISO review

31 January 2014, brutzman
- BoundaryEnhancementVolumeStyle default attribute values corrected:
    boundaryOpacity 0.9, opacityFactor 2, retainedOpacity 0.2

1 January 2014, brutzman
- NavigationInfo transitionType default value is "LINEAR"

19 August 2013, brutzman, williams
- HAnimSite name fields can also include name="somelocation_view" and so SiteNames validation is turned off by default

15 July 2013, brutzman, williams
- HAnimJoint can only contain HAnimJoint or HAnimSegment as direct children, not HAnimSite

25 April 2013, brutzman
- HAnimJoint allowed content model further restricted to match X3D specification
    (only displacers HAnimDisplacer, children HAnimJoint HAnimSegment HAnimSite)

25 April 2013, Hyokwang Lee, brutzman 
- (v3.1+) CADPart is an allowed child node as part of CadGroupingNodes

24 April 2013, brutzman williams
- Corrected overzealous validation in HAnim nodes:  name and version fields cannot be required since they do not appear in USE copies

6 April 2013, brutzman williams
- HAnimHumanoid version restricted to 2.0, matching authoritative ISO specifications for H-ANIM and X3D
- HAnimDisplacer, HAnimHumanoid, HAnimJoint, HAnimSegment, HAnimSite:  name field is required
- Prior list of jointNames from http://ecetemp.uwaterloo.ca/~h-anim/spec1.1/#hierarchy
  replaced by joints list for HAnimJoint node from
    https://www.web3d.org/x3d/specifications/ISO-IEC-19774-HumanoidAnimation/HAnim/concepts.html#Hierarchy
- Added enumeration list for segmentNames for HAnimSegment node as shown in
    https://www.web3d.org/x3d/specifications/ISO-IEC-19774-HumanoidAnimation/HAnim/concepts.html#Hierarchy
- Added feature points as allowed values for HAnimDisplacer nodes as shown in
    https://www.web3d.org/x3d/specifications/ISO-IEC-19774-HumanoidAnimation/HAnim/FeaturePoints.html#FeaturePoints
- Added site names as allowed values for HAnimSite nodes (matching LOA 3 plus l_hand_tip, r_hand_tip) as shown in
    https://www.web3d.org/x3d/specifications/ISO-IEC-19774-HumanoidAnimation/HAnim/BodyDimensionsAndLOAs.html#LOA3DefaultSiteTranslations
- Additional enumeration tables extracted from H-Anim specification available at
    https://www.web3d.org/x3d/content/examples/Basic/HumanoidAnimation/tables

25 October 2012, brutzman
- (v3.1) Fix ComposedShader content model to match v3.2, v3.3 (field precedes IS, ShaderPart)

29 September 2012, brutzman
- (v3.2+) ScreenFontStyle added to FontStyleNodes
- (v3.2+) LayoutLayer is allowed within the LayerSet content model

23 September 2012, brutzman (corrections to changes previously reported 9, 16 September 2012)
- (v3.3 only) ColorChaser CoordinateChaser ScalarDamper TexCoordChaser2D removed from v3.2
- (v3.3 only) moved SquadOrientationInterpolator to FullProfile, normalizeVelocity field removed since no keyVelocity field is present

16 September 2012, brutzman
- (v3.2+) added EaseInEaseOut node to FullProfile
- (v3.2+) added PointPickSensor node
- (v3.2+) added to FullProfile: LinePickSensor, PickableGroup, PointPickSensor, PrimitivePickSensor, VolumePickSensor, LayerSet
- (v3.2+) added SplinePositionInterpolator, SplinePositionInterpolator2D, SplineScalarInterpolator nodes
- (v3.2+) moved SquadOrientationInterpolator to FullProfile, added field normalizeVelocity
- (v3.2+) ParticleSystem can also contain ConeEmitter, ExplosionEmitter
- (v3.2+) ParticleSystem has containerField "children"
- (v3.2+) LayerSet has containerField "children"
- (v3.2+) single child Viewport node is optional for Layer, LayoutGroup, LayoutLayer

12 September 2012, brutzman
- (v3.2+) ViewpointGroup content model modified to also allow ProtoInstance children, matching X3D Schema

9 September 2012, brutzman
- (v3.2+) X3DChaserNode duration default set to 1 (second) matching implementing nodes, spec comment submitted
- (v3.2+) X3DDamperNode and implementing nodes: tau default set to 0.3, order default set to 3, matching X3D specification
- (v3.2+) added missing definitions for ColorChaser, CoordinateChaser, ScalerDamper, TexCoordChaser2D nodes

8 September 2012, brutzman
- (v3.2+) Added missing ClipPlane and TransformSensor node definitions, included as part of Full Profile
- (v3.1+) Node name correction: TextureMatrixTransform renamed to TextureTransformMatrix3D to match specification

5 September 2012, brutzman
- (v3.2+) Add enumerations for stricter validation of TextureProperties fields, matching X3D Schema
- Add enumerations for more consistent validation of DIS networkMode fields, matching X3D Schema

4 September 2012, brutzman
- (v3.2+) Allow further uses of ProtoInstance as ParticleSystems child nodes for colorRamp, texCoordRamp, emitter, physics

30 August 2012, brutzman
- (v3.3) ShadedVolumeStyle phaseFunction values restricted to (NONE|Henyey-Greenstein), matching X3D Schema

25 August 2012, brutzman
- meta tag name attribute is optional to match HTML, since http-equiv attribute might be used instead

23 August 2012, brutzman, puk
- DIS nodes EspduTransform, SignalPdu, ReceiverPdu, TransmitterPdu are geospatial,
    fields added for geoSystem, geoCoords (support X3D v3.3 specification change)

17 August 2012, brutzman
- (v3.1+) CADAssembly content model now matches restricted CAD product structure as defined for X3D Schema.
- (v3.1+) Note that parent CADLayer does not have similar restrictions and can contain any X3DGroupingNode.

11 August 2012, Hyokwang Lee, brutzman
- (v3.1+) CADAssembly is not allowed to include CADFace as an immediate child since that does not match
    CAD product structure as defined in X3D specification clause 32.4.1

24 June 2012, marchetti, brutzman
- (v3.1+) CADAssembly can only contain multiple GroupingNodes, CADAssembly (subassembly), CADPart, CADFace or ProtoInstance nodes
- (v3.1+) CADFace can only contain single Shape|LOD|Transform|ProtoInstance
- (v3.1+) CADPart can only contain multiple CADFace or ProtoInstance nodes
- (v3.2+) ViewpointGroup is not one of GroupingNodes, rather one of ChildrenNodes

20 December 2011, polys, brutzman
- (v3.3) added VolumeRendering to list of componentNames
- (v3.3) ComposedVolumeStyle can contain multiple children
- (v3.3) added ProjectionVolumeStyle to X3DComposableVolumeRenderStyleNode list
- (v3.3) IsoSurfaceVolumeData, SegmentedVolumeData, VolumeData default containerField='children'

19 November 2011, brutzman
- (v3.2, v3.3) changed Pi value upper limits from 3.1416 to 3.141592653 for improved arithmetic correctness,
    must not exceed legal value or tools may throw errors for default values
- restricted unitCategories types to not include derived types (velocity etc.)

30 September 2011, brutzman
- Scene is allowed to contain multiple Metadata nodes at top level
- Add missing MetadataBoolean in Immersive definition of Metadata nodes

5 September 2011, brutzman
- changed Pi/2 value upper limits from 1.5708 to 1.570796 for improved arithmetic correctness,
    must not exceed legal value or tools may throw errors for default values

8 August 2011 SIGGRAPH, brutzman, v3.3 definitions
- Added Volume Rendering Component nodes

20 July 2011, brutzman, v3.3 definitions
- GeoOrigin is deprecated and discouraged (but nevertheless allowed)
- centerOfRotation specified by Viewpoint, OrthoViewpoint and GeoViewpoint nodes
    has type SFVec3f, SFVec3f and SFVec3d respectively
- GeoViewpoint changes: added centerOfRotation and retainUserOffsets,
    removed navType and headlight

19 July 2011, brutzman, v3.3 definitions
- added unit statement (similar to component statement) and MetadataBoolean

18 July 2011, brutzman, v3.3 definitions
- added references and initial version-control checkins for X3D v3.3 DTD

6 September 2010, brutzman
- ArcClose2D, Disk2D, Rectangle2D, TriangleSet2D nodes have default value
    solid="false" for two-sided visibility
- HAnimDisplacer, HAnimHumanoid, HAnimJoint, HAnimSegment, HAnimSite
    no longer require 'name' attribute since that cannot be present for USE nodes

6 August 2010, brutzman
- Text node has default value solid="false" for two-sided visibility
- GeoOrigin allowed as contained content in  field, fieldValue, GeoLocation,
    GeoLOD validation, reverting previous change to permit proper validation.
    Preventing deprecated GeoOrigin from appearing at top level is less important
    (and probably a questionable design in the first place).

17 March 2010, hudson brutzman
- GeoOrigin is X3DNode vice X3DChildNode, cannot appear as child of root Scene

2 January 2010, brutzman
- Update type of all 'class' attributes as NMTOKENS (name-token array type)

27 December 2009, brutzman
- v3.1, v3.2: ProgramShader does not contain field* definitions
- v3.1, v3.2: Corrected order of contained-elements content model for various shader nodes
    [ComposedShader, PackagedShader, ShaderProgram] to be consistent with Script definition:
    field*, IS?, MetadataNodes?, then CDATA source

26 December 2009, stewart, brutzman
- GeoMetadata allowed to contain other geospatial nodes (except for another GeoMetadata)
- GeoMetadata fix:  omit 'data' field array of USE values (type IDREF)

17 December 2009, brutzman
- Change RigidBody finiteRotationAxis field default from 0 0 0 (not a valid vector) to 0 1 0 (v3.2 only)
- Rename DoubleAxisHingeJoint stopBounce1           as stop1Bounce           for consistency (v3.2 only)
- Rename DoubleAxisHingeJoint stopConstantForceMix1 as stop1ConstantForceMix for consistency (v3.2 only)
- Rename DoubleAxisHingeJoint stopErrorCorrection1  as stop1ErrorCorrection  for consistency (v3.2 only)
- Add SliderJoint field:  SFFloat [in,out] sliderForce 0 (-inf,inf)

7 December 2009, brutzman
- Change ContourPolyline2D field point %MFVec2f; to controlPoint %MFVec2d;

6 December 2009, brutzman
- HAnim node name field default remains empty string but value is now required
- swap default values for SpotLight beamWidth, cutOffAngle
- relaxed resolution of PI/4 values from 0.785398 to 0.7854
- relaxed resolution of PI/2 values from 1.570796 to 1.5708

24 February 2009, brutzman
- component definition corrected to allow values 1-5

16 February 2009, brutzman
- added TextureProperties
 -renamed Pixel3DTexture to PixelTexture3D, Composed3DTexture to ComposedTexture3D

9 January 2009, brutzman
- added DISEntityManager, DISEntityTypeMapping

26-30 December 2008, brutzman
- added RigidBodyPhysics component nodes to GroupingNodes and ProtoNodes content models
- content model optional for X3DRigidJointNode, CollidableOffset, CollisionSensor, RigidBody, RigidBodyCollection

20 August 2008, g. couch, brutzman
- added transparency to X3DBackgroundNode (Background, TextureBackground) (v3.2)

4 August 2008, yoo, brutzman
- rename TexCoordDamper to TexCoordDamper2D (v3.2)
- added follower nodes (Chaser and Damper nodes) to ProtoNodes
	(Full profile) to permit validation (v3.2)
- added ProtoDeclare|ExternProtoDeclare to ChildrenNodes

21 July 2008, brutzman
- rename Image3DTexture to ImageTexture3D

18 July 2008, brutzman
- remove following illegal watchList child nodes from LoadSensor validation:
	Anchor GeoMetadata Script ProtoInstance

12 July 2008, brutzman
- ViewpointGroup:  added ViewpointGroup as allowed child, changed fieldOfView to size,
	fixed default value for center

9 July 2008, brutzman
- added retainUserOffsets to Viewpoint
- added OrthoViewpoint and ViewpointGroup

3 July 2008, brutzman bailey
- added X3D attributes for XML digital signature, encryption

9 June 2008, brutzman
- added Contour2D, ContourPolyline2D to ENTITY % ProtoNodes for allowable field, fieldValue contents

31 May 2008, brutzman
- vertexCount field for LineSet node, name field for all HAnim nodes:  #IMPLIED not #REQUIRED
	so that USE nodes can validate

4 May 2008, brutzman
- changed various CDATA defaults for 'class' attribute from "" to #IMPLIED for consistency, eliminating bogus validation errors
- improved changelog header

17 April 2008, Changhua Wu, brutzman
- added missing componentNames (v3.2 only)
  Followers Layering Layout RigidBodyPhysics ParticleSystems

5 March 2008, mccann
- corrected ATTLIST GeoProximitySensor

16 February 2008, brutzman
- can remove xml:space "preserve" attribute for Script and field elements,
  since only expected whitespace-sensitive content is contained within a
  protected CDATA text block

11 February 2008, mccann, brutzman
- added GeoTransform node

7 February 2008, mccann, puk, brutzman
- added GeoProximitySensor node

25 November 2007, puk, brutzman
- added SquadOrientationInterpolator

22 November 2007, puk
- forceOutput changed back to mustOutput

21 November 2007, hudson, brutzman
- removed SurfaceEmitter 'coordIndex' and 'set_coordIndex' fields
- removed VolumeEmitter 'internal' field
- adjusted WindPhysicsModel default speed to 0.1
- MotorJoint axis1Angle ... axis3Torque changed to %SFFloat; "0"
- added CollisionSpace enabled field

5 November 2007, brutzman
- added FollowersComponent and ParticleSystemsComponent

4 November 2007, brutzman
- added LayoutComponent, RigidBodyPhysicsComponent, PickingSensorComponent

28 October 2007, brutzman
- added LayeringComponent

7-8 October 2007, brutzman, mcdaniel
- removed ProtoInstance from MetadataNodes since it leads to nondeterministic-content errors,
	but allowed %WildcardNodes; (ProtoInstance) within each of the Metadata nodes (Mantis bug 350)
- removed extraneous %WildcardNodes; from end of Shape content-model definition
- removed Contour2D, ContourPolyline2D from NurbsGeometryNodes since these are only
	used internally to trim Nurbs nodes and are not used as part of the GeometryContentModel
- included Contour2D in NurbsControlCurveNodes
- v3.1, v3.2: eliminated duplicate entries for QuadSet, IndexedQuadSet in GeometryNodes content model
	which fixed Shape node nondeterminism
- removed NurbsGroupingNodes since this was a flawed construct (Mantis bug 349)
- improved duplication within ProtoNodes definition but still suspect...
- <!-- 	No longer added: inputOnly/outputOnly attributes, since they are not allowed
  as part of valid .x3d files.
<![%X3dInputOutputFields;[
	<!ENTITY % FieldsDTD SYSTEM "x3d-3.2-InputOutputFields.dtd">
	%FieldsDTD;
]]>
-->

# 4 October 2007, brutzman
# - began work on version 3.2.  unless otherwise noted, all changes are to all versions.
# - commented out ENTITY reference to x3d-3.2-InputOutputFields.dtd which holds the
#		inputOnly/outputOnly attributes, since they are not allowed as part of valid .x3d files.
#
# 10 January 2006 grieve, brutzman
# - changed content model for Contour2D (found in NurbsControlCurveNodes) from
#   [NurbsCurve|ContourPolyline2D] to [NurbsCurve2D|ContourPolyline2D]
#
# 3 January 2006 hudson, brutzman
# - changed IMPORT InlineDEF to inlineDEF
#
# 31 December 2005 brutzman
# - fixed MultiTexture content model
#
# 29-30 December 2005 brutzman
# - fixed various DTD/schema mismatches discovered by checking accessType definitions
# - FloatVertexAttribute, Matrix3VertexAttribute, Matrix4VertexAttribute:
#   X3DVertexAttributeNode given containerField attrib, added to ComposedGeometryNodes
# - changed HAnimDisplacer containerField to "displacers"
# - HAnimDisplacer weight default value set to 0.0
# - GeoElevationGrid removed set_yScale
# - added shader nodes as Appearance children, and so had to finally relax the exhaustively enumerated
#   & strictly ordered Appearance content model as follows:
<!-- Complete, unordered, concisely enumerated version of Appearance by Heiko Grussbach.  Prepended either-order FillProperties/LineProperties. -->
<!ELEMENT Appearance (IS?, (%MetadataNodes;)?,
(  (FillProperties, LineProperties?)|(LineProperties, FillProperties)? )?,
(  ((%MaterialNodes;), (
			((%AllTextureNodes;),((%AllTextureTransformNodes;)|%WildcardNodes;)?) |
			((%AllTextureTransformNodes;),((%AllTextureNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%AllTextureNodes;)|(%AllTextureTransformNodes;)|%WildcardNodes;)?) )? )
|((%AllTextureNodes;), (
			((%MaterialNodes;),((%AllTextureTransformNodes;)|%WildcardNodes;)?) |
			((%AllTextureTransformNodes;),((%MaterialNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%MaterialNodes;)|(%AllTextureTransformNodes;)|%WildcardNodes;)?) )? )
|((%AllTextureTransformNodes;), (
			((%MaterialNodes;),((%AllTextureNodes;)|%WildcardNodes;)?) |
			((%AllTextureNodes;),((%MaterialNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%MaterialNodes;)|(%AllTextureNodes;)|%WildcardNodes;)?) )? )
|(%WildcardNodes;, (
			((%MaterialNodes;),((%AllTextureNodes;)|(%AllTextureTransformNodes;)|%WildcardNodes;)?) |
			((%AllTextureNodes;),((%MaterialNodes;)|(%AllTextureTransformNodes;)|%WildcardNodes;)?) |
			((%AllTextureTransformNodes;),((%MaterialNodes;)|(%AllTextureNodes;)|%WildcardNodes;)?) |
			(%WildcardNodes;,((%MaterialNodes;)|(%AllTextureNodes;)|(%AllTextureTransformNodes;)|%WildcardNodes;)?) )? )
)? ) >
# - Removed unnecessary AllVRML97Nodes, AllGeoSpatialTags, AllHAnimTags definitions:
<!ENTITY % AllVRML97Nodes " Anchor|Appearance|AudioClip|Background|BooleanFilter|BooleanSequencer|BooleanToggle|BooleanTrigger|Billboard|Box|Collision|Color|ColorInterpolator|Cone|Coordinate|CoordinateDouble|CoordinateInterpolator|Cylinder|CylinderSensor|DirectionalLight|ElevationGrid|Extrusion|FillProperties|Fog|FontStyle|Group|head|ImageTexture|IndexedFaceSet|IndexedLineSet|Inline|IntegerSequencer|IntegerTrigger|KeySensor|LineProperties|LineSet|LOD|Material|MovieTexture|MultiTextureCoordinate|NavigationInfo|Normal|NormalInterpolator|OrientationInterpolator|PixelTexture|PlaneSensor|PointLight|PointSet|PositionInterpolator|ProximitySensor|ScalarInterpolator|Scene|Script|Shape|Sound|Sphere|SphereSensor|SpotLight|StringSensor|StaticGroup|Switch|Text|TextureBackground|TextureCoordinate|TextureCoordinateGenerator|TextureTransform|TimeSensor|TimeTrigger|TouchSensor|Transform|TriangleFanSet|TriangleSet|TriangleStripSet|Viewpoint|VisibilitySensor|PositionInterpolator2D|CoordinateInterpolator2D|WorldInfo ">
<!ENTITY % AllGeoSpatialTags " GeoCoordinate|GeoElevationGrid|GeoLocation|GeoLOD|GeoMetadata|GeoOrigin|GeoPositionInterpolator|GeoTouchSensor|GeoViewpoint ">
<!ENTITY % AllHAnimTags " HAnimDisplacer|HAnimHumanoid|HAnimJoint|HAnimSegment|HAnimSite ">
#
# 27 December 2005 brutzman
# - (v3.1 only) added Texturing3D component:  X3DTexture3DNode, Composed3DTexture,
#    Image3DTexture, Pixel3DTexture, TextureCoordinate3D, TextureCoordinate4D,
#    TextureMatrixTransform, TextureTransform3D
# - renamed TextureNodes to Texture2DNodes
# - EspduTransform removed geoCoords_changed
#
# 26 December 2005 brutzman
# - (v3.1 only) removed CADFace, CADPart from CadGroupingNodes since CAD content model is more restrictive
#   (hierarchy CADLayer/CADAssembly/CADPart/CADFace)
# - (v3.1 only) componentNames:  added CubeMapTexturing, Texturing3D, Shaders
# - (v3.1 only) added Shaders component:  X3DProgrammableShaderObject,
#   X3DShaderNode, X3DVertexAttributeNode, ComposedShader,
#   FloatVertexAttribute, Matrix3VertexAttribute, Matrix4VertexAttribute,
#   PackagedShader, ProgramShader, ShaderPart, ShaderProgram
# - (v3.1 only) Added CubeMapTexturing component:  X3DEnvironmentTextureNode,
#   ComposedCubeMapTexture, GeneratedCubeMapTexture, ImageCubeMapTexture
#
# 22 December 2005 hudson, brutzman
# - NurbsGeometryNodes modified to include Contour2D vice ContourPolyline2D
# - GeoTouchSensor:  added inputOutput field description
# - (v3.1 only) LOD:  added initializeOnly field forceTransitions
# - (v3.1 only) added X3dFieldTypes  SFMatrix3d MFMatrix3d SFMatrix3f MFMatrix3f SFMatrix4d MFMatrix4d SFMatrix4f MFMatrix4f SFVec4d MFVec4d SFVec4f MFVec4f
#
# 21 December 2005 puk, brutzman
# - removed solid field from Circle2D since it is line-based, not polygonal
# - added enabled field to EspduTranform, ReceiverPdu, SignalPdu, TransmitterPdu
# - (v3.1 only) DirectionalLight default value for global remains true,
#   PointLight and Spotlight default value for global changed to false
#
# 19 December 2005 brutzman
# - FogCoordinate default containerField value set to fogCoord
# - FogCoordinate removed from CoordinateNodes, added to GeometricPropertyNodes,
#   ColorCoordinateNormalTextureCoordinateContentModel  and ElevationGrid content model.
#   FogCoordinate only allowed to follow Coordinate/Color/Normal/TextureCoordinate
#   since any-order content model is too complex otherwise.
# - (v3.1 only) Text node:  added outputOnly fields lineBounds and textBounds
# - (v3.1 only) DirectionalLight, PointLight, Spotlight:  added inputOutput field global
# - (v3.1 only) LOD node:  added outputOnly field level_changed
# - (v3.1 only) NavigationInfo node:  added inputOutput field transitionTime, outputOnly field transitionComplete
#
# 18 December 2005 victor, brutzman
# - IndexedTriangleStripSet stripCount field removed
# - Polypoint2D points field renamed to point
# - TransmitterPdu cryptoKeyId field renamed to cryptoKeyID
# - EspduTransform articulationParameterIdPartAttachedArray field renamed to
#   articulationParameterIdPartAttachedToArray
# - added NavigationInfo transitionType MFString, default "ANIMATE"
# - NurbsTextureCoordinate controlPoint type changed to MFVec2f
# - added solid field to Text, ArcClose2D, Circle2D, Disk2D, Rectangle2D, TriangleSet2D
#
# 16 December 2005 ecer, brutzman
# - BooleanSequencer keyValue type changed to MFBool
# - KeySensor keyPress, keyRelease type changed to SFString
# - GeoElevationGrid set_height type changed to MFDouble
# - GeoLOD range type changed to SFFloat
# - NurbsGroupingNodes	child content model changed to
#   NurbsOrientationInterpolator | NurbsPositionInterpolator | NurbsSurfaceInterpolator | NurbsSet
#
# 4 December 2005  hudson, brutzman
# - make X3D version required rather than optional
# - added EspduTransform fields collisionType, detonationLocation, detonationRelativeLocation, detonationResult,
#		eventApplicationID, eventEntityID, eventNumber, eventSiteID
#
# 20 November 2005 victor, brutzman
# - EspduTransform firingRange type changed from SFInt32 to SFFloat
# - IntegerSequencer keyValue type changed from MFFloat to MFInt32
# - NurbsCurve2D knot, weight type changed from MFFloat to MFDouble
# - NurbsTrimmedSurface weight type changed from MFFloat to MFDouble
# - NurbsCurve2D controlPoint type changed from MFVec2f to MFVec2d
# - NurbsTextureCoordinate added field controlPoint MFVec2d
# - NurbsTextureCoordinate weight type changed from MFDouble to MFFloat
#
# 14 November 2005 brutzman
# - changed CAD component name to CADGeometry, matching 3.1 specification
# - added enumeration value for CADInterchange Profile, matching 3.1 specification
#
# 6 November 2005 brutzman
# - added (%MetadataNodes;)? as allowed first child under Scene
# - zero field definitions allowed for ProtoInterface
# - fixed textual differences between x3d-3.0.dtd, x3d-3.1.dtd using Altova DiffDog
#
# 21 October 2005 brutzman
# - added CAD profile:  X3DProductStructureChildNode, CADAssembly, CADFace, CADLayer, CADPart,
 #  IndexedQuadSet, QuadSet
# - Node signature for 32.4.2 CADFace missing bbox fields and X3DBoundedObject interface, bug posted
#
# brutzman 2 October 2005
#	Began work on schema corrections to better validate under XMLSpy and other tools
#	Replaced GeoSpatial default-value "quote marks" with &quot; character entities, e.g.
#	  geoSystem	%MFString; '"GD" "WE"'
#	  geoSystem	%MFString; '&quot;GD&quot; &quot;WE&quot;'
#
#	  navType		%MFString;	'"EXAMINE" "ANY"'
#	  navType		%MFString;	'&quot;EXAMINE&quot; &quot;ANY&quot;'
#
# brutzman 16 September 2004
#	Removed comments around extension DTD invocation, and verified correct
#	x3d-3.0-Web3dExtensionsPublic.dtd and
#	x3d-3.0-Web3dExtensionsPrivate.dtd
# dabrowski, brutzman 16 July 2004
#	Renamed Lineset field 'lineCount' to 'vertexCount'
#	Added 'set_index' inputOnly field to x3d-3.0-InputOutputFields.dtd for
#	  nodes IndexedTriangleFanSet IndexedTriangleSet IndexedTriangleStripSet
# brutzman 7 July 2004
#	Corrected content model for GeoMetadata to include MFNode 'data' field,
#	  which can only refer to other GeoSpatial nodes.  Specifically changed
#	<!ELEMENT GeoMetadata ( (IS?), (%MetadataNodes;)? ) >
#	  to
#	<!ELEMENT GeoMetadata ( (IS?), (%MetadataNodes;)?, (GeoCoordinate|GeoElevationGrid|GeoLocation|GeoLOD|ProtoInstance|GeoOrigin|GeoPositionInterpolator|GeoTouchSensor|GeoViewpoint)* ) >
# brutzman 6 June 2004
#	allow ProtoInstance in content model for MultiTexture, MultiTextureCoordinate
# brutzman 31 May 2004
#	allow Sound to have zero children (as in USE nodes)
# brutzman 29 May 2004
#	added SFVec2d, MFVec2d to allowed types
# brutzman 17 May 2004
#	added ProtoInstance to Immersive content model for allowed Metadata nodes
#	added Metadata nodes to content model for allowed ProtoNodes
# brutzman 6 March 2004
#	Changed default directory path to /www.web3d.org/specifications throughout
# brutzman 29 February 2004
#	Removed 'TaskGroups/' from default paths (mostly just documentation urls)
#
# ===================================================================================
#
# version 3.0.11, Final Committee Draft (FCD)
#
# brutzman 26 December 2003
#	HAnimDisplacer added as legal child of HAnimJoint
#	Added SFFloat weight field to HAnimDisplacer
#	Changed LoadSensor field timeout to timeOut
# brutzman 12 December 2003
#	Renamed appInfo fields to appinfo, matching XML Schema spelling.
#	  Affects ExternProtoDeclare, ProtoDeclare and field elements.
# brutzman 8 December 2003
#	Removed creaseAngle from *Triangle* nodes, uses defined normal behavior instead
# brutzman 18 November 2003
#	Added IndexedTriangleFanSet, IndexedTriangleSet, IndexedTriangleStripSet
# brutzman 16 November 2003
#	Added constraints on componentNames, componentLevels to match X3D specification.
#	  Future extensibility of future component names and levels remains feasible but
#	  (appropriately) will require an accompanying override/update of DTD and Schema
#	  in the extended content to match anything new.
# brutzman 15 November 2003
#	Added LineSet
# brutzman 13 October 2003
#	Changed
#	   fillStyle   (NONE|HATCHED) "NONE"
#	to
#	   filled   %SFBool;   "true"
#	   hatched  %SFBool;   "true"
# brutzman 12 October 2003
#	Moved LatticeXVL and created Web3dExtensionComponent for future Web3D extensions.
#	Cleaned out various DTD comments, as follows:
#	  <!-- MultiTexture fields are MFString values, where each entry applies to each texture.
#	       Thus the following allowed enumeration values cannot be accomplished via XML.
#	  <!ENTITY % MultiTextureModes   			"(MODULATE|REPLACE|MODULATE2X|MODULATE4X|ADD|ADDSIGNED|ADDSIGNED2X|SUBTRACT|ADDSMOOTH|BLENDDIFFUSEALPHA|BLENDTEXTUREALPHA|BLENDFACTORALPHA|BLENDCURRENTALPHA|MODULATEALPHA_ADDCOLOR|MODULATEINVALPHA_ADDCOLOR|MODULATEINVCOLOR_ADDALPHA|OFF|SELECTARG1|SELECTARG2|DOTPRODUCT3)" >
#	  <!ENTITY % MultiTextureSourceValues		"(PREVIOUS|DIFFUSE|SPECULAR|FACTOR)" >
#	  <!ENTITY % MultiTextureFunctionValues		"(NONE|COMPLEMENT|ALPHAREPLICATE)" >
#	  -->
#	  Rejected:  consider building multiple DTDs corresponding to each profile,
#		by creating small encapsulating DTDs that each set proper profile flags
#		prior to loading the main DTD.  Hazard:  avoid duplication/versionitis.
#	  <!-- These VRML 97 specification terms relate to an object hierarchy of nodes.
#	       For details, see VRML 97 4.6.5 Grouping and children nodes
#	       http://www.web3D.org/technicalinfo/specifications/vrml97/part1/concepts.html#4.6.5 -->
#	  <!-- External DTDs now integrated.  -->
#	  <!ENTITY % SFNode "#PCDATA">	<!-- Node  - handled by tag rules -->
#	  <!ENTITY % MFNode "#PCDATA">	<!-- Nodes - handled by tag rules -->
# brutzman 8 October 2003
#	HAnimHumanoid version:  changed to SFString from enumeration (1.1|2.0)
#	Removed from HAnimHumanoid:
#	  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
#	Removed from GeoMetadata:
#	  <!-- GeoMetadata includes proposed itemization of specified 'summary' attributes in the X3D encoding -->
#	  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
#	Changed geoSystem from CDATA to %MFString;
#	Renamed GeoTouchSensor hitGeoCoordinate_changed to hitGeoCoord_changed
#	Moved GeoTouchSensor [in] and [out] events to x3d-3.0-InputOutputFields.dtd:
#	  isActive, isOver, touchTime
#	Removed GeoElevationGrid set_yScale since yScale is now [in out]
#	Didn't add NurbsCurve solid, default value true
#	NurbsPatchSurface: removed ccw, weight, closedSurface
#	Added NurbsSurfaceInterpolator.  Note SFVec2f type for set_fraction value.
#	Added NurbsTextureCoordinate.
#	Verified NURBS nodes
# brutzman davis 1 October 2003
#	DIS EspduTransform/ReceiverPdu/SignalPdu/TransmitterPdu nodes - consistency changes:
#	  attribute typos:  receiverPower -> receivedPower, cryptoSytem -> cryptoSystem
#	  transmitFrequencyBandwidth is SFFloat
#	EspduTransform munitionSiteID, munitionApplicationID, munitionEntityID and
#	  fireMissionIndex changed to [in out]
# brutzman 28 September 2003
#	DIS EspduTransform/ReceiverPdu/SignalPdu/TransmitterPdu nodes - consistency changes:
#  	  rtpHeaderHeard renamed to isRtpHeaderHeard
#	  no outputOnly event values allowed: #FIXED "" vice #IMPLIED
#	DIS EspduTransform node consistency changes:
#	address default set to "localhost"
#	port, multicastRelayPort default set to "0"
#	siteID, applicationID, entityID, forceID defaults set to "0", "1", "0", "0"
#	  respectively
#	entityKind, entityDomain, entityCountry, entityCategory, entitySubCategory,
#	  entitySpecific and entityExtra defaults set to "0"
#	linearVelocity, linearAcceleration, munitionStartPoint, munitionEndPoint
#	  defaults set to "0 0 0"
#	munitionSiteID, munitionApplicationID, munitionEntityID, fireMissionIndex
#	  changed to outputOnly events
#	whichGeometry default set to "1"
#	corrected various PDU-specific defaults, mostly #IMPLIED to "0"
# brutzman 22 September 2003
#	X3DTimeDependentNode consistency changes:
#	Added	SFTime [out]     elapsedTime 	to AudioClip, MovieTexture, and TimeSensor
#		SFBool [out]     isPaused     	to AudioClip, MovieTexture
#		SFTime [in,out]  pauseTime   0	to AudioClip, MovieTexture
#		SFTime [in,out]  resumeTime  0	to AudioClip, MovieTexture
# brutzman 14 September 2003
#	Changed Background, TextureBackground groundColor default from "0 0 0" to IMPLIED
#	  (although this is questionable and has led to different browser defaults in the past)
#	Changed CylinderSensor diskAngle default PI/2 from 0.262 to 0.26179167 to match Schema
#	Removed excess attributes from 'component' declaration, made 'level' SFInt32 and required.
#	  originator CDATA #IMPLIED
#	  url CDATA #IMPLIED
#	  version CDATA #IMPLIED
#	Removed unneeded comments prior content model for Collision proxy:
#	  <!-- <!ELEMENT proxy ( %GroupingNodes; | Shape | %WildcardNodes; )? > -->
#	  <!-- <!ELEMENT Collision ( ( %ChildrenNodes; | %WildcardNodes; )*, (proxy, ( %ChildrenNodes; | %WildcardNodes; )* )? )  > -->
#	KeySensor outputOnly fields keyPress, keyRelease changed from SFInt32 to SFString in x3d-3.0-InputOutputFields.dtd
#	LineProperties:  added 'applied', restored irregular capitalization/spelling of linetype, linewidthScaleFactor
#	MultiTexture:  removed obsolete fields
#	  materialColor  %SFBool;   "false"
#	  materialAlpha  %SFBool;   "false"
#	  transparent    %SFBool;   "false"
#	  noMipMap       %SFBool;   "false"
#	NavigationInfo type:  changed default from ["WALK" "ANY"] to ["EXAMINE" "ANY"]
# brutzman 11 August 2003
#	Added outputOnly field geoCoords_changed %SFVec3d; #IMPLIED
#	  to x3d-3.0-InputOutputFields.dtd to support interoperability
#	  with GeoSpatial Profile nodes.  Tooltip: "Double precision output for
#	  64-bit Espdu translation, usable by georeferenced nodes."
# brutzman 10 August 2003
#	ISO editors' meeting:  type MFString enumeration values must all be quoted
#	  changed FontStyle justify field to default value (quoted) "BEGIN"
#	  changed FontStyle family  field to default value (quoted) "SERIF"
# grahn victor williams brutzman 1 August 2003
#	changed MultiTexture field values for mode, source and function to MFString.
#	  each internal array value corresponds to one texture in the MultiTexture.
#	  Thus no validation of these fields as fixed enumeration values is possible.
# brutzman 21 July 2003
#	DIS EspduTransform deadReckoning signature changed to inputOutput SFInt32 "0"
#	  and networkMode default value changed to "standAlone".
# brutzman 3 July 2003
#	Fixed content model of NURBS nodes Contour2D, NurbsCurve.
#	  Renamed NurbsGroup as NurbsSet.
#	  !! Need to unscramble NurbsTextureSurface and NurbsTrimmedSurface.
# brutzman 26 June 2003
#	Added NurbsOrientationInterpolator.  Corrected NurbsPositionInterpolator interface.
#	  Added CoordinateDouble.  Removed CoordinateDeformer.
# <!--
# <!ELEMENT CoordinateDeformer (IS?, (%MetadataNodes;)?, ( %ChildrenNodes; | %WildcardNodes; | Coordinate )* ) >
# <!ATTLIST CoordinateDeformer
# 	uDimension	%SFInt32;	"0"
# 	vDimension	%SFInt32;	"0"
# 	wDimension	%SFInt32;	"0"
# 	uKnot		%MFDouble;	#IMPLIED
# 	vKnot		%MFDouble;	#IMPLIED
# 	wKnot		%MFDouble;	#IMPLIED
# 	uOrder		%SFInt32;	"2"
# 	vOrder		%SFInt32;	"2"
# 	wOrder		%SFInt32;	"2"
# 	controlPoint	%MFVec3f;	#IMPLIED
# 	weight		%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 tooltip="CoordinateDeformer allows free-form deformation on Coordinate nodes by using a NURBS volume&#10;input:  a Coordinate Node list where each point defines a 3D parameter (u,v,w) for evaluation&#10;output:  corresponding Cartesian value computed from NURBS control grid&#10;children typically contains IndexedFaceSet nodes USE-ing a deformed Coordinate node in outputCoords." name="CoordinateDeformer">
# 	<attribute tooltip="[DEF ID #IMPLIED]&#10;DEF defines a unique ID name for this node, referencable by other nodes.&#10;Hint:  descriptive DEF names improve clarity and help document a model." name="DEF"/>
# 	<attribute tooltip="[USE IDREF #IMPLIED]&#10;USE means reuse an already DEF-ed node ID, ignoring _all_ other attributes and children.&#10;Hint:  USEing other geometry (instead of duplicating nodes) can improve performance.&#10;Warning:  do NOT include DEF (or any other attribute values) when using a USE attribute!" name="USE"/>
# 	<attribute tooltip="[uDimension &SFInt32Label; &#34;0&#34;]&#10;Number of control points in u dimension." name="uDimension"/>
# 	<attribute tooltip="[vDimension &SFInt32Label; &#34;0&#34;]&#10;Number of control points in v dimension." name="vDimension"/>
# 	<attribute tooltip="[wDimension &SFInt32Label; &#34;0&#34;]&#10;Number of control points in w dimension." name="wDimension"/>
# 	<attribute tooltip="[uKnot &MFDoubleLabel; #IMPLIED]&#10;knot vector, where size = number of control points + order of curve." editor="TextArea" name="uKnot"/>
# 	<attribute tooltip="[vKnot &MFDoubleLabel; #IMPLIED]&#10;knot vector, where size = number of control points + order of curve." editor="TextArea" name="vKnot"/>
# 	<attribute tooltip="[wKnot &MFDoubleLabel; #IMPLIED]&#10;knot vector, where size = number of control points + order of curve." name="wKnot"/>
# 	<attribute tooltip="[uOrder &SFInt32Label; &#34;2&#34;]&#10;define order of surface by polynomials of degree = order-1." name="uOrder"/>
# 	<attribute tooltip="[vOrder &SFInt32Label; &#34;2&#34;]&#10;define order of surface by polynomials of degree = order-1." name="vOrder"/>
# 	<attribute tooltip="[wOrder &SFInt32Label; &#34;2&#34;]&#10;define order of surface by polynomials of degree = order-1." name="wOrder"/>
# 	<attribute tooltip="[controlPoint &MFVec3fLabel; #IMPLIED]&#10;Mesh of points defining NURBS in 3 dimensions." name="controlPoint"/>
# 	<attribute tooltip="[weight &MFFloatLabel; #IMPLIED]&#10;vector assigning weight to each control point." editor="TextArea" name="weight"/>
# 	<attribute tooltip="[bboxCenter: initializeOnly &SFVec3fLabel; &#34;0 0 0&#34;]&#10;Bounding box center:  position offset from origin of local coordinate system." name="bboxCenter"/>
# 	<attribute tooltip="[bboxSize: initializeOnly &SFVec3fLabel; &#34;-1 -1 -1&#34;]&#10;Bounding box size:  automatically calculated, can be specified as an optimization or constraint." name="bboxSize"/>
# 	<attribute tooltip="[containerField: NMTOKEN &#34;children&#34;]&#10;containerField is the field-label prefix indicating relationship to parent node.&#10;  Examples:  geometry Box, children Group, proxy Shape.&#10;containerField attribute is only supported in XML encoding of X3D scenes." name="containerField"/>
# 	<attribute tooltip="[class CDATA #IMPLIED]&#10;class is a space-separated list of classes,&#10;  reserved for use by XML stylesheets.&#10;class attribute is only supported in XML encoding of X3D scenes." name="class"/>
#     </element>
# -->
#	  Cleaned out old comments:
# <!--
# 		DIS-Java-VRML 1.2 Document Type Definition (DTD)
#
#  Description:	Define the DIS tag and attribute profile for X3D.
# 		These X3D native nodes correspond to VRML ExternProto declarations.
#
#  		Elements in this tagset are enabled by setting the
# 		DIS-Java-VRMLProfile entity to "INCLUDE" at the top of an
# 		X3D scene file, as shown in several examples.  This flag then
# 		triggers inclusion of the DIS-Java-VRML tags in the
# 		x3d-3.0.dtd tagset.
#
#  Status:	Supports the following Protocol Data Units (PDUs):
#  		- EspduTransform (Entity State, Collision, Detonation, Fire)
#  		- Radio communications family:  ReceiverPdu, SignalPdu, Transmitter
#
#  		Testing results need updating to match new node signatures.
#
#  Authors:	Don Brutzman and Dave Laflam
#
#  References:	http://www.web3D.org/WorkingGroups/vrtp/dis-java-vrml
#
# -->
#
# <!--
# 		GeoSpatial (GeoVrml 1.0) Document Type Definition (DTD)
#
#  Description:	Define the GeoSpatial tag and attribute profile for X3D.
# 		These X3D native nodes correspond to VRML ExternProto declarations.
#
#  		Elements in this tagset are enabled by setting the
# 		GeoSpatialProfile entity to "INCLUDE" at the top of an
# 		X3D scene file, as shown in several examples such as
# 		examples/GeoSpatial/newGeoSpatialScene.xml.  This flag then
# 		triggers inclusion of the GeoSpatial tags in the
# 		x3d-compromise.dtd tagset.  Thus the GeoSpatial.dtd
# 		demonstrates X3D extensibility for profiles.
#
#  Status:	Testing results satisfactory.  Compact form also needed.
#
#  Authors:	Martin Reddy and GeoVrml Working Group for GeoVrml specifications
# 		Don Brutzman produced XML encoding for X3D
#
#  Reference:	GeoVrml 1.0 Specification, http://www.geovrml.org/1.0
#
#  Created:	16 May 2000
# -->
# <!--
# 		Humanoid Animation (H-Anim) 2.0 Document Type Definition (DTD)
#
#  Description:	Define the H-Anim tag and attribute profile for X3D.
# 		These X3D native nodes correspond to VRML Prototype declarations.
#
#  		Elements in this tagset are enabled by setting the
# 		H-AnimProfile entity to "INCLUDE" at the top of an
# 		X3D scene file, as shown in several examples such as
# 		examples/HumanoidAnimation/NancyNativeTags.xml.  This flag then
# 		triggers inclusion of the HumanoidAnimation tags in the
# 		x3d-compact.dtd tagset.  Thus the HumanoidAnimation.dtd
# 		demonstrates X3D extensibility for profiles.
#
# 		Added bboxCenter and bboxSize to Joint and Site as part of
# 		Schema development and SAI API normalization of node types.
# 		Work in progress.  See ongoing 2000/2001 e-mail threads for
# 		details.
#
#  Status:	Testing results in progress.  Compromise form also needed.
#  		JointNames need to be verified/split.
#
#  Authors:	Don Brutzman produced XML encoding for X3D
#  		Bernie Roehl and H-Anim Working Group for H-Anim specifications
#  		Matt Beitler for syntax/semantics of upgrades from 1.1 to 2.0
#  		James Smith provided BoxMan model for testing 2.0 nodes and prototypes
#
#  References:	H-Anim 2001 Specification (Draft)
#  		http://h-anim.org/Specifications/H-Anim2001
#  		http://www.web3D.org/TaskGroups/x3d/translation/examples/HumanoidAnimation/JointNames.txt
#
#  Address:	http://www.web3D.org/TaskGroups/x3d/translation/HumanoidAnimation2.0-compact.dtd
#
#  Created:	 4 July 2000
# -->
# brutzman 21 June 2003
#	Made X3D profile attribute REQUIRED.  Changed profile name MPEG4 to MPEG4Interactive.
# brutzman 8 June 2003
#	Moved Inline from content model GroupingNodes to SceneLeafNodes
# brutzman 26 May 2003
#	Added XML schema information as X3D tag attributes:
#	xmlns:xsd			CDATA "http://www.w3.org/2001/XMLSchema-instance"
#	xsd:noNamespaceSchemaLocation	CDATA "https://www.web3d.org/specifications/x3d-3.0.xsd"
# brutzman 25 May 2003
#	Added  MetadataDouble, MetadataFloat, MetadataInteger, MetadataSet, MetadataString.
# brutzman 6 May 2003
#	Added  AudioClip, LineProperties, FillProperties as valid ProtoNodes.
# adams, couch, hudson, weekley, brutzman 3 March 2003
#	Removed   NurbsPositionInterpolator 'dimension' field, nonsensical for curve.
#	Confirmed NurbsPositionInterpolator 'keyValue' array contains control points.
#	Added     NurbsPositionInterpolator 'key' field, necessary for X3DInterpolator.
#	  Size corresponds as usual to 'keyValue' array, which contains control points.
#	Renamed   NurbsPositionInterpolator 'keyWeight' field as 'weight' field,
#	  for consistency with other NURBS.  Might get renamed back, or perhaps
#	  renamed keyValueWeight.  Further implementation/evaluation needed.
#	Upcoming:
#	Will likely propose NurbsPositionInterpolator tangent_changed, or else
#	  perhaps propose NurbsOrientationInterpolator, so that orientation works.
#	Will likely propose removal of CoordinateDeformer as redundant.
#	Added   NurbsSurface initializeOnly SFBool closedSurface 'false' attribute,
#	  indicating that opposite sides of NurbsSurface are connected.
#	  Proposed attribute, see examples such as AnimatedNurbsSurfaceHead.x3d
#	  which allows full export capability from Maya and other tools.
#	  Again subject to further implementation/evaluation, maybe too ambiguous.
# hudson, williams, brutzman 2 March 2003
#	Added file:// to transitional DTD system identifier, as follows:
#  <!DOCTYPE X3D PUBLIC "http://www.web3d.org/specifications/x3d-3.0.dtd" "file:///www.web3d.org/TaskGroups/x3d/translation/x3d-3.0.dtd">
#	Changed + to ISO for final external identifier, though have not yet
#	found conclusively authoritative reference, as follows:
#  <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
# hudson, couch, brutzman 17 February 2003
#	Enforcing strict quoting rules for individual tokens in enumeration-like
#	  MFString fields.  Example:  <NavigationInfo type='"EXAMINE" "ANY"'/>
#	  Other affected field defaults are geoSystem and GeoViewpoint navType.
# brutzman 25-26 January 2003
#	Updated and verified DIS, GeoSpatial, H-Anim and NURBS nodes.
#	Simplified content model for GeoLOD to eliminate rootNode wrapper tag.
#	Added GeoElevationGrid set_yScale, set_height to x3d-3.0-InputOutputFields.dtd.
#	Changed GeoElevationGrid height to MFDouble.
#	Added GeoLocation, GeoLOD fields bboxCenter, bboxSize.
#	Changed GeoLocation, GeoOrigin field geoCoords to SFVec3d.
#	Changed GeoOrigin geoCoords to SFVec3d.
#	Removed GeoTouchSensor geovalue, retained geovalue_changed.
#	Added GeoViewpoint set_orientation, renamed speed as speedFactor, removed examine.
#	Simplified content model for HAnimHumanoid to eliminate wrapper tags, humanoidBody.
#	Utilize HAnimHumanoid containerField for joints/skeleton, segments, sites, skin,
#	  skinCoord, skinNormal, and viewpoints.
#	Removed HAnimHumanoid containerField for humanoidBody (redundant from H-Anim 1.0)
#	  and replaced in H-Anim 2.0 by skeleton/skin.
#	Revised several NURBS containerField values:
#	  Contour2D         "trimmingContour" (parent TrimmedSurface),
#	  ContourPolyline2D "children"        (parent Contour2D)
#	  NurbsCurve        "geometry"
#	  NurbsCurve2D      "children"        (parent Contour2D - spec erratum submitted)
#	  NurbsSurface      "surface"         (parent TrimmedSurface, NurbsGroup)
#		(note "surface" inconsistency with "children" for parent NurbsGroup)
#	Simplified content model for NURBS CoordinateDeformer to eliminate wrapper tags
#	  and utilize containerField for inputCoord, outputCoord and inputTransform.
#	Renamed IMPORT label exportedDEF as importedDEF for semantic consistency.
#
#	Prior content models appear in x3d-dtd-changelog.txt for archive purposes.
#	<!ELEMENT rootNode ( %ChildrenNodes; | %WildcardNodes; )* >
#	(GeoOrigin, ((children, rootNode?) | (rootNode, children?))? ) |
#	(children, ((GeoOrigin, rootNode?) | (rootNode, GeoOrigin?))? ) |
#	(rootNode, ((children, GeoOrigin?) | (GeoOrigin, children?))? )?
#	<!ELEMENT GeoElevationGrid
#	   (GeoOrigin, ((color,	((normal,texCoord?) | (texCoord,normal)?)?) |
#			(normal,((color,texCoord?) | (texCoord,color?))?) |
#			(texCoord,((color,normal?) | (normal,color?))?) )? )
#	 | (color, (	(GeoOrigin, ((normal,texCoord?) | (texCoord,normal)?)?) |
#			(normal,((GeoOrigin,texCoord?) | (texCoord,GeoOrigin?))?) |
#			(texCoord,((GeoOrigin,normal?) | (normal,GeoOrigin?))?) )? )
#	 | (normal, (	(color,	((GeoOrigin,texCoord?) | (texCoord,GeoOrigin?))?) |
#			(GeoOrigin,((color,texCoord?) | (texCoord,color?))?) |
#			(texCoord,((color,GeoOrigin?) | (GeoOrigin,color?))?) )? )
#	 | (texCoord, (	(color,	((GeoOrigin,normal?) | (normal,GeoOrigin?))?) |
#			(GeoOrigin,((color,normal?) | (normal,color?))?) |
#			(normal,((color,GeoOrigin?) | (GeoOrigin,color?))?) )? )?
#	<!ELEMENT GeoLOD (IS?, (
#		( %ChildrenNodes; | %WildcardNodes; )*,
#			( (GeoOrigin?, ( %ChildrenNodes; | %WildcardNodes; )*, rootNode?,  ( %ChildrenNodes; | %WildcardNodes; )* )? |
#			  (rootNode,   ( %ChildrenNodes; | %WildcardNodes; )*, GeoOrigin?, ( %ChildrenNodes; | %WildcardNodes; )* )? )
#	)? ) >
#	<!ELEMENT HAnimSegment (IS?, (
#		(children, ((coord, Displacer*) | (Displacer+, coord?))? ) |
#		(coord, ((children, Displacer*) | (Displacer+, children?))? ) |
#		(Displacer+, ((coord, children?) | (children, coord?))? )?
#	) ) >
#	<!-- humanoidBody is H-Anim 1.1, superceded by 2.0 specification
#	<!ELEMENT humanoidBody ( %ChildrenNodes; | %WildcardNodes; )* > -->
#	<!-- skeleton, skin defined by 2.0 specification
#	<!ELEMENT skeleton ( %ChildrenNodes; | %WildcardNodes; )* >
#	<!ELEMENT skin ( Shape | %WildcardNodes; )* >
#	<!ELEMENT skinCoord ( Coordinate | %WildcardNodes; )* >
#	<!ELEMENT skinNormal ( Normal | %WildcardNodes; )* > -->
#	<!-- the following content model can likely be improved but it supports either 1.1 or 2.0
#	<!ELEMENT HAnimHumanoid (IS?,
#		(humanoidBody? | (skeleton, (skinCoord, skinNormal?, skin)?)),
#		(HAnimJoint | HAnimSegment | HAnimSite | Viewpoint)* ) > -->
#	<!-- Field tags for contained NURBS nodes -->
#	<!ELEMENT inputCoord		( Coordinate? ) >
#	<!ELEMENT inputTransform	( Transform?  ) >
#	<!ELEMENT outputCoord		( Coordinate? ) >
#	<!ELEMENT CoordinateDeformer (IS?, (
#	   (inputCoord, ((outputCoord,	((inputTransform,( %ChildrenNodes; | %WildcardNodes; )*) | (( %ChildrenNodes; | %WildcardNodes; )*,inputTransform)?)?) |
#			(inputTransform,((outputCoord,( %ChildrenNodes; | %WildcardNodes; )*) | (( %ChildrenNodes; | %WildcardNodes; )*,outputCoord?))?) |
#			(( %ChildrenNodes; | %WildcardNodes; )*,((outputCoord,inputTransform?) | (inputTransform,outputCoord?))?) )? )
#	 | (outputCoord, ((inputCoord, ((inputTransform,( %ChildrenNodes; | %WildcardNodes; )*) | (( %ChildrenNodes; | %WildcardNodes; )*,inputTransform)?)?) |
#			(inputTransform,((inputCoord,( %ChildrenNodes; | %WildcardNodes; )*) | (( %ChildrenNodes; | %WildcardNodes; )*,inputCoord?))?) |
#			(( %ChildrenNodes; | %WildcardNodes; )*,((inputCoord,inputTransform?) | (inputTransform,inputCoord?))?) )? )
#	 | (inputTransform, ((outputCoord,((inputCoord,( %ChildrenNodes; | %WildcardNodes; )*) | (( %ChildrenNodes; | %WildcardNodes; )*,inputCoord?))?) |
#			(inputCoord,((outputCoord,( %ChildrenNodes; | %WildcardNodes; )*) | (( %ChildrenNodes; | %WildcardNodes; )*,outputCoord?))?) |
#			(( %ChildrenNodes; | %WildcardNodes; )*,((outputCoord,inputCoord?) | (inputCoord,outputCoord?))?) )? )
#	 | (( %ChildrenNodes; | %WildcardNodes; )*, (	(outputCoord,	((inputCoord,inputTransform?) | (inputTransform,inputCoord?))?) |
#			(inputCoord,((outputCoord,inputTransform?) | (inputTransform,outputCoord?))?) |
#			(inputTransform,((outputCoord,inputCoord?) | (inputCoord,outputCoord?))?) )? )?
#	) )>
#
# williams 20 January 2003
#	Removed GeoInline.
# brutzman 14 January 2003
#	Added MultiTextureTransform.
# brutzman 13 January 2003
#	Updated NURBS component.  knot fields for CoordinateDeformer, NurbsCurve,
#	  NurbsCurve2D, NurbsSurface etc. are now MFDouble vice MFFloat.
# brutzman 12 January 2003
#	Integrated significant changes from abstract specification into DIS component.
# brutzman 9 January 2003
#	Corrected case capitalization of Polyline2D, Polypoint2D
#	NURBS Polyline2D name corrected to ContourPolyline2D
# brutzman 2 January 2003
#	Rename H-Anim nodes to have HAnim prefix:  HAnimDisplacer, HAnimHumanoid,
#	  HAnimJoint, HAnimSegment, HAnimSite.
#	Moved inputOnly/outputOnly (eventIn/eventOut) fields to optional file
#	  x3d-3.0-InputOutputFields.dtd.
#	  Turned off/on via parameter entity AllEventFields for use by some tools.
#	  Retained fields have #FIXED empty-string values, so no values allowed.
#	  Still a problem changing default AllEventFields to IGNORE vice INCLUDE.
#	Did not change DTD default from Full profile to Immersive profile, rather kept
#	  all new components (DIS H-Anim GeoSpatial NURBS LatticeXvl) in one file.
#	  Better to keep DTD unrestrictive unless author or tool directs smaller profile.
#	Eliminated unneeded declarations:
#	<!ENTITY % Vrml97FieldTypes	  " SFBool | MFBool | SFColor | MFColor | SFDouble | MFDouble | SFFloat | MFFloat | SFImage | MFImage | SFInt32 | MFInt32 | SFNode | MFNode | SFRotation | MFRotation | SFString | MFString | SFTime | MFTime | SFVec2f | MFVec2f | SFVec3f | MFVec3f| SFVec3d | MFVec3d " >
#	<!ENTITY % X3dFieldTypesAlternate " Boolean | Booleans | Color | Colors | Double | Doubles | Float | Floats | Image | Images | Integer | Integers | Node | Nodes | Rotation | Rotations | String | Strings | Time | Times | Vector2Float | Vector2FloatArray | Vector3Float | Vector3FloatArray | Vector3Double | Vector3DoubleArray " >
# brutzman 1 January 2003
# 	Merged prior X3D DTDs into x3d-3.0.dtd:
#	  http://www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd
#	  http://www.web3D.org/TaskGroups/x3d/translation/DistributedInteractiveSimulation.dtd
#	  http://www.web3D.org/TaskGroups/x3d/translation/GeoSpatial-compact.dtd
#	  http://www.web3D.org/TaskGroups/x3d/translation/HumanoidAnimation2.0-compact.dtd
#	  http://www.web3D.org/TaskGroups/x3d/translation/LatticeXvl-compact.dtd
#	  http://www.web3D.org/TaskGroups/x3d/translation/Nurbs-compact.dtd
# 	Former draft X3D DTD name:
#	  http://www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd
#	Renumber DTD to version 3.0: Transitional doctype becomes
#  <!DOCTYPE X3D PUBLIC "http://www.web3d.org/specifications/x3d-3.0.dtd" "/www.web3d.org/specifications/x3d-3.0.dtd">
#	Integrated X3D specification examples, some further work needed.
# hudson, brutzman 31 December 2002
#	Alan verified all abstract specification nodes/fields included.  Changes:
#	Background, NavigationInfo and TouchSensor now have single DTD definition,
#	  Interchange profile.  Some fields are optional in Interchange profile.
#	Collision:  rename 'collide' field as enabled, also add isActive.
#	LOD, Switch:  added bboxCenter, bboxSize.
#	NavigationInfo type default set to 'WALK ANY'.
#	Added ProximitySensor centerOfRotation_changed  %SFVec3f; #FIXED ""
#	Triangle*Set:  removed convex field (they are always convex, duh).
#	Removed TimeSensor elapsedTime.
# brutzman, couch 31 December 2002
#	Profile for Triangle*Set nodes set to Interchange.
#	Remaining containerField issues: removed nodeType from ExternProtoDeclare,
#	  default ProtoInstance containerField="children".  Then added
#	  containerField values to all non-children ProtoInstance examples.
# brutzman, couch 30 December 2002
#	Restore containerField throughout.  Eliminated proxy element.
#	Removed all Scene attributes for consistency with abstract specification.
#	<!ATTLIST Scene
#		DEF         ID          #IMPLIED
#		class       CDATA       #IMPLIED>
#
#		could provide simple singleton exposure of Browser class variables:
#		browserName          %SFString;  #IMPLIED
#		browserVersion       %SFString;  #IMPLIED
#		currentFrameRate     %SFFloat;   #IMPLIED
#		currentSpeed         %SFFloat;   #IMPLIED
#		worldUrl             %MFString;  #IMPLIED
#
#		deferred for reconsideration with displays in advanced SAI:
#		boundBackground      IDREF       #IMPLIED
#		boundFog             IDREF       #IMPLIED
#		boundGeoViewpoint    IDREF       #IMPLIED
#		boundNavigationInfo  IDREF       #IMPLIED
#		boundViewpoint       IDREF       #IMPLIED
#		dashboardVisible     %SFBool;    #IMPLIED
#		pixelHeight          %SFInt32;   #IMPLIED
#		pixelWidth           %SFInt32;   #IMPLIED
#		aspectRatio          %SFInt32;   #IMPLIED
#
#		not needed for exposure via Scene since only invoked from inside a Script anyway:
#		description          %SFString;  #IMPLIED
#		createVrmlFromString %SFString;  #IMPLIED
#		createVrmlFromX3d    %SFString;  #IMPLIED
#		createVrmlFromUrl    %SFString;  #IMPLIED
#
#		no:
#		evaluate             %SFBool;    #IMPLIED
#		browserResponse      %SFString;  #IMPLIED
#		creationTargetNode   IDREF       #IMPLIED
#		loadUrl              %MFString;  #IMPLIED
#		loadUrlParameter     %SFString;  #IMPLIED
#		currentTime          %SFTime;    #IMPLIED
#	>
# brutzman, 29 December 2002
#	Completed new content model for ProtoDeclare:  ProtoInterface and ProtoBody.
#	  Content library updated, prior content no longer validates/translates.
#	Allowed ProtoDeclare as first element of ProtoBody, prior to first node.
# brutzman, 27 December 2002
#	Updated MultiTexture enumeration fields:  mode, source, function.
#	  Mapped source="" to PREVIOUS and function="" to NONE, since XML
#	  can't use a blank field as a validatable enumeration.
# puk, 17 November 2002
#	TextureCoordinateGenerator:  removed 'point' field.
#	MultiTexture has no 'type' field.
# brutzman, spec team issue resolutions 11 November 2002
#	Added new content model for ProtoDeclare:  ProtoInterface and ProtoBody.
#	  Implementation/evaluation in progress.
#	FillProperties and LineProperties added, can only occur as first
#	  Appearance fields due to order limitations in XML 1.0 DTD.
#	IndexedLineSet:  eliminated field lineWidth, handled by LineProperties.
#	Profile for Triangle*Set nodes entered as Immersive.
#	Consistent support for enabled, isActive fields in all Sensor nodes.
#	Added description field for X3DPointingDeviceSensorNode nodes
#	  CylinderSensor, PlaneSensor, SphereSensor, TouchSensor so that
#	  authors can describe intended action to users.
#	Added Geometry2D nodes:  Arc2D, ArcClose2D, Circle2D, Disk2D,
#	  PolyLine2D and PolyPoint2D (note capitalization different than draft),
#	  Rectangle2D, TriangleSet2D.
# brutzman, spec team issue resolutions 10 November 2002
#	MultiTexture, MultiTextureCoordinate, TextureCoordinateGenerator added.
#	ColorRGBA allowed in Interchange Profile, alpha channel may be ignored.
#	StringSensor:  removed extraneous fields from StringSensor, removed
#	  deletionCharacter/terminationCharacter, added SFBool deletionAllowed.
#	TimeSensor numLoops removed.
#	TextureBackground added, field names of child texture nodes are in
#	  alphabetic order: backTexture, bottomTexture, frontTexture,
#	  leftTexture, rightTexture, topTexture.
#	Restored Collision <proxy> and removed containerField throughout,
#	  reverting work noted below 14-15 May 2002 item 6.
#	  Restricted <proxy> content to GroupingNodes, Shape and ProtoInstance.
#	  <!ELEMENT proxy ( %GroupingNodes; | Shape | %WildcardNodes; )? >
# brutzman, spec team issue resolutions  9 November 2002
#	PointSet:  eliminated field pointSize, deferred until ParticleSet work.
# brutzman 3 November 2002
#	Event utilities:  verified BooleanSequencer, IntegerSequencer.
#	  Also added other event utilities BooleanFilter, BooleanToggle,
#	  BooleanTrigger, IntegerTrigger, TimeTrigger.
#	  Prototypes also provided for VRML97 use, see development examples.
# brutzman 2 November 2002
#	Added node ColorRGBA and field types SFColorRGBA, MFColorRGBA.
#	Added nodes TriangleFanSet, TriangleSet, TriangleStripSet.
#	Added missing attributes to X3D DTD as follows.
#	Inline:
#	  SFBool   [in,out] load       TRUE
#	LoadSensor
#	  set timeout default value to 0
#	Shape
#	  SFVec3f []       bboxCenter 0 0 0    (-inf,inf)
#	  SFVec3f []       bboxSize   -1 -1 -1 (0,inf) or -1 -1 -1
#	TimeSensor:
#	  SFFloat [in,out] numLoops     1     [0,inf)
#	  SFTime  [in,out] pauseTime    0     (-inf,inf)
#	  SFTime  [in,out] resumeTime   0
#	  SFBool  [out]    isPaused
#	  SFTime  [out]    elapsedTime
# couch hudson brutzman 1 November 2002
#	Modified names of accessType inputOnly/outputOnly (eventIn/eventOut)
#	  and attribute values as empty (FIXED "").  Prevents validation of
#	  content, allows construction of full DTD scene graphs in DOM etc.
#	  - inputOnly:   prepended set_
#	  - outputOnly:  appended  _changed
#	  Node fields not listed:
#	  - children:  addChildren, removeChildren
#	  Names changed, defaults cleared to #FIXED &#34;&#34;
#	  - AudioClip		duration_changed
#	  - Interpolators	set_fraction, value_changed
#	  - Bindable nodes 	set_bind, bindTime, isaActive
#	    (Had to change %SFBool% to CDATA vice true/false to allow null value)
#	  - Collision 		collideTime
#	  - Sensors 		isActive, outputOnly _changed events
#	  - ElevationGrid 	set_height:  inputOnly event added
#	  - KeySensor, StringSensor outputOnly fields
#	  - TouchSensor added hitNormal_changed, hitPoint_changed, hitTexCoord_changed
#	  - set_ methods added for Geometry node children
# brutzman 1 November 2002
#	Changed IndexedFaceSet in Interchange profile from
#		convex          %SFBool;  #FIXED    "true"
#	  to
#		convex          %SFBool;  #IMPLIED
#	  since Interchange browsers have the option to honor convex false.
#
# brutzman 1 November 2002
#	Removed unneeded constructs in DTD
# <!-- ***** X3D Extensions,  under development ***** -->
#
# <![%X3dExtensions;[
#
# <!-- ***** MultiTexture Extensions proposal by Rob Glidden ***** -->
#
#
# <!-- Tool problems when invoking  XHTML DTD here for img | object | iframe | div
#
# <!ENTITY img PUBLIC
# 	"-//W3C//DTD XHTML 1.0 Frameset//EN"
# 	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
#
# <!ENTITY object PUBLIC
# 	"-//W3C//DTD XHTML 1.0 Frameset//EN"
# 	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
#
# <!ENTITY iframe PUBLIC
# 	"-//W3C//DTD XHTML 1.0 Frameset//EN"
# 	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
#
# <!ENTITY div PUBLIC
# 	"-//W3C//DTD XHTML 1.0 Frameset//EN"
# 	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
# -->
#
# <!-- Tool problems when  invoking Structured Vector Graphics (SVG) DTD for svg;
# 	also have more recent DTDs that need to be checked...
#
# <!ENTITY svg SYSTEM
# 	"http://www.w3.org/Graphics/SVG/SVG-19991203.dtd">
#
# <!ELEMENT Surface (( %MaterialNodes; | img | object | iframe | div | svg | Scene3D ), TextureTransform?) >
#
# -->
#
# ]]>
#
# brutzman 28 October 2002
#	Upgraded all content to verify revised IS/connect tags,
#	  removed both IS and USE atttributes in field tag.
# brutzman 24 October 2002
#	added MFImage type
# brutzman 20 October 2002
#	Made field accessType REQUIRED instead of IMPLIED.
#	Removed IS attribute from fieldValue.
#	Moved double type definitions from GeoSpatial-compact.dtd to x3d-compact.dtd
#	  and added double types to allowed type choice list.
#	Made Humanoid field name IMPLIED instead of REQUIRED, so that
#	  <Humanoid USE="BoxMan"/> is legal.  Note that defining the name
#	  attribute must be present so Humanoid can be identified at runtime.
# brutzman 19 October 2002
#	Renamed ColorNode to Color.
#	Renamed type enumerations:
#		Boolean			to	SFBool
#		Booleans		to	MFBool
#		Color			to	SFColor
#		Colors			to	MFColor
#		Double			to	SFDouble
#		Doubles			to	MFDouble
#		Float			to	SFFloat
#		Floats			to	MFFloat
#		Image			to	SFImage
#		Integer			to	SFInt32
#		Integers		to	MFInt32
#		Node			to	SFNode
#		Nodes			to	MFNode
#		Rotation		to	SFRotation
#		Rotations		to	MFRotation
#		String			to	SFString
#		Strings			to	MFString
#		Time			to	SFTime
#		Times			to	MFTime
#		Vector2Float		to	SFVec2f
#		Vector2FloatArray	to	MFVec2f
#		Vector3Float		to	SFVec3f
#		Vector3FloatArray	to	MFVec3f
#		Vector3Double		to	SFVec3d
#		Vector3DoubleArray	to	MFVec3d
# brutzman 18 October 2002
#	Renamed internal DTD labels for parameter-entity extension, which are used to
#	  switch different levels of DTD validation on/off.
#	  	(unchanged)			InterchangeProfile
#  **	  	(needed)			InteractiveProfile
# 	  	BaseProfile 		to	ImmersiveProfile
#  **	  	(needed)			FullProfile
#	  	DISProfile		to	DISComponent
#	  	GeoSpatialProfile	to	GeoSpatialComponent
#	  	HAnimProfile		to	HAnimComponent
#	  	NurbsProfile		to	NurbsComponent
#	  	LatticeXvlProfile	to	LatticeXvlComponent
# brutzman 17 October 2002
#	Eliminated USE attribute on fieldValue for identifying contained content.
#	  Utilize child nodes with single USE attribute instead.
#	Revise enumeration values for <field> attribute accessType
#	  from	accessType (eventIn   | eventOut   | field          | exposedField)
#	  to  	accessType (inputOnly | outputOnly | initializeOnly | inputOutput)
# brutzman 16 October 2002
#	<IS> follows <field>      definitions for Script and (nested) ProtoDeclare
#	<IS> follows <fieldValue> definitions for ProtoInstance
#	Prepended optional single IS? tag to instantiable nodes in DIS, GeoSpatial,
#	  H-Anim2.0, NURBS and LatticeXVL components, matching all other X3D nodes.
# brutzman 12 October 2002
#	eliminated tag-order ambiguity problem in HumanoidAnimation2.0-compact.dtd
# brutzman 1 October 2002
#	changed default value, MovieTexture loop="false" to match specification
#
# ========================================================================
# DTD prior to winter 2001:
#	http://www.web3D.org/TaskGroups/x3d/translation/x3d-compromise.dtd
# DTD prior to 15 March 2000:
#	http://www.web3D.org/TaskGroups/x3d/translation/x3d-draft.dtd
# ========================================================================
#
# brutzman 29 September 2002
#	IS/connect allowed as first elements of ProtoInstance, for use within a
#		ProtoDeclare
# brutzman 27 September 2002
#	Eliminated Eliminated optional "quote" "marks" from FontStyle default values
#		family      %MFString; 'SERIF'
#		justify     %MFString; 'BEGIN'
# brutzman, hudson 24 August 2002
#	LoadSensor tooltips updated, and watchList nodes constrained to nodes with url:
#	 (Anchor | AudioClip | GeoInline | ImageTexture | Inline | MovieTexture | Script | ProtoInstance)*
# brutzman, 24 August 2002
#	corrected names are PositionInterpolator2D, CoordinateInterpolator2D
#	  for Vector2FloatInterpolator, Vector2FloatArrayInterpolator
# brutzman, 14 August 2002
#	added Vector2FloatInterpolator, Vector2FloatArrayInterpolator
# brutzman, 4 August 2002
#	changed class attribute to #IMPLIED rather than empty string ""
# brutzman, 6 July 2002
#	added BooleanSequencer, IntegerSequencer
# x3d-specification team, 3 July 2002
#	added StaticGroup
#	updated versioning scheme from 0.8 to 0.8.1
# x3d-specification team, 2 July 2002
#	modified IS construct for use within Prototype declarations.  Example:
#	<ColorInterpolator DEF="INTERP_COLOR" keyValue="0.0 0.0 1.0 1.0 1.0 ...">
#	  <IS>
#	    <connect nodeField="key" protoField="key1"/>
#	    <connect nodeField="value_changed" protoField="SphereColor1"/>
#	    <connect nodeField="value_changed" protoField="SphereColor2"/>
#	    ...
#	  </IS>
#	</ColorInterpolator>
#	Status:  implemented in DTD and tooltips only, also needed in X3D Schema,
#	  conversion stylesheets and exemplar content.  Deprecated previous approach
#	  using <field> definitions remains validatable/usable until these remaining
#	  changes occur.
# brutzman, 6 June 2002
#	renamed IMPORT tag's inlineDEF to InlineDEF for consistent capitalization,
#	renamed AS values to attribute name AS (instead of more complicated names).
#	made IMPORT (InlineDEF, exportedDEF) and EXPORT (localDEF) REQUIRED, kept AS's optional.
#	example use:
#		<!-- EXPORTing Scene, filename SomeSceneThatIsEXPORTing.x3d -->
#		<EXPORT localDEF="someNode" AS="ImportantNode"/>
#		~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
#		<!-- IMPORTingScene -->
#		<Inline DEF="AnotherWorld" url="SomeSceneThatIsEXPORTing.x3d"/>
#		<IMPORT InlineDEF="AnotherWorld" exportedDEF="ImportantNode" AS="SomeOtherDEFName"/>
# hudson, couch, x3d-specification team, 5 June 2002
#	added LoadSensor which reports whether file-based children are successfully loaded
# x3d-specification team, 14-15 May 2002
# 1.	component tag:  require only name and level atttributes, default level="1" integer
#	  x3d-compact.dtd
#		removed the following attributes:  url originator version
#		originator  CDATA          #IMPLIED
#		url         CDATA          #IMPLIED
#		version     CDATA          #IMPLIED
#	x3d-compact.profile.xml
#		<attribute tooltip="[originator: &SFStringLabel; #IMPLIED]&#10;originator of this component (if any).&#10;Hint:  experimental." name="originator"/>
#		<attribute tooltip="[url: &SFStringLabel; #IMPLIED]&#10;url of this component (if any).&#10;Hint:  experimental." name="url"/>
#		<attribute tooltip="[version: &SFStringLabel; #IMPLIED]&#10;version of this component (if any).&#10;Hint:  experimental." name="version"/>
#	x3d schema
#		<xsd:attribute name="originator" type="String"/>
#		<xsd:attribute name="url" type="StringsUrl"/>
#		<xsd:attribute name="version" type="String"/>
# 2. IMPORT/EXPORT
#	IMPORT inlineDEF.exportedDEF AS localDEF
#	EXPORT localDEF AS exportedDEF
#	IMPORT/EXPORT can appear anywhere a ROUTE can appear (rather than EXPORT being a child of Inline)
# 3. Viewpoint 'centerOfRotation' point is proposed addition relating to NavigationInfo EXAMINE mode.
#	exposedField, default value 0 0 0, does not get affected by camera motion
# 4. 'containerField' is the field-label prefix used in VRML encodings
#	when this node is a child of another node.
#	Examples:  geometry Box, children Group, proxy Group.
#	Hint: can be overridden by author if needed.
# 5. 'class' attribute reserved for future use by XML Cascading Style Sheets (CSS), similar to HTML.
#	References:
#	http://www.w3.org/Style/CSS
#	http://www.w3.org/TR/REC-CSS2
#	This is an expected area of interaction with Web Accessibility Initiative (WAI).
#	http://www.w3.org/WAI
# 6. <proxy> tag removed in favor of containerField attributes throughout tagset
#	<!ELEMENT Collision ( ( %ChildrenNodes; | %WildcardNodes; )*, (proxy, ( %ChildrenNodes; | %WildcardNodes; )* )? )  >
#	becomes
#	<!ELEMENT Collision ( ( %ChildrenNodes; | %WildcardNodes; )* )  >
#	and following is removed:
#	<!ELEMENT proxy ( %ChildrenNodes; | %WildcardNodes; )? >
# 7. <USE> element no longer allowed, due to lack of type checking on
#	node and attribute values, as well as redundant functionality.
#	Utilize @USE attributes instead, for example <Shape USE="MyShapeNode"/>
#		<!ELEMENT USE EMPTY >
#		<!ATTLIST USE
#			node         IDREF        #REQUIRED>
#
# brutzman, 14 May 2002
#	removed commented/unused MultiTexture fragments, copied here for
#	archival purposes
# <!--
# No followup effort has yet tried to compose the various multitexture proposals.
#
# <!-- MultiTexture: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
#
# <!ELEMENT Surface (( %MaterialNodes; | img | object | iframe | div | svg | Scene3D ), TextureTransform?) >
#
# <!ELEMENT Surface (( %MaterialNodes; | Scene3D ), TextureTransform?) >
# <!ATTLIST Surface
# 	textureTransform          IDREF    #IMPLIED
# 	mappingSurfaceCoordinates IDREF    #IMPLIED
# 	repeatS   %SFBool;  "true"
# 	repeatT   %SFBool;  "true"
# 	width     %SFInt32; "0"
# 	height    %SFInt32; "0"
# 	DEF       ID        #IMPLIED
# 	USE       IDREF     #IMPLIED>
#
# <!ELEMENT Scene3D ((Background, Viewpoint?) | (Viewpoint, Background?))? >
# <!ATTLIST Scene3D
# 	Root       IDREF #REQUIRED
# 	Viewpoint  IDREF #REQUIRED
# 	Background IDREF #REQUIRED
# 	RenderInfo IDREF #REQUIRED
# 	DEF        ID    #IMPLIED
# 	USE        IDREF #IMPLIED>
#
# <!ELEMENT MultiTexture ((Material, Surface*) | (Surface+, Material?))? >
# <!ATTLIST MultiTexture
# 	diffuseSurface    IDREF  #IMPLIED
# 	ambientSurface    IDREF  #IMPLIED
# 	bumpSurface       IDREF  #IMPLIED
# 	material          IDREF  #IMPLIED
# 	reflectionType (USER | USERCUBIC | USERSPHERE | REFLECT | CUBIC | SPHERE) "USER"
# 	reflectionSurfaces IDREFS #IMPLIED
# 	maskSurface       IDREF  #IMPLIED
# 	DEF               ID     #IMPLIED
# 	USE               IDREF  #IMPLIED>
#
# <!ELEMENT MultiTextureTree ( RenderOp ) >
# <!ATTLIST MultiTextureTree
# 	DEF ID       #IMPLIED
# 	USE IDREF    #IMPLIED>
#
# -->
#
# <!-- what is Vector ??
#
# <!ELEMENT RenderOp ((Surface | RenderOp), (Script, Vector?, Color? )? ) >
#
# <!ELEMENT RenderOp ((Surface | RenderOp), (Script, Color? )? ) >
# <!ATTLIST RenderOp
# 	factor %SFFloat; ".5"
# 	type (ADD | MODULATE | MODULATE2 | LINEAR | SCRIPT) #REQUIRED
# 	DEF    ID    #IMPLIED
# 	USE    IDREF #IMPLIED>
# -->
#
# <!-- Curtis Beeson's alternative:  lightweight multitexture proposal
#      https://www.web3d.org/WorkingGroups/x3d-contributors/hypermail/1999/1855.html
#
# Appearance {
#         exposedField SFMaterial diffuseMaterial
#         exposedField SFTexture  lightMap
#         exposedField SFTexture  diffuseMap
#         exposedField SFTexture  envMap
#         exposedField SFTexture  envMapMask
#         exposedField SFTextureTransform lightMapTransform
#         exposedField SFTextureTransform diffuseMapTransform
#         exposedField SFTextureTransform envMapTransform
#         exposedField SFTextureTransform envMapMaskTransform
#         exposedField SFEnum envMapType { SPHERICAL | CUBIC }
# }
# -->
#
# <!--
# <!ELEMENT MultiTextureAppearance
# 	(((%MaterialNodes;), ((%TextureNodes;) | (%TextureTransformNodes;))*) |
# 	 (((%TextureNodes;) | (%TextureTransformNodes;))+,
#           (%MaterialNodes;),
#           ((%TextureNodes;) | (%TextureTransformNodes;))*)
# 	)? >
# <!ATTLIST MultiTextureAppearance
# 	diffuseMaterial         IDREF #IMPLIED
# 	lightMap                IDREF #IMPLIED
# 	diffuseMap              IDREF #IMPLIED
# 	envMap                  IDREF #IMPLIED
# 	envMapMask              IDREF #IMPLIED
# 	lightMapTransform       IDREF #IMPLIED
# 	diffuseMapTransform     IDREF #IMPLIED
# 	envMapTransform         IDREF #IMPLIED
# 	envMapMaskTransform     IDREF #IMPLIED
# 	envMapType (SPHERICAL|CUBIC)  #IMPLIED
# 	DEF ID      #IMPLIED
# 	USE IDREF   #IMPLIED>
#
# IndexedFaceSet {
#   eventIn       MFInt32 set_colorIndex
#   eventIn       MFInt32 set_coordIndex
#   eventIn       MFInt32 set_normalIndex
#   eventIn       MFInt32 set_texCoordIndex
#   exposedField  SFNode  color             NULL
#   exposedField  SFNode  coord             NULL
#   exposedField  SFNode  normal            NULL
#   field         SFBool  ccw               TRUE
#   field         MFInt32 colorIndex        []        # [-1,)
#   field         SFBool  colorPerVertex    TRUE
#   field         SFBool  convex            TRUE
#   field         MFInt32 coordIndex        []        # [-1,)
#   field         SFFloat creaseAngle       0         # [0,)
#   field         MFInt32 normalIndex       []        # [-1,)
#   field         SFBool  normalPerVertex   TRUE
#   field         SFBool  solid             TRUE
#
#   (begin new stuff)
#   exposedField  SFNode  lightTexCoord        NULL
#   field         MFInt32 lightCoordIndex      []        # [-1,)
#   exposedField  SFNode  diffuseTexCoord      NULL
#   field         MFInt32 diffusetexCoordIndex []        # [-1,)
#   exposedField  SFNode  envTexCoord          NULL
#   field         MFInt32 envTexCoordIndex     []        # [-1,)
#   exposedField  SFNode  envMaskTexCoord      NULL
#   field         MFInt32 envMaskTexCoordIndex []        # [-1,)
# }
#
#
# <!ELEMENT MultiTextureIndexedFaceSet (Color?, Coordinate*, Normal?, TextureCoordinate*) >
# <!ATTLIST MultiTextureIndexedFaceSet
# 	ccw             %SFBool;  "true"
# 	colorIndex      %MFInt32; #IMPLIED
# 	colorPerVertex  %SFBool;  "true"
# 	convex          %SFBool;  #FIXED    "true"
# 	coordIndex      %MFInt32; #IMPLIED
# 	creaseAngle     %SFFloat; "0"
# 	normalIndex     %MFInt32; #IMPLIED
# 	normalPerVertex %SFBool;  "true"
# 	solid           %SFBool;  "true"
# 	texCoordIndex   %MFInt32; #IMPLIED
#
# 	lightTexCoord        IDREF     #IMPLIED
# 	lightCoordIndex      %MFInt32; #IMPLIED
# 	diffuseTexCoord      IDREF     #IMPLIED
# 	diffusetexCoordIndex %MFInt32; #IMPLIED
# 	envTexCoord          IDREF     #IMPLIED
# 	envTexCoordIndex     %MFInt32; #IMPLIED
# 	envMaskTexCoord      IDREF     #IMPLIED
# 	envMaskTexCoordIndex %MFInt32; #IMPLIED
#
# 	DEF             ID        #IMPLIED
# 	USE             IDREF     #IMPLIED>
# -->
# <!--
#     <element tooltip="Surface's content is:&#10;(Material|img|object|iframe|div|svg|Scene3D), TextureTransform?.&#10;Hint:  Surface is a proposed X3D extension." name="Surface">
# 	<attribute tooltip="[DEF ID #IMPLIED]&#10;DEF defines a unique ID name for this node, referencable by other nodes.&#10;Hint:  descriptive DEF names improve clarity and help document a model." name="DEF"/>
# 	<attribute tooltip="[USE IDREF #IMPLIED]&#10;USE means reuse an already DEF-ed node ID, ignoring _all_ other attributes and children.&#10;Hint:  USEing other geometry (instead of duplicating nodes) can improve performance.&#10;Warning:  do NOT include DEF (or any other attribute values) when using a USE attribute!" name="USE"/>
# 	<attribute tooltip="[height: &SFInt32Label; &#34;0&#34;." name="height"/>
# 	<attribute tooltip="[width: &SFInt32Label; &#34;0&#34;." name="width"/>
# 	<attribute tooltip="[mappingSurfaceCoordinates IDREF #IMPLIED]&#10;." name="mappingSurfaceCoordinates"/>
# 	<attribute tooltip="[textureTransform IDREF #IMPLIED]" name="textureTransform"/>
# 	<attribute tooltip="[repeatS (true|false) &#34;true&#34;." name="repeatS"/>
# 	<attribute tooltip="[repeatT (true|false) &#34;true&#34;." name="repeatT"/>
#     </element>
#     <element tooltip="Scene3D's content is:&#10;((Background,Viewpoint?) | (Viewpoint?,Background?)).&#10;Hint:  Scene3D is a proposed X3D extension." name="Scene3D">
# 	<attribute tooltip="[DEF ID #IMPLIED]&#10;DEF defines a unique ID name for this node, referencable by other nodes.&#10;Hint:  descriptive DEF names improve clarity and help document a model." name="DEF"/>
# 	<attribute tooltip="[USE IDREF #IMPLIED]&#10;USE means reuse an already DEF-ed node ID, ignoring _all_ other attributes and children.&#10;Hint:  USEing other geometry (instead of duplicating nodes) can improve performance.&#10;Warning:  do NOT include DEF (or any other attribute values) when using a USE attribute!" name="USE"/>
# 	<attribute tooltip="[Background IDREF #REQUIRED]" name="Background"/>
# 	<attribute tooltip="[RenderInfo IDREF #REQUIRED]" name="RenderInfo"/>
# 	<attribute tooltip="[Root IDREF #REQUIRED]" name="Root"/>
# 	<attribute tooltip="[Viewpoint IDREF #REQUIRED]" name="Viewpoint"/>
#     </element>
#     <element tooltip="MultiTexture's content is:  ((Material, Surface*) | (Surface*, Material?)).&#10;Hint:  MultiTexture is a proposed X3D extension for Appearance." name="MultiTexture">
# 	<attribute tooltip="[DEF ID #IMPLIED]&#10;DEF defines a unique ID name for this node, referencable by other nodes.&#10;Hint:  descriptive DEF names improve clarity and help document a model." name="DEF"/>
# 	<attribute tooltip="[USE IDREF #IMPLIED]&#10;USE means reuse an already DEF-ed node ID, ignoring _all_ other attributes and children.&#10;Hint:  USEing other geometry (instead of duplicating nodes) can improve performance.&#10;Warning:  do NOT include DEF (or any other attribute values) when using a USE attribute!" name="USE"/>
# 	<attribute tooltip="[material IDREF #IMPLIED]" name="material"/>
# 	<attribute tooltip="[ambientSurface IDREF #IMPLIED]" name="ambientSurface"/>
# 	<attribute tooltip="[bumpSurface IDREF #IMPLIED]" name="bumpSurface"/>
# 	<attribute tooltip="[diffuseSurface IDREF #IMPLIED]" name="diffuseSurface"/>
# 	<attribute tooltip="[maskSurface IDREF #IMPLIED]" name="maskSurface"/>
# 	<attribute tooltip="[reflectionType (USER|USERCUBIC|USERSPHERE|REFLECT|CUBIC|SPHERE) &#34;USER&#34;." name="reflectionType"/>
# 	<attribute tooltip="[reflectionSurfaces IDREFS #IMPLIED]" name="reflectionSurfaces"/>
#     </element>
#     <element tooltip="MultiTextureTree's content is:  (RenderOp).&#10;Hint:  MultiTextureTree is a proposed X3D extension for Appearance." name="MultiTextureTree">
# 	<attribute tooltip="[DEF ID #IMPLIED]&#10;DEF defines a unique ID name for this node, referencable by other nodes.&#10;Hint:  descriptive DEF names improve clarity and help document a model." name="DEF"/>
# 	<attribute tooltip="[USE IDREF #IMPLIED]&#10;USE means reuse an already DEF-ed node ID, ignoring _all_ other attributes and children.&#10;Hint:  USEing other geometry (instead of duplicating nodes) can improve performance.&#10;Warning:  do NOT include DEF (or any other attribute values) when using a USE attribute!" name="USE"/>
#     </element>
#     <element tooltip="RenderOp's content is:&#10;((Surface|RenderOp),(Script,Vector?,&#10;Color?)?).&#10;Hint:  RenderOp is a proposed X3D extension." name="RenderOp">
# 	<attribute tooltip="[DEF ID #IMPLIED]&#10;DEF defines a unique ID name for this node, referencable by other nodes.&#10;Hint:  descriptive DEF names improve clarity and help document a model." name="DEF"/>
# 	<attribute tooltip="[USE IDREF #IMPLIED]&#10;USE means reuse an already DEF-ed node ID, ignoring _all_ other attributes and children.&#10;Hint:  USEing other geometry (instead of duplicating nodes) can improve performance.&#10;Warning:  do NOT include DEF (or any other attribute values) when using a USE attribute!" name="USE"/>
# 	<attribute tooltip="[factor: %SFFloatLabel; &#34;.5&#34;." name="factor"/>
# 	<attribute tooltip="[type (ADD|MODULATE|MODULATE2|LINEAR|SCRIPT) #REQUIRED]" name="type"/>
#     </element>
#     <element tooltip="Test note:  only use MultiTextureAppearance with MultiTextureIndexedFaceSet !!&#10;MultiTextureAppearance's content is:&#10;((Material,(ImageTexture|MovieTexture|&#10;PixelTexture|TextureTransform)*)|((&#10;ImageTexture|MovieTexture|PixelTexture|&#10;TextureTransform)*,Material+)).&#10;Hint:  MultiTextureAppearance is a proposed X3D extension for Appearance." name="MultiTextureAppearance">
# 	<attribute tooltip="[DEF ID #IMPLIED]&#10;DEF defines a unique ID name for this node, referencable by other nodes.&#10;Hint:  descriptive DEF names improve clarity and help document a model." name="DEF"/>
# 	<attribute tooltip="[USE IDREF #IMPLIED]&#10;USE means reuse an already DEF-ed node ID, ignoring _all_ other attributes and children.&#10;Hint:  USEing other geometry (instead of duplicating nodes) can improve performance.&#10;Warning:  do NOT include DEF (or any other attribute values) when using a USE attribute!" name="USE"/>
# 	<attribute tooltip="[diffuseMaterial IDREF #IMPLIED]" name="diffuseMaterial"/>
# 	<attribute tooltip="[diffuseMap IDREF #IMPLIED]" name="diffuseMap"/>
# 	<attribute tooltip="[diffuseMapTransform IDREF #IMPLIED]" name="diffuseMapTransform"/>
# 	<attribute tooltip="[envMapType (SPHERICAL|CUBIC) #IMPLIED]" name="envMapType"/>
# 	<attribute tooltip="[envMap IDREF #IMPLIED]" name="envMap"/>
# 	<attribute tooltip="[envMapTransform IDREF #IMPLIED]" name="envMapTransform"/>
# 	<attribute tooltip="[envMapMask IDREF #IMPLIED]" name="envMapMask"/>
# 	<attribute tooltip="[envMapMaskTransform IDREF #IMPLIED]" name="envMapMaskTransform"/>
# 	<attribute tooltip="[lightMap IDREF #IMPLIED]" name="lightMap"/>
# 	<attribute tooltip="[lightMapTransform IDREF #IMPLIED]" name="lightMapTransform"/>
#     </element>
#     <element tooltip="Test note:  only use MultiTextureIndexedFaceSet with MultiTextureAppearance !!&#10;MultiTextureIndexedFaceSet's content is:&#10;(Color?,Coordinate*,Normal?,TextureCoordinate*).&#10;Hint:  MultiTextureIndexedFaceSet is a proposed X3D extension for Geometry nodes." name="MultiTextureIndexedFaceSet">
# 	<attribute tooltip="[DEF ID #IMPLIED]&#10;DEF defines a unique ID name for this node, referencable by other nodes.&#10;Hint:  descriptive DEF names improve clarity and help document a model." name="DEF"/>
# 	<attribute tooltip="[USE IDREF #IMPLIED]&#10;USE means reuse an already DEF-ed node ID, ignoring _all_ other attributes and children.&#10;Hint:  USEing other geometry (instead of duplicating nodes) can improve performance.&#10;Warning:  do NOT include DEF (or any other attribute values) when using a USE attribute!" name="USE"/>
# 	<attribute tooltip="[coordIndex: &MFInt32Label; #IMPLIED]&#10;coordIndex indices provide order in which coordinates are applied.&#10;Order starts at index 0, commas are optional between sets&#10;use -1 to separate indices for each polygon." name="coordIndex"/>
# 	<attribute tooltip="[ccw: &SFBoolLabel; &#34;true&#34;]&#10;ccw = counterclockwise:  ordering of vertex coordinates orientation.&#10;Hint:  ccw false can reverse solid (backface culling) and normal-vector orientation." name="ccw"/>
# 	<attribute tooltip="[convex: &SFBoolLabel; &#34;true&#34;]&#10;Whether all polygons in a shape are convex (true), or possibly convex (false)&#10;A convex polygon is planar, does not intersect itself, and has all interior angles &lt; 180 degrees.&#10;Interchange profile hint:  only convex=true IndexedFaceSets are supported." name="convex"/>
# 	<attribute tooltip="[solid: &SFBoolLabel; &#34;true&#34;]&#10;Setting solid true means draw only one side of polygons (backface culling on),&#10;setting solid false means draw both sides of polygons (backface culling off).&#10;Warning: default value true can completely hide geometry if viewed from wrong side!" name="solid"/>
# 	<attribute tooltip="[creaseAngle: &SFFloatLabel; &#34;0&#34;] [0..infinity)&#10;creaseAngle defines angle (in radians) for determining whether adjacent polygons&#10;  are drawn with sharp edges or smooth shading.&#10;If angle between normals of two adjacent polygons is less than creaseAngle,&#10;  smooth shading is rendered across the shared line segment.&#10;Interchange profile hint:  only 0 and &#928; radians supported." name="creaseAngle"/>
# 	<attribute tooltip="[colorPerVertex: &SFBoolLabel; &#34;true&#34;]&#10;Whether ColorNode is applied per vertex (true) or per polygon (false)." name="colorPerVertex"/>
# 	<attribute tooltip="[colorIndex: &MFInt32Label; #IMPLIED]&#10;coordIndex indices provide order in which colors are applied." name="colorIndex"/>
# 	<attribute tooltip="[normalPerVertex: &SFBoolLabel; &#34;true&#34;]&#10;Whether Normal node is applied per vertex (true) or per polygon (false)." name="normalPerVertex"/>
# 	<attribute tooltip="[normalIndex: &MFInt32Label; #IMPLIED]&#10;Interchange profile hint:  this field may be ignored." name="normalIndex"/>
# 	<attribute tooltip="[texCoordIndex: &MFInt32Label; #IMPLIED]" name="texCoordIndex"/>
# 	<attribute tooltip="[diffuseTexCoord IDREF #IMPLIED]" name="diffuseTexCoord"/>
# 	<attribute tooltip="[diffusetexCoordIndex: &MFInt32Label; #IMPLIED]" name="diffusetexCoordIndex"/>
# 	<attribute tooltip="[envMaskTexCoord IDREF #IMPLIED]" name="envMaskTexCoord"/>
# 	<attribute tooltip="[envMaskTexCoordIndex: &MFInt32Label; #IMPLIED]" name="envMaskTexCoordIndex"/>
# 	<attribute tooltip="[envTexCoord IDREF #IMPLIED]" name="envTexCoord"/>
# 	<attribute tooltip="[envTexCoordIndex: &MFInt32Label; #IMPLIED]" name="envTexCoordIndex"/>
# 	<attribute tooltip="[lightTexCoord IDREF #IMPLIED]" name="lightTexCoord"/>
# 	<attribute tooltip="[lightCoordIndex: &MFInt32Label; #IMPLIED]" name="lightCoordIndex"/>
#     </element>
# -->
#
# brutzman, 18 February 2002
#	eliminated Browser attributes [evaluate browserResponse creationTargetNode] from Scene
# brutzman, 16 February 2002
#	renamed CoreProfile to InterchangeProfile
#	added Extensibility to allowed profile names, work under discussion
# jablonski, brutzman, 2 February 2002
#	fixed LatticeXvl XvlShell attributes as Booleans/SFBool
# brutzman, 2 February 2002
#	removed experimental readOnly attribute from <field>
# jablonski, brutzman, 26 January 2002
#	fully integrated LatticeXvl XvlShell, LatticeXvl-compact.dtd and many examples
#	  tested satisfactorily under Cortona and CosmoPlayer
#	  requires CLASSPATH modification to run, see readme.txt in examples/LatticeXvl
# brutzman, 22 January 2002
#	completed attribute value validation checks in X3dToVrml97.xsl !!
#	  fixed variety of previously undetected (!) errors throughout examples
#	changed default filename extension, renamed all example files .xml => .x3d
#	  propagated through all examples
#	GeoVrml => GeoSpatial profile
#	DIS profile => DistributedInteractiveSimulation profile
# brutzman, 21 January 2002
#	vrml97Hint => accessType
#	ExternProtoDeclare nodeTypeHint => nodeType, changing allowed values from CDATA to
#	  enumerated names matching all VRML 97 nodes and instantiable node types.
#	local DOCTYPE DTD address:  removed file:///c: for cross-platform flexibility
#	modified all example scenes to remove optional quotes from enumerations, so that
#	  <NavigationInfo type="&quot;EXAMINE&quot; &quot;WALK&quot;"/>
#	   becomes
#	  <NavigationInfo type="EXAMINE WALK"/> etc.
#	  Similarly for FontStyle justify/family and Fog type attributes.
#	  This silences messages from improved X3dToVrml97.xsl enumerations validation.
# brutzman, 4 November 2001
#	no children allowed in Inline
#	simplified definition for ProtoInstance
# brutzman, 10 October 2001
#	ProtoDeclare and ExternProtoDeclare no longer restricted to appear as first
#	  children of Scene, but can now appear in any order among children nodes.
# brutzman, diefenbach, puk 12 July 2001
#	<component> tags include originator, url and version attributes - still experimental.
# brutzman 8 July 2001
#	<component> tags are now first children of <head>, preceding <meta> tags.
# brutzman 4 July 2001
#	<field>, <ProtoDeclare>, <ExternProtoDeclare> gain annotation attributes for documentation
#		and appInfo descriptions, matching XML Schema tag structures and semantics.
#		This allows scene authors (and extension authors) to annotate and document new
#	  	Prototypes and their fields, in same manner as other X3D node definitions and tooltips.
#		This is an important and valuable capability since prototypes are the primary extension
#		mechanism for VRML/X3D.
#		Initial implementation:  attributes (rather than tags) for documentation and appInfo.
#		Future implementation may replace these simple attributes with documentation/appInfo
#		element tags from XML Schema, in order to enable internationalization (i18n) and thus
#		multiple simultaneous versions of these values in different languages.  Documentation:
#		http://www.w3.org/TR/xmlschema-0/#CommVers
#		http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#declare-annotation
# dick puk, brutzman, curtis blais 3 July 2001 (specification editors meeting)
#	Updated compact and compromise DTDs to match specification changes
#	  ref: 	"X3D spec meeting: VRML200x/X3D profiles, components, and headers," 4 May 2001
#		https://www.web3d.org/WorkingGroups/x3d-contributors/hypermail/2001/0438.html
#	  <X3D> profileForContainedScene becomes profile,
#		with valid enumeration names (Core|CoreInteractive|Base|Full).
#	  <component> indicates needed scene functionality above the given profile.
#		<component> tag(s) are optional first children of <X3D>, with string
#		attributes name (required) and level (optional).
#		Names are not constrained enumeration values, authors can define components.
#		Supported component names are (DIS|GeoVrml|HumanoidAnimation|Lattice|Nurbs|[other]).
#	  <head> is revised name for <Header> to exactly match XHTML/HTML, especially
#		since it contains no specified VRML/X3D header information
#	  <Scene> looks OK as is
#	  rename BaseLine Profile as Base Profile
#	  CoreInteractive profile under consideration by Browser working group, slightly
#		richer than strict Core Profile which corresponds to output-only devices
#	  rename DisJavaVrml component as DIS (IEEE Distributed Interactive Simulation Protocol)
#		and matched name of corresponding DIS.dtd, DIS-compact.dtd
#	  <field> gains boolean attribute readOnly, for field definitions inside ProtoDeclare,
#		ExternProtoDeclare and Script.  Implied default is readOnly false.
#		Native-node attributes have readOnly semantics defined in the
#		VRML 200x Part I abstract specification.
#	  <field> attribute vrml97hint (for enumerations eventIn, eventOut, field, exposedField)
#		maintained for backwards compatibility, but not needed for VRML 200x and later.
# jablonski, brutzman 1 July 2001
#	initial integration LatticeXvl profile, work in progress
# brutzman 1 July 2001
#	promoting to version 0.8 since NIST conformance suite passes
# brutzman 1 July 2001
#	changed URL for local-system backup DTD resource from
#		"file://localhost/C:/www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd"
#		        ^^^^^^^^^
#	  to
#		"file:///C:/www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd"
#	thus X3D scenes should have the following DOCTYPE:
#  	  <!DOCTYPE X3D PUBLIC
#	        "http://www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd"
#		"file:///C:/www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd">
#
#	Future work is to achieve the following DOCTYPE in working systems and applications:
#	  <!DOCTYPE X3D PUBLIC
#	        "+//ISO//DTD X3D//EN"
#	        "http://www.web3D.org/Specification/X3D/x3d-compact.dtd">
# brutzman 1 July 2001
#	shortened Document Type Declaration references for contained profiles inside DTD
#	  to direct, local SYSTEM links for more-stable response both online and offline.
#	  Example: <!ENTITY % GeoVrmlDTD SYSTEM "GeoVrml-compact.dtd">
# brutzman 25 May 2001
#	moved Switch from BaseLine to Core profile, supporting use of KeySensor
#	  activation keys under Core profile.  KeySensor still undergoing implementation
#	  and evaluation.
# brutzman 17 April 2001
#	subsetted TouchSensor fields for hitNormal, hitPoint and hitTexCoord
#	  to be BaseLine profile.  all other TouchSensor fields are Core profile.
# brutzman 10 April 2001
#	updated meta tag xml:lang language attribute reference
#	  [IETF RFC3066/BCP47] http://www.rfc-editor.org/bcp/bcp47.txt
# brutzman 12 March 2001
#	meta tag name attribute now required, since description also required
# goldberg 6 February 2001
#	Viewpoint 'examine' field is Rotation, not Vector3Float
# brutzman 3 February 2001
#	corrected missing * after SceneLeafNodes in x3d-compact.dtd to allow
#	  multiple children under ProtoInstance, not just single children
# couch, brutzman 1 February 2001
#	isOver, touchTime added to Anchor to match multiple interface with
#	  TouchSensorNodeType.  see VRML 97 specification, X3D Schema, SAI.
#   http://www.web3D.org/technicalinfo/specifications/vrml97/part1/nodesRef.html#Anchor
#   http://www.web3D.org/technicalinfo/specifications/vrml97/part1/concepts.html#4.6.7.3
#   http://www.web3D.org/TaskGroups/x3d/translation/X3dSchemaDraft.xml
#   http://www.web3D.org/TaskGroups/x3d/sai/javadoc/org/web3d/x3d/sai/Anchor.html
# brutzman, goldberg, williams 12/26/2000
#	Scene node exposes Browser class and has a DEF.  Added currentTime
#	    to match experimental testing of proposed additional field for
#	    VRML 97/200x.
# brutzman 12/17/2000
#	experimenting with renaming Color to ColorNode, in order to avoid
#	    SAI API naming collision with Color field type (i.e. rgb values)
# brutzman 11/22/2000
#	renamed Vector2, Vector2Array, Vector3, Vector3Array to
#	     Vector2Float, Vector2FloatArray, Vector3Float, Vector3FloatArray
#	     avoiding name collisions with GeoVrml Vector_Double types
# brutzman 11/19/2000
#	added FontStyle to list of allowed Prototype nodes
# brutzman 11/8/2000
#	added KeySensor to Core Profile and StringSensor to Baseline Profile
#	added Nurbs Profile
#	renamed Vrml97 Profile to Baseline Profile
# brutzman 10/8/2000
#	hid never-been-tested multitexture tags by IGNORE-ing X3dExtensions
# brutzman 8/13/2000
#	fixed oversight, allowed USE node as one of the allowed %ProtoNodes;
# brutzman 7/11/2000
#	integrated extension support and translation capabilities for
#	  GeoVrml.dtd (version 1.0) and HumanoidAnimation.dtd (version 1.1)
#	  tested via examples subdirectories, stylesheets and X3D-Edit
# brutzman 6/11/2000
#	fieldValue node:  attribute 'fieldName' is now 'name' for consistency
# brutzman 6/7/2000
#	ProtoInstance added as a valid %ProtoNodes; entity, simply allows
#	  ProtoInstance to be used to initialize fields of type Node/Nodes
# brutzman 5/23/2000
#	ExternProtoDeclare:  Vrml97typeHint relaxed to be any type value
# brutzman 5/17/2000
#	Inline edited to contain children (vice SceneNodes) in
#	  x3d-compromise.dtd, to permit possible external access.  Same
#	  for GeoInline.  This needs to be on our technical issues list.
# brutzman 5/16/2000
#	fixed example URLs at top of each DTD
# brutzman 5/1/2000
#	split out DTD into two versions:
#	  x3d-compromise.dtd   official version with    field-wrapper tags
#	  x3d-compact.dtd    unofficial version without field-wrapper tags
#		which can be used as part of a binary specification and for
#		autogeneration of class hierarchies that do not include fields as
#		actual classes in the tree
#	cleaned out following excerpts from DTD:
#<!--	Fields:  VRML 97 Part 5, Field and event reference
#	http://www.web3D.org/technicalinfo/specifications/vrml97/part1/
#
#	Notes:
#	1.  Use of NMTOKEN/NMTOKENS precludes inclusion of commas,
#		[brackets], (parentheses) while CDATA permits anything.
#		Use of NMTOKENS for MF types is not yet agreed upon.
#
#	2.  No separate tag for multifield URLs needed if no whitespace
#		permitted in the URLs (use percent-20 instead of 'blank' in URL)
#-->
#<!-- Complete, ordered version of Appearance -->
#<!--
#<!ELEMENT Appearance (
#   ((%MaterialNodes;)|%WildcardNodes;)?,
#   ((%TextureNodes;)|%WildcardNodes;)?,
#   ((%TextureTransformNodes;)|%WildcardNodes;)? ) >
#-->
#<!-- Complete, ordered version of ElevationGrid -->
#<!--
#<!ELEMENT ElevationGrid (
#   ((%ColorNodes;)|%WildcardNodes;)?,
#   ((%NormalNodes;)|%WildcardNodes;)?,
#   ((%TextureCoordinateNodes;)|%WildcardNodes;)?
#) >
#-->
#<!-- Complete, ordered version of IndexedFaceSet -->
#<!--
#<!ELEMENT IndexedFaceSet (
#   ((%ColorNodes;)|%WildcardNodes;)?,
#   ((%CoordinateNodes;)|%WildcardNodes;)?,
#   ((%NormalNodes;)|%WildcardNodes;)?,
#   ((%TextureCoordinateNodes;)|%WildcardNodes;)?
#) >
#-->
#
# brutzman 4/23/2000
#	Script node whitespace handling for contained script code:
#	  Script now has xml:space #FIXED to 'preserve' and it's child field tag
#	  has xml:space restored to (default | preserve) 'default'
#	  This forces preservation of whitespace as described in XML spec 2.10
#	  and more closely matches XHTML 1.0.  Also note that all line-feed
#	  combinations (#xA, #x13, #x13#xA) are mapped to #xA, the line-feed
#	  character as described in XML spec 2.11.  This means that CDATA
#	  sections enscapsulating script code are not required for authors to
#	  ensure proper handling of line feeds.
#  <field> is contained by <Script> and so must be reset back for normal
#     whitespace handling:
#     <!ATTLIST field
#    	xml:space              (default | preserve) "default"
#     etc. >
# brutzman 4/20/2000
#	ProtoInstance contents corrected to fieldValue plus any of allowable
#	  fields (wrapper tags)
# brutzman 4/17/2000
#	fixed some core-profile switch logic
# brutzman 4/13/2000
#	Script node:  url attribute only contains urls; actual script code is
#	now contained content inside CDATA sections.  This enables Script to
#	have scripting code that include characters such as line feeds, < &
#	etc.  This is similar to the XHTML approach.
# brutzman 4/3/2000
#	defaultValue element renamed initialValue
#	any-ordered field tags allowed for IndexedFaceSet with deterministic model
# grussbach, brutzman 2/30/2000
#	Corrected MultiTextureAppearance nondeterminism
# brutzman, grussbach 3/28/2000
#	Allowed USE as a WildcardNode in Core profile
#	Corrected some node-relationship nondeterminism
# brutzman 3/25/2000
#	Parameter entity <!ENTITY  % WildcardNodes  " (USE | ProtoInstance) " >
#	  defined to allow use of both USE node and ProtoInstance node, without
#	  further complicating node rules or breaking nondeterministic content
#	  model
# brutzman (editing), marrin, x3d-contributors 3/23/2000
#	Wrapper tags enabled is default configuration
#	Route renamed ROUTE
#	Proxy node becomes proxy field when wrapped
#	added USE node, allowed wherever ProtoInstance is
#	still lots of content conversion and testing for these changes
# brutzman 2/11/2000
#	Contents of top-level Scene node relaxed to contain any valid child
#	  nodes, as specified by VRML 97 specification para. 4.4.1 Root nodes.
# brutzman 1/31/2000
#	Added null-string parameter entity declarations under CoreProfile to
#	  permit strict parsing.  (These must be declared because they are
#	  referenced and checked for ]]> in otherwise-ignored Vrml97Profile
#	  constructs.)  No impact on scene graph, fixes a core profile bug.
# brutzman 1/30/2000
#	Added optional "wrapper tag" nodes.
# Context:  There are 26 contained SFNode/MFNode cases in the VRML 97 spec.
# These map to the following SFNode/MFNode field names.  It has been proposed
# that each of these field names also appear as tags, i.e. "wrapper tags,"
# supplementing DTD tags that correspond to VRML scene graph nodes.  Proxy
# is already handled as a child tag for Collision and did not require addition.
# Wrapper tags are enabled by placing <!ENTITY % WrapperTags "INCLUDE"> in the
# internal declaration (similar to an X3D profile setting), as shown in
# https://www.web3d.org/TaskGroups/x3d/translation/examples/WrapperTagsExample.xml
# https://www.web3d.org/TaskGroups/x3d/translation/examples/WrapperTagsExampleStyled.html
# https://www.web3d.org/TaskGroups/x3d/translation/examples/examples.html#WrapperTagsExample
#
#    _field_           _node(s)_
# x  appearance        Shape
# x  children          Anchor, Billboard, Collision, Group, Transform
# x  choice            Switch
# x  color             ElevationGrid, IndexedFaceSet, IndexedLineSet, PointSet
# x  coord             IndexedFaceSet, IndexedLineSet, PointSet
# x  fontStyle         Text
# x  geometry          Shape
# x  level             LOD
# x  material          Appearance
# x  normal            ElevationGrid, IndexedFaceSet
# *  proxy             Collision (not needed, already handled by Proxy tag)
# x  source            Sound
# x  texCoord          ElevationGrid, IndexedFaceSet
# x  texture           Appearance
# x  textureTransform  Appearance
#
# brutzman 2/8/2000
#	Scene node (i.e. root node) relaxed to contain any valid ChildrenNodes
#	  in accordance with VRML 97 specification paragraph 4.4.1 "Root nodes"
# brutzman 1/22/2000
#	Renamed PROTO-declare/EXTERNPROTO-declare/PROTO-instance to
#	  ProtoDeclare/ExternProtoDeclare/ProtoInstance in order to
#	  enable autogeneration of node classes from DTD/Schema
# brutzman 1/17/2000
#	field and defaultValue tags:  added USE attribute, as another way to
#	  initialize Node/Nodes data (see ECMAScriptAnnexExample2.wrl, .xml)
# brutzman 1/13/2000
#	defaultValue's attribute 'value' relaxed to contain CDATA, matching
#	  field's attribute 'value' datatype.  This might contain data of any
#	  simple VRML type.
# brutzman 1/11/2000
#	defaultValue tag's value attribute no longer #REQUIRED since it can
#	  contain Node or Nodes defaultValues.  'value' is #IMPLIED instead.
#	  defaultValue candidate contents match field tag:  ( %ProtoNodes; )*
#	  It is a type error to define the value attribute and contain content
#	  tags simultaneously.
# grussbach, brutzman 1/10/2000
#	Adjusted several definitions to avoid ambiguous content models:
#	  Collision, Shape, Scene3D, MultiTexture and MultiTextureAppearance.
# brutzman 1/10/2000
#	Added switches to turn 'children' wrapper tag back on if experimenting.
#	  see ChildrenTagExample.xml for use.
# marrin, puk, meeting members, brutzman 1/8/2000
#	Experimented with 'children' wrapper tag.  controversial.
#	Renamed DTD as x3d-draft.dtd and modified all example content to do so.
# marrin, brutzman 1/5/2000
#	NavigationInfo:  type is %MFString; not enumeration.  Note that
#	  multiple means are already available for encoding MFStrings as
#	  XML attribute values, including these examples:
#	  string="a &quot; quoted &#34; string" and string='a "quoted" string'
#	Font:  family and justify are also MFStrings, not enumeration.  Worth
#	  considering changing justify to justifyMajor and justifyMinor,
#	  with possible axis-alignment values (FIRST|BEGIN|MIDDLE|END)
#	  to enable these content values to become validatable.
# brutzman 1/3/2000
#	Added X3dExtensions for multitexture evaluation.
# brutzman 1/2/2000
#	defaultValue tag allowed to contain initializing nodes for
#	  SFNode/MFNode, identically to field tag
# brutzman 12/30/99
#	Minor rewriting of IndexedLineSet, PointSet, core IndexedFaceSet to
#	  eliminate look-ahead ambiguity.  All unordered children nodes
#	  combinations allowed.
# brutzman 12/29/99
#	Core profile and VRML 97 profile capabilities integrated in the DTD.
#	  Core profile nodes and corresponding field subsetting is listed in
#	  https://www.web3d.org/TaskGroups/x3d/specification/part1/CoreProfile.html
#	  https://www.web3d.org/TaskGroups/x3d/meetings/retreat-27-29september1999/notes.html#CoreProfile
#	  Example core profile scene available in CoreProfileExample.xml
#	Added extensions lineWidth to IndexedLineSet, pointSize to PointSet,
#	  as proposed by various contributors and discussed at 1999 retreat.
#	Removed verbose unordered DTD formulations for Appearance,
#	  ElevationGrid and IndexedFaceSet.  Concise unordered formulations
#	  remain active.  Ordered formulations are possible but commented.
#	  Exhaustive enumerations kept in changelog for reference purposes.
<!-- Fully enumerated unordered version of Appearance -->
<!--
<!ELEMENT Appearance (
	( (%MaterialNodes;)?, (%TextureNodes;)?, (%TextureTransformNodes;)? ) |
	( (%MaterialNodes;)?, (%TextureTransformNodes;)?, (%TextureNodes;)? ) |
	( (%TextureNodes;)?, (%MaterialNodes;)?, (%TextureTransformNodes;)? ) |
	( (%TextureNodes;)?, (%TextureTransformNodes;)?, (%MaterialNodes;)? ) |
	( (%TextureTransformNodes;)?, (%MaterialNodes;)?, (%TextureNodes;)? ) |
	( (%TextureTransformNodes;)?, (%TextureNodes;)?, (%MaterialNodes;)? ) |

	( (%MaterialNodes;)?, (%TextureNodes;)?, PROTO-instance? ) |
	( (%MaterialNodes;)?, (%TextureTransformNodes;)?, PROTO-instance? ) |
	( (%TextureNodes;)?, (%MaterialNodes;)?, PROTO-instance? ) |
	( (%TextureNodes;)?, (%TextureTransformNodes;)?, PROTO-instance? ) |
	( (%TextureTransformNodes;)?, (%MaterialNodes;)?, PROTO-instance? ) |
	( (%TextureTransformNodes;)?, (%TextureNodes;)?, PROTO-instance? ) |

	( (%MaterialNodes;)?, PROTO-instance?, (%TextureTransformNodes;)? ) |
	( (%MaterialNodes;)?, PROTO-instance?, (%TextureNodes;)? ) |
	( (%TextureNodes;)?, PROTO-instance?, (%TextureTransformNodes;)? ) |
	( (%TextureNodes;)?, PROTO-instance?, (%MaterialNodes;)? ) |
	( (%TextureTransformNodes;)?, PROTO-instance?, (%TextureNodes;)? ) |
	( (%TextureTransformNodes;)?, PROTO-instance?, (%MaterialNodes;)? ) |

	( PROTO-instance?, (%TextureNodes;)?, (%TextureTransformNodes;)? ) |
	( PROTO-instance?, (%TextureTransformNodes;)?, (%TextureNodes;)? ) |
	( PROTO-instance?, (%MaterialNodes;)?, (%TextureTransformNodes;)? ) |
	( PROTO-instance?, (%TextureTransformNodes;)?, (%MaterialNodes;)? ) |
	( PROTO-instance?, (%MaterialNodes;)?, (%TextureNodes;)? ) |
	( PROTO-instance?, (%TextureNodes;)?, (%MaterialNodes;)? ) |

	( (%MaterialNodes;)?, PROTO-instance?, PROTO-instance? ) |
	( (%TextureNodes;)?, PROTO-instance?, PROTO-instance? ) |
	( (%TextureTransformNodes;)?, PROTO-instance?, PROTO-instance? ) |
	( PROTO-instance?, (%MaterialNodes;)?, PROTO-instance? ) |
	( PROTO-instance?, (%TextureNodes;)?, PROTO-instance? ) |
	( PROTO-instance?, (%TextureTransformNodes;)?, PROTO-instance? ) |
	( PROTO-instance?, PROTO-instance?, (%MaterialNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, (%TextureNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, (%TextureTransformNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, PROTO-instance? )
) >
-->
<!-- Fully enumerated unordered version of ElevationGrid -->
<!--
<!ELEMENT ElevationGrid (
	( (%ColorNodes;)?, (%NormalNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%ColorNodes;)?, (%TextureCoordinateNodes;)?, (%NormalNodes;)? ) |
	( (%NormalNodes;)?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%NormalNodes;)?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%TextureCoordinateNodes;)?, (%ColorNodes;)?, (%NormalNodes;)? ) |
	( (%TextureCoordinateNodes;)?, (%NormalNodes;)?, (%ColorNodes;)? ) |

	( (%ColorNodes;)?, (%NormalNodes;)?, PROTO-instance? ) |
	( (%ColorNodes;)?, (%TextureCoordinateNodes;)?, PROTO-instance? ) |
	( (%NormalNodes;)?, (%ColorNodes;)?, PROTO-instance? ) |
	( (%NormalNodes;)?, (%ColorNodes;)?, PROTO-instance? ) |
	( (%TextureCoordinateNodes;)?, (%ColorNodes;)?, PROTO-instance? ) |
	( (%TextureCoordinateNodes;)?, (%NormalNodes;)?, PROTO-instance? ) |

	( (%ColorNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%ColorNodes;)?, PROTO-instance?, (%NormalNodes;)? ) |
	( (%NormalNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%NormalNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%TextureCoordinateNodes;)?, PROTO-instance?, (%NormalNodes;)? ) |
	( (%TextureCoordinateNodes;)?, PROTO-instance?, (%ColorNodes;)? ) |

	( PROTO-instance?, (%NormalNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%TextureCoordinateNodes;)?, (%NormalNodes;)? ) |
	( PROTO-instance?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%ColorNodes;)?, (%NormalNodes;)? ) |
	( PROTO-instance?, (%NormalNodes;)?, (%ColorNodes;)? ) |

	( (%ColorNodes;)?, PROTO-instance?, PROTO-instance? ) |
	( (%NormalNodes;)?, PROTO-instance?, PROTO-instance? ) |
	( (%TextureCoordinateNodes;)?, PROTO-instance?, PROTO-instance? ) |
	( PROTO-instance?, (%ColorNodes;)?, PROTO-instance? ) |
	( PROTO-instance?, (%NormalNodes;)?, PROTO-instance? ) |
	( PROTO-instance?, (%TextureCoordinateNodes;)?, PROTO-instance? ) |
	( PROTO-instance?, PROTO-instance?, (%ColorNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, (%NormalNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, PROTO-instance? )
) >
-->
<!-- Fully enumerated unordered version of ElevationGrid -->
<!-- IndexedFaceSet's TextureCoordinate (or a corresponding PROTO-instance)
     kept last to avoid further combinatoric explosion -->
<!--
<!ELEMENT IndexedFaceSet (
	( (%ColorNodes;)?, (%CoordinateNodes;)?, (%NormalNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%ColorNodes;)?, (%NormalNodes;)?, (%CoordinateNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%CoordinateNodes;)?, (%ColorNodes;)?, (%NormalNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%CoordinateNodes;)?, (%NormalNodes;)?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%NormalNodes;)?, (%CoordinateNodes;)?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%NormalNodes;)?, (%CoordinateNodes;)?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |

	( (%ColorNodes;)?, (%CoordinateNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%ColorNodes;)?, (%NormalNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%CoordinateNodes;)?, (%ColorNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%CoordinateNodes;)?, (%NormalNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%NormalNodes;)?, (%CoordinateNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%NormalNodes;)?, (%CoordinateNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |

	( (%ColorNodes;)?, PROTO-instance?, (%NormalNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%ColorNodes;)?, PROTO-instance?, (%CoordinateNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%CoordinateNodes;)?, PROTO-instance?, (%NormalNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%CoordinateNodes;)?, PROTO-instance?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%NormalNodes;)?, PROTO-instance?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( (%NormalNodes;)?, PROTO-instance?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |

	( PROTO-instance?, (%CoordinateNodes;)?, (%NormalNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%NormalNodes;)?, (%CoordinateNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%ColorNodes;)?, (%NormalNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%NormalNodes;)?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%CoordinateNodes;)?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%CoordinateNodes;)?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |

	( (%ColorNodes;)?, PROTO-instance?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%CoordinateNodes;)?, PROTO-instance?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( (%NormalNodes;)?, PROTO-instance?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%ColorNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%CoordinateNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, (%NormalNodes;)?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, (%ColorNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, (%CoordinateNodes;)?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, (%NormalNodes;)?, (%TextureCoordinateNodes;)? ) |

	( PROTO-instance?, PROTO-instance?, PROTO-instance?, (%TextureCoordinateNodes;)? ) |
	( PROTO-instance?, PROTO-instance?, PROTO-instance?, PROTO-instance? ) |

	( (%ColorNodes;)?, (%CoordinateNodes;)?, (%NormalNodes;)?, PROTO-instance? ) |
	( (%ColorNodes;)?, (%NormalNodes;)?, (%CoordinateNodes;)?, PROTO-instance? ) |
	( (%CoordinateNodes;)?, (%ColorNodes;)?, (%NormalNodes;)?, PROTO-instance? ) |
	( (%CoordinateNodes;)?, (%NormalNodes;)?, (%ColorNodes;)?, PROTO-instance? ) |
	( (%NormalNodes;)?, (%CoordinateNodes;)?, (%ColorNodes;)?, PROTO-instance? ) |
	( (%NormalNodes;)?, (%CoordinateNodes;)?, (%ColorNodes;)?, PROTO-instance? )
) >
-->
# brutzman, goldberg 12/28/99
#	moved these DTD update notes into file latest-brutzman-changelog.txt
#	  to reduce size and improve readability of current X3D DTD
#	added Appearance to allowable PROTO-declare nodes
#	WorldInfo allowed as top-level scene node, child node or PROTO node
#	Made all nodes extensible via tagname corresponding to PROTO-declare,
#	  retaining strong typing of new nodes.  User overrides a
#	  parameter-entity declaration for each new node, as shown in
#	  example scene SpinGroupExternalDeclaration.xml.
#	  Extendable node types:
#		<!ENTITY % AppearanceNodeExtensions  "" >
#		<!ENTITY % AudioClipNodeExtensions  "" >
#		<!ENTITY % BindableNodeExtensions  "" >
#		<!ENTITY % ColorNodeExtensions  "" >
#		<!ENTITY % CoordinateNodeExtensions  "" >
#		<!ENTITY % FontStyleNodeExtensions  "" >
#		<!ENTITY % GeometryNodeExtensions  "" >
#		<!ENTITY % GroupingNodeExtensions  "" >
#		<!ENTITY % InterpolatorNodeExtensions  "" >
#		<!ENTITY % LightNodeExtensions  "" >
#		<!ENTITY % MaterialNodeExtensions  "" >
#		<!ENTITY % NormalNodeExtensions  "" >
#		<!ENTITY % ScriptNodeExtensions  "" >
#		<!ENTITY % SensorNodeExtensions  "" >
#		<!ENTITY % ShapeNodeExtensions  "" >
#		<!ENTITY % SoundNodeExtensions  "" >
#
#		<!-- MovieTexture must appear twice: -->
#		<!ENTITY % MovieTextureNodeExtensions  "" >
#		<!ENTITY % TextureNodeExtensions  "" >
#
#		<!ENTITY % TextureCoordinateNodeExtensions  "" >
#		<!ENTITY % TextureTransformNodeExtensions  "" >
#		<!ENTITY % WorldInfoNodeExtensions  "" >
# brutzman 12/27/99
#	corrected malformed %TextureNodes; reference in AppearanceNodes
#	  (detected by Microsoft's IE 5.1 and xmlint)
# grussbach, brutzman 12/26/99
#	provided more concise, unordered, complete enumerations for
#	  Appearance, ElevationGrid, IndexedFaceSet.  simple ordered
#	  versions also there for testing (but commented out).  open issue
#	  whether ordered or unordered versions of these three nodes will
#	  be used, to be resolved as part of extensibility revamp.
# goldberg, brutzman 12/20/99
#	Renamed entity fieldTypes -> X3dFieldTypes, added Vrml97FieldTypes
#	  for comparison information
# brutzman, Heiko Grussbach 12/20/99
#	Strictly enumerated all possible combinations of child content
#	  containing PROTO-declare to avoid DTD ambiguity.  Modified
#	  Appearance, ElevationGrid, IndexedFaceSet (at least most combos),
#	  IndexedLineSet, PointSet and Shape.  This is necessary to allow
#	  general subsitution of PROTO-instance anywhere.
# brutzman 12/20/99
#	defaultValue:  renamed attribute 'name' to 'fieldName' for clarity
#	  (defaultValue resets field values inside a PROTO-instance)
#	FontStyle:  fixed enumeration values.
# brutzman 12/19/99
#	Added option vrml97Hint (eventIn | eventOut | field | exposedField)
#	  to <field> to allow precise backwards compatibility with VRML 97
#	  field semantics, if desired.  This attribute allows translation
#	  from VRML -> X3D -> VRML to be literal, otherwise map X3D fields
#	  backwards to VRML 97 exposedFields.
# brutzman, goldberg 12/19/99
#	Only allow <field> tag to describe interface inside PROTO-declare,
#	  EXTERNPROTO-declare and Script.  (In other words, disallow use of
#	  eventIn, eventOut, and exposedField.)  As discussed at the X3D
#	  retreat September 27-29 1999 and since, the "grand unified event
#	  model" maps eventIn, eventOut and  exposedField to field tag,
#	  while providing complete exposedField semantics (i.e. read,
#	  write, persistent state, availability).
# goldberg 12/18/99
#	Made 'IS' an attribute for connecting PROTO-DECLARE fields to
#	  provided PROTO node DEFs, instead of collecting 'IS' information
#	  as a separate <IS> tag.  Syntax for IS targets remains
#	  identical to VRML 97.
# brutzman 12/17/99
#	Removed excess PROTO-instance declaration from %ChildrenNodes.
# brutzman 12/16/99
#	Trying nodeTypeHint in EXTERNPROTO-declare.  This gives node type
#	  of the first node in the EXTERNPROTO definition.  Designated an
#	  #IMPLIED (optional) attribute, since translators might not be
#	  be able to access and check the first node of EXTERNPROTO files.
#	  Also helps problematic case where two EXTERNPROTOs are used as
#	  contained content, browser can more quickly check for node-type
#	  mismatch errors.
# brutzman 12/12/99
#	PROTO-declare and EXTERNPROTO-declare allowed to have zero or more
#	  fields (rather than one or more).
#	PROTO-instance can now appear anywhere in scene (no type checking
#	  of nodes performed by VRML 97.  Modifications include
#	  %GroupingNodes; and derivative definitions, Appearance,
#	  ElevationGrid, IndexedFaceSet, IndexedLineSet, PointSet,
#	  Shape, Sound and Text.
#	All combinations of node content now allowed under Appearance and
#	  ElevationGrid.
#	Collision Proxy nodes same as all Grouping nodes, matching VRML 97.
# brutzman 12/11/99
#	Added 'meta' tag to Header, following XHTML 1.0 draft recommendation
#	  http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
#	  so that X3D content can include compatible metadata.
#	  This requires further scrutiny (and hopefully reliance on the
#	  XHTML DTD without tagset duplication here) as we explore
#	  further interoperability and modularity with XHTML.
# brutzman 12/9/99
#	Relaxed all MF types from NMTOKENS to CDATA, by popular demand
#	  (i.e. to permit use of commas in long arrays)
# brutzman 12/8/99
#	Field types:  using parameter entity declarations for %SFBool; etc.
#	  to ensure consistency, correctness and clarity for all attributes.
#	  No change in functionality, just better DTD administration.
#	IndexedFaceSet:  allowed all 6 ordered combinations of Color, Coordinate
#	  and Normal as long as TextureCoordinate is last.
#	Route:  changed fromField and toField from CDATA to NMTOKEN for better
#	  validation
#	PROTO-instance:  corrected type of DEF to ID, USE to IDREF
# brutzman 12/5/99
#	FieldTypes:  added Vector2/Vector2Array, removed Vector4/Vector4Array,
#	  renamed Int/Ints to Integer/Integers for consistency
#	Added VisibilitySensor to BehaviorLeafNodes
#	Made some of the parameter entity constructions more consistent
#	  (e.g. moving parentheses around)
# brutzman 12/4/99
#	Allowed field tag to contain nodes, for initialization of Node/Nodes
#	  (see VRML 97 specification paragraph 4.8.2).  Thus 'value' attribute
#	  usage is relaxed from REQUIRED to IMPLIED, since initialization
#	  values are either passed in as attribute strings for basic types,
#	  or as content nodes for Node/Nodes types.
#	Added parameter entity for GeometricPropertyNodes (Coordinate, Color,
#	  Normal, TextureCoordinate) and made them allowable as content in
#	  PROTO-declare and PROTO-instance
#	  (see VRML 97 specification paragraph 4.6.3)
# brutzman 12/2/99
#	Reviewed full DTD, relaxed Node.field values from #REQUIRED to #IMPLIED
#	  for Inline.url, Normal.vector and TextureCoordinate.point.
#	  Again, this matches VRML 97 spec and permits NULL values.
#	  Similarly updated the corresponding latest-brutzman.profile
#	  for X3D-edit pop-up tips.
#	Added Node, Nodes to FieldTypes for event/field types
#	Added AppearanceNodes, GeometryNodes and nested PROTO-instance to list
#	  of eligible content contained by PROTO-declare
#	PROTO-declare can contain multiple nodes, to match VRML 97 specification
# brutzman 12/1/99
#	Coordinate's 'point' attribute and Color's 'color' attribute changed
#	  from #REQUIRED to #IMPLIED (i.e. such values are optional, not
#	  required) in order to match VRML 97 spec.  Another way to look at
#	  this change:   NULL values are now permitted.
#	Removed [square brackets] and (parentheses) from default values to
#	  match earlier decision to remove them from numeric fields.
# brutzman 11/27/99
#	Produced a number of fixes in Xj3D source:  cvs and build script work
#	Xeena able to present translated X3D scene using DTD without problems
#	DTD unchanged, upgraded to version 0.7
# brutzman 11/13/99
#	Verified a number of fixes accomplished in Xj3D, DTD unchanged
# brutzman 11/9/99
#	Sound:  simplified definition to ( AudioClip | MovieTexture )
#	  since no more than one (SFNode) is allowed
# brutzman 11/4/99
#	Testing with updated Xj3D - thanks Rick!
#	ROUTE changed to Route for translatability with current build,
#	  any opinions?  ROUTE and various *PROTO* tags might be capitalized
#	  to match VRML 97 or left single-cap only to match other tags
#	Route:  from, to, sourceEvent, targetEvent -> fromNode, fromField,
#	  toNode, toField.  Much clearer name suggestions from Xj3D.  Not a
#	  problem, VRML 97 specification does not specify strict names for
#	  these terms.
#
# brutzman 11/3/99
#	Collision:  can contain at most one Proxy, in any sequence with
#	  other ChildrenNodes.
# brutzman 11/2/99
#	PROTO-instance:  for overriding field defaults, now trying tag
#	  fieldReset -> defaultValue
#	FieldTypes naming:  Vector3s -> Vector3Array, Vector4s -> Vector4Array
#	field, exposedField, defaultValue:  made 'value' a REQUIRED attribute
#	eventIn value defaults to "" (just like eventOut value)
# brutzman 11/1/99
#	IS:  interface -> interfaceFieldName, internal -> internalFieldName
#	CylinderSensor:  trackpoint -> trackPoint to match VRML 97 eventOut
#	TouchSensor:  added hitTexCoord to match VRML 97 eventOut
#	Renamed the PROTO definition tag  PROTO -> PROTO-declare, renamed
#	  the PROTO instantiation tag PROTO-use -> PROTO-instance, renamed
#	  EXTERNPROTO instantiation tag EXTERNPROTO -> EXTERNPROTO-declare.
#	  Goal is clarity during development.  Note completely independent
#	  semantics from DEF/USE, thus just trying different tag names.
#	  PROTO-declare can contain eventIn/eventOut/field/exposedField/IS/nodes,
#	  EXTERNPROTO-declare is url plus eventIn/eventOut/field/exposedField.
#	  PROTO-instance can only contain reinitialized field/exposedField tags.
#	  PROTO-instance 'type' attribute renamed 'name' to match PROTO-declare.
#	  PROTO-instance contains fieldReset instead of field/exposedField
#	    so that individual field types don't have to be redeclared.
#	  Considering single unnested ID/IDREF namespace to eliminate ambiguity.
#	  Stay tuned, this whole area related to PROTOs is still in flux.
# brutzman 10/31/99
#	PROTO:  added exposedField, 'type' attribute renamed 'name', added IS,
#	  ProtoUse renamed PROTO-use
#	initial version of EXTERNPROTO added, looks pretty simple actually
#	<field>, <eventIn>, <eventOut>:  attribute 'id' renamed to 'name'
#	added <exposedField>, value required for field and exposedField
#	added IS inside PROTO, with attributes 'interface' and 'internal'
#	Open issue:  how do we include and check for named PROTO/EXTERNPROTO nodes
#	  when ID/IDREF limited to a single namespace
#	Inline:  allowed to contain SceneNodes (as demonstrated by Xj3D) in order to permit
#	  Inline'd content in the scene graph.  Note this allows storing intermediate results.
#	Type names:  changed Bool|Bools -> Boolean|Booleans, deleted Norm|Norms,
#	  changed Vec|Vecs -> Vector3|Vector3s|Vector4|Vector4s,
#	  added Image, Rotation|Rotations, String|Strings, Time|Times.
#	  Do people like these names better than SFVec3f|MFVec3f etc?
#	Finished initial testing of all VRML 97 nodes using DTD and Xj3D/Xeena
#	Keeping Don's testing build updated with Rick's bugfixes and CVS still a challenge
# brutzman 10/29/99
#	Appearances:  partially relaxed order, either Material or one of TextureNodes first
#	Various fields, especially eventOuts:  relaxed default value constraint from FIXED
#	  (i.e. only one valid constant value) to default value (any value OK, default
#	  provided if none given).  This permits validly saving/reloading/validating state,
#	  even of prior eventOut values.  Also eliminates perhaps-unnecessary warnings
#	  if non-default values are ever used.
#	  ** Need independent confirmation this makes sense, please!
#	IndexedFaceSet: partially relaxed order, either Color or Coordinate first
#	  (as long as they precede Normal?, TextureCoordinate?)
# brutzman 10/20/99
#	WorldInfo:  added to &SceneLeafNodes; since valid as a child node.  appropriate
#	  to also kept it as one of &SceneNodes; since no apparent repetition collision.
#	%BindableNodes; added to &ChildrenNodes;
#	Alphabetized %BehaviorLeafNodes;
#	Switch:  changed from ( %ChildrenNodes; )* to %Children; to match other
#	  grouping nodes (no semantic change)
#	Better alphabetized order of various ParameterEntities
# brutzman 10/19/99
#	Switch:  changed content from &GroupNodes; to %ChildrenNodes;
#	  (but now note %ChildrenNodes; doesn't match "children nodes" in
#	  "VRML 97 4.6.5 Grouping and children nodes")
# sonstein 10/18/99
#	fix PROTO's capitalization of (eventIn | eventOut | field)+
# 	remove 'byteCodes' from %BehaviorLeafNodes
# brutzman 10/18/99
#	IndexedFaceSet, IndexedLineSet:  allowed zero or one Coordinate node
#	  (instead of mandatory one) since coord NULL is legal
#	IndexedLineSet:  allowed Color, Coordinate in either order
#	Interpolators:  fraction and value fields consistently initialized
#	Pointset:  corrected definition, added DEF/USE
#	Switch:  changed content from Group to %GroupNodes;
#	Switch:  allow multiple group nodes under 'choice'
# brutzman 10/17/99
#	Are special conversion rules needed to handle embedded blanks in URL fields?
#	NavigationInfo's type attribute too restrictive using ( ANY | ... ) selections,
#	  needs to support zero-to-several of at least the following navigation types:
#	  "ANY", "WALK", "EXAMINE", "FLY", and "NONE"
#	  so relaxed attribute constraint to NMTOKENS #IMPLIED (default value implied)
#	  and translations should not include [ brackets around type values ]
#	Added consistent bind, bindTime, isBound events to Background, Fog, NavigationInfo
#	  and Viewpoint (the bindable nodes).  Note VRML 97 spec inconsistent about these.
#	  Default binding values false, since browser/user decides.
# brutzman 10/16/99
#	Changed DEF/USE back to ID/IDREF, translation issues posted on list
#	  https://www.web3d.org/WorkingGroups/x3d-contributors/hypermail/1999/1713.html
#	  https://www.web3d.org/WorkingGroups/x3d-contributors/hypermail/1999/1719.html
#	Added examine field to Viewpoint (at least temporarily while being discussed)
#	  https://www.web3d.org/WorkingGroups/x3d-contributors/hypermail/1999/1720.html
#	Auvo's redefined Shape permits arbitrary order for Appearance & GeometryNodes
# brutzman 10/14/99
#	Need to look at defaults for all eventIns & eventOuts
#	looking at using NMTOKEN instead of ID/IDREF for DEF/USE values -
#	  permits name repetition (like VRML 97), still enforces legal name strings
# brutzman 10/13/99
#	Added IndexedLineSet
#	Renamed Normal's normal field to vector to match VRML 97
#	Renamed TextureCoordinate's texCoord field to point to match VRML 97
#	PointSet:  changed order to ( ColorSet?, CoordinateSet) to match VRML 97
#	changed various interpolator eventIn fraction fields to #FIXED
#	to do:  ensure all events added, with attribute default #FIXED.  defaults?
#	added Script - check user-defined tags eventIn, field, eventOut
#	decapitalized eventIn, field, eventOut to match VRML 97
#	problem:  when USEing another node, the DEF'ed name is erroneously duplicated
#	Sound:  added MovieTexture as possible source
# brutzman 10/12/99
#	Updated lots of cosmetic spacing
#	Added colorPerVertex to IndexedFaceSet
# brutzman 10/11/99
#	Added PixelTexture to TextureNodes, created PixelTexture element
#	modified Shape to take only zero or one of GeometryNodes
#	alphabetized GeometryNodes to match VRML 97 spec
# brutzman 10/9/99
#	decided to enter attributes for field/exposedField/eventIn/eventOut 's in VRML
#	Background:  added bottomUrl, groundColor value "(0 0 0)", bindTime, isBound
#	added optional Header tag & kept Scene tag based on Auvo's suggestions
#	removed encoding attribute from X3D & Scene tags, since it's in xml 1.0 header
#	  X3D node is at top of tree.
#	  Three definitions are possible without/without/optional Scene tag:
#		<!ELEMENT X3D ( Scene ) >
#		<!ELEMENT X3D ( %SceneNodes; ) >
#		<!ELEMENT X3D ( ( %SceneNodes; ) | Scene ) >
#	  Best:  single optional Header tag (similar to HTML's HEAD) and
#	  single required Scene tag together:
#		<!ELEMENT X3D    ( Header? , Scene ) >
#		<!ELEMENT Header ( #PCDATA ) >
# brutzman 10/8/99
#	added bboxCenter, bboxCenter to Anchor, Billboard, Collision, Group,
#	  Inline, Transform
#	reordered fields and eliminated some .0's to match VRML 97 specification
#	Need to add <Proxy /> under Collision,
#	  added ProxyNodes parameter entity (since can't use Collision under proxy)
#	  split up Children into ChildrenNodes and Children to help Proxy definitions
#	  need to verify it works and nests...
#	Changed content particle repetition operator (from + to *) for
#	  parameter entity & Children, thus permitting absence of child nodes
#	Alphabetized nodes
#	Added X3D node (e.g. HTML spec), apparently can eliminate Scene now
#	Changed Anchor URL from REQUIRED to IMPLIED since VRML 97 permits empty URL
#	Changed TRUE to true, FALSE to false, matching DOM and Xj3D
# v0.2.5
# rmgold 8/03/99
#	set bindables bind to default TRUE since that works properly now
# rmgold 7/23/99
#	moved Coordinate,Normal,Color,TextureCoordinate data
#	   from PCDATA to an attribute CDATA
#	moved Index to CDATA attribute of IndexedFaceSet
# rmgold 7/19/99
#	reverted Text
# rmgold 7/16/99
#	collapsed Geometry tag
# rmgold 6/30/99                cleaned up Proto section
# rmgold 5/25/99
#	comment the html generator and add link to parser, more comment cleaning
# brutzman 5/24/99
#	DTD naming convention:  latest.dtd & latest.html, older versions dated
# rmgold 5/24/99
#	followed more ENTITY defs
# brutzman, glidden 5/21/99	defined parameter entities for GroupNodes and BindableNodes
#	(used by Scene and Proto), named dtd, capitalized DEF and USE,
#	renamed Proto, ProtoDef, Route to PROTO, PROTObody and ROUTE;
#	changed PROTO "type" to "name"
#	expect that PROTOs really need to be internal entities (i.e. DTD fragments)
#	    in x3dfile.xml scenes, need to scrub VRML primitive type enumerations
# rmgold 5/20/99
#	added ENTITY DEFs for Children, FieldTypes
#	renamed ProtoInstance to X3D (0.2.3)
# rmgold 5/13/99
#	reintroduced Proto, there is a minimally non validating
#	way to do this
# rmgold 5/12/99
#	removed Interface def, removed Proto there is no clean
#	way to do this
# rmgold 5/12/99
#	moved around Proto, new ProtoDef, DEF/USE ( 0.2.1 )
#	fixed CoordinateSet and cousins to use PCDATA
#	fixed ByteCode to use Interface for consistency
#	with Proto
#	fixed missing Bool | Bools field types
# rmgold 5/11/99
#	fixed various vrml abuse ( Geometries directly in Group for example )
#	renamed root node to "scene" ( 0.1.2 )
# 	added Proto and Interface def'ns
# brutzman 5/10/99
#	fixed lots of syntax abuse - now xeena will parse no problem ( 0.1.1 )
# rmgold 5/6/99
#	fixed axisOfRotation field in Billboard
#	fixed group types in toplevel scene
#	fixed Index attlist
# rmgold 5/5/99
#	completed most nodes ( version 0.1 )
-->

<!-- Original design notes follow -->

<!-- for the purposes of mapping the VRML97 specification pretty much
Open questions:

#
# - should everything be capitalized? this was the vrml tradition, and the
#   style for class types. but tags have a different tradition, that is,
#   multiworded tags will have to be "_"'d since they are case insensitive.

# - Note the nonvalidation with DEF and USE. Implementors will have to
#   ensure that an Element that use's does not have other Attributes.
#   Also, moving USE into a node attribute broke the REQUIRED specification
#   for sensor/interpolator names, but not a big problem.

# - This raises an interesting propsosal in itself, yet another way to
#   prototype and define. It needs to be decided whether an element
#   that has a USE IDREF can override some or any of the original def'd
#   attributes. This kinda breaks the idea of shared references, but,
#   for some of us this idea is broken anyway. ( see comment somewhere about
#   multithreaded traversers ).
#   This provides a simple way to subclass and derive. Otherwise,
#   it is up to the implementor to make certain that an Element that
#   contains a USE Attribute contain no other.

-->


<!-- CDATA field types fall into the following ( ed. lets remove [] and ()? )
     type	example
     Bool	"true"
     Bools	"[ true false ...  true ]"
     Vec	"(a b c)"
     Float	"x.0"
     Floats	[ a.x b.y ... z.z ]
     Color	"(r g b)" where r,g,b 0.0=>x=>1.0
     Colors
     Norm	"(i j k)" where sqrt(i*i + j*j + k*k) == 1.0
     Norms
     Int	"I"
     Vecs	"[ a b c, d e f, ... , g h i ]
     Ints	"[ A B C ... D ]"
     Rotation
     Rotations

See sample parser generator written using JavaCC at:
http://www.web3D.org/TaskGroups/x3d/sun/X3DFieldParser.html

-->
<!-- other conventions that popped up

     The simple rule was followed for most cases that vrml sf/mf nodes map
     to element's sub elements, and fields mapped to attlists. This may
     conflict with vrml97 sense of fields names for nodes, but those can
     additionally be supplied.

     strictly eventOut's are mapped to FIXED attributes which may update
     at runtime

     Script fields need Event entities

     A ROUTE Element

-->

<!-- merged as attribute in the <field> tag
<!ELEMENT IS    EMPTY >
<!ATTLIST IS
	interfaceFieldName   NMTOKEN  #REQUIRED
	 internalFieldName   NMTOKEN  #REQUIRED>
-->

<!-- "grand unified event model" maps eventIn, eventOut, exposedField
     to field tag, with complete exposedField semantics
<!ELEMENT eventIn EMPTY >
<!ATTLIST eventIn
	name  NMTOKEN          #REQUIRED
	type  ( %X3dFieldTypes; ) #REQUIRED
	value CDATA            "">

<!ELEMENT eventOut EMPTY >
<!ATTLIST eventOut
	type  ( %X3dFieldTypes; ) #REQUIRED
	name  NMTOKEN          #REQUIRED
	value CDATA            "">

<!ELEMENT exposedField    EMPTY >
<!ATTLIST exposedField
	type  ( %X3dFieldTypes; ) #REQUIRED
	name  NMTOKEN          #REQUIRED
	value CDATA            #REQUIRED>
-->

<!-- Main problem with Proto is that the original intent
#        was to be able to create vrml "tags" on the fly, but
#        not sure this is part of XML.  As a good compromise the
#        following can do something very similar:  name of PROTO
#        goes in the name field.
-->

<!--
#    Here PCDATA contains the utf8 for the fieldName + "=" + fieldValue pairs

<!ELEMENT PROTO-use (#PCDATA)>
<!ATTLIST PROTO-use
     DEF  NMTOKEN  #IMPLIED
     USE  NMTOKEN  #IMPLIED
     type NMTOKEN  #REQUIRED>
#-->

<!-- Example PROTO Usage
# <PROTO type="myBox">
#    <field id="mySize" type="vec">
#    <Box size="mySize">
# </PROTO>
#
# then somewhere else in a document
#
# < PROTO-use type="myBox" DEF="aTwoThreeTenBox" >mySize="2 3 10"</PROTO-use>
#
# and thereafter
#
# < PROTOUse USE="aTwoThreeTenBox"/>
#
# Note use of something more validating than CDATA for
# field values will break IS maps, and the ID in Fields is fairly
# meaningless. This is however more desirable than a PROTO Processing Instruction.
-->
<!-- pretty html generated with code2html.pl 0.6.2 by ppalfrad@cosy.sbg.ac.at -->


