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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreMatrix;
  2. //---------------------------------------------------------------------------
  3. // AsphyreMatrix.pas                                    Modified: 06-Mar-2007
  4. // Asphyre wrapper for Direct3D matrices                          Version 1.0
  5. //---------------------------------------------------------------------------
  6. // Important Notice:
  7. //
  8. // If you modify/use this code or one of its parts either in original or
  9. // modified form, you must comply with Mozilla Public License v1.1,
  10. // specifically section 3, "Distribution Obligations". Failure to do so will
  11. // result in the license breach, which will be resolved in the court.
  12. // Remember that violating author's rights is considered a serious crime in
  13. // many countries. Thank you!
  14. //
  15. // !! Please *read* Mozilla Public License 1.1 document located at:
  16. //  http://www.mozilla.org/MPL/
  17. //
  18. // If you require any clarifications about the license, feel free to contact
  19. // us or post your question on our forums at: http://www.afterwarp.net
  20. //---------------------------------------------------------------------------
  21. // The contents of this file are subject to the Mozilla Public License
  22. // Version 1.1 (the "License"); you may not use this file except in
  23. // compliance with the License. You may obtain a copy of the License at
  24. // http://www.mozilla.org/MPL/
  25. //
  26. // Software distributed under the License is distributed on an "AS IS"
  27. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  28. // License for the specific language governing rights and limitations
  29. // under the License.
  30. //
  31. // The Original Code is AsphyreMatrix.pas.
  32. //
  33. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  34. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  35. // Afterwarp Interactive. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Direct3D9, D3DX9, Vectors3, Matrices4;
  41. //---------------------------------------------------------------------------
  42. type
  43.  TAsphyreMatrix = class
  44.  private
  45.   MemAddr: Pointer;
  46.   FRawMtx: PD3DXMatrix;
  47.   AuxAddr: Pointer;
  48.   AuxMtx : PD3DXMatrix;
  49.  public
  50.   property RawMtx: PD3DXMatrix read FRawMtx;
  51.   procedure LoadIdentity();
  52.   procedure LoadZero();
  53.   procedure Translate(dx, dy, dz: Single); overload;
  54.   procedure Translate(const Vec: TVector3); overload;
  55.   procedure Scale(sx, sy, sz: Single); overload;
  56.   procedure Scale(const Vec: TVector3); overload;
  57.   procedure RotateX(Phi: Single);
  58.   procedure RotateY(Phi: Single);
  59.   procedure RotateZ(Phi: Single);
  60.   procedure RotateBy(const v: TVector3; Phi: Single);
  61.   procedure Multiply(Mtx: TAsphyreMatrix);
  62.   procedure RotateXLocal(Phi: Single);
  63.   procedure RotateYLocal(Phi: Single);
  64.   procedure RotateZLocal(Phi: Single);
  65.   procedure LookAtLH(const Eye, At, Up: TVector3);
  66.   procedure LookAtRH(const Eye, At, Up: TVector3);
  67.   procedure PerspectiveFovLH(FieldOfView, AspectRatio, MinRange,
  68.    MaxRange: Single);
  69.   procedure PerspectiveFovRH(FieldOfView, AspectRatio, MinRange,
  70.    MaxRange: Single);
  71.   constructor Create();
  72.   destructor Destroy(); override;
  73.  end;
  74. //---------------------------------------------------------------------------
  75. implementation
  76. //---------------------------------------------------------------------------
  77. constructor TAsphyreMatrix.Create();
  78. begin
  79.  inherited;
  80.  MemAddr:= AllocMem(SizeOf(TD3DXMatrix) + 16);
  81.  FRawMtx:= Pointer(Integer(MemAddr) + ($10 - (Integer(MemAddr) and $0F)));
  82.  AuxAddr:= AllocMem(SizeOf(TD3DXMatrix) + 16);
  83.  AuxMtx := Pointer(Integer(AuxAddr) + ($10 - (Integer(AuxAddr) and $0F)));
  84.  LoadIdentity();
  85. end;
  86. //---------------------------------------------------------------------------
  87. destructor TAsphyreMatrix.Destroy();
  88. begin
  89.  FreeMem(AuxAddr);
  90.  FreeMem(MemAddr);
  91.  inherited;
  92. end;
  93. //---------------------------------------------------------------------------
  94. procedure TAsphyreMatrix.LoadIdentity();
  95. begin
  96.  D3DXMatrixIdentity(FRawMtx^);
  97. end;
  98. //---------------------------------------------------------------------------
  99. procedure TAsphyreMatrix.LoadZero();
  100. begin
  101.  FillChar(FRawMtx^, SizeOf(TD3DXMatrix), 0);
  102. end;
  103. //---------------------------------------------------------------------------
  104. procedure TAsphyreMatrix.Translate(dx, dy, dz: Single);
  105. begin
  106.  D3DXMatrixTranslation(AuxMtx^, dx, dy, dz);
  107.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  108. end;
  109. //---------------------------------------------------------------------------
  110. procedure TAsphyreMatrix.Translate(const Vec: TVector3);
  111. begin
  112.  D3DXMatrixTranslation(AuxMtx^, Vec.x, Vec.y, Vec.z);
  113.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  114. end;
  115. //---------------------------------------------------------------------------
  116. procedure TAsphyreMatrix.Scale(sx, sy, sz: Single);
  117. begin
  118.  D3DXMatrixScaling(AuxMtx^, sx, sy, sz);
  119.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  120. end;
  121. //---------------------------------------------------------------------------
  122. procedure TAsphyreMatrix.Scale(const Vec: TVector3);
  123. begin
  124.  D3DXMatrixScaling(AuxMtx^, Vec.x, Vec.y, Vec.z);
  125.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  126. end;
  127. //---------------------------------------------------------------------------
  128. procedure TAsphyreMatrix.RotateX(Phi: Single);
  129. begin
  130.  D3DXMatrixRotationX(AuxMtx^, Phi);
  131.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  132. end;
  133. //---------------------------------------------------------------------------
  134. procedure TAsphyreMatrix.RotateY(Phi: Single);
  135. begin
  136.  D3DXMatrixRotationY(AuxMtx^, Phi);
  137.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  138. end;
  139. //---------------------------------------------------------------------------
  140. procedure TAsphyreMatrix.RotateZ(Phi: Single);
  141. begin
  142.  D3DXMatrixRotationZ(AuxMtx^, Phi);
  143.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  144. end;
  145. //---------------------------------------------------------------------------
  146. procedure TAsphyreMatrix.Multiply(Mtx: TAsphyreMatrix);
  147. begin
  148.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, Mtx.RawMtx^);
  149. end;
  150. //---------------------------------------------------------------------------
  151. procedure TAsphyreMatrix.RotateBy(const v: TVector3; Phi: Single);
  152. begin
  153.  D3DXMatrixRotationAxis(AuxMtx^, TD3DXVector3(v), Phi);
  154.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  155. end;
  156. //---------------------------------------------------------------------------
  157. procedure TAsphyreMatrix.RotateXLocal(Phi: Single);
  158. var
  159.  Axis: TVector3;
  160. begin
  161.  Axis.x:= FRawMtx.m[0, 0];
  162.  Axis.y:= FRawMtx.m[0, 1];
  163.  Axis.z:= FRawMtx.m[0, 2];
  164.  RotateBy(Axis, Phi);
  165. end;
  166. //---------------------------------------------------------------------------
  167. procedure TAsphyreMatrix.RotateYLocal(Phi: Single);
  168. var
  169.  Axis: TVector3;
  170. begin
  171.  Axis.x:= FRawMtx.m[1, 0];
  172.  Axis.y:= FRawMtx.m[1, 1];
  173.  Axis.z:= FRawMtx.m[1, 2];
  174.  RotateBy(Axis, Phi);
  175. end;
  176. //---------------------------------------------------------------------------
  177. procedure TAsphyreMatrix.RotateZLocal(Phi: Single);
  178. var
  179.  Axis: TVector3;
  180. begin
  181.  Axis.x:= FRawMtx.m[2, 0];
  182.  Axis.y:= FRawMtx.m[2, 1];
  183.  Axis.z:= FRawMtx.m[2, 2];
  184.  RotateBy(Axis, Phi);
  185. end;
  186. //---------------------------------------------------------------------------
  187. procedure TAsphyreMatrix.LookAtLH(const Eye, At, Up: TVector3);
  188. begin
  189.  D3DXMatrixLookAtLH(AuxMtx^, TD3DXVector3(Eye), TD3DXVector3(At),
  190.   TD3DXVector3(Up));
  191.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  192. end;
  193. //---------------------------------------------------------------------------
  194. procedure TAsphyreMatrix.LookAtRH(const Eye, At, Up: TVector3);
  195. begin
  196.  D3DXMatrixLookAtRH(AuxMtx^, TD3DXVector3(Eye), TD3DXVector3(At),
  197.   TD3DXVector3(Up));
  198.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  199. end;
  200. //---------------------------------------------------------------------------
  201. procedure TAsphyreMatrix.PerspectiveFovLH(FieldOfView, AspectRatio, MinRange,
  202.  MaxRange: Single);
  203. begin
  204.  D3DXMatrixPerspectiveFovLH(AuxMtx^, FieldOfView, AspectRatio, MinRange,
  205.   MaxRange);
  206.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  207. end;
  208. //---------------------------------------------------------------------------
  209. procedure TAsphyreMatrix.PerspectiveFovRH(FieldOfView, AspectRatio, MinRange,
  210.  MaxRange: Single);
  211. begin
  212.  D3DXMatrixPerspectiveFovRH(AuxMtx^, FieldOfView, AspectRatio, MinRange,
  213.   MaxRange);
  214.  D3DXMatrixMultiply(FRawMtx^, FRawMtx^, AuxMtx^);
  215. end;
  216. //---------------------------------------------------------------------------
  217. end.