Skip to content

Commit 20ffc1b

Browse files
authored
Merge pull request #89 from Legacy-LuaSTG-Engine/feature/new-text-renderer
[graphics] [font] [feature] New FontCollection/TextLayout/TextRenderer
2 parents ff2533f + 00f2f8a commit 20ffc1b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+3973
-623
lines changed

LuaSTG/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ set(LUASTG_ENGINE_SOURCES
5656
LuaSTG/GameResource/ResourcePostEffectShader.hpp
5757
LuaSTG/GameResource/ResourceModel.hpp
5858
LuaSTG/GameResource/ResourceModel.cpp
59+
LuaSTG/GameResource/SharedSpriteRenderer.hpp
60+
LuaSTG/GameResource/SharedSpriteRenderer.cpp
5961

6062
LuaSTG/GameResource/ResourceDebug.cpp
6163
LuaSTG/GameResource/ResourceManager.cpp
@@ -155,6 +157,12 @@ set(LUASTG_ENGINE_SOURCES
155157
LuaSTG/LuaBinding/modern/Well512.cpp
156158
LuaSTG/LuaBinding/modern/ShellIntegration.hpp
157159
LuaSTG/LuaBinding/modern/ShellIntegration.cpp
160+
LuaSTG/LuaBinding/modern/FontCollection.hpp
161+
LuaSTG/LuaBinding/modern/FontCollection.cpp
162+
LuaSTG/LuaBinding/modern/TextLayout.hpp
163+
LuaSTG/LuaBinding/modern/TextLayout.cpp
164+
LuaSTG/LuaBinding/modern/TextRenderer.hpp
165+
LuaSTG/LuaBinding/modern/TextRenderer.cpp
158166

159167
LuaSTG/LuaBinding/generated/BlendModeX.cpp
160168
LuaSTG/LuaBinding/generated/BlendModeX.hpp

LuaSTG/Core.cmake

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ set(Core_SRC
4444
Core/Graphics/Common/FreeTypeGlyphManager.cpp
4545
Core/Graphics/Common/TextRenderer.hpp
4646
Core/Graphics/Common/TextRenderer.cpp
47+
Core/Graphics/Common/TextRenderer2.hpp
48+
Core/Graphics/Common/TextRenderer2.cpp
4749

4850
Core/Graphics/Direct3D11/Constants.hpp
4951
Core/Graphics/Direct3D11/Buffer.hpp
@@ -120,5 +122,6 @@ target_link_libraries(Core PUBLIC
120122
Core.ReferenceCounted
121123
Core.FileSystem
122124
Core.Image
125+
Core.Font
123126
win32
124127
)
Lines changed: 4 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -1,178 +1,35 @@
11
#include "Core/Graphics/Common/Sprite.hpp"
22

33
namespace core::Graphics::Common {
4-
void Sprite::updateRect() {
5-
// 纹理坐标系需要归一化
6-
7-
Vector2U const size = m_texture->getSize();
8-
float const u_scale = 1.0f / static_cast<float>(size.x);
9-
float const v_scale = 1.0f / static_cast<float>(size.y);
10-
m_uv = m_rect;
11-
m_uv.a.x *= u_scale;
12-
m_uv.a.y *= v_scale;
13-
m_uv.b.x *= u_scale;
14-
m_uv.b.y *= v_scale;
15-
16-
// 纹理坐标系 y 轴朝下,渲染坐标系 y 轴朝上
17-
18-
m_pos_rc = m_rect - m_center;
19-
m_pos_rc.a.x *= m_scale;
20-
m_pos_rc.a.y *= -m_scale;
21-
m_pos_rc.b.x *= m_scale;
22-
m_pos_rc.b.y *= -m_scale;
23-
}
24-
254
void Sprite::setTextureRect(RectF const& rc) {
265
m_rect = rc;
27-
updateRect();
286
}
297
void Sprite::setTextureCenter(Vector2F const& pt) {
308
m_center = pt;
31-
updateRect();
329
}
3310
void Sprite::setUnitsPerPixel(float const v) {
3411
m_scale = v;
35-
updateRect();
36-
}
37-
38-
void Sprite::draw(RectF const& rc) {
39-
m_renderer->setTexture(m_texture.get());
40-
41-
IRenderer::DrawVertex const vert[4] = {
42-
IRenderer::DrawVertex(rc.a.x, rc.a.y, m_z, m_uv.a.x, m_uv.a.y, m_color[0].color()),
43-
IRenderer::DrawVertex(rc.b.x, rc.a.y, m_z, m_uv.b.x, m_uv.a.y, m_color[1].color()),
44-
IRenderer::DrawVertex(rc.b.x, rc.b.y, m_z, m_uv.b.x, m_uv.b.y, m_color[2].color()),
45-
IRenderer::DrawVertex(rc.a.x, rc.b.y, m_z, m_uv.a.x, m_uv.b.y, m_color[3].color()),
46-
};
47-
48-
m_renderer->drawQuad(vert);
49-
}
50-
void Sprite::draw(Vector3F const& p1, Vector3F const& p2, Vector3F const& p3, Vector3F const& p4) {
51-
m_renderer->setTexture(m_texture.get());
52-
53-
IRenderer::DrawVertex const vert[4] = {
54-
IRenderer::DrawVertex(p1.x, p1.y, p1.z, m_uv.a.x, m_uv.a.y, m_color[0].color()),
55-
IRenderer::DrawVertex(p2.x, p2.y, p2.z, m_uv.b.x, m_uv.a.y, m_color[1].color()),
56-
IRenderer::DrawVertex(p3.x, p3.y, p3.z, m_uv.b.x, m_uv.b.y, m_color[2].color()),
57-
IRenderer::DrawVertex(p4.x, p4.y, p4.z, m_uv.a.x, m_uv.b.y, m_color[3].color()),
58-
};
59-
60-
m_renderer->drawQuad(vert);
61-
}
62-
void Sprite::draw(Vector2F const& pos) {
63-
draw(pos, Vector2F(1.0f, 1.0f));
64-
}
65-
void Sprite::draw(Vector2F const& pos, float const scale) {
66-
draw(pos, Vector2F(scale, scale));
67-
}
68-
void Sprite::draw(Vector2F const& pos, float const scale, float const rotation) {
69-
if (std::abs(rotation) < std::numeric_limits<float>::min()) {
70-
draw(pos, Vector2F(scale, scale));
71-
return;
72-
}
73-
74-
draw(pos, Vector2F(scale, scale), rotation);
75-
}
76-
void Sprite::draw(Vector2F const& pos, Vector2F const& scale) {
77-
m_renderer->setTexture(m_texture.get());
78-
79-
auto const rect = RectF(
80-
m_pos_rc.a.x * scale.x,
81-
m_pos_rc.a.y * scale.y,
82-
m_pos_rc.b.x * scale.x,
83-
m_pos_rc.b.y * scale.y
84-
);
85-
86-
IRenderer::DrawVertex const vert[4] = {
87-
IRenderer::DrawVertex(pos.x + rect.a.x, pos.y + rect.a.y, m_z, m_uv.a.x, m_uv.a.y, m_color[0].color()),
88-
IRenderer::DrawVertex(pos.x + rect.b.x, pos.y + rect.a.y, m_z, m_uv.b.x, m_uv.a.y, m_color[1].color()),
89-
IRenderer::DrawVertex(pos.x + rect.b.x, pos.y + rect.b.y, m_z, m_uv.b.x, m_uv.b.y, m_color[2].color()),
90-
IRenderer::DrawVertex(pos.x + rect.a.x, pos.y + rect.b.y, m_z, m_uv.a.x, m_uv.b.y, m_color[3].color()),
91-
};
92-
93-
m_renderer->drawQuad(vert);
94-
}
95-
void Sprite::draw(Vector2F const& pos, Vector2F const& scale, float const rotation) {
96-
if (std::abs(rotation) < std::numeric_limits<float>::min()) {
97-
draw(pos, scale);
98-
return;
99-
}
100-
101-
m_renderer->setTexture(m_texture.get());
102-
103-
auto const rect = RectF(
104-
m_pos_rc.a.x * scale.x,
105-
m_pos_rc.a.y * scale.y,
106-
m_pos_rc.b.x * scale.x,
107-
m_pos_rc.b.y * scale.y
108-
);
109-
110-
IRenderer::DrawVertex vert[4] = {
111-
IRenderer::DrawVertex(rect.a.x, rect.a.y, m_z, m_uv.a.x, m_uv.a.y, m_color[0].color()),
112-
IRenderer::DrawVertex(rect.b.x, rect.a.y, m_z, m_uv.b.x, m_uv.a.y, m_color[1].color()),
113-
IRenderer::DrawVertex(rect.b.x, rect.b.y, m_z, m_uv.b.x, m_uv.b.y, m_color[2].color()),
114-
IRenderer::DrawVertex(rect.a.x, rect.b.y, m_z, m_uv.a.x, m_uv.b.y, m_color[3].color()),
115-
};
116-
117-
float const sin_v = std::sinf(rotation);
118-
float const cos_v = std::cosf(rotation);
119-
120-
#define rotate_xy(UNIT) \
121-
{\
122-
float const tx = vert[UNIT].x * cos_v - vert[UNIT].y * sin_v;\
123-
float const ty = vert[UNIT].x * sin_v + vert[UNIT].y * cos_v;\
124-
vert[UNIT].x = tx;\
125-
vert[UNIT].y = ty;\
126-
}
127-
128-
rotate_xy(0);
129-
rotate_xy(1);
130-
rotate_xy(2);
131-
rotate_xy(3);
132-
133-
vert[0].x += pos.x; vert[0].y += pos.y;
134-
vert[1].x += pos.x; vert[1].y += pos.y;
135-
vert[2].x += pos.x; vert[2].y += pos.y;
136-
vert[3].x += pos.x; vert[3].y += pos.y;
137-
138-
m_renderer->drawQuad(vert);
13912
}
14013

14114
bool Sprite::clone(ISprite** const pp_sprite) {
142-
auto const right = new Sprite(m_renderer.get(), m_texture.get());
15+
auto const right = new Sprite(m_texture.get());
14316
right->m_rect = m_rect;
144-
right->m_pos_rc = m_pos_rc;
145-
right->m_uv = m_uv;
14617
right->m_center = m_center;
147-
right->m_z = m_z;
14818
right->m_scale = m_scale;
149-
right->m_color[0] = m_color[0];
150-
right->m_color[1] = m_color[1];
151-
right->m_color[2] = m_color[2];
152-
right->m_color[3] = m_color[3];
15319
*pp_sprite = right;
15420
return true;
15521
}
15622

157-
Sprite::Sprite(IRenderer* const p_renderer, ITexture2D* const p_texture)
158-
: m_renderer(p_renderer)
159-
, m_texture(p_texture)
160-
, m_z(0.5f)
161-
, m_scale(1.0f) {
162-
m_color[0] = Color4B(0xFFFFFFFFu);
163-
m_color[1] = Color4B(0xFFFFFFFFu);
164-
m_color[2] = Color4B(0xFFFFFFFFu);
165-
m_color[3] = Color4B(0xFFFFFFFFu);
23+
Sprite::Sprite(ITexture2D* const p_texture) : m_texture(p_texture), m_scale(1.0f) {
16624
Vector2U const size = m_texture->getSize();
16725
m_rect = RectF(0.0f, 0.0f, static_cast<float>(size.x), static_cast<float>(size.y));
16826
m_center = Vector2F(m_rect.b.x * 0.5f, m_rect.b.y * 0.5f);
169-
updateRect();
17027
}
17128
Sprite::~Sprite() = default;
17229
}
17330
namespace core::Graphics {
174-
bool ISprite::create(IRenderer* const p_renderer, ITexture2D* const p_texture, ISprite** const pp_sprite) {
175-
*pp_sprite = new Common::Sprite(p_renderer, p_texture);
31+
bool ISprite::create(ITexture2D* const p_texture, ISprite** const pp_sprite) {
32+
*pp_sprite = new Common::Sprite(p_texture);
17633
return true;
17734
}
17835
}

LuaSTG/Core/Graphics/Common/Sprite.hpp

Lines changed: 31 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -4,76 +4,35 @@
44
#include "Core/Graphics/Sprite.hpp"
55

66
namespace core::Graphics::Common {
7-
class Sprite final
8-
: public implement::ReferenceCounted<ISprite>
9-
{
10-
public:
11-
// ISprite
12-
13-
ITexture2D* getTexture() override { return m_texture.get(); }
14-
void setTexture(ITexture2D* const p_texture) override { m_texture = p_texture; }
15-
16-
void setTextureRect(RectF const& rc) override;
17-
RectF getTextureRect() override { return m_rect; }
18-
19-
void setTextureCenter(Vector2F const& pt) override;
20-
Vector2F getTextureCenter() override { return m_center; }
21-
22-
void setUnitsPerPixel(float v) override;
23-
float getUnitsPerPixel() override { return m_scale; }
24-
25-
void setZ(float const z) override { m_z = z; }
26-
float getZ() override { return m_z; }
27-
28-
void setColor(Color4B const color) override {
29-
m_color[0] = color;
30-
m_color[1] = color;
31-
m_color[2] = color;
32-
m_color[3] = color;
33-
}
34-
void setColor(Color4B const* const color) override {
35-
m_color[0] = color[0];
36-
m_color[1] = color[1];
37-
m_color[2] = color[2];
38-
m_color[3] = color[3];
39-
}
40-
void getColor(Color4B* const color) override {
41-
color[0] = m_color[0];
42-
color[1] = m_color[1];
43-
color[2] = m_color[2];
44-
color[3] = m_color[3];
45-
}
46-
47-
void draw(RectF const& rc) override;
48-
void draw(Vector3F const& p1, Vector3F const& p2, Vector3F const& p3, Vector3F const& p4) override;
49-
void draw(Vector2F const& pos) override;
50-
void draw(Vector2F const& pos, float scale) override;
51-
void draw(Vector2F const& pos, float scale, float rotation) override;
52-
void draw(Vector2F const& pos, Vector2F const& scale) override;
53-
void draw(Vector2F const& pos, Vector2F const& scale, float rotation) override;
54-
55-
bool clone(ISprite** pp_sprite) override;
56-
57-
// Sprite
58-
59-
Sprite(IRenderer* p_renderer, ITexture2D* p_texture);
60-
Sprite(Sprite const&) = delete;
61-
Sprite(Sprite&&) = delete;
62-
Sprite& operator=(Sprite const&) = delete;
63-
Sprite& operator=(Sprite&&) = delete;
64-
~Sprite();
65-
66-
void updateRect();
67-
68-
private:
69-
SmartReference<IRenderer> m_renderer;
70-
SmartReference<ITexture2D> m_texture;
71-
RectF m_rect;
72-
RectF m_pos_rc;
73-
RectF m_uv;
74-
Vector2F m_center;
75-
float m_z;
76-
float m_scale;
77-
Color4B m_color[4];
78-
};
7+
class Sprite final : public implement::ReferenceCounted<ISprite> {
8+
public:
9+
// ISprite
10+
11+
ITexture2D* getTexture() override { return m_texture.get(); }
12+
void setTexture(ITexture2D* const p_texture) override { m_texture = p_texture; }
13+
void setTextureRect(RectF const& rc) override;
14+
RectF getTextureRect() override { return m_rect; }
15+
void setTextureCenter(Vector2F const& pt) override;
16+
Vector2F getTextureCenter() override { return m_center; }
17+
void setUnitsPerPixel(float v) override;
18+
float getUnitsPerPixel() override { return m_scale; }
19+
20+
bool clone(ISprite** pp_sprite) override;
21+
22+
// Sprite
23+
24+
Sprite(ITexture2D* p_texture);
25+
Sprite(Sprite const&) = delete;
26+
Sprite(Sprite&&) = delete;
27+
~Sprite();
28+
29+
Sprite& operator=(Sprite const&) = delete;
30+
Sprite& operator=(Sprite&&) = delete;
31+
32+
private:
33+
SmartReference<ITexture2D> m_texture;
34+
RectF m_rect;
35+
Vector2F m_center;
36+
float m_scale;
37+
};
7938
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
ImageAtlas
2+
getImage
3+
add
4+
get
5+
remove
6+
clear
7+
8+
SpriteAtlas
9+
getImageAtlas
10+
getTexture
11+
add
12+
get
13+
remove
14+
clear
15+
16+
GlyphCache
17+
code: integer
18+
rect: Rect -- rect on image
19+
uv: Rect -- rect on texture
20+
pen: Vector2 -- glyph image left-top position
21+
advance: Vector2 -- pen move to next position
22+
23+
GlyphCacheManager
24+
setFont(font: Font)
25+
setDefaultSize(size_in_pixel: number)
26+
add(code: integer | string, size_in_pixel: number?): GlyphCache?, string
27+
get(code: integer | string, size_in_pixel: number?): GlyphCache?
28+
remove(code: integer | string, size_in_pixel: number?): boolean
29+
clear()
30+
getSpriteAtlas(): SpriteAtlas
31+
getSprite(code: integer | string, size_in_pixel: number?): Sprite?

0 commit comments

Comments
 (0)