camera_visibility_service.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "camera_visibility_service.h"
  2. #include "../../render/gl/camera.h"
  3. #include <cmath>
  4. namespace Game::Systems {
  5. auto CameraVisibilityService::instance() -> CameraVisibilityService & {
  6. static CameraVisibilityService s_instance;
  7. return s_instance;
  8. }
  9. void CameraVisibilityService::set_camera(const Render::GL::Camera *camera) {
  10. std::lock_guard<std::mutex> const lock(m_mutex);
  11. m_camera = camera;
  12. }
  13. void CameraVisibilityService::clear_camera() {
  14. std::lock_guard<std::mutex> const lock(m_mutex);
  15. m_camera = nullptr;
  16. }
  17. auto CameraVisibilityService::is_position_visible(float world_x, float world_y,
  18. float world_z,
  19. float radius) const -> bool {
  20. std::lock_guard<std::mutex> const lock(m_mutex);
  21. if (m_camera == nullptr) {
  22. return true;
  23. }
  24. return m_camera->is_in_frustum(QVector3D(world_x, world_y, world_z), radius);
  25. }
  26. auto CameraVisibilityService::is_position_visible(const QVector3D &position,
  27. float radius) const -> bool {
  28. return is_position_visible(position.x(), position.y(), position.z(), radius);
  29. }
  30. auto CameraVisibilityService::is_entity_visible(float world_x, float world_z,
  31. float radius) const -> bool {
  32. constexpr float kDefaultEntityHeight = 0.5F;
  33. return is_position_visible(world_x, kDefaultEntityHeight, world_z, radius);
  34. }
  35. namespace {
  36. constexpr float kDetailEffectsFrustumRadius = 2.0F;
  37. }
  38. auto CameraVisibilityService::should_process_detailed_effects(
  39. float world_x, float world_y, float world_z,
  40. float max_detail_distance) const -> bool {
  41. std::lock_guard<std::mutex> const lock(m_mutex);
  42. if (m_camera == nullptr) {
  43. return true;
  44. }
  45. if (!m_camera->is_in_frustum(QVector3D(world_x, world_y, world_z),
  46. kDetailEffectsFrustumRadius)) {
  47. return false;
  48. }
  49. QVector3D const cam_pos = m_camera->get_position();
  50. float const dx = world_x - cam_pos.x();
  51. float const dy = world_y - cam_pos.y();
  52. float const dz = world_z - cam_pos.z();
  53. float const dist_sq = dx * dx + dy * dy + dz * dz;
  54. return dist_sq <= max_detail_distance * max_detail_distance;
  55. }
  56. auto CameraVisibilityService::get_camera_position() const -> QVector3D {
  57. std::lock_guard<std::mutex> const lock(m_mutex);
  58. if (m_camera == nullptr) {
  59. return QVector3D(0.0F, 0.0F, 0.0F);
  60. }
  61. return m_camera->get_position();
  62. }
  63. auto CameraVisibilityService::has_camera() const -> bool {
  64. std::lock_guard<std::mutex> const lock(m_mutex);
  65. return m_camera != nullptr;
  66. }
  67. } // namespace Game::Systems