#pragma once #include #include #include #include #include #include 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 vertices; // 顶点数组 std::vector 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); /** * @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& getLines() const { return lines_; } /** * @brief 重新生成顶点数据 */ void rebuild(); /** * @brief 检查是否需要重建 */ bool isDirty() const { return dirty_; } private: Ptr 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 lines_; // 文本行数组 bool dirty_ = true; // 是否需要重建 /** * @brief 构建顶点数据 */ void buildVertices(); }; } // namespace extra2d