home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / gr3d / gr3d_lst.pas next >
Encoding:
Pascal/Delphi Source File  |  1993-08-23  |  6.2 KB  |  279 lines

  1. unit Gr3d_Lst;
  2. {$F+,N+,E+}
  3.  
  4. interface
  5.  
  6. uses
  7.   Graph, Crt, Gr3d_pt;
  8.  
  9. const
  10.   VidPageSize : longint = 60*1024;
  11.   VidAddrPtr  : ^Word = Ptr($A000,0);
  12.  
  13. type
  14.  
  15.   PointPtr = PPointGroup;
  16.  
  17.   NameType = 1..100;
  18.   DoWhat = procedure(Item: PointPtr);
  19.  
  20.   NodePtr = ^Node;
  21.   Node = record
  22.     Item: PointPtr;
  23.     Name: NameType;
  24.     Next: NodePtr;
  25.   end;
  26.  
  27.   View = object
  28.       WX : Integer;
  29.     WY : Integer;
  30.     WXSize : Integer;
  31.     WYSize : Integer;
  32.     BackColor : integer;
  33.  
  34.     First : NodePtr;
  35.     Cursor: NodePtr;
  36.     PreCursor: NodePtr;
  37.     constructor Init(InitWX, InitWY, InitWXSize, InitWYSize: Integer;
  38.                      InitBackColor: integer);
  39.     destructor Done; virtual;
  40.     function GetWindowWidth: Integer;
  41.     function GEtWindowHeight: Integer;
  42.     function GetDelta(var DeltaX: Integer; var DeltaY: Integer; var DeltaZ: Integer): Boolean;
  43.     function Search(ToFind: NameType): NodePtr; virtual;
  44.     procedure SetWindow;
  45.     procedure Select;
  46.     procedure Clear;
  47.     procedure ClearScrn;
  48.     procedure Add(Item: PointPtr; ItemName: NameType);
  49.     procedure Delete(ToDelete: NameType); virtual;
  50.     procedure Traverse(P: DoWhat);
  51.     procedure Show;
  52.     procedure Hide;
  53.     procedure Move(DeltaX, DeltaY, DeltaZ: integer);
  54.     procedure Step(IX, IY, IZ: Integer);
  55.     procedure ConvertPoint(x,y,z: integer; var Sx, Sy: integer);
  56.   end;
  57.  
  58. implementation
  59.  
  60. var
  61.   GlobalDX, GlobalDY, GlobalDZ: integer;
  62.  
  63. {--------------------------------------------------------}
  64. { View's method implementations:                         }
  65. {--------------------------------------------------------}
  66. constructor View.Init(InitWX, InitWY, InitWXSize, InitWYSize: Integer;
  67.                       InitBackColor: integer);
  68. begin
  69.   WX := InitWX;
  70.   WY := InitWY;
  71.   WXSize := InitWXSize;
  72.   WYSize := InitWYSize;
  73.   BackColor := InitBackColor;
  74.   First := nil;
  75. end;
  76.  
  77. function View.GetWindowWidth: Integer;
  78. begin
  79.     GetWindowWidth := WXSize;
  80. end;
  81.  
  82. function View.GetWindowHeight: Integer;
  83. begin
  84.     GetWindowHeight := WYSize;
  85. end;
  86.  
  87. procedure View.SetWindow;
  88. begin
  89.   SetViewPort(WX,WY,WX+WXSize,WY+WYSize,ClipOn);
  90.   Clear;
  91. end;
  92.  
  93. procedure View.Select;
  94. begin
  95.   GraphMidX := WXSize div 2;
  96.   GraphMidY := WYSize div 2;
  97.   SetViewPort(WX,WY,WX+WXSize,WY+WYSize,ClipOn);
  98. end;
  99.  
  100. procedure View.ClearScrn;
  101. begin
  102.   FillChar(VidAddrPtr^, VidPageSize, BackColor);
  103. end;
  104.  
  105. procedure View.Clear;
  106. begin
  107.   SetFillStyle(SolidFill, BackColor);
  108.   Bar(0,0,WXSize,WYSize);
  109. end;
  110.  
  111. function View.GetDelta(var DeltaX: Integer; var DeltaY: Integer; var DeltaZ: Integer): Boolean;
  112. var
  113.   KeyChar: Char;
  114.   Quit: Boolean;
  115. begin
  116.   DeltaX := 0;                   { 0 means no change in position;  }
  117.     DeltaY := 0;
  118.     DeltaZ := 0;      
  119.   GetDelta := True;              { True means we return a delta    }
  120.   repeat
  121.     KeyChar := ReadKey;          { First, read the keystroke }
  122.     Quit := True;                { Assume it's a useable key }
  123.     case Ord(KeyChar) of
  124.        0: begin                  { 0 means an extended, 2-byte code }
  125.             KeyChar := ReadKey;  { Read second byte of code }
  126.             case Ord(KeyChar) of
  127.              80:       DeltaZ := -1;  {Down}
  128.              72:       DeltaZ := 1;   {up}
  129.              75:       DeltaY := -1; {Left}
  130.                      77:       DeltaY := 1;  {Right}
  131.              else Quit := False; { Ignore any other code }
  132.             end; { case }
  133.           end;
  134.        Ord('+'): DeltaX := 1;  {forward}
  135.        Ord('-'): DeltaX := -1; {backward}
  136.       13: GetDelta := False;     { CR pressed means no delta  }
  137.     else Quit := False;          { Ignore any other keystroke }
  138.     end;  { case }
  139.   until Quit;
  140. end;
  141.  
  142. procedure View.Step(IX, IY, IZ: Integer);
  143. const
  144.   PageNumber: integer = 0;
  145. begin
  146. {  PageNumber := 1-PageNumber; }
  147. {  SetActivePage(PageNumber); }
  148.   Clear;
  149.   Move(IX, IY, IZ);
  150.   Show;
  151. {  SetVisualPage(PageNumber); }
  152. end;
  153.  
  154. {--------------------------------------------------------}
  155. { View's list implementations:                           }
  156. {--------------------------------------------------------}
  157.  
  158.  
  159. {------ procedures to be assigned to a variable ------}
  160.  
  161.     procedure HideEach(Item: PointPtr);
  162.   begin
  163.       Item^.Hide;
  164.   end;
  165.     procedure ShowEach(Item: PointPtr);
  166.   begin
  167.       Item^.Draw;
  168.   end;
  169.   procedure MoveEach(Item: PointPtr);
  170.   begin
  171.     Item^.Move(GlobalDX, GlobalDY, GlobalDZ);
  172.   end;
  173.  
  174. destructor View.Done;
  175. var
  176.   N: NodePtr;
  177. begin
  178.   while First <> nil do
  179.   begin
  180.     N := First;
  181.     First := N^.Next;
  182.     Dispose(N^.Item, Done);
  183.     Dispose(N);
  184.   end;
  185. end;
  186.  
  187. procedure View.Add(Item: PointPtr; ItemName: NameType);
  188. var
  189.   N, T: NodePtr;
  190. begin
  191.   New(N);
  192.   N^.Item := Item;
  193.   N^.Name := ItemName;
  194.  
  195.   {place the furthest to the fount}
  196.   if First=nil then
  197.   begin
  198.     First := N;
  199.     First^.Next := nil;
  200.     Exit;
  201.   end;
  202.  
  203.   if First^.Item^.GetX(1) < Item^.GetX(1) then
  204.   begin
  205.        N^.Next := First; First := N;
  206.   end
  207.     else
  208.   begin
  209.       T := First;
  210.       while (T^.Next <> nil) and (T^.Next^.Item^.GetX(1) > Item^.GetX(1)) do
  211.           T := T^.Next;
  212.       N^.Next := T^.Next; T^.Next := N;
  213.   end;
  214. end;
  215.  
  216. function View.Search(ToFind: NameType): NodePtr;
  217. begin
  218.     Cursor := First;
  219.   while (Cursor<>nil) and (Cursor^.Name<>ToFind) do
  220.   begin
  221.       PreCursor := Cursor;
  222.       Cursor := Cursor^.Next;
  223.   end;
  224.   Search := Cursor;
  225. end;
  226.  
  227. procedure View.Delete(ToDelete: NameType);
  228. begin
  229.     Cursor := Search(ToDelete);
  230.   if Cursor<>nil then
  231.   begin
  232.     if Cursor = First then
  233.             First := First^.Next
  234.     else
  235.         PreCursor^.Next := Cursor^.Next;
  236.     Dispose(Cursor^.Item, Done);
  237.     Dispose(Cursor);
  238.   end;
  239. end;
  240.  
  241. procedure View.Hide;
  242. begin
  243.   Traverse(HideEach);
  244. end;
  245.  
  246. procedure View.Show;
  247. begin
  248.   Traverse(ShowEach);
  249. end;
  250.  
  251. procedure View.Move(DeltaX, DeltaY, DeltaZ: integer);
  252. begin
  253.   GlobalDX := DeltaX;
  254.   GlobalDY := DeltaY;
  255.   GlobalDZ := DeltaZ;
  256.   Traverse(MoveEach);
  257. end;
  258.  
  259. procedure View.Traverse(P: DoWhat);
  260. var
  261.   Current: NodePtr;
  262. begin
  263.   Current := First;
  264.   while Current <> nil do
  265.   begin
  266.         P(Current^.Item);
  267.     Current := Current^.Next;
  268.   end;
  269. end;
  270.  
  271. procedure View.ConvertPoint(x,y,z: integer; var Sx, Sy: integer);
  272. begin
  273.   Sx := (x*GraphMidx) div y + GraphMidx;
  274.   Sy := GraphMidY - (z*GraphMidy) div y;
  275. end;
  276.  
  277. end. {unit}
  278.  
  279.