firecamp_renderer.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #pragma once
  2. #include "../../game/map/terrain.h"
  3. #include "../i_render_pass.h"
  4. #include "firecamp_gpu.h"
  5. #include <QVector3D>
  6. #include <cstdint>
  7. #include <memory>
  8. #include <vector>
  9. namespace Render::Ground {
  10. class SpawnValidator;
  11. }
  12. namespace Render::GL {
  13. class Buffer;
  14. class Renderer;
  15. class FireCampRenderer : public IRenderPass {
  16. public:
  17. FireCampRenderer();
  18. ~FireCampRenderer() override;
  19. void configure(const Game::Map::TerrainHeightMap &height_map,
  20. const Game::Map::BiomeSettings &biome_settings);
  21. void setExplicitFireCamps(const std::vector<QVector3D> &positions,
  22. const std::vector<float> &intensities = {},
  23. const std::vector<float> &radii = {});
  24. void submit(Renderer &renderer, ResourceManager *resources) override;
  25. void clear();
  26. [[nodiscard]] bool is_gpu_ready() const {
  27. if (m_fireCampInstances.empty()) {
  28. return true;
  29. }
  30. if (!m_visibilityDirty && m_visibleInstances.empty()) {
  31. return true;
  32. }
  33. return (m_fireCampInstanceBuffer != nullptr) && !m_visibilityDirty;
  34. }
  35. private:
  36. void generate_firecamp_instances();
  37. void add_explicit_firecamps(const Render::Ground::SpawnValidator &validator);
  38. int m_width = 0;
  39. int m_height = 0;
  40. float m_tile_size = 1.0F;
  41. std::vector<float> m_heightData;
  42. std::vector<Game::Map::TerrainType> m_terrain_types;
  43. Game::Map::BiomeSettings m_biome_settings;
  44. std::uint32_t m_noiseSeed = 0U;
  45. std::vector<FireCampInstanceGpu> m_fireCampInstances;
  46. std::unique_ptr<Buffer> m_fireCampInstanceBuffer;
  47. std::size_t m_fireCampInstanceCount = 0;
  48. FireCampBatchParams m_fireCampParams;
  49. bool m_fireCampInstancesDirty = false;
  50. std::vector<FireCampInstanceGpu> m_visibleInstances;
  51. std::uint64_t m_cachedVisibilityVersion = 0;
  52. bool m_visibilityDirty = true;
  53. std::vector<QVector3D> m_explicitPositions;
  54. std::vector<float> m_explicitIntensities;
  55. std::vector<float> m_explicitRadii;
  56. };
  57. } // namespace Render::GL