1#include "Rendering/ICapabilities.h"
8#include "Systems/Core/TransformSystem.h"
9#include "Systems/Core/SpriteRenderSystem.h"
11#include "Resources/MaterialManager.h"
12#include "Resources/FontManager.h"
13#include "Resources/Texture.h"
19 if (
context->device->getCapabilities()->getDeviceCapabilities().GeometryShaders) {
20 textMaterial =
context->materialManager->loadMaterial(
"Materials/TextMaterial.material");
23 textMaterial =
context->materialManager->loadMaterial(
"Materials/TextNoGsMaterial.material");
25 context->materialManager->processLoading();
30 spriteMaterial =
context->spriteRenderSystem->registerSpriteMaterial(textMaterial);
35 for (
auto & component : pool) {
36 if (!component.transformComponent) {
42 auto fontManager = context->fontManager;
43 auto sprites = context->spriteRenderSystem;
44 for (
auto & textComponent : pool) {
45 if (!textComponent.texts.size())
continue;
46 if (!textComponent.spriteRenderComponent)
continue;
50 if (!spriteRenderer->isVisible())
continue;
52 auto font = textComponent.fontHandle.resolve();
53 if (!font) font = context->fontManager->getHandle(context->fontManager->DefaultRegularFont).resolve();
55 if (!font || !font->isActive())
continue;
56 if (!font->texture)
continue;
57 if (!font->texture->isActive())
continue;
59 auto batch = sprites->begin(spriteMaterial,
60 font->sdf ?
"Sdf" :
"",
61 textComponent.positionMode,
72 const bool useOffsets = textComponent.positions.size() == textComponent.texts.size();
73 const auto transformComponent = textComponent.transformComponent.resolveComponent<
TransformComponent>();
75 for (
size_t i = 0; i < textComponent.texts.size(); ++i) {
76 auto & text = textComponent.texts[i];
78 if (textComponent.colors.size() == textComponent.texts.size()) {
79 batch = sprites->begin(spriteMaterial,
80 font->sdf ?
"Sdf" :
"",
81 textComponent.positionMode,
84 textComponent.colors[i]);
88 const glm::vec3 offset = useOffsets ? textComponent.positions[i] : glm::vec3(0.0f);
89 glm::vec3 startPosition = glm::vec3(0.0f);
93 auto & localToWorld = context->transformSystem->getLocalToWorld(transformComponent);
94 auto position = glm::vec3(localToWorld * glm::vec4(0, 0, 0, 1));
95 startPosition = glm::vec4(position + offset, 1);
96 }
else if (textComponent.positionMode == PositionMode::Local) {
97 startPosition = glm::vec4(offset, 1);
98 batch->transform = context->transformSystem->getLocalToWorld(transformComponent);
100 startPosition += transformComponent->position + offset;
103 batch->depth = std::max(batch->depth, depth);
105 const float factor = 0.72f;
106 float verticalOffset = 0.0f;
107 switch (textComponent.verticalAlignment) {
109 verticalOffset = (font->size / 2.0f) * factor;
112 verticalOffset = (font->size) * factor;
122 for (
size_t ii = 0; ii < text.size(); ++ii) {
124 fontManager->getBakedCharacter(font, text[ii], x, y, q);
126 glm::vec2 offset2 = {
127 (q.x0 + q.x1) * 0.5f,
128 (q.y0 + q.y1) * -0.5f - verticalOffset,
143 sprites->addSprite(spriteRenderer, startPosition, offset2, size, uv);
146 const float startX = x;
148 for (
size_t ii = 0; ii < text.size(); ++ii) {
150 fontManager->getBakedCharacter(font, text[text.size() - 1 - ii], x, y, q);
152 const float width = q.x1 - q.x0;
153 const float start = startX - (q.x0 - startX);
155 glm::vec2 offset2 = {
156 start - width * 0.5f,
157 (q.y0 + q.y1) * -0.5f - verticalOffset,
172 sprites->addSprite(spriteRenderer, startPosition, offset2, size, uv);
177 fontManager->getBakedCharacter(font, text[0], x, y, q0);
180 for (
size_t ii = 1; ii < text.size(); ++ii)
181 fontManager->getBakedCharacter(font, text[ii], x, y, qn);
184 const float horizontalOffset = (qn.x1 - q0.x0) * 0.5f;
186 for (
size_t ii = 0; ii < text.size(); ++ii) {
188 fontManager->getBakedCharacter(font, text[ii], x, y, q);
190 glm::vec2 offset_ = {
191 (q.x0 + q.x1) * 0.5f - horizontalOffset,
192 (q.y0 + q.y1) * -0.5f - verticalOffset,
207 sprites->addSprite(spriteRenderer, startPosition, offset_, size, uv);
212 batch->flags |= RenderItemFlags::CalculateDepth;
ComponentHandle getComponentHandle() const
Context * context
Pointer to the Context instance the system lives in.
virtual void initialize(Context *context)
Initialize the system.
void update()
Updates the system state to that of the current frame.
A Context instance contains all the services, systems and runtime components needed to use Cogs.
void initialize(Context *context) override
Initialize the system.
@ World
Position given in world space coordinates.
@ Right
The rightmost character is placed to the left of the screen position.
@ Left
The leftmost character is placed to the right of the screen position.
@ Blend
Render with regular alpha blending.
@ Pixels
Size given in screen pixels.
@ Bottom
Align the text towards the bottom, making the position minus the font height the baseline of the text...
@ Center
Center the text on the screen position.
Defines a quad with locations in screen space defined by [x0, y0] and [x1, y1].
BlendMode blendMode
Blend mode to use when rendering geometry with the material instance.
bool depthWriteEnabled
If depth writes should be enabled rendering the geometry with the material instance.
MaterialOptions options
Material rendering options.