# Special abstract.
# X3DBoundedObject {
#   SFVec3f [] bboxCenter 0 0 0
#     range: (-Inf,Inf)
#   SFVec3f [] bboxSize   -1 -1 -1
#     range: [0,Inf) or -1 -1 -1
# }

X3DGroupingNode : X3DChildNode, X3DBoundedObject {
  MFNode  [in]     addChildren
    range: X3DChildNode
  MFNode  [in]     removeChildren
    range: X3DChildNode
  MFNode  [in,out] children       []
    # Add TAbstractGeometryNode_1 to allow VRML 1.0 geometry nodes (that cannot be TAbstractChildNode)
    # to be present at top-level of the file.
    # Testcase: demo-models/vrml_1/castle_extensions/multi_root.wrl
    range: X3DChildNode, TAbstractGeometryNode_1
    change: chGroupChildren
  SFVec3f []       bboxCenter     0 0 0
    range: (-Inf,Inf)
    # Note that bboxCenter documentation string it used for generated "BBox: TBox3D" property.
    doc: You can provide a manually-calculated bounding box of the group here, for optimization purposes. @italic(Ignored for now.) Leave this field as empty (TBox3D.Empty) to let the engine calculate best bounding box automatically. @seealso TAbstractShapeNode.BBox
  SFVec3f []       bboxSize       -1 -1 -1
    range: [0,Inf) or -1 -1 -1
  SFBool  [in,out] visible        TRUE
    not-slim
    doc: Is this group visible (@italic(not implemented yet)). While this is not implemented for an entire group, note that you can use @link(TAbstractShapeNode.Visible) to toggle visibility of each shape.
  SFBool  [in,out] bboxDisplay    FALSE
    not-slim
    doc: Is the bounding box of this group visible (@italic(not implemented yet)). While this is not implemented for an X3D group, note that you can use @link(TDebugTransformBox) to easily display bounding box of a whole @link(TCastleTransform).
}

Group : X3DGroupingNode {
}

StaticGroup : X3DChildNode, X3DBoundedObject {
  MFNode  []       children   []
    range: X3DChildNode
    change: chGroupChildren
  SFVec3f []       bboxCenter 0 0 0
    range: (-Inf,Inf)
  SFVec3f []       bboxSize   -1 -1 -1
    range: [0,Inf) or -1 -1 -1
}

Switch : X3DGroupingNode {
  SFInt32 [in,out] whichChoice    -1
    range: [-1,Inf)
    change: chSwitch2
}

Transform : X3DGroupingNode {
  SFVec3f    [in,out] center           0 0 0
    range: (-Inf,Inf)
    doc: Center point around which the @link(Rotation) and @link(Scale) is performed.
    change: chTransform
  SFRotation [in,out] rotation         0 0 1 0
    range: [-1,1] or (-Inf,Inf)
    doc: Rotate children in 3D, around a specified axis. Rotation is expressed as a 4D vector, in which the first 3 components specify the rotation axis (does not need to be normalized, but must be non-zero) and the last component is the rotation angle @italic(in radians). Rotation is done around @link(Center).
    change: chTransform
  SFVec3f    [in,out] scale            1 1 1
    range: (-Inf, Inf)
    doc: Scale in 3D. Scaling is done around @link(Center) and with orientation given by @link(ScaleOrientation). Note about negative scale: We do the best we can to work with @italic(any) scale value, even negative or zero. But usually, it's best to keep the scale positive. See the @link(TCastleTransform.Scale) documentation for some good guidelines about the scale.
    change: chTransform
  SFRotation [in,out] scaleOrientation 0 0 1 0
    range: [-1,1] or (-Inf,Inf)
    doc: Orientation in which 3D @link(Scale) is performed.
    change: chTransform
  SFVec3f    [in,out] translation      0 0 0
    range: (-Inf,Inf)
    doc: Translation (move) the children nodes.
    change: chTransform
}
