module; #include #include #include #include #include #include export module Render; import worker; import MapView; import AssetData; export namespace ee_engine { struct ShaderRefs { ee_assets::AssetShader *vertProvinces; ee_assets::AssetShader *fragProvinces; }; struct CameraTransform { glm::vec2 position {0.0f, 0.0f}; float zoom = 1.0f; }; struct MeshTransform { glm::vec2 position {0.0f, 0.0f}; glm::vec2 scale {1.0f, 1.0f}; float rotation; }; struct RendererCommand : public ee_utils::WorkerCommand { enum Type : std::uint8_t { NONE, UPDATE_REGION, COMPLETED }; struct RegionPayload { std::uint32_t id; ProvinceSSBO data; }; union { RegionPayload region; }; }; class IRenderer : public ee_utils::Worker { public: virtual ~IRenderer(); constexpr bool isReady() const noexcept {return _isReady;} void RegisterMaterials(const ShaderRefs &shaders); void RegisterMapMesh(MapMesh *mapMesh); virtual void Init() = 0; virtual void Shutdown() = 0; void Draw(); virtual void ResizeWindow(int width, int height); void SetCamera(const CameraTransform &camera); constexpr CameraTransform getCamera() const noexcept {return camera;}; protected: bool _isReady; int screenWidth, screenHeight; float screenAspect; CameraTransform camera; glm::mat4 viewProjection; GLFWwindow *window; MapMesh *mapMesh; ShaderRefs shaders; struct RegionIndecies {std::size_t startIndex; std::size_t provincesCount;}; std::unordered_map regionsMapping; explicit IRenderer(GLFWwindow *window); virtual void Clear() = 0; virtual void DrawMap() = 0; virtual void DrawUI() = 0; virtual void ApplyCamera() = 0; virtual void UpdateProvinces(const std::size_t index, const std::vector &data) = 0; private: void UpdateRegionCmd(RendererCommand &command); }; }