fFxyD.pas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. unit fFxyD;
  2. interface
  3. uses
  4. System.SysUtils,
  5. System.Classes,
  6. System.Math,
  7. System.Types,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.StdCtrls,
  12. Vcl.ComCtrls,
  13. Vcl.ExtCtrls,
  14. GLS.Objects,
  15. GLS.Graph,
  16. GLS.Scene,
  17. GLS.VectorGeometry,
  18. GLS.VectorTypes,
  19. GLS.SceneViewer,
  20. GLS.Coordinates,
  21. GLS.BaseClasses, GLS.AsyncTimer;
  22. type
  23. TFormFxy = class(TForm)
  24. GLScene1: TGLScene;
  25. GLSceneViewer1: TGLSceneViewer;
  26. GLCamera1: TGLCamera;
  27. GLLightSource1: TGLLightSource;
  28. HeightField1: TGLHeightField;
  29. YZGrid: TGLXYZGrid;
  30. XZGrid: TGLXYZGrid;
  31. XYGrid: TGLXYZGrid;
  32. Panel1: TPanel;
  33. CBCentered: TCheckBox;
  34. Label1: TLabel;
  35. TBXYPosition: TTrackBar;
  36. TBYZPosition: TTrackBar;
  37. TBXZPosition: TTrackBar;
  38. Label2: TLabel;
  39. Label3: TLabel;
  40. Label4: TLabel;
  41. GLAsyncTimer1: TGLAsyncTimer;
  42. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  43. Shift: TShiftState; X, Y: Integer);
  44. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  45. X, Y: Integer);
  46. procedure CBCenteredClick(Sender: TObject);
  47. procedure TBXYPositionChange(Sender: TObject);
  48. procedure TBYZPositionChange(Sender: TObject);
  49. procedure TBXZPositionChange(Sender: TObject);
  50. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  51. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  52. procedure HeightField1GetHeight(const X, Y: Single; var z: Single;
  53. var Color: TVector4f; var TexPoint: TTexPoint);
  54. procedure GLAsyncTimer1Timer(Sender: TObject);
  55. public
  56. mx, my: Integer;
  57. end;
  58. var
  59. FormFxy: TFormFxy;
  60. // ----------------------------------
  61. implementation
  62. // ----------------------------------
  63. {$R *.DFM}
  64. procedure TFormFxy.HeightField1GetHeight(const X, Y: Single; var z: Single;
  65. var Color: TVector4f; var TexPoint: TTexPoint);
  66. begin
  67. z := VectorNorm(X, Y);
  68. z := cos(z * 12) / (2 * (z * 6.28 + 1));
  69. end;
  70. procedure TFormFxy.CBCenteredClick(Sender: TObject);
  71. begin
  72. if CBCentered.Checked then
  73. begin
  74. XZGrid.YSamplingScale.Origin := 0;
  75. YZGrid.XSamplingScale.Origin := 0;
  76. XYGrid.ZSamplingScale.Origin := 0;
  77. end
  78. else
  79. begin
  80. XZGrid.YSamplingScale.Origin := -1;
  81. YZGrid.XSamplingScale.Origin := -1;
  82. XYGrid.ZSamplingScale.Origin := -1;
  83. end;
  84. end;
  85. procedure TFormFxy.TBXYPositionChange(Sender: TObject);
  86. begin
  87. XYGrid.ZSamplingScale.Origin := -(TBXYPosition.Position / 10);
  88. end;
  89. procedure TFormFxy.TBYZPositionChange(Sender: TObject);
  90. begin
  91. YZGrid.XSamplingScale.Origin := -(TBYZPosition.Position / 10);
  92. end;
  93. procedure TFormFxy.TBXZPositionChange(Sender: TObject);
  94. begin
  95. XZGrid.YSamplingScale.Origin := -(TBXZPosition.Position / 10);
  96. end;
  97. // following code takes care of camera movement, see camera & movement demos
  98. // for explanations and more samples
  99. procedure TFormFxy.GLAsyncTimer1Timer(Sender: TObject);
  100. begin
  101. HeightField1.StructureChanged;
  102. end;
  103. procedure TFormFxy.GLSceneViewer1MouseDown(Sender: TObject;
  104. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  105. begin
  106. mx := X;
  107. my := Y;
  108. end;
  109. procedure TFormFxy.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  110. X, Y: Integer);
  111. begin
  112. if Shift <> [] then
  113. begin
  114. GLCamera1.MoveAroundTarget(my - Y, mx - X);
  115. mx := X;
  116. my := Y;
  117. end;
  118. end;
  119. procedure TFormFxy.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  120. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  121. begin
  122. GLCamera1 := GLSceneViewer1.Camera;
  123. // Note that 1 wheel-step induces a WheelDelta of 120,
  124. // this code adjusts the distance to target with a 10% per wheel-step ratio
  125. GLCamera1.AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
  126. end;
  127. end.