89 lines
2.6 KiB
C++

module;
#include <glm/glm.hpp>
export module rmlui_vulkan;
import vulkan_render;
import utils;
import rml;
import std;
namespace ee_rml {
template <typename T> using lazy = std::optional<T>;
struct GeometryMesh {
lazy<vulkan_render::Buffer<
Rml::Vertex,
vk::BufferUsageFlagBits::eVertexBuffer,
vulkan_render::BufferMode::STAGING_ACCESS
>> vertices;
lazy<vulkan_render::Buffer<
std::uint32_t,
vk::BufferUsageFlagBits::eIndexBuffer,
vulkan_render::BufferMode::STAGING_ACCESS
>> indices;
};
}
export namespace ee_rml {
struct RmlVertexLayout {
constexpr static std::size_t stride = sizeof(Rml::Vertex);
constexpr static std::size_t offsetPos = offsetof(Rml::Vertex, position);
constexpr static std::size_t offsetColor = offsetof(Rml::Vertex, colour);
constexpr static std::size_t offsetUV = offsetof(Rml::Vertex, tex_coord);
};
struct RmlTransformGeometry {
glm::mat4 mvp;
glm::vec2 translate;
};
struct RenderContext {
vulkan_render::Context &context;
vulkan_render::Surface &surface;
vulkan_render::RenderCommands &commands;
vulkan_render::Pipeline &pipeline;
};
class RmlVulkan final : public Rml::RenderInterface {
public:
explicit RmlVulkan(RenderContext renderContext);
Rml::CompiledGeometryHandle CompileGeometry(
Rml::Span<const Rml::Vertex> vertices,
Rml::Span<const std::int32_t> indices
) override;
void RenderGeometry(
Rml::CompiledGeometryHandle geometry,
Rml::Vector2f translation,
Rml::TextureHandle texture
) override;
void ReleaseGeometry(Rml::CompiledGeometryHandle geometry) override;
Rml::TextureHandle LoadTexture(Rml::Vector2i &texture_dimensions, const Rml::String &source) override;
Rml::TextureHandle GenerateTexture(
Rml::Span<const std::uint8_t> source,
Rml::Vector2i source_dimensions
) override;
void ReleaseTexture(Rml::TextureHandle texture) override;
void EnableScissorRegion(bool enable) override;
void SetScissorRegion(Rml::Rectanglei region) override;
void SetFrameContext(vulkan_render::FrameContext *frameContext);
private:
RenderContext renderer;
vulkan_render::FrameContext *frameContext = nullptr;
bool scissorEnabled = false;
vulkan_render::Sampler sampler;
std::unordered_map<Rml::TextureHandle, vk::raii::DescriptorSets> textures;
vulkan_render::RenderTexture defaultTexture;
};
}