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

2D图形编程

开发平台:

Delphi

  1. unit AsphyrePlaneMesh;
  2. //---------------------------------------------------------------------------
  3. // AsphyrePlaneMesh.pas                                 Modified: 27-Apr-2007
  4. // XZ plane mesh for Asphyre                                      Version 1.0
  5. //---------------------------------------------------------------------------
  6. // This code is based on the description at:
  7. //  http://www.blackpawn.com/texts/pqtorus/default.html
  8. //---------------------------------------------------------------------------
  9. // Important Notice:
  10. //
  11. // If you modify/use this code or one of its parts either in original or
  12. // modified form, you must comply with Mozilla Public License v1.1,
  13. // specifically section 3, "Distribution Obligations". Failure to do so will
  14. // result in the license breach, which will be resolved in the court.
  15. // Remember that violating author's rights is considered a serious crime in
  16. // many countries. Thank you!
  17. //
  18. // !! Please *read* Mozilla Public License 1.1 document located at:
  19. //  http://www.mozilla.org/MPL/
  20. //
  21. // If you require any clarifications about the license, feel free to contact
  22. // us or post your question on our forums at: http://www.afterwarp.net
  23. //---------------------------------------------------------------------------
  24. // The contents of this file are subject to the Mozilla Public License
  25. // Version 1.1 (the "License"); you may not use this file except in
  26. // compliance with the License. You may obtain a copy of the License at
  27. // http://www.mozilla.org/MPL/
  28. //
  29. // Software distributed under the License is distributed on an "AS IS"
  30. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  31. // License for the specific language governing rights and limitations
  32. // under the License.
  33. //
  34. // The Original Code is AsphyrePlaneMesh.pas.
  35. //
  36. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  37. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  38. // M. Sc. Yuriy Kotsarenko. All Rights Reserved.
  39. //---------------------------------------------------------------------------
  40. interface
  41. //---------------------------------------------------------------------------
  42. uses
  43.  Windows, Math, Vectors2, Vectors3, AsphyreProceduralMeshes;
  44. //---------------------------------------------------------------------------
  45. type
  46.  TAsphyrePlaneMesh = class(TAsphyreProceduralMesh)
  47.  private
  48.  public
  49.   function Generate(WidthSeg, HeightSeg: Integer; Width, Height,
  50.    TexRepX, TexRepY: Single): Boolean;
  51.  end;
  52. //---------------------------------------------------------------------------
  53. implementation
  54. //---------------------------------------------------------------------------
  55. function TAsphyrePlaneMesh.Generate(WidthSeg, HeightSeg: Integer;
  56.  Width, Height, TexRepX, TexRepY: Single): Boolean;
  57. var
  58.  i, j: Integer;
  59.  Vtx : TVector3;
  60.  Norm: TVector3;
  61.  Up  : TVector3;
  62.  Tex : TPoint2;
  63.  Tangent, Binormal: TVector3;
  64.  SideBlock: Integer;
  65. begin
  66.  Result:= CreateBuffers(WidthSeg * HeightSeg * 2, (WidthSeg + 1) * (HeightSeg + 1));
  67.  if (not Result) then Exit;
  68.  Result:= LockBuffers();
  69.  if (not Result) then Exit;
  70.  SideBlock:= WidthSeg + 1;
  71.  for j:= 0 to HeightSeg do
  72.   for i:= 0 to WidthSeg do
  73.    begin
  74.     Vtx.x:= ((i / WidthSeg) - 0.5) * Width;
  75.     Vtx.y:= 0.0;
  76.     Vtx.z:= -((j / HeightSeg) - 0.5) * Height;
  77.     Tex.x:= i * TexRepX / WidthSeg;
  78.     Tex.y:= j * TexRepY / HeightSeg;
  79.     Norm:= Vector3(0.0, 1.0, 0.0);
  80.     Up:= Vector3(0.0, 1.0, 0.0);
  81.     if (Norm.x < Norm.y) then Up:= Vector3(1.0, 0.0, 0.0);
  82.     Tangent := Norm3(Cross3(Up, Norm));
  83.     Binormal:= Norm3(Cross3(Tangent, Norm));
  84.     IncludeVertex(Vtx, Tangent, Binormal, Norm, Tex);
  85.     if (i < WidthSeg)and(j < HeightSeg) then
  86.      begin
  87.       IncludeIndex(i + j * SideBlock);
  88.       IncludeIndex((i + 1) + (j + 1) * SideBlock);
  89.       IncludeIndex(i + (j + 1) * SideBlock);
  90.       IncludeIndex(i + j * SideBlock);
  91.       IncludeIndex((i + 1) + j * SideBlock);
  92.       IncludeIndex((i + 1) + (j + 1) * SideBlock);
  93.      end;
  94.    end;
  95.  UnlockBuffers();
  96. end;
  97. //---------------------------------------------------------------------------
  98. end.