Extra2D/include/resource/text.h

172 lines
3.6 KiB
C
Raw Normal View History

#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