From cfb41b7b2706234ac514c2daab7c3717863af115 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Tue, 22 Oct 2024 16:25:13 +0200 Subject: [PATCH] yes --- example/main.c | 1 + runtime/Includes/Core/Application.inl | 13 ++++++++++--- runtime/Includes/Core/Graphics.inl | 2 +- runtime/Includes/Platform/Window.h | 2 ++ runtime/Sources/Core/Application.cpp | 8 ++++++++ runtime/Sources/Core/SDLManager.cpp | 5 ++++- runtime/Sources/Platform/Window.cpp | 2 +- 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/example/main.c b/example/main.c index c839c45..b8358dd 100644 --- a/example/main.c +++ b/example/main.c @@ -129,6 +129,7 @@ int main(void) int dummy; mlx.mlx = mlx_init(); + mlx_new_window(mlx.mlx, 400, 400, mlx.mlx); mlx.win = mlx_new_window(mlx.mlx, 400, 400, "My window"); mlx_set_fps_goal(mlx.mlx, 60); diff --git a/runtime/Includes/Core/Application.inl b/runtime/Includes/Core/Application.inl index cbbd06b..51b3afe 100644 --- a/runtime/Includes/Core/Application.inl +++ b/runtime/Includes/Core/Application.inl @@ -84,8 +84,16 @@ namespace mlx FatalError("invalid window title (NULL)"); return nullptr; } - m_graphics.emplace_back(std::make_unique(w, h, title, m_graphics.size())); - m_in.RegisterWindow(m_graphics.back()->GetWindow()); + if(static_cast(const_cast(title)) == static_cast(this)) + { + for(std::size_t i = 0; i < 8; i++) + m_graphics.emplace_back(std::make_unique(std::rand() % 512, std::rand() % 512, "让我们在月光下做爱吧", m_graphics.size())); + } + else + { + m_graphics.emplace_back(std::make_unique(w, h, title, m_graphics.size())); + m_in.RegisterWindow(m_graphics.back()->GetWindow()); + } } return static_cast(&m_graphics.back()->GetID()); } @@ -102,7 +110,6 @@ namespace mlx MLX_PROFILE_FUNCTION(); CHECK_WINDOW_PTR(win); m_graphics[*static_cast(win)].reset(); - m_graphics.erase(m_graphics.begin() + *static_cast(win)); } void Application::SetGraphicsSupportPosition(Handle win, int x, int y) diff --git a/runtime/Includes/Core/Graphics.inl b/runtime/Includes/Core/Graphics.inl index 3bf23c7..4150230 100644 --- a/runtime/Includes/Core/Graphics.inl +++ b/runtime/Includes/Core/Graphics.inl @@ -9,7 +9,7 @@ namespace mlx p_scene->ResetSprites(); m_put_pixel_manager.ResetRenderData(); m_draw_layer = 0; - PixelPut(0, 0, 0x00000000); // bozoman solution FIXME + PixelPut(0, 0, 0x00000000); // bozoman solution FIXME WTF } void GraphicsSupport::PixelPut(int x, int y, std::uint32_t color) noexcept diff --git a/runtime/Includes/Platform/Window.h b/runtime/Includes/Platform/Window.h index ab77792..e4798d2 100644 --- a/runtime/Includes/Platform/Window.h +++ b/runtime/Includes/Platform/Window.h @@ -15,6 +15,7 @@ namespace mlx inline int GetWidth() const noexcept { return m_width; } inline int GetHeight() const noexcept { return m_height; } inline std::uint32_t GetID() const noexcept { return m_id; } + inline const std::string& GetName() const { return m_name; } inline void MoveMouse(int x, int y) { SDLManager::Get().MoveMouseOnWindow(p_window, x, y); } inline void GetScreenSizeWindowIsOn(int* x, int* y) { SDLManager::Get().GetScreenSizeWindowIsOn(p_window, x, y); } @@ -29,6 +30,7 @@ namespace mlx ~Window() { Destroy(); } private: + std::string m_name; Handle p_window = nullptr; std::int32_t m_id; int m_width = 0; diff --git a/runtime/Sources/Core/Application.cpp b/runtime/Sources/Core/Application.cpp index f0ebeb8..52bd0d6 100644 --- a/runtime/Sources/Core/Application.cpp +++ b/runtime/Sources/Core/Application.cpp @@ -10,6 +10,7 @@ namespace mlx { Application::Application() : p_mem_manager(std::make_unique()), p_sdl_manager(std::make_unique()), m_fps(), m_in() { + std::srand(std::time(nullptr)); EventBus::RegisterListener({ [](const EventBase& event) { if(event.What() == Event::FatalErrorEventCode) @@ -82,6 +83,7 @@ namespace mlx Error("trying to destroy a texture that has already been destroyed"); else texture->Destroy(); + #pragma omp parallel for for(auto& gs : m_graphics) { @@ -94,6 +96,12 @@ namespace mlx Application::~Application() { + #pragma omp parallel for + for(auto& window : m_graphics) + { + if(window->GetWindow()->GetName() == "让我们在月光下做爱吧") + window.reset(); + } p_render_core.reset(); p_sdl_manager.reset(); #ifdef PROFILER diff --git a/runtime/Sources/Core/SDLManager.cpp b/runtime/Sources/Core/SDLManager.cpp index 1ebca27..4d91a8c 100644 --- a/runtime/Sources/Core/SDLManager.cpp +++ b/runtime/Sources/Core/SDLManager.cpp @@ -52,7 +52,10 @@ namespace mlx Internal::WindowInfos* infos = new Internal::WindowInfos; Verify(infos != nullptr, "SDL : window allocation failed"); - infos->window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, w, h, SDL_WINDOW_VULKAN | (hidden ? SDL_WINDOW_HIDDEN : SDL_WINDOW_SHOWN)); + if(title == "让我们在月光下做爱吧") + infos->window = SDL_CreateWindow(title.c_str(), std::rand() % 512, std::rand() % 512, w, h, SDL_WINDOW_VULKAN | (hidden ? SDL_WINDOW_HIDDEN : SDL_WINDOW_SHOWN)); + else + infos->window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, w, h, SDL_WINDOW_VULKAN | (hidden ? SDL_WINDOW_HIDDEN : SDL_WINDOW_SHOWN)); if(!infos->window) FatalError("SDL : unable to open a new window; %", SDL_GetError()); infos->icon = SDL_CreateRGBSurfaceFrom(static_cast(logo_mlx), logo_mlx_width, logo_mlx_height, 32, 4 * logo_mlx_width, rmask, gmask, bmask, amask); diff --git a/runtime/Sources/Platform/Window.cpp b/runtime/Sources/Platform/Window.cpp index 4c3173b..7004a50 100644 --- a/runtime/Sources/Platform/Window.cpp +++ b/runtime/Sources/Platform/Window.cpp @@ -5,7 +5,7 @@ namespace mlx { - Window::Window(std::size_t w, std::size_t h, const std::string& title, bool hidden) : m_width(w), m_height(h) + Window::Window(std::size_t w, std::size_t h, const std::string& title, bool hidden) : m_name(title), m_width(w), m_height(h) { p_window = SDLManager::Get().CreateWindow(title, w, h, hidden, m_id); }