fSmoothNaviD.pas 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. unit fSmoothNaviD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. System.Classes,
  6. System.SysUtils,
  7. Vcl.Graphics,
  8. Vcl.Controls,
  9. Vcl.Forms,
  10. Vcl.ExtCtrls,
  11. Vcl.StdCtrls,
  12. Stage.Keyboard,
  13. GLS.Coordinates,
  14. GLS.BaseClasses,
  15. GLS.XCollection,
  16. Stage.VectorGeometry,
  17. GLS.Cadencer,
  18. GLS.SceneViewer,
  19. GLS.GeomObjects,
  20. GLS.Scene,
  21. GLS.Objects,
  22. GLS.Graph,
  23. GLS.SmoothNavigator,
  24. GLS.Screen;
  25. type
  26. TFormSmoothnavi = class(TForm)
  27. GLScene1: TGLScene;
  28. GLCadencer1: TGLCadencer;
  29. GLCamera1: TGLCamera;
  30. scene: TGLDummyCube;
  31. FPSTimer: TTimer;
  32. GLSceneViewer1: TGLSceneViewer;
  33. Panel3: TPanel;
  34. MouseLookCheckBox: TCheckBox;
  35. GLLightSource1: TGLLightSource;
  36. GLSphere1: TGLSphere;
  37. GLXYZGrid1: TGLXYZGrid;
  38. GLArrowLine1: TGLArrowLine;
  39. GroupBox2: TGroupBox;
  40. RadioButton6: TRadioButton;
  41. RadioButton7: TRadioButton;
  42. RadioButton8: TRadioButton;
  43. GroupBox1: TGroupBox;
  44. Label1: TLabel;
  45. Panel1: TPanel;
  46. procedure GLCadencer1Progress(Sender: TObject; const DeltaTime, newTime: Double);
  47. procedure FPSTimerTimer(Sender: TObject);
  48. procedure FormCreate(Sender: TObject);
  49. procedure FormKeyPress(Sender: TObject; var Key: Char);
  50. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  51. procedure MouseLookCheckBoxClick(Sender: TObject);
  52. procedure RadioButton6Click(Sender: TObject);
  53. procedure RadioButton7Click(Sender: TObject);
  54. procedure RadioButton8Click(Sender: TObject);
  55. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  56. X, Y: Integer);
  57. procedure GLSceneViewer1MouseDown(Sender: TObject;
  58. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  59. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  60. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  61. private
  62. UI: TGLSmoothUserInterface;
  63. Navigator: TGLSmoothNavigator;
  64. RealPos: TPoint;
  65. ShiftState: TShiftState;
  66. xx, yy: Integer;
  67. NewXX, NewYY: Integer;
  68. procedure CheckControls(DeltaTime, newTime: Double);
  69. public
  70. end;
  71. var
  72. FormSmoothnavi: TFormSmoothnavi;
  73. implementation
  74. {$R *.dfm}
  75. procedure TFormSmoothnavi.FormCreate(Sender: TObject);
  76. begin
  77. Navigator := TGLSmoothNavigator.Create(Self);
  78. Navigator.AngleLock := False;
  79. Navigator.AutoUpdateObject := False;
  80. Navigator.InvertHorizontalSteeringWhenUpsideDown := True;
  81. Navigator.MoveUpWhenMovingForward := True;
  82. Navigator.UseVirtualUp := True;
  83. Navigator.VirtualUp.AsAffineVector := YVector;
  84. Navigator.MovingObject := GLCamera1;
  85. Navigator.InertiaParams.MovementAcceleration := 7;
  86. Navigator.InertiaParams.MovementInertia := 200;
  87. Navigator.InertiaParams.MovementSpeed := 200;
  88. Navigator.InertiaParams.TurnInertia := 150;
  89. Navigator.InertiaParams.TurnSpeed := 40;
  90. Navigator.InertiaParams.TurnMaxAngle := 0.5;
  91. Navigator.MoveAroundParams.TargetObject := GLArrowLine1;
  92. UI := TGLSmoothUserInterface.Create(Self);
  93. // UI.AutoUpdateMouse := False;
  94. UI.SmoothNavigator := Navigator;
  95. end;
  96. procedure TFormSmoothnavi.CheckControls(DeltaTime, newtime: Double);
  97. var
  98. NeedToAccelerate: Boolean;
  99. begin
  100. NeedToAccelerate := isKeyDown(VK_SHIFT);
  101. Navigator.StrafeVertical(isKeyDown('F'), isKeyDown('R'), DeltaTime, NeedToAccelerate);
  102. Navigator.MoveForward(isKeyDown('W'), isKeyDown('S'), DeltaTime, NeedToAccelerate);
  103. Navigator.StrafeHorizontal(isKeyDown('D'), isKeyDown('A'), DeltaTime, NeedToAccelerate);
  104. // GetCursorPos(RealPos);
  105. UI.MouseLook({RealPos, }DeltaTime);
  106. // if UI.MouseLookActive then
  107. // SetCursorPos(Round(UI.OriginalMousePos.X), Round(UI.OriginalMousePos.Y));
  108. end;
  109. procedure TFormSmoothnavi.GLCadencer1Progress(Sender: TObject; const DeltaTime, newTime: Double);
  110. begin
  111. GLSceneViewer1.Invalidate;
  112. if UI.MouseLookActive then
  113. CheckControls(DeltaTime, newtime)
  114. else
  115. begin
  116. if (ssRight in ShiftState) and (ssLeft in ShiftState) then
  117. begin
  118. Navigator.MoveAroundTarget(0, 0, DelTaTime);
  119. Navigator.AdjustDistanceToTarget(yy - NewYY, DelTaTime)
  120. end
  121. else if (ssRight in ShiftState) or (ssLeft in ShiftState) then
  122. begin
  123. Navigator.MoveAroundTarget(yy - NewYY, xx - NewXX, DelTaTime);
  124. Navigator.AdjustDistanceToTarget(0, DelTaTime);
  125. end
  126. else
  127. begin
  128. Navigator.MoveAroundTarget(0, 0, DelTaTime);
  129. Navigator.AdjustDistanceToTarget(0, DelTaTime);
  130. end;
  131. xx := NewXX;
  132. yy := NewYY;
  133. end;
  134. end;
  135. procedure TFormSmoothnavi.FPSTimerTimer(Sender: TObject);
  136. begin
  137. Caption := 'Smooth Navigator - ' + GLSceneViewer1.FramesPerSecondText;
  138. Navigator.AutoScaleParameters(GLSceneViewer1.FramesPerSecond);
  139. GLSceneViewer1.ResetPerformanceMonitor;
  140. end;
  141. procedure TFormSmoothnavi.MouseLookCheckBoxClick(Sender: TObject);
  142. begin
  143. if MouseLookCheckBox.Checked then
  144. begin
  145. GLCamera1.TargetObject := nil;
  146. GLCamera1.PointTo(GLArrowLine1, YHmgVector);
  147. UI.MouseLookActive := True;
  148. GetCursorPos(RealPos);
  149. // UI.OriginalMousePos.SetPoint2D(RealPos.X, RealPos.Y);
  150. // ShowCursor(False);
  151. end
  152. else
  153. begin
  154. UI.MouseLookActive := False;
  155. // ShowCursor(True);
  156. GLCamera1.Up.SetVector(0, 1, 0);
  157. GLCamera1.TargetObject := GLArrowLine1;
  158. end;
  159. end;
  160. procedure TFormSmoothnavi.FormKeyPress(Sender: TObject; var Key: Char);
  161. begin
  162. if Key = Char(VK_SPACE) then
  163. MouseLookCheckBoxClick(Self);
  164. if Key = Char(VK_ESCAPE) then
  165. Close;
  166. end;
  167. procedure TFormSmoothnavi.FormClose(Sender: TObject; var Action: TCloseAction);
  168. begin
  169. GLSceneViewer1.Enabled := False;
  170. GLCadencer1.Enabled := False;
  171. FPSTimer.Enabled := False;
  172. FreeAndNil(UI);
  173. FreeAndNil(Navigator);
  174. GLShowCursor(True);
  175. end;
  176. procedure TFormSmoothnavi.RadioButton6Click(Sender: TObject);
  177. begin
  178. GLCadencer1.FixedDeltaTime := 0;
  179. end;
  180. procedure TFormSmoothnavi.RadioButton7Click(Sender: TObject);
  181. begin
  182. GLCadencer1.FixedDeltaTime := 0.01;
  183. end;
  184. procedure TFormSmoothnavi.RadioButton8Click(Sender: TObject);
  185. begin
  186. GLCadencer1.FixedDeltaTime := 0.1;
  187. end;
  188. procedure TFormSmoothnavi.GLSceneViewer1MouseMove(Sender: TObject;
  189. Shift: TShiftState; X, Y: Integer);
  190. begin
  191. ShiftState := Shift;
  192. NewXX := X;
  193. NewYY := Y;
  194. end;
  195. procedure TFormSmoothnavi.GLSceneViewer1MouseDown(Sender: TObject;
  196. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  197. begin
  198. xx := x;
  199. yy := y;
  200. end;
  201. procedure TFormSmoothnavi.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  202. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  203. begin
  204. // (WheelDelta / Abs(WheelDelta) is used to deternime the sign.
  205. Navigator.AdjustDistanceParams.AddImpulse((WheelDelta / Abs(WheelDelta)));
  206. end;
  207. end.