2025-11-26 01:57:08 +01:00
|
|
|
module;
|
|
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <utility>
|
|
|
|
|
|
2026-04-28 23:28:53 +02:00
|
|
|
export module rutile.core.render_server;
|
2025-11-26 01:57:08 +01:00
|
|
|
|
2026-04-28 23:28:53 +02:00
|
|
|
import rutile.core.resource_manager;
|
|
|
|
|
import rutile.core.texture_loader;
|
2025-11-26 01:57:08 +01:00
|
|
|
import wrappers.sdl;
|
|
|
|
|
|
2026-04-28 23:28:53 +02:00
|
|
|
export namespace rutile
|
2025-11-26 01:57:08 +01:00
|
|
|
{
|
|
|
|
|
using TextureID = unsigned int;
|
|
|
|
|
using TextureManager = ResourceManager<TextureID, sdl::Texture, TextureLoader>;
|
|
|
|
|
|
|
|
|
|
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_}
|
2026-05-10 23:23:40 +02:00
|
|
|
{
|
|
|
|
|
renderer_.set_vsync(1);
|
|
|
|
|
}
|
2025-11-26 01:57:08 +01:00
|
|
|
|
|
|
|
|
// 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_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2025-11-30 00:37:44 +01:00
|
|
|
* Load a texture from a file (if not loaded yet) and return its texture ID.
|
2025-11-26 01:57:08 +01:00
|
|
|
*/
|
|
|
|
|
constexpr TextureID load_texture(const std::string& filename)
|
|
|
|
|
{
|
|
|
|
|
return texture_manager_.load_resource_by_name(filename);
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-30 00:37:44 +01:00
|
|
|
/**
|
|
|
|
|
* Get a reference to a texture by its texture ID.
|
|
|
|
|
*/
|
|
|
|
|
constexpr const sdl::Texture& get_texture(const TextureID texture_id) const
|
|
|
|
|
{
|
|
|
|
|
return texture_manager_.get_resource(texture_id);
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-26 01:57:08 +01:00
|
|
|
void start_frame() const
|
|
|
|
|
{
|
|
|
|
|
renderer_.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void finish_frame() const
|
|
|
|
|
{
|
|
|
|
|
renderer_.present();
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-30 00:37:44 +01:00
|
|
|
void render_texture(
|
2025-11-26 01:57:08 +01:00
|
|
|
const TextureID texture_id,
|
|
|
|
|
const sdl::FRect* src_rect,
|
|
|
|
|
const sdl::FRect* dest_rect
|
|
|
|
|
) const
|
|
|
|
|
{
|
2025-11-30 00:37:44 +01:00
|
|
|
render_texture(get_texture(texture_id), src_rect, dest_rect);
|
2025-11-26 01:57:08 +01:00
|
|
|
}
|
|
|
|
|
|
2025-11-30 00:37:44 +01:00
|
|
|
constexpr void render_texture(
|
2025-11-26 01:57:08 +01:00
|
|
|
const sdl::Texture& texture,
|
|
|
|
|
const sdl::FRect* src_rect,
|
|
|
|
|
const sdl::FRect* dest_rect
|
|
|
|
|
) const
|
|
|
|
|
{
|
|
|
|
|
renderer_.render_texture(texture, src_rect, dest_rect);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|