X3DShaderNode : X3DAppearanceChildNode {
  SFBool   [in]     activate
  SFNode   [in,out] metadata   NULL [X3DMetadataObject]
  SFBool   [out]    isSelected
  SFBool   [out]    isValid
  SFString []       language   ""   ["CG"|"GLSL"|"HLSL"|...]
}

X3DVertexAttributeNode : X3DGeometricPropertyNode {
  SFNode   [in,out] metadata NULL [X3DMetadataObject]
  SFString []       name     "" 
}

ComposedShader : X3DShaderNode, X3DProgrammableShaderObject {
  SFBool    [in]     activate
  SFNode    [in,out] metadata   NULL [X3DMetadataObject]
  MFNode    [in,out] parts      []   [ShaderPart]
  SFBool    [out]    isSelected
  SFBool    [out]    isValid
  SFString  []       language   ""  
  # And any number of:
}

FloatVertexAttribute : X3DVertexAttributeNode {
  SFNode   [in,out] metadata      NULL [X3DMetadataObject]
  MFFloat  [in,out] value  		  []   (-Inf,Inf)
  SFString []       name          ""
  SFInt32  []       numComponents 4    [1..4]
}

Matrix3VertexAttribute : X3DVertexAttributeNode {
  SFNode     [in,out] metadata NULL [X3DMetadataObject]
  MFMatrix3f [in,out] value    []   (-Inf,Inf)
  SFString   []       name     ""
}

Matrix4VertexAttribute : X3DVertexAttributeNode {
  SFNode     [in,out] metadata NULL [X3DMetadataObject]
  MFMatrix4f [in,out] value    []   (-Inf,Inf)
  SFString   []       name     ""
}

PackagedShader : X3DShaderNode, X3DUrlObject, X3DProgrammableShaderObject {
  SFBool    [in]     activate
  SFNode    [in,out] metadata   NULL [X3DMetadataObject]
  MFString  [in,out] url        []   [URI]
  SFBool    [out]    isSelected
  SFBool    [out]    isValid
  SFString  []       language   ""
  # And any number of:
}

ProgramShader : X3DShaderNode {
  SFBool   [in]     activate
  SFNode   [in,out] metadata   NULL [X3DMetadataObject]
  MFNode   [in,out] programs   []   [ShaderProgram]
  SFBool   [out]    isSelected
  SFBool   [out]    isValid
  SFString []       language   ""   ["CG"|"GLSL"|"HLSL"]
}

ShaderPart : X3DNode, X3DUrlObject {
  SFNode   [in,out] metadata NULL       [X3DMetadataObject]
  MFString [in,out] url      []         [URI]
  SFString []       type     "VERTEX"   ["VERTEX"|"FRAGMENT"]
}

ShaderProgram : X3DNode, X3DUrlObject, X3DProgrammableShaderObject {
  SFNode    [in,out] metadata  NULL         [X3DMetadataObject]
  MFString  [in,out] url       []           [URI]
  SFString  []       type      "VERTEX"     ["VERTEX"|"FRAGMENT"]
  # And any number of:
}

