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 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  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 <MatMath.h>
  10. #include <Camera.h>
  11. #ifdef DEBUG_MEMORY
  12. #include <memory_test.h>
  13. #endif
  14. unsigned int Camera::mCounter = 0;
  15. ////////////////////////////////////////////////////////////
  16. // Constructors
  17. ////////////////////////////////////////////////////////////
  18. Camera::Camera()
  19. {
  20. mId = ++mCounter;
  21. mFlags = 0;
  22. mViewDistance = 14.0f;
  23. mTranslateDelta = 256.0f;
  24. mRotateDelta = HEL_DEG_TO_RAD(15.0f);
  25. mRotateDelta2 = HEL_DEG_TO_RAD(5.0f);
  26. mFlags &= Camera_FlyMode;
  27. reset();
  28. }
  29. Camera::~Camera()
  30. {
  31. }
  32. ////////////////////////////////////////////////////////////
  33. // Public Accessors
  34. ////////////////////////////////////////////////////////////
  35. unsigned int Camera::getId()
  36. {
  37. return mId;
  38. }
  39. void Camera::getPosition(vec3_t pos)
  40. {
  41. pos[0] = mPos[0];
  42. pos[1] = mPos[1];
  43. pos[2] = mPos[2];
  44. }
  45. void Camera::getUp(vec3_t up)
  46. {
  47. up[0] = mUp[0];
  48. up[1] = mUp[1];
  49. up[2] = mUp[2];
  50. }
  51. void Camera::getTarget(vec3_t target)
  52. {
  53. target[0] = mTarget[0];
  54. target[1] = mTarget[1];
  55. target[2] = mTarget[2];
  56. }
  57. float Camera::getYaw()
  58. {
  59. return HEL_RAD_TO_DEG(mTheta);
  60. }
  61. vec_t Camera::getRadianYaw()
  62. {
  63. return mTheta;
  64. }
  65. vec_t Camera::getRadianPitch()
  66. {
  67. return mTheta2;
  68. }
  69. ////////////////////////////////////////////////////////////
  70. // Public Mutators
  71. ////////////////////////////////////////////////////////////
  72. void Camera::rotate(float angle, float x, float y, float z)
  73. {
  74. Quaternion t, n;
  75. Matrix matrix;
  76. vec_t side[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
  77. vec_t up[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
  78. vec_t look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
  79. unsigned int i;
  80. matrix_t m;
  81. t.set(angle, x, y, z);
  82. n = mQ * t;
  83. n.normalize();
  84. n.getMatrix(m);
  85. matrix.setMatrix(m);
  86. matrix.multiply4v(side, mSide);
  87. matrix.multiply4v(look, mTarget);
  88. matrix.multiply4v(up, mUp);
  89. for (i = 0; i < 3; ++i)
  90. {
  91. mSide[i] += mPos[i];
  92. mTarget[i] += mPos[i];
  93. mUp[i] += mPos[i];
  94. }
  95. mQ = n;
  96. }
  97. void Camera::translate(float x, float y, float z)
  98. {
  99. int i;
  100. vec_t result[4];
  101. vec_t v[4];
  102. matrix_t m;
  103. Matrix matrix;
  104. v[0] = x;
  105. v[1] = y;
  106. v[2] = -z;
  107. v[3] = 1;
  108. m[0] = mSide[0] - mPos[0];
  109. m[1] = mUp[0] - mPos[0];
  110. m[2] = mTarget[0] - mPos[0];
  111. m[3] = 0;
  112. m[4] = mSide[1] - mPos[1];
  113. m[5] = mUp[1] - mPos[1];
  114. m[6] = mTarget[1] - mPos[1];
  115. m[7] = 0;
  116. m[8] = mSide[2] - mPos[2];
  117. m[9] = mUp[2] - mPos[2];
  118. m[10] = mTarget[2] - mPos[2];
  119. m[11] = 0;
  120. m[12] = 0;
  121. m[13] = 0;
  122. m[14] = 0;
  123. m[15] = 1;
  124. matrix.setMatrix(m);
  125. matrix.multiply4v(v, result);
  126. for (i = 0; i < 3; ++i)
  127. {
  128. mSide[i] += result[i];
  129. mUp[i] += result[i];
  130. mTarget[i] += result[i];
  131. mPos[i] += result[i];
  132. }
  133. mPos[0] = x;
  134. mPos[1] = y;
  135. mPos[2] = z;
  136. }
  137. void Camera::reset()
  138. {
  139. mTheta = 0.0f;
  140. mTheta2 = 0.0f;
  141. mPos[0] = 0.0f;
  142. mPos[1] = 0.0f;
  143. mPos[2] = 0.0f;
  144. mTarget[0] = 0.0f;
  145. mTarget[1] = 0.0f;
  146. mTarget[2] = mViewDistance;
  147. mSide[0] = 1.0f;
  148. mSide[1] = 0.0f;
  149. mSide[2] = 0.0f;
  150. mUp[0] = 0.0f;
  151. mUp[1] = 1.0f;
  152. mUp[2] = 0.0f;
  153. mQ.setIdentity();
  154. translate(0.0f, 0.0f, 0.0f);
  155. }
  156. void Camera::setSensitivityY(float angle)
  157. {
  158. mRotateDelta2 = HEL_DEG_TO_RAD(angle);
  159. }
  160. void Camera::setSensitivityX(float angle)
  161. {
  162. mRotateDelta = HEL_DEG_TO_RAD(angle);
  163. }
  164. ////////
  165. void Camera::command(enum camera_command cmd)
  166. {
  167. switch (cmd)
  168. {
  169. case CAMERA_MOVE_FORWARD:
  170. if (mFlags & Camera_FlyMode)
  171. {
  172. mPos[2] += (mTranslateDelta * cosf(mTheta));
  173. }
  174. mPos[0] += (mTranslateDelta * sinf(mTheta));
  175. mPos[1] += (mTranslateDelta * sinf(mTheta2));
  176. break;
  177. case CAMERA_MOVE_BACKWARD:
  178. if (mFlags & Camera_FlyMode)
  179. {
  180. mPos[2] -= (mTranslateDelta * cosf(mTheta));
  181. }
  182. mPos[0] -= (mTranslateDelta * sinf(mTheta));
  183. mPos[1] -= (mTranslateDelta * sinf(mTheta2));
  184. break;
  185. case CAMERA_MOVE_LEFT:
  186. mPos[0] -= (mTranslateDelta * sinf(mTheta - 90.0f));
  187. mPos[2] -= (mTranslateDelta * cosf(mTheta - 90.0f));
  188. break;
  189. case CAMERA_MOVE_RIGHT:
  190. mPos[0] -= (mTranslateDelta * sinf(mTheta + 90.0f));
  191. mPos[2] -= (mTranslateDelta * cosf(mTheta + 90.0f));
  192. break;
  193. case CAMERA_ROTATE_UP:
  194. if (mTheta2 < (M_PI / 2)) {
  195. mTheta2 += mRotateDelta2;
  196. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  197. }
  198. break;
  199. case CAMERA_ROTATE_DOWN:
  200. if (mTheta2 > -(M_PI / 2)) {
  201. mTheta2 -= mRotateDelta2;
  202. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  203. }
  204. break;
  205. case CAMERA_ROTATE_RIGHT:
  206. mTheta += mRotateDelta;
  207. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  208. break;
  209. case CAMERA_ROTATE_LEFT:
  210. mTheta -= mRotateDelta;
  211. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  212. break;
  213. case CAMERA_MOVE_UP:
  214. mPos[1] -= mTranslateDelta / 2.0f;
  215. mTarget[1] -= mTranslateDelta / 2.0f;
  216. break;
  217. case CAMERA_MOVE_DOWN:
  218. mPos[1] += mTranslateDelta / 2.0f;
  219. mTarget[1] += mTranslateDelta / 2.0f;
  220. break;
  221. case CAMERA_SPEED_UP:
  222. ++mTranslateDelta;
  223. break;
  224. case CAMERA_SPEED_DOWN:
  225. if (--mTranslateDelta < 0.0f)
  226. mTranslateDelta = 1.0f;
  227. break;
  228. default:
  229. ;
  230. }
  231. }
  232. //! \fixme Mostly invalid for QUAT_CAM (can rotate on XYZ)
  233. bool Camera::isBehind(int x, int z)
  234. {
  235. vec_t bTheta, bCameraX, bCameraZ, Distance;
  236. // Set up a "virtual camera" a huge distance behind us
  237. bTheta = mTheta + HEL_PI;
  238. if (bTheta > HEL_PI)
  239. bTheta -= HEL_2_PI;
  240. // 64k is a fair distance away...
  241. bCameraX = (65536.0f * sinf(bTheta)) + mPos[0];
  242. bCameraZ = (65536.0f * cosf(bTheta)) + mPos[2];
  243. bCameraX -= x;
  244. bCameraZ -= z;
  245. Distance = sqrtf((bCameraX * bCameraX) + (bCameraZ * bCameraZ));
  246. return (Distance < 65536.0f);
  247. }
  248. void Camera::setSpeed(float s)
  249. {
  250. mTranslateDelta = s;
  251. }
  252. void Camera::update()
  253. {
  254. mTarget[2] = (mViewDistance * cosf(mTheta)) + mPos[2];
  255. mTarget[0] = (mViewDistance * sinf(mTheta)) + mPos[0];
  256. mTarget[1] = (mViewDistance * sinf(mTheta2)) + mPos[1]; // + height_offset;
  257. }
  258. void Camera::setPosition(vec3_t pos)
  259. {
  260. mPos[0] = pos[0];
  261. mPos[1] = pos[1];
  262. mPos[2] = pos[2];
  263. }
  264. void Camera::setUp(vec3_t up)
  265. {
  266. mUp[0] = up[0];
  267. mUp[1] = up[1];
  268. mUp[2] = up[2];
  269. }
  270. void Camera::setTarget(vec3_t target)
  271. {
  272. mTarget[0] = target[0];
  273. mTarget[1] = target[1];
  274. mTarget[2] = target[2];
  275. }
  276. ////////////////////////////////////////////////////////////
  277. // Private Accessors
  278. ////////////////////////////////////////////////////////////
  279. ////////////////////////////////////////////////////////////
  280. // Private Mutators
  281. ////////////////////////////////////////////////////////////