BaseTypes.pas
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:11k
源码类别:

游戏引擎

开发平台:

Delphi

  1. (*
  2.  @Abstract(Base types unit)
  3.  (C) 2007 George "Mirage" Bakhtadze <br>
  4.  The source code may be used under either MPL 1.1 or LGPL 2.1 license. See included license.txt file <br>
  5.  Created: Apr 09, 2007 <br>
  6.  Unit contains most basic types
  7. *)
  8. {$Include GDefines.inc}
  9. unit BaseTypes;
  10. interface
  11. const
  12.   BitsInByte = 8;
  13.   DegToRad   = pi/180;
  14.   RadToDeg   = 180/pi;
  15.   MaxPadeg = 6;
  16.   epsilon = 0.0001;
  17.   MaxFloatValue = 3.4e+38;
  18.   
  19. type
  20.     // Platform independent basic types
  21.   //
  22.   Int32 = Longint;
  23.   Int16 = SmallInt;
  24.   Int8  = ShortInt;
  25.   // Unsinged (natural)
  26.   Nat32 = Longword;
  27.   Nat16 = Word;
  28.   Nat8  = Byte;
  29. const
  30.   // Max and mins for signed
  31.   MaxInt32: Int32 =  $7FFFFFFF;
  32.   MinInt32: Int32 = -$7FFFFFFF-1;  // -$80000000
  33.   MaxInt16: Int16 =  $7FFF;
  34.   MinInt16: Int16 = -$8000;
  35.   MaxInt8:  Int8  =  $7F;
  36.   MinInt8:  Int8  = -$80;
  37.   // Max for unsigned
  38.   MaxNat32: Nat32 = $FFFFFFFF;
  39.   MaxNat16: Nat16 = $FFFF;
  40.   MaxNat8:  Nat8  = $FF;
  41. type
  42.   // 32-bit set
  43.   TSet32 = set of 0..31;
  44.   // Globally unique identifier
  45.   TSGUID12 = string[12];
  46.   // File signature
  47.   TFileSignature = array [0..3] of AnsiChar;
  48.   // Type for time values
  49.   TTimeUnit = Double;
  50.   // Message flag
  51.   TMessageFlag = (// Message has been handled or discarded. No need to handle it anymore.
  52.                   mfInvalid,
  53.                   // Message has a recipient
  54.                   mfRecipient,
  55.                   // Message is a notification message from parent to immediate childs
  56.                   mfChilds,
  57.                   // Message is a broadcasted message from some item down through hierarchy
  58.                   mfBroadcast,
  59.                   // Message's destination is core handle
  60.                   mfCore,
  61.                   // Message is asyncronous
  62.                   mfAsync);
  63.   // Message flag set
  64.   TMessageFlags = set of TMessageFlag;
  65.   // General method pointer
  66.   TDelegate = procedure(Data: Pointer) of object; 
  67.   // Method pointer used by time-consuming routines to report progess in range [0..1]
  68.   TProgressDelegate = procedure(Progress: Single) of object;
  69.   // Pointer to a two-dimensional vector
  70.   PVector2s = ^TVector2s;
  71.   // Two-dimensional vector
  72.   TVector2s = packed record
  73.     case Integer of
  74.       0: (X, Y: Single);
  75.       1: (V: array[0..1] of Single);
  76.   end;
  77.   // Pointer to a three-dimensional vector
  78.   PVector3s = ^TVector3s;
  79.   // Three-dimensional vector
  80.   TVector3s = packed record
  81.     case Integer of
  82.       0: (X, Y, Z: Single);
  83.       1: (V: array[0..2] of Single);
  84.   end;
  85.   // Four-dimensional (homogeneous) vector
  86.   TVector4s = packed record
  87.     case Integer of
  88.       0: (X, Y, Z, W: Single);
  89.       1: (V: array[0..3] of Single);
  90.       2: (xyz: TVector3s);
  91.   end;
  92.   // Pointer to 32-bit color
  93.   PColor = ^TColor;
  94.   // 32-bit color
  95.   TColor = packed record
  96.     case Boolean of
  97.       False: (C: Longword);
  98.       True: (B, G, R, A: Byte);
  99.   end;
  100.   // Color with floating-point components
  101.   TColor4s = packed record
  102.   case Integer of
  103.     0: (R, G, B, A: Single;);
  104.     1: (RGB: TVector3s);
  105.     2: (RGBA: TVector4s);
  106.   end;
  107.   TARGB = packed record B, G, R, A: Byte; end;
  108.   TARGBInt = packed record B, G, R, A: Integer; end;
  109.   // Palette color
  110.   TPaletteItem = TARGB;
  111.   // Image palette for paletted graphics file formats
  112.   TPalette = array[0..255] of TPaletteItem;
  113.   PPalette = ^TPalette;
  114.   PByteBuffer = ^TByteBuffer;
  115.   PWordBuffer = ^TWordBuffer;
  116.   PSmallintBuffer = ^TSmallintBuffer;
  117.   TByteBuffer     = array[0..$6FFFFFFF] of Byte;
  118.   TWordBuffer     = array[0..$0FFFFFFF] of Word;
  119.   TSmallintBuffer = array[0..$0FFFFFFF] of Smallint;
  120.   TDWordBuffer    = array[0..$0FFFFFFF] of Cardinal;
  121.   TColorBuffer    = array[0..$0FFFFFFF] of TColor;
  122.   TSingleBuffer   = array[0..$0FFFFFFF] of Single;
  123.   TRGBArray       = array[0..$0FFFFFFF] of packed record B, G, R: Byte; end;
  124.   TARGBArray      = array[0..$0FFFFFFF] of TARGB;
  125.   TPointerArray    = array of Pointer;
  126.   TAnsiStringArray = array of AnsiString;
  127.   TStringArray     = array of String;
  128.   TIndArray        = array of Integer;
  129.   TSingleArray     = array of Single;
  130.   PImageBuffer  = ^TImageBuffer;
  131.   TImageBuffer  = TColorBuffer;
  132.   PDWordBuffer  = ^TDWordBuffer;
  133.   PAnsiStringArray  = ^TAnsiStringArray;
  134.   PSingleBuffer = ^TSingleBuffer;
  135.   TNameString = AnsiString;
  136.   TShortName = string[31];
  137.   TShortMessage = string[127];
  138.   TFileName = string;
  139.   // Pointer to @Link(TUV)
  140.   PUV = ^TUV;
  141.   // Rectangular area within a bitmap (texture)  
  142.   TUV = packed record U, V, W, H: Single; end;
  143.   TUVArray = array[0..$FFFFFF] of TUV;
  144.   TUVMap = ^TUVArray;
  145.   // Character map
  146.   TCharMapItem = Longword;
  147.   TCharmapArray = array[0..$FFFFFF] of TCharMapItem;
  148.   TCharMap = ^TCharmapArray;
  149.   // Last pixel convention: not include
  150.   TRect = packed record
  151.     case Integer of
  152.       0:(Left, Top, Right, Bottom: Integer);
  153.       1:(X, Y, W, H: Integer);
  154.       2:(a1, a2, Width, Height: Integer);
  155.   end;
  156.   PRect = ^TRect;
  157.   TRect3D = packed record
  158.     case Integer of
  159.       0:(Left, Top, Right, Bottom, Front, Back: Integer);
  160.       1:(X, Y, W, H: Integer);
  161.       2:(a1, a2, Width, Height: Integer);
  162.   end;
  163.   PRect3D = ^TRect3D;
  164.   TArea = record                                   // Last pixel convention: not include
  165.     X1, Y1, X2, Y2: Single;
  166.   end;
  167.   PArea = ^TArea;
  168. const
  169.   NullSignature: TFileSignature = (#0, #0, #0, #0);
  170.   // Default area on image
  171.   DefaultUV: TUV = (U: 0; V: 0; W: 1; H: 1);
  172.   // Floating point color black
  173.   clBlack4s: TColor4s = (R: 0; G: 0; B: 0; A: 0);
  174.   // Floating point color black
  175.   clWhite4s: TColor4s = (R: 1; G: 1; B: 1; A: 1);
  176.   // Returns TColor record
  177.   function GetColor(const R, G, B, A: Byte): TColor; overload;
  178.   // Returns TColor record
  179.   function GetColor(const C: Longword): TColor; overload;
  180.   // Returns TColor4s record
  181.   function GetColor4S(const R, G, B, A: Single): TColor4s;
  182.   // Converts a TColor to TColor4s
  183.   procedure ColorTo4S(var Result: TColor4s; const Color: TColor); overload;
  184.   // Converts a TColor to TColor4s
  185.   function ColorTo4S(const Color: TColor): TColor4s; overload;
  186.   // Converts a TColor to TColor4s
  187.   procedure ColorTo4S(var Result: TColor4s; const Color: Longword); overload;
  188.   // Converts a TColor to TColor4s
  189.   function ColorTo4S(const Color: Longword): TColor4s; overload;
  190.   // Convert time unit to milliseconds
  191.   function TimeUnitToMs(const TimeStamp: TTimeUnit): Int64;
  192.   // Fills the specified rectangle record and returns it in Result
  193.   procedure Rect(ALeft, ATop, ARight, ABottom: Integer; out Result: TRect);
  194.   // Returns the specified by its bounds rectangle record
  195.   function GetRect(ALeft, ATop, ARight, ABottom: Integer): TRect;
  196.   // Returns the specified by width and height rectangle record
  197.   function GetRectWH(ALeft, ATop, AWidth, AHeight: Integer): TRect;
  198.   // Returns the specified by UV coordinates on an image rectangle record
  199.   function GetRectOnImage(UV: TUV; AImageWidth, AImageHeight: Integer): TRect;
  200.   // Returns in Result source rectangle moved by (MoveX, MoveY)
  201.   procedure RectMove(const ARect: TRect; MoveX, MoveY: Integer; out Result: TRect);
  202.   // Returns source rectangle moved by (MoveX, MoveY)
  203.   function GetRectMoved(const ARect: TRect; MoveX, MoveY: Integer): TRect;
  204.   // Returns in Result source rectangle scaled by (SX, SY)
  205.   procedure RectScale(const ARect: TRect; SX, SY: Single; out Result: TRect);
  206.   // Returns source rectangle scaled by (SX, SY)
  207.   function GetRectScaled(const ARect: TRect; SX, SY: Single): TRect;
  208.   // Returns in Result source rectangle expanded by (EX, EY)
  209.   procedure RectExpand(const ARect: TRect; EX, EY: Integer; out Result: TRect);
  210.   // Returns source rectangle expanded by (EX, EY)
  211.   function GetRectExpanded(const ARect: TRect; EX, EY: Integer): TRect;
  212.   function GetArea(AX1, AY1, AX2, AY2: Single): TArea;
  213. implementation
  214. function GetColor(const R, G, B, A: Byte): TColor;
  215. begin
  216.   Result.R := R; Result.G := G; Result.B := B; Result.A := A;
  217. end;
  218. function GetColor(const C: Longword): TColor;
  219. begin
  220.   Result.C := C;
  221. end;
  222. function GetColor4S(const R, G, B, A: Single): TColor4s;
  223. begin
  224.   Result.B := B; Result.G := G; Result.R := R; Result.A := A;
  225. end;
  226. procedure ColorTo4S(var Result: TColor4s; const Color: TColor); overload;
  227. const Norm: Single = 1/255;
  228. begin
  229.   Result.B :=  (Color.C and 255) * Norm;
  230.   Result.G := ((Color.C shr 8)  and 255) * Norm;
  231.   Result.R := ((Color.C shr 16) and 255) * Norm;
  232.   Result.A :=  (Color.C shr 24) * Norm;
  233. end;
  234. function ColorTo4S(const Color: TColor): TColor4s;
  235. begin
  236.   ColorTo4S(Result, Color);
  237. end;
  238. procedure ColorTo4S(var Result: TColor4s; const Color: Longword); overload;
  239. begin
  240.   ColorTo4S(Result, TColor(Color));
  241. end;
  242. function ColorTo4S(const Color: Longword): TColor4s; overload;
  243. begin
  244.   ColorTo4S(Result, TColor(Color));
  245. end;
  246. procedure Rect(ALeft, ATop, ARight, ABottom: Integer; out Result: TRect); overload;
  247. begin
  248.   with Result do begin
  249.     Left := ALeft; Top := ATop;
  250.     Right:= ARight; Bottom := ABottom;
  251.   end;
  252. end;
  253. function TimeUnitToMs(const TimeStamp: TTimeUnit): Int64;
  254. begin
  255.   Result := Round(TimeStamp*1000);
  256. end;
  257. function GetRect(ALeft, ATop, ARight, ABottom: Integer): TRect;
  258. begin
  259.   Rect(ALeft, ATop, ARight, ABottom, Result);
  260. end;
  261. function GetRectWH(ALeft, ATop, AWidth, AHeight: Integer): TRect;
  262. begin
  263.   Rect(ALeft, ATop, ALeft + AWidth, ATop + AHeight, Result);
  264. end;
  265. function GetRectOnImage(UV: TUV; AImageWidth, AImageHeight: Integer): TRect;
  266. begin
  267.   with Result do begin
  268.     Left   := Trunc(0.5 + UV.U * AImageWidth);
  269.     Top    := Trunc(0.5 + UV.V * AImageHeight);
  270.     Right  := Left + Trunc(0.5 + UV.W * AImageWidth);
  271.     Bottom := Top  + Trunc(0.5 + UV.H * AImageHeight);
  272.   end;
  273. end;
  274. procedure RectMove(const ARect: TRect; MoveX, MoveY: Integer; out Result: TRect);
  275. begin
  276.   Result.Left   := ARect.Left   + MoveX;
  277.   Result.Top    := ARect.Top    + MoveY;
  278.   Result.Right  := ARect.Right  + MoveX;
  279.   Result.Bottom := ARect.Bottom + MoveY;
  280. end;
  281. function GetRectMoved(const ARect: TRect; MoveX, MoveY: Integer): TRect;
  282. begin
  283.   RectMove(ARect, MoveX, MoveY, Result);
  284. end;
  285. procedure RectScale(const ARect: TRect; SX, SY: Single; out Result: TRect);
  286. begin
  287.   Result.Left   := Round(ARect.Left   * SX);
  288.   Result.Top    := Round(ARect.Top    * SY);
  289.   Result.Right  := Round(ARect.Right  * SX);
  290.   Result.Bottom := Round(ARect.Bottom * SY);
  291. end;
  292. function GetRectScaled(const ARect: TRect; SX, SY: Single): TRect;
  293. begin
  294.   RectScale(ARect, SX, SY, Result);
  295. end;
  296. procedure RectExpand(const ARect: TRect; EX, EY: Integer; out Result: TRect);
  297. begin
  298.   Result.Left   := ARect.Left   - EX;
  299.   Result.Top    := ARect.Top    - EY;
  300.   Result.Right  := ARect.Right  + EX;
  301.   Result.Bottom := ARect.Bottom + EY;
  302. end;
  303. function GetRectExpanded(const ARect: TRect; EX, EY: Integer): TRect;
  304. begin
  305.   RectExpand(ARect, EX, EY, Result);
  306. end;
  307. function GetArea(AX1, AY1, AX2, AY2: Single): TArea;
  308. begin
  309.   with Result do begin
  310.     X1 := AX1; Y1 := AY1;
  311.     X2 := AX2; Y2 := AY2;
  312.   end;
  313. end;
  314. end.