Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

96 строки
2.3 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://sam.zoy.org/projects/COPYING.WTFPL for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <cstring>
  14. #include <cstdlib>
  15. #include "core.h"
  16. #if defined _WIN32 || defined _XBOX
  17. # define strcasecmp _stricmp
  18. #endif
  19. namespace lol
  20. {
  21. Camera::Camera(vec3 const &position, vec3 const &target, vec3 const &up)
  22. : m_target(target),
  23. m_up(up)
  24. {
  25. m_gamegroup = GAMEGROUP_BEFORE;
  26. m_drawgroup = DRAWGROUP_CAMERA;
  27. SetPosition(position);
  28. }
  29. Camera::~Camera()
  30. {
  31. }
  32. void Camera::SetPosition(vec3 const &pos)
  33. {
  34. m_position = pos;
  35. }
  36. mat4 const &Camera::GetViewMatrix()
  37. {
  38. return m_view_matrix;
  39. }
  40. mat4 const &Camera::GetProjMatrix()
  41. {
  42. return m_proj_matrix;
  43. }
  44. void Camera::TickGame(float seconds)
  45. {
  46. WorldEntity::TickGame(seconds);
  47. /* Hackish keyboard support */
  48. float updown = Input::GetButtonState(273 /*SDLK_UP*/)
  49. - Input::GetButtonState(274 /*SDLK_DOWN*/);
  50. float rightleft = Input::GetButtonState(275 /*SDLK_RIGHT*/)
  51. - Input::GetButtonState(276 /*SDLK_LEFT*/);
  52. float pgupdown = Input::GetButtonState(280 /*SDLK_PAGEUP*/)
  53. - Input::GetButtonState(281 /*SDLK_PAGEDOWN*/);
  54. /* Hackish stick support */
  55. static Stick *stick = NULL;
  56. if (!stick)
  57. stick = Input::TrackStick();
  58. if (stick && stick->GetAxisCount() >= 2)
  59. {
  60. rightleft = 2.f * stick->GetAxis(0) * std::abs(stick->GetAxis(0));
  61. updown = -2.f * stick->GetAxis(1) * std::abs(stick->GetAxis(1));
  62. }
  63. m_position += vec3(rightleft, pgupdown, -updown) * 200.f * seconds;
  64. m_target += vec3(rightleft, 0, -updown) * 200.f * seconds;
  65. m_view_matrix = mat4::lookat(m_position, m_target, m_up);
  66. m_proj_matrix = mat4::perspective(45.0f, 640.0f, 480.0f, 1.f, 10000.0f);
  67. //m_proj_matrix = mat4::ortho(-160, 160, -120, 120, .1f, 2000.0f);
  68. }
  69. void Camera::TickDraw(float seconds)
  70. {
  71. WorldEntity::TickDraw(seconds);
  72. Scene::GetDefault()->SetViewMatrix(m_view_matrix);
  73. Scene::GetDefault()->SetProjMatrix(m_proj_matrix);
  74. }
  75. } /* namespace lol */