Open Source Tomb Raider Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Camera.cpp 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /*!
  2. * \file src/Camera.cpp
  3. * \brief OpenGL camera class
  4. *
  5. * \author Mongoose
  6. */
  7. #include <stdio.h>
  8. #include <math.h>
  9. #include "utils/math.h"
  10. #include "Camera.h"
  11. Camera::Camera() {
  12. mFlags = 0;
  13. mViewDistance = 14.0f;
  14. mTranslateDelta = 256.0f;
  15. mRotateDelta = HEL_DEG_TO_RAD(15.0f);
  16. mRotateDelta2 = HEL_DEG_TO_RAD(5.0f);
  17. mFlags &= Camera_FlyMode;
  18. reset();
  19. }
  20. Camera::~Camera() {
  21. }
  22. void Camera::getPosition(vec3_t pos) {
  23. pos[0] = mPos[0];
  24. pos[1] = mPos[1];
  25. pos[2] = mPos[2];
  26. }
  27. void Camera::getUp(vec3_t up) {
  28. up[0] = mUp[0];
  29. up[1] = mUp[1];
  30. up[2] = mUp[2];
  31. }
  32. void Camera::getTarget(vec3_t target) {
  33. target[0] = mTarget[0];
  34. target[1] = mTarget[1];
  35. target[2] = mTarget[2];
  36. }
  37. float Camera::getYaw() {
  38. return HEL_RAD_TO_DEG(mTheta);
  39. }
  40. vec_t Camera::getRadianYaw() {
  41. return mTheta;
  42. }
  43. vec_t Camera::getRadianPitch() {
  44. return mTheta2;
  45. }
  46. void Camera::rotate(float angle, float x, float y, float z) {
  47. Quaternion t, n;
  48. Matrix matrix;
  49. vec_t side[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
  50. vec_t up[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
  51. vec_t look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
  52. unsigned int i;
  53. matrix_t m;
  54. t.set(angle, x, y, z);
  55. n = mQ * t;
  56. n.normalize();
  57. n.getMatrix(m);
  58. matrix.setMatrix(m);
  59. matrix.multiply4v(side, mSide);
  60. matrix.multiply4v(look, mTarget);
  61. matrix.multiply4v(up, mUp);
  62. for (i = 0; i < 3; ++i) {
  63. mSide[i] += mPos[i];
  64. mTarget[i] += mPos[i];
  65. mUp[i] += mPos[i];
  66. }
  67. mQ = n;
  68. }
  69. void Camera::translate(float x, float y, float z) {
  70. int i;
  71. vec_t result[4];
  72. vec_t v[4];
  73. matrix_t m;
  74. Matrix matrix;
  75. v[0] = x;
  76. v[1] = y;
  77. v[2] = -z;
  78. v[3] = 1;
  79. m[0] = mSide[0] - mPos[0];
  80. m[1] = mUp[0] - mPos[0];
  81. m[2] = mTarget[0] - mPos[0];
  82. m[3] = 0;
  83. m[4] = mSide[1] - mPos[1];
  84. m[5] = mUp[1] - mPos[1];
  85. m[6] = mTarget[1] - mPos[1];
  86. m[7] = 0;
  87. m[8] = mSide[2] - mPos[2];
  88. m[9] = mUp[2] - mPos[2];
  89. m[10] = mTarget[2] - mPos[2];
  90. m[11] = 0;
  91. m[12] = 0;
  92. m[13] = 0;
  93. m[14] = 0;
  94. m[15] = 1;
  95. matrix.setMatrix(m);
  96. matrix.multiply4v(v, result);
  97. for (i = 0; i < 3; ++i) {
  98. mSide[i] += result[i];
  99. mUp[i] += result[i];
  100. mTarget[i] += result[i];
  101. mPos[i] += result[i];
  102. }
  103. mPos[0] = x;
  104. mPos[1] = y;
  105. mPos[2] = z;
  106. }
  107. void Camera::reset() {
  108. mTheta = 0.0f;
  109. mTheta2 = 0.0f;
  110. mPos[0] = 0.0f;
  111. mPos[1] = 0.0f;
  112. mPos[2] = 0.0f;
  113. mTarget[0] = 0.0f;
  114. mTarget[1] = 0.0f;
  115. mTarget[2] = mViewDistance;
  116. mSide[0] = 1.0f;
  117. mSide[1] = 0.0f;
  118. mSide[2] = 0.0f;
  119. mUp[0] = 0.0f;
  120. mUp[1] = 1.0f;
  121. mUp[2] = 0.0f;
  122. mQ.setIdentity();
  123. translate(0.0f, 0.0f, 0.0f);
  124. }
  125. void Camera::setSensitivityY(float angle) {
  126. mRotateDelta2 = HEL_DEG_TO_RAD(angle);
  127. }
  128. void Camera::setSensitivityX(float angle) {
  129. mRotateDelta = HEL_DEG_TO_RAD(angle);
  130. }
  131. void Camera::command(enum camera_command cmd) {
  132. switch (cmd) {
  133. case CAMERA_MOVE_FORWARD:
  134. if (mFlags & Camera_FlyMode)
  135. mPos[2] += (mTranslateDelta * cosf(mTheta));
  136. mPos[0] += (mTranslateDelta * sinf(mTheta));
  137. mPos[1] += (mTranslateDelta * sinf(mTheta2));
  138. break;
  139. case CAMERA_MOVE_BACKWARD:
  140. if (mFlags & Camera_FlyMode)
  141. mPos[2] -= (mTranslateDelta * cosf(mTheta));
  142. mPos[0] -= (mTranslateDelta * sinf(mTheta));
  143. mPos[1] -= (mTranslateDelta * sinf(mTheta2));
  144. break;
  145. case CAMERA_MOVE_LEFT:
  146. mPos[0] -= (mTranslateDelta * sinf(mTheta - 90.0f));
  147. mPos[2] -= (mTranslateDelta * cosf(mTheta - 90.0f));
  148. break;
  149. case CAMERA_MOVE_RIGHT:
  150. mPos[0] -= (mTranslateDelta * sinf(mTheta + 90.0f));
  151. mPos[2] -= (mTranslateDelta * cosf(mTheta + 90.0f));
  152. break;
  153. case CAMERA_ROTATE_UP:
  154. if (mTheta2 < (M_PI / 2)) {
  155. mTheta2 += mRotateDelta2;
  156. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  157. }
  158. break;
  159. case CAMERA_ROTATE_DOWN:
  160. if (mTheta2 > -(M_PI / 2)) {
  161. mTheta2 -= mRotateDelta2;
  162. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  163. }
  164. break;
  165. case CAMERA_ROTATE_RIGHT:
  166. mTheta += mRotateDelta;
  167. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  168. break;
  169. case CAMERA_ROTATE_LEFT:
  170. mTheta -= mRotateDelta;
  171. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  172. break;
  173. case CAMERA_MOVE_UP:
  174. mPos[1] -= mTranslateDelta / 2.0f;
  175. mTarget[1] -= mTranslateDelta / 2.0f;
  176. break;
  177. case CAMERA_MOVE_DOWN:
  178. mPos[1] += mTranslateDelta / 2.0f;
  179. mTarget[1] += mTranslateDelta / 2.0f;
  180. break;
  181. case CAMERA_SPEED_UP:
  182. ++mTranslateDelta;
  183. break;
  184. case CAMERA_SPEED_DOWN:
  185. if (--mTranslateDelta < 0.0f)
  186. mTranslateDelta = 1.0f;
  187. break;
  188. }
  189. }
  190. void Camera::setSpeed(float s) {
  191. mTranslateDelta = s;
  192. }
  193. void Camera::update() {
  194. mTarget[2] = (mViewDistance * cosf(mTheta)) + mPos[2];
  195. mTarget[0] = (mViewDistance * sinf(mTheta)) + mPos[0];
  196. mTarget[1] = (mViewDistance * sinf(mTheta2)) + mPos[1]; // + height_offset;
  197. }
  198. void Camera::setPosition(vec3_t pos) {
  199. mPos[0] = pos[0];
  200. mPos[1] = pos[1];
  201. mPos[2] = pos[2];
  202. }
  203. void Camera::setUp(vec3_t up) {
  204. mUp[0] = up[0];
  205. mUp[1] = up[1];
  206. mUp[2] = up[2];
  207. }
  208. void Camera::setTarget(vec3_t target) {
  209. mTarget[0] = target[0];
  210. mTarget[1] = target[1];
  211. mTarget[2] = target[2];
  212. }