/** * Do not include in module .cpp implementation * to prevent MSVC internal compiler error */ module; #include export module rmlui_vulkan; import vulkan_render; import utils; import std; namespace ee_rml { template using lazy = std::optional; struct GeometryMesh { lazy> vertices; lazy> indices; }; } export namespace ee_rml { struct RenderContext { vulkan_render::Context &context; vulkan_render::RenderCommands &commands; }; class RmlVulkan final : public Rml::RenderInterface { public: explicit RmlVulkan(RenderContext &renderContext) : renderer(renderContext) {} Rml::CompiledGeometryHandle CompileGeometry( const Rml::Span vertices, const Rml::Span indices ) override { GeometryMesh *mesh = Allocate(); mesh->vertices.emplace(renderer.context, vertices.size()); mesh->indices.emplace(renderer.context, indices.size()); std::ranges::copy(vertices, mesh->vertices->content.data()); std::ranges::copy(indices, mesh->indices->content.data()); renderer.commands.SubmitStagingBuffer(*mesh->vertices); renderer.commands.SubmitStagingBuffer(*mesh->indices); return reinterpret_cast(mesh); } void RenderGeometry( Rml::CompiledGeometryHandle geometry, Rml::Vector2f translation, Rml::TextureHandle texture ) override { } void ReleaseGeometry(const Rml::CompiledGeometryHandle geometry) override { Deallocate(reinterpret_cast(geometry)); }; Rml::TextureHandle LoadTexture(Rml::Vector2i &texture_dimensions, const Rml::String &source) override {return 0;} Rml::TextureHandle GenerateTexture( Rml::Span source, Rml::Vector2i source_dimensions ) override {return 0;} void ReleaseTexture(Rml::TextureHandle texture) override {} void EnableScissorRegion(bool enable) override {} void SetScissorRegion(Rml::Rectanglei region) override {} private: RenderContext &renderer; }; }