Program Listing for File custom_render_interface.h

Return to documentation for file (rootex/core/ui/custom_render_interface.h)

#pragma once

#include "core/renderer/vertex_data.h"
#include "core/renderer/vertex_buffer.h"
#include "core/renderer/index_buffer.h"
#include "core/renderer/shader.h"
#include "event_manager.h"

#undef interface
#include "RmlUi/Core.h"
#define interface __STRUCT__

class CustomRenderInterface : public Rml::RenderInterface
{
    EventBinder<CustomRenderInterface> m_Binder;

    struct GeometryData
    {
        VertexBuffer vertexBuffer;
        IndexBuffer indexBuffer;
        Rml::TextureHandle textureHandle;

        GeometryData(const UIVertexData* vertices, size_t verticesSize, int* indices, size_t indicesSize, Rml::TextureHandle texture);
    };

    static unsigned int s_TextureCount;

    Ptr<Shader> m_Shader;
    HashMap<unsigned int, Ref<GPUTexture>> m_Textures;
    Microsoft::WRL::ComPtr<ID3D11Buffer> m_ModelMatrixBuffer;
    Matrix m_UITransform;
    int m_Width;
    int m_Height;

    void render(GeometryData* geometry, const Rml::Vector2f& translation);

    Variant windowResized(const Event* event);

public:
    CustomRenderInterface(int width, int height);
    CustomRenderInterface(const CustomRenderInterface&) = delete;
    virtual ~CustomRenderInterface() = default;

    virtual void RenderGeometry(Rml::Vertex* vertices, int numVertices, int* indices, int numIndices, Rml::TextureHandle texture, const Rml::Vector2f& translation) override;

    virtual Rml::CompiledGeometryHandle CompileGeometry(Rml::Vertex* vertices, int numVertices, int* indices, int numIndices, Rml::TextureHandle texture) override;
    virtual void RenderCompiledGeometry(Rml::CompiledGeometryHandle geometry, const Rml::Vector2f& translation) override;
    virtual void ReleaseCompiledGeometry(Rml::CompiledGeometryHandle geometry) override;

    virtual bool LoadTexture(Rml::TextureHandle& textureHandle, Rml::Vector2i& textureDimensions, const String& source) override;
    virtual bool GenerateTexture(Rml::TextureHandle& textureHandle, const byte* source, const Rml::Vector2i& sourceDimensions) override;
    virtual void ReleaseTexture(Rml::TextureHandle texture);

    virtual void EnableScissorRegion(bool enable) override;
    virtual void SetScissorRegion(int x, int y, int width, int height) override;

    virtual void SetTransform(const Rml::Matrix4f* transform) override;
};