X3DParticleEmitterNode : X3DNode {
  default-container-field: emitter
  SFFloat [in,out] speed       0
    range: [0,Inf)
  SFFloat [in,out] variation   0.25
    range: [0,Inf)
  SFFloat []       mass        0
    range: [0,Inf)
  SFFloat []       surfaceArea 0
    range: [0,Inf)
}

X3DParticlePhysicsModelNode : X3DNode {
  default-container-field: physics
  SFBool [in,out] enabled  TRUE
}

BoundedPhysicsModel : X3DParticlePhysicsModelNode {
  SFNode [in,out] geometry NULL
    range: X3DGeometryNode
}

ConeEmitter : X3DParticleEmitterNode {
  SFFloat [in,out] angle       Pi/4
    range: [0,Pi]
  SFVec3f [in,out] direction   0 1 0
  SFVec3f [in,out] position    0 0 0
}

ExplosionEmitter : X3DParticleEmitterNode {
  SFVec3f [in,out] position    0 0 0
}

ForcePhysicsModel : X3DParticlePhysicsModelNode {
  SFVec3f [in,out] force    0 -9.8 0
    range: (Inf,Inf)
}

ParticleSystem : X3DShapeNode {
  SFBool   [in,out] createParticles   TRUE
  SFBool   [in,out] enabled           TRUE
  SFFloat  [in,out] lifetimeVariation 0.25
    range: [0,1]
  SFInt32  [in,out] maxParticles      200
    range: [0,Inf)
  SFFloat  [in,out] particleLifetime  5
    range: [0,Inf)
  SFVec2f  [in,out] particleSize      0.02 0.02
    range: [0,Inf)
  SFBool   [out]    isActive
  # Note: colorRamp->color rename in X3D 4.
  # We only support X3D 4 version.
  SFNode   []       color         NULL
    range: X3DColorNode
  MFFloat  []       colorKey          []
    range: [0,Inf)
  SFNode   []       emitter           NULL
    range: X3DParticleEmitterNode
  SFString []       geometryType      "QUAD"
    range: ["LINE"|"POINT"|"QUAD"|"SPRITE"|"TRIANGLE"|"GEOMETRY"|...]
    enumerated-type: TParticlesGeometry ParticlesGeometryNames pgQuad
  MFNode   []       physics           []
    range: X3DParticlePhysicsModelNode
  # Note: texCoordRamp->texCoord rename in X3D 4.
  # We only support X3D 4 version.
  SFNode   []       texCoord      NULL
    range: TextureCoordinate
  MFFloat  []       texCoordKey       []
    range: [0,Inf)
}

PointEmitter : X3DParticleEmitterNode {
  SFVec3f [in,out] direction   0 1 0
  SFVec3f [in,out] position    0 0 0
}

PolylineEmitter : X3DParticleEmitterNode {
  MFInt32 [in]     set_coordIndex
  SFNode  [in,out] coord         NULL
    range: X3DCoordinateNode
  SFVec3f [in,out] direction      0 1 0
    range: [-1,1]
  MFInt32 []       coordIndex     [-1]
    range: [0,Inf) or -1
}

SurfaceEmitter : X3DParticleEmitterNode {
  MFInt32 [in]     set_coordIndex
  MFInt32 []       coordIndex    [ -1]
    range: [0,Inf) or -1
  SFNode  []       surface        NULL
    range: X3DGeometryNode
}

VolumeEmitter : X3DParticleEmitterNode {
  MFInt32 [in]     set_coordIndex
  SFNode  [in,out] coord         NULL
    range: X3DCoordinateNode
  SFVec3f [in,out] direction      0 1 0
    range: [-1,1]
  MFInt32 []       coordIndex     [-1]
    range: [0,Inf) or -1
  SFBool  []       internal       TRUE
}

WindPhysicsModel : X3DParticlePhysicsModelNode {
  SFVec3f [in,out] direction  0 0 0
    range: (Inf,Inf)
  SFFloat [in,out] gustiness  0.1
    range: [0,Inf)
  SFFloat [in,out] speed      0.1
    range: [0,Inf)
  SFFloat [in,out] turbulence 0
    range: [0,1]
}
