backend.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #pragma once
  2. #include "../draw_queue.h"
  3. #include "../ground/grass_gpu.h"
  4. #include "../ground/plant_gpu.h"
  5. #include "../ground/stone_gpu.h"
  6. #include "../ground/terrain_gpu.h"
  7. #include "camera.h"
  8. #include "persistent_buffer.h"
  9. #include "resources.h"
  10. #include "shader.h"
  11. #include "shader_cache.h"
  12. #include <QOpenGLFunctions_3_3_Core>
  13. #include <QVector2D>
  14. #include <QVector3D>
  15. #include <array>
  16. #include <memory>
  17. #include <vector>
  18. namespace Render::GL::BackendPipelines {
  19. class CylinderPipeline;
  20. class VegetationPipeline;
  21. class TerrainPipeline;
  22. class CharacterPipeline;
  23. class WaterPipeline;
  24. class EffectsPipeline;
  25. class PrimitiveBatchPipeline;
  26. class BannerPipeline;
  27. class HealingBeamPipeline;
  28. class HealerAuraPipeline;
  29. class CombatDustPipeline;
  30. class RainPipeline;
  31. class ModeIndicatorPipeline;
  32. class MeshInstancingPipeline;
  33. } // namespace Render::GL::BackendPipelines
  34. namespace Render::GL {
  35. class Backend : protected QOpenGLFunctions_3_3_Core {
  36. public:
  37. friend class BackendPipelines::CylinderPipeline;
  38. friend class BackendPipelines::VegetationPipeline;
  39. Backend();
  40. ~Backend() override;
  41. Backend(const Backend &) = delete;
  42. auto operator=(const Backend &) -> Backend & = delete;
  43. Backend(Backend &&) = delete;
  44. auto operator=(Backend &&) -> Backend & = delete;
  45. void initialize();
  46. void begin_frame();
  47. void set_viewport(int w, int h);
  48. void set_clear_color(float r, float g, float b, float a);
  49. void set_animation_time(float time) { m_animationTime = time; }
  50. void execute(const DrawQueue &queue, const Camera &cam);
  51. [[nodiscard]] auto resources() const -> ResourceManager * {
  52. return m_resources.get();
  53. }
  54. [[nodiscard]] auto shader(const QString &name) const -> Shader * {
  55. return m_shaderCache ? m_shaderCache->get(name) : nullptr;
  56. }
  57. auto get_or_load_shader(const QString &name, const QString &vert_path,
  58. const QString &fragPath) -> Shader * {
  59. if (!m_shaderCache) {
  60. return nullptr;
  61. }
  62. return m_shaderCache->load(name, vert_path, fragPath);
  63. }
  64. [[nodiscard]] auto banner_mesh() const -> Mesh *;
  65. [[nodiscard]] auto banner_shader() const -> Shader *;
  66. [[nodiscard]] auto
  67. healing_beam_pipeline() -> BackendPipelines::HealingBeamPipeline * {
  68. return m_healingBeamPipeline.get();
  69. }
  70. [[nodiscard]] auto
  71. healer_aura_pipeline() -> BackendPipelines::HealerAuraPipeline * {
  72. return m_healerAuraPipeline.get();
  73. }
  74. [[nodiscard]] auto
  75. combat_dust_pipeline() -> BackendPipelines::CombatDustPipeline * {
  76. return m_combatDustPipeline.get();
  77. }
  78. [[nodiscard]] auto rain_pipeline() -> BackendPipelines::RainPipeline * {
  79. return m_rainPipeline.get();
  80. }
  81. [[nodiscard]] auto
  82. mode_indicator_pipeline() -> BackendPipelines::ModeIndicatorPipeline * {
  83. return m_modeIndicatorPipeline.get();
  84. }
  85. void enable_depth_test(bool enable) {
  86. if (enable) {
  87. glEnable(GL_DEPTH_TEST);
  88. } else {
  89. glDisable(GL_DEPTH_TEST);
  90. }
  91. }
  92. void set_depth_func(GLenum func) { glDepthFunc(func); }
  93. void set_depth_mask(bool write) { glDepthMask(write ? GL_TRUE : GL_FALSE); }
  94. void enable_blend(bool enable) {
  95. if (enable) {
  96. glEnable(GL_BLEND);
  97. } else {
  98. glDisable(GL_BLEND);
  99. }
  100. }
  101. void set_blend_func(GLenum src, GLenum dst) { glBlendFunc(src, dst); }
  102. void enable_polygon_offset(bool enable) {
  103. if (enable) {
  104. glEnable(GL_POLYGON_OFFSET_FILL);
  105. } else {
  106. glDisable(GL_POLYGON_OFFSET_FILL);
  107. }
  108. }
  109. void set_polygon_offset(float factor, float units) {
  110. glPolygonOffset(factor, units);
  111. }
  112. void set_riverbank_visibility(bool enabled, Texture *texture,
  113. const QVector2D &size, float tile_size,
  114. float explored_alpha) {
  115. m_riverbankVisibility.enabled = enabled && (texture != nullptr);
  116. m_riverbankVisibility.texture = texture;
  117. m_riverbankVisibility.size = size;
  118. m_riverbankVisibility.tile_size = tile_size;
  119. m_riverbankVisibility.explored_alpha = explored_alpha;
  120. }
  121. private:
  122. int m_viewportWidth{0};
  123. int m_viewportHeight{0};
  124. std::array<float, 4> m_clearColor{0.2F, 0.3F, 0.3F, 0.0F};
  125. std::unique_ptr<ShaderCache> m_shaderCache;
  126. std::unique_ptr<ResourceManager> m_resources;
  127. std::unique_ptr<BackendPipelines::CylinderPipeline> m_cylinderPipeline;
  128. std::unique_ptr<BackendPipelines::VegetationPipeline> m_vegetationPipeline;
  129. std::unique_ptr<BackendPipelines::TerrainPipeline> m_terrainPipeline;
  130. std::unique_ptr<BackendPipelines::CharacterPipeline> m_characterPipeline;
  131. std::unique_ptr<BackendPipelines::WaterPipeline> m_waterPipeline;
  132. std::unique_ptr<BackendPipelines::EffectsPipeline> m_effectsPipeline;
  133. std::unique_ptr<BackendPipelines::PrimitiveBatchPipeline>
  134. m_primitiveBatchPipeline;
  135. std::unique_ptr<BackendPipelines::BannerPipeline> m_bannerPipeline;
  136. std::unique_ptr<BackendPipelines::HealingBeamPipeline> m_healingBeamPipeline;
  137. std::unique_ptr<BackendPipelines::HealerAuraPipeline> m_healerAuraPipeline;
  138. std::unique_ptr<BackendPipelines::CombatDustPipeline> m_combatDustPipeline;
  139. std::unique_ptr<BackendPipelines::RainPipeline> m_rainPipeline;
  140. std::unique_ptr<BackendPipelines::ModeIndicatorPipeline>
  141. m_modeIndicatorPipeline;
  142. std::unique_ptr<BackendPipelines::MeshInstancingPipeline>
  143. m_meshInstancingPipeline;
  144. Shader *m_basicShader = nullptr;
  145. Shader *m_gridShader = nullptr;
  146. Shader *m_shadowShader = nullptr;
  147. Shader *m_lastBoundShader = nullptr;
  148. Texture *m_lastBoundTexture = nullptr;
  149. bool m_depth_testEnabled = true;
  150. bool m_blendEnabled = false;
  151. float m_animationTime = 0.0F;
  152. struct {
  153. Texture *texture = nullptr;
  154. QVector2D size{0.0F, 0.0F};
  155. float tile_size = 1.0F;
  156. float explored_alpha = 0.6F;
  157. bool enabled = false;
  158. } m_riverbankVisibility;
  159. };
  160. } // namespace Render::GL