G3dLight.mesa
Copyright © 1988 by Xerox Corporation. All rights reserved.
Bloomenthal, July 21, 1989 2:38:18 pm PDT
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;
Triple:    TYPE ~ G3dBasic.Triple;
Shape:    TYPE ~ G3dShape.Shape;
RGB:     TYPE ~ ImagerColor.RGB;
IlluminationProc: TYPE ~ PROC [light: Light, position: Triple] RETURNS [color: RGB];
Light:     TYPE ~ REF LightRep;
LightRep:    TYPE ~ RECORD [
type:       ATOMNIL,      -- type of light
name:       ROPENIL,      -- name of light
position:      Triple ← [200.0, 100.0, 100.0], -- position of the light
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],   -- unitd position of light
illuminationProc:   IlluminationProc ← NIL,  -- illumination due to this light
highlight:     Triple ← [],      -- highlight direction
a, b, f, eDotH:    REAL ← 0.0,      -- shading accelerators
shape:       Shape ← NIL,      -- if this light isn't round
privateData:     REF ANY       -- data for this type of 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
element:      SEQUENCE maxLength: CARDINAL OF Light
];
Errors
Error:     SIGNAL [code: ATOM, reason: ROPE]; -- we're able to resume this error
Lighting
PrepareLights: PROC [lights: LightSequence, eyeView: Triple] RETURNS [LightSequence];
Prepare the lights (set various accelerators, and so on) for ray tracing.
PrepareLight: PROC [light: Light, eyeView: Triple];
Prepare a single light.
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.
LengthenLightSequence: PROC [lights: LightSequence] RETURNS [LightSequence];
Lengthen the sequence of lights.
AddToLightSequence: PROC [
lights: LightSequence,
light: Light,
eyeView: Triple ← []]
RETURNS [LightSequence];
Add the light to the sequence. If eyeView # [0.0, 0.0, 0.0] then prepare the lights.
DeleteLight: PROC [lights: LightSequence, name: ROPE];
Delete the named light from the lights sequence.
Registration
RegisterLightType: PROC [light: Light, type: ATOM];
Add class to list of registered ShadingClasses, for fancy texturing procs, etc.
GetLightType: PROC [type: ATOM] RETURNS [light: Light];
Retrieve registered class for use or modification.
InitStandardLightClasses: PROC;
Register 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.