From 35ccac66b962c09cf7806f97e22bce942afc4fb2 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Wed, 16 Feb 2022 08:58:05 +0200 Subject: [PATCH] implemented font reader --- CMakeLists.txt | 2 +- abstractAssetReader.cpp | 4 ++++ abstractAssetReader.h | 15 +++++++++++++++ fontAsset.h | 2 +- fontReader.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ fontReader.h | 29 +++++++++++++++++++++++++++++ text.cpp | 22 +++++++--------------- textSample.cpp | 7 +++++++ 8 files changed, 104 insertions(+), 17 deletions(-) create mode 100644 abstractAssetReader.cpp create mode 100644 abstractAssetReader.h create mode 100644 fontReader.cpp create mode 100644 fontReader.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b0b9a3..00835be 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ set(RENDER lineRenderer.cpp particleEmitter.cpp camera.cpp light.cpp material.cp set(MODEL modelReader.cpp assimpModelReader.cpp vbModelReader.cpp) set(ANIM animationController.cpp animationChannel.cpp animation.cpp animatable.h keyframeChannel.cpp driver.cpp) set(ARMATURE skeleton.cpp bone.cpp ikSolver.cpp) -set(ASSET_READERS abstractAssetReader.cpp imageReader.cpp) +set(ASSET_READERS abstractAssetReader.cpp imageReader.cpp fontReader.cpp) set(ASSET_MANAGER assetManager.cpp textAsset.h imageAsset.h modelAsset.h fontAsset.h) set(LIB_SRC ${RENDER} ${MATH} ${MODEL} ${UTILS} ${GUI} ${ARMATURE} ${ASSET_MANAGER} ${ASSET_READERS} ${ANIM}) diff --git a/abstractAssetReader.cpp b/abstractAssetReader.cpp new file mode 100644 index 0000000..b6f3ffe --- /dev/null +++ b/abstractAssetReader.cpp @@ -0,0 +1,4 @@ +#include "abstractAssetReader.h" + +namespace vb01{ +} diff --git a/abstractAssetReader.h b/abstractAssetReader.h new file mode 100644 index 0000000..a76245e --- /dev/null +++ b/abstractAssetReader.h @@ -0,0 +1,15 @@ +#ifndef ABSTRACT_ASSET_READER_H +#define ABSTRACT_ASSET_READER_H + +#include "asset.h" + +namespace vb01{ + class AbstractAssetReader{ + public: + virtual Asset* readAsset(std::string){return nullptr;} + protected: + AbstractAssetReader(){} + }; +} + +#endif diff --git a/fontAsset.h b/fontAsset.h index 6812e15..6c6dbb8 100644 --- a/fontAsset.h +++ b/fontAsset.h @@ -5,7 +5,7 @@ namespace vb01{ struct FontAsset : public Asset{ - u32 **glyphImages; + FT_Face face; }; } diff --git a/fontReader.cpp b/fontReader.cpp new file mode 100644 index 0000000..f4ec840 --- /dev/null +++ b/fontReader.cpp @@ -0,0 +1,40 @@ +#include "fontReader.h" +#include "fontAsset.h" + +#include + +#include "glad.h" +#include + +using namespace std; + +namespace vb01{ + FontReader *fontReader = nullptr; + + FontReader* FontReader::getSingleton(){ + if(!fontReader) + fontReader = new FontReader(); + + return fontReader; + } + + FontReader::FontReader() : AbstractAssetReader(){ + if(FT_Init_FreeType(&ft)) + cout << "Couldn't init Freetype\n"; + } + + Asset* FontReader::readAsset(string path){ + if(FT_New_Face(ft, path.c_str(), 0, &face)) + cout << "Could not load font\n"; + + FT_Set_Pixel_Sizes(face, pixelWidth, pixelHeight); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + FontAsset *font = new FontAsset; + font->path = path; + font->face = face; + + return font; + } +} diff --git a/fontReader.h b/fontReader.h new file mode 100644 index 0000000..71071e9 --- /dev/null +++ b/fontReader.h @@ -0,0 +1,29 @@ +#ifndef FONT_READER_H +#define FONT_READER_H + +#include "abstractAssetReader.h" +#include "util.h" + +#include +#include FT_FREETYPE_H + +namespace vb01{ + class FontReader : public AbstractAssetReader{ + public: + static FontReader* getSingleton(); + Asset* readAsset(std::string); + inline void setPixelWidth(int w){this->pixelWidth = w;} + inline void setPixelHeight(int h){this->pixelHeight = h;} + inline int getPixelWidth(){return pixelWidth;} + inline int getPixelHeight(){return pixelHeight;} + inline FT_Library& getFT(){return ft;} + private: + FontReader(); + + int pixelWidth = 0, pixelHeight = 100; + FT_Library ft; + FT_Face face; + }; +} + +#endif diff --git a/text.cpp b/text.cpp index a8e142c..6891e60 100755 --- a/text.cpp +++ b/text.cpp @@ -4,6 +4,9 @@ #include "texture.h" #include "node.h" #include "material.h" +#include "fontReader.h" +#include "fontAsset.h" +#include "assetManager.h" #include "glad.h" #include @@ -26,18 +29,10 @@ namespace vb01{ } void Text::initFont(string fontPath, u16 firstChar, u16 lastChar){ - FT_Library ft; - FT_Face face; - - if(FT_Init_FreeType(&ft)) - cout << "Couldn't init Freetype\n"; - - if(FT_New_Face(ft, fontPath.c_str(), 0, &face)) - cout << "Could not load font\n"; - - FT_Set_Pixel_Sizes(face, 0, 100); - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + FontReader *fontReader = FontReader::getSingleton(); + FT_Library &ft = fontReader->getFT(); + FontAsset *font = (FontAsset*)AssetManager::getSingleton()->getAsset(fontPath); + FT_Face face = font->face; for(u16 i = firstChar; i < lastChar; i++){ if(FT_Load_Char(face, i, FT_LOAD_RENDER)){ @@ -53,9 +48,6 @@ namespace vb01{ c.advance = face->glyph->advance.x; characters.push_back(c); } - - FT_Done_Face(face); - FT_Done_FreeType(ft); } void Text::update(){ diff --git a/textSample.cpp b/textSample.cpp index c113e3a..a212e84 100644 --- a/textSample.cpp +++ b/textSample.cpp @@ -6,6 +6,9 @@ #include "node.h" #include "animationController.h" #include "animationChannel.h" +#include "imageReader.h" +#include "fontReader.h" +#include "assetManager.h" using namespace std; using namespace vb01; @@ -55,10 +58,14 @@ int main(){ textMat->addBoolUniform("texturingEnabled", true); string frames[]{TEX_PATH + "bricks.jpg", TEX_PATH + "defaultTexture.jpg"}; + AssetManager::getSingleton()->load(ImageReader::getSingleton(), frames[0]); + AssetManager::getSingleton()->load(ImageReader::getSingleton(), frames[1]); Texture *texture = new Texture(frames, 2, false); textMat->addTexUniform("textures[0]", texture, true); for(int i = 0; i < numTexts; i++){ + AssetManager::getSingleton()->load(FontReader::getSingleton(), FONT_PATH + fonts[i]); + Text *text = new Text(FONT_PATH + fonts[i], texts[i], 0, 60000); text->setLeftToRight(leftToRight[i]); text->setScale(.5);