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

游戏引擎

开发平台:

Delphi

  1. (*
  2.  @Abstract(CAST II Engine types unit)
  3.  (C) 2002-2004 George "Mirage" Bakhtadze. <a href="http://www.casteng.com">www.casteng.com</a> <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.  Unit contains basic engine-specific type and constant declarations
  6. *)
  7. unit C2Types;
  8. interface
  9. uses SysUtils, Basics, BaseTypes, Base3D;
  10. type
  11.   TWordBuffer = array[0..$FFFFFFF] of Word;
  12.   // Sound format
  13.   TSoundFormat = packed record
  14.     Channels, BitsPerSample, SampleRate, BlockAlign: Cardinal;
  15.   end;
  16.   TClearFlags = (ClearFrameBuffer, ClearZBuffer, ClearStencilBuffer);
  17.   TClearFlagsSet = set of TClearFlags;
  18.   // Vertex data types
  19.   TVertexDataType = (// One float value
  20.                      vdtFloat1,
  21.                      // Two float values
  22.                      vdtFloat2,
  23.                      // Three float values
  24.                      vdtFloat3,
  25.                      // Four float values
  26.                      vdtFloat4,
  27.                      // 32-bit color value
  28.                      vdtColor,
  29.                      // Four byte values
  30.                      vdtByte4,
  31.                      // Two 16-bit integer values
  32.                      vdtInt16_2,
  33.                      // Four 16-bit integer values
  34.                      vdtInt16_4,
  35.                      // Three unsinged 10-bit integer values
  36.                      vdtUInt10_3,
  37.                      // Two 16-bit float values
  38.                      vdtFloat16_2,
  39.                      // Four 16-bit float values
  40.                      vdtFloat16_4,
  41.                      // No value
  42.                      vdtNothing = $7FFFFFFF);
  43.   // Vertex declaration type
  44.   TVertexDeclaration = array of TVertexDataType;
  45.   // Primitive types
  46.   TPrimitiveType = (ptPOINTLIST, ptLINELIST, ptLINESTRIP, ptTRIANGLELIST, ptTRIANGLESTRIP, ptTRIANGLEFAN, ptQUADS, ptQUADSTRIP, ptPOLYGON);
  47.   // Polygon filling modes
  48.   TFillMode = Cardinal;
  49.   // Polygon culling modes
  50.   TCullMode = Cardinal;
  51.   // Shader kind
  52.   TShaderKind = (// Vertex shader (vertex program)
  53.                  skVertex,
  54.                  // Pixel shader (fragment program)
  55.                  skPixel);
  56.   TShaderRegisterType = TVector4s;
  57.   { Shader constant data structure
  58.     <b>ShaderKind</b>     - kind of shader (see @Link(TShaderKind) )
  59.     <b>ShaderRegister</b> - index of 4-component vector register to set
  60.     <b>Value</b>          - value of the register }
  61.   TShaderConstant = record
  62.     ShaderKind: TShaderKind;
  63.     ShaderRegister: Integer;
  64.     Value: TShaderRegisterType;
  65.   end;
  66.   // A list of shader constants
  67.   TShaderConstants = array of TShaderConstant;
  68.   // Possible members of @Link(TLockFlags) set
  69.   TLockFlag = (// Indicates that contents of a locked resource can be discarded and allows some optimizations within an API
  70.                lfDiscard,
  71.                // Indicates that a resource is locked for read operation
  72.                lfReadOnly,
  73.                // Indicates that new data will be added to the resource and no older data will be overwritten. Currently applicable to vertex and index buffers.
  74.                lfNoOverwrite);
  75.   // Determines how a resource will be locked. Proper use of these flags may improve performance.
  76.   TLockFlags = set of TLockFlag;
  77. const
  78.     // Vertex format flags
  79.   // The vertices are already transformed (TLVertex)
  80.   vfTRANSFORMED = 1;
  81.   vfNORMALS = 2;
  82.   vfDIFFUSE = 4;
  83.   vfSPECULAR = 8;
  84.   vfPOINTSIZE = 16;
  85.   /// Vertex elements
  86.   vfiXYZ = 0; vfiWEIGHT1 = 1; vfiWEIGHT2 = 2; vfiWEIGHT3 = 3; vfiNORM = 4; vfiPointSize = 5; vfiDIFF = 6; vfiSPEC = 7;
  87.   vfiTEX0 = 8; vfiTEX1 = 9; vfiTEX2 = 10; vfiTEX3 = 11; vfiTEX4 = 12; vfiTEX5 = 13; vfiTEX6 = 14; vfiTEX7 = 15;
  88.   vfiTex: array[0..7] of Integer = (vfiTEX0, vfiTEX1, vfiTEX2, vfiTEX3, vfiTEX4, vfiTEX5, vfiTEX6, vfiTEX7);
  89.   /// Vertex data types enumeration
  90.   VertexDataTypesEnum = 'Float1' + StringDelimiter + 'Float2' + StringDelimiter + 'Float3' + StringDelimiter + 'Float4' + StringDelimiter +
  91.                         'Color' + StringDelimiter + 'Byte4' + StringDelimiter +
  92.                         'Int16_2' + StringDelimiter + 'Int16_4' + StringDelimiter + 'UInt10_3' + StringDelimiter +
  93.                         'Float16_2' + StringDelimiter + 'Float16_4';
  94.   /// Offsets in a map record
  95.   OffsH = 3; OffsB = 5; OffsG = 6; OffsR = 7; OffsNZ = 0; OffsNY = 1; OffsNX = 2;
  96.   /// Specular lighting
  97.   slNONE = 0; slFAST = 1; slACCURATE = 2;
  98.   SpecularEnum = 'Off&Fast&Accurate';
  99.   /// Texture filters
  100.   tfNONE = 0; tfPOINT = 1; tfLINEAR = 2; tfANISOTROPIC = 3;
  101.   TexFiltersEnum = 'None&Nearest&Linear&Anisotropic';
  102.   /// Texture operations
  103.   toDISABLE = 0; toARG1 = 1; toARG2 = 2;
  104.   toMODULATE = 3; toMODULATE2X = 4; toMODULATE4X = 5;
  105.   toADD = 6; toSIGNEDADD = 7; toSIGNEDADD2X = 8;
  106.   toSUB = 9; toSMOOTHADD = 10;
  107.   toBLENDDIFFUSEALPHA = 11; toBLENDTEXTUREALPHA = 12; toBLENDFACTORALPHA = 13;
  108.   toBLENDTEXTUREALPHAPM = 14; toBLENDCURRENTALPHA = 15;
  109.   toPREMODULATE = 16;
  110.   toDOTPRODUCT3 = 17;
  111.   toMULTIPLYADD = 18; toLERP = 19;
  112.   toMODULATEALPHA_ADDCOLOR = 20; toMODULATECOLOR_ADDALPHA = 21;
  113.   toMODULATEINVALPHA_ADDCOLOR = 22; toMODULATEINVCOLOR_ADDALPHA = 23;
  114.   toBUMPENV = 24; toBUMPENVLUM = 25;
  115.   AlphaOpsEnum = 'None&Arg1&Arg2&Arg1 * Arg2&Arg1 * Arg2 * 2&Arg1 * Arg2 * 4&' +
  116.                  'Arg1 + Arg2&Arg1 + Arg2 - 0.5&(Arg1 + Arg2 - 0.5)*2&Arg1 - Arg2&Arg1 + Arg2(1-Arg1)&' +
  117.                  'Arg1*Diffuse.a + Arg2*(1-Diffuse.a)&Arg1*Texture.a + Arg2*(1-Texture.a)&Arg1*Factor.a + Arg2*(1-Factor.a)&' +
  118.                  'Arg1 + Arg2*(1-Texture.a)&Arg1*Current.a + Arg2*(1-Current.a)&' +
  119.                  'Premodulate&Arg1 dot Arg2&Arg1 + Arg2*Arg3&Arg1*Arg2 + (1-Arg1)*Arg3';
  120.   ColorOpsEnum = AlphaOpsEnum + '&Arg1.a*Arg2.rgb + Arg1.rgb&Arg1.rgb*Arg2.rgb + Arg1.a&' +
  121.                                 '(1-Arg1.a)*Arg2.rgb + Arg1.rgb&(1-Arg1.rgb)*Arg2.rgb + Arg1.a&' +
  122.                                 'BumpEnvMap&BumpEnvMapLuminance';
  123.     /// Texture arguments
  124.   // select diffuse color (read only)
  125.   taDIFFUSE  = 0;
  126.   // select stage destination register (read/write)
  127.   taCURRENT  = 1;
  128.   // select texture color (read only)
  129.   taTEXTURE  = 2;
  130.   // select specular color (read only)
  131.   taSPECULAR = 3;
  132.   // select temporary register color (read/write)
  133.   taTEMP     = 4;
  134.   // select texture factor (read only)
  135.   taTFactor  = 5;
  136.   // replicate alpha to color components (read modifier)
  137.   taALPHAREPLICATE = 6;                 
  138.   AlphaArgsEnum = 'Diffuse&Current&Texture&Specular&Temporary&Tex factor';
  139.   ColorArgsEnum = AlphaArgsEnum + '&Alpha replicate';
  140.   /// Texture addressing modes
  141.   taWRAP       = 0;
  142.   taMIRROR     = 1;
  143.   taCLAMP      = 2;
  144.   taBORDER     = 3;
  145.   taMIRRORONCE = 4;
  146.   TexAdrsEnum = 'Wrap&Mirror&Clamp&Border&Mirror once';
  147.   /// Texture coords generation
  148.   tcgNone                        = 0;
  149.   tcgCAMERASPACENORMAL           = 1;
  150.   tcgCAMERASPACEPOSITION         = 2;
  151.   tcgCAMERASPACEREFLECTIONVECTOR = 3;
  152.   TexCoordsGenEnum = 'None&Camera space normal&Camera space position&Camera space reflection';
  153.     /// Renderer states
  154.   // Renderer is ready
  155.   rsOK = 0;
  156.   // Renderer is not ready
  157.   rsNOTREADY = 1;
  158.   // Renderer is in clean state
  159.   rsCLEAN = 2;
  160.   // Renderer device is lost (DirectX only)
  161.   rsLOST = 3;
  162.   // Renderer device is lost and attempting to be restored (DirectX only)
  163.   rsTRYTORESTORE = 4;
  164.   // Renderer not yet (or failed) initialized
  165.   rsNOTINITIALIZED = 5;
  166.   /// Fill modes
  167.   fmPOINT = 0; fmWIRE = 1; fmSOLID = 2; fmDEFAULT = 3; //fmNONE = $FFFFFFFF;
  168.   CameraFillModesEnum = 'Points&Wireframe&Solid';
  169.   FillModesEnum       = CameraFillModesEnum + '&Default';
  170.   /// Shade modes
  171.   smGOURAUD = 0; smFLAT = 1; smPHONG = 2;
  172.   ShadeModesEnum = 'Gouraud&Flat&Phong';
  173.   /// Culling modes
  174.   cmNONE = 0; cmCW = 1; cmCCW = 2; cmCAMERADEFAULT = 3; cmCAMERAINVERSE = 4;
  175.   CameraCullModesEnum = 'None&CW&CCW';
  176.   CullModesEnum       =  CameraCullModesEnum + '&Camera default&Camera inverse';
  177.   /// Blending modes
  178.   bmZERO               =  0;
  179.   bmONE                =  1;
  180.   bmSRCCOLOR           =  2;
  181.   bmINVSRCCOLOR        =  3;
  182.   bmSRCALPHA           =  4;
  183.   bmINVSRCALPHA        =  5;
  184.   bmDESTALPHA          =  6;
  185.   bmINVDESTALPHA       =  7;
  186.   bmDESTCOLOR          =  8;
  187.   bmINVDESTCOLOR       =  9;
  188.   bmSRCALPHASAT        = 10;
  189.   bmBOTHSRCALPHA       = 11;
  190.   bmBOTHINVSRCALPHA    = 12;
  191.   BlendArgumentsEnum = 'Zero&One&SrcColor&InvSrcColor&SrcAlpha&InvSrcAlpha&DestAlpha&InvDestAlpha&DestColor&InvDestColor&SrcAlphaSat&BothScrAlpha&BothInvScrAlpha';
  192.   /// Blending operations
  193.   boADD = 0; boSUBTRACT = 1; boREVSUBTRACT = 2; boMIN = 3; boMAX = 4;
  194.   BlendOpsEnum = 'Src + Dest&Src - Dest&Dest - Src&Min&Max';
  195.   /// Z-buffer types & consts
  196.   zbtNONE = 0; zbtZ = 1; zbtW = 2;
  197.   /// Test functions
  198.   tfNEVER = 0; tfLESS = 1; tfEQUAL = 2; tfLESSEQUAL = 3;
  199.   tfGREATER = 4; tfNOTEQUAL = 5; tfGREATEREQUAL = 6; tfALWAYS = 7;
  200.   TestFuncsEnum = 'Never&<&=&<=&>&#&>=&Always';
  201.   /// Fog kinds
  202.   fkDEFAULT = 0; fkNONE = 1; fkVERTEX = 2; fkVERTEXRANGED = 3; fkTABLELINEAR = 4; fkTABLEEXP = 5; fkTABLEEXP2 = 6;
  203.   FogKindsEnum = 'Default&Off&Vertex&Vertex ranged&Table linear&Exponent&Exponent^2';
  204.   /// Format usages
  205.   fuTEXTURE = 0; fuRENDERTARGET = 1; fuDEPTHSTENCIL = 2; fuVOLUMETEXTURE = 3; fuCUBETEXTURE = 4; fuDEPTHTEXTURE = 5;
  206.   /// Texture transformations
  207.   ttNONE = 0; ttCOUNT1 = 1; ttCOUNT2 = 2; ttCOUNT3 = 3; ttCOUNT4 = 4; ttPROJECTED = 256;
  208.   /// TextureWrapping
  209.   twNONE = 0; twUCOORD = 1; twVCOORD = 2; twWCOORD = 4; twW2COORD = 8;
  210.   /// Stencil buffer operations
  211.   soKEEP = 0; soZERO = 1; soREPLACE = 2; soINCSAT = 3; soDECSAT = 4; soINVERT = 5; soINC = 6; soDEC = 7;
  212.   StencilOpsEnum = 'Keep&Zero&Replace&Inc saturated&Dec saturated&Invert&Inc&Dec';
  213.   /// Sound format elements
  214.   sfeSampleRate = 0; sfeChannels = 1; sfeBits = 2;
  215. var
  216.   // Array to convert engine-specific pixel formats to API-specific pixel formats
  217.   PFormats: array[0..TotalPixelFormats-1] of Longword;
  218.   CullModes: array[cmNone..cmCCW] of Longword;                      // Cull modes
  219.   TexFilters: array[tfNone..tfAnisotropic] of Longword;             // Texture filtering types
  220.   TexOperation: array[0..25] of Longword;                           // Texture stage operations
  221.   TexAddressing: array[0..4] of Longword;                           // Texture adressing modes
  222.   TexArgument: array[0..6] of Longword;                             // Texture stage arguments
  223.   CPTypes: array[TPrimitiveType] of Longword;               // Primitive types
  224.   CVFormatsLow: array[0..31] of Longword;                           // Low bytes of vertex format
  225.   TestFuncs: array[0..7] of Longword;
  226.   BlendOps: array[0..4] of Longword;
  227.   TexCoordSources: array[0..3] of Longword;
  228.   ShadeModes: array[smGOURAUD..smPhong] of Longword;
  229.   FillModes : array[fmPOINT..fmSOLID] of Longword;
  230.   BlendModes: array[bmZERO..bmBOTHINVSRCALPHA] of Longword;
  231.   StencilOps: array[soKEEP..soDEC] of Longword;
  232.   TexTransformFlags: array[ttNONE..ttCOUNT4] of Longword;
  233. // Packs a sound format specified by the sample rate, the number of bits per sample and the number of channels to a single value
  234. function PackSoundFormat(SampleRate, BitsPerSample, Channels: Cardinal): Cardinal;
  235. // Converts a format value to @Link(TSoundFormat) structure
  236. function UnpackSoundFormat(Format: Cardinal): TSoundFormat;
  237. // Returns size of element of a sound in bytes
  238. function GetSoundElementSize(Format: Cardinal): Integer;
  239. // Returns sample rate, number of bits per sample or number of channels of the specified format value
  240. function GetSoundFormatElement(Format, Element: Cardinal): Integer;
  241. implementation
  242. function PackSoundFormat(SampleRate, BitsPerSample, Channels: Cardinal): Cardinal;
  243. begin
  244.   Result := Channels shl 24 + BitsPerSample shl 16 + SampleRate;
  245. end;
  246. function UnpackSoundFormat(Format: Cardinal): TSoundFormat;
  247. begin
  248.   Result.Channels      := (Format shr 24) and $FF;
  249.   Result.BitsPerSample := (Format shr 16) and $FF;
  250.   Result.SampleRate    := Format and $FFFF;
  251.   Result.BlockAlign    := Result.BitsPerSample shr 3*Result.Channels;
  252. end;
  253. function GetSoundElementSize(Format: Cardinal): Integer;
  254. begin
  255.   Result := ((Format shr 16) and $FF) div 8 * ((Format shr 24) and $FF);
  256. end;
  257. function GetSoundFormatElement(Format, Element: Cardinal): Integer;
  258. begin
  259.   case Element of
  260.     sfeSampleRate: Result :=  Format and $FFFF;
  261.     sfeChannels:   Result := (Format shr 24) and $FF;
  262.     sfeBits:       Result := (Format shr 16) and $FF;
  263.     else Result := 0;
  264.   end;
  265. end;
  266. end.