<> <> <> <> DIRECTORY CastRays, CSG, IO, Matrix3d, Shading, SVFancyRays, SVVector3d; SVFancyRaysImpl: PROGRAM IMPORTS CastRays, IO, SVVector3d EXPORTS SVFancyRays = BEGIN CSGTree: TYPE = REF CSGTreeObj; CSGTreeObj: TYPE = CSG.CSGTreeObj; LightSource: TYPE = Shading.LightSource; LightSourceList: TYPE = Shading.LightSourceList; Point3d: TYPE = Matrix3d.Point3d; Ray: TYPE = CSG.Ray; VisibleLights: PUBLIC PROC [allLights: LightSourceList, surfacePoint: Point3d, tree: CSGTree, makeStream: BOOL _ FALSE, f: IO.STREAM _ NIL, indent: NAT _ 0] RETURNS [visibleLights: LightSourceList] = { surfaceToLightRay: Ray; lightsource: LightSource; hits: BOOL; t: REAL; IF makeStream THEN f.PutF["\nFinding Visible Lights...\n\n"]; surfaceToLightRay _ CastRays.GetRayFromPool[]; surfaceToLightRay.basePt _ surfacePoint; visibleLights _ NIL; FOR l: LightSourceList _ allLights, l.rest UNTIL l = NIL DO lightsource _ l.first; surfaceToLightRay.direction _ SVVector3d.Difference[lightsource.position, surfacePoint]; [hits, t] _ CastRays.FirstHit[surfaceToLightRay, tree, makeStream, f, indent]; IF hits THEN { IF t >=1 THEN visibleLights _ CONS[lightsource, visibleLights] <> } ELSE visibleLights _ CONS[lightsource, visibleLights]; ENDLOOP; CastRays.ReturnRayToPool[surfaceToLightRay]; }; END. <> <> <> <<>> <<>> <<>>