module; #include #include export module core.render_server; import core.resource_manager; import core.texture_loader; import wrappers.sdl; export namespace core { using TextureID = unsigned int; using TextureManager = ResourceManager; class RenderServer { sdl::Renderer renderer_; TextureLoader texture_loader_; TextureManager texture_manager_; public: RenderServer() = delete; explicit RenderServer(sdl::Renderer&& renderer) : renderer_{std::move(renderer)}, texture_loader_{renderer_}, texture_manager_{texture_loader_} {} // No copy or move operations RenderServer(const RenderServer&) = delete; RenderServer& operator=(const RenderServer&) = delete; RenderServer(RenderServer&&) = delete; RenderServer& operator=(RenderServer&&) = delete; ~RenderServer() = default; constexpr sdl::Renderer& get_renderer() { return renderer_; } /** * Loads a texture from a file (if not loaded yet) and returns its texture ID. */ constexpr TextureID load_texture(const std::string& filename) { return texture_manager_.load_resource_by_name(filename); } void start_frame() const { renderer_.clear(); } void finish_frame() const { renderer_.present(); } constexpr void render_texture( const TextureID texture_id, const sdl::FRect* src_rect, const sdl::FRect* dest_rect ) const { render_texture(texture_manager_.get_resource(texture_id), src_rect, dest_rect); } void render_texture( const sdl::Texture& texture, const sdl::FRect* src_rect, const sdl::FRect* dest_rect ) const { renderer_.render_texture(texture, src_rect, dest_rect); } }; }