Remove Frame

                        P3D DESCRIPTION AND DEFINITIONS


                                 Joel Welling

                             15 January 1993 18:03

Copyright (C) 1993  Pittsburgh Supercomputing Center, Carnegie Mellon Universit
        Permission is granted to duplicate and distribute this document
      without fee, so long as the above copyright notice is preserved in
                                 all copies.
1. Introduction

  The  Pittsburgh  Supercomputing Center 3D Metafile (P3D) is intended to serve
as a storage format for three dimensional models.  The goal of the  project  is
to  develop  a representation that will be compact, portable, and flexible, and
can be created and examined or modified by a variety of software packages on  a
variety   of   platforms.    Although  P3D  is  extensible  to  allow  all  the
functionality of model languages intended for  photorealistic  rendering  (e.g.
Pixar's  proposed Renderman standard), it is not intended for the production of
photorealistic images, or even to insure that different renderers will  produce
identical  images  from a given P3D model.  Rather, it is designed to provide a
format for the storage and transport of models which can be viewed on a variety
of platforms with a variety of rendering capabilities.

  In  order  to provide maximum flexibility, it was decided that P3D would be a
complete programming language.  This allows it to be used in the  same  fashion
as  Postscript,  with the creating application determining the structure of the
metafile based on its internal view of the model.  Lisp provides a well-  known
language  which can be interpreted or compiled and is well-suited to describing
the directed acyclic graphs  (DAGs)  common  in  three  dimensional  modelling.
Hence,  it  was  decided  that  P3D  would be written as a set of extensions to
Common Lisp.

  This document makes no attempt to describe Common Lisp itself.   For  details
on  that language, see any of a number of texts, for example "Common Lisp - the
Language" by Guy Steele  Jr.  (Digital  Press  1984).    In  practice,  current
implementations  of  P3D (as of May 1989) run on a subset of Common Lisp called
Alisp.  For details on this lisp, see Chris Nuuja's document on  Alisp.    This
provides  a basis for P3D that can be easily distributed, plus some benefits in
security, at some cost in functionality.

2. Overview

  A P3D model consists of graphical objects, called 'gobs' for  short.    These
objects  may be primitives like spheres or triangle lists, or they may be built
up of simpler objects.  The internal structure of a gob may (and probably will)
be  a  directed acyclic graph or DAG, the internal nodes of which are also gobs
and the leaf nodes of which are gobs consisting of geometrical primitives.

  P3D supports sphere, cylinder, torus, polygon, polyline, polymarker, triangle
list,  generalized  mesh,  spline surface, and text geometrical primitives.  In
addition, light sources are treated as geometrical primitives and  occupy  leaf
nodes of the DAG.

  Gobs  are  defined  either  by involking a function which returns a primitive
gob, or by listing the 'children' and possibly the attributes the new gob is to
have.    A  gob can be saved either by binding it to a name (for example, via a
lisp 'setq' function) or by including it directly into the list of children  of
another  gob.    Color, material type, and backface cullability are examples of
attributes which might be associated with a gob.

  P3D also defines primitive structures needed to  support  simple  geometrical
and  graphical  entities like points, vectors, vertices, colors, and materials.
There is a structure used to represent a camera, which can be used  within  the
metafile to define a point of view.  Transformations are represented as four by
four lisp matrices.

  Rendering of a given view is triggered by the 'snap'  function,  which  takes
two  gobs  and  a  camera  structure  as  parameters.    One  gob  supplies the
geometrical primitives, while the other supplies the lights; they can  in  fact
both  be  instances  of the same gob.  The camera structure defines the viewing
parameters.  One of two possible actions may be triggered to perform rendering,
depending  on  the  functionality of the underlieing renderer.  If the renderer
cannot support a hierarchical geometry,  the  geometry  DAG  may  be  traversed
within  the  Lisp  itself  so  that  calls  to  the renderer are only made when
geometric primitives are found.  If the renderer will  support  a  hierarchical
geometry  database,  a call to the renderer can be made as each gob is defined,
so that at rendering time  the  DAG  traversal  is  done  entirely  within  the

  When  the  rendering  process begins, a certain set of default attributes for
the model are assumed.  As  the  DAG  is  traversed,  each  new  gob  may  have
attributes or transformations associated with it.  A gob's attributes are added
to those in effect above it on the DAG, superceeding  the  previous  values  of
attributes of the same type.  Transformations are multiplied together in such a
way that at  any  given  level  a  local  coordinate  system  exists,  and  the
transformation  from  that  coordinate  system  to the coordinate system of the
top-level gob (where rendering began) is the product of all the transformations
in  between.  Thus, for example, any gob can set a color to be inherited by its
children; if no gob farther down the DAG resets the  color  (and  the  vertices
used  have  no  color  of their own) geometrical primitives below that gob will
ultimately  be  drawn  with  the  color  given.    Likewise,  a  transformation
associated  with  any  gob can be used to change the ultimate position at which
the structures below it in the DAG will be drawn.

  Any gob may be instanced arbitrarily many times in  the  geometry  DAG;  each
instance  will  inherit  attributes  and transformations independently from its
parents.  Note that the DAG must remain acyclic or severe problems may  result.
It  is  the  programmer's  responsibility  to  make sure that no gob is its own

3. Syntax Rules and Special Conventions

  The syntax of P3D is exactly that of Lisp.  Each P3D  metafile  should  begin
with the Lisp comment:

    ;P3D nnn

left  justified  on  the  first  line of the metafile, where nnn is the release
number of the P3D specification to which the metafile  conforms  (for  example,
2.1).    This serves to identify the metafile as P3D rather than arbitrary lisp

4. Coordinate Conventions and Orientation Rules

  P3D assumes that all coordinate systems are right-handed.   For  example,  if
the  x  axis  of  a coordinate system points to the right of a viewer and the y
axis points up, the z axis  will  point  toward  the  viewer.    The  signs  of
rotations  are  also  assumed  positive  in  the  right-handed  direction.  For
example, a positive rotation of 90 degrees about the z axis will move a  vector
initially pointing along the x axis into alignment with the y axis.

  Coordinate  transformations  are  represented  by  four  by four matrices, as

                [ R11 R12 R13 0 ]
                [ R21 R22 R23 0 ]
                [ R31 R32 R33 0 ]
                [  0   0   0  1 ]


                [  1   0   0  Tx ]
                [  0   1   0  Ty ]
                [  0   0   1  Tz ]
                [  0   0   0  1  ]


                [ Sx   0   0  0 ]
                [  0  Sy   0  0 ]
                [  0   0  Sz  0 ]
                [  0   0   0  1 ]

where R11 through R33 are appropriate rotation components, Tx, Ty, and  Tz  are
translation  components in the x, y, and z directions respectively, and Sx, Sy,
and Sz are scaling factors in the x, y, and z directions  respectively.    With
these  conventions, a point in three dimensional space will be represented by a
column vector, the first three  components  of  which  are  the  x,  y,  and  z
coordinates  of  the  point  and the fourth component of which is always unity.
Transforming that point to a new coordinate system  then  corresponds  to  left
multiplying the column vector by the appropriate transformation matrix.

  Note  that it is never necessary to explicitly construct these transformation
matrices.  P3D provides functions that construct  them,  as  described  in  the
section on Geometric Transformations below.

  The  'front'  face of a polygon is also determined by a right hand rule.  For
example, the front face of the triangle with vertices ( 0, 0, 0), ( 1,  0,  0),
and  (0,  1, 0) is the face on the z>0 side.  If the vertices of a polygon have
local normals (see below), and those normals are inconsistant with  the  facing
direction  of  the  polygon  as derived from the right hand rule, unpredictable
results may occur on rendering.   Polygon  facing  may  be  used  for  backface

  All  text  is  drawn in a plane, the orientation of which is specified by the
'u' and 'v' vectors provided in the text primitive.  The front face of the text
is  derived  by  applying the right hand rule to these two vectors.  If the 'u'
vector lies in the x direction and the 'v' vector lies in the y direction,  the
front face of the text will be on the positive z side.

5. Memory Management Rules

  The  programmer  need not worry about freeing memory associated with most P3D
structures, as the normal garbage collection mechanisms of Lisp will handle the
task.    This  is  not  always  possible  for  gobs, however, as a gob may have
associated with it data structures in the renderer, and those  data  structures
must  be  freed  when  the  gob  is freed.  Thus, several special functions are
needed to handle the memory management of gobs.

  A gob is freed if and only if the following conditions apply.  It  must  have
no parents which have not been freed, it must not be 'held' (see below), and it
or its last surviving parent must be explicitly freed.  Functions to  hold  and
release  a  gob,  and  to  free it, are described in the section on Geometrical
Objects below.  It is important to use these functions when  destroying  a  gob
which  is  no  longer  needed,  so  that  memory  within  the  renderer will be

6. Primitive Objects

6.1. Point

  The structure used to hold the coordinates of a point in 3-space  is  defined
as follows:

    (defstruct point
            (x 0.0)         ;x coordinate
            (y 0.0)         ;y coordinate
            (z 0.0))        ;z coordinate

It  can  be  created  via the function 'make-point', which can take the options
':x', ':y', and ':z', all of which are floating  point  numbers  defaulting  to
0.0.  For example,

    (setq origin (make-point))

is the definition of the standard symbol 'origin'.

6.2. Vector

  The structure used to hold a vector in 3-space is defined as follows:

    (defstruct vector
            (x 0.0)         ;x coordinate
            (y 0.0)         ;y coordinate
            (z 0.0))        ;z coordinate

It  can  be  created via the function 'make-vector', which can take the options
':x', ':y', and ':z', all of which are floating  point  numbers  defaulting  to
0.0.  For example,

    (setq x-vec (make-vector :x 1.0 :y 0.0 :z 0.0))

is the definition of the standard symbol 'x-vec'.

6.3. Color

  The structure used to hold a color is defined as follows:

    (defstruct color
            (r 0.8)         ;red intensity
            (g 0.8)         ;green intensity
            (b 0.8)         ;blue intensity
            (a 1.0))        ;opacity

It  can  be  created  via the function 'make-color', which can take the options
':r' for red intensity, ':g' for green intensity, ':b' for blue intensity,  and
':a' for opacity (sometimes called the alpha channel).  All of these values are
assumed to be floating point values in the range 0.0 to 1.0 inclusive, with 0.0
being  no  intensity  in that color or complete transparency.  The defaults are
0.8 for each of the red, green, and blue values, and 1.0  or  complete  opacity
for the alpha value.  For example,

    (setq red (make-color :r 1.0 :g 0.0 :b 0.0))

is the definition of the standard symbol 'red'.

6.4. Vertex

  The  structure  used  to  hold  a  vertex (a position in 3 dimensional space,
possibly with an associated color and/or normal vector) is defined as a  struct
containing at least the following fields:

    (defstruct vertex
            (x 0.0)         ;x coordinate
            (y 0.0)         ;y coordinate
            (z 0.0)         ;z coordinate
            (clr nil)       ;local color
            (normal nil))   ;local surface normal

It  can  be  created via the function 'make-vertex', which can take the options
':x' for x coordinate, ':y' for y coordinate,  ':z'  for  z  coordinate  (these
three   being  floating  point  numbers),  ':clr'  (a  color,  as  returned  by
'make-color') for  local  color,  and  ':normal'  (a  vector,  as  returned  by
'make-vector') for local surface normal.  The coordinate values default to 0.0,
so the default location is the origin.  The local color  defaults  to  nil,  so
that  the  vertex  will be drawn with a color inherited from its parents in the
DAG.  The local normal also defaults to  nil;  the  renderer  will  attempt  to
calculate  a  normal  by interpolating the orientations of adjacent polygons if
this is the case.  For example,

    (setq red-origin (make-vertex :clr red))

will define a vertex located at the origin with a color of  'red'  (as  defined
above) and no normal.

6.5. Material

  The  structure  used  to  hold  a  material  (a  set  of properties used with
attributes like color to determine the appearance of an object) is  represented
as a structure with at least the following fields:

        Field             Type                Meaning

        :ka              float          ambient light weighting factor
        :kd              float          diffuse light weighting factor
        :ks              float          specular light weighting factor
        :exp             float          specular exponent
        :reflect         float          reflection coefficient
        :refract         float          index of refraction
        :energy          color          energy density (for radiosity)

Other structure fields may exist, but they are maintained by P3D and should not
be modified by the programmer.  A material should always be  created  with  the
'def-material' function.

        ( def-material :ka ka-value :kd kd-value :ks ks-value
                  :exp exp-value :reflect reflect-value
                  :refract refract-value :energy energy-color )

                        :ka ka-value (optional): ambient light
                                weighting factor
                        :kd kd-value (optional): diffuse light
                                weighting factor
                        :ks ks-value (optional): specular light
                                weighting factor
                        :exp exp-value (optional): specular exponent
                        :reflect reflect-value (optional):
                                reflection coefficient
                        :refract refract-value (optional):
                                index of refraction
                        :energy energy-color (optional): energy
                                density for radiosity
                returns:  material with the given characteristics

All  the  keyword-field pairs are optional.  Fields which are not specified are
assigned specific default  values;  see  the  specification  of  the  'default-
material'  predefined symbol at the end of this document for the default values
of each field.

  A material can be used to describe the way light interacts  with  an  object,
and thus its appearance.  For example,

    (setq aluminum-material (def-material
                    :ka 0.25 :kd 0.25 :ks 0.75 :exp 6.0 :reflect 0.75))

is  the  definition  of the standard material symbol 'aluminum-material'.  This
material is quite reflective, but has a relatively low specular exponent, so it
will appear shiny but not polished.

6.6. Camera

  The structure used to hold a camera is defined as follows:

    (defstruct camera
            (lookfrom origin)       ;eye point
            (lookat origin)         ;point to look at
            (up y-vec)              ;view's 'up' direction
            (fovea 56.0)            ;view included angle
            (hither -0.01)          ;hither clipping distance
            (yon -100.0)            ;yon clipping distance
            (background black))     ;background color

Camera structs are used to define viewing characteristics for rendering.  It is
created via the function 'make-camera', which can take the following options:

        Option              Type                Meaning

        :lookfrom       point           location of camera
        :lookat         point           location at which camera is to point
        :up             vector          direction from bottom to top of view
        :fovea          float           camera opening angle in degrees
        :hither         float           distance to hither clipping plane
        :yon            float           distance to yon clipping plane
        :background     color           background color

  Both the lookat and lookfrom points default to the origin, so  at  least  one
must be set to produce a valid camera.  The camera's 'up' direction defaults to
the y direction.  The fovea angle defaults to 56 degrees, and  the  hither  and
yon distances default to -0.01 and -100.0 respectively.  (Note that because the
coordinate system of the camera is required to be right-handed,  the  ':lookat'
point  will  lie in the negative z direction from the origin, so the hither and
yon clipping distances must be negative).  The  background  color  defaults  to

  The  following  example  defines a camera at the coordinates (0.0, 0.0, 20.0)
looking at the origin, with all other characteristics left at their defaults.

    (setq this-camera (make-camera
                            :lookat origin
                            :lookfrom (make-point :z 20.0)))

7. Geometric Transformations

  P3D provides functions to generate transformation matrices, as  described  in
the Coordinate Conventions section above.  The functions are:

        ( make-translate Tx Ty Tz )

                        Tx, Ty, Tz:  floating point numbers giving distance
                                to translate in the x, y, and z directions
                        a transformation matrix encoding the translation

        ( make-rotate axis angle )

                        axis:  vector providing the axis about which to rotate
                        angle:  angle in degrees of the rotation
                        a transformation matrix encoding the rotation

        ( make-scale Sx Sy Sz )

                        Sx, Sy, Sz:  floating point numbers giving factors by
                                which to scale the x, y, and z directions

                        a transformation matrix encoding the scaling

        ( make-identity )

                parameters: none

                returns: a transformation matrix encoding the identity

        ( compose-transform trans1 trans2 )

                        trans1, trans2: transformation matrices

                returns:  trans1 x trans2  (remember that subsequent
                        transformations should left multiply existing

        ( compose-transforms trans1 trans2 trans3 ... transn )

                        trans1 ... transn: transformation matrices

                returns:  trans1 x trans2 x ... x transn (remember that
                        subsequent transformations should left multiply
                        existing transformations).  compose-transforms
                        is somewhat slower than compose-transform.

8. Geometrical Object (Gob)

  A gob is represented as a structure with at least the following options:

        Option              Type                Meaning

        :attr           assoc-list      attribute-value pairs for this gob
        :transform      transformation  coordinate transformation
        :children       list            list of gobs to be children

Other  structure slots may exist, but they are maintained by P3D and should not
be modified by the programmer.  All of the fields default to nil.

  A gob should always be created with 'def-gob', or with one of the geometrical
primitive  generators  (see below). If 'def-gob' is used, the definition should
include a ':children' option or the gob will have no decendents in the DAG  and
thus be useless.

        ( def-gob :attr attrlist
                  :transform transformation
                  :children childlist )

                        :children childlist (required):  list of
                                children of this gob
                        :transform transformation (optional):  coordinate
                                transformation for this gob
                        :attr attrlist (optional):  association list of
                                attribute and value pairs for this gob
                returns:  gob with the given children, coordinate
                        transformation, and attributes

  If  old_gob_1  and  old_gob_2 are previously created gobs, the following will
create a gob called new_gob which includes a coordinate transformation, and has
the two other gobs as children.

    (setq new_gob (def-gob  :transform (make-translate 1.0 0.0 0.0)
                            :children (list old-gob-1 old-gob 2)))

  As  described  in the Memory Management section above, a gob can be 'held' to
guarantee that it will not be freed, and 'unheld' to permit reclaimation of its
memory.  The 'hold-gob' and 'unhold-gob' functions have the following syntax:

        ( hold-gob gob )

                        gob:  gob to be held

                returns: T

        ( unhold-gob gob )

                        gob:  gob to be released

                returns: Nil

Applying  'hold-gob'  to a gob which is already held is a null operation, as is
applying 'unhold-gob' to a gob which is not held.

  A gob which is  not  held  and  which  has  no  parents  can  be  freed  with
'free-gob'.    This  function  causes  memory  associated  with  the gob in the
renderer to be freed; any future reference to the gob will be an  error.    The
children  of  the  freed  gob are checked to see if they have any other parents
(which have not themselves been freed); an orphaned child which is  not  itself
held is also freed.  The syntax of free-gob is as follows:

        ( free-gob gob )

                        gob:  gob to be freed.

                returns: Nil.

9. Attributes

  Attributes  are  data other than geometrical data which is used in rendering.
Each gob can have associated with it a list of attribute-value pairs; this list
is  stored  in  the  gob's  ':attr'  slot.    Attributes are inherited down the
geometry DAG, in such a way that a value for a given attribute on a  gob  which
is a close parent of a geometrical primitive (see below) will supersede a value
assigned that attribute farther up the DAG.

  A gob's attributes are stored in an association list, of the sort searched by
the Common Lisp 'assoc' function.  Association lists are of the form:

    ( (attr1 . val1) (attr2 . val2) (attr3 . val3) ... )

The following attributes are currently supported by P3D:

    Attribute     Value       Default           Meaning

    'color        color       opaque white      default color below this gob

    'backcull     T or nil    nil               enable backface culling

    'text-height  float       1.0               character height for capital
                                                X character

    'text-font    string     "simplex_roman"    font in which text will
                                                be written
                  float      0.15               strokes with which text is
                                                drawn will be this
                                                fraction of text-height

                  float      0.1                if the text has thickness
                                                (perpendicular to u and v),
                                                it will be this fraction
                                                of text-height

    'material     material   default-material   material type for this gob
                                                and its children
Any given renderer may ignore some of these attributes.

  Because  the  DAG  traversal process may reverse the order of attribute-value
pairs within a gob, the attribute list for a given gob  should  have  only  one
occurance of a given attribute.

  The  following example creates a gob with an attribute list setting a default
color of blue and enabling backface culling:

    (setq sample_gob (def-gob
                    :attr (list (cons 'color blue)
                               '(backcull . T))
                    :children (list old_gob_1 old_gob_2)))

10. Geometrical Primitives

  P3D defines a number of functions which return  geometrical  primitive  gobs.
These  gobs  are leaf nodes in the rendering DAG; they have no children.  These
primitives are rendered with  the  attributes  inherited  from  their  parents,
except in those cases where the vertices of the primitive specify the attribute
explicitly (e.g. color).  The funcions which generate primitives are:

        ( sphere )

                parameters:  none

                returns:  gob containing a sphere of radius 1, centered at
                        the origin

        ( cylinder )

                parameters: none

                returns:  gob containing a cylinder of radius 1, with the
                        symmetry axis aligned with the z axis.  The cylinder
                        ends are at z= 0.0 and z= 1.0 .

        ( torus bigradius smallradius )

                        bigradius:  float specifying major radius of torus
                        smallradius:  float specifying minor radius of torus

                returns:  gob containing a torus with the given major and
                        minor radii, with the hole in the torus running
                        along the z axis.

        ( polyline v1 v2 v3 ... vn )

                        v1 ... vn:  vertices to be connected by the polyline.
                        There must be at least two vertices.

                returns:  gob containing a polyline connecting the given
                        vertices.  The polyline is not closed; i.e. vn is
                        not connected to v1.

        ( polymarker v1 v2 v3 ... vn )

                        v1 ... vn:  vertices at which markers are to be
                        drawn.  There must be at least one vertex.

                returns:  gob containing a polymarker, the markers of which
                        are at the given vertices.  The markers are of the
                        current marker type.  Depending on the renderer,
                        the marker drawn may or may not be subject to
                        geometric transformations.  For example, a marker
                        might be of constant size, or might scale with
                        the projection of the model.

        ( polygon v1 v2 v3 ... vn )

                        v1 ... vn:  vertices to form the perimiter of the
                        polygon.  There must be at least three vertices.

                returns:  gob containing a polygon with the given vertices.
                        The polygon is closed automatically; i.e. v1 need not
                        equal vn.

                comments:  The appearance of non-planar polygons may vary
                        from renderer to renderer.

        ( triangle v1 v2 v3 ... vn )

                        v1 ... vn:  vertices to be used to form the triangle

                returns:  gob containing a triangle strip composed of the given
                        vertices.  The strip is a series of triangles, each
                        defined by an adjacent set of three vertices from the
                        vertex list.  Thus, the first triangle is composed
                        of v1, v2, and v3; the second of v2, v3, and v4; and
                        so on.  The 'front' face of a triangle strip is
                        determined by the right hand rule for odd numbered
                        triangles, and a left hand rule for even numbered

        ( mesh vlist flist )

                        vlist: list of vertices included in the mesh
                        flist: list of lists of vertices, one list per
                        polygonal facet.

                returns:  gob containing a generalized mesh composed of the
                        given facets, which are polygons the corners of which
                        are in the given list of vertices.

                comments:  The vertices in the facet lists should be the same
                        vertices as those in the vertex list, not simply
                        different vertices at the same coordinate location.
                        For example, if v1, v2, v3, and v4 are vertices, the
                        following is a valid mesh:

                        (mesh (list v1 v2 v3 v4)
                                (list (list v1 v2 v3) (list v2 v3 v4) ) )

        ( bezier v1 v2 v3 ... v16 )

                        v1 to v16: The control vertices of a 4 by 4 bicubic
                        Bezier patch.

                returns:  gob containing a 4 by 4 bicubic Bezier patch,
                        defined by the control vertices as follows:

                        |v1     |v2      |v3      |v4
                        |       |        |        |
                        |       |        |        |
                        |v5     |v6      |v7      |v8
                        |       |        |        |
                        |       |        |        |
                        |v9     |v10     |v11     |v12
                        |       |        |        |
                        |       |        |        |
                         v13     v14      v15      v16

                        The 'up' surface of the patch is defined by the
                        right hand rule circulating in the v1-v4-v16-v13
                        order, so that the above illustration's 'up'
                        direction is into the page.

                comments:  The patch passes through the corner vertices;
                        the other vertices define the shape of the spline
                        surface.  The treatment of color and normal
                        information associated with the vertices is
                        renderer dependent.

        ( text point uvec vvec string )

                        point:  point in 3D space at which the text is to
                        be written.
                        uvec: vector in 3D space specifying the u axis
                        of the plane in which the text is to be drawn
                        vvec: vector in 3D space specifying the v axis
                        of the plane in which the text is to be drawn
                        string:  character string to be written.

                returns:  gob containing a written character string.  The
                        writing plane and other attributes are determined
                        by the inherited values of the appropriate 'text-'
                        attributes.  The text is drawn starting at the given
                        point, in a plane the orientation of which is given
                        by the u and v vectors.

11. Lights

  P3D provides two function which return light sources.   These  light  sources
are  gobs  which  serves as a leaf node of a DAG; they have no children.  Light
sources can provide directional illumination, or can provide ambient background
light  which illuminates all surfaces regardless of orientation.  The functions
which produce these lights are:

        ( light location lightcolor )

                        location:  point in 3D space at which to place the
                        light source.  (Note that some renderers will retreat
                        the light to infinity along the line from the origin
                        of the current coordinate system through the given
                        lightcolor:  color of the light to be emitted from
                        this source.

                returns:  gob containing a directional light source specified
                        by the given parameters.

        ( ambient lightcolor )

                        lightcolor:  color of the light to be emitted from
                        this source.

                returns:  gob containing an ambient light source of the given

For example, the following defines a white light source at the coordinates  (1,
0, 0) and binds it to the symbol 'new_light'.

    (setq new_light (light (make-point :x 1.0 )
                           (make-color :r 1.0 :g 1.0 :b 1.0)))

12. Rendering

  Once  a geometry DAG and a DAG containing light sources has been constructed,
and a camera structure has been defined, the P3D 'snap' function can be used to
initiate  rendering.    (It  is  possible  for  a  single  dag  containing both
geometrical primitives and light sources to be used for both the  lighting  and
geometry DAGs).  The snap function has the following format:

        ( snap object lights acamera )

                        object:  gob containing the model to be rendered
                        lights:  gob containing light sources
                        acamera:  camera struct defining the field of view

                returns: 'T

The  exact  action  of  'snap'  will  depend  on  the renderer being used.  For
example, a slow renderer might render the single given frame, while  a  dynamic
renderer might render the object continuously, allowing the point of view to be
changed via a knob box, until control was returned to the P3D interpreter.

13. Predefined Symbols

  P3D predefines some symbols for commonly used  constructs  for  convenience's
sake.  The predefined symbols include the following:
  Symbol             Meaning               Definition

  origin             point at origin       (make-point :x 0.0 :y 0.0 :z 0.0)

  x-vec              x unit vector         (make-vector :x 1.0)

  y-vec              y unit vector         (make-vector :y 1.0)

  z-vec              z unit vector         (make-vector :z 1.0)

  white              color white           (make-color :r 1.0 :g 1.0 :b 1.0)

  black              color black           (make-color :r 0.0 :g 0.0 :b 0.0)

  red                color red             (make-color :r 1.0 :g 0.0 :b 0.0)

  green              color green           (make-color :r 0.0 :g 1.0 :b 0.0)

  blue               color blue            (make-color :r 0.0 :g 0.0 :b 1.0)

  yellow             color yellow          (make-color :r 0.0 :g 1.0 :b 1.0)

  cyan               color cyan            (make-color :r 1.0 :g 0.0 :b 1.0)

  magenta            color magenta         (make-color :r 1.0 :g 1.0 :b 0.0)

  null-transform     identity transform    (make-identity)

  default-material   default material      (def-material :ka 0.8 :kd 0.8
                                                :ks 0.3 :exp 30.0
                                                :reflect 0.1 :refract 1.0
                                                :energy black)

  dull-material      material type with    (def-material :ka 0.9 :kd 0.9
                     low reflectivity           :ks 0.1 :exp 5.0
                                                :reflect 0.1 :refract 1.0
                                                :energy black)

  shiny-material     glossy material       (def-material :ka 0.5 :kd 0.5
                     type                       :ks 0.5 :exp 50.0
                                                :reflect 0.3 :refract 1.0
                                                :energy black)

  metallic-material  metallic material     (def-material :ka 0.1 :kd 0.1
                     type, like chrome          :ks 0.9 :exp 100.0
                                                :reflect 0.7 :refract 1.0
                                                :energy black)

  matte-material     material type with    (def-material :ka 1.0 :kd 1.0
                     no reflectivity            :ks 0.0 :exp 0.0
                                                :reflect 0.0 :refract 1.0
                                                :energy black)

  aluminum-material  aluminum              (def-material :ka 0.25 :kd 0.25
                                                :ks 0.75 :exp 6.0
                                                :reflect 0.75 :refract 1.0
                                                :energy black)
                               Table of Contents
   1. Introduction                                                            1
   2. Overview                                                                1
   3. Syntax Rules and Special Conventions                                    1
   4. Coordinate Conventions and Orientation Rules                            1
   5. Memory Management Rules                                                 1
   6. Primitive Objects                                                       1
       6.1. Point                                                             1
       6.2. Vector                                                            2
       6.3. Color                                                             2
       6.4. Vertex                                                            2
       6.5. Material                                                          2
       6.6. Camera                                                            2
   7. Geometric Transformations                                               2
   8. Geometrical Object (Gob)                                                3
   9. Attributes                                                              3
   10. Geometrical Primitives                                                 3
   11. Lights                                                                 4
   12. Rendering                                                              4
   13. Predefined Symbols                                                     4