X3DLayerNode : X3DNode {
  SFBool [in,out] isPickable TRUE
  SFNode [in,out] metadata NULL [X3DMetadataObject]
  SFNode [in,out] viewport NULL [X3DViewportNode]
}

X3DViewportNode : X3DGroupingNode {
  MFNode  [in]     addChildren             [X3DChildNode]
  MFNode  [in]     removeChildren          [X3DChildNode]
  MFNode  [in,out] children       []       [X3DChildNode]
  SFNode  [in,out] metadata       NULL     [X3DMetadataObject]
  SFVec3f []       bboxCenter     0 0 0    (-Inf,Inf)
  SFVec3f []       bboxSize       -1 -1 -1 (0,Inf) or -1 -1 -1
}

Layer : X3DLayerNode { 
  MFNode [in]     addChildren    []    [X3DChildNode]
  MFNode [in]     removeChildren []    [X3DChildNode]
  MFNode [in,out] children       []    [X3DChildNode]
  SFBool [in,out] isPickable     TRUE
  SFNode [in,out] metadata       NULL  [X3DMetadataObject]
  SFNode [in,out] viewport       NULL  [X3DViewportNode]
}

LayerSet : X3DNode { 
  SFInt32 [in,out]  activeLayer 0    (-Inf,Inf)
  MFNode  [in,out]  layers      []   [X3DLayerNode]
  SFNode  [in,out]  metadata    NULL [X3DMetadataObject]
  MFInt32 [in,out]  order       [0]   (0,Inf)
}

Viewport : X3DGroupingNode, X3DBoundedObject {
  MFNode  [in]     addChildren             [X3DChildNode]
  MFNode  [in]     removeChildren          [X3DChildNode]
  MFNode  [in,out] children       []       [X3DChildNode]
  MFFloat [in,out] clipBoundary   0 1 0 1  [0,1]
  SFNode  [in,out] metadata       NULL     [X3DMetadataObject]
  SFVec3f []       bboxCenter     0 0 0    (-Inf,Inf)
  SFVec3f []       bboxSize       -1 -1 -1 (0,Inf) or -1 -1 -1
}

