D3DX9.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:443k
源码类别:

2D图形编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {*                                                                            *}
  3. {*  Copyright (C) Microsoft Corporation.  All Rights Reserved.                *}
  4. {*                                                                            *}
  5. {*  File:       d3dx9.h, d3dx9anim.h, d3dx9core.h, d3dx9effect.h,             *}
  6. {*              d3dx9math.h, d3dx9math.inl, d3dx9mesh.h, d3dx9shader.h,       *}
  7. {*              d3dx9shape.h, d3dx9tex.h, d3dx9xof.h                          *}
  8. {*                                                                            *}
  9. {*  Content:    Direct3DX 9.0 headers                                         *}
  10. {*                                                                            *}
  11. {*  Direct3DX 9.0 October 2006 Delphi adaptation by Alexey Barkovoy           *}
  12. {*  E-Mail: directx@clootie.ru                                                *}
  13. {*                                                                            *}
  14. {*  Latest version can be downloaded from:                                    *}
  15. {*    http://www.clootie.ru                                                   *}
  16. {*    http://sourceforge.net/projects/delphi-dx9sdk                           *}
  17. {*                                                                            *}
  18. {*----------------------------------------------------------------------------*}
  19. {*  $Id: D3DX9.par,v 1.32 2006/10/29 22:32:12 clootie Exp $ }
  20. {******************************************************************************}
  21. {                                                                              }
  22. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  23. {                                                                              }
  24. { The contents of this file are used with permission, subject to the Mozilla   }
  25. { Public License Version 1.1 (the "License"); you may not use this file except }
  26. { in compliance with the License. You may obtain a copy of the License at      }
  27. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  28. {                                                                              }
  29. { Software distributed under the License is distributed on an "AS IS" basis,   }
  30. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  31. { the specific language governing rights and limitations under the License.    }
  32. {                                                                              }
  33. { Alternatively, the contents of this file may be used under the terms of the  }
  34. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  35. { provisions of the LGPL License are applicable instead of those above.        }
  36. { If you wish to allow use of your version of this file only under the terms   }
  37. { of the LGPL License and not to allow others to use your version of this file }
  38. { under the MPL, indicate your decision by deleting  the provisions above and  }
  39. { replace  them with the notice and other provisions required by the LGPL      }
  40. { License.  If you do not delete the provisions above, a recipient may use     }
  41. { your version of this file under either the MPL or the LGPL License.          }
  42. {                                                                              }
  43. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  44. {                                                                              }
  45. {******************************************************************************}
  46. // Original source contained in "D3DX9.par"
  47. {$I DirectX.inc}
  48. unit D3DX9;
  49. interface
  50. // Remove "dot" below to link with debug version of D3DX9
  51. // (for Delphi it works only in JEDI version of headers)
  52. {.$DEFINE DEBUG}
  53. // Remove "dot" below to link with separate DLL's (one DLL per part of D3DX9 API)
  54. // instead of monolithic "all-in-one" version of D3DX9 (not supported currently)
  55. {.$DEFINE D3DX_SEPARATE}
  56. (*$HPPEMIT '#include "d3dx9.h"' *)
  57. (*$HPPEMIT 'namespace D3dx9' *)
  58. (*$HPPEMIT '{' *)
  59. //Clootie: has to temporary disable INLINE support for FreePascal
  60. //         due to bug in compiler
  61. {$IFDEF SUPPORTS_INLINE}
  62.   {$DEFINE ALLOW_INLINE}
  63. {$ENDIF}
  64. uses
  65.   Windows, ActiveX,
  66.   SysUtils, Direct3D9, DXTypes;
  67. const
  68.   //////////// DLL export definitions ///////////////////////////////////////
  69.   d3dx9MicrosoftDLL = 'd3dx9_31.dll';
  70.   d3dx9MicrosoftDebugDLL = 'd3dx9d_31.dll';
  71.   d3dx9BorlandDLL = d3dx9MicrosoftDLL; // Compatibility with previous header releases
  72.   d3dx9dll = {$IFDEF DEBUG}d3dx9MicrosoftDebugDLL{$ELSE}d3dx9MicrosoftDLL{$ENDIF};
  73.   {$UNDEF D3DX_SEPARATE}
  74.   d3dx9mathDLL   = {$IFDEF D3DX_SEPARATE}'d3dx9abMath.dll'{$ELSE}d3dx9dll{$ENDIF};
  75.   d3dx9coreDLL   = {$IFDEF D3DX_SEPARATE}'d3dx9abCore.dll'{$ELSE}d3dx9dll{$ENDIF};
  76.   d3dx9shaderDLL = {$IFDEF D3DX_SEPARATE}'d3dx9abShader.dll'{$ELSE}d3dx9dll{$ENDIF};
  77.   d3dx9effectDLL = {$IFDEF D3DX_SEPARATE}'d3dx9abEffect.dll'{$ELSE}d3dx9dll{$ENDIF};
  78.   d3dx9meshDLL   = {$IFDEF D3DX_SEPARATE}'d3dx9abMesh.dll'{$ELSE}d3dx9dll{$ENDIF};
  79.   d3dx9shapesDLL = {$IFDEF D3DX_SEPARATE}'d3dx9abShapes.dll'{$ELSE}d3dx9dll{$ENDIF};
  80.   d3dx9texDLL    = {$IFDEF D3DX_SEPARATE}'d3dx9abTex.dll'{$ELSE}d3dx9dll{$ENDIF};
  81.   d3dx9animDLL   = {$IFDEF D3DX_SEPARATE}'d3dx9abAnim.dll'{$ELSE}d3dx9dll{$ENDIF};
  82. {$IFNDEF COMPILER6_UP}
  83. type
  84.   PPointer = ^Pointer;
  85.   PPAnsiChar = ^PAnsiChar;
  86. {$ENDIF}
  87. //////////////////////////////////////////////////////////////////////////////
  88. //
  89. //  Copyright (C) Microsoft Corporation.  All Rights Reserved.
  90. //
  91. //  File:       d3dx9.h
  92. //  Content:    D3DX utility library
  93. //
  94. //////////////////////////////////////////////////////////////////////////////
  95. const
  96.   // #define D3DX_DEFAULT ULONG_MAX
  97.   // #define D3DX_DEFAULT            ((UINT) -1)
  98.   D3DX_DEFAULT          = Cardinal(-1);
  99.   {$EXTERNALSYM D3DX_DEFAULT}
  100.   // #define D3DX_DEFAULT_NONPOW2    ((UINT) -2)
  101.   D3DX_DEFAULT_NONPOW2  = Cardinal(-2);
  102.   {$EXTERNALSYM D3DX_DEFAULT_NONPOW2}
  103. var
  104.   // #define D3DX_DEFAULT_FLOAT FLT_MAX
  105.   // Forced to define as 'var' cos pascal compiler treats all consts as Double
  106.   D3DX_DEFAULT_FLOAT: Single = 3.402823466e+38;  // max single value
  107.   {$EXTERNALSYM D3DX_DEFAULT_FLOAT}
  108. const
  109.   D3DX_FROM_FILE          = LongWord(-3);
  110.   {$EXTERNALSYM D3DX_FROM_FILE}
  111.   D3DFMT_FROM_FILE        = TD3DFormat(-3);
  112.   {$EXTERNALSYM D3DFMT_FROM_FILE}
  113. type
  114.   _D3DXERR = HResult;
  115.   {$EXTERNALSYM _D3DXERR}
  116. const
  117.   D3DXERR_CANNOTMODIFYINDEXBUFFER       = HResult(MAKE_D3DHRESULT_R or 2900);
  118.   {$EXTERNALSYM D3DXERR_CANNOTMODIFYINDEXBUFFER}
  119.   D3DXERR_INVALIDMESH                   = HResult(MAKE_D3DHRESULT_R or 2901);
  120.   {$EXTERNALSYM D3DXERR_INVALIDMESH}
  121.   D3DXERR_CANNOTATTRSORT                = HResult(MAKE_D3DHRESULT_R or 2902);
  122.   {$EXTERNALSYM D3DXERR_CANNOTATTRSORT}
  123.   D3DXERR_SKINNINGNOTSUPPORTED          = HResult(MAKE_D3DHRESULT_R or 2903);
  124.   {$EXTERNALSYM D3DXERR_SKINNINGNOTSUPPORTED}
  125.   D3DXERR_TOOMANYINFLUENCES             = HResult(MAKE_D3DHRESULT_R or 2904);
  126.   {$EXTERNALSYM D3DXERR_TOOMANYINFLUENCES}
  127.   D3DXERR_INVALIDDATA                   = HResult(MAKE_D3DHRESULT_R or 2905);
  128.   {$EXTERNALSYM D3DXERR_INVALIDDATA}
  129.   D3DXERR_LOADEDMESHASNODATA            = HResult(MAKE_D3DHRESULT_R or 2906);
  130.   {$EXTERNALSYM D3DXERR_LOADEDMESHASNODATA}
  131.   D3DXERR_DUPLICATENAMEDFRAGMENT        = HResult(MAKE_D3DHRESULT_R or 2907);
  132.   {$EXTERNALSYM D3DXERR_DUPLICATENAMEDFRAGMENT}
  133.   D3DXERR_CANNOTREMOVELASTITEM          = HResult(MAKE_D3DHRESULT_R or 2908);
  134.   {$EXTERNALSYM D3DXERR_CANNOTREMOVELASTITEM}
  135. //////////////////////////////////////////////////////////////////////////////
  136. //
  137. //  Copyright (C) Microsoft Corporation.  All Rights Reserved.
  138. //
  139. //  File:       d3dx9math.h
  140. //  Content:    D3DX math types and functions
  141. //
  142. //////////////////////////////////////////////////////////////////////////////
  143. //===========================================================================
  144. //
  145. // General purpose utilities
  146. //
  147. //===========================================================================
  148. const
  149.   D3DX_PI: Single       = 3.141592654;
  150.   {$EXTERNALSYM D3DX_PI}
  151.   D3DX_1BYPI: Single    = 0.318309886;
  152.   {$EXTERNALSYM D3DX_1BYPI}
  153. //#define D3DXToRadian( degree ) ((degree) * (D3DX_PI / 180.0f))
  154. function D3DXToRadian(Degree: Single): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  155. {$EXTERNALSYM D3DXToRadian}
  156. //#define D3DXToDegree( radian ) ((radian) * (180.0f / D3DX_PI))
  157. function D3DXToDegree(Radian: Single): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  158. {$EXTERNALSYM D3DXToDegree}
  159. //===========================================================================
  160. //
  161. // 16 bit floating point numbers
  162. //
  163. //===========================================================================
  164. const
  165.   D3DX_16F_DIG          = 3;               // # of decimal digits of precision
  166.   {$EXTERNALSYM D3DX_16F_DIG}
  167.   D3DX_16F_EPSILON      = 4.8875809e-4;    // smallest such that 1.0 + epsilon <> 1.0
  168.   {$EXTERNALSYM D3DX_16F_EPSILON}
  169.   D3DX_16F_MANT_DIG     = 11;              // # of bits in mantissa
  170.   {$EXTERNALSYM D3DX_16F_MANT_DIG}
  171.   D3DX_16F_MAX          = 6.550400e+004;   // max value
  172.   {$EXTERNALSYM D3DX_16F_MAX}
  173.   D3DX_16F_MAX_10_EXP   = 4;               // max decimal exponent
  174.   {$EXTERNALSYM D3DX_16F_MAX_10_EXP}
  175.   D3DX_16F_MAX_EXP      = 15;              // max binary exponent
  176.   {$EXTERNALSYM D3DX_16F_MAX_EXP}
  177.   D3DX_16F_MIN          = 6.1035156e-5;    // min positive value
  178.   {$EXTERNALSYM D3DX_16F_MIN}
  179.   D3DX_16F_MIN_10_EXP   = -4;              // min decimal exponent
  180.   {$EXTERNALSYM D3DX_16F_MIN_10_EXP}
  181.   D3DX_16F_MIN_EXP      = -14;             // min binary exponent
  182.   {$EXTERNALSYM D3DX_16F_MIN_EXP}
  183.   D3DX_16F_RADIX        = 2;               // exponent radix
  184.   {$EXTERNALSYM D3DX_16F_RADIX}
  185.   D3DX_16F_ROUNDS       = 1;               // addition rounding: near
  186.   {$EXTERNALSYM D3DX_16F_ROUNDS}
  187. type
  188.   (*$HPPEMIT 'typedef D3DXFLOAT16       TD3DXFloat16;' *)
  189.   (*$HPPEMIT 'typedef D3DXFLOAT16      *PD3DXFloat16;' *)
  190.   PD3DXFloat16 = ^TD3DXFloat16;
  191.   {$EXTERNALSYM PD3DXFloat16}
  192.   TD3DXFloat16 = packed record
  193.     value: Word;
  194.   end;
  195.   {$NODEFINE TD3DXFloat16}
  196. // Some pascal equalents of C++ class functions & operators
  197. const D3DXFloat16Zero: TD3DXFloat16 = (value:0); // 0
  198. function D3DXFloat16(value: Single): TD3DXFloat16;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  199. function D3DXFloat16Equal(const v1, v2: TD3DXFloat16): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  200. function D3DXFloat16ToFloat(value: TD3DXFloat16): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  201. //===========================================================================
  202. //
  203. // Vectors
  204. //
  205. //===========================================================================
  206. //--------------------------
  207. // 2D Vector
  208. //--------------------------
  209. type
  210.   (*$HPPEMIT 'typedef D3DXVECTOR2       TD3DXVector2;' *)
  211.   (*$HPPEMIT 'typedef D3DXVECTOR2      *PD3DXVector2;' *)
  212.   PD3DXVector2 = ^TD3DXVector2;
  213.   {$EXTERNALSYM PD3DXVector2}
  214.   TD3DXVector2 = record
  215.     x, y: Single;
  216.   end;
  217.   {$NODEFINE TD3DXVector2}
  218. // Some pascal equalents of C++ class functions & operators
  219. const D3DXVector2Zero: TD3DXVector2 = (x:0; y:0);  // (0,0)
  220. function D3DXVector2(_x, _y: Single): TD3DXVector2;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  221. function D3DXVector2Equal(const v1, v2: TD3DXVector2): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  222. //--------------------------
  223. // 2D Vector (16 bit)
  224. //--------------------------
  225. type
  226.   (*$HPPEMIT 'typedef D3DXVECTOR2_16F       TD3DXVector2_16F;' *)
  227.   (*$HPPEMIT 'typedef D3DXVECTOR2_16F      *PD3DXVector2_16F;' *)
  228.   PD3DXVector2_16F = ^TD3DXVector2_16F;
  229.   {$EXTERNALSYM PD3DXVector2_16F}
  230.   TD3DXVector2_16F = packed record
  231.     x, y: TD3DXFloat16;
  232.   end;
  233.   {$NODEFINE TD3DXVector2_16F}
  234. // Some pascal equalents of C++ class functions & operators
  235. const D3DXVector2_16fZero: TD3DXVector2_16F = (x:(value:0); y:(value:0));  // (0,0)
  236. function D3DXVector2_16F(_x, _y: TD3DXFloat16): TD3DXVector2_16F;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  237. function D3DXVector2_16fEqual(const v1, v2: TD3DXVector2_16F): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  238. function D3DXVector2_16fFromVector2(const v: TD3DXVector2): TD3DXVector2_16f;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  239. function D3DXVector2FromVector2_16f(const v: TD3DXVector2_16f): TD3DXVector2;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  240. //--------------------------
  241. // 3D Vector
  242. //--------------------------
  243. type
  244.   (*$HPPEMIT 'typedef D3DXVECTOR3       TD3DXVector3;' *)
  245.   (*$HPPEMIT 'typedef D3DXVECTOR3      *PD3DXVector3;' *)
  246.   PD3DXVector3 = ^TD3DXVector3;
  247.   {$EXTERNALSYM PD3DXVector3}
  248.   TD3DXVector3 = TD3DVector;
  249.   {$NODEFINE TD3DXVector3}
  250. // Some pascal equalents of C++ class functions & operators
  251. const D3DXVector3Zero: TD3DXVector3 = (x:0; y:0; z:0);  // (0,0,0)
  252. function D3DXVector3(_x, _y, _z: Single): TD3DXVector3;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  253. function D3DXVector3Equal(const v1, v2: TD3DXVector3): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  254. //--------------------------
  255. // 3D Vector (16 bit)
  256. //--------------------------
  257. type
  258.   (*$HPPEMIT 'typedef D3DXVECTOR3_16F       TD3DXVector3_16F;' *)
  259.   (*$HPPEMIT 'typedef D3DXVECTOR3_16F      *PD3DXVector3_16F;' *)
  260.   PD3DXVector3_16F = ^TD3DXVector3_16F;
  261.   {$EXTERNALSYM PD3DXVector3}
  262.   TD3DXVector3_16F = packed record
  263.     x, y, z: TD3DXFloat16;
  264.   end;
  265.   {$NODEFINE TD3DXVector3_16F}
  266. // Some pascal equalents of C++ class functions & operators
  267. const D3DXVector3_16fZero: TD3DXVector3_16F = (x:(value:0); y:(value:0); z:(value:0));  // (0,0,0)
  268. function D3DXVector3_16F(_x, _y, _z: TD3DXFloat16): TD3DXVector3_16F;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  269. function D3DXVector3_16fEqual(const v1, v2: TD3DXVector3_16F): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  270. function D3DXVector3_16fFromVector3(const v: TD3DXVector3): TD3DXVector3_16f;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  271. function D3DXVector3FromVector3_16f(const v: TD3DXVector3_16f): TD3DXVector3;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  272. //--------------------------
  273. // 4D Vector
  274. //--------------------------
  275. type
  276.   (*$HPPEMIT 'typedef D3DXVECTOR4       TD3DXVector4;' *)
  277.   (*$HPPEMIT 'typedef D3DXVECTOR4      *PD3DXVector4;' *)
  278.   PD3DXVector4 = ^TD3DXVector4;
  279.   {$EXTERNALSYM PD3DXVector4}
  280.   TD3DXVector4 = record
  281.     x, y, z, w: Single;
  282.   end;
  283.   {$NODEFINE TD3DXVector4}
  284. // Some pascal equalents of C++ class functions & operators
  285. const D3DXVector4Zero: TD3DXVector4 = (x:0; y:0; z:0; w:0);  // (0,0,0,0)
  286. function D3DXVector4(_x, _y, _z, _w: Single): TD3DXVector4; overload;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  287. function D3DXVector4(xyz: TD3DXVector3; _w: Single): TD3DXVector4; overload;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  288. function D3DXVector4Equal(const v1, v2: TD3DXVector4): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  289. //--------------------------
  290. // 4D Vector (16 bit)
  291. //--------------------------
  292. type
  293.   (*$HPPEMIT 'typedef D3DXVECTOR4_16F       TD3DXVector4_16F;' *)
  294.   (*$HPPEMIT 'typedef D3DXVECTOR4_16F      *PD3DXVector4_16F;' *)
  295.   PD3DXVector4_16F = ^TD3DXVector4_16F;
  296.   {$EXTERNALSYM PD3DXVector4_16F}
  297.   TD3DXVector4_16F = packed record
  298.     x, y, z, w: TD3DXFloat16;
  299.   end;
  300.   {$NODEFINE TD3DXVector4_16F}
  301. // Some pascal equalents of C++ class functions & operators
  302. const D3DXVector4_16fZero: TD3DXVector4_16F = (x:(value:0); y:(value:0); z:(value:0); w:(value:0));  // (0,0,0,0)
  303. function D3DXVector4_16F(_x, _y, _z, _w: TD3DXFloat16): TD3DXVector4_16F; overload;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  304. function D3DXVector4_16F(xyz: TD3DXVector3_16f; _w: TD3DXFloat16): TD3DXVector4_16F; overload;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  305. function D3DXVector4_16fEqual(const v1, v2: TD3DXVector4_16F): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  306. function D3DXVector4_16fFromVector4(const v: TD3DXVector4): TD3DXVector4_16f;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  307. function D3DXVector4FromVector4_16f(const v: TD3DXVector4_16f): TD3DXVector4;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  308. //===========================================================================
  309. //
  310. // Matrices
  311. //
  312. //===========================================================================
  313. type
  314.   (*$HPPEMIT 'typedef D3DXMATRIX        TD3DXMatrix;' *)
  315.   (*$HPPEMIT 'typedef D3DXMATRIX       *PD3DXMatrix;' *)
  316.   (*$HPPEMIT 'typedef D3DXMATRIX      **PPD3DXMatrix;' *)
  317.   PPD3DXMatrix = ^PD3DXMatrix;
  318.   PD3DXMatrix = ^TD3DXMatrix;
  319.   {$EXTERNALSYM PD3DXMatrix}
  320.   TD3DXMatrix = TD3DMatrix;
  321.   {$NODEFINE TD3DXMatrix}
  322. // Some pascal equalents of C++ class functions & operators
  323. function D3DXMatrix(
  324.   _m00, _m01, _m02, _m03,
  325.   _m10, _m11, _m12, _m13,
  326.   _m20, _m21, _m22, _m23,
  327.   _m30, _m31, _m32, _m33: Single): TD3DXMatrix;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  328. function D3DXMatrixAdd(out mOut: TD3DXMatrix; const m1, m2: TD3DXMatrix): PD3DXMatrix;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  329. function D3DXMatrixSubtract(out mOut: TD3DXMatrix; const m1, m2: TD3DXMatrix): PD3DXMatrix;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  330. function D3DXMatrixMul(out mOut: TD3DXMatrix; const m: TD3DXMatrix; MulBy: Single): PD3DXMatrix;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  331. function D3DXMatrixEqual(const m1, m2: TD3DXMatrix): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  332. //---------------------------------------------------------------------------
  333. // Aligned Matrices
  334. //
  335. // This class helps keep matrices 16-byte aligned as preferred by P4 cpus.
  336. // It aligns matrices on the stack and on the heap or in global scope.
  337. // It does this using __declspec(align(16)) which works on VC7 and on VC 6
  338. // with the processor pack. Unfortunately there is no way to detect the
  339. // latter so this is turned on only on VC7. On other compilers this is the
  340. // the same as D3DXMATRIX.
  341. //
  342. // Using this class on a compiler that does not actually do the alignment
  343. // can be dangerous since it will not expose bugs that ignore alignment.
  344. // E.g if an object of this class in inside a struct or class, and some code
  345. // memcopys data in it assuming tight packing. This could break on a compiler
  346. // that eventually start aligning the matrix.
  347. //---------------------------------------------------------------------------
  348. // Translator comments: None of current pascal compilers can even align data
  349. // inside records to 16 byte boundary, so we just leave aligned matrix
  350. // declaration equal to standart matrix
  351. type
  352.   PD3DXMatrixA16 = ^TD3DXMatrixA16;
  353.   TD3DXMatrixA16 = TD3DXMatrix;
  354. //===========================================================================
  355. //
  356. //    Quaternions
  357. //
  358. //===========================================================================
  359. type
  360.   (*$HPPEMIT 'typedef D3DXQUATERNION TD3DXQuaternion;' *)
  361.   PD3DXQuaternion = ^TD3DXQuaternion;
  362.   TD3DXQuaternion = record
  363.     x, y, z, w: Single;
  364.   end;
  365.   {$NODEFINE TD3DXQuaternion}
  366. // Some pascal equalents of C++ class functions & operators
  367. function D3DXQuaternion(_x, _y, _z, _w: Single): TD3DXQuaternion;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  368. function D3DXQuaternionAdd(const q1, q2: TD3DXQuaternion): TD3DXQuaternion;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  369. function D3DXQuaternionSubtract(const q1, q2: TD3DXQuaternion): TD3DXQuaternion;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  370. function D3DXQuaternionEqual(const q1, q2: TD3DXQuaternion): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  371. function D3DXQuaternionScale(out qOut: TD3DXQuaternion; const q: TD3DXQuaternion;
  372.   s: Single): PD3DXQuaternion;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  373. //===========================================================================
  374. //
  375. // Planes
  376. //
  377. //===========================================================================
  378. type
  379.   (*$HPPEMIT 'typedef D3DXPLANE TD3DXPlane;' *)
  380.   PD3DXPlane = ^TD3DXPlane;
  381.   TD3DXPlane = record
  382.     a, b, c, d: Single;
  383.   end;
  384.   {$NODEFINE TD3DXPlane}
  385. // Some pascal equalents of C++ class functions & operators
  386. const D3DXPlaneZero: TD3DXPlane = (a:0; b:0; c:0; d:0);  // (0,0,0,0)
  387. function D3DXPlane(_a, _b, _c, _d: Single): TD3DXPlane;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  388. function D3DXPlaneEqual(const p1, p2: TD3DXPlane): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  389. //===========================================================================
  390. //
  391. // Colors
  392. //
  393. //===========================================================================
  394. type
  395.   (*$HPPEMIT 'typedef D3DXCOLOR TD3DXColor;' *)
  396.   (*$HPPEMIT 'typedef D3DXCOLOR *PD3DXColor;' *)
  397.   PD3DXColor = PD3DColorValue;
  398.   {$EXTERNALSYM PD3DXColor}
  399.   TD3DXColor = TD3DColorValue;
  400.   {$EXTERNALSYM TD3DXColor}
  401. function D3DXColor(_r, _g, _b, _a: Single): TD3DXColor;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  402. function D3DXColorToDWord(c: TD3DXColor): DWord;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  403. function D3DXColorFromDWord(c: DWord): TD3DXColor;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  404. function D3DXColorEqual(const c1, c2: TD3DXColor): Boolean;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  405. //===========================================================================
  406. //
  407. // D3DX math functions:
  408. //
  409. // NOTE:
  410. //  * All these functions can take the same object as in and out parameters.
  411. //
  412. //  * Out parameters are typically also returned as return values, so that
  413. //    the output of one function may be used as a parameter to another.
  414. //
  415. //===========================================================================
  416. //--------------------------
  417. // Float16
  418. //--------------------------
  419. // non-inline
  420. // Converts an array 32-bit floats to 16-bit floats
  421. function D3DXFloat32To16Array(pOut: PD3DXFloat16; pIn: PSingle; n: LongWord): PD3DXFloat16; stdcall; external d3dx9mathDLL;
  422. {$EXTERNALSYM D3DXFloat32To16Array}
  423. // Converts an array 16-bit floats to 32-bit floats
  424. function D3DXFloat16To32Array(pOut: PSingle; pIn: PD3DXFloat16; n: LongWord): PSingle; stdcall; external d3dx9mathDLL;
  425. {$EXTERNALSYM D3DXFloat16To32Array}
  426. //--------------------------
  427. // 2D Vector
  428. //--------------------------
  429. // inline
  430. function D3DXVec2Length(const v: TD3DXVector2): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  431. {$EXTERNALSYM D3DXVec2Length}
  432. function D3DXVec2LengthSq(const v: TD3DXVector2): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  433. {$EXTERNALSYM D3DXVec2LengthSq}
  434. function D3DXVec2Dot(const v1, v2: TD3DXVector2): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  435. {$EXTERNALSYM D3DXVec2Dot}
  436. // Z component of ((x1,y1,0) cross (x2,y2,0))
  437. function D3DXVec2CCW(const v1, v2: TD3DXVector2): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  438. {$EXTERNALSYM D3DXVec2CCW}
  439. function D3DXVec2Add(const v1, v2: TD3DXVector2): TD3DXVector2;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  440. {$EXTERNALSYM D3DXVec2Add}
  441. function D3DXVec2Subtract(const v1, v2: TD3DXVector2): TD3DXVector2;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  442. {$EXTERNALSYM D3DXVec2Subtract}
  443. // Minimize each component.  x = min(x1, x2), y = min(y1, y2)
  444. function D3DXVec2Minimize(out vOut: TD3DXVector2; const v1, v2: TD3DXVector2): PD3DXVector2;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  445. {$EXTERNALSYM D3DXVec2Minimize}
  446. // Maximize each component.  x = max(x1, x2), y = max(y1, y2)
  447. function D3DXVec2Maximize(out vOut: TD3DXVector2; const v1, v2: TD3DXVector2): PD3DXVector2;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  448. {$EXTERNALSYM D3DXVec2Maximize}
  449. function D3DXVec2Scale(out vOut: TD3DXVector2; const v: TD3DXVector2; s: Single): PD3DXVector2;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  450. {$EXTERNALSYM D3DXVec2Scale}
  451. // Linear interpolation. V1 + s(V2-V1)
  452. function D3DXVec2Lerp(out vOut: TD3DXVector2; const v1, v2: TD3DXVector2; s: Single): PD3DXVector2;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  453. {$EXTERNALSYM D3DXVec2Lerp}
  454. // non-inline
  455. function D3DXVec2Normalize(out vOut: TD3DXVector2; const v: TD3DXVector2): PD3DXVector2; stdcall; external d3dx9mathDLL;
  456. {$EXTERNALSYM D3DXVec2Normalize}
  457. // Hermite interpolation between position V1, tangent T1 (when s == 0)
  458. // and position V2, tangent T2 (when s == 1).
  459. function D3DXVec2Hermite(out vOut: TD3DXVector2;
  460.    const v1, t1, v2, t2: TD3DXVector2; s: Single): PD3DXVector2; stdcall; external d3dx9mathDLL;
  461. {$EXTERNALSYM D3DXVec2Hermite}
  462. // CatmullRom interpolation between V1 (when s == 0) and V2 (when s == 1)
  463. function D3DXVec2CatmullRom(out vOut: TD3DXVector2;
  464.    const v0, v1, v2, v3: TD3DXVector2; s: Single): PD3DXVector2; stdcall; external d3dx9mathDLL;
  465. {$EXTERNALSYM D3DXVec2CatmullRom}
  466. // Barycentric coordinates.  V1 + f(V2-V1) + g(V3-V1)
  467. function D3DXVec2BaryCentric(out vOut: TD3DXVector2;
  468.    const v1, v2, v3: TD3DXVector2; f, g: Single): PD3DXVector2; stdcall; external d3dx9mathDLL;
  469. {$EXTERNALSYM D3DXVec2BaryCentric}
  470. // Transform (x, y, 0, 1) by matrix.
  471. function D3DXVec2Transform(out vOut: TD3DXVector4;
  472.   const v: TD3DXVector2; const m: TD3DXMatrix): PD3DXVector4; stdcall; external d3dx9mathDLL;
  473. {$EXTERNALSYM D3DXVec2Transform}
  474. // Transform (x, y, 0, 1) by matrix, project result back into w=1.
  475. function D3DXVec2TransformCoord(out vOut: TD3DXVector2;
  476.   const v: TD3DXVector2; const m: TD3DXMatrix): PD3DXVector2; stdcall; external d3dx9mathDLL;
  477. {$EXTERNALSYM D3DXVec2TransformCoord}
  478. // Transform (x, y, 0, 0) by matrix.
  479. function D3DXVec2TransformNormal(out vOut: TD3DXVector2;
  480.   const v: TD3DXVector2; const m: TD3DXMatrix): PD3DXVector2; stdcall; external d3dx9mathDLL;
  481. {$EXTERNALSYM D3DXVec2TransformNormal}
  482. // Transform Array (x, y, 0, 1) by matrix.
  483. function D3DXVec2TransformArray(pOut: PD3DXVector4; OutStride: LongWord;
  484.   pV: PD3DXVector2; VStride: LongWord; const m: TD3DXMatrix; n: LongWord): PD3DXVector4; stdcall; external d3dx9mathDLL;
  485. {$EXTERNALSYM D3DXVec2TransformArray}
  486. // Transform Array (x, y, 0, 1) by matrix, project result back into w=1.
  487. function D3DXVec2TransformCoordArray(pOut: PD3DXVector2; OutStride: LongWord;
  488.   pV: PD3DXVector2; VStride: LongWord; const m: TD3DXMatrix; n: LongWord): PD3DXVector2; stdcall; external d3dx9mathDLL;
  489. {$EXTERNALSYM D3DXVec2TransformCoordArray}
  490. // Transform Array (x, y, 0, 0) by matrix.
  491. function D3DXVec2TransformNormalArray(pOut: PD3DXVector2; OutStride: LongWord;
  492.   pV: PD3DXVector2; VStride: LongWord; const m: TD3DXMatrix; n: LongWord): PD3DXVector2; stdcall; external d3dx9mathDLL;
  493. {$EXTERNALSYM D3DXVec2TransformNormalArray}
  494. //--------------------------
  495. // 3D Vector
  496. //--------------------------
  497. // inline
  498. function D3DXVec3Length(const v: TD3DXVector3): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  499. {$EXTERNALSYM D3DXVec3Length}
  500. function D3DXVec3LengthSq(const v: TD3DXVector3): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  501. {$EXTERNALSYM D3DXVec3LengthSq}
  502. function D3DXVec3Dot(const v1, v2: TD3DXVector3): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  503. {$EXTERNALSYM D3DXVec3Dot}
  504. function D3DXVec3Cross(out vOut: TD3DXVector3; const v1, v2: TD3DXVector3): PD3DXVector3;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  505. {$EXTERNALSYM D3DXVec3Cross}
  506. function D3DXVec3Add(out vOut: TD3DXVector3; const v1, v2: TD3DXVector3): PD3DXVector3;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  507. {$EXTERNALSYM D3DXVec3Add}
  508. function D3DXVec3Subtract(out vOut: TD3DXVector3; const v1, v2: TD3DXVector3): PD3DXVector3;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  509. {$EXTERNALSYM D3DXVec3Subtract}
  510. // Minimize each component.  x = min(x1, x2), y = min(y1, y2), ...
  511. function D3DXVec3Minimize(out vOut: TD3DXVector3; const v1, v2: TD3DXVector3): PD3DXVector3;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  512. {$EXTERNALSYM D3DXVec3Minimize}
  513. // Maximize each component.  x = max(x1, x2), y = max(y1, y2), ...
  514. function D3DXVec3Maximize(out vOut: TD3DXVector3; const v1, v2: TD3DXVector3): PD3DXVector3;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  515. {$EXTERNALSYM D3DXVec3Maximize}
  516. function D3DXVec3Scale(out vOut: TD3DXVector3; const v: TD3DXVector3; s: Single): PD3DXVector3;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  517. {$EXTERNALSYM D3DXVec3Scale}
  518. // Linear interpolation. V1 + s(V2-V1)
  519. function D3DXVec3Lerp(out vOut: TD3DXVector3;
  520.   const v1, v2: TD3DXVector3; s: Single): PD3DXVector3;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  521. {$EXTERNALSYM D3DXVec3Lerp}
  522. // non-inline
  523. function D3DXVec3Normalize(out vOut: TD3DXVector3;
  524.    const v: TD3DXVector3): PD3DXVector3; stdcall; external d3dx9mathDLL;
  525. {$EXTERNALSYM D3DXVec3Normalize}
  526. // Hermite interpolation between position V1, tangent T1 (when s == 0)
  527. // and position V2, tangent T2 (when s == 1).
  528. function D3DXVec3Hermite(out vOut: TD3DXVector3;
  529.    const v1, t1, v2, t2: TD3DXVector3; s: Single): PD3DXVector3; stdcall; external d3dx9mathDLL;
  530. {$EXTERNALSYM D3DXVec3Hermite}
  531. // CatmullRom interpolation between V1 (when s == 0) and V2 (when s == 1)
  532. function D3DXVec3CatmullRom(out vOut: TD3DXVector3;
  533.    const v0, v1, v2, v3: TD3DXVector3; s: Single): PD3DXVector3; stdcall; external d3dx9mathDLL;
  534. {$EXTERNALSYM D3DXVec3CatmullRom}
  535. // Barycentric coordinates.  V1 + f(V2-V1) + g(V3-V1)
  536. function D3DXVec3BaryCentric(out vOut: TD3DXVector3;
  537.    const v1, v2, v3: TD3DXVector3; f, g: Single): PD3DXVector3; stdcall; external d3dx9mathDLL;
  538. {$EXTERNALSYM D3DXVec3BaryCentric}
  539. // Transform (x, y, z, 1) by matrix.
  540. function D3DXVec3Transform(out vOut: TD3DXVector4;
  541.   const v: TD3DXVector3; const m: TD3DXMatrix): PD3DXVector4; stdcall; external d3dx9mathDLL;
  542. {$EXTERNALSYM D3DXVec3Transform}
  543. // Transform (x, y, z, 1) by matrix, project result back into w=1.
  544. function D3DXVec3TransformCoord(out vOut: TD3DXVector3;
  545.   const v: TD3DXVector3; const m: TD3DXMatrix): PD3DXVector3; stdcall; external d3dx9mathDLL;
  546. {$EXTERNALSYM D3DXVec3TransformCoord}
  547. // Transform (x, y, z, 0) by matrix.  If you transforming a normal by a
  548. // non-affine matrix, the matrix you pass to this function should be the
  549. // transpose of the inverse of the matrix you would use to transform a coord.
  550. function D3DXVec3TransformNormal(out vOut: TD3DXVector3;
  551.   const v: TD3DXVector3; const m: TD3DXMatrix): PD3DXVector3; stdcall; external d3dx9mathDLL;
  552. {$EXTERNALSYM D3DXVec3TransformNormal}
  553. // Transform Array (x, y, z, 1) by matrix.
  554. function D3DXVec3TransformArray(pOut: PD3DXVector4; OutStride: LongWord;
  555.   pV: PD3DXVector3; VStride: LongWord; const m: TD3DXMatrix; n: LongWord): PD3DXVector4; stdcall; external d3dx9mathDLL;
  556. {$EXTERNALSYM D3DXVec3TransformArray}
  557. // Transform Array (x, y, z, 1) by matrix, project result back into w=1.
  558. function D3DXVec3TransformCoordArray(pOut: PD3DXVector3; OutStride: LongWord;
  559.   pV: PD3DXVector3; VStride: LongWord; const m: TD3DXMatrix; n: LongWord): PD3DXVector3; stdcall; external d3dx9mathDLL;
  560. {$EXTERNALSYM D3DXVec3TransformCoordArray}
  561. // Transform (x, y, z, 0) by matrix.  If you transforming a normal by a
  562. // non-affine matrix, the matrix you pass to this function should be the
  563. // transpose of the inverse of the matrix you would use to transform a coord.
  564. function D3DXVec3TransformNormalArray(pOut: PD3DXVector3; OutStride: LongWord;
  565.   pV: PD3DXVector3; VStride: LongWord; const m: TD3DXMatrix; n: LongWord): PD3DXVector3; stdcall; external d3dx9mathDLL;
  566. {$EXTERNALSYM D3DXVec3TransformNormalArray}
  567. // Project vector from object space into screen space
  568. function D3DXVec3Project(out vOut: TD3DXVector3;
  569.   const v: TD3DXVector3; const pViewport: TD3DViewport9;
  570.   const pProjection, pView, pWorld: TD3DXMatrix): PD3DXVector3; stdcall; external d3dx9mathDLL;
  571. {$EXTERNALSYM D3DXVec3Project}
  572. // Project vector from screen space into object space
  573. function D3DXVec3Unproject(out vOut: TD3DXVector3;
  574.   const v: TD3DXVector3; const pViewport: TD3DViewport9;
  575.   const pProjection, pView, pWorld: TD3DXMatrix): PD3DXVector3; stdcall; external d3dx9mathDLL;
  576. {$EXTERNALSYM D3DXVec3Unproject}
  577. // Project vector Array from object space into screen space
  578. function D3DXVec3ProjectArray(pOut: PD3DXVector3; OutStride: LongWord;
  579.   pV: PD3DXVector3; VStride: LongWord; const pViewport: TD3DViewport9;
  580.   const pProjection, pView, pWorld: TD3DXMatrix; n: LongWord): PD3DXVector3; stdcall; external d3dx9mathDLL;
  581. {$EXTERNALSYM D3DXVec3ProjectArray}
  582. // Project vector Array from screen space into object space
  583. function D3DXVec3UnprojectArray(pOut: PD3DXVector3; OutStride: LongWord;
  584.   pV: PD3DXVector3; VStride: LongWord; const pViewport: TD3DViewport9;
  585.   const pProjection, pView, pWorld: TD3DXMatrix; n: LongWord): PD3DXVector3; stdcall; external d3dx9mathDLL;
  586. {$EXTERNALSYM D3DXVec3UnprojectArray}
  587. //--------------------------
  588. // 4D Vector
  589. //--------------------------
  590. // inline
  591. function D3DXVec4Length(const v: TD3DXVector4): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  592. {$EXTERNALSYM D3DXVec4Length}
  593. function D3DXVec4LengthSq(const v: TD3DXVector4): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  594. {$EXTERNALSYM D3DXVec4LengthSq}
  595. function D3DXVec4Dot(const v1, v2: TD3DXVector4): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  596. {$EXTERNALSYM D3DXVec4Dot}
  597. function D3DXVec4Add(out vOut: TD3DXVector4; const v1, v2: TD3DXVector4): PD3DXVector4;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  598. {$EXTERNALSYM D3DXVec4Add}
  599. function D3DXVec4Subtract(out vOut: TD3DXVector4; const v1, v2: TD3DXVector4): PD3DXVector4;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  600. {$EXTERNALSYM D3DXVec4Subtract}
  601. // Minimize each component.  x = min(x1, x2), y = min(y1, y2), ...
  602. function D3DXVec4Minimize(out vOut: TD3DXVector4; const v1, v2: TD3DXVector4): PD3DXVector4;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  603. {$EXTERNALSYM D3DXVec4Minimize}
  604. // Maximize each component.  x = max(x1, x2), y = max(y1, y2), ...
  605. function D3DXVec4Maximize(out vOut: TD3DXVector4; const v1, v2: TD3DXVector4): PD3DXVector4;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  606. {$EXTERNALSYM D3DXVec4Maximize}
  607. function D3DXVec4Scale(out vOut: TD3DXVector4; const v: TD3DXVector4; s: Single): PD3DXVector4;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  608. {$EXTERNALSYM D3DXVec4Scale}
  609. // Linear interpolation. V1 + s(V2-V1)
  610. function D3DXVec4Lerp(out vOut: TD3DXVector4;
  611.   const v1, v2: TD3DXVector4; s: Single): PD3DXVector4;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  612. {$EXTERNALSYM D3DXVec4Lerp}
  613. // non-inline
  614. // Cross-product in 4 dimensions.
  615. function D3DXVec4Cross(out vOut: TD3DXVector4;
  616.   const v1, v2, v3: TD3DXVector4): PD3DXVector4; stdcall; external d3dx9mathDLL;
  617. {$EXTERNALSYM D3DXVec4Cross}
  618. function D3DXVec4Normalize(out vOut: TD3DXVector4;
  619.   const v: TD3DXVector4): PD3DXVector4; stdcall; external d3dx9mathDLL;
  620. {$EXTERNALSYM D3DXVec4Normalize}
  621. // Hermite interpolation between position V1, tangent T1 (when s == 0)
  622. // and position V2, tangent T2 (when s == 1).
  623. function D3DXVec4Hermite(out vOut: TD3DXVector4;
  624.    const v1, t1, v2, t2: TD3DXVector4; s: Single): PD3DXVector4; stdcall; external d3dx9mathDLL;
  625. {$EXTERNALSYM D3DXVec4Hermite}
  626. // CatmullRom interpolation between V1 (when s == 0) and V2 (when s == 1)
  627. function D3DXVec4CatmullRom(out vOut: TD3DXVector4;
  628.    const v0, v1, v2, v3: TD3DXVector4; s: Single): PD3DXVector4; stdcall; external d3dx9mathDLL;
  629. {$EXTERNALSYM D3DXVec4CatmullRom}
  630. // Barycentric coordinates.  V1 + f(V2-V1) + g(V3-V1)
  631. function D3DXVec4BaryCentric(out vOut: TD3DXVector4;
  632.    const v1, v2, v3: TD3DXVector4; f, g: Single): PD3DXVector4; stdcall; external d3dx9mathDLL;
  633. {$EXTERNALSYM D3DXVec4BaryCentric}
  634. // Transform vector by matrix.
  635. function D3DXVec4Transform(out vOut: TD3DXVector4;
  636.   const v: TD3DXVector4; const m: TD3DXMatrix): PD3DXVector4; stdcall; external d3dx9mathDLL;
  637. {$EXTERNALSYM D3DXVec4Transform}
  638. // Transform vector array by matrix.
  639. function D3DXVec4TransformArray(pOut: PD3DXVector4; OutStride: LongWord;
  640.   pV: PD3DXVector4; VStride: LongWord; const m: TD3DXMatrix; n: LongWord): PD3DXVector4; stdcall; external d3dx9mathDLL;
  641. {$EXTERNALSYM D3DXVec4TransformArray}
  642. //--------------------------
  643. // 4D Matrix
  644. //--------------------------
  645. // inline
  646. function D3DXMatrixIdentity(out mOut: TD3DXMatrix): PD3DXMatrix;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  647. {$EXTERNALSYM D3DXMatrixIdentity}
  648. function D3DXMatrixIsIdentity(const m: TD3DXMatrix): BOOL;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  649. {$EXTERNALSYM D3DXMatrixIsIdentity}
  650. // non-inline
  651. function D3DXMatrixDeterminant(const m: TD3DXMatrix): Single; stdcall; external d3dx9mathDLL;
  652. {$EXTERNALSYM D3DXMatrixDeterminant}
  653. function D3DXMatrixDecompose(pOutScale: PD3DXVector3; pOutRotation: PD3DXQuaternion;
  654.    pOutTranslation: PD3DXVector3; const M: TD3DXMatrix): HRESULT; stdcall; external d3dx9mathDLL;
  655. {$EXTERNALSYM D3DXMatrixDecompose}
  656. function D3DXMatrixTranspose(out pOut: TD3DXMatrix; const pM: TD3DXMatrix): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  657. {$EXTERNALSYM D3DXMatrixTranspose}
  658. // Matrix multiplication.  The result represents the transformation M2
  659. // followed by the transformation M1.  (Out = M1 * M2)
  660. function D3DXMatrixMultiply(out mOut: TD3DXMatrix; const m1, m2: TD3DXMatrix): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  661. {$EXTERNALSYM D3DXMatrixMultiply}
  662. // Matrix multiplication, followed by a transpose. (Out = T(M1 * M2))
  663. function D3DXMatrixMultiplyTranspose(out pOut: TD3DXMatrix; const pM1, pM2: TD3DXMatrix): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  664. {$EXTERNALSYM D3DXMatrixMultiplyTranspose}
  665. // Calculate inverse of matrix.  Inversion my fail, in which case NULL will
  666. // be returned.  The determinant of pM is also returned it pfDeterminant
  667. // is non-NULL.
  668. function D3DXMatrixInverse(out mOut: TD3DXMatrix; pfDeterminant: PSingle;
  669.     const m: TD3DXMatrix): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  670. {$EXTERNALSYM D3DXMatrixInverse}
  671. // Build a matrix which scales by (sx, sy, sz)
  672. function D3DXMatrixScaling(out mOut: TD3DXMatrix; sx, sy, sz: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  673. {$EXTERNALSYM D3DXMatrixScaling}
  674. // Build a matrix which translates by (x, y, z)
  675. function D3DXMatrixTranslation(out mOut: TD3DXMatrix; x, y, z: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  676. {$EXTERNALSYM D3DXMatrixTranslation}
  677. // Build a matrix which rotates around the X axis
  678. function D3DXMatrixRotationX(out mOut: TD3DXMatrix; angle: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  679. {$EXTERNALSYM D3DXMatrixRotationX}
  680. // Build a matrix which rotates around the Y axis
  681. function D3DXMatrixRotationY(out mOut: TD3DXMatrix; angle: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  682. {$EXTERNALSYM D3DXMatrixRotationY}
  683. // Build a matrix which rotates around the Z axis
  684. function D3DXMatrixRotationZ(out mOut: TD3DXMatrix; angle: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  685. {$EXTERNALSYM D3DXMatrixRotationZ}
  686. // Build a matrix which rotates around an arbitrary axis
  687. function D3DXMatrixRotationAxis(out mOut: TD3DXMatrix; const v: TD3DXVector3;
  688.   angle: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  689. {$EXTERNALSYM D3DXMatrixRotationAxis}
  690. // Build a matrix from a quaternion
  691. function D3DXMatrixRotationQuaternion(out mOut: TD3DXMatrix; const Q: TD3DXQuaternion): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  692. {$EXTERNALSYM D3DXMatrixRotationQuaternion}
  693. // Yaw around the Y axis, a pitch around the X axis,
  694. // and a roll around the Z axis.
  695. function D3DXMatrixRotationYawPitchRoll(out mOut: TD3DXMatrix; yaw, pitch, roll: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  696. {$EXTERNALSYM D3DXMatrixRotationYawPitchRoll}
  697. // Build transformation matrix.  NULL arguments are treated as identity.
  698. // Mout = Msc-1 * Msr-1 * Ms * Msr * Msc * Mrc-1 * Mr * Mrc * Mt
  699. function D3DXMatrixTransformation(out mOut: TD3DXMatrix;
  700.    pScalingCenter: PD3DXVector3;
  701.    pScalingRotation: PD3DXQuaternion; pScaling, pRotationCenter: PD3DXVector3;
  702.    pRotation: PD3DXQuaternion; pTranslation: PD3DXVector3): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  703. {$EXTERNALSYM D3DXMatrixTransformation}
  704. // Build 2D transformation matrix in XY plane.  NULL arguments are treated as identity.
  705. // Mout = Msc-1 * Msr-1 * Ms * Msr * Msc * Mrc-1 * Mr * Mrc * Mt
  706. function D3DXMatrixTransformation2D(out pOut: TD3DXMatrix;
  707.    pScalingCenter: PD3DXVector2;
  708.    ScalingRotation: Single; pScaling: PD3DXVector2; pRotationCenter: PD3DXVector2;
  709.    Rotation: Single; pTranslation: PD3DXVector2): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  710. {$EXTERNALSYM D3DXMatrixTransformation2D}
  711. // Build affine transformation matrix.  NULL arguments are treated as identity.
  712. // Mout = Ms * Mrc-1 * Mr * Mrc * Mt
  713. function D3DXMatrixAffineTransformation(out mOut: TD3DXMatrix;
  714.    Scaling: Single; pRotationCenter: PD3DXVector3;
  715.    pRotation: PD3DXQuaternion; pTranslation: PD3DXVector3): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  716. {$EXTERNALSYM D3DXMatrixAffineTransformation}
  717. // Build 2D affine transformation matrix in XY plane.  NULL arguments are treated as identity.
  718. // Mout = Ms * Mrc-1 * Mr * Mrc * Mt
  719. function D3DXMatrixAffineTransformation2D(out mOut: TD3DXMatrix;
  720.    Scaling: Single; pRotationCenter: PD3DXVector2;
  721.    Rotation: Single; pTranslation: PD3DXVector2): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  722. {$EXTERNALSYM D3DXMatrixAffineTransformation2D}
  723. // Build a lookat matrix. (right-handed)
  724. function D3DXMatrixLookAtRH(out mOut: TD3DXMatrix; const Eye, At, Up: TD3DXVector3): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  725. {$EXTERNALSYM D3DXMatrixLookAtRH}
  726. // Build a lookat matrix. (left-handed)
  727. function D3DXMatrixLookAtLH(out mOut: TD3DXMatrix; const Eye, At, Up: TD3DXVector3): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  728. {$EXTERNALSYM D3DXMatrixLookAtLH}
  729. // Build a perspective projection matrix. (right-handed)
  730. function D3DXMatrixPerspectiveRH(out mOut: TD3DXMatrix; w, h, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  731. {$EXTERNALSYM D3DXMatrixPerspectiveRH}
  732. // Build a perspective projection matrix. (left-handed)
  733. function D3DXMatrixPerspectiveLH(out mOut: TD3DXMatrix; w, h, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  734. {$EXTERNALSYM D3DXMatrixPerspectiveLH}
  735. // Build a perspective projection matrix. (right-handed)
  736. function D3DXMatrixPerspectiveFovRH(out mOut: TD3DXMatrix; flovy, aspect, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  737. {$EXTERNALSYM D3DXMatrixPerspectiveFovRH}
  738. // Build a perspective projection matrix. (left-handed)
  739. function D3DXMatrixPerspectiveFovLH(out mOut: TD3DXMatrix; flovy, aspect, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  740. {$EXTERNALSYM D3DXMatrixPerspectiveFovLH}
  741. // Build a perspective projection matrix. (right-handed)
  742. function D3DXMatrixPerspectiveOffCenterRH(out mOut: TD3DXMatrix;
  743.    l, r, b, t, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  744. {$EXTERNALSYM D3DXMatrixPerspectiveOffCenterRH}
  745. // Build a perspective projection matrix. (left-handed)
  746. function D3DXMatrixPerspectiveOffCenterLH(out mOut: TD3DXMatrix;
  747.    l, r, b, t, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  748. {$EXTERNALSYM D3DXMatrixPerspectiveOffCenterLH}
  749. // Build an ortho projection matrix. (right-handed)
  750. function D3DXMatrixOrthoRH(out mOut: TD3DXMatrix; w, h, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  751. {$EXTERNALSYM D3DXMatrixOrthoRH}
  752. // Build an ortho projection matrix. (left-handed)
  753. function D3DXMatrixOrthoLH(out mOut: TD3DXMatrix; w, h, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  754. {$EXTERNALSYM D3DXMatrixOrthoLH}
  755. // Build an ortho projection matrix. (right-handed)
  756. function D3DXMatrixOrthoOffCenterRH(out mOut: TD3DXMatrix;
  757.   l, r, b, t, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  758. {$EXTERNALSYM D3DXMatrixOrthoOffCenterRH}
  759. // Build an ortho projection matrix. (left-handed)
  760. function D3DXMatrixOrthoOffCenterLH(out mOut: TD3DXMatrix;
  761.   l, r, b, t, zn, zf: Single): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  762. {$EXTERNALSYM D3DXMatrixOrthoOffCenterLH}
  763. // Build a matrix which flattens geometry into a plane, as if casting
  764. // a shadow from a light.
  765. function D3DXMatrixShadow(out mOut: TD3DXMatrix;
  766.   const Light: TD3DXVector4; const Plane: TD3DXPlane): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  767. {$EXTERNALSYM D3DXMatrixShadow}
  768. // Build a matrix which reflects the coordinate system about a plane
  769. function D3DXMatrixReflect(out mOut: TD3DXMatrix;
  770.    const Plane: TD3DXPlane): PD3DXMatrix; stdcall; external d3dx9mathDLL;
  771. {$EXTERNALSYM D3DXMatrixReflect}
  772. //--------------------------
  773. // Quaternion
  774. //--------------------------
  775. // inline
  776. function D3DXQuaternionLength(const q: TD3DXQuaternion): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  777. {$EXTERNALSYM D3DXQuaternionLength}
  778. // Length squared, or "norm"
  779. function D3DXQuaternionLengthSq(const q: TD3DXQuaternion): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  780. {$EXTERNALSYM D3DXQuaternionLengthSq}
  781. function D3DXQuaternionDot(const q1, q2: TD3DXQuaternion): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  782. {$EXTERNALSYM D3DXQuaternionDot}
  783. // (0, 0, 0, 1)
  784. function D3DXQuaternionIdentity(out qOut: TD3DXQuaternion): PD3DXQuaternion;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  785. {$EXTERNALSYM D3DXQuaternionIdentity}
  786. function D3DXQuaternionIsIdentity (const q: TD3DXQuaternion): BOOL;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  787. {$EXTERNALSYM D3DXQuaternionIsIdentity}
  788. // (-x, -y, -z, w)
  789. function D3DXQuaternionConjugate(out qOut: TD3DXQuaternion;
  790.   const q: TD3DXQuaternion): PD3DXQuaternion;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  791. {$EXTERNALSYM D3DXQuaternionConjugate}
  792. // non-inline
  793. // Compute a quaternin's axis and angle of rotation. Expects unit quaternions.
  794. procedure D3DXQuaternionToAxisAngle(const q: TD3DXQuaternion;
  795.   out Axis: TD3DXVector3; out Angle: Single); stdcall; external d3dx9mathDLL;
  796. {$EXTERNALSYM D3DXQuaternionToAxisAngle}
  797. // Build a quaternion from a rotation matrix.
  798. function D3DXQuaternionRotationMatrix(out qOut: TD3DXQuaternion;
  799.   const m: TD3DXMatrix): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  800. {$EXTERNALSYM D3DXQuaternionRotationMatrix}
  801. // Rotation about arbitrary axis.
  802. function D3DXQuaternionRotationAxis(out qOut: TD3DXQuaternion;
  803.   const v: TD3DXVector3; Angle: Single): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  804. {$EXTERNALSYM D3DXQuaternionRotationAxis}
  805. // Yaw around the Y axis, a pitch around the X axis,
  806. // and a roll around the Z axis.
  807. function D3DXQuaternionRotationYawPitchRoll(out qOut: TD3DXQuaternion;
  808.   yaw, pitch, roll: Single): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  809. {$EXTERNALSYM D3DXQuaternionRotationYawPitchRoll}
  810. // Quaternion multiplication.  The result represents the rotation Q2
  811. // followed by the rotation Q1.  (Out = Q2 * Q1)
  812. function D3DXQuaternionMultiply(out qOut: TD3DXQuaternion;
  813.    const q1, q2: TD3DXQuaternion): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  814. {$EXTERNALSYM D3DXQuaternionMultiply}
  815. function D3DXQuaternionNormalize(out qOut: TD3DXQuaternion;
  816.    const q: TD3DXQuaternion): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  817. {$EXTERNALSYM D3DXQuaternionNormalize}
  818. // Conjugate and re-norm
  819. function D3DXQuaternionInverse(out qOut: TD3DXQuaternion;
  820.    const q: TD3DXQuaternion): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  821. {$EXTERNALSYM D3DXQuaternionInverse}
  822. // Expects unit quaternions.
  823. // if q = (cos(theta), sin(theta) * v); ln(q) = (0, theta * v)
  824. function D3DXQuaternionLn(out qOut: TD3DXQuaternion;
  825.    const q: TD3DXQuaternion): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  826. {$EXTERNALSYM D3DXQuaternionLn}
  827. // Expects pure quaternions. (w == 0)  w is ignored in calculation.
  828. // if q = (0, theta * v); exp(q) = (cos(theta), sin(theta) * v)
  829. function D3DXQuaternionExp(out qOut: TD3DXQuaternion;
  830.    const q: TD3DXQuaternion): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  831. {$EXTERNALSYM D3DXQuaternionExp}
  832. // Spherical linear interpolation between Q1 (s == 0) and Q2 (s == 1).
  833. // Expects unit quaternions.
  834. function D3DXQuaternionSlerp(out qOut: TD3DXQuaternion;
  835.    const q1, q2: TD3DXQuaternion; t: Single): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  836. {$EXTERNALSYM D3DXQuaternionSlerp}
  837. // Spherical quadrangle interpolation.
  838. // Slerp(Slerp(Q1, C, t), Slerp(A, B, t), 2t(1-t))
  839. function D3DXQuaternionSquad(out qOut: TD3DXQuaternion;
  840.    const pQ1, pA, pB, pC: TD3DXQuaternion; t: Single): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  841. {$EXTERNALSYM D3DXQuaternionSquad}
  842. // Setup control points for spherical quadrangle interpolation
  843. // from Q1 to Q2.  The control points are chosen in such a way
  844. // to ensure the continuity of tangents with adjacent segments.
  845. procedure D3DXQuaternionSquadSetup(out pAOut, pBOut, pCOut: TD3DXQuaternion;
  846.    const pQ0, pQ1, pQ2, pQ3: TD3DXQuaternion); stdcall; external d3dx9mathDLL;
  847. {$EXTERNALSYM D3DXQuaternionSquadSetup}
  848. // Barycentric interpolation.
  849. // Slerp(Slerp(Q1, Q2, f+g), Slerp(Q1, Q3, f+g), g/(f+g))
  850. function D3DXQuaternionBaryCentric(out qOut: TD3DXQuaternion;
  851.    const q1, q2, q3: TD3DXQuaternion; f, g: Single): PD3DXQuaternion; stdcall; external d3dx9mathDLL;
  852. {$EXTERNALSYM D3DXQuaternionBaryCentric}
  853. //--------------------------
  854. // Plane
  855. //--------------------------
  856. // inline
  857. // ax + by + cz + dw
  858. function D3DXPlaneDot(const p: TD3DXPlane; const v: TD3DXVector4): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  859. {$EXTERNALSYM D3DXPlaneDot}
  860. // ax + by + cz + d
  861. function D3DXPlaneDotCoord(const p: TD3DXPlane; const v: TD3DXVector3): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  862. {$EXTERNALSYM D3DXPlaneDotCoord}
  863. // ax + by + cz
  864. function D3DXPlaneDotNormal(const p: TD3DXPlane; const v: TD3DXVector3): Single;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  865. {$EXTERNALSYM D3DXPlaneDotNormal}
  866. function D3DXPlaneScale(out pOut: TD3DXPlane; const pP: TD3DXPlane; s: Single): PD3DXPlane;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  867. {$EXTERNALSYM D3DXPlaneScale}
  868. // non-inline
  869. // Normalize plane (so that |a,b,c| == 1)
  870. function D3DXPlaneNormalize(out pOut: TD3DXPlane; const p: TD3DXPlane): PD3DXPlane; stdcall; external d3dx9mathDLL;
  871. {$EXTERNALSYM D3DXPlaneNormalize}
  872. // Find the intersection between a plane and a line.  If the line is
  873. // parallel to the plane, NULL is returned.
  874. function D3DXPlaneIntersectLine(out pOut: TD3DXVector3;
  875.    const p: TD3DXPlane; const v1, v2: TD3DXVector3): PD3DXVector3; stdcall; external d3dx9mathDLL;
  876. {$EXTERNALSYM D3DXPlaneIntersectLine}
  877. // Construct a plane from a point and a normal
  878. function D3DXPlaneFromPointNormal(out pOut: TD3DXPlane;
  879.    const vPoint, vNormal: TD3DXVector3): PD3DXPlane; stdcall; external d3dx9mathDLL;
  880. {$EXTERNALSYM D3DXPlaneFromPointNormal}
  881. // Construct a plane from 3 points
  882. function D3DXPlaneFromPoints(out pOut: TD3DXPlane;
  883.    const v1, v2, v3: TD3DXVector3): PD3DXPlane; stdcall; external d3dx9mathDLL;
  884. {$EXTERNALSYM D3DXPlaneFromPoints}
  885. // Transform a plane by a matrix.  The vector (a,b,c) must be normal.
  886. // M should be the inverse transpose of the transformation desired.
  887. function D3DXPlaneTransform(out pOut: TD3DXPlane; const p: TD3DXPlane; const m: TD3DXMatrix): PD3DXPlane; stdcall; external d3dx9mathDLL;
  888. {$EXTERNALSYM D3DXPlaneTransform}
  889. // Transform an array of planes by a matrix.  The vectors (a,b,c) must be normal.
  890. // M should be the inverse transpose of the transformation desired.
  891. function D3DXPlaneTransformArray(pOut: PD3DXPlane; OutStride: LongWord;
  892.   pP: PD3DXPlane; PStride: LongWord; const m: TD3DXMatrix; n: LongWord): PD3DXPlane; stdcall; external d3dx9mathDLL;
  893. {$EXTERNALSYM D3DXPlaneTransformArray}
  894. //--------------------------
  895. // Color
  896. //--------------------------
  897. // inline
  898. // (1-r, 1-g, 1-b, a)
  899. function D3DXColorNegative(out cOut: TD3DXColor; const c: TD3DXColor): PD3DXColor;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  900. {$EXTERNALSYM D3DXColorNegative}
  901. function D3DXColorAdd(out cOut: TD3DXColor; const c1, c2: TD3DXColor): PD3DXColor;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  902. {$EXTERNALSYM D3DXColorAdd}
  903. function D3DXColorSubtract(out cOut: TD3DXColor; const c1, c2: TD3DXColor): PD3DXColor;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  904. {$EXTERNALSYM D3DXColorSubtract}
  905. function D3DXColorScale(out cOut: TD3DXColor; const c: TD3DXColor; s: Single): PD3DXColor;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  906. {$EXTERNALSYM D3DXColorScale}
  907. // (r1*r2, g1*g2, b1*b2, a1*a2)
  908. function D3DXColorModulate(out cOut: TD3DXColor; const c1, c2: TD3DXColor): PD3DXColor;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  909. {$EXTERNALSYM D3DXColorModulate}
  910. // Linear interpolation of r,g,b, and a. C1 + s(C2-C1)
  911. function D3DXColorLerp(out cOut: TD3DXColor; const c1, c2: TD3DXColor; s: Single): PD3DXColor;{$IFDEF ALLOW_INLINE} inline;{$ENDIF}
  912. {$EXTERNALSYM D3DXColorLerp}
  913. // non-inline
  914. // Interpolate r,g,b between desaturated color and color.
  915. // DesaturatedColor + s(Color - DesaturatedColor)
  916. function D3DXColorAdjustSaturation(out cOut: TD3DXColor;
  917.    const pC: TD3DXColor; s: Single): PD3DXColor; stdcall; external d3dx9mathDLL;
  918. {$EXTERNALSYM D3DXColorAdjustSaturation}
  919. // Interpolate r,g,b between 50% grey and color.  Grey + s(Color - Grey)
  920. function D3DXColorAdjustContrast(out cOut: TD3DXColor;
  921.    const pC: TD3DXColor; c: Single): PD3DXColor; stdcall; external d3dx9mathDLL;
  922. {$EXTERNALSYM D3DXColorAdjustContrast}
  923. //--------------------------
  924. // Misc
  925. //--------------------------
  926. // Calculate Fresnel term given the cosine of theta (likely obtained by
  927. // taking the dot of two normals), and the refraction index of the material.
  928. function D3DXFresnelTerm(CosTheta, RefractionIndex: Single): Single; stdcall; external d3dx9mathDLL;
  929. {$EXTERNALSYM D3DXFresnelTerm}
  930. //===========================================================================
  931. //
  932. //    Matrix Stack
  933. //
  934. //===========================================================================
  935. type
  936.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXMatrixStack);'}
  937.   {$EXTERNALSYM ID3DXMatrixStack}
  938.   ID3DXMatrixStack = interface(IUnknown)
  939.     ['{C7885BA7-F990-4fe7-922D-8515E477DD85}']
  940.     //
  941.     // ID3DXMatrixStack methods
  942.     //
  943.     // Pops the top of the stack, returns the current top
  944.     // *after* popping the top.
  945.     function Pop: HResult; stdcall;
  946.     // Pushes the stack by one, duplicating the current matrix.
  947.     function Push: HResult; stdcall;
  948.     // Loads identity in the current matrix.
  949.     function LoadIdentity: HResult; stdcall;
  950.     // Loads the given matrix into the current matrix
  951.     function LoadMatrix(const M: TD3DXMatrix): HResult; stdcall;
  952.     // Right-Multiplies the given matrix to the current matrix.
  953.     // (transformation is about the current world origin)
  954.     function MultMatrix(const M: TD3DXMatrix): HResult; stdcall;
  955.     // Left-Multiplies the given matrix to the current matrix
  956.     // (transformation is about the local origin of the object)
  957.     function MultMatrixLocal(const M: TD3DXMatrix): HResult; stdcall;
  958.     // Right multiply the current matrix with the computed rotation
  959.     // matrix, counterclockwise about the given axis with the given angle.
  960.     // (rotation is about the current world origin)
  961.     function RotateAxis(const V: TD3DXVector3; Angle: Single): HResult; stdcall;
  962.     // Left multiply the current matrix with the computed rotation
  963.     // matrix, counterclockwise about the given axis with the given angle.
  964.     // (rotation is about the local origin of the object)
  965.     function RotateAxisLocal(const V: TD3DXVector3; Angle: Single): HResult; stdcall;
  966.     // Right multiply the current matrix with the computed rotation
  967.     // matrix. All angles are counterclockwise. (rotation is about the
  968.     // current world origin)
  969.     // The rotation is composed of a yaw around the Y axis, a pitch around
  970.     // the X axis, and a roll around the Z axis.
  971.     function RotateYawPitchRoll(yaw, pitch, roll: Single): HResult; stdcall;
  972.     // Left multiply the current matrix with the computed rotation
  973.     // matrix. All angles are counterclockwise. (rotation is about the
  974.     // local origin of the object)
  975.     // The rotation is composed of a yaw around the Y axis, a pitch around
  976.     // the X axis, and a roll around the Z axis.
  977.     function RotateYawPitchRollLocal(yaw, pitch, roll: Single): HResult; stdcall;
  978.     // Right multiply the current matrix with the computed scale
  979.     // matrix. (transformation is about the current world origin)
  980.     function Scale(x, y, z: Single): HResult; stdcall;
  981.     // Left multiply the current matrix with the computed scale
  982.     // matrix. (transformation is about the local origin of the object)
  983.     function ScaleLocal(x, y, z: Single): HResult; stdcall;
  984.     // Right multiply the current matrix with the computed translation
  985.     // matrix. (transformation is about the current world origin)
  986.     function Translate(x, y, z: Single): HResult; stdcall;
  987.     // Left multiply the current matrix with the computed translation
  988.     // matrix. (transformation is about the local origin of the object)
  989.     function TranslateLocal(x, y, z: Single): HResult; stdcall;
  990.     // Obtain the current matrix at the top of the stack
  991.     function GetTop: PD3DXMatrix; stdcall;
  992.   end;
  993. type
  994.   IID_ID3DXMatrixStack = ID3DXMatrixStack;
  995.   {$EXTERNALSYM IID_ID3DXMatrixStack}
  996. function D3DXCreateMatrixStack(Flags: DWord; out Stack: ID3DXMatrixStack): HResult; stdcall; external d3dx9mathDLL;
  997. {$EXTERNALSYM D3DXCreateMatrixStack}
  998. //===========================================================================
  999. //
  1000. //  Spherical Harmonic Runtime Routines
  1001. //
  1002. // NOTE:
  1003. //  * Most of these functions can take the same object as in and out parameters.
  1004. //    The exceptions are the rotation functions.
  1005. //
  1006. //  * Out parameters are typically also returned as return values, so that
  1007. //    the output of one function may be used as a parameter to another.
  1008. //
  1009. //============================================================================
  1010. //============================================================================
  1011. //
  1012. //  Basic Spherical Harmonic math routines
  1013. //
  1014. //============================================================================
  1015. const
  1016.   D3DXSH_MINORDER = 2;
  1017.   {$EXTERNALSYM D3DXSH_MINORDER}
  1018.   D3DXSH_MAXORDER = 6;
  1019.   {$EXTERNALSYM D3DXSH_MAXORDER}
  1020. //============================================================================
  1021. //
  1022. //  D3DXSHEvalDirection:
  1023. //  --------------------
  1024. //  Evaluates the Spherical Harmonic basis functions
  1025. //
  1026. //  Parameters:
  1027. //   pOut
  1028. //      Output SH coefficients - basis function Ylm is stored at l*l + m+l
  1029. //      This is the pointer that is returned.
  1030. //   Order
  1031. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1032. //   pDir
  1033. //      Direction to evaluate in - assumed to be normalized
  1034. //
  1035. //============================================================================
  1036. function D3DXSHEvalDirection(pOut: PSingle; Order: LongWord;
  1037.     const pDir: TD3DXVector3): PSingle; stdcall; external d3dx9mathDLL;
  1038. {$EXTERNALSYM D3DXSHEvalDirection}
  1039. //============================================================================
  1040. //
  1041. //  D3DXSHRotate:
  1042. //  --------------------
  1043. //  Rotates SH vector by a rotation matrix
  1044. //
  1045. //  Parameters:
  1046. //   pOut
  1047. //      Output SH coefficients - basis function Ylm is stored at l*l + m+l
  1048. //      This is the pointer that is returned (should not alias with pIn.)
  1049. //   Order
  1050. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1051. //   pMatrix
  1052. //      Matrix used for rotation - rotation sub matrix should be orthogonal
  1053. //      and have a unit determinant.
  1054. //   pIn
  1055. //      Input SH coeffs (rotated), incorect results if this is also output.
  1056. //
  1057. //============================================================================
  1058. function D3DXSHRotate(pOut: PSingle; Order: LongWord;
  1059.     const pMatrix: TD3DXMatrix; pIn: PSingle): PSingle; stdcall; external d3dx9mathDLL;
  1060. {$EXTERNALSYM D3DXSHRotate}
  1061. //============================================================================
  1062. //
  1063. //  D3DXSHRotateZ:
  1064. //  --------------------
  1065. //  Rotates the SH vector in the Z axis by an angle
  1066. //
  1067. //  Parameters:
  1068. //   pOut
  1069. //      Output SH coefficients - basis function Ylm is stored at l*l + m+l
  1070. //      This is the pointer that is returned (should not alias with pIn.)
  1071. //   Order
  1072. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1073. //   Angle
  1074. //      Angle in radians to rotate around the Z axis.
  1075. //   pIn
  1076. //      Input SH coeffs (rotated), incorect results if this is also output.
  1077. //
  1078. //============================================================================
  1079. function D3DXSHRotateZ(pOut: PSingle; Order: LongWord;
  1080.     Angle: Single; pIn: PSingle): PSingle; stdcall; external d3dx9mathDLL;
  1081. {$EXTERNALSYM D3DXSHRotateZ}
  1082. //============================================================================
  1083. //
  1084. //  D3DXSHAdd:
  1085. //  --------------------
  1086. //  Adds two SH vectors, pOut[i] = pA[i] + pB[i];
  1087. //
  1088. //  Parameters:
  1089. //   pOut
  1090. //      Output SH coefficients - basis function Ylm is stored at l*l + m+l
  1091. //      This is the pointer that is returned.
  1092. //   Order
  1093. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1094. //   pA
  1095. //      Input SH coeffs.
  1096. //   pB
  1097. //      Input SH coeffs (second vector.)
  1098. //
  1099. //============================================================================
  1100. function D3DXSHAdd(pOut: PSingle; Order: LongWord;
  1101.     pA, pB: PSingle): PSingle; stdcall; external d3dx9mathDLL;
  1102. {$EXTERNALSYM D3DXSHAdd}
  1103. //============================================================================
  1104. //
  1105. //  D3DXSHScale:
  1106. //  --------------------
  1107. //  Adds two SH vectors, pOut[i] = pA[i]*Scale;
  1108. //
  1109. //  Parameters:
  1110. //   pOut
  1111. //      Output SH coefficients - basis function Ylm is stored at l*l + m+l
  1112. //      This is the pointer that is returned.
  1113. //   Order
  1114. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1115. //   pIn
  1116. //      Input SH coeffs.
  1117. //   Scale
  1118. //      Scale factor.
  1119. //
  1120. //============================================================================
  1121. function D3DXSHScale(pOut: PSingle; Order: LongWord;
  1122.     pIn: PSingle; Scale: Single): PSingle; stdcall; external d3dx9mathDLL;
  1123. {$EXTERNALSYM D3DXSHScale}
  1124. //============================================================================
  1125. //
  1126. //  D3DXSHDot:
  1127. //  --------------------
  1128. //  Computes the dot product of two SH vectors
  1129. //
  1130. //  Parameters:
  1131. //   Order
  1132. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1133. //   pA
  1134. //      Input SH coeffs.
  1135. //   pB
  1136. //      Second set of input SH coeffs.
  1137. //
  1138. //============================================================================
  1139. function D3DXSHDot(Order: LongWord; pA, pB: PSingle): Single; stdcall; external d3dx9mathDLL;
  1140. {$EXTERNALSYM D3DXSHDot}
  1141. //============================================================================
  1142. //
  1143. //  Basic Spherical Harmonic lighting routines
  1144. //
  1145. //============================================================================
  1146. //============================================================================
  1147. //
  1148. //  D3DXSHEvalDirectionalLight:
  1149. //  --------------------
  1150. //  Evaluates a directional light and returns spectral SH data.  The output 
  1151. //  vector is computed so that if the intensity of R/G/B is unit the resulting
  1152. //  exit radiance of a point directly under the light on a diffuse object with
  1153. //  an albedo of 1 would be 1.0.  This will compute 3 spectral samples, pROut
  1154. //  has to be specified, while pGout and pBout are optional.
  1155. //
  1156. //  Parameters:
  1157. //   Order
  1158. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1159. //   pDir
  1160. //      Direction light is coming from (assumed to be normalized.)
  1161. //   RIntensity
  1162. //      Red intensity of light.
  1163. //   GIntensity
  1164. //      Green intensity of light.
  1165. //   BIntensity
  1166. //      Blue intensity of light.
  1167. //   pROut
  1168. //      Output SH vector for Red.
  1169. //   pGOut
  1170. //      Output SH vector for Green (optional.)
  1171. //   pBOut
  1172. //      Output SH vector for Blue (optional.)
  1173. //
  1174. //============================================================================
  1175. function D3DXSHEvalDirectionalLight(Order: LongWord; const pDir: TD3DXVector3;
  1176.     RIntensity: Single; GIntensity: Single; BIntensity: Single;
  1177.     pROut, pGOut, pBOut: PSingle): HResult; stdcall; external d3dx9mathDLL;
  1178. {$EXTERNALSYM D3DXSHEvalDirectionalLight}
  1179. //============================================================================
  1180. //
  1181. //  D3DXSHEvalSphericalLight:
  1182. //  --------------------
  1183. //  Evaluates a spherical light and returns spectral SH data.  There is no
  1184. //  normalization of the intensity of the light like there is for directional
  1185. //  lights, care has to be taken when specifiying the intensities.  This will
  1186. //  compute 3 spectral samples, pROut has to be specified, while pGout and
  1187. //  pBout are optional.
  1188. //
  1189. //  Parameters:
  1190. //   Order
  1191. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1192. //   pPos
  1193. //      Position of light - reciever is assumed to be at the origin.
  1194. //   Radius
  1195. //      Radius of the spherical light source.
  1196. //   RIntensity
  1197. //      Red intensity of light.
  1198. //   GIntensity
  1199. //      Green intensity of light.
  1200. //   BIntensity
  1201. //      Blue intensity of light.
  1202. //   pROut
  1203. //      Output SH vector for Red.
  1204. //   pGOut
  1205. //      Output SH vector for Green (optional.)
  1206. //   pBOut
  1207. //      Output SH vector for Blue (optional.)
  1208. //
  1209. //============================================================================
  1210. function D3DXSHEvalSphericalLight(Order: LongWord; const pPos: TD3DXVector3; Radius: Single;
  1211.     RIntensity: Single; GIntensity: Single; BIntensity: Single;
  1212.     pROut, pGOut, pBOut: PSingle): HResult; stdcall; external d3dx9mathDLL;
  1213. {$EXTERNALSYM D3DXSHEvalSphericalLight}
  1214. //============================================================================
  1215. //
  1216. //  D3DXSHEvalConeLight:
  1217. //  --------------------
  1218. //  Evaluates a light that is a cone of constant intensity and returns spectral
  1219. //  SH data.  The output vector is computed so that if the intensity of R/G/B is
  1220. //  unit the resulting exit radiance of a point directly under the light oriented
  1221. //  in the cone direction on a diffuse object with an albedo of 1 would be 1.0.
  1222. //  This will compute 3 spectral samples, pROut has to be specified, while pGout
  1223. //  and pBout are optional.
  1224. //
  1225. //  Parameters:
  1226. //   Order
  1227. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1228. //   pDir
  1229. //      Direction light is coming from (assumed to be normalized.)
  1230. //   Radius
  1231. //      Radius of cone in radians.
  1232. //   RIntensity
  1233. //      Red intensity of light.
  1234. //   GIntensity
  1235. //      Green intensity of light.
  1236. //   BIntensity
  1237. //      Blue intensity of light.
  1238. //   pROut
  1239. //      Output SH vector for Red.
  1240. //   pGOut
  1241. //      Output SH vector for Green (optional.)
  1242. //   pBOut
  1243. //      Output SH vector for Blue (optional.)
  1244. //
  1245. //============================================================================
  1246. function D3DXSHEvalConeLight(Order: LongWord; const pDir: TD3DXVector3; Radius: Single;
  1247.     RIntensity: Single; GIntensity: Single; BIntensity: Single;
  1248.     pROut, pGOut, pBOut: PSingle): HResult; stdcall; external d3dx9mathDLL;
  1249. {$EXTERNALSYM D3DXSHEvalConeLight}
  1250.       
  1251. //============================================================================
  1252. //
  1253. //  D3DXSHEvalHemisphereLight:
  1254. //  --------------------
  1255. //  Evaluates a light that is a linear interpolant between two colors over the
  1256. //  sphere.  The interpolant is linear along the axis of the two points, not
  1257. //  over the surface of the sphere (ie: if the axis was (0,0,1) it is linear in
  1258. //  Z, not in the azimuthal angle.)  The resulting spherical lighting function
  1259. //  is normalized so that a point on a perfectly diffuse surface with no
  1260. //  shadowing and a normal pointed in the direction pDir would result in exit
  1261. //  radiance with a value of 1 if the top color was white and the bottom color
  1262. //  was black.  This is a very simple model where Top represents the intensity 
  1263. //  of the "sky" and Bottom represents the intensity of the "ground".
  1264. //
  1265. //  Parameters:
  1266. //   Order
  1267. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1268. //   pDir
  1269. //      Axis of the hemisphere.
  1270. //   Top
  1271. //      Color of the upper hemisphere.
  1272. //   Bottom
  1273. //      Color of the lower hemisphere.
  1274. //   pROut
  1275. //      Output SH vector for Red.
  1276. //   pGOut
  1277. //      Output SH vector for Green
  1278. //   pBOut
  1279. //      Output SH vector for Blue        
  1280. //
  1281. //============================================================================
  1282. function D3DXSHEvalHemisphereLight(Order: LongWord; const pDir: TD3DXVector3;
  1283.     Top, Bottom: TD3DXColor;
  1284.     pROut, pGOut, pBOut: PSingle): HResult; stdcall; external d3dx9mathDLL;
  1285. {$EXTERNALSYM D3DXSHEvalHemisphereLight}
  1286. //============================================================================
  1287. //
  1288. //  Basic Spherical Harmonic projection routines
  1289. //
  1290. //============================================================================
  1291. //============================================================================
  1292. //
  1293. //  D3DXSHProjectCubeMap:
  1294. //  --------------------
  1295. //  Projects a function represented on a cube map into spherical harmonics.
  1296. //
  1297. //  Parameters:
  1298. //   Order
  1299. //      Order of the SH evaluation, generates Order^2 coefs, degree is Order-1
  1300. //   pCubeMap
  1301. //      CubeMap that is going to be projected into spherical harmonics
  1302. //   pROut
  1303. //      Output SH vector for Red.
  1304. //   pGOut
  1305. //      Output SH vector for Green
  1306. //   pBOut
  1307. //      Output SH vector for Blue
  1308. //
  1309. //============================================================================
  1310. function D3DXSHProjectCubeMap(Order: LongWord; pCubeMap: IDirect3DCubeTexture9;
  1311.     pROut, pGOut, pBOut: PSingle): HResult; stdcall; external d3dx9mathDLL;
  1312. {$EXTERNALSYM D3DXSHProjectCubeMap}
  1313. ///////////////////////////////////////////////////////////////////////////
  1314. //
  1315. //  Copyright (C) Microsoft Corporation.  All Rights Reserved.
  1316. //
  1317. //  File:       d3dx9core.h
  1318. //  Content:    D3DX core types and functions
  1319. //
  1320. ///////////////////////////////////////////////////////////////////////////
  1321. ///////////////////////////////////////////////////////////////////////////
  1322. // D3DX_SDK_VERSION:
  1323. // -----------------
  1324. // This identifier is passed to D3DXCheckVersion in order to ensure that an
  1325. // application was built against the correct header files and lib files.
  1326. // This number is incremented whenever a header (or other) change would
  1327. // require applications to be rebuilt. If the version doesn't match,
  1328. // D3DXCheckVersion will return FALSE. (The number itself has no meaning.)
  1329. ///////////////////////////////////////////////////////////////////////////
  1330. const
  1331.   D3DX_VERSION          = $0902;
  1332.   {$EXTERNALSYM D3DX_VERSION}
  1333.   D3DX_SDK_VERSION      = 31;
  1334.   {$EXTERNALSYM D3DX_SDK_VERSION}
  1335. function D3DXCheckVersion(D3DSdkVersion, D3DXSdkVersion: LongWord): BOOL; stdcall; external d3dx9coreDLL;
  1336. {$EXTERNALSYM D3DXCheckVersion}
  1337. ///////////////////////////////////////////////////////////////////////////
  1338. // D3DXDebugMute
  1339. //    Mutes D3DX and D3D debug spew (TRUE - mute, FALSE - not mute)
  1340. //
  1341. //  returns previous mute value
  1342. //
  1343. ///////////////////////////////////////////////////////////////////////////
  1344. function D3DXDebugMute(Mute: BOOL): BOOL; stdcall; external d3dx9coreDLL;
  1345. {$EXTERNALSYM D3DXDebugMute}
  1346. ///////////////////////////////////////////////////////////////////////////
  1347. // D3DXGetDriverLevel:
  1348. //    Returns driver version information:
  1349. //
  1350. //    700 - DX7 level driver
  1351. //    800 - DX8 level driver
  1352. //    900 - DX9 level driver
  1353. ///////////////////////////////////////////////////////////////////////////
  1354. function D3DXGetDriverLevel(pDevice: IDirect3DDevice9): LongWord; stdcall; external d3dx9coreDLL;
  1355. {$EXTERNALSYM D3DXGetDriverLevel}
  1356. ///////////////////////////////////////////////////////////////////////////
  1357. // ID3DXBuffer:
  1358. // ------------
  1359. // The buffer object is used by D3DX to return arbitrary size data.
  1360. //
  1361. // GetBufferPointer -
  1362. //    Returns a pointer to the beginning of the buffer.
  1363. //
  1364. // GetBufferSize -
  1365. //    Returns the size of the buffer, in bytes.
  1366. ///////////////////////////////////////////////////////////////////////////
  1367. type
  1368.   PID3DXBuffer = ^ID3DXBuffer;
  1369.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXBuffer);'}
  1370.   {$EXTERNALSYM ID3DXBuffer}
  1371.   ID3DXBuffer = interface(IUnknown)
  1372.     ['{8BA5FB08-5195-40e2-AC58-0D989C3A0102}']
  1373.     // ID3DXBuffer
  1374.     function GetBufferPointer: Pointer; stdcall;
  1375.     function GetBufferSize: DWord; stdcall;
  1376.   end;
  1377.   IID_ID3DXBuffer = ID3DXBuffer;
  1378.   {$EXTERNALSYM IID_ID3DXBuffer}
  1379. //////////////////////////////////////////////////////////////////////////////
  1380. // D3DXSPRITE flags:
  1381. // -----------------
  1382. // D3DXSPRITE_DONOTSAVESTATE
  1383. //   Specifies device state is not to be saved and restored in Begin/End.
  1384. // D3DXSPRITE_DONOTMODIFY_RENDERSTATE
  1385. //   Specifies device render state is not to be changed in Begin.  The device
  1386. //   is assumed to be in a valid state to draw vertices containing POSITION0, 
  1387. //   TEXCOORD0, and COLOR0 data.
  1388. // D3DXSPRITE_OBJECTSPACE
  1389. //   The WORLD, VIEW, and PROJECTION transforms are NOT modified.  The
  1390. //   transforms currently set to the device are used to transform the sprites
  1391. //   when the batch is drawn (at Flush or End).  If this is not specified,
  1392. //   WORLD, VIEW, and PROJECTION transforms are modified so that sprites are
  1393. //   drawn in screenspace coordinates.
  1394. // D3DXSPRITE_BILLBOARD
  1395. //   Rotates each sprite about its center so that it is facing the viewer.
  1396. // D3DXSPRITE_ALPHABLEND
  1397. //   Enables ALPHABLEND(SRCALPHA, INVSRCALPHA) and ALPHATEST(alpha > 0).
  1398. //   ID3DXFont expects this to be set when drawing text.
  1399. // D3DXSPRITE_SORT_TEXTURE
  1400. //   Sprites are sorted by texture prior to drawing.  This is recommended when
  1401. //   drawing non-overlapping sprites of uniform depth.  For example, drawing
  1402. //   screen-aligned text with ID3DXFont.
  1403. // D3DXSPRITE_SORT_DEPTH_FRONTTOBACK
  1404. //   Sprites are sorted by depth front-to-back prior to drawing.  This is
  1405. //   recommended when drawing opaque sprites of varying depths.
  1406. // D3DXSPRITE_SORT_DEPTH_BACKTOFRONT
  1407. //   Sprites are sorted by depth back-to-front prior to drawing.  This is
  1408. //   recommended when drawing transparent sprites of varying depths.
  1409. //////////////////////////////////////////////////////////////////////////////
  1410. const
  1411.   D3DXSPRITE_DONOTSAVESTATE               = (1 shl 0);
  1412.   {$EXTERNALSYM D3DXSPRITE_DONOTSAVESTATE}
  1413.   D3DXSPRITE_DONOTMODIFY_RENDERSTATE      = (1 shl 1);
  1414.   {$EXTERNALSYM D3DXSPRITE_DONOTMODIFY_RENDERSTATE}
  1415.   D3DXSPRITE_OBJECTSPACE                  = (1 shl 2);
  1416.   {$EXTERNALSYM D3DXSPRITE_OBJECTSPACE}
  1417.   D3DXSPRITE_BILLBOARD                    = (1 shl 3);
  1418.   {$EXTERNALSYM D3DXSPRITE_BILLBOARD}
  1419.   D3DXSPRITE_ALPHABLEND                   = (1 shl 4);
  1420.   {$EXTERNALSYM D3DXSPRITE_ALPHABLEND}
  1421.   D3DXSPRITE_SORT_TEXTURE                 = (1 shl 5);
  1422.   {$EXTERNALSYM D3DXSPRITE_SORT_TEXTURE}
  1423.   D3DXSPRITE_SORT_DEPTH_FRONTTOBACK       = (1 shl 6);
  1424.   {$EXTERNALSYM D3DXSPRITE_SORT_DEPTH_FRONTTOBACK}
  1425.   D3DXSPRITE_SORT_DEPTH_BACKTOFRONT       = (1 shl 7);
  1426.   {$EXTERNALSYM D3DXSPRITE_SORT_DEPTH_BACKTOFRONT}
  1427. //////////////////////////////////////////////////////////////////////////////
  1428. // ID3DXSprite:
  1429. // ------------
  1430. // This object intends to provide an easy way to drawing sprites using D3D.
  1431. //
  1432. // Begin -
  1433. //    Prepares device for drawing sprites.
  1434. //
  1435. // Draw -
  1436. //    Draws a sprite.  Before transformation, the sprite is the size of
  1437. //    SrcRect, with its top-left corner specified by Position.  The color
  1438. //    and alpha channels are modulated by Color.
  1439. //
  1440. // Flush -
  1441. //    Forces all batched sprites to submitted to the device.
  1442. //
  1443. // End -
  1444. //    Restores device state to how it was when Begin was called.
  1445. //
  1446. // OnLostDevice, OnResetDevice -
  1447. //    Call OnLostDevice() on this object before calling Reset() on the
  1448. //    device, so that this object can release any stateblocks and video
  1449. //    memory resources.  After Reset(), the call OnResetDevice().
  1450. //////////////////////////////////////////////////////////////////////////////
  1451. type
  1452.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXSprite);'}
  1453.   {$EXTERNALSYM ID3DXSprite}
  1454.   ID3DXSprite = interface(IUnknown)
  1455.     ['{BA0B762D-7D28-43ec-B9DC-2F84443B0614}']
  1456.     // ID3DXSprite
  1457.     function GetDevice(out ppDevice: IDirect3DDevice9): HResult; stdcall;
  1458.     function GetTransform(out pTransform: TD3DXMatrix): HResult; stdcall;
  1459.     function SetTransform(const pTransform: TD3DXMatrix): HResult; stdcall;
  1460.     function SetWorldViewRH(pWorld, pView: PD3DXMatrix): HResult; stdcall;
  1461.     function SetWorldViewLH(pWorld, pView: PD3DXMatrix): HResult; stdcall;
  1462.     function _Begin(Flags: DWORD): HResult; stdcall;
  1463.     function Draw(pTexture: IDirect3DTexture9; pSrcRect: PRect; pCenter, pPosition: PD3DXVector3; Color: TD3DColor): HResult; stdcall;
  1464.     function Flush: HResult; stdcall;
  1465.     function _End: HResult; stdcall;
  1466.     function OnLostDevice: HResult; stdcall;
  1467.     function OnResetDevice: HResult; stdcall;
  1468.   end;
  1469.   IID_ID3DXSprite = ID3DXSprite;
  1470.   {$EXTERNALSYM IID_ID3DXSprite}
  1471. function D3DXCreateSprite(pDevice: IDirect3DDevice9;
  1472.   out ppSprite: ID3DXSprite): HResult; stdcall; external d3dx9coreDLL;
  1473. {$EXTERNALSYM D3DXCreateSprite}
  1474. //////////////////////////////////////////////////////////////////////////////
  1475. // ID3DXFont:
  1476. // ----------
  1477. // Font objects contain the textures and resources needed to render a specific 
  1478. // font on a specific device.
  1479. //
  1480. // GetGlyphData -
  1481. //    Returns glyph cache data, for a given glyph.
  1482. //
  1483. // PreloadCharacters/PreloadGlyphs/PreloadText -
  1484. //    Preloads glyphs into the glyph cache textures.
  1485. //
  1486. // DrawText -
  1487. //    Draws formatted text on a D3D device.  Some parameters are 
  1488. //    surprisingly similar to those of GDI's DrawText function.  See GDI 
  1489. //    documentation for a detailed description of these parameters.
  1490. //    If pSprite is NULL, an internal sprite object will be used.
  1491. //
  1492. // OnLostDevice, OnResetDevice -
  1493. //    Call OnLostDevice() on this object before calling Reset() on the
  1494. //    device, so that this object can release any stateblocks and video
  1495. //    memory resources.  After Reset(), the call OnResetDevice().
  1496. //////////////////////////////////////////////////////////////////////////////
  1497. type
  1498.   PD3DXFontDescA = ^TD3DXFontDescA;
  1499.   PD3DXFontDescW = ^TD3DXFontDescW;
  1500.   PD3DXFontDesc = PD3DXFontDescA;
  1501.   _D3DXFONT_DESCA = record
  1502.     Height: Integer;
  1503.     Width: Longint;
  1504.     Weight: LongWord;
  1505.     MipLevels: LongWord;
  1506.     Italic: BOOL;
  1507.     CharSet: Byte;
  1508.     OutputPrecision: Byte;
  1509.     Quality: Byte;
  1510.     PitchAndFamily: Byte;
  1511.     FaceName: array[0..LF_FACESIZE-1] of AnsiChar;
  1512.   end;
  1513.   {$EXTERNALSYM _D3DXFONT_DESCA}
  1514.   _D3DXFONT_DESCW = record
  1515.     Height: Integer;
  1516.     Width: Longint;
  1517.     Weight: LongWord;
  1518.     MipLevels: LongWord;
  1519.     Italic: BOOL;
  1520.     CharSet: Byte;
  1521.     OutputPrecision: Byte;
  1522.     Quality: Byte;
  1523.     PitchAndFamily: Byte;
  1524.     FaceName: array[0..LF_FACESIZE-1] of WideChar;
  1525.   end;
  1526.   {$EXTERNALSYM _D3DXFONT_DESCW}
  1527.   _D3DXFONT_DESC = _D3DXFONT_DESCA;
  1528.   {$EXTERNALSYM _D3DXFONT_DESC}
  1529.   D3DXFONT_DESCA = _D3DXFONT_DESCA;
  1530.   {$EXTERNALSYM D3DXFONT_DESCA}
  1531.   D3DXFONT_DESCW = _D3DXFONT_DESCW;
  1532.   {$EXTERNALSYM D3DXFONT_DESCW}
  1533.   D3DXFONT_DESC = D3DXFONT_DESCA;
  1534.   {$EXTERNALSYM D3DXFONT_DESC}
  1535.   TD3DXFontDescA = _D3DXFONT_DESCA;
  1536.   TD3DXFontDescW = _D3DXFONT_DESCW;
  1537.   TD3DXFontDesc = TD3DXFontDescA;
  1538.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXFont);'}
  1539.   {$EXTERNALSYM ID3DXFont}
  1540.   ID3DXFont = interface(IUnknown)
  1541.     ['{D79DBB70-5F21-4d36-BBC2-FF525C213CDC}']
  1542.     // ID3DXFont
  1543.     function GetDevice(out ppDevice: IDirect3DDevice9): HResult; stdcall;
  1544.     function GetDescA(out pDesc: TD3DXFontDescA): HResult; stdcall;
  1545.     function GetDescW(out pDesc: TD3DXFontDescW): HResult; stdcall;
  1546.     function GetTextMetricsA(out pTextMetrics: TTextMetricA): BOOL; stdcall;
  1547.     function GetTextMetricsW(out pTextMetrics: TTextMetricW): BOOL; stdcall;
  1548.     function GetDC: HDC; stdcall;
  1549.     function GetGlyphData(Glyph: LongWord; out ppTexture: IDirect3DTexture9; pBlackBox: PRect; pCellInc: PPoint): HResult; stdcall;
  1550.     function PreloadCharacters(First, Last: LongWord): HResult; stdcall;
  1551.     function PreloadGlyphs(First, Last: LongWord): HResult; stdcall;
  1552.     function PreloadTextA(pString: PAnsiChar; Count: Integer): HResult; stdcall;
  1553.     function PreloadTextW(pString: PWideChar; Count: Integer): HResult; stdcall;
  1554.     function DrawTextA(pSprite: ID3DXSprite; pString: PAnsiChar; Count: Integer; pRect: PRect; Format: DWORD; Color: TD3DColor): Integer; stdcall;
  1555.     function DrawTextW(pSprite: ID3DXSprite; pString: PWideChar; Count: Integer; pRect: PRect; Format: DWORD; Color: TD3DColor): Integer; stdcall;
  1556.     function OnLostDevice: HResult; stdcall;
  1557.     function OnResetDevice: HResult; stdcall;
  1558.   end;
  1559.   IID_ID3DXFont = ID3DXFont;
  1560.   {$EXTERNALSYM IID_ID3DXFont}
  1561. function D3DXCreateFontA(
  1562.   pDevice: IDirect3DDevice9;
  1563.   Height: Integer;
  1564.   Width: Longint;
  1565.   Weight: LongWord;
  1566.   MipLevels: LongWord;
  1567.   Italic: BOOL;
  1568.   CharSet: DWORD;
  1569.   OutputPrecision: DWORD;
  1570.   Quality: DWORD;
  1571.   PitchAndFamily: DWORD;
  1572.   pFaceName: PAnsiChar;
  1573.   out ppFont: ID3DXFont): HResult; stdcall; external d3dx9coreDLL name 'D3DXCreateFontA';
  1574. {$EXTERNALSYM D3DXCreateFontA}
  1575. function D3DXCreateFontW(
  1576.   pDevice: IDirect3DDevice9;
  1577.   Height: Integer;
  1578.   Width: Longint;
  1579.   Weight: LongWord;
  1580.   MipLevels: LongWord;
  1581.   Italic: BOOL;
  1582.   CharSet: DWORD;
  1583.   OutputPrecision: DWORD;
  1584.   Quality: DWORD;
  1585.   PitchAndFamily: DWORD;
  1586.   pFaceName: PWideChar;
  1587.   out ppFont: ID3DXFont): HResult; stdcall; external d3dx9coreDLL name 'D3DXCreateFontW';
  1588. {$EXTERNALSYM D3DXCreateFontW}
  1589. function D3DXCreateFont(
  1590.   pDevice: IDirect3DDevice9;
  1591.   Height: Integer;
  1592.   Width: Longint;
  1593.   Weight: LongWord;
  1594.   MipLevels: LongWord;
  1595.   Italic: BOOL;
  1596.   CharSet: DWORD;
  1597.   OutputPrecision: DWORD;
  1598.   Quality: DWORD;
  1599.   PitchAndFamily: DWORD;
  1600.   pFaceName: PChar;
  1601.   out ppFont: ID3DXFont): HResult; stdcall; external d3dx9coreDLL name 'D3DXCreateFontA';
  1602. {$EXTERNALSYM D3DXCreateFont}
  1603. function D3DXCreateFontIndirectA(
  1604.   pDevice: IDirect3DDevice9;
  1605.   const pDesc: TD3DXFontDescA;
  1606.   out ppFont: ID3DXFont): HResult; stdcall; external d3dx9coreDLL name 'D3DXCreateFontIndirectA';
  1607. {$EXTERNALSYM D3DXCreateFontIndirectA}
  1608. function D3DXCreateFontIndirectW(
  1609.   pDevice: IDirect3DDevice9;
  1610.   const pDesc: TD3DXFontDescW;
  1611.   out ppFont: ID3DXFont): HResult; stdcall; external d3dx9coreDLL name 'D3DXCreateFontIndirectW';
  1612. {$EXTERNALSYM D3DXCreateFontIndirectW}
  1613. function D3DXCreateFontIndirect(
  1614.   pDevice: IDirect3DDevice9;
  1615.   const pDesc: TD3DXFontDesc;
  1616.   out ppFont: ID3DXFont): HResult; stdcall; external d3dx9coreDLL name 'D3DXCreateFontIndirectA';
  1617. {$EXTERNALSYM D3DXCreateFontIndirect}
  1618. ///////////////////////////////////////////////////////////////////////////
  1619. // ID3DXRenderToSurface:
  1620. // ---------------------
  1621. // This object abstracts rendering to surfaces.  These surfaces do not
  1622. // necessarily need to be render targets.  If they are not, a compatible
  1623. // render target is used, and the result copied into surface at end scene.
  1624. //
  1625. // BeginScene, EndScene -
  1626. //    Call BeginScene() and EndScene() at the beginning and ending of your
  1627. //    scene.  These calls will setup and restore render targets, viewports,
  1628. //    etc..
  1629. //
  1630. // OnLostDevice, OnResetDevice -
  1631. //    Call OnLostDevice() on this object before calling Reset() on the
  1632. //    device, so that this object can release any stateblocks and video
  1633. //    memory resources.  After Reset(), the call OnResetDevice().
  1634. ///////////////////////////////////////////////////////////////////////////
  1635. type
  1636.   PD3DXRTSDesc = ^TD3DXRTSDesc;
  1637.   _D3DXRTS_DESC = record
  1638.     Width: LongWord;
  1639.     Height: LongWord;
  1640.     Format: TD3DFormat;
  1641.     DepthStencil: BOOL;
  1642.     DepthStencilFormat: TD3DFormat;
  1643.   end {_D3DXRTS_DESC};
  1644.   {$EXTERNALSYM _D3DXRTS_DESC}
  1645.   D3DXRTS_DESC = _D3DXRTS_DESC;
  1646.   {$EXTERNALSYM D3DXRTS_DESC}
  1647.   TD3DXRTSDesc = _D3DXRTS_DESC;
  1648.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXRenderToSurface);'}
  1649.   {$EXTERNALSYM ID3DXRenderToSurface}
  1650.   ID3DXRenderToSurface = interface(IUnknown)
  1651.     ['{6985F346-2C3D-43b3-BE8B-DAAE8A03D894}']
  1652.     // ID3DXRenderToSurface
  1653.     function GetDevice(out ppDevice: IDirect3DDevice9): HResult; stdcall;
  1654.     function GetDesc(out pDesc: TD3DXRTSDesc): HResult; stdcall;
  1655.     function BeginScene(pSurface: IDirect3DSurface9; pViewport: PD3DViewport9): HResult; stdcall;
  1656.     function EndScene(MipFilter: DWORD): HResult; stdcall;
  1657.     function OnLostDevice: HResult; stdcall;
  1658.     function OnResetDevice: HResult; stdcall;
  1659.   end;
  1660.   IID_ID3DXRenderToSurface = ID3DXRenderToSurface;
  1661.   {$EXTERNALSYM IID_ID3DXRenderToSurface}
  1662. function D3DXCreateRenderToSurface(ppDevice: IDirect3DDevice9;
  1663.   Width: LongWord;
  1664.   Height: LongWord;
  1665.   Format: TD3DFormat;
  1666.   DepthStencil: BOOL;
  1667.   DepthStencilFormat: TD3DFormat;
  1668.   out ppRenderToSurface: ID3DXRenderToSurface): HResult; stdcall; external d3dx9coreDLL;
  1669. {$EXTERNALSYM D3DXCreateRenderToSurface}
  1670. ///////////////////////////////////////////////////////////////////////////
  1671. // ID3DXRenderToEnvMap:
  1672. // --------------------
  1673. // This object abstracts rendering to environment maps.  These surfaces
  1674. // do not necessarily need to be render targets.  If they are not, a
  1675. // compatible render target is used, and the result copied into the
  1676. // environment map at end scene.
  1677. //
  1678. // BeginCube, BeginSphere, BeginHemisphere, BeginParabolic -
  1679. //    This function initiates the rendering of the environment map.  As
  1680. //    parameters, you pass the textures in which will get filled in with
  1681. //    the resulting environment map.
  1682. //
  1683. // Face -
  1684. //    Call this function to initiate the drawing of each face.  For each
  1685. //    environment map, you will call this six times.. once for each face
  1686. //    in D3DCUBEMAP_FACES.
  1687. //
  1688. // End -
  1689. //    This will restore all render targets, and if needed compose all the
  1690. //    rendered faces into the environment map surfaces.
  1691. //
  1692. // OnLostDevice, OnResetDevice -
  1693. //    Call OnLostDevice() on this object before calling Reset() on the
  1694. //    device, so that this object can release any stateblocks and video
  1695. //    memory resources.  After Reset(), the call OnResetDevice().
  1696. ///////////////////////////////////////////////////////////////////////////
  1697. type
  1698.   PD3DXRTEDesc = ^TD3DXRTEDesc;
  1699.   _D3DXRTE_DESC = record
  1700.     Size: LongWord;
  1701.     MipLevels: LongWord;
  1702.     Format: TD3DFormat;
  1703.     DepthStencil: Bool;
  1704.     DepthStencilFormat: TD3DFormat;
  1705.   end {_D3DXRTE_DESC};
  1706.   {$EXTERNALSYM _D3DXRTE_DESC}
  1707.   D3DXRTE_DESC = _D3DXRTE_DESC;
  1708.   {$EXTERNALSYM D3DXRTE_DESC}
  1709.   TD3DXRTEDesc = _D3DXRTE_DESC;
  1710.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXRenderToEnvMap);'}
  1711.   {$EXTERNALSYM ID3DXRenderToEnvMap}
  1712.   ID3DXRenderToEnvMap = interface(IUnknown)
  1713.     ['{313F1B4B-C7B0-4fa2-9D9D-8D380B64385E}']
  1714.     // ID3DXRenderToEnvMap
  1715.     function GetDevice(out ppDevice: IDirect3DDevice9): HResult; stdcall;
  1716.     function GetDesc(out pDesc: TD3DXRTEDesc): HResult; stdcall;
  1717.     function BeginCube(pCubeTex: IDirect3DCubeTexture9): HResult; stdcall;
  1718.     function BeginSphere(pTex: IDirect3DTexture9): HResult; stdcall;
  1719.     function BeginHemisphere(pTexZPos, pTexZNeg: IDirect3DTexture9): HResult; stdcall;
  1720.     function BeginParabolic(pTexZPos, pTexZNeg: IDirect3DTexture9): HResult; stdcall;
  1721.     function Face(Face: TD3DCubemapFaces; MipFilter: DWORD): HResult; stdcall;
  1722.     function _End(MipFilter: DWORD): HResult; stdcall;
  1723.     function OnLostDevice: HResult; stdcall;
  1724.     function OnResetDevice: HResult; stdcall;
  1725.   end;
  1726.   IID_ID3DXRenderToEnvMap = ID3DXRenderToEnvMap;
  1727.   {$EXTERNALSYM IID_ID3DXRenderToEnvMap}
  1728. function D3DXCreateRenderToEnvMap(ppDevice: IDirect3DDevice9;
  1729.   Size: LongWord;
  1730.   MipLevels: LongWord;
  1731.   Format: TD3DFormat;
  1732.   DepthStencil: BOOL;
  1733.   DepthStencilFormat: TD3DFormat;
  1734.   out ppRenderToEnvMap: ID3DXRenderToEnvMap): HResult; stdcall; external d3dx9coreDLL;
  1735. {$EXTERNALSYM D3DXCreateRenderToEnvMap}
  1736. ///////////////////////////////////////////////////////////////////////////
  1737. // ID3DXLine:
  1738. // ------------
  1739. // This object intends to provide an easy way to draw lines using D3D.
  1740. //
  1741. // Begin -
  1742. //    Prepares device for drawing lines
  1743. //
  1744. // Draw -
  1745. //    Draws a line strip in screen-space.
  1746. //    Input is in the form of a array defining points on the line strip. of D3DXVECTOR2 
  1747. //
  1748. // DrawTransform -
  1749. //    Draws a line in screen-space with a specified input transformation matrix.
  1750. //
  1751. // End - 
  1752. //     Restores device state to how it was when Begin was called.
  1753. //
  1754. // SetPattern - 
  1755. //     Applies a stipple pattern to the line.  Input is one 32-bit
  1756. //     DWORD which describes the stipple pattern. 1 is opaque, 0 is
  1757. //     transparent.
  1758. //
  1759. // SetPatternScale -
  1760. //     Stretches the stipple pattern in the u direction.  Input is one
  1761. //     floating-point value.  0.0f is no scaling, whereas 1.0f doubles
  1762. //     the length of the stipple pattern.
  1763. //
  1764. // SetWidth - 
  1765. //     Specifies the thickness of the line in the v direction.  Input is
  1766. //     one floating-point value.
  1767. //
  1768. // SetAntialias - 
  1769. //     Toggles line antialiasing.  Input is a BOOL.
  1770. //     TRUE  = Antialiasing on.
  1771. //     FALSE = Antialiasing off.
  1772. //
  1773. // SetGLLines - 
  1774. //     Toggles non-antialiased OpenGL line emulation.  Input is a BOOL.
  1775. //     TRUE  = OpenGL line emulation on.
  1776. //     FALSE = OpenGL line emulation off.
  1777. //
  1778. // OpenGL line:     Regular line:
  1779. //   *                *
  1780. //   |               /  
  1781. //   |              *   
  1782. //   *                  
  1783. //                       
  1784. //        *                *
  1785. //        |               /
  1786. //        |               *
  1787. //         *
  1788. //
  1789. // OnLostDevice, OnResetDevice -
  1790. //    Call OnLostDevice() on this object before calling Reset() on the
  1791. //    device, so that this object can release any stateblocks and video
  1792. //    memory resources.  After Reset(), the call OnResetDevice().
  1793. ///////////////////////////////////////////////////////////////////////////
  1794. type
  1795.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXLine);'}
  1796.   {$EXTERNALSYM ID3DXLine}
  1797.   ID3DXLine = interface(IUnknown)
  1798.     ['{D379BA7F-9042-4ac4-9F5E-58192A4C6BD8}']
  1799.     // ID3DXLine
  1800.     function GetDevice(out ppDevice: IDirect3DDevice9): HResult; stdcall;
  1801.     function _Begin: HResult; stdcall;
  1802.     function Draw(pVertexList: PD3DXVector2; dwVertexListCount: DWORD; Color: TD3DColor): HResult; stdcall;
  1803.     function DrawTransform(pVertexList: PD3DXVector3; dwVertexListCount: DWORD;
  1804.       const pTransform: TD3DXMatrix; Color: TD3DColor): HResult; stdcall;
  1805.     function SetPattern(dwPattern: DWORD): HResult; stdcall;
  1806.     function GetPattern: DWORD; stdcall;
  1807.     function SetPatternScale(fPatternScale: Single): HResult; stdcall;
  1808.     function GetPatternScale: Single; stdcall;
  1809.     function SetWidth(fWidth: Single): HResult; stdcall;
  1810.     function GetWidth: Single; stdcall;
  1811.     function SetAntialias(bAntialias: BOOL): HResult; stdcall;
  1812.     function GetAntialias: BOOL; stdcall;
  1813.     function SetGLLines(bGLLines: BOOL): HResult; stdcall;
  1814.     function GetGLLines: BOOL; stdcall;
  1815.     function _End: HResult; stdcall;
  1816.     function OnLostDevice: HResult; stdcall;
  1817.     function OnResetDevice: HResult; stdcall;
  1818.   end;
  1819.   IID_ID3DXLine = ID3DXLine;
  1820.   {$EXTERNALSYM IID_ID3DXLine}
  1821. function D3DXCreateLine(ppDevice: IDirect3DDevice9;
  1822.   out ppLine: ID3DXLine): HResult; stdcall; external d3dx9coreDLL;
  1823. {$EXTERNALSYM D3DXCreateLine}
  1824. //////////////////////////////////////////////////////////////////////////////
  1825. //
  1826. //  Copyright (c) Microsoft Corporation.  All rights reserved.
  1827. //
  1828. //  File:       d3dx9shader.h
  1829. //  Content:    D3DX Shader APIs
  1830. //
  1831. //////////////////////////////////////////////////////////////////////////////
  1832. //---------------------------------------------------------------------------
  1833. // D3DXTX_VERSION:
  1834. // --------------
  1835. // Version token used to create a procedural texture filler in effects
  1836. // Used by D3DXFill[]TX functions
  1837. //---------------------------------------------------------------------------
  1838. // #define D3DXTX_VERSION(_Major,_Minor) (('T' << 24) | ('X' << 16) | ((_Major) << 8) | (_Minor))
  1839. function D3DXTX_VERSION(_Major, _Minor: Byte): DWORD;
  1840. {$EXTERNALSYM D3DXTX_VERSION}
  1841. //----------------------------------------------------------------------------
  1842. // D3DXSHADER flags:
  1843. // -----------------
  1844. // D3DXSHADER_DEBUG
  1845. //   Insert debug file/line/type/symbol information.
  1846. //
  1847. // D3DXSHADER_SKIPVALIDATION
  1848. //   Do not validate the generated code against known capabilities and
  1849. //   constraints.  This option is only recommended when compiling shaders
  1850. //   you KNOW will work.  (ie. have compiled before without this option.)
  1851. //   Shaders are always validated by D3D before they are set to the device.
  1852. //
  1853. // D3DXSHADER_SKIPOPTIMIZATION 
  1854. //   Instructs the compiler to skip optimization steps during code generation.
  1855. //   Unless you are trying to isolate a problem in your code using this option 
  1856. //   is not recommended.
  1857. //
  1858. // D3DXSHADER_PACKMATRIX_ROWMAJOR
  1859. //   Unless explicitly specified, matrices will be packed in row-major order
  1860. //   on input and output from the shader.
  1861. //
  1862. // D3DXSHADER_PACKMATRIX_COLUMNMAJOR
  1863. //   Unless explicitly specified, matrices will be packed in column-major
  1864. //   order on input and output from the shader.  This is generally more
  1865. //   efficient, since it allows vector-matrix multiplication to be performed
  1866. //   using a series of dot-products.
  1867. //
  1868. // D3DXSHADER_PARTIALPRECISION
  1869. //   Force all computations in resulting shader to occur at partial precision.
  1870. //   This may result in faster evaluation of shaders on some hardware.
  1871. //
  1872. // D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT
  1873. //   Force compiler to compile against the next highest available software
  1874. //   target for vertex shaders.  This flag also turns optimizations off, 
  1875. //   and debugging on.
  1876. //
  1877. // D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT
  1878. //   Force compiler to compile against the next highest available software
  1879. //   target for pixel shaders.  This flag also turns optimizations off, 
  1880. //   and debugging on.
  1881. //
  1882. // D3DXSHADER_NO_PRESHADER
  1883. //   Disables Preshaders. Using this flag will cause the compiler to not 
  1884. //   pull out static expression for evaluation on the host cpu
  1885. //
  1886. // D3DXSHADER_AVOID_FLOW_CONTROL
  1887. //   Hint compiler to avoid flow-control constructs where possible.
  1888. //
  1889. // D3DXSHADER_PREFER_FLOW_CONTROL
  1890. //   Hint compiler to prefer flow-control constructs where possible.
  1891. //
  1892. //----------------------------------------------------------------------------
  1893. const
  1894.   D3DXSHADER_DEBUG                    = (1 shl 0);
  1895.   {$EXTERNALSYM D3DXSHADER_DEBUG}
  1896.   D3DXSHADER_SKIPVALIDATION           = (1 shl 1);
  1897.   {$EXTERNALSYM D3DXSHADER_SKIPVALIDATION}
  1898.   D3DXSHADER_SKIPOPTIMIZATION         = (1 shl 2);
  1899.   {$EXTERNALSYM D3DXSHADER_SKIPOPTIMIZATION}
  1900.   D3DXSHADER_PACKMATRIX_ROWMAJOR      = (1 shl 3);
  1901.   {$EXTERNALSYM D3DXSHADER_PACKMATRIX_ROWMAJOR}
  1902.   D3DXSHADER_PACKMATRIX_COLUMNMAJOR   = (1 shl 4);
  1903.   {$EXTERNALSYM D3DXSHADER_PACKMATRIX_COLUMNMAJOR}
  1904.   D3DXSHADER_PARTIALPRECISION         = (1 shl 5);
  1905.   {$EXTERNALSYM D3DXSHADER_PARTIALPRECISION}
  1906.   D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT  = (1 shl 6);
  1907.   {$EXTERNALSYM D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT}
  1908.   D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT  = (1 shl 7);
  1909.   {$EXTERNALSYM D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT}
  1910.   D3DXSHADER_NO_PRESHADER             = (1 shl 8);
  1911.   {$EXTERNALSYM D3DXSHADER_NO_PRESHADER}
  1912.   D3DXSHADER_AVOID_FLOW_CONTROL       = (1 shl 9);
  1913.   {$EXTERNALSYM D3DXSHADER_AVOID_FLOW_CONTROL}
  1914.   D3DXSHADER_PREFER_FLOW_CONTROL      = (1 shl 10);
  1915.   {$EXTERNALSYM D3DXSHADER_PREFER_FLOW_CONTROL}
  1916. //----------------------------------------------------------------------------
  1917. // D3DXHANDLE:
  1918. // -----------
  1919. // Handle values used to efficiently reference shader and effect parameters.
  1920. // Strings can be used as handles.  However, handles are not always strings.
  1921. //----------------------------------------------------------------------------
  1922. type
  1923.   {$HPPEMIT 'typedef D3DXHANDLE TD3DXHandle;'}
  1924.   {$HPPEMIT 'typedef D3DXHANDLE *PD3DXHandle;'}
  1925.   PD3DXHandle = ^TD3DXHandle;
  1926.   {$EXTERNALSYM PD3DXHandle}
  1927.   TD3DXHandle = {$IFDEF TYPE_IDENTITY}type {$ENDIF}PAnsiChar;
  1928.   {$NODEFINE TD3DXHandle}
  1929. //----------------------------------------------------------------------------
  1930. // D3DXMACRO:
  1931. // ----------
  1932. // Preprocessor macro definition.  The application pass in a NULL-terminated
  1933. // array of this structure to various D3DX APIs.  This enables the application
  1934. // to #define tokens at runtime, before the file is parsed.
  1935. //----------------------------------------------------------------------------
  1936.   PD3DXMacro = ^TD3DXMacro;
  1937.   _D3DXMACRO = record
  1938.     Name: PAnsiChar;
  1939.     Definition: PAnsiChar;
  1940.   end;
  1941.   {$EXTERNALSYM _D3DXMACRO}
  1942.   D3DXMACRO = _D3DXMACRO;
  1943.   {$EXTERNALSYM D3DXMACRO}
  1944.   TD3DXMacro = _D3DXMACRO;
  1945. //----------------------------------------------------------------------------
  1946. // D3DXSEMANTIC:
  1947. //----------------------------------------------------------------------------
  1948.   PD3DXSemantic = ^TD3DXSemantic;
  1949.   _D3DXSEMANTIC = record
  1950.     Usage: LongWord;
  1951.     UsageIndex: LongWord;
  1952.   end;
  1953.   {$EXTERNALSYM _D3DXSEMANTIC}
  1954.   D3DXSEMANTIC = _D3DXSEMANTIC;
  1955.   {$EXTERNALSYM D3DXSEMANTIC}
  1956.   TD3DXSemantic = _D3DXSEMANTIC;
  1957. //----------------------------------------------------------------------------
  1958. // D3DXFRAGMENT_DESC:
  1959. //----------------------------------------------------------------------------
  1960.   PD3DXFragmentDesc = ^TD3DXFragmentDesc;
  1961.   _D3DXFRAGMENT_DESC = record
  1962.     Name: PAnsiChar;
  1963.     Target: DWORD;
  1964.   end;
  1965.   {$EXTERNALSYM _D3DXFRAGMENT_DESC}
  1966.   D3DXFRAGMENT_DESC = _D3DXFRAGMENT_DESC;
  1967.   {$EXTERNALSYM D3DXFRAGMENT_DESC}
  1968.   TD3DXFragmentDesc = _D3DXFRAGMENT_DESC;
  1969. //----------------------------------------------------------------------------
  1970. // D3DXREGISTER_SET:
  1971. //----------------------------------------------------------------------------
  1972.   _D3DXREGISTER_SET = (
  1973.     D3DXRS_BOOL,
  1974.     D3DXRS_INT4,
  1975.     D3DXRS_FLOAT4,
  1976.     D3DXRS_SAMPLER
  1977.   );
  1978.   {$EXTERNALSYM _D3DXREGISTER_SET}
  1979.   D3DXREGISTER_SET = _D3DXREGISTER_SET;
  1980.   {$EXTERNALSYM D3DXREGISTER_SET}
  1981.   TD3DXRegisterSet = _D3DXREGISTER_SET;
  1982. //----------------------------------------------------------------------------
  1983. // D3DXPARAMETER_CLASS:
  1984. //----------------------------------------------------------------------------
  1985.   _D3DXPARAMETER_CLASS = (
  1986.     D3DXPC_SCALAR,
  1987.     D3DXPC_VECTOR,
  1988.     D3DXPC_MATRIX_ROWS,
  1989.     D3DXPC_MATRIX_COLUMNS,
  1990.     D3DXPC_OBJECT,
  1991.     D3DXPC_STRUCT
  1992.   );
  1993.   {$EXTERNALSYM _D3DXPARAMETER_CLASS}
  1994.   D3DXPARAMETER_CLASS = _D3DXPARAMETER_CLASS;
  1995.   {$EXTERNALSYM D3DXPARAMETER_CLASS}
  1996.   TD3DXParameterClass = _D3DXPARAMETER_CLASS;
  1997. //----------------------------------------------------------------------------
  1998. // D3DXPARAMETER_TYPE:
  1999. //----------------------------------------------------------------------------
  2000.   _D3DXPARAMETER_TYPE = (
  2001.     D3DXPT_VOID,
  2002.     D3DXPT_BOOL,
  2003.     D3DXPT_INT,
  2004.     D3DXPT_FLOAT,
  2005.     D3DXPT_STRING,
  2006.     D3DXPT_TEXTURE,
  2007.     D3DXPT_TEXTURE1D,
  2008.     D3DXPT_TEXTURE2D,
  2009.     D3DXPT_TEXTURE3D,
  2010.     D3DXPT_TEXTURECUBE,
  2011.     D3DXPT_SAMPLER,
  2012.     D3DXPT_SAMPLER1D,
  2013.     D3DXPT_SAMPLER2D,
  2014.     D3DXPT_SAMPLER3D,
  2015.     D3DXPT_SAMPLERCUBE,
  2016.     D3DXPT_PIXELSHADER,
  2017.     D3DXPT_VERTEXSHADER,
  2018.     D3DXPT_PIXELFRAGMENT,
  2019.     D3DXPT_VERTEXFRAGMENT
  2020.   );
  2021.   {$EXTERNALSYM _D3DXPARAMETER_TYPE}
  2022.   D3DXPARAMETER_TYPE = _D3DXPARAMETER_TYPE;
  2023.   {$EXTERNALSYM D3DXPARAMETER_TYPE}
  2024.   TD3DXParameterType = _D3DXPARAMETER_TYPE;
  2025. //----------------------------------------------------------------------------
  2026. // D3DXCONSTANTTABLE_DESC:
  2027. //----------------------------------------------------------------------------
  2028.   PD3DXConstantTableDesc = ^TD3DXConstantTableDesc;
  2029.   _D3DXCONSTANTTABLE_DESC = record
  2030.     Creator: PAnsiChar;                 // Creator string
  2031.     Version: DWORD;                     // Shader version
  2032.     Constants: LongWord;                // Number of constants
  2033.   end;
  2034.   {$EXTERNALSYM _D3DXCONSTANTTABLE_DESC}
  2035.   D3DXCONSTANTTABLE_DESC = _D3DXCONSTANTTABLE_DESC;
  2036.   {$EXTERNALSYM D3DXCONSTANTTABLE_DESC}
  2037.   TD3DXConstantTableDesc = _D3DXCONSTANTTABLE_DESC;
  2038. //----------------------------------------------------------------------------
  2039. // D3DXCONSTANT_DESC:
  2040. //----------------------------------------------------------------------------
  2041.    PD3DXConstantDesc = ^TD3DXConstantDesc;
  2042.   _D3DXCONSTANT_DESC = record
  2043.     Name: PAnsiChar;                    // Constant name
  2044.     RegisterSet: TD3DXRegisterSet;      // Register set
  2045.     RegisterIndex: LongWord;            // Register index
  2046.     RegisterCount: LongWord;            // Number of registers occupied
  2047.     _Class: TD3DXParameterClass;        // Class
  2048.     _Type: TD3DXParameterType;          // Component type
  2049.     Rows: LongWord;                     // Number of rows
  2050.     Columns: LongWord;                  // Number of columns
  2051.     Elements: LongWord;                 // Number of array elements
  2052.     StructMembers: LongWord;            // Number of structure member sub-parameters
  2053.     Bytes: LongWord;                    // Data size, in bytes
  2054.     DefaultValue: Pointer;              // Pointer to default value
  2055.   end;
  2056.   {$EXTERNALSYM _D3DXCONSTANT_DESC}
  2057.   D3DXCONSTANT_DESC = _D3DXCONSTANT_DESC;
  2058.   {$EXTERNALSYM D3DXCONSTANT_DESC}
  2059.   TD3DXConstantDesc = _D3DXCONSTANT_DESC;
  2060. //----------------------------------------------------------------------------
  2061. // ID3DXConstantTable:
  2062. //----------------------------------------------------------------------------
  2063.   PID3DXConstantTable = ^ID3DXConstantTable;
  2064.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXConstantTable);'}
  2065.   {$EXTERNALSYM ID3DXConstantTable}
  2066.   ID3DXConstantTable = interface(ID3DXBuffer)
  2067.     ['{AB3C758F-093E-4356-B762-4DB18F1B3A01}']
  2068.     // Descs
  2069.     function GetDesc(out pDesc: TD3DXConstantTableDesc): HResult; stdcall;
  2070.     function GetConstantDesc(hConstant: TD3DXHandle; pConstantDesc: PD3DXConstantDesc; var pCount: LongWord): HResult; stdcall;
  2071.     function GetSamplerIndex(hConstant: TD3DXHandle): LongWord; stdcall;
  2072.     // Handle operations
  2073.     function GetConstant(hConstant: TD3DXHandle; Index: LongWord): TD3DXHandle; stdcall;
  2074.     function GetConstantByName(hConstant: TD3DXHandle; pName: PAnsiChar): TD3DXHandle; stdcall;
  2075.     function GetConstantElement(hConstant: TD3DXHandle; Index: LongWord): TD3DXHandle; stdcall;
  2076.     // Set Constants
  2077.     function SetDefaults(pDevice: IDirect3DDevice9): HResult; stdcall;
  2078.     function SetValue(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; pData: Pointer; Bytes: LongWord): HResult; stdcall;
  2079.     function SetBool(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; b: BOOL): HResult; stdcall;
  2080.     function SetBoolArray(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; pb: PBOOL; Count: LongWord): HResult; stdcall;
  2081.     function SetInt(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; n: Integer): HResult; stdcall;
  2082.     function SetIntArray(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; pn: PInteger; Count: LongWord): HResult; stdcall;
  2083.     function SetFloat(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; f: Single): HResult; stdcall;
  2084.     function SetFloatArray(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; pf: PSingle; Count: LongWord): HResult; stdcall;
  2085.     function SetVector(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; const pVector: TD3DXVector4): HResult; stdcall;
  2086.     function SetVectorArray(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; pVector: PD3DXVector4; Count: LongWord): HResult; stdcall;
  2087.     function SetMatrix(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; const pMatrix: TD3DXMatrix): HResult; stdcall;
  2088.     function SetMatrixArray(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; pMatrix: PD3DXMatrix; Count: LongWord): HResult; stdcall;
  2089.     function SetMatrixPointerArray(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; ppMatrix: PPD3DXMatrix; Count: LongWord): HResult; stdcall;
  2090.     function SetMatrixTranspose(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; const pMatrix: TD3DXMatrix): HResult; stdcall;
  2091.     function SetMatrixTransposeArray(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; pMatrix: PD3DXMatrix; Count: LongWord): HResult; stdcall;
  2092.     function SetMatrixTransposePointerArray(pDevice: IDirect3DDevice9; hConstant: TD3DXHandle; ppMatrix: PPD3DXMatrix; Count: LongWord): HResult; stdcall;
  2093.   end;
  2094.   IID_ID3DXConstantTable = ID3DXConstantTable;
  2095.   {$EXTERNALSYM IID_ID3DXConstantTable}
  2096. //----------------------------------------------------------------------------
  2097. // ID3DXTextureShader:
  2098. //----------------------------------------------------------------------------
  2099.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXTextureShader);'}
  2100.   {$EXTERNALSYM ID3DXTextureShader}
  2101.   ID3DXTextureShader = interface(IUnknown)
  2102.     ['{3E3D67F8-AA7A-405d-A857-BA01D4758426}']
  2103.     // Gets
  2104.     function GetFunction(out ppFunction: ID3DXBuffer): HResult; stdcall;
  2105.     function GetConstantBuffer(out ppConstantBuffer: ID3DXBuffer): HResult; stdcall;
  2106.     // Descs
  2107.     function GetDesc(out pDesc: TD3DXConstantTableDesc): HResult; stdcall;
  2108.     function GetConstantDesc(hConstant: TD3DXHandle; pConstantDesc: PD3DXConstantDesc; out pCount: LongWord): HResult; stdcall;
  2109.     // Handle operations
  2110.     function GetConstant(hConstant: TD3DXHandle; Index: LongWord): TD3DXHandle; stdcall;
  2111.     function GetConstantByName(hConstant: TD3DXHandle; pName: PAnsiChar): TD3DXHandle; stdcall;
  2112.     function GetConstantElement(hConstant: TD3DXHandle; Index: LongWord): TD3DXHandle; stdcall;
  2113.     // Set Constants
  2114.     function SetDefaults: HResult; stdcall;
  2115.     function SetValue(hConstant: TD3DXHandle; pData: Pointer; Bytes: LongWord): HResult; stdcall;
  2116.     function SetBool(hConstant: TD3DXHandle; b: BOOL): HResult; stdcall;
  2117.     function SetBoolArray(hConstant: TD3DXHandle; const pb: PBOOL; Count: LongWord): HResult; stdcall;
  2118.     function SetInt(hConstant: TD3DXHandle; n: Integer): HResult; stdcall;
  2119.     function SetIntArray(hConstant: TD3DXHandle; const pn: PInteger; Count: LongWord): HResult; stdcall;
  2120.     function SetFloat(hConstant: TD3DXHandle; f: Single): HResult; stdcall;
  2121.     function SetFloatArray(hConstant: TD3DXHandle; const pf: PSingle; Count: LongWord): HResult; stdcall;
  2122.     function SetVector(hConstant: TD3DXHandle; const pVector: TD3DXVector4): HResult; stdcall;
  2123.     function SetVectorArray(hConstant: TD3DXHandle; const pVector: PD3DXVector4; Count: LongWord): HResult; stdcall;
  2124.     function SetMatrix(hConstant: TD3DXHandle; const pMatrix: TD3DXMatrix): HResult; stdcall;
  2125.     function SetMatrixArray(hConstant: TD3DXHandle; const pMatrix: PD3DXMatrix; Count: LongWord): HResult; stdcall;
  2126.     function SetMatrixPointerArray(hConstant: TD3DXHandle; const ppMatrix: PPD3DXMatrix; Count: LongWord): HResult; stdcall;
  2127.     function SetMatrixTranspose(hConstant: TD3DXHandle; const pMatrix: TD3DXMatrix): HResult; stdcall;
  2128.     function SetMatrixTransposeArray(hConstant: TD3DXHandle; const pMatrix: PD3DXMatrix; Count: LongWord): HResult; stdcall;
  2129.     function SetMatrixTransposePointerArray(hConstant: TD3DXHandle; const ppMatrix: PPD3DXMatrix; Count: LongWord): HResult; stdcall;
  2130.   end;
  2131.   IID_ID3DXTextureShader = ID3DXTextureShader;
  2132.   {$EXTERNALSYM IID_ID3DXTextureShader}
  2133. //----------------------------------------------------------------------------
  2134. // ID3DXFragmentLinker
  2135. //----------------------------------------------------------------------------
  2136.   {$HPPEMIT 'DECLARE_DINTERFACE_TYPE(ID3DXFragmentLinker);'}
  2137.   {$EXTERNALSYM ID3DXFragmentLinker}
  2138.   ID3DXFragmentLinker = interface(IUnknown)
  2139.     ['{1A2C0CC2-E5B6-4ebc-9E8D-390E057811B6}']
  2140.     // ID3DXFragmentLinker
  2141.     // fragment access and information retrieval functions
  2142.     function GetDevice(out ppDevice: IDirect3DDevice9): HResult; stdcall;
  2143.     function GetNumberOfFragments: LongWord; stdcall;
  2144.     function GetFragmentHandleByIndex(Index: LongWord): TD3DXHandle; stdcall;
  2145.     function GetFragmentHandleByName(Name: PAnsiChar): TD3DXHandle; stdcall;
  2146.     function GetFragmentDesc(Name: TD3DXHandle; out FragDesc: TD3DXFragmentDesc): HResult; stdcall;
  2147.     // add the fragments in the buffer to the linker
  2148.     function AddFragments(Fragments: PDWORD): HResult; stdcall;
  2149.     // Create a buffer containing the fragments.  Suitable for saving to disk
  2150.     function GetAllFragments(out ppBuffer: ID3DXBuffer): HResult; stdcall;
  2151.     function GetFragment(Name: TD3DXHandle; out ppBuffer: ID3DXBuffer): HResult; stdcall;
  2152.     function LinkShader(pProfile: PAnsiChar; Flags: DWORD; rgFragmentHandles: PD3DXHandle; cFragments: LongWord; out ppBuffer: ID3DXBuffer; ppErrorMsgs: PID3DXBuffer): HResult; stdcall;
  2153.     function LinkVertexShader(pProfile: PAnsiChar; Flags: DWORD; rgFragmentHandles: PD3DXHandle; cFragments: LongWord; out pVShader: IDirect3DVertexShader9; ppErrorMsgs: PID3DXBuffer): HResult; stdcall;
  2154.     function LinkPixelShader(pProfile: PAnsiChar; Flags: DWORD; rgFragmentHandles: PD3DXHandle; cFragments: LongWord; out pPShader: IDirect3DPixelShader9; ppErrorMsgs: PID3DXBuffer): HResult; stdcall;
  2155.     function ClearCache: HResult; stdcall;
  2156.   end;
  2157. //----------------------------------------------------------------------------
  2158. // D3DXINCLUDE_TYPE:
  2159. //----------------------------------------------------------------------------
  2160. type
  2161.   PD3DXIncludeType = ^TD3DXIncludeType;
  2162.   _D3DXINCLUDE_TYPE = (
  2163.     D3DXINC_LOCAL,
  2164.     D3DXINC_SYSTEM
  2165.   );
  2166.   {$EXTERNALSYM _D3DXINCLUDE_TYPE}
  2167.   D3DXINCLUDE_TYPE = _D3DXINCLUDE_TYPE;
  2168.   {$EXTERNALSYM D3DXINCLUDE_TYPE}
  2169.   TD3DXIncludeType = _D3DXINCLUDE_TYPE;
  2170. //----------------------------------------------------------------------------
  2171. // ID3DXInclude:
  2172. // -------------
  2173. // This interface is intended to be implemented by the application, and can
  2174. // be used by various D3DX APIs.  This enables application-specific handling
  2175. // of #include directives in source files.
  2176. //
  2177. // Open()
  2178. //    Opens an include file.  If successful, it should fill in ppData and
  2179. //    pBytes.  The data pointer returned must remain valid until Close is
  2180. //    subsequently called.
  2181. // Close()
  2182. //    Closes an include file.  If Open was successful, Close is guaranteed
  2183. //    to be called before the API using this interface returns.
  2184. //----------------------------------------------------------------------------
  2185.   PID3DXInclude = ^ID3DXInclude;
  2186.   {$EXTERNALSYM ID3DXInclude}
  2187.   ID3DXInclude = class
  2188.     function Open(IncludeType: TD3DXIncludeType; pFileName: PAnsiChar; pParentData: Pointer; out ppData: Pointer; out pBytes: LongWord): HResult; virtual; stdcall; abstract;
  2189.     function Close(pData: Pointer): HResult; virtual; stdcall; abstract;
  2190.   end;
  2191. //////////////////////////////////////////////////////////////////////////////
  2192. // APIs //////////////////////////////////////////////////////////////////////
  2193. //////////////////////////////////////////////////////////////////////////////
  2194. //----------------------------------------------------------------------------
  2195. // D3DXAssembleShader:
  2196. // -------------------
  2197. // Assembles a shader.
  2198. //
  2199. // Parameters:
  2200. //  pSrcFile
  2201. //      Source file name
  2202. //  hSrcModule
  2203. //      Module handle. if NULL, current module will be used
  2204. //  pSrcResource
  2205. //      Resource name in module
  2206. //  pSrcData
  2207. //      Pointer to source code
  2208. //  SrcDataLen
  2209. //      Size of source code, in bytes
  2210. //  pDefines
  2211. //      Optional NULL-terminated array of preprocessor macro definitions.
  2212. //  pInclude
  2213. //      Optional interface pointer to use for handling #include directives.
  2214. //      If this parameter is NULL, #includes will be honored when assembling
  2215. //      from file, and will error when assembling from resource or memory.
  2216. //  Flags
  2217. //      See D3DXSHADER_xxx flags
  2218. //  ppShader
  2219. //      Returns a buffer containing the created shader.  This buffer contains
  2220. //      the assembled shader code, as well as any embedded debug info.
  2221. //  ppErrorMsgs
  2222. //      Returns a buffer containing a listing of errors and warnings that were
  2223. //      encountered during assembly.  If you are running in a debugger,
  2224. //      these are the same messages you will see in your debug output.
  2225. //----------------------------------------------------------------------------
  2226. function D3DXAssembleShaderFromFileA(
  2227.   pSrcFile: PAnsiChar;
  2228.   pDefines: PD3DXMacro;
  2229.   pInclude: ID3DXInclude;
  2230.   Flags: DWORD;
  2231.   ppShader: PID3DXBuffer;
  2232.   ppErrorMsgs: PID3DXBuffer): HResult; stdcall; external d3dx9shaderDLL name 'D3DXAssembleShaderFromFileA';
  2233. {$EXTERNALSYM D3DXAssembleShaderFromFileA}
  2234. function D3DXAssembleShaderFromFileW(
  2235.   pSrcFile: PWideChar;
  2236.   pDefines: PD3DXMacro;
  2237.   pInclude: ID3DXInclude;
  2238.   Flags: DWORD;
  2239.   ppShader: PID3DXBuffer;
  2240.   ppErrorMsgs: PID3DXBuffer): HResult; stdcall; external d3dx9shaderDLL name 'D3DXAssembleShaderFromFileW';
  2241. {$EXTERNALSYM D3DXAssembleShaderFromFileW}
  2242. function D3DXAssembleShaderFromFile(
  2243.   pSrcFile: PChar;
  2244.   pDefines: PD3DXMacro;
  2245.   pInclude: ID3DXInclude;
  2246.   Flags: DWORD;
  2247.   ppShader: PID3DXBuffer;
  2248.   ppErrorMsgs: PID3DXBuffer): HResult; stdcall; external d3dx9shaderDLL name 'D3DXAssembleShaderFromFileA';
  2249. {$EXTERNALSYM D3DXAssembleShaderFromFile}
  2250. function D3DXAssembleShaderFromResourceA(
  2251.   hSrcModule: HModule;
  2252.   pSrcResource: PAnsiChar;
  2253.   pDefines: PD3DXMacro;
  2254.   pInclude: ID3DXInclude;
  2255.   Flags: DWord;
  2256.   ppShader: PID3DXBuffer;
  2257.   ppErrorMsgs: PID3DXBuffer): HResult; stdcall; external d3dx9shaderDLL name 'D3DXAssembleShaderFromResourceA';
  2258. {$EXTERNALSYM D3DXAssembleShaderFromResourceA}
  2259. function D3DXAssembleShaderFromResourceW(
  2260.   hSrcModule: HModule;
  2261.   pSrcResource: PWideChar;
  2262.   pDefines: PD3DXMacro;
  2263.   pInclude: ID3DXInclude;
  2264.   Flags: DWord;
  2265.   ppShader: PID3DXBuffer;
  2266.   ppErrorMsgs: PID3DXBuffer): HResult; stdcall; external d3dx9shaderDLL name 'D3DXAssembleShaderFromResourceW';
  2267. {$EXTERNALSYM D3DXAssembleShaderFromResourceW}
  2268. function D3DXAssembleShaderFromResource(
  2269.   hSrcModule: HModule;
  2270.   pSrcResource: PChar;
  2271.   pDefines: PD3DXMacro;
  2272.   pInclude: ID3DXInclude;
  2273.   Flags: DWord;
  2274.   ppShader: PID3DXBuffer;
  2275.   ppErrorMsgs: PID3DXBuffer): HResult; stdcall; external d3dx9shaderDLL name 'D3DXAssembleShaderFromResourceA';
  2276. {$EXTERNALSYM D3DXAssembleShaderFromResource}
  2277. function D3DXAssembleShader(
  2278.   pSrcData: PAnsiChar;
  2279.   SrcDataLen: LongWord;
  2280.   pDefines: PD3DXMacro;
  2281.   pInclude: ID3DXInclude;
  2282.   Flags: DWord;
  2283.   ppShader: PID3DXBuffer;
  2284.   ppErrorMsgs: PID3DXBuffer): HResult; stdcall; external d3dx9shaderDLL;
  2285. {$EXTERNALSYM D3DXAssembleShader}
  2286.   
  2287. //----------------------------------------------------------------------------
  2288. // D3DXCompileShader:
  2289. // ------------------
  2290. // Compiles a shader.
  2291. //
  2292. // Parameters:
  2293. //  pSrcFile
  2294. //      Source file name.
  2295. //  hSrcModule
  2296. //      Module handle. if NULL, current module will be used.
  2297. //  pSrcResource
  2298. //      Resource name in module.
  2299. //  pSrcData
  2300. //      Pointer to source code.
  2301. //  SrcDataLen
  2302. //      Size of source code, in bytes.
  2303. //  pDefines
  2304. //      Optional NULL-terminated array of preprocessor macro definitions.
  2305. //  pInclude
  2306. //      Optional interface pointer to use for handling #include directives.
  2307. //      If this parameter is NULL, #includes will be honored when compiling
  2308. //      from file, and will error when compiling from resource or memory.
  2309. //  pFunctionName
  2310. //      Name of the entrypoint function where execution should begin.
  2311. //  pProfile
  2312. //      Instruction set to be used when generating code.  Currently supported
  2313. //      profiles are "vs_1_1", "vs_2_0", "vs_2_a", "vs_2_sw", "ps_1_1",
  2314. //      "ps_1_2", "ps_1_3", "ps_1_4", "ps_2_0", "ps_2_a", "ps_2_sw", "tx_1_0"
  2315. //  Flags
  2316. //      See D3DXSHADER_xxx flags.
  2317. //  ppShader
  2318. //      Returns a buffer containing the created shader.  This buffer contains
  2319. //      the compiled shader code, as well as any embedded debug and symbol
  2320. //      table info.  (See D3DXGetShaderConstantTable)
  2321. //  ppErrorMsgs
  2322. //      Returns a buffer containing a listing of errors and warnings that were
  2323. //      encountered during the compile.  If you are running in a debugger,
  2324. //      these are the same messages you will see in your debug output.
  2325. //  ppConstantTable
  2326. //      Returns a ID3DXConstantTable object which can be used to set
  2327. //      shader constants to the device.  Alternatively, an application can
  2328. //      parse the D3DXSHADER_CONSTANTTABLE block embedded as a comment within
  2329. //      the shader.
  2330. //----------------------------------------------------------------------------
  2331. function D3DXCompileShaderFromFileA(
  2332.   pSrcFile: PAnsiChar;