From 83e0935b151837426b0df4384cfeb0860330c541 Mon Sep 17 00:00:00 2001 From: bailwillharr Date: Sun, 14 May 2023 14:40:16 +0100 Subject: [PATCH] remove freetype, begin font code --- .gitmodules | 3 - CMakeLists.txt | 15 +- dependencies/freetype | 1 - include/components/renderable_text.h | 26 +++ include/resources/font.h | 23 +++ .../{LiberationMono-Regular.ttf => mono.ttf} | Bin src/application.cpp | 8 + src/libs/stb_truetype.cpp | 2 + src/resources/font.cpp | 26 +++ src/systems/render.cpp | 187 +++++++++--------- src/systems/render2d.cpp | 18 +- 11 files changed, 189 insertions(+), 120 deletions(-) delete mode 160000 dependencies/freetype create mode 100644 include/components/renderable_text.h create mode 100644 include/resources/font.h rename res/engine/fonts/{LiberationMono-Regular.ttf => mono.ttf} (100%) create mode 100644 src/libs/stb_truetype.cpp create mode 100644 src/resources/font.cpp diff --git a/.gitmodules b/.gitmodules index 1e648ed..9a2a4d7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,9 +10,6 @@ [submodule "dependencies/spdlog"] path = dependencies/spdlog url = https://github.com/gabime/spdlog -[submodule "dependencies/freetype"] - path = dependencies/freetype - url = https://gitlab.freedesktop.org/freetype/freetype.git [submodule "dependencies/volk"] path = dependencies/volk url = https://github.com/zeux/volk diff --git a/CMakeLists.txt b/CMakeLists.txt index f398ebf..2075315 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ set(SRC_FILES "src/gfx_device_vulkan.cpp" "src/input_manager.cpp" "src/libs/stb_image.cpp" + "src/libs/stb_truetype.cpp" + "src/resources/font.cpp" "src/resources/material.cpp" "src/resources/mesh.cpp" "src/resources/shader.cpp" @@ -43,6 +45,7 @@ set(SRC_FILES set(INCLUDE_FILES "include/application.h" "include/components/collider.h" + "include/components/renderable_text.h" "include/components/renderable.h" "include/components/transform.h" "include/components/ui_element.h" @@ -57,6 +60,7 @@ set(INCLUDE_FILES "include/log.h" "include/logger.h" "include/resource_manager.h" + "include/resources/font.h" "include/resources/material.h" "include/resources/mesh.h" "include/resources/shader.h" @@ -143,17 +147,6 @@ else() target_link_libraries(${PROJECT_NAME} PRIVATE shaderc_shared) endif() -# freetype -set(FT_DISABLE_ZLIB TRUE CACHE INTERNAL "" FORCE) -set(FT_DISABLE_BZIP2 TRUE CACHE INTERNAL "" FORCE) -set(FT_DISABLE_PNG TRUE CACHE INTERNAL "" FORCE) -set(FT_DISABLE_HARFBUZZ TRUE CACHE INTERNAL "" FORCE) -set(FT_DISABLE_BROTLI TRUE CACHE INTERNAL "" FORCE) -set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "" FORCE) -add_subdirectory(dependencies/freetype) -target_link_libraries(${PROJECT_NAME} PRIVATE freetype) -target_include_directories(${PROJECT_NAME} PRIVATE dependencies/freetype/include) - # stb target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE dependencies/stb) diff --git a/dependencies/freetype b/dependencies/freetype deleted file mode 160000 index dd91f6e..0000000 --- a/dependencies/freetype +++ /dev/null @@ -1 +0,0 @@ -Subproject commit dd91f6e7f5a051818070c49715125fb72074023e diff --git a/include/components/renderable_text.h b/include/components/renderable_text.h new file mode 100644 index 0000000..ac61243 --- /dev/null +++ b/include/components/renderable_text.h @@ -0,0 +1,26 @@ +#ifndef ENGINE_INCLUDE_COMPONENTS_RENDERABLE_TEXT_H_ +#define ENGINE_INCLUDE_COMPONENTS_RENDERABLE_TEXT_H_ + +#include +#include + +#include "resources/texture.h" + +namespace engine { + +struct RenderableTextComponent { + void SetText(const std::string& text) { + text_ = text; + invalidated_ = true; + } + + private: + std::string text_{"hello world"}; + bool invalidated_ = + true; // text has been changed, texture must be regenerated + std::unique_ptr texture_{}; +}; + +} // namespace engine + +#endif \ No newline at end of file diff --git a/include/resources/font.h b/include/resources/font.h new file mode 100644 index 0000000..e2320d1 --- /dev/null +++ b/include/resources/font.h @@ -0,0 +1,23 @@ +#ifndef ENGINE_INCLUDE_RESOURCES_FONT_H_ +#define ENGINE_INCLUDE_RESOURCES_FONT_H_ + +#include + +namespace engine { +namespace resources { + +class Font { + public: + + Font(const std::string& path); + ~Font(); + Font(const Font&) = delete; + Font& operator=(const Font&) = delete; + + private: +}; + +} // namespace resources +} // namespace engine + +#endif \ No newline at end of file diff --git a/res/engine/fonts/LiberationMono-Regular.ttf b/res/engine/fonts/mono.ttf similarity index 100% rename from res/engine/fonts/LiberationMono-Regular.ttf rename to res/engine/fonts/mono.ttf diff --git a/src/application.cpp b/src/application.cpp index 05908f7..268066c 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -12,6 +12,7 @@ #include "gfx_device.h" #include "input_manager.h" #include "log.h" +#include "resources/font.h" #include "resources/material.h" #include "resources/mesh.h" #include "resources/shader.h" @@ -69,6 +70,7 @@ namespace engine { resources_path_ = getResourcesPath(); // register resource managers + RegisterResourceManager(); RegisterResourceManager(); RegisterResourceManager(); RegisterResourceManager(); @@ -114,6 +116,12 @@ namespace engine { render_data_.material_set_layout = gfxdev()->CreateDescriptorSetLayout(materialSetBindings); // default resources + { + auto monoFont = std::make_unique( + GetResourcePath("engine/fonts/mono.ttf") + ); + GetResourceManager()->AddPersistent("builtin.mono", std::move(monoFont)); + } { resources::Shader::VertexParams vertParams{}; vertParams.has_normal = true; diff --git a/src/libs/stb_truetype.cpp b/src/libs/stb_truetype.cpp new file mode 100644 index 0000000..f82dc9d --- /dev/null +++ b/src/libs/stb_truetype.cpp @@ -0,0 +1,2 @@ +#define STB_TRUETYPE_IMPLEMENTATION +#include \ No newline at end of file diff --git a/src/resources/font.cpp b/src/resources/font.cpp new file mode 100644 index 0000000..c612299 --- /dev/null +++ b/src/resources/font.cpp @@ -0,0 +1,26 @@ +#include "resources/font.h" + +#include + +#include + +#include "log.h" +#include "util/files.h" + +namespace engine::resources { + +Font::Font(const std::string& path) { + // auto font_buffer = util::ReadBinaryFile(path); + + // constexpr int FIRST_CHAR = 32; + // constexpr int NUM_CHARS = 96; + // constexpr float SCALE = 128.0f; + + // TODO finish this + + LOG_INFO("Loaded font: {}", path); +} + +Font::~Font() {} + +} // namespace engine::resources diff --git a/src/systems/render.cpp b/src/systems/render.cpp index 8d92fe6..40ca754 100644 --- a/src/systems/render.cpp +++ b/src/systems/render.cpp @@ -14,115 +14,118 @@ namespace engine { - RenderSystem::RenderSystem(Scene* scene) - : System(scene, { typeid(TransformComponent).hash_code(), typeid(RenderableComponent).hash_code() }), - gfx_(scene_->app()->gfxdev()) - { - } +RenderSystem::RenderSystem(Scene* scene) + : System(scene, {typeid(TransformComponent).hash_code(), + typeid(RenderableComponent).hash_code()}), + gfx_(scene_->app()->gfxdev()) {} - RenderSystem::~RenderSystem() - { - } +RenderSystem::~RenderSystem() {} - void RenderSystem::OnUpdate(float ts) - { - (void)ts; - - RenderData& renderData = scene_->app()->render_data_; - - /* camera stuff */ - const auto cameraTransform = scene_->GetComponent(camera_.cam_entity); +void RenderSystem::OnUpdate(float ts) { + (void)ts; - // do not render if camera is not set - if (cameraTransform == nullptr) return; + RenderData& render_data = scene_->app()->render_data_; - glm::mat4 viewMatrix = glm::inverse(cameraTransform->world_matrix); + /* camera stuff */ + const auto camera_transform = + scene_->GetComponent(camera_.cam_entity); - if (scene_->app()->window()->GetWindowResized()) { - uint32_t w, h; - gfx_->GetViewportSize(&w, &h); - viewport_aspect_ratio_ = (float)w / (float)h; - const float verticalFovRadians = glm::radians(camera_.vertical_fov_degrees); - const glm::mat4 projMatrix = glm::perspectiveZO(verticalFovRadians, viewport_aspect_ratio_, camera_.clip_near, camera_.clip_far); - /* update SET 0 */ - RenderData::GlobalSetUniformBuffer globalSetUniformBuffer{ - .proj = projMatrix - }; - gfx_->WriteUniformBuffer(renderData.global_set_uniform_buffer, 0, sizeof(RenderData::GlobalSetUniformBuffer), &globalSetUniformBuffer); - } + // do not render if camera is not set + if (camera_transform == nullptr) return; - RenderData::FrameSetUniformBuffer frameSetUniformBuffer{ - .view = viewMatrix - }; - gfx_->WriteUniformBuffer(renderData.frame_set_uniform_buffer, 0, sizeof(RenderData::FrameSetUniformBuffer), &frameSetUniformBuffer); + if (scene_->app()->window()->GetWindowResized()) { + uint32_t w, h; + gfx_->GetViewportSize(&w, &h); + viewport_aspect_ratio_ = (float)w / (float)h; + const float vertical_fov_radians = + glm::radians(camera_.vertical_fov_degrees); + const glm::mat4 proj_matrix = + glm::perspectiveZO(vertical_fov_radians, viewport_aspect_ratio_, + camera_.clip_near, camera_.clip_far); + /* update SET 0 (rarely changing uniforms)*/ + RenderData::GlobalSetUniformBuffer global_set_uniform_buffer{}; + global_set_uniform_buffer.proj = proj_matrix; + gfx_->WriteUniformBuffer(render_data.global_set_uniform_buffer, 0, + sizeof(RenderData::GlobalSetUniformBuffer), + &global_set_uniform_buffer); + } - /* render all renderable entities */ + glm::mat4 view_matrix = glm::inverse(camera_transform->world_matrix); + /* update SET 1 (per frame uniforms) */ + RenderData::FrameSetUniformBuffer frame_set_uniform_buffer{}; + frame_set_uniform_buffer.view = view_matrix; + gfx_->WriteUniformBuffer(render_data.frame_set_uniform_buffer, 0, + sizeof(RenderData::FrameSetUniformBuffer), + &frame_set_uniform_buffer); - struct PushConstants { - glm::mat4 model; - }; + /* render all renderable entities */ - struct DrawCallData { - const gfx::Buffer* vb; - const gfx::Buffer* ib; - const gfx::DescriptorSet* materialSet; - uint32_t indexCount; - PushConstants pushConsts; - }; - std::unordered_map > pipelineDrawCalls{}; + struct PushConstants { + glm::mat4 model; + }; - for (uint32_t entity : entities_) { + struct DrawCallData { + const gfx::Buffer* vb; + const gfx::Buffer* ib; + const gfx::DescriptorSet* material_set; + uint32_t index_count; + PushConstants push_constants; + }; + std::unordered_map> + pipeline_draw_calls{}; - auto r = scene_->GetComponent(entity); - assert(r != nullptr); - assert(r->material != nullptr); - assert(r->material->texture_ != nullptr); - assert(r->mesh != nullptr); - if (r->shown == false) continue; + for (uint32_t entity : entities_) { + auto r = scene_->GetComponent(entity); + assert(r != nullptr); + assert(r->material != nullptr); + assert(r->material->texture_ != nullptr); + assert(r->mesh != nullptr); + if (r->shown == false) continue; - auto t = scene_->GetComponent(entity); - assert(t != nullptr); + auto t = scene_->GetComponent(entity); + assert(t != nullptr); - const gfx::Pipeline* pipeline = r->material->GetShader()->GetPipeline(); - DrawCallData data{}; - data.vb = r->mesh->GetVB(); - data.ib = r->mesh->GetIB(); - data.materialSet = r->material->texture_->GetDescriptorSet(); - data.indexCount = r->mesh->GetCount(); - data.pushConsts.model = t->world_matrix; + const gfx::Pipeline* pipeline = r->material->GetShader()->GetPipeline(); + DrawCallData data{}; + data.vb = r->mesh->GetVB(); + data.ib = r->mesh->GetIB(); + data.material_set = r->material->texture_->GetDescriptorSet(); + data.index_count = r->mesh->GetCount(); + data.push_constants.model = t->world_matrix; - pipelineDrawCalls[pipeline].push_back(data); + pipeline_draw_calls[pipeline].push_back(data); + } - } + /* begin rendering */ + render_data.draw_buffer = gfx_->BeginRender(); - /* begin rendering */ - renderData.draw_buffer = gfx_->BeginRender(); + /* these descriptor set bindings should persist across pipeline changes */ + const gfx::Pipeline* first_pipeline = pipeline_draw_calls.begin()->first; + gfx_->CmdBindDescriptorSet(render_data.draw_buffer, first_pipeline, + render_data.global_set, 0); + gfx_->CmdBindDescriptorSet(render_data.draw_buffer, first_pipeline, + render_data.frame_set, 1); - /* these descriptor set bindings should persist across pipeline changes */ - const gfx::Pipeline* firstPipeline = pipelineDrawCalls.begin()->first; - gfx_->CmdBindDescriptorSet(renderData.draw_buffer, firstPipeline, renderData.global_set, 0); - gfx_->CmdBindDescriptorSet(renderData.draw_buffer, firstPipeline, renderData.frame_set, 1); - - for (const auto& [pipeline, drawCalls] : pipelineDrawCalls) { - gfx_->CmdBindPipeline(renderData.draw_buffer, pipeline); - for (const auto& drawCall : drawCalls) { - gfx_->CmdBindDescriptorSet(renderData.draw_buffer, pipeline, drawCall.materialSet, 2); - gfx_->CmdPushConstants(renderData.draw_buffer, pipeline, 0, sizeof(PushConstants), &drawCall.pushConsts); - gfx_->CmdBindVertexBuffer(renderData.draw_buffer, 0, drawCall.vb); - gfx_->CmdBindIndexBuffer(renderData.draw_buffer, drawCall.ib); - gfx_->CmdDrawIndexed(renderData.draw_buffer, drawCall.indexCount, 1, 0, 0, 0); - } - } - - /* draw */ - gfx_->FinishRender(renderData.draw_buffer); - - } - - void RenderSystem::SetCameraEntity(uint32_t entity) - { - camera_.cam_entity = entity; - } + for (const auto& [pipeline, draw_calls] : pipeline_draw_calls) { + gfx_->CmdBindPipeline(render_data.draw_buffer, pipeline); + for (const auto& draw_call : draw_calls) { + gfx_->CmdBindDescriptorSet(render_data.draw_buffer, pipeline, + draw_call.material_set, 2); + gfx_->CmdPushConstants(render_data.draw_buffer, pipeline, 0, + sizeof(PushConstants), &draw_call.push_constants); + gfx_->CmdBindVertexBuffer(render_data.draw_buffer, 0, draw_call.vb); + gfx_->CmdBindIndexBuffer(render_data.draw_buffer, draw_call.ib); + gfx_->CmdDrawIndexed(render_data.draw_buffer, draw_call.index_count, 1, 0, + 0, 0); + } + } + /* draw */ + gfx_->FinishRender(render_data.draw_buffer); } +void RenderSystem::SetCameraEntity(uint32_t entity) { + camera_.cam_entity = entity; +} + +} // namespace engine diff --git a/src/systems/render2d.cpp b/src/systems/render2d.cpp index 8728d55..a15cdb9 100644 --- a/src/systems/render2d.cpp +++ b/src/systems/render2d.cpp @@ -6,19 +6,11 @@ namespace engine { - Render2DSystem::Render2DSystem(Scene* scene) - : System(scene, { typeid(TransformComponent).hash_code() }) - { - } +Render2DSystem::Render2DSystem(Scene* scene) + : System(scene, {typeid(TransformComponent).hash_code()}) {} - Render2DSystem::~Render2DSystem() - { - } +Render2DSystem::~Render2DSystem() {} - void Render2DSystem::OnUpdate(float ts) - { - (void)ts; - } - -} +void Render2DSystem::OnUpdate(float ts) { (void)ts; } +} // namespace engine