From a522ba5961bb06f09e126848aaf1f052c83066f1 Mon Sep 17 00:00:00 2001 From: Nanako <469449812@qq.com> Date: Fri, 22 Nov 2024 15:44:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9create=5Ftexture=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E4=BD=BF=E5=85=B6=E6=9B=B4=E6=98=93=E4=BA=8E?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=80=82=E6=96=B0=E5=A2=9Etext=20sdf?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/backend/dx/dx_renderer.cpp | 4 +-- src/renderer/backend/dx/dx_renderer.h | 2 +- src/renderer/backend/dx/dx_window.cpp | 38 ++++++++++++++++++++----- src/renderer/backend/dx/dx_window.h | 2 +- src/renderer/core/renderer/renderer.cpp | 2 +- src/renderer/core/renderer/renderer.h | 6 +++- 6 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/renderer/backend/dx/dx_renderer.cpp b/src/renderer/backend/dx/dx_renderer.cpp index 85a9b6e..ee6b9a5 100644 --- a/src/renderer/backend/dx/dx_renderer.cpp +++ b/src/renderer/backend/dx/dx_renderer.cpp @@ -56,8 +56,8 @@ bool dx_renderer::render() { return true; } -renderer_texture* dx_renderer::create_texture(const Eigen::Vector2i& size, texture_format in_format) { - return new dx_texture(size, in_format); +renderer_texture* dx_renderer::create_texture(int in_size_width, int in_size_height, texture_format in_format) { + return new dx_texture({ in_size_width, in_size_height }, in_format); } Eigen::Matrix4f dx_renderer::make_projection_matrix(const Eigen::Vector2i& size) { diff --git a/src/renderer/backend/dx/dx_renderer.h b/src/renderer/backend/dx/dx_renderer.h index 5063986..2a8b493 100644 --- a/src/renderer/backend/dx/dx_renderer.h +++ b/src/renderer/backend/dx/dx_renderer.h @@ -15,7 +15,7 @@ public: void destroy() override; bool render() override; - renderer_texture* create_texture(const Eigen::Vector2i& size, texture_format in_format) override; + renderer_texture* create_texture(int in_size_width, int in_size_height, texture_format in_format) override; [[nodiscard]] ID3D11Device* get_d3d_device() const { return device; } [[nodiscard]] ID3D11DeviceContext* get_d3d_context() const { return context; } diff --git a/src/renderer/backend/dx/dx_window.cpp b/src/renderer/backend/dx/dx_window.cpp index 53c154f..17d201b 100644 --- a/src/renderer/backend/dx/dx_window.cpp +++ b/src/renderer/backend/dx/dx_window.cpp @@ -3,12 +3,35 @@ #include #include "dx_renderer.h" +#include "core/pixel_format/pixel.h" +#include "core/renderer/renderer_text.h" #include "core/renderer/renderer_texture.h" #include "misc/scope_exit.h" using namespace aorii; -static float thickness = 1.f; +renderer_texture* test_texture = nullptr; +text_font* text = nullptr; +int current_char = 33; +void on_mouse_scroll(GLFWwindow* window, double xoffset, double yoffset) { + current_char -= yoffset; + current_char = std::clamp(current_char, 33, 126); + const auto& character = text->glyphs[current_char]; + if (!character.buffer) + return; + const auto font_image = image_accessor(character.buffer, character.size); + + delete test_texture; + test_texture = get_renderer_raw()->create_texture(character.size, texture_format::R8_UNORM); + + uint32_t row_pitch = 0; + const auto data = test_texture->lock(&row_pitch); + auto image = image_accessor(data, test_texture->size()); + image.set_row_pitch(row_pitch); + image.copy_from(font_image); + test_texture->unlock(); +} + bool dx_window::create_surface(GLFWwindow* in_window) { auto dx = aorii::get_renderer(); const auto d3d_device = dx->get_d3d_device(); @@ -69,10 +92,11 @@ bool dx_window::create_surface(GLFWwindow* in_window) { return false; } - test_texture = dx->load_image(R"(D:\69054578_p0.jpg)", texture_format::RGBA8_UNORM); - glfwSetScrollCallback(get_glfw_window(), [](GLFWwindow* window, double xoffset, double yoffset) { - thickness += yoffset; - }); + // test_texture = dx->load_image(R"(D:\69054578_p0.jpg)", texture_format::RGBA8_UNORM); + glfwSetScrollCallback(get_glfw_window(), on_mouse_scroll); + text = aorii_text::load_font("C:/Windows/Fonts/simsunb.ttf", true, 48); + on_mouse_scroll(nullptr, 0, 0); + return true; } @@ -94,9 +118,9 @@ void dx_window::begin_frame() { double mouse_x, mouse_y; glfwGetCursorPos(get_glfw_window(), &mouse_x, &mouse_y); // auto height = sin(get_total_time().count()) * 100; - context.draw_line( { 600, 600 }, { mouse_x, mouse_y }, { 1, 0, 1, 1 }, thickness); + // context.draw_line( { 600, 600 }, { mouse_x, mouse_y }, { 1, 0, 1, 1 }, thickness); - // if (test_texture) context.draw_texture({ 0, 0 }, test_texture->size(), test_texture); + if (test_texture) context.draw_texture({ 0.f, 0.f }, test_texture->size().cast(), test_texture); context.flush(); diff --git a/src/renderer/backend/dx/dx_window.h b/src/renderer/backend/dx/dx_window.h index 54fd904..ff33cf2 100644 --- a/src/renderer/backend/dx/dx_window.h +++ b/src/renderer/backend/dx/dx_window.h @@ -14,11 +14,11 @@ protected: void on_resize(const Eigen::Vector2i& in_size) override; HRESULT build_render_target_view(); + private: renderer_context context; IDXGISwapChain1* swap_chain = nullptr; ID3D11RenderTargetView* render_target_view = nullptr; Eigen::Matrix4f projection_matrix; - renderer_texture* test_texture = nullptr; }; diff --git a/src/renderer/core/renderer/renderer.cpp b/src/renderer/core/renderer/renderer.cpp index f27fd15..317228a 100644 --- a/src/renderer/core/renderer/renderer.cpp +++ b/src/renderer/core/renderer/renderer.cpp @@ -35,7 +35,7 @@ renderer_texture* renderer::load_image(const std::string& file_path, texture_for int target_channel_count = get_format_channel_count(in_format); unsigned int row_pitch = 0; - auto texture = create_texture({ width, height }, in_format); + auto texture = create_texture(width, height, in_format); auto data = texture->lock(&row_pitch); for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { diff --git a/src/renderer/core/renderer/renderer.h b/src/renderer/core/renderer/renderer.h index 44c4021..d6f458b 100644 --- a/src/renderer/core/renderer/renderer.h +++ b/src/renderer/core/renderer/renderer.h @@ -218,7 +218,11 @@ public: virtual void tick(); virtual bool render() = 0; - virtual renderer_texture* create_texture(const Eigen::Vector2i& size, texture_format in_format) = 0; + template + renderer_texture* create_texture(const Eigen::Vector2& in_size, texture_format in_format) { + return create_texture(in_size.x(), in_size.y(), in_format); + } + virtual renderer_texture* create_texture(int in_size_width, int in_size_height, texture_format in_format) = 0; virtual void destroy_texture(renderer_texture* texture); renderer_texture* load_image(const std::string& file_path, texture_format in_format);