About 3/4 done with new font system
This commit is contained in:
@ -8,87 +8,94 @@
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
UILabelNew::UILabelNew(SceneItem *item) : UIComponentRenderable(item) {
|
||||
UILabelNew::UILabelNew(SceneItem *item) :
|
||||
UIComponentRenderable(item),
|
||||
font(nullptr),
|
||||
fontSize(16),
|
||||
style(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void UILabelNew::rebufferQuads() {
|
||||
this->mesh.createBuffers(QUAD_VERTICE_COUNT * 128, QUAD_INDICE_COUNT * 128);
|
||||
|
||||
auto texture = this->font->getTexture(this->fontLock);
|
||||
texture.
|
||||
}
|
||||
|
||||
void UILabelNew::onStart() {
|
||||
this->shaderBuffer.init();
|
||||
|
||||
if(FT_New_Face(
|
||||
getGame()->renderManager.getFontManager()->fontLibrary,
|
||||
"/usr/share/fonts/TTF/arial.ttf",
|
||||
// "C:\\Windows\\Fonts\\arial.ttf",
|
||||
0,
|
||||
&face
|
||||
)) {
|
||||
assertUnreachable();
|
||||
}
|
||||
UILabelNew::bakeTexture(defFace, face, 32);
|
||||
|
||||
useEffect([&]{
|
||||
if(fontLock != -1) {
|
||||
font.previous->unlock(fontLock);
|
||||
fontLock = -1;
|
||||
}
|
||||
|
||||
if(FT_New_Face(
|
||||
getGame()->renderManager.getFontManager()->fontLibrary,
|
||||
"/usr/share/fonts/TTF/arialbd.ttf",
|
||||
// "C:\\Windows\\Fonts\\arialbd.ttf",
|
||||
0,
|
||||
&faceBold
|
||||
)) {
|
||||
assertUnreachable();
|
||||
}
|
||||
UILabelNew::bakeTexture(defFaceBold, faceBold, 32);
|
||||
if(font == nullptr) return;
|
||||
|
||||
fontLock = font->lock(NewTrueTypeFaceTextureStyle{
|
||||
fontSize,
|
||||
style
|
||||
});
|
||||
}, font);
|
||||
|
||||
if(FT_New_Face(
|
||||
getGame()->renderManager.getFontManager()->fontLibrary,
|
||||
"/usr/share/fonts/TTF/ariali.ttf",
|
||||
// "C:\\Windows\\Fonts\\ariali.ttf",
|
||||
0,
|
||||
&faceItalics
|
||||
)) {
|
||||
assertUnreachable();
|
||||
}
|
||||
UILabelNew::bakeTexture(defFaceItalics, faceItalics, 32);
|
||||
useEffect([&]{
|
||||
if(font == nullptr) return;
|
||||
|
||||
struct FontShaderBufferData fontData;
|
||||
glm::vec2 position = glm::vec2(32, 32);
|
||||
if(fontLock != -1) {
|
||||
font->unlock(fontLock);
|
||||
fontLock = -1;
|
||||
}
|
||||
|
||||
mesh.createBuffers(QUAD_VERTICE_COUNT * 128, QUAD_INDICE_COUNT * 128);
|
||||
auto x = UILabelNew::bufferQuads(
|
||||
"Hello ",
|
||||
fontData,
|
||||
defFace,
|
||||
position,
|
||||
0,
|
||||
0
|
||||
);
|
||||
x += UILabelNew::bufferQuads(
|
||||
" World",
|
||||
fontData,
|
||||
defFaceItalics,
|
||||
position,
|
||||
x,
|
||||
1
|
||||
);
|
||||
x += UILabelNew::bufferQuads(
|
||||
" How are you?",
|
||||
fontData,
|
||||
defFaceBold,
|
||||
position,
|
||||
x,
|
||||
2
|
||||
);
|
||||
fontLock = font->lock(NewTrueTypeFaceTextureStyle{
|
||||
fontSize,
|
||||
style
|
||||
});
|
||||
}, { &fontSize, &style });
|
||||
|
||||
fontData.colors[0] = COLOR_MAGENTA;
|
||||
fontData.textures[0] = 0;
|
||||
fontData.colors[1] = COLOR_RED;
|
||||
fontData.textures[1] = 1;
|
||||
fontData.colors[2] = COLOR_GREEN;
|
||||
fontData.textures[2] = 2;
|
||||
shaderBuffer.buffer(&fontData);
|
||||
// struct FontShaderBufferData fontData;
|
||||
// glm::vec2 position = glm::vec2(32, 32);
|
||||
|
||||
// mesh.createBuffers(QUAD_VERTICE_COUNT * 128, QUAD_INDICE_COUNT * 128);
|
||||
// auto x = UILabelNew::bufferQuads(
|
||||
// "Hello ",
|
||||
// fontData,
|
||||
// defFace,
|
||||
// position,
|
||||
// 0,
|
||||
// 0
|
||||
// );
|
||||
// x += UILabelNew::bufferQuads(
|
||||
// " World",
|
||||
// fontData,
|
||||
// defFaceItalics,
|
||||
// position,
|
||||
// x,
|
||||
// 1
|
||||
// );
|
||||
// x += UILabelNew::bufferQuads(
|
||||
// " How are you?",
|
||||
// fontData,
|
||||
// defFaceBold,
|
||||
// position,
|
||||
// x,
|
||||
// 2
|
||||
// );
|
||||
|
||||
// fontData.colors[0] = COLOR_MAGENTA;
|
||||
// fontData.textures[0] = 0;
|
||||
// fontData.colors[1] = COLOR_RED;
|
||||
// fontData.textures[1] = 1;
|
||||
// fontData.colors[2] = COLOR_GREEN;
|
||||
// fontData.textures[2] = 2;
|
||||
// shaderBuffer.buffer(&fontData);
|
||||
}
|
||||
|
||||
std::vector<struct ShaderPassItem> UILabelNew::getUIRenderPasses() {
|
||||
if(this->fontLock == -1) return {};
|
||||
|
||||
auto canvas = this->getCanvas();
|
||||
auto shader = getGame()->renderManager.fontShader;
|
||||
|
||||
@ -99,12 +106,12 @@ std::vector<struct ShaderPassItem> UILabelNew::getUIRenderPasses() {
|
||||
item.parameterBuffers[shader->bufferUiCanvas] = &canvas->shaderBuffer;
|
||||
item.parameterBuffers[shader->bufferFont] = &this->shaderBuffer;
|
||||
item.renderFlags = RENDER_MANAGER_RENDER_FLAG_BLEND;
|
||||
item.textureSlots[0] = &defFace.texture;
|
||||
item.textureSlots[1] = &defFaceItalics.texture;
|
||||
item.textureSlots[2] = &defFaceBold.texture;
|
||||
item.textureValues[shader->paramTexture0] = 0;
|
||||
item.textureValues[shader->paramTexture1] = 1;
|
||||
item.textureValues[shader->paramTexture2] = 2;
|
||||
// item.textureSlots[0] = &defFace.texture;
|
||||
// item.textureSlots[1] = &defFaceItalics.texture;
|
||||
// item.textureSlots[2] = &defFaceBold.texture;
|
||||
// item.textureValues[shader->paramTexture0] = 0;
|
||||
// item.textureValues[shader->paramTexture1] = 1;
|
||||
// item.textureValues[shader->paramTexture2] = 2;
|
||||
|
||||
return { item };
|
||||
}
|
||||
@ -126,115 +133,115 @@ float_t UILabelNew::getContentHeight() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void UILabelNew::bakeTexture(
|
||||
struct UILabelFontDef &fontDef,
|
||||
FT_Face &face,
|
||||
uint32_t fontSize
|
||||
) {
|
||||
fontDef.face = &face;
|
||||
fontDef.fontSize = fontSize;
|
||||
// void UILabelNew::bakeTexture(
|
||||
// struct UILabelFontDef &fontDef,
|
||||
// FT_Face &face,
|
||||
// uint32_t fontSize
|
||||
// ) {
|
||||
// fontDef.face = &face;
|
||||
// fontDef.fontSize = fontSize;
|
||||
|
||||
if(FT_Set_Pixel_Sizes(face, 0, fontSize)) {
|
||||
assertUnreachable();
|
||||
}
|
||||
// if(FT_Set_Pixel_Sizes(face, 0, fontSize)) {
|
||||
// assertUnreachable();
|
||||
// }
|
||||
|
||||
size_t w = 0, h = 0;
|
||||
FT_ULong c;
|
||||
// size_t w = 0, h = 0;
|
||||
// FT_ULong c;
|
||||
|
||||
for(c = NEW_LABEL_CHAR_BEGIN; c < NEW_LABEL_CHAR_END; c++) {
|
||||
// Load the character
|
||||
if(FT_Load_Char(face, c, FT_LOAD_RENDER | FT_LOAD_MONOCHROME)) {
|
||||
assertUnreachable();
|
||||
}
|
||||
// for(c = NEW_LABEL_CHAR_BEGIN; c < NEW_LABEL_CHAR_END; c++) {
|
||||
// // Load the character
|
||||
// if(FT_Load_Char(face, c, FT_LOAD_RENDER | FT_LOAD_MONOCHROME)) {
|
||||
// assertUnreachable();
|
||||
// }
|
||||
|
||||
// Update the width and height
|
||||
w = mathMax<size_t>(w, face->glyph->bitmap.width);
|
||||
h += face->glyph->bitmap.rows;
|
||||
}
|
||||
// // Update the width and height
|
||||
// w = mathMax<size_t>(w, face->glyph->bitmap.width);
|
||||
// h += face->glyph->bitmap.rows;
|
||||
// }
|
||||
|
||||
assertTrue(w > 0);
|
||||
assertTrue(h > 0);
|
||||
// assertTrue(w > 0);
|
||||
// assertTrue(h > 0);
|
||||
|
||||
// Now buffer pixels to the texture
|
||||
float_t y = 0;
|
||||
// // Now buffer pixels to the texture
|
||||
// float_t y = 0;
|
||||
|
||||
// I'd love to just buffer straight to the GPU, but it seems that is a bit
|
||||
// unstable right now.
|
||||
uint8_t *buffer = (uint8_t *)memoryFillWithZero(w * h * sizeof(uint8_t));
|
||||
// // I'd love to just buffer straight to the GPU, but it seems that is a bit
|
||||
// // unstable right now.
|
||||
// uint8_t *buffer = (uint8_t *)memoryFillWithZero(w * h * sizeof(uint8_t));
|
||||
|
||||
size_t offset = 0;
|
||||
for(c = NEW_LABEL_CHAR_BEGIN; c < NEW_LABEL_CHAR_END; c++) {
|
||||
// Load the character
|
||||
if(FT_Load_Char(face, c, FT_LOAD_RENDER)) {
|
||||
assertUnreachable();
|
||||
}
|
||||
// size_t offset = 0;
|
||||
// for(c = NEW_LABEL_CHAR_BEGIN; c < NEW_LABEL_CHAR_END; c++) {
|
||||
// // Load the character
|
||||
// if(FT_Load_Char(face, c, FT_LOAD_RENDER)) {
|
||||
// assertUnreachable();
|
||||
// }
|
||||
|
||||
// Store the character information
|
||||
struct UILabelChar info;
|
||||
info.advanceX = face->glyph->advance.x;
|
||||
info.advanceY = face->glyph->advance.y;
|
||||
info.bitmapSize = glm::vec2(face->glyph->bitmap.width, face->glyph->bitmap.rows);
|
||||
info.bitmapPosition = glm::vec2(face->glyph->bitmap_left, -face->glyph->bitmap_top);
|
||||
info.textureY = y;
|
||||
fontDef.charStore[c] = info;
|
||||
// // Store the character information
|
||||
// struct UILabelChar info;
|
||||
// info.advanceX = face->glyph->advance.x;
|
||||
// info.advanceY = face->glyph->advance.y;
|
||||
// info.bitmapSize = glm::vec2(face->glyph->bitmap.width, face->glyph->bitmap.rows);
|
||||
// info.bitmapPosition = glm::vec2(face->glyph->bitmap_left, -face->glyph->bitmap_top);
|
||||
// info.textureY = y;
|
||||
// fontDef.charStore[c] = info;
|
||||
|
||||
// Buffer the pixels, oh dear GOD there has to be a more efficient way.
|
||||
for(int32_t i = 0; i < face->glyph->bitmap.rows; i++) {
|
||||
memoryCopy(
|
||||
(void *)(face->glyph->bitmap.buffer + (i * face->glyph->bitmap.width)),
|
||||
(void *)(buffer + offset),
|
||||
face->glyph->bitmap.width * sizeof(uint8_t)
|
||||
);
|
||||
offset += w * sizeof(uint8_t);
|
||||
assertTrue(offset <= (w * h * sizeof(uint8_t)));
|
||||
}
|
||||
y += face->glyph->bitmap.rows;
|
||||
}
|
||||
// // Buffer the pixels, oh dear GOD there has to be a more efficient way.
|
||||
// for(int32_t i = 0; i < face->glyph->bitmap.rows; i++) {
|
||||
// memoryCopy(
|
||||
// (void *)(face->glyph->bitmap.buffer + (i * face->glyph->bitmap.width)),
|
||||
// (void *)(buffer + offset),
|
||||
// face->glyph->bitmap.width * sizeof(uint8_t)
|
||||
// );
|
||||
// offset += w * sizeof(uint8_t);
|
||||
// assertTrue(offset <= (w * h * sizeof(uint8_t)));
|
||||
// }
|
||||
// y += face->glyph->bitmap.rows;
|
||||
// }
|
||||
|
||||
fontDef.texture.setSize(w, h, TEXTURE_FORMAT_R);
|
||||
fontDef.texture.buffer(buffer);
|
||||
memoryFree(buffer);
|
||||
}
|
||||
// fontDef.texture.setSize(w, h, TEXTURE_FORMAT_R);
|
||||
// fontDef.texture.buffer(buffer);
|
||||
// memoryFree(buffer);
|
||||
// }
|
||||
|
||||
int32_t UILabelNew::bufferQuads(
|
||||
std::string text,
|
||||
struct FontShaderBufferData &bufferData,
|
||||
struct UILabelFontDef &fontDef,
|
||||
glm::vec2 &position,
|
||||
int32_t quadStart,
|
||||
int32_t partIndex
|
||||
) {
|
||||
// Get string length
|
||||
int32_t len = text.length();
|
||||
// int32_t UILabelNew::bufferQuads(
|
||||
// std::string text,
|
||||
// struct FontShaderBufferData &bufferData,
|
||||
// struct UILabelFontDef &fontDef,
|
||||
// glm::vec2 &position,
|
||||
// int32_t quadStart,
|
||||
// int32_t partIndex
|
||||
// ) {
|
||||
// // Get string length
|
||||
// int32_t len = text.length();
|
||||
|
||||
glm::vec2 wh = glm::vec2(fontDef.texture.getWidth(), fontDef.texture.getHeight());
|
||||
// glm::vec2 wh = glm::vec2(fontDef.texture.getWidth(), fontDef.texture.getHeight());
|
||||
|
||||
// For each char
|
||||
for(int32_t i = 0; i < len; i++) {
|
||||
char ch = text[i];
|
||||
int32_t j = quadStart + i;
|
||||
FT_ULong c = ch;
|
||||
auto &charInfo = fontDef.charStore[c];
|
||||
// // For each char
|
||||
// for(int32_t i = 0; i < len; i++) {
|
||||
// char ch = text[i];
|
||||
// int32_t j = quadStart + i;
|
||||
// FT_ULong c = ch;
|
||||
// auto &charInfo = fontDef.charStore[c];
|
||||
|
||||
// Determine texture coordinates.
|
||||
glm::vec2 uv0 = glm::vec2(0.0f, charInfo.textureY) / wh;
|
||||
glm::vec2 uv1 = uv0 + (charInfo.bitmapSize / wh);
|
||||
// // Determine texture coordinates.
|
||||
// glm::vec2 uv0 = glm::vec2(0.0f, charInfo.textureY) / wh;
|
||||
// glm::vec2 uv1 = uv0 + (charInfo.bitmapSize / wh);
|
||||
|
||||
// Buffer the quad.
|
||||
QuadMesh::bufferQuadMeshWithZ(&this->mesh,
|
||||
position + charInfo.bitmapPosition, uv0,
|
||||
position + charInfo.bitmapPosition + charInfo.bitmapSize, uv1,
|
||||
0.0f,
|
||||
j * QUAD_VERTICE_COUNT, j * QUAD_INDICE_COUNT
|
||||
);
|
||||
// // Buffer the quad.
|
||||
// QuadMesh::bufferQuadMeshWithZ(&this->mesh,
|
||||
// position + charInfo.bitmapPosition, uv0,
|
||||
// position + charInfo.bitmapPosition + charInfo.bitmapSize, uv1,
|
||||
// 0.0f,
|
||||
// j * QUAD_VERTICE_COUNT, j * QUAD_INDICE_COUNT
|
||||
// );
|
||||
|
||||
// Move the current position along.
|
||||
position.x += (float_t)(charInfo.advanceX >> 6);
|
||||
position.y += (float_t)(charInfo.advanceY >> 6);
|
||||
// // Move the current position along.
|
||||
// position.x += (float_t)(charInfo.advanceX >> 6);
|
||||
// position.y += (float_t)(charInfo.advanceY >> 6);
|
||||
|
||||
// Set the part index to the quad mappings
|
||||
bufferData.fontQuadMappings[j] = partIndex;
|
||||
}
|
||||
// // Set the part index to the quad mappings
|
||||
// bufferData.fontQuadMappings[j] = partIndex;
|
||||
// }
|
||||
|
||||
return len;
|
||||
}
|
||||
// return len;
|
||||
// }
|
@ -6,11 +6,12 @@
|
||||
#pragma once
|
||||
#include "scene/components/ui/UIComponentRenderable.hpp"
|
||||
#include "display/mesh/QuadMesh.hpp"
|
||||
#include "asset/assets/NewTrueTypeAsset.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
struct UILabelStyle {
|
||||
struct Color;
|
||||
UILabelFontDef *fontDef;
|
||||
// UILabelFontDef *fontDef;
|
||||
};
|
||||
|
||||
class UILabelNew : public UIComponentRenderable {
|
||||
@ -18,13 +19,15 @@ namespace Dawn {
|
||||
Mesh mesh;
|
||||
FontShaderBuffer shaderBuffer;
|
||||
|
||||
FT_Face face;
|
||||
FT_Face faceBold;
|
||||
FT_Face faceItalics;
|
||||
usagelockid_t fontLock = -1;
|
||||
|
||||
struct UILabelFontDef defFace;
|
||||
struct UILabelFontDef defFaceBold;
|
||||
struct UILabelFontDef defFaceItalics;
|
||||
// FT_Face face;
|
||||
// FT_Face faceBold;
|
||||
// FT_Face faceItalics;
|
||||
|
||||
// struct UILabelFontDef defFace;
|
||||
// struct UILabelFontDef defFaceBold;
|
||||
// struct UILabelFontDef defFaceItalics;
|
||||
|
||||
/**
|
||||
* Buffers the quads for the given text and updates the progressing values
|
||||
@ -38,16 +41,22 @@ namespace Dawn {
|
||||
* @param partIndex The part index to store for each quad buffered.
|
||||
* @return The number of quads buffered, not the string length.
|
||||
*/
|
||||
int32_t bufferQuads(
|
||||
std::string text,
|
||||
struct FontShaderBufferData &bufferData,
|
||||
struct UILabelFontDef &fontDef,
|
||||
glm::vec2 &position,
|
||||
int32_t quadStart,
|
||||
int32_t partIndex
|
||||
);
|
||||
// int32_t bufferQuads(
|
||||
// std::string text,
|
||||
// struct FontShaderBufferData &bufferData,
|
||||
// struct UILabelFontDef &fontDef,
|
||||
// glm::vec2 &position,
|
||||
// int32_t quadStart,
|
||||
// int32_t partIndex
|
||||
// );
|
||||
|
||||
void rebufferQuads();
|
||||
|
||||
public:
|
||||
StateProperty<NewTrueTypeAsset*> font;
|
||||
StateProperty<uint32_t> fontSize;
|
||||
StateProperty<flag_t> style;
|
||||
|
||||
UILabelNew(SceneItem *item);
|
||||
|
||||
void onStart() override;
|
||||
|
Reference in New Issue
Block a user