MODULE SceneTest EXPORTS Main; IMPORT Scene, SceneShade, HLR3, R4, Scan, Fmt, ParseParams, Wr, Thread, Process; FROM Scene IMPORT Vertex, VertexList, MakeVertex, PrintVertex, Edge, EdgeList, MakeEdge, PrintEdge, Face, FaceList, MakeFace, PrintFace, PrintScene; FROM Stdio IMPORT stderr; TYPE Options = RECORD END; PROCEDURE Main() = <* FATAL Wr.Failure, Thread.Alerted *> BEGIN WITH o = GetOptions() DO (* TestCutScene(); *) TestVisible(); END END Main; <*UNUSED*> PROCEDURE TestCutScene() = <* FATAL Wr.Failure, Thread.Alerted *> VAR sc, scn, scz, scp: Scene.T; BEGIN WITH obs = HLR3.Point{c := R4.T{0.0, 0.0, 0.0, 1.0}}, focus = HLR3.Point{c := R4.T{1.0, 0.0, 0.0, 0.0}}, pl = HLR3.Plane{f := R4.T{0.0, 0.0, 1.0, 0.0}} DO sc.t := MakeFaces(1); sc.e := NIL; sc.v := NIL; Scene.CloseScene(sc); Scene.EvalVertices(sc.v, pl, +1); Wr.PutText(stderr, "*** original scene *****************************\n"); PrintScene(stderr, sc); Wr.PutText(stderr, "\n"); Scene.CutScene(sc, TRUE, TRUE, TRUE, scn, scz, scp); Wr.PutText(stderr, "*** negative scene *****************************\n"); PrintScene(stderr, scn); Wr.PutText(stderr, "\n"); Wr.PutText(stderr, "*** zero scene *****************************\n"); PrintScene(stderr, scz); Wr.PutText(stderr, "\n"); Wr.PutText(stderr, "*** positive scene *****************************\n"); PrintScene(stderr, scp); Wr.PutText(stderr, "\n"); END END TestCutScene; PROCEDURE TestVisible() = <* FATAL Wr.Failure, Thread.Alerted *> VAR sc: Scene.T; opq: FaceList; BEGIN WITH obs = HLR3.Point{c := R4.T{0.0, 0.0, 0.0, 1.0}} DO sc.t := MakeFaces(2); sc.v := NIL; sc.e := NIL; Scene.CloseScene(sc); Wr.PutText(stderr, "*** original scene *****************************\n"); PrintScene(stderr, sc); Wr.PutText(stderr, "\n"); opq := NIL; Scene.CopyFaceList(sc.t, opq); SceneShade.Visible(sc.t, opq, obs); Wr.PutText(stderr, "*** visible scene *****************************\n"); sc.v := NIL; sc.e := NIL; Scene.CloseScene(sc); PrintScene(stderr, sc); WITH file = "egscenetest-vis", foc = HLR3.Point{c := R4.T{1.0, 0.0, 0.0, 0.0}}, upp = HLR3.Point{c := R4.T{0.0, 1.0e-8, 1.0e-4, 1.0}}, w2i = HLR3.PerspMap(obs, foc, upp) DO Scene.PlotScene( file, sc, -3.0d0, 3.0d0, -3.0d0, 3.0d0, w2i ) END; Wr.PutText(stderr, "\n"); END END TestVisible; PROCEDURE MakeFaces(ntri: CARDINAL): FaceList = VAR nt: CARDINAL := 0; PROCEDURE MkOrg(): REFANY = BEGIN WITH o = NEW(REF CARDINAL) DO o^ := nt; INC(nt); RETURN o END END MkOrg; VAR tri: FaceList := NIL; BEGIN FOR k := 0 TO ntri-1 DO WITH s = FLOAT(k)/2.0, av = HLR3.Point{c := R4.T{1.0, +1.0-s, +1.0-s, 0.0-s}}, bv = HLR3.Point{c := R4.T{1.0, -1.0-s, +2.0-s, 0.0-s}}, cv = HLR3.Point{c := R4.T{1.0, 00.0-s, -2.0-s, 0.0-s}}, abcpl = HLR3.Join(av, bv, cv), pl = NEW(REF HLR3.Plane, f := abcpl.f), a = MakeVertex(MkOrg(), av), b = MakeVertex(MkOrg(), bv), c = MakeVertex(MkOrg(), cv), ab = MakeEdge(MkOrg(), a, b), bc = MakeEdge(MkOrg(), b, c), ac = MakeEdge(MkOrg(), a, c), abc = MakeFace(MkOrg(), ab, 0, bc, 0, ac, 1, pl) DO WITH tl = NEW(FaceList) DO tl.t := abc; tl.rest := tri; tri := tl END END; END; RETURN tri END MakeFaces; PROCEDURE GetOptions (): Options = <* FATAL Thread.Alerted, Wr.Failure *> VAR o: Options; BEGIN TRY WITH pp = NEW(ParseParams.T).init(stderr) DO; pp.finish(); EXCEPT | ParseParams.Error => Wr.PutText(stderr, "Usage: SceneTest \n"); Process.Exit (1); END; RETURN o END GetOptions; BEGIN Main(); END SceneTest.