fdTerrain.pas 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. unit fdTerrain;
  2. interface
  3. uses
  4. System.SysUtils,
  5. System.Types,
  6. System.UITypes,
  7. System.Classes,
  8. System.Variants,
  9. System.Math.Vectors,
  10. FMX.Types,
  11. FMX.Controls,
  12. FMX.Forms,
  13. FMX.Graphics,
  14. FMX.Dialogs,
  15. FMX.Controls3D,
  16. FMX.Objects3D,
  17. FMX.Viewport3D,
  18. FMX.Controls.Presentation,
  19. FMX.StdCtrls,
  20. FMX.Layouts,
  21. FMX.Edit,
  22. FMX.EditBox,
  23. FMX.NumberBox,
  24. FMX.Types3D,
  25. FMX.MaterialSources,
  26. FMX.Ani,
  27. FMX.Objects,
  28. GBE.Terrain;
  29. type
  30. TFormTerrain = class(TForm)
  31. Viewport3D1: TViewport3D;
  32. Layout1: TLayout;
  33. Button1: TButton;
  34. Label1: TLabel;
  35. nbAmplitude: TNumberBox;
  36. Label2: TLabel;
  37. nbRoughness: TNumberBox;
  38. FloatAnimation1: TFloatAnimation;
  39. Label3: TLabel;
  40. nbSubdivX: TNumberBox;
  41. Label4: TLabel;
  42. nbSubdivZ: TNumberBox;
  43. Label5: TLabel;
  44. nbOctaves: TNumberBox;
  45. rbTexture: TRadioButton;
  46. rbRamp: TRadioButton;
  47. tmsTexture: TTextureMaterialSource;
  48. tmsRamp: TTextureMaterialSource;
  49. Layout2: TLayout;
  50. Label6: TLabel;
  51. ColorMaterialSource1: TColorMaterialSource;
  52. cbShowLines: TCheckBox;
  53. Rectangle1: TRectangle;
  54. cbWater: TCheckBox;
  55. pWater: TPlane;
  56. ColorMaterialSource2: TColorMaterialSource;
  57. Label7: TLabel;
  58. nbSeaRise: TNumberBox;
  59. dmyScene: TDummy;
  60. Cylinder1: TCylinder;
  61. Cylinder2: TCylinder;
  62. FloatAnimation2: TFloatAnimation;
  63. FloatAnimation3: TFloatAnimation;
  64. procedure Button1Click(Sender: TObject);
  65. procedure rbTextureClick(Sender: TObject);
  66. procedure rbRampChange(Sender: TObject);
  67. procedure GBETerrainRender(Sender: TObject; Context: TContext3D);
  68. procedure nbSeaRiseChange(Sender: TObject);
  69. procedure FormCreate(Sender: TObject);
  70. procedure FloatAnimation2Process(Sender: TObject);
  71. private
  72. procedure GenerateTerrain;
  73. public
  74. GBETerrain : TGBETerrain;
  75. end;
  76. var
  77. FormTerrain: TFormTerrain;
  78. implementation //------------------------------------------------------------
  79. {$R *.fmx}
  80. procedure TFormTerrain.Button1Click(Sender: TObject);
  81. begin
  82. GenerateTerrain;
  83. end;
  84. procedure TFormTerrain.FloatAnimation2Process(Sender: TObject);
  85. begin
  86. Cylinder1.Position.Y := GBETerrain.GetHeight(Cylinder1.Position.Point);
  87. end;
  88. procedure TFormTerrain.FormCreate(Sender: TObject);
  89. begin
  90. GBETerrain := TGBETerrain.Create(dmyScene);
  91. GBETerrain.Depth := 96;
  92. GBETerrain.Width := 96;
  93. GBETerrain.Height := 10;
  94. GBETerrain.MaterialSource := tmsTexture;
  95. GBETerrain.TwoSide := true;
  96. GBETerrain.Parent := dmyScene;
  97. GBETerrain.OnRender := GBETerrainRender;
  98. Cylinder1.Parent := GBETerrain;
  99. end;
  100. procedure TFormTerrain.GBETerrainRender(Sender: TObject; Context: TContext3D);
  101. begin
  102. if cbShowLines.IsChecked then Context.DrawLines(GBETerrain.Data.VertexBuffer, GBETerrain.Data.IndexBuffer, TMaterialSource.ValidMaterial(ColorMaterialSource1), 1);
  103. pWater.Visible := cbWater.IsChecked;
  104. end;
  105. procedure TFormTerrain.GenerateTerrain;
  106. begin
  107. layout2.Visible := true;
  108. FloatAnimation1.Stop;
  109. GBETerrain.clean;
  110. GBETerrain.Amplitude := nbAmplitude.Value;
  111. GBETerrain.Roughness := nbRoughness.Value;
  112. GBETerrain.SubdivX := trunc(nbSubdivX.Value);
  113. GBETerrain.SubdivZ := trunc(nbSubdivZ.Value);
  114. GBETerrain.Octaves := trunc(nbOctaves.value);
  115. GBETerrain.GenerateTerrain;
  116. FloatAnimation1.Start;
  117. FloatAnimation2.Start;
  118. FloatAnimation3.Start;
  119. layout2.Visible := false;
  120. end;
  121. procedure TFormTerrain.nbSeaRiseChange(Sender: TObject);
  122. begin
  123. pWater.Position.Y := nbSeaRise.Value;
  124. end;
  125. procedure TFormTerrain.rbRampChange(Sender: TObject);
  126. begin
  127. GBETerrain.MaterialSource := tmsRamp;
  128. GBETerrain.UseRamp := true;
  129. generateTerrain;
  130. end;
  131. procedure TFormTerrain.rbTextureClick(Sender: TObject);
  132. begin
  133. GBETerrain.MaterialSource := tmsTexture;
  134. GBETerrain.UseRamp := false;
  135. GenerateTerrain;
  136. end;
  137. end.