X3DPickableObject {
  MFString [in,out] objectType "ALL" ["ALL"|"NONE"|"TERRAIN"|...]
  SFBool   [in,out] pickable   TRUE
}

X3DPickSensorNode : X3DSensorNode {
  SFBool   [in,out] enabled          TRUE
  SFNode   [in,out] metadata         NULL      [X3DMetadataObject]
  MFString [in,out] objectType       "ALL"     ["ALL","NONE","TERRAIN",...]
  SFNode   [in,out] pickingGeometry  NULL      [X3DGeometryNode]
  MFNode   [in,out] pickTarget       []        [X3DGroupingNode|X3DShapeNode|X3DInlineNode]
  MFNode   [out]    pickedGeometry
  SFBool   [out]    isActive
  SFString []       intersectionType "BOUNDS"  ["GEOMETRY"|"BOUNDS"]
  SFString []       sortOrder        "CLOSEST" ["ANY"|"CLOSEST"|"ALL"|"ALL_SORTED"]
}

LinePickSensor : X3DPickSensorNode {
  SFBool   [in,out] enabled                 TRUE
  SFNode   [in,out] metadata                NULL      [X3DMetadataObject]
  MFString [in,out] objectType              "ALL"     ["ALL","NONE","TERRAIN",...]
  SFNode   [in,out] pickingGeometry         NULL      [IndexedLineSet|LineSet]
  MFNode   [in,out] pickTarget              []        [X3DGroupingNode|X3DShapeNode|X3DInlineNode]
  SFBool   [out]    isActive
  MFNode   [out]    pickedGeometry
  MFVec3f  [out]    pickedNormal
  MFVec3f  [out]    pickedPoint
  MFVec3f  [out]    pickedTextureCoordinate
  SFString []       intersectionType        "BOUNDS"  ["GEOMETRY"|"BOUNDS"]
  SFString []       sortOrder               "CLOSEST" ["ANY"|"CLOSEST"|"ALL"|"ALL_SORTED"]
}

PickableGroup : X3DGroupingNode, X3DPickableObject {
  MFNode   [in]     addChildren
  MFNode   [in]     removeChildren
  MFNode   [in,out] children       []       [X3DChildNode]
  SFNode   [in,out] metadata       NULL     [X3DMetadataObject]
  MFString [in,out] objectType     "ALL"    ["ALL","NONE","TERRAIN",...]
  SFBool   [in,out] pickable       TRUE
  SFVec3f  []       bboxCenter     0 0 0    (-Inf,Inf)
  SFVec3f  []       bboxSize       -1 -1 -1 [0,Inf) or -1 -1 -1
}

PointPickSensor : X3DPickSensorNode {
  SFBool   [in,out] enabled          TRUE
  SFNode   [in,out] metadata         NULL      [X3DMetadataObject]
  MFString [in,out] objectType       "ALL"     ["ALL","NONE","TERRAIN",...]
  SFNode   [in,out] pickingGeometry  NULL      [PointSet]
  MFNode   [in,out] pickTarget       []        [X3DGroupingNode|X3DShapeNode]
  SFBool   [out]    isActive
  MFNode   [out]    pickedGeometry
  MFVec3f  [out]    pickedPoint
  SFString []       intersectionType "BOUNDS"  ["GEOMETRY"|"BOUNDS"]
  SFString []       sortOrder        "CLOSEST" ["CLOSEST"|"ALL"|"ALL_SORTED"]
}

PrimitivePickSensor : X3DPickSensorNode {
  SFBool   [in,out] enabled          TRUE
  SFNode   [in,out] metadata         NULL      [X3DMetadataObject]
  MFString [in,out] objectType       "ALL"     ["ALL","NONE","TERRAIN",...]
  SFNode   [in,out] pickingGeometry  NULL      [Cone|Cylinder|Sphere|Box]
  MFNode   [in,out] pickTarget       []        [X3DGroupingNode|X3DShapeNode|X3DInlineNode]
  SFBool   [out]    isActive
  MFNode   [out]    pickedGeometry
  SFString []       intersectionType "BOUNDS"  ["GEOMETRY"|"BOUNDS"]
  SFString []       sortOrder        "CLOSEST" ["ANY"|"CLOSEST"|"ALL"|"ALL_SORTED"]
}

VolumePickSensor : X3DPickSensorNode {
  SFBool   [in,out] enabled          TRUE
  SFNode   [in,out] metadata         NULL      [X3DMetadataObject]
  MFString [in,out] objectType       "ALL"     ["ALL","NONE","TERRAIN",...]
  SFNode   [in,out] pickingGeometry  NULL      [X3DGeometryNode]
  MFNode   [in,out] pickTarget       []        [X3DGroupingNode|X3DShapeNode|X3DInlineNode]
  SFBool   [out]    isActive
  MFNode   [out]    pickedGeometry
  SFString []       intersectionType "BOUNDS"  ["GEOMETRY"|"BOUNDS"]
  SFString []       sortOrder        "CLOSEST" ["ANY"|"CLOSEST"|"ALL"|"ALL_SORTED"]
}
