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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreScene;
  2. //---------------------------------------------------------------------------
  3. // AsphyreScene.pas                                     Modified: 09-Apr-2007
  4. // High-level structure for making 3D scenes in Asphyre           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 AsphyreScene.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. // M. Sc. Yuriy Kotsarenko. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //--------------------------------------------------------------------------
  39. uses
  40.  d3dx9, Vectors3, Matrices4, AsphyreMatrices;
  41. //--------------------------------------------------------------------------
  42. var
  43. //--------------------------------------------------------------------------
  44. // Standard Asphyre matrices
  45. //--------------------------------------------------------------------------
  46.  WorldMtx: TAsphyreMatrix = nil;
  47.  ViewMtx : TAsphyreMatrix = nil;
  48.  ProjMtx : TAsphyreMatrix = nil;
  49. //--------------------------------------------------------------------------
  50. // Combined matrices and positions to be used with shaders
  51. //--------------------------------------------------------------------------
  52.  ShdrCameraPosition       : TVector3;
  53.  ShdrWorldView            : TMatrix4;
  54.  ShdrWorldViewProjection  : TMatrix4;
  55.  ShdrViewProjection       : TMatrix4;
  56.  ShdrWorldInverse         : TMatrix4;
  57.  ShdrWorldInverseTranspose: TMatrix4;
  58. //--------------------------------------------------------------------------
  59. procedure UpdateShdrCombined();
  60. //--------------------------------------------------------------------------
  61. implementation
  62. //--------------------------------------------------------------------------
  63. type
  64.  PLMatrix4 = ^TLMatrix4;
  65.  TLMatrix4 = array[0..15] of Single;
  66. //--------------------------------------------------------------------------
  67. procedure UpdateShdrCombined();
  68. var
  69.  View: PLMatrix4;
  70. begin
  71.  // -> World-View
  72.  D3DXMatrixMultiply(TD3DXMatrix(ShdrWorldView),
  73.   PD3DXMatrix(WorldMtx.RawMtx)^, PD3DXMatrix(ViewMtx.RawMtx)^);
  74.  // -> View-Projection
  75.  D3DXMatrixMultiply(TD3DXMatrix(ShdrViewProjection),
  76.   PD3DXMatrix(ViewMtx.RawMtx)^, PD3DXMatrix(ProjMtx.RawMtx)^);
  77.  // -> World-View-Projection
  78.  D3DXMatrixMultiply(TD3DXMatrix(ShdrWorldViewProjection),
  79.   PD3DXMatrix(WorldMtx.RawMtx)^, TD3DXMatrix(ShdrViewProjection));
  80.  // -> World-Inverse-Transpose
  81.  D3DXMatrixInverse(TD3DXMatrix(ShdrWorldInverse), nil,
  82.   PD3DXMatrix(WorldMtx.RawMtx)^);
  83.  D3DXMatrixTranspose(TD3DXMatrix(ShdrWorldInverseTranspose),
  84.   TD3DXMatrix(ShdrWorldInverse));
  85.  // -> View-Inverse
  86. { D3DXMatrixInverse(TD3DXMatrix(ShdrViewInverse), nil,
  87.   PD3DXMatrix(ViewMtx.RawMtx)^);
  88.  // -> Camera Position
  89.  ShdrCameraPosition.x:= ShdrViewInverse.Data[3, 0];
  90.  ShdrCameraPosition.y:= ShdrViewInverse.Data[3, 1];
  91.  ShdrCameraPosition.z:= ShdrViewInverse.Data[3, 2];}
  92.  View:= PLMatrix4(ViewMtx.RawMtx);
  93.  ShdrCameraPosition.x:= -View[0] * View[12] - View[1] * View[13] -
  94.   View[2] * View[14];
  95.  ShdrCameraPosition.y:= -View[4] * View[12] - View[5] * View[13] -
  96.   View[6] * View[14];
  97.  ShdrCameraPosition.z:= -View[8] * View[12] - View[9] * View[13] -
  98.   View[10] * View[14];
  99. // ShdrCameraPosition:= ViewMtx.Position;
  100. end;
  101. //--------------------------------------------------------------------------
  102. initialization
  103.  WorldMtx:= TAsphyreMatrix.Create();
  104.  ViewMtx := TAsphyreMatrix.Create();
  105.  ProjMtx := TAsphyreMatrix.Create();
  106. //--------------------------------------------------------------------------
  107. finalization
  108.  ProjMtx.Free();
  109.  ViewMtx.Free();
  110.  WorldMtx.Free();
  111. //--------------------------------------------------------------------------
  112. end.