G3dLight.mesa
Copyright Ó 1988, 1992 by Xerox Corporation. All rights reserved.
Bloomenthal, February 19, 1993 4:31 pm PST
Crow, May 16, 1989 5:38:45 pm PDT
DIRECTORY G3dBasic, G3dShape, ImagerColor, Rope, TiogaOps, ViewerOps;
G3dLight: CEDAR DEFINITIONS
~ BEGIN
Type Declarations;
ROPE:     TYPE ~ Rope.ROPE;
Pair:     TYPE ~ G3dBasic.Pair;
Triple:    TYPE ~ G3dBasic.Triple;
Shape:    TYPE ~ G3dShape.Shape;
RGB:     TYPE ~ ImagerColor.RGB;
LightProc:   TYPE ~ PROC [light: Light, position: Triple] RETURNS [color: RGB];
        Return the color at the 3d position due to the given light.
Light:     TYPE ~ REF LightRep;
LightRep:    TYPE ~ RECORD [
name:       ROPE ¬ NIL,      -- name of light
position:      Triple ¬ [200.0, 100.0, 100.0], -- position of the light
screen:      Pair ¬ [0.0, 0.0],      -- screen position
eyePosition:     Triple ¬ [0.0, 0.0, 0.0],   -- eyespace position of the light
color:       RGB ¬ [0.7, 0.7, 0.7],   -- color of light
direction:      Triple ¬ [0.8, 0.4, 0.4],   -- unitized position of light
highlight:     Triple ¬ [],      -- highlight direction
a, b, f, eDotH:    REAL ¬ 0.0,      -- shading accelerators
shape:       Shape ¬ NIL,      -- if this light isn't round
radius:      REAL ¬ 2.*93000000.*609.344, -- 2x solar distance (meters)
exponent:      REAL ¬ 2.0,      -- for Phong shading
lightProc:      LightProc ¬ NIL     -- compute shade from this light
];
LightSequence:  TYPE ~ REF LightSequenceRep;
LightSequenceRep: TYPE ~ RECORD [
length:      CARDINAL ¬ 0,
ambient:      RGB ¬ [0.7, 0.7, 0.7],   -- ambient light level
shadowDarken:    REAL ¬ 0.1,      -- amount to darken shadowed
drawLights:     BOOL ¬ TRUE,
element:      SEQUENCE maxLength: CARDINAL OF Light
];
Errors
Error:     SIGNAL [code: ATOM, reason: ROPE]; -- we're able to resume this error
Lighting
LightDots: PROC [light: Light, normal, eyeView: Triple]
RETURNS [nDotE, nDotH, nDotL: REAL];
Return lighting information.
SpecularFromDots: PROC [light: Light, nDotE, nDotH, nDotL: REAL] RETURNS [REAL];
Return specular lighting information.
Light Sequences
AddLight: PROC [
lights: LightSequence,
name: ROPE,
position, direction: Triple,
color: RGB ¬ [1,1,1],
eyeView: Triple ¬ []]
RETURNS [LightSequence];
Add the light to the sequence. If eyeView # [0.0, 0.0, 0.0] then prepare the lights.
LengthenLightSequence: PROC [lights: LightSequence] RETURNS [LightSequence];
Lengthen the sequence of lights.
DeleteLight: PROC [lights: LightSequence, name: ROPE];
Delete the named light from the lights sequence.
Preparation
PrepareLight: PROC [light: Light, eyeView: Triple];
Prepare a single light.
PrepareLights: PROC [lights: LightSequence, eyeView: Triple] RETURNS [LightSequence];
Prepare the lights (set various accelerators, and so on) for polygon shading or ray tracing.
Registration
RegisterLight: PROC [light: Light, type: ATOM];
Add class to list of registered ShadingClasses, for fancy texturing procs, etc.
GetRegisteredLight: PROC [type: ATOM] RETURNS [light: Light];
Retrieve registered class for use or modification.
InitDefaultLightClasses: PROC;
Register a default light classes.
Miscellany
RopeFromLights: PROC [lights: LightSequence] RETURNS [ROPE];
Return a rope describing the lights.
AnnotateLightsToViewer: PROC [lights: LightSequence, viewerName: ROPE];
If the named viewer exists, append to it a description of the lights;
otherwise, create the viewer and write the description.
END.