From eea8f5f69376a4256353b2de921c56868c4194bf Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Mon, 24 Oct 2022 22:28:53 -0700 Subject: [PATCH] Font working --- src/dawn/display/font/TrueTypeFont.cpp | 4 +- src/dawn/display/font/TrueTypeFont.hpp | 2 +- src/dawn/display/shader/_Shader.hpp | 2 +- .../scene/components/display/Material.hpp | 2 +- src/dawn/ui/CMakeLists.txt | 1 + src/dawn/ui/UILabel.cpp | 57 +++++++++++++++++++ src/dawn/ui/UILabel.hpp | 36 ++++++++++++ src/dawn/ui/UISprite.cpp | 1 + src/dawn/ui/UISprite.hpp | 2 + src/dawnopengl/display/shader/Shader.cpp | 2 +- src/dawnopengl/display/shader/Shader.hpp | 7 +-- .../display/shader/SimpleTexturedShader.hpp | 2 +- src/dawnopengl/display/shader/UIShader.hpp | 4 +- src/dawnpokergame/game/DawnPokerGame.cpp | 41 +++++++------ src/dawnpokergame/game/DawnPokerGame.hpp | 1 + 15 files changed, 132 insertions(+), 32 deletions(-) create mode 100644 src/dawn/ui/UILabel.cpp create mode 100644 src/dawn/ui/UILabel.hpp diff --git a/src/dawn/display/font/TrueTypeFont.cpp b/src/dawn/display/font/TrueTypeFont.cpp index 251f5525..fd733906 100644 --- a/src/dawn/display/font/TrueTypeFont.cpp +++ b/src/dawn/display/font/TrueTypeFont.cpp @@ -33,7 +33,7 @@ float_t TrueTypeFont::getSpaceSize(float_t fontSize) { } float_t TrueTypeFont::getInitialLineHeight(float_t fontSize) { - return mathRoundFloat(this->getScale(fontSize) * 11.0f); + return 8.0f; } void TrueTypeFont::buffer( @@ -185,7 +185,7 @@ void TrueTypeFont::draw(Mesh &mesh, int32_t startchar, int32_t length) { } float_t TrueTypeFont::getLineHeight(float_t fontSize) { - return mathRoundFloat(this->getScale(fontSize) * 14.0f); + return 13.0f; } float_t TrueTypeFont::getDefaultFontSize() { diff --git a/src/dawn/display/font/TrueTypeFont.hpp b/src/dawn/display/font/TrueTypeFont.hpp index 6adfd2a3..98be39e5 100644 --- a/src/dawn/display/font/TrueTypeFont.hpp +++ b/src/dawn/display/font/TrueTypeFont.hpp @@ -14,7 +14,7 @@ namespace Dawn { #define TRUETYPE_NUM_CHARS 96 /** Refer to STBTT docs for OpenGL Fill Mode v d3d Fill Modes */ - #define TRUETYPE_FILL_MODE 1 + #define TRUETYPE_FILL_MODE 0 typedef stbtt_bakedchar truetypechar_t; typedef stbtt_aligned_quad truetypequad_t; diff --git a/src/dawn/display/shader/_Shader.hpp b/src/dawn/display/shader/_Shader.hpp index a9b531c3..2603f6f6 100644 --- a/src/dawn/display/shader/_Shader.hpp +++ b/src/dawn/display/shader/_Shader.hpp @@ -101,6 +101,6 @@ namespace Dawn { * @param parameter parameter to set the texture on to. * @param texture Texture to bind to the parameter. */ - virtual void setTexture(T parameter, std::shared_ptr texture)=0; + virtual void setTexture(T parameter, Texture *texture) = 0; }; } \ No newline at end of file diff --git a/src/dawn/scene/components/display/Material.hpp b/src/dawn/scene/components/display/Material.hpp index 6daf62a2..172fd9e1 100644 --- a/src/dawn/scene/components/display/Material.hpp +++ b/src/dawn/scene/components/display/Material.hpp @@ -26,7 +26,7 @@ namespace Dawn { std::map boolValues; std::map matrixValues; std::map vec3Values; - std::map> textureValues; + std::map textureValues; /** * Material component constructor. diff --git a/src/dawn/ui/CMakeLists.txt b/src/dawn/ui/CMakeLists.txt index 41928fc7..87d0bafc 100644 --- a/src/dawn/ui/CMakeLists.txt +++ b/src/dawn/ui/CMakeLists.txt @@ -7,5 +7,6 @@ target_sources(${DAWN_TARGET_NAME} PRIVATE UIComponent.cpp + UILabel.cpp UISprite.cpp ) \ No newline at end of file diff --git a/src/dawn/ui/UILabel.cpp b/src/dawn/ui/UILabel.cpp new file mode 100644 index 00000000..9106f9db --- /dev/null +++ b/src/dawn/ui/UILabel.cpp @@ -0,0 +1,57 @@ +// Copyright (c) 2022 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +#include "UILabel.hpp" + +using namespace Dawn; + +UILabel::UILabel(UICanvas &canvas) : UIComponent(canvas) { + +} + +void UILabel::updateMesh() { + if(!this->needsRebuffering) return; + if(this->font == nullptr) return; + + this->font->buffer( + this->text, + this->fontSize, + -1, + this->mesh, + &this->measure + ); + + this->needsRebuffering = false; +} + +std::string UILabel::getText() { + return this->text; +} + +void UILabel::setFont(Font *font) { + this->font = font; + this->needsRebuffering = true; +} + +void UILabel::setText(std::string text) { + this->text = text; + this->needsRebuffering = true; +} + +void UILabel::setFontSize(float_t fontSize) { + this->fontSize = fontSize; + this->needsRebuffering = true; +} + +void UILabel::drawSelf(UIShader &shader, glm::mat4 selfTransform) { + if(this->font == nullptr) return; + + this->updateMesh(); + shader.setUIColor(this->textColor); + shader.setUIModel(selfTransform); + shader.setUITexture(&this->font->getTexture()); + + this->font->draw(this->mesh, 0, -1); +} \ No newline at end of file diff --git a/src/dawn/ui/UILabel.hpp b/src/dawn/ui/UILabel.hpp new file mode 100644 index 00000000..be2234bd --- /dev/null +++ b/src/dawn/ui/UILabel.hpp @@ -0,0 +1,36 @@ +// Copyright (c) 2022 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +#pragma once +#include "UIComponent.hpp" +#include "display/mesh/QuadMesh.hpp" +#include "display/font/Font.hpp" + +namespace Dawn { + class UILabel : public UIComponent { + private: + Mesh mesh; + struct FontMeasure measure; + bool_t needsRebuffering = true; + Font *font = nullptr; + std::string text = ""; + float_t fontSize = 10.0f; + + void updateMesh(); + + public: + struct Color textColor = COLOR_MAGENTA; + + UILabel(UICanvas &canvas); + + std::string getText(); + + void setFont(Font *font); + void setText(std::string text); + void setFontSize(float_t fontSize); + + void drawSelf(UIShader &shader, glm::mat4 selfTransform); + }; +} \ No newline at end of file diff --git a/src/dawn/ui/UISprite.cpp b/src/dawn/ui/UISprite.cpp index 7d707448..d821d34b 100644 --- a/src/dawn/ui/UISprite.cpp +++ b/src/dawn/ui/UISprite.cpp @@ -29,6 +29,7 @@ void UISprite::drawSelf(UIShader &uiShader, glm::mat4 selfTransform) { uiShader.setUIModel(selfTransform); uiShader.setUIModel(glm::mat4(1.0f)); uiShader.setUIColor(COLOR_WHITE); + uiShader.setUITexture(this->texture); this->mesh.draw(MESH_DRAW_MODE_TRIANGLES, 0, -1); } \ No newline at end of file diff --git a/src/dawn/ui/UISprite.hpp b/src/dawn/ui/UISprite.hpp index 5f818401..286cf5e7 100644 --- a/src/dawn/ui/UISprite.hpp +++ b/src/dawn/ui/UISprite.hpp @@ -6,6 +6,7 @@ #pragma once #include "UIComponent.hpp" #include "display/mesh/QuadMesh.hpp" +#include "display/Texture.hpp" namespace Dawn { class UISprite : public UIComponent { @@ -14,6 +15,7 @@ namespace Dawn { public: Mesh mesh; + Texture *texture; UISprite(UICanvas &canvas); diff --git a/src/dawnopengl/display/shader/Shader.cpp b/src/dawnopengl/display/shader/Shader.cpp index 59be3d3f..d1edbb2d 100644 --- a/src/dawnopengl/display/shader/Shader.cpp +++ b/src/dawnopengl/display/shader/Shader.cpp @@ -87,7 +87,7 @@ void Shader::setVector3(shaderparameter_t uniform, glm::vec3 vector) { void Shader::setTexture( shaderparameter_t param, - std::shared_ptr texture + Texture *texture ) { if(texture == nullptr || !texture->isReady()) { this->bindTexture(param, nullptr); diff --git a/src/dawnopengl/display/shader/Shader.hpp b/src/dawnopengl/display/shader/Shader.hpp index eccfab85..35f6bc00 100644 --- a/src/dawnopengl/display/shader/Shader.hpp +++ b/src/dawnopengl/display/shader/Shader.hpp @@ -51,7 +51,7 @@ namespace Dawn { */ virtual void bindTexture( shaderparameter_t param, - std::shared_ptr texture + Texture *texture ) = 0; @@ -75,10 +75,7 @@ namespace Dawn { void setBoolean(shaderparameter_t parameter, bool_t value) override; void setColor(shaderparameter_t parameter, struct Color color) override; void setVector3(shaderparameter_t parameter, glm::vec3 vector) override; - void setTexture( - shaderparameter_t parameter, - std::shared_ptr texture - ) override; + void setTexture(shaderparameter_t parameter, Texture *texture) override; /** * Destroys and deletes the shader from the GPU. diff --git a/src/dawnopengl/display/shader/SimpleTexturedShader.hpp b/src/dawnopengl/display/shader/SimpleTexturedShader.hpp index 984eb9ca..90ad42c4 100644 --- a/src/dawnopengl/display/shader/SimpleTexturedShader.hpp +++ b/src/dawnopengl/display/shader/SimpleTexturedShader.hpp @@ -43,7 +43,7 @@ namespace Dawn { void bindTexture( shaderparameter_t param, - std::shared_ptr texture + Texture *texture ) override { if(texture == nullptr) { this->setBoolean(this->paramHasTexture, false); diff --git a/src/dawnopengl/display/shader/UIShader.hpp b/src/dawnopengl/display/shader/UIShader.hpp index e25cedc6..4db51f60 100644 --- a/src/dawnopengl/display/shader/UIShader.hpp +++ b/src/dawnopengl/display/shader/UIShader.hpp @@ -43,7 +43,7 @@ namespace Dawn { void bindTexture( shaderparameter_t param, - std::shared_ptr texture + Texture *texture ) override { if(texture == nullptr) { this->setBoolean(this->paramHasTexture, false); @@ -108,7 +108,7 @@ namespace Dawn { this->setMatrix(this->paramModel, model); } - void setUITexture(std::shared_ptr texture) { + void setUITexture(Texture *texture) { this->bindTexture(this->paramTexture, texture); } diff --git a/src/dawnpokergame/game/DawnPokerGame.cpp b/src/dawnpokergame/game/DawnPokerGame.cpp index f34731c0..b69cf8a3 100644 --- a/src/dawnpokergame/game/DawnPokerGame.cpp +++ b/src/dawnpokergame/game/DawnPokerGame.cpp @@ -10,6 +10,8 @@ using namespace Dawn; std::shared_ptr asset; std::shared_ptr assetTexture; +std::shared_ptr label; +float_t fs = 1.0f; DawnGame::DawnGame(DawnHost &host) : host(host), @@ -25,16 +27,9 @@ int32_t DawnGame::init() { auto cameraObject = this->scene->createSceneItem(); auto camera = cameraObject->addComponent(); - camera->transform.lookAt(glm::vec3(5, 5, 5), glm::vec3(0, 0, 0)); + camera->transform.lookAt(glm::vec3(50, 50, 50), glm::vec3(0, 0, 0)); - // auto canvas = UICanvas::createCanvas(this->scene); - // auto test = canvas->addElement(); - // test->setTransform( - // UI_COMPONENT_ALIGN_START, - // UI_COMPONENT_ALIGN_START, - // glm::vec4(0, 0, 32, 32), - // 0 - // ); + auto canvas = UICanvas::createCanvas(this->scene); asset = this->assetManager.load("truetype_ark"); assetTexture = this->assetManager.load("texture_test"); @@ -42,17 +37,25 @@ int32_t DawnGame::init() { this->assetManager.update(); } + // auto sprite = canvas->addElement(); + // sprite->setTransform( + // UI_COMPONENT_ALIGN_START, + // UI_COMPONENT_ALIGN_START, + // glm::vec4(0, 0, 200, 200), + // 0 + // ); + // sprite->texture = &asset->font.getTexture(); - auto text = this->scene->createSceneItem(); - auto meshRenderer = text->addComponent(); - auto material = text->addComponent(); - meshRenderer->mesh = std::make_shared(); - // meshRenderer->mesh->createBuffers(QUAD_VERTICE_COUNT, QUAD_INDICE_COUNT); - // QuadMesh::bufferQuadMesh(*meshRenderer->mesh, glm::vec2(0, 0), glm::vec2(0, 0), glm::vec2(1, 1), glm::vec2(1, 1), 0, 0); - struct FontMeasure measure; - asset->font.buffer("Test", 16.0f, -1, *meshRenderer->mesh, &measure); - material->textureValues[material->getShader()->getParameterByName("u_Text")] = std::shared_ptr(&asset->font.getTexture()); + label = canvas->addElement(); + label->setTransform( + UI_COMPONENT_ALIGN_START, + UI_COMPONENT_ALIGN_START, + glm::vec4(0, 0, 200, 200), + 0 + ); + label->setText("Hello World\nHow are you today?"); + label->setFont(&asset->font); return DAWN_GAME_INIT_RESULT_SUCCESS; } @@ -61,6 +64,8 @@ int32_t DawnGame::update(float_t delta) { this->assetManager.update(); if(this->scene != nullptr) this->scene->update(); + + label->setFontSize(fs += delta); this->renderManager.update(); diff --git a/src/dawnpokergame/game/DawnPokerGame.hpp b/src/dawnpokergame/game/DawnPokerGame.hpp index 1b308e0e..f87d5c43 100644 --- a/src/dawnpokergame/game/DawnPokerGame.hpp +++ b/src/dawnpokergame/game/DawnPokerGame.hpp @@ -6,5 +6,6 @@ #pragma once #include "game/DawnGame.hpp" #include "scene/components/Components.hpp" +#include "ui/UILabel.hpp" #include "ui/UISprite.hpp" #include "asset/assets/TrueTypeAsset.hpp" \ No newline at end of file