172 lines
3.6 KiB
C++
172 lines
3.6 KiB
C++
#pragma once
|
||
|
||
#include <resource/resource.h>
|
||
#include <resource/font.h>
|
||
#include <types/math/color.h>
|
||
#include <types/math/vec2.h>
|
||
#include <vector>
|
||
#include <string>
|
||
|
||
namespace extra2d {
|
||
|
||
/**
|
||
* @brief 文本对齐方式
|
||
*/
|
||
enum class TextAlign : uint8 {
|
||
Left, // 左对齐
|
||
Center, // 居中对齐
|
||
Right // 右对齐
|
||
};
|
||
|
||
/**
|
||
* @brief 文本顶点结构
|
||
*/
|
||
struct TextVertex {
|
||
Vec2 position; // 位置
|
||
Vec2 uv; // UV 坐标
|
||
Color color; // 颜色
|
||
};
|
||
|
||
/**
|
||
* @brief 文本行信息
|
||
*/
|
||
struct TextLine {
|
||
std::vector<TextVertex> vertices; // 顶点数组
|
||
std::vector<uint16> indices; // 索引数组
|
||
float width = 0.0f; // 行宽度
|
||
float yOffset = 0.0f; // Y 偏移
|
||
};
|
||
|
||
/**
|
||
* @brief 文本资源类
|
||
*
|
||
* 管理文本渲染数据
|
||
*/
|
||
class Text : public Resource {
|
||
public:
|
||
Text();
|
||
~Text() override;
|
||
|
||
/**
|
||
* @brief 获取资源类型
|
||
*/
|
||
ResourceType getType() const override { return ResourceType::Text; }
|
||
|
||
/**
|
||
* @brief 设置字体
|
||
* @param font 字体指针
|
||
*/
|
||
void setFont(Ptr<Font> font);
|
||
|
||
/**
|
||
* @brief 获取字体
|
||
*/
|
||
Font* getFont() const { return font_.get(); }
|
||
|
||
/**
|
||
* @brief 设置文本内容
|
||
* @param text 文本字符串
|
||
*/
|
||
void setText(const std::string& text);
|
||
|
||
/**
|
||
* @brief 获取文本内容
|
||
*/
|
||
const std::string& getText() const { return text_; }
|
||
|
||
/**
|
||
* @brief 设置字体大小
|
||
* @param size 字体大小
|
||
*/
|
||
void setFontSize(float size);
|
||
|
||
/**
|
||
* @brief 获取字体大小
|
||
*/
|
||
float getFontSize() const { return fontSize_; }
|
||
|
||
/**
|
||
* @brief 设置颜色
|
||
* @param color 颜色
|
||
*/
|
||
void setColor(const Color& color);
|
||
|
||
/**
|
||
* @brief 获取颜色
|
||
*/
|
||
const Color& getColor() const { return color_; }
|
||
|
||
/**
|
||
* @brief 设置对齐方式
|
||
* @param align 对齐方式
|
||
*/
|
||
void setAlign(TextAlign align);
|
||
|
||
/**
|
||
* @brief 获取对齐方式
|
||
*/
|
||
TextAlign getAlign() const { return align_; }
|
||
|
||
/**
|
||
* @brief 设置最大宽度(自动换行)
|
||
* @param width 最大宽度,0 表示不限制
|
||
*/
|
||
void setMaxWidth(float width);
|
||
|
||
/**
|
||
* @brief 获取最大宽度
|
||
*/
|
||
float getMaxWidth() const { return maxWidth_; }
|
||
|
||
/**
|
||
* @brief 设置行间距
|
||
* @param spacing 行间距倍数
|
||
*/
|
||
void setLineSpacing(float spacing);
|
||
|
||
/**
|
||
* @brief 获取行间距
|
||
*/
|
||
float getLineSpacing() const { return lineSpacing_; }
|
||
|
||
/**
|
||
* @brief 获取文本尺寸
|
||
*/
|
||
Vec2 getSize() const { return size_; }
|
||
|
||
/**
|
||
* @brief 获取文本行数组
|
||
*/
|
||
const std::vector<TextLine>& getLines() const { return lines_; }
|
||
|
||
/**
|
||
* @brief 重新生成顶点数据
|
||
*/
|
||
void rebuild();
|
||
|
||
/**
|
||
* @brief 检查是否需要重建
|
||
*/
|
||
bool isDirty() const { return dirty_; }
|
||
|
||
private:
|
||
Ptr<Font> font_; // 字体
|
||
std::string text_; // 文本内容
|
||
float fontSize_ = 16.0f; // 字体大小
|
||
Color color_ = Color::White; // 颜色
|
||
TextAlign align_ = TextAlign::Left; // 对齐方式
|
||
float maxWidth_ = 0.0f; // 最大宽度
|
||
float lineSpacing_ = 1.2f; // 行间距
|
||
|
||
Vec2 size_; // 文本尺寸
|
||
std::vector<TextLine> lines_; // 文本行数组
|
||
bool dirty_ = true; // 是否需要重建
|
||
|
||
/**
|
||
* @brief 构建顶点数据
|
||
*/
|
||
void buildVertices();
|
||
};
|
||
|
||
} // namespace extra2d
|