MODULE Rings;


(*****************************************************************************)
(*                                                                           *)
(*  Modul: Rings                           Version 1.0 vom 1. November 1990  *)
(*                                                                           *)
(*  Für M2Amiga Modula-2 von Olaf Pfeiffer                                   *)
(*                                                                           *)
(*****************************************************************************)

(* $F- $R- $V- $N- *)


(* Die folgenden Importe beziehen sich auf die GraphicTreasures *)

FROM GfxDecs      IMPORT GfxMode, GfxPtr, Voxel, Direction, ScenePtr, Pixel;
FROM GfxSystem    IMPORT OpenStdGfx, CloseGfx, ClearGfx, GfxToFront;
FROM Camera       IMPORT SetCameraTo;
FROM System3D     IMPORT SetVoxelTo, SetDirectTo, AddDirect;
FROM SceneLib     IMPORT InitScene, EndScene, TurnObjectX, RecolorObject,
                         CopyObject, TurnObject, MoveObjectTo;
FROM ShapeLib     IMPORT RotatePoly;
FROM ShowScene    IMPORT ShowGrid, HiddenLine, HiddenSurface;
FROM ColorLib     IMPORT SetColors, SetEHBColors;

VAR Gfx:         ARRAY BOOLEAN OF GfxPtr;
    Scene:       ScenePtr;
    Lin:         ARRAY [0..6] OF Pixel;
    tur,add,lit: Direction;
    pos:         Voxel;
    n:           INTEGER;
    bool:        BOOLEAN;

BEGIN
  Gfx[TRUE]  := OpenStdGfx(EHB,FALSE);       (* Zwei "Grafik-Screen"s öffnen *)
  Gfx[FALSE] := OpenStdGfx(EHB,FALSE);
  SetColors(Gfx[TRUE], 0,0,"555 999 46A A45 37B 000");
  SetColors(Gfx[FALSE],0,0,"555 999 46A A45 37B 000");
  SetEHBColors(Gfx[TRUE], 0,"999 46A A45 37B 000");
  SetEHBColors(Gfx[FALSE],0,"999 46A A45 37B 000");
  Scene := InitScene();
  Lin[0].x  := -5000; Lin[0].y  := 13000;   (* 2D - Sechseck *)
  Lin[1].x  := -2500; Lin[1].y  := 17330;
  Lin[2].x  :=  2500; Lin[2].y  := 17330;
  Lin[3].x  :=  5000; Lin[3].y  := 13000;
  Lin[4].x  :=  2500; Lin[4].y  :=  8670;
  Lin[5].x  := -2500; Lin[5].y  :=  8670;
  Lin[6].x  := -5000; Lin[6].y  := 13000;
  SetDirectTo(tur,0,0,0);
  SetVoxelTo(pos,0,6500,0);
  RotatePoly(Scene,"1.Thorus",6,7,Lin,tur,pos,1);  (* Sechseck rotieren *)
  CopyObject(Scene,Scene,"1.Thorus","2.Thorus");
  RecolorObject(Scene,"1.Thorus",TRUE,1);
  RecolorObject(Scene,"2.Thorus",TRUE,2);
  SetDirectTo(tur,0,900,0);
  TurnObject(Scene,"2.Thorus",tur);
  SetVoxelTo(pos,0,-6500,0);
  MoveObjectTo(Scene,"2.Thorus",pos);
  SetDirectTo(tur,200,80,0);
  SetDirectTo(add,-35,120,-50);
  SetDirectTo(lit,0,0,0);
  FOR n := 1 TO 12 DO                           (* "Animieren" *)
    bool := NOT bool;
    SetCameraTo(Gfx[bool],100,tur,0,0,0);
    ClearGfx(Gfx[bool]);
    ShowGrid(Gfx[bool],Scene);
    GfxToFront(Gfx[bool]);
    TurnObjectX(Scene,"1.Thorus",100);
    AddDirect(tur,add);
  END;
  FOR n := 1 TO 24 DO
    bool := NOT bool;
    SetCameraTo(Gfx[bool],100,tur,0,0,0);
    ClearGfx(Gfx[bool]);
    HiddenLine(Gfx[bool],Scene);
    GfxToFront(Gfx[bool]);
    AddDirect(tur,add);
  END;
  RecolorObject(Scene,"1.Thorus",TRUE,3);
  RecolorObject(Scene,"2.Thorus",TRUE,4);
  FOR n := 1 TO 36 DO
    bool := NOT bool;
    SetCameraTo(Gfx[bool],100,tur,0,0,0);
    ClearGfx(Gfx[bool]);
    HiddenSurface(Gfx[bool],Scene,0);
    GfxToFront(Gfx[bool]);
    AddDirect(tur,add);
    TurnObjectX(Scene,"1.Thorus",100);
  END;
  EndScene(Scene);
  CloseGfx(Gfx[TRUE]); CloseGfx(Gfx[FALSE]);
END Rings.


