-- File: CSGGraphics.mesa
-- Last edited by Bier on December 18, 1982 1:13 am
-- Author: Eric Allan Bier on July 2, 1983 4:07 pm
-- Contents: A place to keep the current 3d transform, and the 3d (perspective) drawing routines

DIRECTORY
 CoordSys,
 Graphics,
 GraphicsColor,
 Matrix3d,
 Shading,
 SVArtwork,
 SVPolygon3d,
 SVVector3d;

CSGGraphics: DEFINITIONS =

BEGIN

Artwork: TYPE = REF ArtworkObj;
ArtworkObj: TYPE = SVArtwork.ArtworkObj;
Camera: TYPE = REF CameraObj;
Color: TYPE = GraphicsColor.Color;
CoordSystem: TYPE = REF CoordSysObj;
CoordSysObj: TYPE = CoordSys.CoordSysObj;
DrawStyle: TYPE = {wire, shaded, rayCast, normals};
Matrix4by4: TYPE = Matrix3d.Matrix4by4;
Point3d: TYPE = Matrix3d.Point3d;
Point2d: TYPE = Matrix3d.Point2d;
Poly3d: TYPE = REF Poly3dObj;
Poly3dObj: TYPE = SVPolygon3d.Poly3dObj;
LightSource: TYPE = REF LightSourceObj;
LightSourceObj: TYPE = Shading.LightSourceObj;
LightSourceList: TYPE = Shading.LightSourceList; -- LIST OF LightSource;
StrokeEnds: TYPE = Graphics.StrokeEnds;
Vector: TYPE = SVVector3d.Vector;

CameraObj: TYPE = RECORD [
 coordSys: CoordSystem,
 screenCS: CoordSystem,
 focalLength: REAL,
 style: DrawStyle,
 colorFilm: BOOL,
 resolution: REAL,
 frame: FrameBox,
 quality: QualityMode,
 abort: BOOLFALSE];

QualityMode: TYPE = {fast, quality};

FrameBox: TYPE = REF FrameBoxObj;
FrameBoxObj: TYPE = RECORD [
 downLeft: Point2d,
 upRight: Point2d,
 fullScreen: BOOL]; -- these points are in CAMERA coordinates

CreateCamera: PROC [coordSys: CoordSystem, screenCS: CoordSystem, focalLength: REAL, style: DrawStyle, resolution: REAL] RETURNS [camera: Camera];
PlaceCamera: PROC [camera: Camera, focus: Point3d, origin: Point3d];
SetFocalLengthCamera: PROC [camera: Camera, focalLength: REAL];
SetQualityCamera: PROC [camera: Camera, qual: QualityMode];
-- how you wish to make the speed/print quality trade off.
ColorFilmCamera: PROC [camera: Camera, colorFilm: BOOL];
-- if black and white film is used, all colors will be changed to shades of gray before being shown
Clip: PROC [dc: Graphics.Context, camera: Camera];
DrawFrame: PROC [dc: Graphics.Context, camera: Camera];
GetPerspective: PROC [point3d: Point3d, camera: Camera] RETURNS [point2d: Point2d];

LocalToCamera: PROC [localPoint: Point3d, localCS: CoordSystem] RETURNS [cameraPoint: Point3d];
LocalToWorld: PROC [localPt: Point3d, localCS: CoordSystem] RETURNS [worldPt: Point3d];
VectorToWorld: PROC [vector: Vector, localCS: CoordSystem] RETURNS [worldVector: Vector];

SetCP: PROC [dc: Graphics.Context, point3d: Point3d, camera: Camera, localCS: CoordSystem];
MoveTo: PROC [path: Graphics.Path, point3d: Point3d, camera: Camera, localCS: CoordSystem];
SetCPAbsolute: PROC [dc: Graphics.Context, point3d: Point3d, camera: Camera];
MoveToAbsolute: PROC [path: Graphics.Path, point3d: Point3d, camera: Camera];
LineTo: PROC [path: Graphics.Path, point3d: Point3d, camera: Camera, localCS: CoordSystem];
DrawTo: PROC [dc: Graphics.Context, point3d: Point3d, camera: Camera, localCS: CoordSystem];
LineToAbsolute: PROC [path: Graphics.Path, point3d: Point3d, camera: Camera];
DrawToAbsolute: PROC [dc: Graphics.Context, point3d: Point3d, camera: Camera];
DrawStroke: PROC [dc: Graphics.Context, path: Graphics.Path, width: REAL ← 1,
closed: BOOLEANFALSE, ends: StrokeEnds ← butt];
DrawLine: PROC [dc: Graphics.Context, start: Point3d, end: Point3d, camera: Camera, localCS: CoordSystem];

DrawArea: PROC [dc: Graphics.Context, normal: Vector, poly3d: Poly3d, artwork: Artwork, lightSources: LightSourceList, camera: Camera,
 localCS: CoordSystem];
-- normal and poly3d in local coordinates.
DrawAreaNormalAbsolute: PROC [dc: Graphics.Context, normal: Vector, poly3d: Poly3d, artwork: Artwork, lightSources: LightSourceList, camera: Camera,
 localCS: CoordSystem];
-- normal is assumed to be in Camera coordinates. poly3d in local coordinates.
DrawAreaAbsolute: PROC [dc: Graphics.Context, poly3d: Poly3d, camera: Camera];
-- area is drawn a solid color so normal information is not needed. poly3d in Camera coordinates.

END.