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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreTorus;
  2. //---------------------------------------------------------------------------
  3. // AsphyreTorus.pas                                    Modified: 18-Apr-2007
  4. // Torus mesh implementation for 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 AsphyreTorus.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, Math, Vectors2, Vectors3, AsphyreProceduralMeshes;
  41. //---------------------------------------------------------------------------
  42. type
  43.  TAsphyreTorus = class(TAsphyreProceduralMesh)
  44.  private
  45.  public
  46.   function Generate(Radius, TubeRadius: Single; Rings,
  47.    Sides: Integer; TexTilesX, TexTilesY: Single): Boolean;
  48.  end;
  49. //---------------------------------------------------------------------------
  50. implementation
  51. //---------------------------------------------------------------------------
  52. function TAsphyreTorus.Generate(Radius, TubeRadius: Single; Rings,
  53.  Sides: Integer; TexTilesX, TexTilesY: Single): Boolean;
  54. var
  55.  SideBlock: Integer;
  56.  i, j, ni, nj: Integer;
  57.  Theta, ThetaInc: Single;
  58.  Phi, PhiInc, Delta: Single;
  59.  CosTheta, SinTheta: Single;
  60.  CosPhi, SinPhi: Single;
  61. begin
  62.  SideBlock:= Sides + 1;
  63.  Result:= CreateBuffers(Rings * Sides * 2, (Rings + 1) * SideBlock);
  64.  if (not Result) then Exit;
  65.  Result:= LockBuffers();
  66.  if (not Result) then Exit;
  67.  Theta:= 0.0;
  68.  ThetaInc:= 2.0 * Pi / Rings;
  69.  PhiInc:= 2.0 * Pi / Sides;
  70.  for j:= 0 to Rings do
  71.   begin
  72.    CosTheta:= Cos(Theta);
  73.    SinTheta:= Sin(Theta);
  74.    Phi:= 0.0;
  75.    for i:= 0 to Sides do
  76.     begin
  77.      CosPhi:= Cos(Phi);
  78.      SinPhi:= Sin(Phi);
  79.      Delta := Radius + TubeRadius * CosPhi;
  80.      IncludeVertex(
  81.       Vector3(CosTheta * Delta, TubeRadius * SinPhi, -SinTheta * Delta),
  82.       Vector3(CosTheta * CosPhi, SinPhi, -SinTheta * CosPhi),
  83.       Point2(Theta * TexTilesX / (2.0 * Pi), Phi * TexTilesY / (2.0 * Pi)));
  84.      ni:= i + 1;
  85.      nj:= j + 1;
  86.      if (i < Sides)and(j < Rings) then
  87.       begin
  88.        IncludeIndex(i + j * SideBlock);
  89.        IncludeIndex(i + nj * SideBlock);
  90.        IncludeIndex(ni + nj * SideBlock);
  91.        IncludeIndex(i + j * SideBlock);
  92.        IncludeIndex(ni + nj * SideBlock);
  93.        IncludeIndex(ni + j * SideBlock);
  94.       end;
  95.      Phi:= Phi + PhiInc;
  96.     end;
  97.    Theta:= Theta + ThetaInc;
  98.   end;
  99.   
  100.  UnlockBuffers();
  101. end;
  102. //---------------------------------------------------------------------------
  103. end.