CmDebugCamera.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "CmDebugCamera.h"
  2. #include "CmInput.h"
  3. #include "CmVector3.h"
  4. #include "CmTime.h"
  5. #include "CmMath.h"
  6. #include "CmGameObject.h"
  7. #include "CmCamera.h"
  8. namespace CamelotEngine
  9. {
  10. const float DebugCamera::START_SPEED = 40.0f;
  11. const float DebugCamera::TOP_SPEED = 130.0f;
  12. const float DebugCamera::ACCELERATION = 10.0f;
  13. const float DebugCamera::FAST_MODE_MULTIPLIER = 2.0f;
  14. const float DebugCamera::ROTATION_SPEED = 0.5f; // Degrees/pixel
  15. DebugCamera::DebugCamera(GameObjectPtr parent)
  16. :Component(parent), mGoingForward(false), mGoingBack(false), mGoingLeft(false), mGoingRight(false), mFastMove(false), mCameraRotating(false)
  17. {
  18. mCamera = getGO()->getComponent<Camera>();
  19. mCamera->getGO()->setPosition(Vector3(0,0,80));
  20. mCamera->getGO()->lookAt(Vector3(0,0,-300));
  21. mCamera->setNearClipDistance(5);
  22. gInput().onKeyDown.connect(boost::bind(&DebugCamera::keyDown, this, _1));
  23. gInput().onKeyUp.connect(boost::bind(&DebugCamera::keyUp, this, _1));
  24. gInput().onMouseDown.connect(boost::bind(&DebugCamera::mouseDown, this, _1, _2));
  25. gInput().onMouseUp.connect(boost::bind(&DebugCamera::mouseUp, this, _1, _2));
  26. }
  27. void DebugCamera::keyDown(KeyCode keyCode)
  28. {
  29. if (keyCode == KC_W || keyCode == KC_UP)
  30. mGoingForward = true;
  31. else if (keyCode == KC_S || keyCode== KC_DOWN)
  32. mGoingBack = true;
  33. else if (keyCode == KC_A || keyCode == KC_LEFT)
  34. mGoingLeft = true;
  35. else if (keyCode == KC_D || keyCode == KC_RIGHT)
  36. mGoingRight = true;
  37. else if (keyCode == KC_LSHIFT)
  38. mFastMove = true;
  39. }
  40. void DebugCamera::keyUp(KeyCode keyCode)
  41. {
  42. if (keyCode == KC_W || keyCode == KC_UP)
  43. mGoingForward = false;
  44. else if (keyCode == KC_S || keyCode== KC_DOWN)
  45. mGoingBack = false;
  46. else if (keyCode == KC_A || keyCode == KC_LEFT)
  47. mGoingLeft = false;
  48. else if (keyCode == KC_D || keyCode == KC_RIGHT)
  49. mGoingRight = false;
  50. else if (keyCode == KC_LSHIFT)
  51. mFastMove = false;
  52. }
  53. void DebugCamera::mouseDown(const MouseEvent& event, MouseButton buttonID)
  54. {
  55. if(buttonID == MB_Right)
  56. {
  57. mCameraRotating = true;
  58. }
  59. }
  60. void DebugCamera::mouseUp(const MouseEvent& event, MouseButton buttonID)
  61. {
  62. if(buttonID == MB_Right)
  63. {
  64. mCameraRotating = false;
  65. }
  66. }
  67. void DebugCamera::update()
  68. {
  69. Vector3 direction = Vector3::ZERO;
  70. if (mGoingForward) direction += mCamera->getGO()->getForward();
  71. if (mGoingBack) direction -= mCamera->getGO()->getForward();
  72. if (mGoingRight) direction += mCamera->getGO()->getRight();
  73. if (mGoingLeft) direction -= mCamera->getGO()->getRight();
  74. if (direction.squaredLength() != 0)
  75. {
  76. direction.normalise();
  77. float multiplier = 1.0f;
  78. if(mFastMove)
  79. multiplier = FAST_MODE_MULTIPLIER;
  80. mCurrentSpeed = Math::Clamp(mCurrentSpeed + ACCELERATION * gTime().getFrameDelta(), START_SPEED, TOP_SPEED);
  81. mCurrentSpeed *= multiplier;
  82. }
  83. else
  84. {
  85. mCurrentSpeed = 0.0f;
  86. }
  87. float tooSmall = std::numeric_limits<float>::epsilon();
  88. if(mCurrentSpeed > tooSmall)
  89. {
  90. Vector3 velocity = direction * mCurrentSpeed;
  91. mCamera->getGO()->move(velocity * gTime().getFrameDelta());
  92. }
  93. if(mCameraRotating)
  94. {
  95. //float horizontalSpeed = event.relX / gTime().getFrameDelta();
  96. mCamera->getGO()->yaw(Degree(gInput().getHorizontalAxis() * ROTATION_SPEED));
  97. mCamera->getGO()->pitch(Degree(gInput().getVerticalAxis() * ROTATION_SPEED));
  98. }
  99. }
  100. }