/src/renderer/camera.cpp

https://bitbucket.org/vivkin/gam3b00bs/ · C++ · 59 lines · 47 code · 12 blank · 0 comment · 3 complexity · 9e93228841d7f8666836c6d3f45db8ef MD5 · raw file

  1. #include "camera.h"
  2. void camera_look_at(camera_t &camera, const D3DXVECTOR3 &position, const D3DXVECTOR3 &center, const D3DXVECTOR3 &up)
  3. {
  4. D3DXMatrixLookAtLH(&camera.view, &position, &center, &up);
  5. }
  6. void camera_perspective(camera_t &camera, float fov, float aspect, float znear, float zfar)
  7. {
  8. D3DXMatrixPerspectiveFovLH(&camera.projection, fov, aspect, znear, zfar);
  9. }
  10. void camera_update(camera_t &camera)
  11. {
  12. if( camera.phi < 0.1f )
  13. camera.phi = 0.1f;
  14. if( camera.phi > 3.14f / 3.0f )
  15. camera.phi = 3.14f / 3.0f;
  16. camera.position.x = camera.target.x + sin(camera.angle) * camera.radius;
  17. camera.position.z = camera.target.z + cos(camera.angle) * camera.radius;
  18. camera.position.y = sin(camera.phi) * camera.radius;
  19. D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
  20. D3DXMatrixLookAtLH(&camera.view, &camera.position, &camera.target, &up);
  21. D3DXMatrixPerspectiveFovLH(&camera.projection, camera.fov, camera.aspect, camera.znear, camera.zfar);
  22. }
  23. void camera_rotate(camera_t &camera, float delta)
  24. {
  25. camera.angle += delta;
  26. camera_update(camera);
  27. }
  28. void camera_move(camera_t &camera, float dx, float dz)
  29. {
  30. D3DXVECTOR3 fwd = camera.position - camera.target;
  31. fwd.y = 0;
  32. D3DXVECTOR3 side = D3DXVECTOR3(fwd.z, 0.0f, -fwd.x);
  33. D3DXVec3Normalize(&fwd, &fwd);
  34. D3DXVec3Normalize(&side, &side);
  35. camera.position += D3DXVECTOR3(fwd.x * dz, 0.0f, fwd.z * dz);
  36. camera.target += D3DXVECTOR3(fwd.x * dz, 0.0f, fwd.z * dz);
  37. camera.position += D3DXVECTOR3(side.x * dx, 0.0f, side.z * dx);
  38. camera.target += D3DXVECTOR3(side.x * dx, 0.0f, side.z * dx);
  39. camera_update(camera);
  40. }
  41. void camera_zoom(camera_t &camera, float delta)
  42. {
  43. camera.radius += delta;
  44. if(camera.radius < 1.0f)
  45. camera.radius = 1.0f;
  46. camera_update(camera);
  47. }