<> <> <> DIRECTORY CSG, CSGGraphics, CoordSys, Graphics, GraphicsColor, IO, Matrix3d, Rope, Shading, SV2d, SVArtwork, SVBoundBox, SVPolygon3d, SVVector3d; DisplayList3d: DEFINITIONS = BEGIN versionRope: Rope.ROPE; <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> Artwork: TYPE = REF ArtworkObj; ArtworkObj: TYPE = SVArtwork.ArtworkObj; BoundHedron: TYPE = SVBoundBox.BoundHedron; Classification: TYPE = REF ClassificationObj; ClassificationObj: TYPE = CSG.ClassificationObj; Color: TYPE = GraphicsColor.Color; CoordSysList: TYPE = CoordSys.CoordSysList; CoordSysObj: TYPE = CoordSys.CoordSysObj; CoordSystem: TYPE = REF CoordSysObj; CSGTree: TYPE = REF CSGTreeObj; CSGTreeObj: TYPE = CSG.CSGTreeObj; Camera: TYPE = REF CameraObj; CameraObj: TYPE = CSGGraphics.CameraObj; DrawStyle: TYPE = CSGGraphics.DrawStyle; -- {wire, shaded, rayCast, normals} FrameBox: TYPE = CSGGraphics.FrameBox; Matrix4by4: TYPE = Matrix3d.Matrix4by4; Plane: TYPE = SVPolygon3d.Plane; Point2d: TYPE = SV2d.Point2d; Point3d: TYPE = Matrix3d.Point3d; PointSetOp: TYPE = CSG.PointSetOp; -- {union, intersection, difference} Poly3d: TYPE = SVPolygon3d.Poly3d; Primitive: TYPE = REF PrimitiveObj; PrimitiveObj: TYPE = CSG.PrimitiveObj; Ray: TYPE = REF RayObj; RayObj: TYPE = CSG.RayObj; Vector: TYPE = SVVector3d.Vector; <> <> Database: TYPE = REF DatabaseObj; DatabaseObj: TYPE = RECORD [scenes: LIST OF Scene]; Scene: TYPE = REF SceneObj; SceneObj: TYPE = RECORD [ name: Rope.ROPE, worldCS: CoordSystem, -- a name for the identity matrix coordSystems: CoordSysList, lightSources: LightSourceList, masterObjects: MasterObjectList, assembly: Assembly, cameras: FileCameraList, cameraOrder: LIST OF Rope.ROPE, backgroundColor: Color, shadows: BOOL, dirty: BOOL]; <> Assembly: TYPE = REF AssemblyObj; AssemblyObj: TYPE = RECORD [ name: Rope.ROPE, coordSys: CoordSystem, artwork: Artwork, scalars: Vector, visible: BOOL, isTool: BOOL, object: REF ANY -- a MasterObject or an assembly list ]; AssemblyList: TYPE = REF AssemblyListObj; AssemblyListObj: TYPE = RECORD [ list: LIST OF Assembly, pointSetOp: PointSetOp]; LightSourceList: TYPE = Shading.LightSourceList; -- LIST OF LightSource; LightSource: TYPE = REF LightSourceObj; LightSourceObj: TYPE = Shading.LightSourceObj; FileCamera: TYPE = REF FileCameraObj; FileCameraObj: TYPE = RECORD [ name: Rope.ROPE, origin: Point3d, focusPoint: Point3d, slant: REAL, -- the slant of the camera counter-clockwise from horizontal in degrees. resolution: REAL, focalLength: REAL, frame: FrameBox, clippingPlanes: LIST OF Plane, visibleAssemblies: LIST OF Rope.ROPE]; FileCameraList: TYPE = LIST OF FileCamera; <> MasterObjectClass: TYPE = REF MasterObjectClassObj; MasterObjectClassObj: TYPE = RECORD [ name: Rope.ROPE, filein: FileinProc, fileout: FileoutProc, rayCast: RayCastProc, rayCastNoBBoxes: RayCastNoBBoxesProc, getHedron: BoundHedronProc, preprocess: PreprocessProc, lineDraw: LineDrawProc, normalsDraw: NormalsDrawProc, countSurf: CountPlanarSurfacesProc, getSurf: GetPlanarSurfacesProc, drawSurf: DrawPlanarSurfaceProc, drawSubBoxes: DrawSubBoxesProc]; MasterObjectClassList: TYPE = LIST OF MasterObjectClass; <> MasterObject: TYPE = REF MasterObjectRec; MasterObjectRec: TYPE = RECORD [ name: Rope.ROPE, class: MasterObjectClass, mainBody: REF ANY _ NIL, -- information independent of imaging style lineBody: REF ANY, shadeBody: REF ANY, rayCastBody: REF ANY ]; MasterObjectList: TYPE = LIST OF MasterObject; FileoutProc: TYPE = PROC [f: IO.STREAM, mo: MasterObject]; FileinProc: TYPE = PROC [f: IO.STREAM, name: Rope.ROPE] RETURNS [mo: MasterObject]; RayCastProc: TYPE = CSG.RayCastProc; RayCastNoBBoxesProc: TYPE = CSG.RayCastNoBBoxesProc; BoundHedronProc: TYPE = PROC [mo: MasterObject] RETURNS [hedron: BoundHedron]; PreprocessProc: TYPE = PROC [prim: Primitive, camera: Camera]; LineDrawProc: TYPE = PROC[dc: Graphics.Context, data: REF ANY, camera: Camera, localCS: CoordSystem]; NormalsDrawProc: TYPE = PROC[dc: Graphics.Context, data: REF ANY, camera: Camera, localCS: CoordSystem]; CountPlanarSurfacesProc: TYPE = PROC [masterObject: MasterObject] RETURNS [len: NAT]; GetPlanarSurfacesProc: TYPE = PROC [assembly: Assembly, camera: CoordSystem] RETURNS [PlanarSurfaceList]; PlanarSurface: TYPE = REF PlanarSurfaceObj; PlanarSurfaceObj: TYPE = RECORD [ whichSurface: REF ANY, <> assembly: Assembly, mo: MasterObject, normal: Vector, depth: REAL]; -- in camera coords which the master object calculates (for now) <> PlanarSurfaceList: TYPE = LIST OF PlanarSurface; DrawPlanarSurfaceProc: TYPE = PROC [dc: Graphics.Context, ps: PlanarSurface, lightSources: LightSourceList, camera: Camera]; DrawSubBoxesProc: TYPE = PROC [dc: Graphics.Context, prim: Primitive, screenCS: CoordSystem]; <> <> NoOpRayCast: RayCastProc; NoOpRayCastNoBBoxes: RayCastNoBBoxesProc; NoOpPreprocess: PreprocessProc; NoOpLineDraw: LineDrawProc; NoOpNormalsDraw: NormalsDrawProc; NoOpCountPlanarSurfaces: CountPlanarSurfacesProc; NoOpGetPlanarSurfaces: GetPlanarSurfacesProc; NoOpDrawPlanarSurface: DrawPlanarSurfaceProc; NoOpDrawSubBoxes: DrawSubBoxesProc; <> RegisterMasterObjectClass: PROC [ name: Rope.ROPE, filein: FileinProc, fileout: FileoutProc, rayCast: RayCastProc, rayCastNoBBoxes: RayCastNoBBoxesProc, getHedron: BoundHedronProc, preprocess: PreprocessProc, lineDraw: LineDrawProc, normalsDraw: NormalsDrawProc, countSurf: CountPlanarSurfacesProc, getSurf: GetPlanarSurfacesProc, drawSurf: DrawPlanarSurfaceProc, drawSubBoxes: DrawSubBoxesProc] RETURNS [moClass: MasterObjectClass]; <> RegisterMasterObject: PROC [mo: MasterObject]; <> <> CreateScene: PROC [name: Rope.ROPE] RETURNS [scene: Scene]; <> CreateEmptyScene: PROC [name: Rope.ROPE] RETURNS [scene: Scene]; <> CreateMasterObject: PROC [ name: Rope.ROPE, class: MasterObjectClass, mainBody: REF ANY, lineBody: REF ANY, shadeBody: REF ANY, rayCastBody: REF ANY] RETURNS [mo: MasterObject]; CopyMasterObject: PROC [mo: MasterObject] RETURNS [copy: MasterObject]; CreatePrimitiveAssembly: PROC [name: Rope.ROPE, object: Rope.ROPE, size: Vector, scene: Scene, artwork: Artwork _ NIL, isTool: BOOL _ FALSE] RETURNS [assembly: Assembly, masterObjectFound: BOOL]; <> CreateClusterAssembly: PROC [name: Rope.ROPE, pointSetOp: PointSetOp, isTool: BOOL _ FALSE] RETURNS [assembly: Assembly]; CreateLightSource: PROC [name: Rope.ROPE, position: Point3d, color: Color] RETURNS [ls: LightSource]; CreateFileCamera: PROC [name: Rope.ROPE, origin: Point3d, focusPoint: Point3d, slant: REAL, resolution: REAL, focalLength: REAL, clippingPlanes: LIST OF Plane, visibleAssemblies: LIST OF Rope.ROPE] RETURNS [fileCamera: FileCamera]; CameraFromFileCamera: PROC [fileCamera: FileCamera, worldCS: CoordSystem, screenCS: CoordSystem, style: DrawStyle] RETURNS [camera: Camera]; <> InitialCameraList: PROC [] RETURNS [cameras: FileCameraList]; <> <> <> NameAlreadyPresent: SAFE SIGNAL; AddMasterObjectToScene: PROC [mo: MasterObject, scene: Scene]; <> AddLightSourceToScene: PROC [ls: LightSource, scene: Scene]; <> AddCameraToScene: PROC [fileCamera: FileCamera, scene: Scene]; <> AddCameraOrderNameToScene: PROC [name: Rope.ROPE, scene: Scene]; <> AddCoordSysToScene: PROC [cs: CoordSystem, scene: Scene]; AddAssemblyToScene: PROC [assembly: Assembly, scene: Scene, mat: Matrix4by4]; <> AddSubassemblyToAssembly: PROC [subassembly: Assembly, assembly: Assembly, scene: Scene, mat: Matrix4by4]; <> AttemptToAddSubassemblyToPrimitive: SIGNAL; <> RenameAssembly: PROC [assem: Assembly, newName: Rope.ROPE, scene: Scene]; CopyAssemblyAndSons: PROC [assembly: Assembly, scene: Scene, prefix: Rope.ROPE] RETURNS [copy: Assembly]; <> MoveSubassembly: PROC [assem: Assembly, to: Assembly, scene: Scene]; MoveToFrontOfAssembly: PROC [subassembly: Assembly, assembly: Assembly, scene: Scene]; <> MergeAssemblyIntoScene: PROC [newAssembly: Assembly, fromScene: Scene, parentAssembly: Assembly, toScene: Scene] RETURNS [copyAssembly: Assembly]; <> MergeSceneIntoScene: PROC [fromScene: Scene, toScene: Scene] RETURNS [success: BOOL]; <> SetArtworkAssembly: PROC [assembly: Assembly, artwork: Artwork, scene: Scene]; <> FindSceneFromName: PROC [name: Rope.ROPE] RETURNS [scene: Scene]; <> DatabaseEmpty: SIGNAL; SceneNotFound: SIGNAL; FindAssemblyFromName: PROC [name: Rope.ROPE, scene: Scene] RETURNS [assembly: Assembly, superAssembly: Assembly]; <> AssemblyNotFound: SIGNAL; AssemblyNameIsPresent: PROC [name: Rope.ROPE, scene: Scene] RETURNS [BOOL]; <> AnyNamesAlreadyPresent: PROC [assembly: Assembly, scene: Scene] RETURNS [BOOL]; <> NewNamesAlreadyPresent: PROC [assembly: Assembly, scene: Scene, prefix: Rope.ROPE] RETURNS [BOOL]; <> FindClassFromName: PROC [name: Rope.ROPE] RETURNS [moClass: MasterObjectClass, success: BOOL]; FindObjectFromName: PROC [name: Rope.ROPE, scene: Scene] RETURNS [object: MasterObject, success: BOOL]; ObjectNameIsPresent: PROC [name: Rope.ROPE, scene: Scene] RETURNS [BOOL]; CoordSysNameIsPresent: PROC [name: Rope.ROPE, scene: Scene] RETURNS [BOOL]; FindLightFromName: PROC [name: Rope.ROPE, scene: Scene] RETURNS [light: LightSource, success: BOOL]; LightSourceNameIsPresent: PROC [name: Rope.ROPE, scene: Scene] RETURNS [BOOL]; FindFileCameraFromName: PROC [name: Rope.ROPE, scene: Scene] RETURNS [fileCamera: FileCamera, success: BOOL]; FileCameraNameIsPresent: PROC [name: Rope.ROPE, scene: Scene] RETURNS [BOOL]; UniqueNameFrom: PROC [name: Rope.ROPE, scene: Scene] RETURNS [unique: Rope.ROPE]; <> <> GetSceneGenerator: PROC RETURNS [g: SceneGenerator]; <> SceneGenerator: TYPE = REF SceneGeneratorObj; SceneGeneratorObj: TYPE = RECORD [currentPtr: LIST OF Scene]; NextScene: PROC [g: SceneGenerator] RETURNS [scene: Scene]; <> GetCoordSysGenerator: PROC [scene: Scene] RETURNS [g: CoordSysGenerator]; <> CoordSysGenerator: TYPE = REF CoordSysGeneratorObj; CoordSysGeneratorObj: TYPE = RECORD[currentPtr: LIST OF CoordSystem]; NextCoordSys: PROC [g: CoordSysGenerator] RETURNS [cs: CoordSystem]; <> GetAssemblyGenerator: PROC [scene: Scene] RETURNS [g: AssemblyGenerator]; <> AssemblyGenerator: TYPE = REF AssemblyGeneratorObj; AssemblyGeneratorObj: TYPE = RECORD[currentPtr: LIST OF Assembly]; NextAssembly: PROC [g: AssemblyGenerator] RETURNS [a: Assembly]; <> GetLightSourceGenerator: PROC [scene: Scene] RETURNS [g: LightSourceGenerator]; <> LightSourceGenerator: TYPE = REF LightSourceGeneratorObj; LightSourceGeneratorObj: TYPE = RECORD [currentPtr: LightSourceList]; NextLight: PROC [g: LightSourceGenerator] RETURNS [ls: LightSource]; <> GetMasterObjectClassGenerator: PROC [scene: Scene] RETURNS [g: MasterObjectClassGenerator]; MasterObjectClassGenerator: TYPE = REF MasterObjectClassGeneratorObj; MasterObjectClassGeneratorObj: TYPE = RECORD [ currentPtr: MasterObjectClassList]; NextClass: PROC [g: MasterObjectClassGenerator] RETURNS [moClass: MasterObjectClass]; <> MasterObjectsOfScene: PROC [scene: Scene] RETURNS [l: MasterObjectList]; MasterObjectsOfAssembly: PROC [assembly: Assembly, scene: Scene] RETURNS [l: MasterObjectList]; <> ListOfPrimAssemblies: PROC [assembly: Assembly, scene: Scene] RETURNS [primList: LIST OF Assembly]; <> <> DeleteMasterObjectNamed: PROC [moName: Rope.ROPE, scene: Scene] RETURNS [found: BOOL]; DeleteMasterObjectIfUnused: PROC [mo: MasterObject, scene: Scene] RETURNS [found: BOOL]; DeleteCoordSysNamed: PROC [csName: Rope.ROPE, scene: Scene]; DeleteLightSourceNamed: PROC [lsName: Rope.ROPE, scene: Scene]; ClearScene: PROC [scene: Scene]; <> ClearCoordSystems: PROC [scene: Scene]; <> ClearMasterObjects: PUBLIC PROC [scene: Scene]; <> DeleteSubassemblyFromAssembly: PROC [subassembly: Assembly, assembly: Assembly, scene: Scene _ NIL] RETURNS [success: BOOL]; <> <> DrawScene: PROC [dc: Graphics.Context, scene: Scene, camera: Camera]; <> DrawAssembly: PROC [dc: Graphics.Context, assembly: Assembly, scene: Scene, camera: Camera]; <> <> SceneToTree: PROC [scene: Scene, camera: Camera] RETURNS [tree: CSGTree]; ListTree: PROC [outHandle: IO.STREAM, tree: CSGTree]; END.