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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreProceduralMeshes;
  2. //---------------------------------------------------------------------------
  3. // AsphyreProceduralMeshes.pas                          Modified: 02-Apr-2007
  4. // The base framework for Asphyre procedural 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 AsphyreProceduralMeshes.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. // Enable the following option to enable the generation and usage of
  40. // texture coordinates.
  41. //---------------------------------------------------------------------------
  42. {$define IncludeTexCoords}
  43. //---------------------------------------------------------------------------
  44. uses
  45.  Windows, Direct3D9, D3DX9, Vectors2, Vectors3, AsphyreMeshes;
  46. //---------------------------------------------------------------------------
  47. type
  48.  PFlexibleVertex = ^TFlexibleVertex;
  49. (* TFlexibleVertex = record
  50.   Position: TVector3;
  51.   Normal  : TVector3;
  52.   {$ifdef IncludeTexCoords}
  53.   TexCoord: TPoint2;
  54.   {$endif}
  55.  end;*)
  56.  TFlexibleVertex = record
  57.   Position: TVector3;
  58.   Tangent : TVector3;
  59.   Binormal: TVector3;
  60.   Normal  : TVector3;
  61.   TexCoord: TPoint2;
  62.  end;
  63. //---------------------------------------------------------------------------
  64.  TAsphyreProceduralMesh = class(TAsphyreCustomMesh)
  65.  private
  66.   CurVertex: PFlexibleVertex;
  67.   CurIndex : PWord;
  68.  protected
  69.   function CreateBuffers(Faces, Vertices: Integer): Boolean;
  70.   function LockBuffers(): Boolean;
  71.   procedure UnlockBuffers();
  72.   procedure IncludeVertex(const Position, Normal: TVector3;
  73.    const TexCoord: TPoint2); overload;
  74.   procedure IncludeVertex(const Position, Tangent, Binormal,
  75.    Normal: TVector3; const TexCoord: TPoint2); overload;
  76.   procedure IncludeIndex(Index: Integer);
  77.  end;
  78. //---------------------------------------------------------------------------
  79. implementation
  80. //---------------------------------------------------------------------------
  81. uses
  82.  SysUtils;
  83. //---------------------------------------------------------------------------
  84. const
  85. (* {$ifdef IncludeTexCoords}
  86.  VertexElementNo = 4;
  87.  {$else}
  88.  VertexElementNo = 3;
  89.  {$endif}*)
  90.  VertexElementNo = 6;
  91. //---------------------------------------------------------------------------
  92. (* VertexElements: array[0..VertexElementNo - 1] of TD3DVertexElement9 =
  93.  (// Position
  94.   (Stream: 0; Offset: 0; _Type: D3DDECLTYPE_FLOAT3;
  95.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_POSITION; UsageIndex: 0),
  96.   // Normal
  97.   (Stream: 0; Offset: 12; _Type: D3DDECLTYPE_FLOAT3;
  98.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_NORMAL; UsageIndex: 0),
  99.   {$ifdef IncludeTexCoords}
  100.   // TexCoord
  101.   (Stream: 0; Offset: 24; _Type: D3DDECLTYPE_FLOAT2;
  102.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_TEXCOORD; UsageIndex: 0),
  103.   {$endif}
  104.   // D3DDECL_END()
  105.   (Stream: $FF; Offset: 0; _Type: D3DDECLTYPE_UNUSED;
  106.    Method: TD3DDeclMethod(0); Usage: TD3DDeclUsage(0); UsageIndex: 0));*)
  107.  VertexElements: array[0..VertexElementNo - 1] of TD3DVertexElement9 =
  108.  (// Position
  109.   (Stream: 0; Offset: 0; _Type: D3DDECLTYPE_FLOAT3;
  110.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_POSITION; UsageIndex: 0),
  111.   // Tangent
  112.   (Stream: 0; Offset: 12; _Type: D3DDECLTYPE_FLOAT3;
  113.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_TANGENT; UsageIndex: 0),
  114.   // Binormal
  115.   (Stream: 0; Offset: 24; _Type: D3DDECLTYPE_FLOAT3;
  116.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_BINORMAL; UsageIndex: 0),
  117.   // Normal
  118.   (Stream: 0; Offset: 36; _Type: D3DDECLTYPE_FLOAT3;
  119.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_NORMAL; UsageIndex: 0),
  120.   // TexCoord
  121.   (Stream: 0; Offset: 48; _Type: D3DDECLTYPE_FLOAT2;
  122.    Method: D3DDECLMETHOD_DEFAULT; Usage: D3DDECLUSAGE_TEXCOORD; UsageIndex: 0),
  123.   // D3DDECL_END()
  124.   (Stream: $FF; Offset: 0; _Type: D3DDECLTYPE_UNUSED;
  125.    Method: TD3DDeclMethod(0); Usage: TD3DDeclUsage(0); UsageIndex: 0));
  126. //---------------------------------------------------------------------------
  127. function TAsphyreProceduralMesh.CreateBuffers(Faces, Vertices: Integer): Boolean;
  128. begin
  129.  if (FDXMesh <> nil) then FDXMesh:= nil;
  130.  Result:= Succeeded(D3DXCreateMesh(Faces, Vertices, D3DXMESH_MANAGED,
  131.   @VertexElements[0], Device.Dev9, FDXMesh));
  132. end;
  133. //---------------------------------------------------------------------------
  134. function TAsphyreProceduralMesh.LockBuffers(): Boolean;
  135. begin
  136.  if (FDXMesh = nil) then
  137.   begin
  138.    Result:= False;
  139.    Exit;
  140.   end;
  141.  Result:= Succeeded(FDXMesh.LockVertexBuffer(0, Pointer(CurVertex)));
  142.  if (not Result) then Exit;
  143.  Result:= Succeeded(FDXMesh.LockIndexBuffer(0, Pointer(CurIndex)));
  144.  if (not Result) then Exit;
  145. end;
  146. //---------------------------------------------------------------------------
  147. procedure TAsphyreProceduralMesh.UnlockBuffers();
  148. begin
  149.  if (FDXMesh <> nil) then
  150.   begin
  151.    FDXMesh.UnlockIndexBuffer();
  152.    FDXMesh.UnlockVertexBuffer();
  153.   end;
  154. end;
  155. //---------------------------------------------------------------------------
  156. procedure TAsphyreProceduralMesh.IncludeVertex(const Position, Normal: TVector3;
  157.  const TexCoord: TPoint2);
  158. begin
  159.  CurVertex.Position:= Position;
  160.  CurVertex.Normal  := Normal;
  161.  {$ifdef IncludeTexCoords}
  162.  CurVertex.TexCoord:= TexCoord;
  163.  {$endif}
  164.  Inc(CurVertex);
  165. end;
  166. //---------------------------------------------------------------------------
  167. procedure TAsphyreProceduralMesh.IncludeIndex(Index: Integer);
  168. begin
  169.  CurIndex^:= Index;
  170.  Inc(CurIndex);
  171. end;
  172. //---------------------------------------------------------------------------
  173. procedure TAsphyreProceduralMesh.IncludeVertex(const Position, Tangent,
  174.  Binormal, Normal: TVector3; const TexCoord: TPoint2);
  175. begin
  176.  CurVertex.Position:= Position;
  177.  CurVertex.Tangent := Tangent;
  178.  CurVertex.Binormal:= Binormal;
  179.  CurVertex.Normal  := Normal;
  180.  CurVertex.TexCoord:= TexCoord;
  181.  Inc(CurVertex);
  182. end;
  183. //---------------------------------------------------------------------------
  184. (*procedure TAsphyreProceduralMesh.OptimizeMesh();
  185. var
  186.  Adjacency: ID3DXBuffer;
  187. begin
  188.  D3DXCreateBuffer(3 * FMesh.GetNumFaces * SizeOf(Longword), Adjacency);
  189.  FMesh.GenerateAdjacency(0.01, Adjacency.GetBufferPointer());
  190.  FMesh.OptimizeInplace({D3DXMESHOPT_COMPACT or D3DXMESHOPT_ATTRSORT or
  191.   D3DXMESHOPT_VERTEXCACHE or }D3DXMESHOPT_STRIPREORDER,
  192.   Adjacency.GetBufferPointer(), nil, nil, nil);
  193.  Adjacency:= nil;
  194. end;*)
  195. //---------------------------------------------------------------------------
  196. end.