home *** CD-ROM | disk | FTP | other *** search
/ PC Underground / UNDERGROUND.ISO / doom / source / _matrix.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-02-05  |  1.5 KB  |  93 lines

  1. {----------------------------------------------------------------------------
  2.   9bit fixed point vector matrix math
  3.   Copyright (c) 1994,95 by J.E. Hoffmann
  4.   All rights reserved
  5.  ----------------------------------------------------------------------------}
  6. {$A+,B-,D-,E-,F-,G+,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y-}
  7. unit _matrix;
  8.  
  9.  
  10.  
  11. interface
  12.  
  13.  
  14.  
  15. uses _Math;
  16.  
  17.  
  18.  
  19. procedure MakeMatrix(Tx,Ty,Tz,Sx,Sy,Sz :LongInt; Rx,Ry,Rz :Integer; var M :TMatrix);
  20.  
  21.  
  22.  
  23. implementation
  24.  
  25.  
  26.  
  27. {$I FX_DOOM.PAH}
  28.  
  29.  
  30.  
  31. procedure Translate(tx,ty,tz :LongInt; var C :TMatrix);
  32. var
  33.   i : Integer;
  34. begin
  35.   Zero(C);
  36.   for i := 0 to 3 do C[i,i] := $200;
  37.   C[0,3] := -tx;
  38.   C[1,3] := -ty;
  39.   C[2,3] := -tz
  40. end;
  41.  
  42.  
  43.  
  44. procedure Scale(sx,sy,sz :LongInt; var C :TMatrix);
  45. begin
  46.   Zero(C);
  47.   C[0,0] := sx;
  48.   C[1,1] := sy;
  49.   C[2,2] := sz;
  50.   C[3,3] := $200;
  51. end;
  52.  
  53.  
  54.  
  55. procedure Rotate3D(m : Integer;  Theta : Integer;  Var A :TMatrix);
  56. var
  57.   m1, m2 : Integer;
  58.   c, s   : LongInt;
  59. begin
  60.   Zero(A);
  61.   A[m-1,m-1] := $200;
  62.   A[3,3] := $200;
  63.   m1 := (m  Mod 3) + 1;
  64.   m2 := (m1 Mod 3);
  65.   m1 := m1 - 1;
  66.   c  := FixCos(-Theta);
  67.   s  := FixSin(-Theta);
  68.   A[m1,m1] :=  c;
  69.   A[m1,m2] :=  s;
  70.   A[m2,m2] :=  c;
  71.   A[m2,m1] := -s
  72. end;
  73.  
  74.  
  75.  
  76. procedure MakeMatrix(Tx,Ty,Tz,Sx,Sy,Sz :LongInt; Rx,Ry,Rz :Integer; var M :TMatrix);
  77. var
  78.   S,Mx,My,Mz,T,M1,M2,M3 :TMatrix;
  79. begin
  80.   Scale(Sx,Sy,Sz,S);
  81.   Rotate3D(1,Rx,Mx);
  82.   Rotate3D(2,Ry,My);
  83.   Rotate3D(3,Rz,Mz);
  84.   Translate(Tx,Ty,Tz,T);
  85.   Cross(Mx,My,M1);
  86.   Cross(Mz,M1,M2);
  87.   Cross(M2,T,M3);
  88.   Cross(S,M3,M);
  89. end;
  90.  
  91.  
  92.  
  93. end.