GBE.Grass.pas 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. unit GBE.Grass;
  2. (*
  3. TGBEGrass allows you to simulate vegetation in a 3D scene.
  4. Based on code by Gregory Bersegeay
  5. *)
  6. interface
  7. uses
  8. System.SysUtils,
  9. System.Classes,
  10. System.RTLConsts,
  11. FMX.Types,
  12. FMX.Controls3D,
  13. FMX.Objects3D,
  14. FMX.Graphics,
  15. System.UITypes,
  16. FMX.Materials,
  17. FMX.types3D,
  18. System.Types,
  19. System.Math.Vectors,
  20. FMX.Materialsources,
  21. System.Threading;
  22. type
  23. TGBEGrass = class(TMesh)
  24. private
  25. fWind: boolean;
  26. fTemps: single;
  27. protected
  28. procedure Render; override;
  29. public
  30. constructor Create(AOwner: TComponent); override;
  31. destructor Destroy; override;
  32. procedure GenerateGrass;
  33. published
  34. property Locked default False;
  35. property HitTest default False;
  36. property Temps: single read fTemps write fTemps;
  37. property Wind: boolean read fWind write fWind;
  38. property ZWrite default False;
  39. property Visible default True;
  40. end;
  41. procedure Register;
  42. implementation //--------------------------------------------------------------
  43. // TGBECubemap
  44. constructor TGBEGrass.Create(AOwner: TComponent);
  45. begin
  46. inherited;
  47. Wind := True;
  48. fTemps := 0;
  49. ZWrite := False;
  50. TwoSide := True;
  51. HitTest := False;
  52. GenerateGrass;
  53. end;
  54. procedure TGBEGrass.Render;
  55. var
  56. valeur: single;
  57. begin
  58. inherited;
  59. if Wind then
  60. begin
  61. TTask.Create(
  62. procedure
  63. begin
  64. fTemps := fTemps + 0.1;
  65. valeur := sin(fTemps) * 0.1;
  66. self.Data.VertexBuffer.VerticesPtr[0].X :=
  67. self.Data.VertexBuffer.VerticesPtr[2].X + valeur;
  68. self.Data.VertexBuffer.VerticesPtr[1].X :=
  69. self.Data.VertexBuffer.VerticesPtr[3].X + valeur;
  70. end).start;
  71. end;
  72. end;
  73. procedure TGBEGrass.GenerateGrass;
  74. begin
  75. self.Data.Clear;
  76. self.Data.Points := '-1 -1 0, 1 -1 0, -1 1 0, 1 1 0';
  77. // Positionnement de la texture à chaque points
  78. self.Data.TexCoordinates := '0.0 0.0, 1 0, 0.0 1, 1 1';
  79. // Création et indexation des triangles en fonction du besoin
  80. self.Data.TriangleIndices := '0 1 2 ,2 1 3';
  81. end;
  82. destructor TGBEGrass.Destroy;
  83. begin
  84. inherited;
  85. end;
  86. //---------------------------------------------------------------------------
  87. procedure Register;
  88. begin
  89. RegisterComponents('GXScene GBE', [TGBEGrass]);
  90. end;
  91. end.