From 5bd66fd3623ba1d75b7ad599a65547cca0e08d10 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Mon, 4 Nov 2024 21:21:46 +0100 Subject: [PATCH] adding clear color in mlx_clear_window --- example/main.c | 4 +-- includes/mlx.h | 4 +-- runtime/Includes/Core/Application.h | 2 +- runtime/Includes/Core/Application.inl | 4 +-- runtime/Includes/Core/Graphics.h | 2 +- runtime/Includes/Core/Graphics.inl | 10 ++++-- runtime/Includes/Graphics/Scene.h | 5 ++- .../Includes/Renderer/RenderPasses/Passes.h | 2 +- runtime/Sources/Core/Bridge.cpp | 9 ++++-- runtime/Sources/Graphics/Font.cpp | 8 ++--- runtime/Sources/Renderer/Image.cpp | 31 ++++++++++++++----- .../Sources/Renderer/RenderPasses/Passes.cpp | 6 ++-- runtime/Sources/Renderer/SceneRenderer.cpp | 2 +- runtime/Sources/Renderer/Swapchain.cpp | 6 ++-- third_party/kvf.h | 4 --- 15 files changed, 62 insertions(+), 37 deletions(-) diff --git a/example/main.c b/example/main.c index bac9e5a..c3fc308 100644 --- a/example/main.c +++ b/example/main.c @@ -17,7 +17,7 @@ int update(void* param) mlx_t* mlx = (mlx_t*)param; if(i == 200) - mlx_clear_window(mlx->mlx, mlx->win); + mlx_clear_window(mlx->mlx, mlx->win, 0xFF334D4D); if(i >= 250) mlx_set_font_scale(mlx->mlx, "default", 16.f); @@ -96,7 +96,7 @@ int key_hook(int key, void* param) mlx_mouse_hide(); break; case 6 : // (C)lear - mlx_clear_window(mlx->mlx, mlx->win); + mlx_clear_window(mlx->mlx, mlx->win, 0xFF334D4D); break; case 79 : // RIGHT KEY mlx_mouse_move(mlx->mlx, mlx->win, x + 10, y); diff --git a/includes/mlx.h b/includes/mlx.h index 6573599..374e7f1 100644 --- a/includes/mlx.h +++ b/includes/mlx.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 16:56:35 by maldavid #+# #+# */ -/* Updated: 2024/10/31 16:21:35 by maldavid ### ########.fr */ +/* Updated: 2024/11/04 21:09:59 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -325,7 +325,7 @@ MLX_API void mlx_set_font_scale(void* mlx, char* filepath, float scale); * * @return (void) */ -MLX_API void mlx_clear_window(void* mlx, void* win); +MLX_API void mlx_clear_window(void* mlx, void* win, int color); /** * @brief Destroys internal window diff --git a/runtime/Includes/Core/Application.h b/runtime/Includes/Core/Application.h index acb634a..9361b1b 100644 --- a/runtime/Includes/Core/Application.h +++ b/runtime/Includes/Core/Application.h @@ -27,7 +27,7 @@ namespace mlx inline void SetFPSCap(std::uint32_t fps) noexcept; inline Handle NewGraphicsSuport(std::size_t w, std::size_t h, const char* title, bool is_resizable); - inline void ClearGraphicsSupport(Handle win); + inline void ClearGraphicsSupport(Handle win, int color); inline void DestroyGraphicsSupport(Handle win); inline void SetGraphicsSupportPosition(Handle win, int x, int y); diff --git a/runtime/Includes/Core/Application.inl b/runtime/Includes/Core/Application.inl index 445cf15..41c164b 100644 --- a/runtime/Includes/Core/Application.inl +++ b/runtime/Includes/Core/Application.inl @@ -101,11 +101,11 @@ namespace mlx return static_cast(&m_graphics.back()->GetID()); } - void Application::ClearGraphicsSupport(Handle win) + void Application::ClearGraphicsSupport(Handle win, int color) { MLX_PROFILE_FUNCTION(); CHECK_WINDOW_PTR(win); - m_graphics[*static_cast(win)]->ResetRenderData(); + m_graphics[*static_cast(win)]->ResetRenderData(color); } void Application::DestroyGraphicsSupport(Handle win) diff --git a/runtime/Includes/Core/Graphics.h b/runtime/Includes/Core/Graphics.h index 92c17d9..4924e3a 100644 --- a/runtime/Includes/Core/Graphics.h +++ b/runtime/Includes/Core/Graphics.h @@ -22,7 +22,7 @@ namespace mlx void Render() noexcept; - inline void ResetRenderData() noexcept; + inline void ResetRenderData(int color) noexcept; inline void PixelPut(int x, int y, std::uint32_t color) noexcept; inline void StringPut(int x, int y, std::uint32_t color, std::string str); diff --git a/runtime/Includes/Core/Graphics.inl b/runtime/Includes/Core/Graphics.inl index edd7a30..b4ca15f 100644 --- a/runtime/Includes/Core/Graphics.inl +++ b/runtime/Includes/Core/Graphics.inl @@ -3,10 +3,16 @@ namespace mlx { - void GraphicsSupport::ResetRenderData() noexcept + void GraphicsSupport::ResetRenderData(int color) noexcept { MLX_PROFILE_FUNCTION(); - p_scene->ResetScene(); + Vec4f vec_color = { + static_cast((color & 0x000000FF)) / 255.0f, + static_cast((color & 0x0000FF00) >> 8) / 255.0f, + static_cast((color & 0x00FF0000) >> 16) / 255.0f, + static_cast((color & 0xFF000000) >> 24) / 255.0f + }; + p_scene->ResetScene(std::move(vec_color)); m_put_pixel_manager.ResetRenderData(); m_draw_layer = 0; m_pixelput_called = false; diff --git a/runtime/Includes/Graphics/Scene.h b/runtime/Includes/Graphics/Scene.h index 0d46488..fdb273b 100644 --- a/runtime/Includes/Graphics/Scene.h +++ b/runtime/Includes/Graphics/Scene.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace mlx { @@ -29,7 +30,8 @@ namespace mlx void BringToFront(NonOwningPtr drawable); void BringToDrawLayer(NonOwningPtr drawable, std::uint64_t draw_layer); - inline void ResetScene() { m_drawables.clear(); } + inline void ResetScene(Vec4f clear) { m_drawables.clear(); m_clear_color = std::move(clear); } + inline const Vec4f& GetClearColor() const noexcept { return m_clear_color; } [[nodiscard]] MLX_FORCEINLINE const std::vector>& GetDrawables() const noexcept { return m_drawables; } [[nodiscard]] MLX_FORCEINLINE ViewerData& GetViewerData() noexcept { return m_viewer_data; } @@ -40,6 +42,7 @@ namespace mlx std::vector> m_drawables; ViewerData m_viewer_data; std::shared_ptr p_bound_font; + Vec4f m_clear_color = { 0.0f, 0.0f, 0.0f, 1.0f }; }; } diff --git a/runtime/Includes/Renderer/RenderPasses/Passes.h b/runtime/Includes/Renderer/RenderPasses/Passes.h index 56aa74d..45f084e 100644 --- a/runtime/Includes/Renderer/RenderPasses/Passes.h +++ b/runtime/Includes/Renderer/RenderPasses/Passes.h @@ -13,7 +13,7 @@ namespace mlx RenderPasses() = default; void Init(class Renderer& renderer); - void Pass(class Scene& scene, class Renderer& renderer); + void Pass(class Scene& scene, class Renderer& renderer, const Vec4f& clear_color); void Destroy(); ~RenderPasses() = default; diff --git a/runtime/Sources/Core/Bridge.cpp b/runtime/Sources/Core/Bridge.cpp index f842cf2..1811c40 100644 --- a/runtime/Sources/Core/Bridge.cpp +++ b/runtime/Sources/Core/Bridge.cpp @@ -264,10 +264,15 @@ extern "C" static_cast(mlx)->LoadFont(file, scale); } - void mlx_clear_window(void* mlx, void* win) + void mlx_clear_window(void* mlx, void* win, int color) { MLX_CHECK_APPLICATION_POINTER(mlx); - static_cast(mlx)->ClearGraphicsSupport(win); + unsigned char color_bits[4]; + color_bits[0] = (color & 0x00FF0000) >> 16; + color_bits[1] = (color & 0x0000FF00) >> 8; + color_bits[2] = (color & 0x000000FF); + color_bits[3] = (color & 0xFF000000) >> 24; + static_cast(mlx)->ClearGraphicsSupport(win, *reinterpret_cast(color_bits)); } void mlx_destroy_window(void* mlx, void* win) diff --git a/runtime/Sources/Graphics/Font.cpp b/runtime/Sources/Graphics/Font.cpp index b0b0a3d..339aa62 100644 --- a/runtime/Sources/Graphics/Font.cpp +++ b/runtime/Sources/Graphics/Font.cpp @@ -3,13 +3,13 @@ #include #include -#define STBRP_ASSERT(x) mlx::Assert(x, "internal stb assertion") +#define STBRP_ASSERT(x) mlx::Assert(x, "internal stb assertion " #x) #define STB_RECT_PACK_IMPLEMENTATION #include #define STB_TRUETYPE_IMPLEMENTATION -#define STB_malloc(x, u) ((void)(u), MemManager::Get().Malloc(x)) -#define STB_free(x, u) ((void)(u), MemManager::Get().Free(x)) +#define STB_malloc(x, u) ((void)(u), mlx::MemManager::Get().Malloc(x)) +#define STB_free(x, u) ((void)(u), mlx::MemManager::Get().Free(x)) #include namespace mlx @@ -43,7 +43,7 @@ namespace mlx stbtt_PackFontRange(&pc, std::get>(m_build_data).data(), 0, m_scale, 32, 96, m_cdata.data()); stbtt_PackEnd(&pc); - // TODO : find better solution + // TODO : find better solution; No, using VK_FORMAT_R8_SRGB does not work CPUBuffer vulkan_bitmap(RANGE * RANGE * 4); for(int i = 0, j = 0; i < RANGE * RANGE; i++, j += 4) { diff --git a/runtime/Sources/Renderer/Image.cpp b/runtime/Sources/Renderer/Image.cpp index 53ea351..7280831 100644 --- a/runtime/Sources/Renderer/Image.cpp +++ b/runtime/Sources/Renderer/Image.cpp @@ -1,10 +1,18 @@ #include #include #include +#include #include #include +#include #define STB_IMAGE_IMPLEMENTATION + +#define STBI_ASSERT(x) mlx::Assert(x, "internal stb assertion " #x) +#define STBI_MALLOC(x) (mlx::MemManager::Get().Malloc(x)) +#define STBI_REALLOC(p, x) (mlx::MemManager::Get().Realloc(p, x)) +#define STBI_FREE(x) (mlx::MemManager::Get().Free(x)) + #ifdef MLX_COMPILER_GCC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstringop-overflow" @@ -264,7 +272,7 @@ namespace mlx MLX_PROFILE_FUNCTION(); std::string filename = file.string(); - if(file.stem() == "banana") + if(file.stem() == "terracotta.pie") Message("banana, banana, banana, banana, terracotta banana terracotta, terracotta pie"); if(!std::filesystem::exists(file)) @@ -274,21 +282,28 @@ namespace mlx } if(stbi_is_hdr(filename.c_str())) { - Error("Texture: unsupported image format % (HDR image)", file); + Error("Texture: unsupported image format from % (HDR image)", file); return nullptr; } - int dummy_w; - int dummy_h; - int channels; - std::uint8_t* data = stbi_load(filename.c_str(), (w == nullptr ? &dummy_w : w), (h == nullptr ? &dummy_h : h), &channels, 4); + Vec2i size; + int channels; + + std::uint8_t* data = stbi_load(filename.c_str(), &size.x, &size.y, &channels, STBI_rgb_alpha); CallOnExit defer([=]() { stbi_image_free(data); }); - CPUBuffer buffer((w == nullptr ? dummy_w : *w) * (h == nullptr ? dummy_h : *h) * 4); + Verify(channels == 4, "invalid channels number in image loaded (should be 4, was %)", channels); + + CPUBuffer buffer(size.x * size.y * 4); std::memcpy(buffer.GetData(), data, buffer.GetSize()); + if(w != nullptr) + *w = size.x; + if(h != nullptr) + *h = size.y; + Texture* texture; - try { texture = new Texture(std::move(buffer), (w == nullptr ? dummy_w : *w), (h == nullptr ? dummy_h : *h), VK_FORMAT_R8G8B8A8_SRGB, false, std::move(filename)); } + try { texture = new Texture(std::move(buffer), size.x, size.y, VK_FORMAT_R8G8B8A8_SRGB, false, std::move(filename)); } catch(...) { return nullptr; } return texture; } diff --git a/runtime/Sources/Renderer/RenderPasses/Passes.cpp b/runtime/Sources/Renderer/RenderPasses/Passes.cpp index 2e0c76f..c094f84 100644 --- a/runtime/Sources/Renderer/RenderPasses/Passes.cpp +++ b/runtime/Sources/Renderer/RenderPasses/Passes.cpp @@ -9,7 +9,7 @@ namespace mlx { m_2Dpass.Init(); m_final.Init(); - func::function functor = [this, renderer](const EventBase& event) + func::function functor = [this, &renderer](const EventBase& event) { if(event.What() == Event::ResizeEventCode) { @@ -34,9 +34,9 @@ namespace mlx m_main_render_texture.TransitionLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); } - void RenderPasses::Pass(Scene& scene, Renderer& renderer) + void RenderPasses::Pass(Scene& scene, Renderer& renderer, const Vec4f& clear_color) { - m_main_render_texture.Clear(renderer.GetActiveCommandBuffer(), Vec4f{ 0.0f, 0.0f, 0.0f, 1.0f }); + m_main_render_texture.Clear(renderer.GetActiveCommandBuffer(), clear_color); m_2Dpass.Pass(scene, renderer, m_main_render_texture); m_final.Pass(scene, renderer, m_main_render_texture); diff --git a/runtime/Sources/Renderer/SceneRenderer.cpp b/runtime/Sources/Renderer/SceneRenderer.cpp index c1939fd..2b5bcaa 100644 --- a/runtime/Sources/Renderer/SceneRenderer.cpp +++ b/runtime/Sources/Renderer/SceneRenderer.cpp @@ -15,7 +15,7 @@ namespace mlx void SceneRenderer::Render(Scene& scene, Renderer& renderer) { MLX_PROFILE_FUNCTION(); - m_passes.Pass(scene, renderer); + m_passes.Pass(scene, renderer, scene.GetClearColor()); } void SceneRenderer::Destroy() diff --git a/runtime/Sources/Renderer/Swapchain.cpp b/runtime/Sources/Renderer/Swapchain.cpp index 4c5af67..c6c7e96 100644 --- a/runtime/Sources/Renderer/Swapchain.cpp +++ b/runtime/Sources/Renderer/Swapchain.cpp @@ -57,7 +57,7 @@ namespace mlx for(Image& img : m_swapchain_images) img.DestroyImageView(); - // kvfDestroySwapchainKHR(RenderCore::Get().GetDevice(), m_swapchain); + kvfDestroySwapchainKHR(RenderCore::Get().GetDevice(), m_swapchain); RenderCore::Get().vkDestroySurfaceKHR(RenderCore::Get().GetInstance(), m_surface, nullptr); m_surface = VK_NULL_HANDLE; @@ -79,8 +79,8 @@ namespace mlx VkSwapchainKHR old_swapchain = m_swapchain; m_swapchain = kvfCreateSwapchainKHR(RenderCore::Get().GetDevice(), RenderCore::Get().GetPhysicalDevice(), m_surface, extent, VK_NULL_HANDLE, true); - // if(old_swapchain != VK_NULL_HANDLE) - // kvfDestroySwapchainKHR(RenderCore::Get().GetDevice(), old_swapchain); + if(old_swapchain != VK_NULL_HANDLE) + kvfDestroySwapchainKHR(RenderCore::Get().GetDevice(), old_swapchain); m_images_count = kvfGetSwapchainImagesCount(m_swapchain); m_min_images_count = kvfGetSwapchainMinImagesCount(m_swapchain); diff --git a/third_party/kvf.h b/third_party/kvf.h index 206c651..7080ab6 100755 --- a/third_party/kvf.h +++ b/third_party/kvf.h @@ -679,7 +679,6 @@ __KvfDevice* __kvfGetKvfDeviceFromVkCommandBuffer(VkCommandBuffer cmd) __kvf_internal_swapchains[__kvf_internal_swapchains_size].images_count = images_count; __kvf_internal_swapchains[__kvf_internal_swapchains_size].images_extent = extent; __kvf_internal_swapchains_size++; - printf("new size updated %zu, capacity %zu\n", __kvf_internal_swapchains_size, __kvf_internal_swapchains_capacity); } void __kvfDestroySwapchain(VkDevice device, VkSwapchainKHR swapchain) @@ -701,7 +700,6 @@ __KvfDevice* __kvfGetKvfDeviceFromVkCommandBuffer(VkCommandBuffer cmd) for(size_t j = i; j < __kvf_internal_swapchains_size - 1; j++) __kvf_internal_swapchains[j] = __kvf_internal_swapchains[j + 1]; __kvf_internal_swapchains_size--; - printf("new size delete %zu, capacity %zu\n", __kvf_internal_swapchains_size, __kvf_internal_swapchains_capacity); if(__kvf_internal_swapchains_size == 0) { KVF_FREE(__kvf_internal_swapchains); @@ -711,12 +709,10 @@ __KvfDevice* __kvfGetKvfDeviceFromVkCommandBuffer(VkCommandBuffer cmd) } } } -#include __KvfSwapchain* __kvfGetKvfSwapchainFromVkSwapchainKHR(VkSwapchainKHR swapchain) { KVF_ASSERT(swapchain != VK_NULL_HANDLE); - printf("size %zu, capacity %zu\n", __kvf_internal_swapchains_size, __kvf_internal_swapchains_capacity); for(size_t i = 0; i < __kvf_internal_swapchains_size; i++) { if(__kvf_internal_swapchains[i].swapchain == swapchain)