home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 18 / CD_ASCQ_18_111294_W.iso / dos / prg / pas / pasgraph / points.pas < prev    next >
Pascal/Delphi Source File  |  1994-04-30  |  5KB  |  264 lines

  1. {
  2.   Sample of gfx object( animated particle ) based on TGraphObject.
  3.   Coded by Mike Shirobokov(MSH) aka Mad Max / Queue Members (2:5057/1.5)
  4.   (c)1994 MSH, Samara, Russia
  5.   Warning! This code can be used in educational purposes only.
  6.   For any other use - please contact me on 2:5057/1.5
  7. }
  8.  
  9. {$A-,B-,D+,E+,F-,G+,I-,L+,N-,O-,P-,Q-,R-,S-,T-,V+,X+}
  10. {$M 16384,0,655360}
  11.  
  12. unit Points;
  13.  
  14. interface
  15.  
  16. uses Objects, GraphObj;
  17.  
  18. const
  19.   Gravity:   LongInt = Round( 0.08 * ScaleFactor );
  20.   ReflectionRatio: Real = 0.9;
  21.  
  22. type
  23.   PFlyingPoint = ^TFlyingPoint;
  24.   TFlyingPoint = object( TGraphObject )
  25.     OldPoint,
  26.     OldShadow: array [ 0..1 ] of TPoint2D;
  27.     Speed: TPoint3D;
  28.     Valid: Boolean;
  29.     Number: Integer;
  30.     constructor Init( AOrigin: TPoint3D; ASpeed: TPoint3D );
  31.     procedure Show; virtual;
  32.     procedure Hide; virtual;
  33.     procedure Update; virtual;
  34.     function IsValid: Boolean; virtual;
  35.   end;
  36.  
  37.   PPoints = ^TPoints;
  38.   TPoints = object( TCollection )
  39.     ToDelete: TCollection;
  40.     constructor Init( InitNumber: Integer );
  41.     procedure Update; virtual;
  42.   end;
  43.  
  44. implementation
  45.  
  46. {
  47. If somebody will be not too lazy to rewrite two procedures below in asm -
  48. - pls send them to me :-)
  49. }
  50. procedure DrawPoint( var Point: TPoint2D ); far;
  51. begin
  52.   if (Point.Y > 0) and (Point.X>0) and (Point.X<318) then
  53.   begin
  54.     if Point.Color > 32 then
  55.     begin
  56.       PutPixel( Point.X-1, Point.Y, Point.Color-32 );
  57.       PutPixel( Point.X+2, Point.Y, Point.Color-32 );
  58.       PutPixel( Point.X, Point.Y-1, Point.Color-32 );
  59.       PutPixel( Point.X+1, Point.Y-1, Point.Color-32 );
  60.       PutPixel( Point.X, Point.Y+1, Point.Color-32 );
  61.       PutPixel( Point.X+1, Point.Y+1, Point.Color-32 );
  62.     end;
  63.     PutPixel( Point.X, Point.Y, Point.Color );
  64.     PutPixel( Point.X+1, Point.Y, Point.Color );
  65.   end;
  66. end;
  67.  
  68. procedure DrawShadow( var Point: TPoint2D ); far;
  69. var
  70.   X, Y:  Word;
  71.   Color: Byte;
  72. begin
  73.   if Point.Y >= 0 then
  74.   begin
  75.     PutPixel( Point.X, Point.Y, Point.Color );
  76.     PutPixel( Point.X+1, Point.Y, Point.Color );
  77.     PutPixel( Point.X, Point.Y+1, Point.Color );
  78.     PutPixel( Point.X+1, Point.Y+1, Point.Color );
  79.   end;
  80. end;
  81.  
  82. procedure HidePoint( X, Y: Integer );
  83. var
  84.   O: Word;
  85. begin
  86.   O := CurOffset;
  87.   if Y > 0 then
  88.   asm
  89.     push ds
  90.     les di,Screen
  91.     lds si,Screen
  92.     mov ax,Y
  93.     dec ax
  94.     shl ax,6
  95.     mov di,ax
  96.     shl ax,2
  97.     add di,ax
  98.     add di,X
  99.     dec di
  100.     shr di,2
  101.     mov si,di
  102.     add di,word ptr [O]
  103.     add si,32000
  104.  
  105.     mov ax,$F02
  106.     mov dx,$3C4
  107.     out dx,ax
  108.     mov ax,$008
  109.     mov dx,$3CE
  110.     out dx,ax
  111.     movsb
  112.     movsb
  113.     add di,78
  114.     add si,78
  115.     movsb
  116.     movsb
  117.     add di,78
  118.     add si,78
  119.     movsb
  120.     movsb
  121.  
  122.     mov ax,$FF08
  123.     mov dx,$3CE
  124.     out dx,ax
  125.  
  126.     pop ds
  127.   end;
  128. end;
  129.  
  130. procedure HideShadow( X, Y: Integer );
  131. var
  132.   O: Word;
  133. begin
  134.   O:= CurOffset;
  135.   if Y >= 0 then
  136.   asm
  137.     push ds
  138.     les di,Screen
  139.     lds si,Screen
  140.     mov ax,Y
  141.     shl ax,6
  142.     mov di,ax
  143.     shl ax,2
  144.     add di,ax
  145.     add di,X
  146.     shr di,2
  147.     mov si,di
  148.     add di,word ptr [O]
  149.     add si,32000
  150.     mov ax,$F02
  151.     mov dx,$3C4
  152.     out dx,ax
  153.     mov ax,$008
  154.     mov dx,$3CE
  155.     out dx,ax
  156.     movsb
  157.     movsb
  158.     add di,78
  159.     add si,78
  160.     movsb
  161.     movsb
  162.  
  163.     mov ax,$FF08
  164.     mov dx,$3CE
  165.     out dx,ax
  166.  
  167.     pop ds
  168.   end;
  169. end;
  170.  
  171. constructor TFLyingPoint.Init( AOrigin: TPoint3D; ASpeed: TPoint3D );
  172. begin
  173.   inherited Init(AOrigin);
  174.   Speed := ASpeed;
  175.   Valid := True;
  176.   Show;
  177. end;
  178.  
  179. procedure TFLyingPoint.Show;
  180. begin
  181.   Draw3D( Origin, White, @DrawPoint, @DrawShadow );
  182.   OldPoint[CurPage] := LastPoint;
  183.   OldShadow[CurPage] := LastShadow;
  184. end;
  185.  
  186. procedure TFLyingPoint.Hide;
  187. begin
  188.   HidePoint( OldPoint[CurPage].X, OldPoint[CurPage].Y );
  189.   HideShadow( OldShadow[CurPage].X, OldShadow[CurPage].Y );
  190. end;
  191.  
  192. procedure TFLyingPoint.Update;
  193. var
  194.   Scale: Real;
  195. begin
  196.   Scale := 1;
  197.   if Origin.Y + Speed.Y <= 0 then
  198.   begin
  199.     if Abs(Speed.Y) < Gravity then
  200.     begin
  201.       Valid := False;
  202.       Exit;
  203.     end;
  204.     if Abs(Speed.Y) > 0 then
  205.       Scale := 1 - Abs( (Origin.Y + Speed.Y) / Speed.Y );
  206.     Speed.Y := Integer( Round( (-Speed.Y ) * ReflectionRatio ) );
  207.   end;
  208.   Speed.Y := Speed.Y - Integer(Round( Gravity*Scale) );
  209.  
  210.   Move( Speed );
  211.  
  212.   if (Origin.X < Min.X) or (Origin.X >= Max.X) or
  213.      (Origin.Z < Min.Z) or (Origin.Z >= Max.Z) then
  214.   begin
  215.     Valid := False;
  216.     Exit;
  217.   end;
  218. end;
  219.  
  220. constructor TPoints.Init( InitNumber: Integer );
  221. begin
  222.   inherited Init( initNumber, 10 );
  223.   ToDelete.Init( 10, 1 );
  224. end;
  225.  
  226. procedure TPoints.Update;
  227.  
  228. procedure UpdatePoint( P: PFlyingPoint );
  229. begin
  230.   P^.Update;
  231.   if not P^.IsValid then
  232.     ToDelete.Insert(P);
  233. end;
  234.  
  235. var
  236.   I: Integer;
  237.   P: Pointer;
  238. begin
  239. {  CopyPage( 2, CurPage );}
  240.  
  241.   for I := Count downto 1 do
  242.     TFlyingPoint(At(I-1)^).Hide;
  243.  
  244.   for I := Count downto 1 do
  245.     UpdatePoint( At(I-1) );
  246.   for I := Count downto 1 do
  247.     TFlyingPoint(At(I-1)^).Show;
  248.   FlipPage;
  249.   for I := 1 to ToDelete.Count do
  250.   begin
  251.     P := ToDelete.At(I-1);
  252.     Delete(P);
  253.   end;
  254.   ToDelete.FreeAll;
  255.   Inc(Frames);
  256. end;
  257.  
  258. function TFLyingPoint.IsValid: Boolean;
  259. begin
  260.   IsValid := Valid;
  261. end;
  262.  
  263. end.
  264.