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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreMeshes;
  2. //---------------------------------------------------------------------------
  3. // AsphyreMeshes.pas                                    Modified: 09-Apr-2007
  4. // A wrapper for Direct3D meshes                                  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 AsphyreMeshes.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.  Windows, SysUtils, Direct3D9, D3DX9, AsphyreDevices;
  41. //--------------------------------------------------------------------------
  42. type
  43.  TAsphyreCustomMesh = class
  44.  private
  45.   FDevice: TAsphyreDevice;
  46.  protected
  47.   FDXMesh: ID3DXMesh;
  48.   NumMaterials: Integer;
  49.  public
  50.   property Device: TAsphyreDevice read FDevice;
  51.   property DXMesh: ID3DXMesh read FDXMesh;
  52.   function ComputeTangetBinormal(): Boolean;
  53.   function Draw(): Boolean;
  54.   constructor Create(ADevice: TAsphyreDevice);
  55.   destructor Destroy(); override;
  56.  end;
  57. //--------------------------------------------------------------------------
  58.  TAsphyreMeshX = class(TAsphyreCustomMesh)
  59.  public
  60.   function LoadFromFile(const FileName: string): Boolean;
  61.  end;
  62. //--------------------------------------------------------------------------
  63. var
  64.  TotalVerticesNo   : Integer = 0;
  65.  TotalFacesNo      : Integer = 0;
  66.  DrawPrimitiveCalls: Integer = 0;
  67. //--------------------------------------------------------------------------
  68. procedure ResetDrawInfo();
  69. //--------------------------------------------------------------------------
  70. implementation
  71. //--------------------------------------------------------------------------
  72. uses
  73.  AsphyreScene, AsphyreBasicShaders, AsphyreColors;
  74. //---------------------------------------------------------------------------
  75. const
  76.  TangentBinormalElements: array[0..5] of
  77.   TD3DVertexElement9 =
  78.  (// Position
  79.   (Stream: 0; Offset: 0; _Type: D3DDECLTYPE_FLOAT3;
  80.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_POSITION; UsageIndex: 0),
  81.   // Tangent
  82.   (Stream: 0; Offset: 12; _Type: D3DDECLTYPE_FLOAT3;
  83.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_TANGENT; UsageIndex: 0),
  84.   // Binormal
  85.   (Stream: 0; Offset: 24; _Type: D3DDECLTYPE_FLOAT3;
  86.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_BINORMAL; UsageIndex: 0),
  87.   // Normal
  88.   (Stream: 0; Offset: 36; _Type: D3DDECLTYPE_FLOAT3;
  89.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_NORMAL; UsageIndex: 0),
  90.   // TexCoord
  91.   (Stream: 0; Offset: 48; _Type: D3DDECLTYPE_FLOAT2;
  92.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_TEXCOORD; UsageIndex: 0),
  93.   // D3DDECL_END()
  94.   (Stream: $FF; Offset: 0; _Type: D3DDECLTYPE_UNUSED;
  95.    Method: TD3DDeclMethod(0); Usage: TD3DDeclUsage(0); UsageIndex: 0));
  96. //--------------------------------------------------------------------------
  97. procedure ResetDrawInfo();
  98. begin
  99.  TotalVerticesNo:= 0;
  100.  TotalFacesNo:= 0;
  101.  DrawPrimitiveCalls:= 0;
  102. end;
  103. //--------------------------------------------------------------------------
  104. constructor TAsphyreCustomMesh.Create(ADevice: TAsphyreDevice);
  105. begin
  106.  inherited Create();
  107.  FDevice:= ADevice;
  108.  FDXMesh:= nil;
  109.  NumMaterials:= 1;
  110. end;
  111. //--------------------------------------------------------------------------
  112. destructor TAsphyreCustomMesh.Destroy();
  113. begin
  114.  if (FDXMesh <> nil) then FDXMesh:= nil;
  115.  inherited;
  116. end;
  117. //--------------------------------------------------------------------------
  118. function TAsphyreCustomMesh.Draw(): Boolean;
  119. var
  120.  MaterialNo: Integer;
  121. begin
  122.  Result:= (Device <> nil)and(Device.Dev9 <> nil)and(FDXMesh <> nil);
  123.  if (not Result) then Exit;
  124.  Inc(TotalVerticesNo, FDXMesh.GetNumVertices);
  125.  Inc(TotalFacesNo, FDXMesh.GetNumFaces);
  126.  for MaterialNo:= 0 to NumMaterials - 1 do
  127.   begin
  128.    Inc(DrawPrimitiveCalls);
  129.    Result:= Succeeded(FDXMesh.DrawSubset(MaterialNo));
  130.    if (not Result) then Break;
  131.   end;
  132. end;
  133. //--------------------------------------------------------------------------
  134. function TAsphyreMeshX.LoadFromFile(const FileName: string): Boolean;
  135. var
  136.  Adjacency: ID3DXBuffer;
  137. begin
  138.  // (1) Perform validation.
  139.  Result:= (Device <> nil)and(Device.Dev9 <> nil);
  140.  if (not Result) then Exit;
  141.  // (2) Load mesh from external location.
  142.  if (Failed(D3DXLoadMeshFromX(PChar(FileName), D3DXMESH_MANAGED,
  143.   Device.Dev9, @Adjacency, nil, nil, @NumMaterials,
  144.   FDXMesh))) then Exit;
  145.  // (3) Optimize the loaded mesh. 
  146.  FDXMesh.OptimizeInplace(D3DXMESHOPT_COMPACT or D3DXMESHOPT_ATTRSORT or
  147.   D3DXMESHOPT_VERTEXCACHE, Adjacency.GetBufferPointer(), nil, nil, nil);
  148.  Adjacency:= nil;
  149. end;
  150. //--------------------------------------------------------------------------
  151. function TAsphyreCustomMesh.ComputeTangetBinormal(): Boolean;
  152. var
  153.  ClonedMesh, TangentMesh: ID3DXMesh;
  154. begin
  155.  ClonedMesh := nil;
  156.  TangentMesh:= nil;
  157.  FDXMesh.CloneMesh(D3DXMESH_MANAGED, @TangentBinormalElements[0], Device.Dev9,
  158.   ClonedMesh);
  159.  Result:= Succeeded(D3DXComputeTangentFrameEx(ClonedMesh,
  160.   Cardinal(D3DDECLUSAGE_TEXCOORD), 0,
  161.   Cardinal(D3DDECLUSAGE_TANGENT), 0,
  162.   Cardinal(D3DDECLUSAGE_BINORMAL), 0,
  163.   Cardinal(D3DDECLUSAGE_NORMAL), 0,
  164.   0, nil, 0.01, 0.25, 0.01, TangentMesh, nil));
  165.  FDXMesh:= nil;
  166.  ClonedMesh:= nil;
  167.  FDXMesh:= TangentMesh;
  168.  TangentMesh:= nil;
  169. end;
  170. //--------------------------------------------------------------------------
  171. end.