X3DGeometryNode : X3DNode {
  default-container-field: geometry
}

X3DGeometricPropertyNode : X3DNode {
}

X3DColorNode : X3DGeometricPropertyNode {
  default-container-field: color
  SFString   []   mode   "REPLACE"
    range: ["REPLACE","MODULATE"]
    enumerated-type: TColorMode ColorModeNames cmReplace
}

X3DComposedGeometryNode : X3DGeometryNode {
  MFNode [in,out] attrib          []
    range: X3DVertexAttributeNode
    not-slim
    change: chGeometry
  SFNode [in,out] color           NULL
    range: X3DColorNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFNode [in,out] coord           NULL
    range: X3DCoordinateNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFNode [in,out] fogCoord        NULL
    range: FogCoordinate
    not-slim
    change: chGeometry
  SFNode [in,out] normal          NULL
    range: X3DNormalNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFNode [in,out] tangent         NULL
    range: Tangent
    change: chGeometry
    doc: Tangent vectors describe the tangent coordinate-space, used by the bump mapping algorithm. If specified, the ordering of tangents should be the same as normals, i.e. they should follow the NormalPerVertex and such properties.
    setter-before: MoveShapeAssociations
  SFNode [in,out] texCoord        NULL
    range: X3DTextureCoordinateNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFBool []       ccw             TRUE
    change: chGeometry
  SFBool []       colorPerVertex  TRUE
    change: chGeometry
  SFBool []       normalPerVertex TRUE
    change: chGeometry
  SFBool []       solid           TRUE
    change: chGeometry

  # CASTLE GAME ENGINE EXTENSIONS:
  MFVec3f    [in,out]      radianceTransfer  []
    not-slim
    change: chGeometry
}

X3DCoordinateNode : X3DGeometricPropertyNode {
  default-container-field: coord
}

X3DNormalNode : X3DGeometricPropertyNode {
  default-container-field: normal
}

ClipPlane : X3DChildNode {
  SFBool  [in,out] enabled  TRUE
    change: chClipPlane
  SFVec4f [in,out] plane    0 1 0 0
    range: [0,1]
    change: chClipPlane
}

Color : X3DColorNode {
  MFColor [in,out] color    []
    range: [0,1]
    change: chColorNode
}

ColorRGBA : X3DColorNode {
  MFColorRGBA [in,out] color    []
    range: [0,1]
    change: chColorNode
}

Coordinate : X3DCoordinateNode {
  MFVec3f [in,out] point    []
    range: (-Inf,Inf)
    change: chCoordinate
}

IndexedLineSet : X3DGeometryNode {
  MFInt32 [in]     set_colorIndex
  MFInt32 [in]     set_coordIndex
  MFNode  [in,out] attrib         []
    range: X3DVertexAttributeNode
    not-slim
    change: chGeometry
  SFNode  [in,out] color          NULL
    range: X3DColorNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFNode  [in,out] coord          NULL
    range: X3DCoordinateNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFNode  [in,out] fogCoord       []
    range: FogCoordinate
    not-slim
    change: chGeometry
  MFInt32 []       colorIndex     []
    range: [0,Inf) or -1
    change: chGeometry
  SFBool  []       colorPerVertex TRUE
    change: chGeometry
  MFInt32 []       coordIndex     []
    range:  [0,Inf) or -1
    change: chGeometry
  SFString []      mode   "STRIP"
    range: ["STRIP","LOOP","PAIR"]
    enumerated-type: TLineMode LineModeNames lmStrip
    doc: How to interpret the vertexes: as a set of strips (connected line segments), loops (connected line segments with additional segment to form a loop), or just pairs of vertexes (each pair defines a line segment). See possible @link(TLineMode) values for details.
    change: chGeometry
}

IndexedTriangleFanSet : X3DComposedGeometryNode {
  MFInt32 [in]     set_index       []
    range: [0,Inf) or -1
  MFInt32 []       index           []
    range: [0,Inf) or -1
    change: chGeometry
}

IndexedTriangleSet : X3DComposedGeometryNode {
  MFInt32 [in]     set_index       []
    range: [0,Inf)
  MFInt32 []       index           []
    range: [0,Inf)
    change: chGeometry
}

IndexedTriangleStripSet : X3DComposedGeometryNode {
  MFInt32 [in]     set_index       []
    range: [0,Inf) or -1
  MFInt32 []       index           []
    range: [0,Inf) or -1
    change: chGeometry
}

LineSet : X3DGeometryNode {
  MFNode  [in,out] attrib         []
    range: X3DVertexAttributeNode
    not-slim
    change: chGeometry
  SFNode  [in,out] color          NULL
    range: X3DColorNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFNode  [in,out] coord          NULL
    range: X3DCoordinateNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFNode  [in,out] fogCoord       []
    range: FogCoordinate
    not-slim
    change: chGeometry
  MFInt32 [in,out] vertexCount    []
    range: [2,Inf)
    change: chGeometry
    doc: """
    Array of counts that split the line vertexes. Exact interpretation depends on the @link(Mode) value:

    @definitionList(
      @itemLabel lmStrip
      @item(Render a number of line strips.
        Each count on this array is the count of vertexes in a line strip.
        Each line strip is a polyline, i.e. a sequence of lines from the first vertex
        (in given line strip) to the last vertex (again, in given line strip).)

      @itemLabel lmLoop
      @item(Render a number of line loops.
        Each count on this array is the number of vertexes in a line loop.
        Each line loop is a closed polyline, i.e. a sequence of lines from the first vertex
        (in given line loop)
        to the last vertex (again, in given line loop).
        Moreover, within each line loop, there's a closing line from last vertex
        to the first.)

      @itemLabel lmPair
      @item(Render a number of line segments.
        Counts of this array are ignored, so there's not much point in calling SetVertexCount.
        In this mode, every 2 vertexes define a line segment.)
    )
    """
  SFString []      mode   "STRIP"
    range: ["STRIP","LOOP","PAIR"]
    enumerated-type: TLineMode LineModeNames lmStrip
    doc: How to interpret the vertexes: as a set of strips (connected line segments), loops (connected line segments with additional segment to form a loop), or just pairs of vertexes (each pair defines a line segment). See possible @link(TLineMode) values for details.
    change: chGeometry
}

Normal : X3DNormalNode {
  MFVec3f [in,out] vector   []
    range: [-1,1]
    change: chNormal
}

Tangent : X3DGeometricPropertyNode {
  default-container-field: tangent
  MFVec3f [in,out] vector   []
    range: [-1,1]
    change: chTangent
}

PointSet : X3DGeometryNode {
  MFNode [in,out] attrib   []
    range: X3DVertexAttributeNode
    not-slim
    change: chGeometry
  SFNode [in,out] color    NULL
    range: X3DColorNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFNode [in,out] coord    NULL
    range: X3DCoordinateNode
    change: chGeometry
    setter-before: MoveShapeAssociations
  SFNode [in,out] fogCoord []
    range: FogCoordinate
    not-slim
    change: chGeometry
}

TriangleFanSet : X3DComposedGeometryNode {
  MFInt32 [in,out] fanCount        []
    range: [3,Inf)
    change: chGeometry
}

TriangleSet : X3DComposedGeometryNode {
}

TriangleStripSet : X3DComposedGeometryNode {
  MFInt32 [in,out] stripCount      []
    range: [3,Inf)
    change: chGeometry
}
