patrol_flags.cpp 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "patrol_flags.h"
  2. #include "../../game/core/component.h"
  3. #include "../../game/core/world.h"
  4. #include "../gl/resources.h"
  5. #include "../scene_renderer.h"
  6. #include "flag.h"
  7. #include <cstdint>
  8. #include <optional>
  9. #include <qvectornd.h>
  10. #include <unordered_set>
  11. namespace Render::GL {
  12. constexpr float k_position_grid_precision = 10.0F;
  13. constexpr int k_position_hash_shift = 32;
  14. void render_patrol_flags(Renderer *renderer, ResourceManager *resources,
  15. Engine::Core::World &world,
  16. const std::optional<QVector3D> &preview_waypoint) {
  17. if ((renderer == nullptr) || (resources == nullptr)) {
  18. return;
  19. }
  20. std::unordered_set<uint64_t> rendered_positions;
  21. if (preview_waypoint.has_value()) {
  22. auto flag = Geom::Flag::create(preview_waypoint->x(), preview_waypoint->z(),
  23. QVector3D(0.4F, 1.0F, 0.5F),
  24. QVector3D(0.35F, 0.25F, 0.15F), 1.5F);
  25. renderer->mesh(resources->unit(), flag.pole, flag.pole_color,
  26. resources->white(), 1.0F);
  27. renderer->mesh(resources->unit(), flag.pennant, flag.pennant_color,
  28. resources->white(), 1.0F);
  29. renderer->mesh(resources->unit(), flag.finial, flag.pennant_color,
  30. resources->white(), 1.0F);
  31. auto const grid_x =
  32. static_cast<int32_t>(preview_waypoint->x() * k_position_grid_precision);
  33. auto const grid_z =
  34. static_cast<int32_t>(preview_waypoint->z() * k_position_grid_precision);
  35. uint64_t const pos_hash =
  36. (static_cast<uint64_t>(grid_x) << k_position_hash_shift) |
  37. static_cast<uint64_t>(grid_z);
  38. rendered_positions.insert(pos_hash);
  39. }
  40. auto patrol_entities =
  41. world.get_entities_with<Engine::Core::PatrolComponent>();
  42. for (auto *entity : patrol_entities) {
  43. auto *patrol = entity->get_component<Engine::Core::PatrolComponent>();
  44. if ((patrol == nullptr) || !patrol->patrolling ||
  45. patrol->waypoints.empty()) {
  46. continue;
  47. }
  48. auto *unit = entity->get_component<Engine::Core::UnitComponent>();
  49. if ((unit == nullptr) || unit->health <= 0) {
  50. continue;
  51. }
  52. for (const auto &waypoint : patrol->waypoints) {
  53. auto const grid_x =
  54. static_cast<int32_t>(waypoint.first * k_position_grid_precision);
  55. auto const grid_z =
  56. static_cast<int32_t>(waypoint.second * k_position_grid_precision);
  57. uint64_t const pos_hash =
  58. (static_cast<uint64_t>(grid_x) << k_position_hash_shift) |
  59. static_cast<uint64_t>(grid_z);
  60. if (!rendered_positions.insert(pos_hash).second) {
  61. continue;
  62. }
  63. auto flag = Geom::Flag::create(waypoint.first, waypoint.second,
  64. QVector3D(0.3F, 1.0F, 0.4F),
  65. QVector3D(0.35F, 0.25F, 0.15F), 1.4F);
  66. renderer->mesh(resources->unit(), flag.pole, flag.pole_color,
  67. resources->white(), 1.0F);
  68. renderer->mesh(resources->unit(), flag.pennant, flag.pennant_color,
  69. resources->white(), 1.0F);
  70. renderer->mesh(resources->unit(), flag.finial, flag.pennant_color,
  71. resources->white(), 1.0F);
  72. }
  73. }
  74. }
  75. } // namespace Render::GL