Arbitrary Regular Polyhedron with up to 8 vertices : arb8 {
  point p1
  point p2
  point p3
  point p4
  point p5
  point p6
  point p7
  point p8
  p1 != p2 && p2 != p3 && p3 != p4 && p4 != p5 && p5 != p6 && p6 != p7 && p7 != p8
}

Bounding Box (ARB8) : box {
  point V => corner vertex
  vector H => height vector
  vector W => width vector
  vector D => depth vector
  magnitude(H) > 0.0
  magnitude(W) > 0.0
  magnitude(D) > 0.0
  perpendicular(H, W) && perpendicular(W, D) && perpendicular(H, D)
}

Right Parallelepiped (ARB8) : rpp {
  point min
  point max
  distance(min, max) > 0.0
}

Arbitrary Regular Polyhedron with N faces : arbn {
  integer n => number of planes
  array planes {
    plane p => plane equation
  }
  for i in planes { magnitude(planes[i].p) > 0.0 }
}

Arbitrary Faceted Solid : ars {
  integer p => number of points per waterline
  integer w => number of waterlines
  array points {
    point V => vertex position
  }
  p > 0
  w > 0
}

Bag of Triangles : bot {
  integer c => number of vertices
  integer t => number of triangles
  enum orientation {unoriented, counter-clockwise, clockwise} => triangle orientation
  point V => vertex position
  enum facemode {center, appended}
  float t => face thickness
  c > 0 && 3 mod c == 0
  t > 0
  !(t < 0.0)
}

Boundary Representation NURBS : brep

FASTGEN CLINE Cylinder : cline

Displacement Map : dsp {
  enum source {file, object} => data source
  string name => name of the data source
  float w => map width
  float n => map height
  boolean interpolate => surface normal interpolation
  float s => square cell size
  float e => cell height
  w > 0.0
  n > 0.0
  s > 0.0
  e > 0.0
  (source==file && file_exists(name)) || (source==object && object_exists(name))
}

Extruded Bitmap : ebm {
  string name => name of the data source
  float w => width of bitmap
  float n => height of bitmap
  float d => extrusion distance
  file_exists(name)
  w > 0.0
  n > 0.0
  d > 0.0
}

Elliptical Hyperboloid : ehy
  point V => vertex
  vector H => height vector
  vector A => ellipse base width vector
  float b => magnitude of ellipse base depth vector
  float c => apex to asymptotes distance
  magnitude(H) > 0.0
  magnitude(A) > 0.0
  perpendicular(H, A)
  b > 0.0
  c > 0.0
}

Ellipsoid : ell {
  point V => vertex point
  vector A
  vector B
  vector C
  perpendicular(A, B)
  perpendicular(B, C)
}

Elliptical Paraboloid : epa {
  point V => vertex
  vector H => height vector
  vector A => ellipse base width vector
  float b => magnitude of ellipse base depth vector
  magnitude(H) > 0.0
  magnitude(A) > 0.0
  perpendicular(H, A)
  b > 0.0
}

Elliptical Torus : eto {
  point V => center point
  vector H => normal height vector
  float r => radius of revolution
  vector C => perpendicular ellipse orientation
  float d => magnitude of elliptical semi-minor axis
  magnitude(H) > 0.0
  r > 0.0
  d > 0.0
}

Solid of Extrusion : extrude {
  point V => vertex position
  vector H => height vector
  vector A => sketch plane primary vector
  vector B => sketch plane secondary vector
  string name => name of the sketch object
  magnitude(H) > 0.0
  magnitude(A) > 0.0
  magnitude(B) > 0.0
  object_exists(name)
}

Pseudo Solid Grip : grip {
  point V => vertex point
  vector H => height vector
  float m => magnitude
  magnitude(H) > 0.0
  m > 0.0
}

Halfspace : half {
  vector H => outward pointing normal vector
  float d => distance from the origin
  magnitude(H) > 0.0
}

Hyperboloid of One Sheet : hyp {
  point V => center vertex
  vector H => height vector
  vector A => ellipse base vector
  float b => magnitude of ellipse base depth vector
  float c => neck to base ratio
  magnitude(H) > 0.0
  magnitude(A) > 0.0
  perpendicular(H, A)
  b > 0.0
  c > 0.0
  !(c > 1.0)
}

Metaball : metaball {
  enum method {0, 1, 2} => render method
  float t => threshold
  integer c => number of points
  array points {
    vector F => field strength vector
    float f => field strength
  }
  t > 0.0
  c > 0
  for i in points { magnitude(points[i].F) > 0.0 && points[i].f > 0.0 }
}

n-Manifold Geometry : nmg

Particle System : part {
  point V => center point
  vector H => height vector
  float rV => V end radius
  float rH => H end radius
  magnitude(H) > 0.0
  rV > 0.0
  rH > 0.0
  !(rV + rH > magnitude(H))
}

Pipe (wire) Solid : pipe {
  integer n => number of pipe points
  array points {
    point V => vertex point
    float i => inner diameter
    float o => outer diameter
    float r => bend radius
  }
  n > 1
  for i in points { points[i].o > 0.0 && points[i].i < points[i].o && !(points[i].r < 0.0) }
  // Bend section bends through more than 180 degrees
  for i in points { acos(vdot(points[i].V, points[i+1].V)) > 0.0 }
}

Point Cloud : pnts {
  boolean file => points stored in a file
  integer n => number of points
  boolean oriented => points have orientation
  boolean color => points have color
  boolean size => points have size
  array points {
    point V => point position
    vector N => point normal vector
    integer C[3] => point color
    float s => point size
  }
  string pathname => name to source file data
  enum format { px, py, pz, cr, cg, cb, s, nx, ny, nz }
  enum units { mm, cm, m, in, ft }
  for i in points { oriented && magnitude(points[i].N) > 0.0 }
  for i in points { color && !(points[i].C[R] < 0 || points[i].C[R] > 255) && !(points[i].C[G] < 0 && points[i].C[G] > 255) && !(points[i].C[B] < 0 && points[i].C[B] > 255) }
  for i in points { size && !(points[i].s < 0.0) }
  file_exists(pathname)
}

Right Elliptical Cylinder (TGC) : rec {
  point V => base center point
  vector H => height vector
  vector A => base ellipse primary axis
  vector B => base ellipse secondary axis
  magnitude(H) > 0.0
  magnitude(A) > 0.0
  magnitude(B) > 0.0
  perpendicular(H, A) && perpendicular(H, B) && perpendicular(A, B)
}

Right Circular Cylinder (TGC) : rcc {
  point V => base center point
  vector H => height vector
  float r => cylinder radius
  magnitude(H) > 0.0
  r > 0
}

Tapered Elliptical Cone (TGC) : tec {
  point V => base center point
  vector H => height vector
  vector A => base ellipse primary axis
  vector B => base ellipse secondary axis
  float r => ratio of base to top ellipse
  magnitude(H) > 0.0
  magnitude(A) > 0.0
  magnitude(B) > 0.0
  perpendicular(H, A) && perpendicular(H, B) && perpendicular(A, B)
  r > 0.0 || r < 0.0
}

Tapered Right Cone (TGC) : trc {
  point V => base center point
  vector H => height vector
  float b => radius of base
  float t => radius of top
  magnitude(H) > 0.0
  b > 0.0
  t > 0.0
}

Solid of Revolution : revolve {
  point V => vertex position
  vector R => axis of revolution
  vector S => vector in start plane
  float a => angle
  string name => name of 2D sketch
  magnitude(R) > 0.0
  magnitude(S) > 0.0
  a > 0.0
  object_exists(name)
}

Right Hyperbolic Cone : rhc {
  point V => vertex
  vector H => height vector
  vector B => width vector
  float r => rectangular half-width
  float c => apex to asymptotes distance
  magnitude(H) > 0.0
  magnitude(B) > 0.0
  perpendicular(H, B)
  r > 0.0
  c > 0.0
  !(magnitude(B) < c)
}

Right Parabolic Cone : rpc {
  point V => vertex
  vector H => height vector
  vector B => width vector
  float r => rectangular half-width
  magnitude(H) > 0.0
  magnitude(B) > 0.0
  perpendicular(H, B)
  r > 0.0
}

2D Sketch : sketch {
}

Sphere (ELL) : sph {
  point V => vertex point
  float r => radius
  r > 0.0
}

Superquadratic Ellipsoid : superell {
  point V => center vertex point
  vector A => height vector
  vector B => width vector
  vector C => depth vector
  float n => north-south power
  float e => east-west power
  magnitude(A) > 0.0
  magnitude(B) > 0.0
  magnitude(C) > 0.0
  n > 0.0
  e > 0.0
}

Generalized Truncated General Cone : tgc {
  point V => base center point
  vector H => height vector
  vector A => base ellipse primary axis
  vector B => base ellipse secondary axis
  float c => ratio of base A vector to top ellipse
  float d => ratio of base B vector to top ellipse
  magnitude(H) > 0.0
  magnitude(A) > 0.0
  magnitude(B) > 0.0
  perpendicular(A, B)
  c > 0.0
  d > 0.0
}

Torus : tor {
  point V => center point
  vector H => normal height vector
  float r1 => outer radius from V to centerline
  float r2 => inner radius in direction of H
  r1 > 0.0
  r2 > 0.0
  !(r1 < r2)
  magnitude(H) > 0.0
}

3D Volume : vol {
  string name => name of data source file
  integer f[3] => dimensions of file (number of cells)
  float l => lower threshold value
  float u => upper threshold value
  vector c => cell dimensions (width, height, depth)
  file_exists(name)
  f[X] > 0 && f[Y] > 0 && f[Z] > 0
  c[X] > 0.0 && c[Y] > 0.0 && c[Z] > 0.0
  l > 0.0
  u > 0.0
  u > l
}


DEPRECATED:
// Bezier Spline : bspline
// Height Field : hf
// Polygonal Facets : poly
// Instanced Submodel : submodel


NON-PARAMETRIC:
Uniform Binary Array : binunif {
  enum type {f, d, c, s, i, L, C, S, I, L} => minor type
  string name => source data file
  integer n => number of values to read
  file_exists(name)
  n > 0 || n == -1
}
// joint
// combination
// constraint
// annotation
