89 lines
2.6 KiB
C++
89 lines
2.6 KiB
C++
/**
|
|
* Do not include <RmlUi/Core.h> in module .cpp implementation
|
|
* to prevent MSVC internal compiler error
|
|
*/
|
|
|
|
module;
|
|
|
|
#include <RmlUi/Core.h>
|
|
|
|
export module rmlui_vulkan;
|
|
import vulkan_render;
|
|
import utils;
|
|
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 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<const Rml::Vertex> vertices,
|
|
const Rml::Span<const std::int32_t> indices
|
|
) override {
|
|
GeometryMesh *mesh = Allocate<GeometryMesh>();
|
|
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<Rml::CompiledGeometryHandle>(mesh);
|
|
}
|
|
|
|
void RenderGeometry(
|
|
Rml::CompiledGeometryHandle geometry,
|
|
Rml::Vector2f translation,
|
|
Rml::TextureHandle texture
|
|
) override {
|
|
|
|
}
|
|
|
|
void ReleaseGeometry(const Rml::CompiledGeometryHandle geometry) override {
|
|
Deallocate(reinterpret_cast<GeometryMesh*>(geometry));
|
|
};
|
|
|
|
Rml::TextureHandle LoadTexture(Rml::Vector2i &texture_dimensions, const Rml::String &source) override {return 0;}
|
|
|
|
Rml::TextureHandle GenerateTexture(
|
|
Rml::Span<const std::uint8_t> 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;
|
|
};
|
|
|
|
} |