MODULE SceneDemo;


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

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


FROM RandomNumber IMPORT RND;
FROM GfxDecs      IMPORT GfxMode, GfxPtr, Voxel, Direction, ScenePtr, NameType;
FROM GfxSystem    IMPORT OpenStdGfx, CloseGfx, ClearGfx, GfxToFront;
FROM Camera       IMPORT SetCameraTo;
FROM System3D     IMPORT SetVoxelTo, SetDirectTo, AddDirect;
FROM SceneLib     IMPORT InitScene, EndScene, RecolorObject, MoveRefVoxTo,
                         TurnObjectX, TurnObjectY, TurnObjectZ;
FROM ShapeLib     IMPORT Block, Cone, Cylinder, Sphere;
FROM SceneFig     IMPORT InsArc, InsStar, InsTrapez;
FROM ShowScene    IMPORT ShowGrid, HiddenLine, HiddenSurface;
FROM ColorLib     IMPORT SetColors, SetEHBColors;

VAR Gfx:         ARRAY BOOLEAN OF GfxPtr;
    Scene:       ScenePtr;
    tur,add,lit: Direction;
    pos:         Voxel;
    n,m,Col,rnd: INTEGER;
    bool:        BOOLEAN;


PROCEDURE PutObject (Name: NameType; x, y: INTEGER);

VAR hei: INTEGER;
    pos,siz: Voxel;

BEGIN
  INC(Col);
  IF Col > 5 THEN Col := 1;
  END;
  INC(rnd);
  IF rnd > 8 THEN rnd := 0;
  END;
  SetVoxelTo(pos,x,y,0);
  IF rnd = 1 THEN
    Sphere(Scene,Name,RND(5000)+5000,RND(4)+3,tur,pos,Col);
  ELSIF rnd = 3 THEN
    hei := RND(10000)+10000;
    INC(pos[2],hei DIV 2);
    Cone(Scene,Name,hei,RND(5000)+5000,RND(4)+3,tur,pos,Col);
    DEC(pos[2],hei DIV 2);
    MoveRefVoxTo(Scene,Name,pos);
  ELSIF rnd = 4 THEN
    hei := RND(3) + 3;
    IF hei >= 4 THEN
      INC(hei);
    END;
    Cylinder(Scene,Name,RND(10000)+10000,RND(5000)+5000,hei,tur,pos,Col);
  ELSIF rnd = 6 THEN
    InsArc(Scene,Name,pos[1],pos[2],pos[3],RND(5000)+5000,RND(1800)+900,
           0,0,0,Col,RND(5000)+5000);
  ELSIF rnd = 8 THEN
    InsStar(Scene,Name,pos[1],pos[2],pos[3],RND(3500)+3000,RND(3000)+7000,
            RND(6)+4,0,0,0,Col,RND(5000)+5000);
  ELSIF (rnd = 0) OR (rnd = 5)THEN
    InsTrapez(Scene,Name,pos[1],pos[2],pos[3],RND(5000)+15000,RND(5000)+5000,
              RND(5000)+15000,0,0,0,Col,RND(5000)+5000);
  ELSE (* rnd = 2 oder 7 *)
    SetVoxelTo(siz,RND(5000)+5000,RND(5000)+5000,RND(5000)+5000);
    Block(Scene,Name,siz,tur,pos,Col);
  END; (* IF *)
END PutObject;


BEGIN
  Col := 0;
  Gfx[TRUE]  := OpenStdGfx(EHB,FALSE);
  Gfx[FALSE] := OpenStdGfx(EHB,FALSE);
  SetColors(Gfx[TRUE], 0,0,"000 79B A46 888 36B 7A5");
  SetColors(Gfx[FALSE],0,0,"000 79B A46 888 36B 7A5");
  SetEHBColors(Gfx[TRUE], 0,"79B A46 888 36B 7A5");
  SetEHBColors(Gfx[FALSE],0,"79B A46 888 36B 7A5");
  FOR m := 1 TO 3 DO
    Scene := InitScene();
    SetDirectTo(tur,0,0,0);
    PutObject("1.",+14000,+14000);
    PutObject("2.",+14000,-14000);
    PutObject("3.",-14000,-14000);
    PutObject("4.",-14000,+14000);
    SetDirectTo(tur,200,80,0);
    SetDirectTo(add,5,15,10);
    SetDirectTo(lit,0,0,0);
    FOR n := 1 TO 20 DO
      bool := NOT bool;
      SetCameraTo(Gfx[bool],100,tur,600,0,0);
      ClearGfx(Gfx[bool]);
      ShowGrid(Gfx[bool],Scene);
      GfxToFront(Gfx[bool]);
      TurnObjectX(Scene,"1.",90);
      TurnObjectY(Scene,"2.",90);
      TurnObjectZ(Scene,"3.",90);
      AddDirect(tur,add);
    END;
    SetVoxelTo(pos,13000,0,0);
    MoveRefVoxTo(Scene,"1.",pos);
    MoveRefVoxTo(Scene,"2.",pos);
    FOR n := 1 TO 20 DO
      bool := NOT bool;
      SetCameraTo(Gfx[bool],100,tur,600,0,0);
      ClearGfx(Gfx[bool]);
      HiddenLine(Gfx[bool],Scene);
      GfxToFront(Gfx[bool]);
      AddDirect(tur,add);
      TurnObjectX(Scene,"1.",90);
      TurnObjectX(Scene,"2.",90);
    END;
    FOR n := 1 TO 20 DO
      bool := NOT bool;
      SetCameraTo(Gfx[bool],100,tur,600,0,0);
      ClearGfx(Gfx[bool]);
      HiddenSurface(Gfx[bool],Scene,0);
      GfxToFront(Gfx[bool]);
      AddDirect(tur,add);
      TurnObjectY(Scene,"3.",90);
      TurnObjectZ(Scene,"4.",90);
    END;
    RecolorObject(Scene,"1.",TRUE,1);
    RecolorObject(Scene,"2.",TRUE,2);
    RecolorObject(Scene,"3.",TRUE,3);
    RecolorObject(Scene,"4.",TRUE,4);
    FOR n := 1 TO 20 DO
      bool := NOT bool;
      SetCameraTo(Gfx[bool],100,tur,600,0,0);
      ClearGfx(Gfx[bool]);
      HiddenSurface(Gfx[bool],Scene,-1);
      GfxToFront(Gfx[bool]);
      AddDirect(tur,add);
    END;
    EndScene(Scene);
  END; (* FOR *)
  CloseGfx(Gfx[TRUE]); CloseGfx(Gfx[FALSE]);
END SceneDemo.


