-- File: ObjectCast.mesa
-- Last edited by Bier on December 18, 1982 1:23 am
-- Author: Eric Bier on July 3, 1983 1:54 pm
-- Contents: Procedures to determine intersections of rays with primitive objects

DIRECTORY
 CastRays,
CSG,
 Matrix3d,
 SV2d,
 SVVector3d;

ObjectCast: DEFINITIONS =

BEGIN

Composite: TYPE = REF CompositeObj;
CompositeObj: TYPE = CSG.CompositeObj;
CSGTree: TYPE = REF CSGTreeObj;
CSGTreeObj: TYPE = CSG.CSGTreeObj;
Point2d: TYPE = SV2d.Point2d;
Point3d: TYPE = Matrix3d.Point3d;
Primitive: TYPE = REF PrimitiveObj;
PrimitiveObj: TYPE = CSG.PrimitiveObj;
Surface: TYPE = REF ANY;
Vector: TYPE = SVVector3d.Vector;

RectSurface: TYPE = REF RectSurfaceObj;
RectSurfaceObj: TYPE = RECORD [rectType: RectType];
 RectType: TYPE = {up, down, left, right, front, back};
TubeSurface: TYPE = REF TubeSurfaceObj;
TubeSurfaceObj: TYPE = RECORD [];
DiskSurface: TYPE = REF DiskSurfaceObj;
DiskSurfaceObj: TYPE = RECORD [diskType: DiskType];
 DiskType: TYPE = {top, bottom};
ShellSurface: TYPE = REF ShellSurfaceObj;
ShellSurfaceObj: TYPE = RECORD [];
ConeSurface: TYPE = REF ConeSurfaceObj;
ConeSurfaceObj: TYPE = RECORD [];
ToroidalSurface: TYPE = REF ToroidalSurfaceObj;
ToroidalSurfaceObj: TYPE = RECORD [];

-- maxSceneDepth: NAT = 10.;

ParameterArray: TYPE = CastRays.ParameterArray; -- ARRAY [1..maxSceneDepth] OF REAL;
SurfaceArray: TYPE = REF SurfaceArrayObj;
SurfaceArrayObj: TYPE = CSG.SurfaceArrayObj;
-- ARRAY [1..maxSurfacesPerObject] OF Surface;
InOutArray: TYPE = CastRays.InOutArray; -- ARRAY [1..maxSceneDepth] OF BOOL;
NormalArray: TYPE = CastRays.NormalArray; -- ARRAY [1..maxSceneDepth] OF Vector;

Classification: TYPE = REF ClassificationObj;
ClassificationObj: TYPE = CastRays.ClassificationObj;
-- RECORD [
-- count: NAT,
-- params: ParameterArray,
-- surfaces: SurfaceArray,
 -- primitives: PrimitiveArray,
-- classifs: InOutArray,
-- normals: NormalArray];

Ray: TYPE = REF RayObj;
RayObj: TYPE = CastRays.RayObj;
-- RECORD [
-- basePt: Point3d,
-- direction: Vector];

HitRec: TYPE = REF HitRecObj;
HitRecObj: TYPE = RECORD [t: REAL, surf: Surface, normal: Vector];
HitArray: TYPE = REF HitArrayObj;
HitArrayObj: TYPE = ARRAY[1..globalObjDepth] OF HitRec;
globalObjDepth: NAT = 6;

-- Each primitive shape must have a procedure here which can classify a ray with respect to it.
BlockCast: PROC [localRay: Ray, surfs: SurfaceArray, prim: Primitive] RETURNS [class: Classification];
SphereCast: PROC [localRay: Ray, thisShell: Surface, prim: Primitive] RETURNS [class: Classification];
CylinderCast: PROC [localRay: Ray, surfaces: SurfaceArray, prim: Primitive]
RETURNS [class: Classification];
ConeCast: PROC [localRay: Ray, surfaces: SurfaceArray, prim: Primitive] RETURNS [class: Classification];
ToroidCast: PROC [localRay: Ray, prim: Primitive, torusRec: REF ANY, surface: Surface]
RETURNS [class: Classification];
-- torusRec is a BasicObject3d.TorusRec. It is a REF ANY to avoid compilation dependencies

END.