fCameraControllerC.cpp 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <tchar.h>
  4. #pragma hdrstop
  5. #include "fCameraControllerC.h"
  6. //---------------------------------------------------------------------------
  7. #pragma package(smart_init)
  8. #pragma link "GLS.BaseClasses"
  9. #pragma link "GLS.Cadencer"
  10. #pragma link "GLS.CameraController"
  11. #pragma link "GLS.Coordinates"
  12. #pragma link "GLS.GeomObjects"
  13. #pragma link "GLS.Graph"
  14. #pragma link "GLS.Material"
  15. #pragma link "GLS.Navigator"
  16. #pragma link "GLS.Objects"
  17. #pragma link "GLS.Scene"
  18. #pragma link "GLS.SmoothNavigator"
  19. #pragma link "GLS.SceneViewer"
  20. #pragma resource "*.dfm"
  21. TForm1 *Form1;
  22. //---------------------------------------------------------------------------
  23. __fastcall TForm1::TForm1(TComponent* Owner)
  24. : TForm(Owner)
  25. {
  26. }
  27. //---------------------------------------------------------------------------
  28. void __fastcall TForm1::GetInput(TButton *Sender)
  29. {
  30. FCameraSmoothAnimator_AbsPos->Enabled = false;
  31. FCameraSmoothAnimator_RelPos->Enabled = false;
  32. if ((Sender == btnMoveToPos) ||
  33. (Sender == btnOrbitToPos) ||
  34. (Sender == btnOrbitToPosAdv) ||
  35. (Sender == btnSafeOrbitAndZoomToPos) ||
  36. (Sender == btSmoothOrbit) ||
  37. (Sender == btSmoothOrbitAndZoom) ||
  38. (Sender == btSmoothOrbitToPosAdv))
  39. {
  40. DextX = StrToFloatDef(eDestX->Text);
  41. DextY = StrToFloatDef(eDestY->Text);
  42. DextZ = StrToFloatDef(eDestZ->Text);
  43. }
  44. if ((Sender == btnMoveToPos) ||
  45. (Sender->Name == "btnZoomToDistance") ||
  46. (Sender->Name == "btnOrbitToPosAdv") ||
  47. (Sender->Name == "btnOrbitToPos"))
  48. Time = StrToFloat(eTime->Text);
  49. if (Sender->Name=="btnZoomToDistance")
  50. ZoomDistance = StrToFloat(eDistance->Text);
  51. if (Sender->Name=="btnSafeOrbitAndZoomToPos")
  52. {
  53. FGLCameraController->soSafeDistance = StrToFloat(eSafeDistance->Text);
  54. FGLCameraController->soTimeToSafePlacement = StrToFloat(eTimeToSafePlacement->Text);
  55. FGLCameraController->soTimeToOrbit = StrToFloat(eTimeToOrbit->Text);
  56. FGLCameraController->soTimeToZoomBackIn = StrToFloat(eTimeToZoomBackIn->Text);
  57. }
  58. }
  59. //---------------------------------------------------------------------------
  60. TGLVector __fastcall TForm1::OnGetCameraPosition(
  61. TGLNavigatorSmoothChangeVector* const ASender)
  62. {
  63. if (ASender == FCameraSmoothAnimator_AbsPos)
  64. return GLCamera->AbsolutePosition;
  65. else
  66. return GLCamera->Position->DirectVector;
  67. }
  68. //---------------------------------------------------------------------------
  69. void __fastcall TForm1::OnSetCameraPosition(TGLNavigatorSmoothChangeVector* const ASender,
  70. const TVector4f &AValue)
  71. {
  72. if (ASender == FCameraSmoothAnimator_AbsPos)
  73. GLCamera->AbsolutePosition = AValue;
  74. else
  75. GLCamera->Position->AsVector = AValue;
  76. }
  77. //---------------------------------------------------------------------------
  78. void __fastcall TForm1::FormCreate(TObject *Sender)
  79. {
  80. FGLCameraController = GLCameraController1;
  81. FCameraSmoothAnimator_AbsPos =
  82. new (TGLNavigatorSmoothChangeVector)(GLSmoothNavigator->CustomAnimatedItems);
  83. FCameraSmoothAnimator_AbsPos->Enabled = false;
  84. FCameraSmoothAnimator_AbsPos->Inertia = 0.6;
  85. FCameraSmoothAnimator_AbsPos->Speed = 1;
  86. FCameraSmoothAnimator_AbsPos->SpeedLimit = 5000;
  87. FCameraSmoothAnimator_AbsPos->Cutoff = 0.0001;
  88. FCameraSmoothAnimator_AbsPos->OnGetCurrentValue = OnGetCameraPosition;
  89. FCameraSmoothAnimator_AbsPos->OnSetCurrentValue = OnSetCameraPosition;
  90. FCameraSmoothAnimator_RelPos =
  91. new (TGLNavigatorSmoothChangeVector)(GLSmoothNavigator->CustomAnimatedItems);
  92. FCameraSmoothAnimator_RelPos->Assign(FCameraSmoothAnimator_AbsPos);
  93. GLSmoothNavigator->MovingObject = GLCamera;
  94. GLSmoothNavigator->MoveAroundParams->TargetObject = GLCamera->TargetObject;
  95. }
  96. //---------------------------------------------------------------------------
  97. void __fastcall TForm1::btnMoveToPosClick(TObject *Sender)
  98. {
  99. GetInput(btnMoveToPos);
  100. FGLCameraController->MoveToPos(DextX, DextY, DextZ, Time);
  101. }
  102. //---------------------------------------------------------------------------
  103. void __fastcall TForm1::btnZoomToDistanceClick(TObject *Sender)
  104. {
  105. GetInput(btnZoomToDistance);
  106. FGLCameraController->ZoomToDistance(ZoomDistance,Time);
  107. }
  108. //---------------------------------------------------------------------------
  109. void __fastcall TForm1::btnOrbitToPosClick(TObject *Sender)
  110. {
  111. TGLVector lTargetPosition;
  112. GetInput(btnOrbitToPos);
  113. lTargetPosition = dcSphere->LocalToAbsolute(PointMake(DextX, DextY, DextZ));
  114. FGLCameraController->OrbitToPos(lTargetPosition.X,
  115. lTargetPosition.Y, lTargetPosition.Z, Time);
  116. }
  117. //---------------------------------------------------------------------------
  118. void __fastcall TForm1::btnSafeOrbitAndZoomToPosClick(TObject *Sender)
  119. {
  120. GetInput(btnSafeOrbitAndZoomToPos);
  121. FGLCameraController->SafeOrbitAndZoomToPos(DextX, DextY, DextZ);
  122. }
  123. //---------------------------------------------------------------------------
  124. void __fastcall TForm1::btSmoothOrbitAndZoomClick(TObject *Sender)
  125. {
  126. btSmoothOrbitClick(btSmoothOrbitAndZoom);
  127. GLSmoothNavigator->AdjustDistanceParams->AddImpulse(Sign(Random() - 0.5) * 10);
  128. }
  129. //---------------------------------------------------------------------------
  130. void __fastcall TForm1::btSmoothOrbitClick(TObject *Sender)
  131. {
  132. float lAngle; // In radians.
  133. float lTime;
  134. bool lNeedToRecalculateZoom;
  135. TGLVector lTargetPosition;
  136. GetInput(btSmoothOrbit);
  137. lTargetPosition = dcSphere->LocalToAbsolute(PointMake(DextX, DextY, DextZ));
  138. lAngle = AngleBetweenVectors(GLCamera->AbsolutePosition, lTargetPosition, GLSphere1->AbsolutePosition);
  139. // The final look and feel of smooth animation is affected by
  140. // FCameraSmoothAnimator_AbsPos's propperties and this value.
  141. lTime = lAngle * 2;
  142. FCameraSmoothAnimator_RelPos->ResetTargetValue();
  143. FCameraSmoothAnimator_RelPos->Enabled = True;
  144. if (Sender = btSmoothOrbit)
  145. lNeedToRecalculateZoom = false;
  146. else
  147. if (Sender = btSmoothOrbitAndZoom)
  148. lNeedToRecalculateZoom = true;
  149. else
  150. {
  151. lNeedToRecalculateZoom = false;
  152. /// Assert(false);
  153. }
  154. FGLCameraController->OrbitToPosSmooth(lTargetPosition, lTime,
  155. FCameraSmoothAnimator_RelPos, lNeedToRecalculateZoom, &YHmgVector);
  156. }
  157. //---------------------------------------------------------------------------
  158. void __fastcall TForm1::btSmoothOrbitToPosAdvClick(TObject *Sender)
  159. {
  160. float lAngle; // In radians.
  161. float lTime;
  162. TGLVector lTargetPosition;
  163. GetInput(btSmoothOrbitToPosAdv);
  164. lTargetPosition = dcSphere->LocalToAbsolute(PointMake(DextX, DextY, DextZ));
  165. lAngle = AngleBetweenVectors(GLCamera->AbsolutePosition, lTargetPosition, GLSphere1->AbsolutePosition);
  166. lTime = lAngle; // Speed can be controled by applying a multiplier here.
  167. FCameraSmoothAnimator_AbsPos->TargetValue->DirectVector = GLCamera->AbsolutePosition;
  168. FCameraSmoothAnimator_AbsPos->Enabled = true;
  169. FGLCameraController->OrbitToPosAdvancedSmooth(
  170. lTargetPosition.X, lTargetPosition.Y, lTargetPosition.Z,
  171. lTime, FCameraSmoothAnimator_AbsPos);
  172. }
  173. //---------------------------------------------------------------------------
  174. void __fastcall TForm1::btnOrbitToPosAdvClick(TObject *Sender)
  175. {
  176. TGLVector lTargetPosition;
  177. GetInput(btnOrbitToPosAdv);
  178. lTargetPosition = dcSphere->LocalToAbsolute(PointMake(DextX, DextY, DextZ));
  179. FGLCameraController->OrbitToPosAdvanced(lTargetPosition.X, lTargetPosition.Y,
  180. lTargetPosition.Z, Time, UpAxis->Checked);
  181. }
  182. //---------------------------------------------------------------------------
  183. void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta,
  184. TPoint &MousePos, bool &Handled)
  185. {
  186. FCameraSmoothAnimator_AbsPos->Enabled = false;
  187. FCameraSmoothAnimator_RelPos->Enabled = false;
  188. GLCamera->AdjustDistanceToTarget(Power(1.1, WheelDelta/120));
  189. }
  190. //---------------------------------------------------------------------------
  191. void __fastcall TForm1::GLCadencer1Progress(TObject *Sender, const double deltaTime,
  192. const double newTime)
  193. {
  194. if (cbMoveParent->Checked)
  195. dcMovingParent->Position->X = Sin(newTime * 1.5) * 8;
  196. // For btSmoothOrbitAndZoomClick Order of these commands is important.
  197. GLSmoothNavigator->AdjustDistanceToTarget(0, deltaTime);
  198. FGLCameraController->Step(deltaTime, newTime);
  199. // This component requires FixedDeltaTime higher than FMaxExpectedDeltatime.
  200. GLSmoothNavigator->AnimateCustomItems(deltaTime);
  201. }
  202. //---------------------------------------------------------------------------
  203. void __fastcall TForm1::GLSceneViewer1MouseDown(TObject *Sender, TMouseButton Button,
  204. TShiftState Shift, int X, int Y)
  205. {
  206. FCameraSmoothAnimator_AbsPos->Enabled = false;
  207. FCameraSmoothAnimator_RelPos->Enabled = false;
  208. FGLCameraController->StopMovement();
  209. if (Shift.Contains(ssLeft))
  210. {
  211. mx = X; my = Y;
  212. }
  213. }
  214. //---------------------------------------------------------------------------
  215. void __fastcall TForm1::GLSceneViewer1MouseMove(TObject *Sender, TShiftState Shift,
  216. int X, int Y)
  217. {
  218. if (Shift.Contains(ssLeft))
  219. {
  220. GLCamera->MoveAroundTarget(my-Y, mx-X);
  221. mx = X; my = Y;
  222. Caption = "Camera Controller - camera position = " +
  223. FormatFloat("0",GLCamera->Position->X)+"/"+
  224. FormatFloat("0",GLCamera->Position->Y)+"/"+
  225. FormatFloat("0",GLCamera->Position->Z);
  226. }
  227. }
  228. //---------------------------------------------------------------------------
  229. void __fastcall TForm1::GLSceneViewer1MouseUp(TObject *Sender, TMouseButton Button,
  230. TShiftState Shift, int X, int Y)
  231. {
  232. Caption = "Camera Controller";
  233. }
  234. //---------------------------------------------------------------------------
  235. void __fastcall TForm1::Timer1Timer(TObject *Sender)
  236. {
  237. FormatFloat(camDirX->Text, GLCamera->Direction->X);
  238. FormatFloat(camDirY->Text, GLCamera->Direction->Y);
  239. FormatFloat(camDirZ->Text, GLCamera->Direction->Z);
  240. FormatFloat(camUpX->Text, GLCamera->Up->X);
  241. FormatFloat(camUpY->Text, GLCamera->Up->Y);
  242. FormatFloat(camUpZ->Text, GLCamera->Up->Z);
  243. }
  244. //---------------------------------------------------------------------------
  245. void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
  246. {
  247. GLCadencer1->Enabled = false;
  248. }
  249. //---------------------------------------------------------------------------