120 lines
3.2 KiB
C++
120 lines
3.2 KiB
C++
#pragma once
|
|
|
|
#include <XCEngine/UI/DrawData.h>
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <vector>
|
|
|
|
namespace XCEngine {
|
|
namespace Editor {
|
|
namespace XCUIBackend {
|
|
|
|
class XCUIRHICommandCompiler {
|
|
public:
|
|
struct ColorVertex {
|
|
float position[2] = { 0.0f, 0.0f };
|
|
float color[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
|
};
|
|
|
|
struct TexturedVertex {
|
|
float position[2] = { 0.0f, 0.0f };
|
|
float uv[2] = { 0.0f, 0.0f };
|
|
float color[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
|
};
|
|
|
|
enum class BatchKind : std::uint8_t {
|
|
Color = 0,
|
|
Textured
|
|
};
|
|
|
|
struct Batch {
|
|
BatchKind kind = BatchKind::Color;
|
|
std::uint32_t drawListIndex = 0;
|
|
std::uint32_t firstCommandIndex = 0;
|
|
std::uint32_t commandCount = 0;
|
|
std::uint32_t firstVertex = 0;
|
|
std::uint32_t vertexCount = 0;
|
|
UI::UIRect clipRect = {};
|
|
UI::UITextureHandle texture = {};
|
|
};
|
|
|
|
struct Stats {
|
|
std::size_t drawListCount = 0;
|
|
std::size_t commandCount = 0;
|
|
std::size_t compiledCommandCount = 0;
|
|
std::size_t skippedCommandCount = 0;
|
|
std::size_t culledCommandCount = 0;
|
|
std::size_t unsupportedCommandCount = 0;
|
|
std::size_t filledRectCommandCount = 0;
|
|
std::size_t rectOutlineCommandCount = 0;
|
|
std::size_t textCommandCount = 0;
|
|
std::size_t imageCommandCount = 0;
|
|
std::size_t clipPushCommandCount = 0;
|
|
std::size_t clipPopCommandCount = 0;
|
|
std::size_t colorVertexCount = 0;
|
|
std::size_t texturedVertexCount = 0;
|
|
std::size_t triangleCount = 0;
|
|
std::size_t batchCount = 0;
|
|
std::size_t maxClipDepth = 0;
|
|
std::size_t clipStackUnderflowCount = 0;
|
|
std::size_t danglingClipDepth = 0;
|
|
};
|
|
|
|
struct CompiledDrawData {
|
|
std::vector<ColorVertex> colorVertices = {};
|
|
std::vector<TexturedVertex> texturedVertices = {};
|
|
std::vector<Batch> batches = {};
|
|
Stats stats = {};
|
|
|
|
void Clear();
|
|
bool Empty() const;
|
|
};
|
|
|
|
struct TextRunContext {
|
|
float requestedFontSize = 0.0f;
|
|
float resolvedFontSize = 0.0f;
|
|
float lineHeight = 0.0f;
|
|
UI::UITextureHandle texture = {};
|
|
};
|
|
|
|
struct TextGlyph {
|
|
float x0 = 0.0f;
|
|
float y0 = 0.0f;
|
|
float x1 = 0.0f;
|
|
float y1 = 0.0f;
|
|
float u0 = 0.0f;
|
|
float v0 = 0.0f;
|
|
float u1 = 0.0f;
|
|
float v1 = 0.0f;
|
|
float advanceX = 0.0f;
|
|
bool visible = true;
|
|
};
|
|
|
|
class TextGlyphProvider {
|
|
public:
|
|
virtual ~TextGlyphProvider() = default;
|
|
|
|
virtual bool BeginText(float requestedFontSize, TextRunContext& outContext) const = 0;
|
|
virtual bool ResolveGlyph(
|
|
const TextRunContext& context,
|
|
std::uint32_t codepoint,
|
|
TextGlyph& outGlyph) const = 0;
|
|
};
|
|
|
|
struct CompileConfig {
|
|
UI::UIRect surfaceClipRect = {};
|
|
const TextGlyphProvider* textGlyphProvider = nullptr;
|
|
bool mergeBatchesWithinDrawList = true;
|
|
};
|
|
|
|
void Compile(
|
|
const UI::UIDrawData& drawData,
|
|
const CompileConfig& config,
|
|
CompiledDrawData& outCompiledDrawData) const;
|
|
};
|
|
|
|
} // namespace XCUIBackend
|
|
} // namespace Editor
|
|
} // namespace XCEngine
|