HAnimDisplacer : X3DGeometricPropertyNode {
  default-container-field: displacers

  MFInt32  [in,out] coordIndex    []
    range: [0,Inf) or -1
  MFVec3f  [in,out] displacements []
  SFString [in,out] name          ""
  SFFloat  [in,out] weight        0.0
    range: (-Inf,Inf)
}

HAnimHumanoid : X3DChildNode, X3DBoundedObject {
  SFVec3f    [in,out] center           0 0 0
    range: (-Inf,Inf)
    change: chTransform
  MFString   [in,out] info             []
  MFNode     [in,out] joints           []
    range: HAnimJoint
  SFString   [in,out] name             ""
  SFRotation [in,out] rotation         0 0 1 0
    range: (-Inf,Inf)|[-1,1]
    change: chTransform
  SFVec3f    [in,out] scale            1 1 1
    range: (0,Inf)
    change: chTransform
  SFRotation [in,out] scaleOrientation 0 0 1 0
    range: (-Inf,Inf)|[-1,1]
    change: chTransform
  MFNode     [in,out] segments         []
    range: HAnimSegment
  MFNode     [in,out] sites            []
    range: HAnimSite
  MFNode     [in,out] skeleton         []
    range: HAnimJoint, HAnimSite
  MFNode     [in,out] skin             []
    range: X3DChildNode
  SFNode     [in,out] skinCoord        NULL
    range: X3DCoordinateNode
  SFNode     [in,out] skinNormal       NULL
    range: X3DNormalNode
  SFVec3f    [in,out] translation      0 0 0
    range: (-Inf,Inf)
    change: chTransform
  SFString   [in,out] version          ""
  MFNode     [in,out] viewpoints       []
    # X3D specificaion indicates that HAnimSite is allowed here,
    # but textual description in HAnim specification indicates that
    # it's an error: viewpoints should be allowed here.
    # Confirmed by testing models from
    # http://www.web3d.org/x3d/content/examples/Basic/HumanoidAnimation/
    range: HAnimSite, X3DViewpointNode, ViewpointGroup
  SFVec3f    []       bboxCenter       0 0 0
    range: (-Inf,Inf)
  SFVec3f    []       bboxSize         -1 -1 -1
    range: [0,Inf) or -1 -1 -1
}

HAnimJoint : X3DGroupingNode {
  SFVec3f    [in,out] center           0 0 0
    range: (-Inf,Inf)
    change: chTransform
  MFNode     [in,out] displacers       []
    range: HAnimDisplacer
  SFRotation [in,out] limitOrientation 0 0 1 0
    range: (-Inf,Inf)|[-1,1]
  MFFloat    [in,out] llimit           []
    range: (-Inf,Inf)
  SFString   [in,out] name             ""
  SFRotation [in,out] rotation         0 0 1 0
    range: (-Inf,Inf)|[-1,1]
    change: chTransform
  SFVec3f    [in,out] scale            1 1 1
    range: (0,Inf)
    change: chTransform
  SFRotation [in,out] scaleOrientation 0 0 1 0
    range: (-Inf,Inf)|[-1,1]
    change: chTransform
  MFInt32    [in,out] skinCoordIndex   []
  MFFloat    [in,out] skinCoordWeight  []
  MFFloat    [in,out] stiffness        [0, 0, 0]
    range: [0,1]
  SFVec3f    [in,out] translation      0 0 0
    range: (-Inf,Inf)
    change: chTransform
  MFFloat    [in,out] ulimit           []
    range: (-Inf,Inf)
}

HAnimSegment : X3DGroupingNode {
  SFVec3f  [in,out] centerOfMass     0 0 0
    range: (-Inf,Inf)
  SFNode   [in,out] coord            NULL
    range: X3DCoordinateNode
  MFNode   [in,out] displacers       []
    range: HAnimDisplacer
  SFFloat  [in,out] mass             0
    range: [0,Inf)
  MFFloat  [in,out] momentsOfInertia [0, 0, 0, 0, 0, 0, 0, 0, 0]
    range: [0,Inf)
  SFString [in,out] name             ""

  # Segment.rotation, scale, translation are extensions of Blaxxun
  # avatars, at least that's what
  # http://tecfa.unige.ch/vrml/objects/avatars/blaxxun/ suggests.
  # They are not conforming to HAnim 1.0 or 200x specification.
  SFRotation [in,out] rotation         0 0 1 0
    range: (-Inf,Inf)|[-1,1]
    change: chTransform
  SFVec3f    [in,out] scale            1 1 1
    range: (0,Inf)
    change: chTransform
  SFVec3f    [in,out] translation      0 0 0
    range: (-Inf,Inf)|[-1,1]
    change: chTransform
}

HAnimSite : X3DGroupingNode {
  SFVec3f    [in,out] center           0 0 0
    range: (-Inf,Inf)
    change: chTransform
  SFString   [in,out] name             ""
  SFRotation [in,out] rotation         0 0 1 0
    range: (-Inf,Inf)|[-1,1]
    change: chTransform
  SFVec3f    [in,out] scale            1 1 1
    range: (0,Inf)
    change: chTransform
  SFRotation [in,out] scaleOrientation 0 0 1 0
    range: (-Inf,Inf)|[-1,1]
    change: chTransform
  SFVec3f    [in,out] translation      0 0 0
    range: (-Inf,Inf)|[-1,1]
    change: chTransform
}
