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

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