module; #include export module rmlui_vulkan; import vulkan_render; import utils; import rml; import std; namespace ee_rml { template using lazy = std::optional; struct GeometryMesh { lazy> vertices; lazy> 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 vertices, Rml::Span 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 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 textures; vulkan_render::RenderTexture defaultTexture; }; }