From e152bf93b35cd2e4965322134dc4473a4689e9bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hatvani=20Tam=C3=A1s?= Date: Sun, 15 Mar 2026 19:39:35 +0100 Subject: [PATCH] Updated CmakeList --- .gitignore | 2 + .gitmodules | 12 +++ CMakeLists.txt | 133 ++++++++++++++++++++++++++ SakuraCore/src/Application.cpp | 166 +++++++++++++++++++++++++++++++++ SakuraCore/src/Application.h | 38 ++++++++ SakuraCore/src/Event.cpp | 6 ++ SakuraCore/src/Event.h | 3 + SakuraCore/src/Layer.cpp | 6 ++ SakuraCore/src/Layer.h | 23 +++++ SakuraCore/src/LayerStack.cpp | 37 ++++++++ SakuraCore/src/LayerStack.h | 25 +++++ SakuraCore/src/Log.cpp | 16 ++++ SakuraCore/src/Log.h | 23 +++++ SakuraCore/test/test.cpp | 53 +++++++++++ generate.bat | 11 +++ generate.sh | 8 ++ libs/catch2 | 1 + libs/imgui | 1 + libs/sdl3 | 1 + libs/spdlog | 1 + 20 files changed, 566 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 CMakeLists.txt create mode 100644 SakuraCore/src/Application.cpp create mode 100644 SakuraCore/src/Application.h create mode 100644 SakuraCore/src/Event.cpp create mode 100644 SakuraCore/src/Event.h create mode 100644 SakuraCore/src/Layer.cpp create mode 100644 SakuraCore/src/Layer.h create mode 100644 SakuraCore/src/LayerStack.cpp create mode 100644 SakuraCore/src/LayerStack.h create mode 100644 SakuraCore/src/Log.cpp create mode 100644 SakuraCore/src/Log.h create mode 100644 SakuraCore/test/test.cpp create mode 100644 generate.bat create mode 100755 generate.sh create mode 160000 libs/catch2 create mode 160000 libs/imgui create mode 160000 libs/sdl3 create mode 160000 libs/spdlog diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96971ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +Build +build diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..1865ea6 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "libs/imgui"] + path = libs/imgui + url = https://github.com/htamas1210/imgui.git +[submodule "libs/catch2"] + path = libs/catch2 + url = https://github.com/htamas1210/Catch2.git +[submodule "libs/spdlog"] + path = libs/spdlog + url = https://github.com/htamas1210/spdlog.git +[submodule "libs/sdl"] + path = libs/sdl3 + url = https://github.com/htamas1210/SDL.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..3210841 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,133 @@ +# Require a modern version of CMake +cmake_minimum_required(VERSION 3.15) + +# Define the Core Library project +project(SakuraCore LANGUAGES CXX) + +# ------------------------------------------------------------------------------ +# Default Build Type Configuration +# ------------------------------------------------------------------------------ +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + message(STATUS "Setting default build type to 'Debug'") + set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") +endif() + +# Enforce C++20 globally +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# ------------------------------------------------------------------------------ +# Output Directory Configuration +# ------------------------------------------------------------------------------ +set(OUTPUT_DIR_SUFFIX "$-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${OUTPUT_DIR_SUFFIX}") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${OUTPUT_DIR_SUFFIX}") +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${OUTPUT_DIR_SUFFIX}") + +# ------------------------------------------------------------------------------ +# Dependencies +# ------------------------------------------------------------------------------ +# 1. SDL3 +set(SDL_TESTS OFF CACHE BOOL "Disable SDL3 tests" FORCE) +set(SDL_EXAMPLES OFF CACHE BOOL "Disable SDL3 examples" FORCE) +add_subdirectory(libs/sdl3) + +# 2. spdlog +set(SPDLOG_BUILD_COMPILED ON CACHE BOOL "Build spdlog as a compiled library" FORCE) +set(SPDLOG_BUILD_EXAMPLE OFF CACHE BOOL "Disable spdlog examples" FORCE) +set(SPDLOG_BUILD_TESTS OFF CACHE BOOL "Disable spdlog tests" FORCE) +add_subdirectory(libs/spdlog) + +# 3. ImGui (Standard UI for debug menus/core rendering) +add_subdirectory(libs/imgui) + +# 4. Catch2 (Only in Debug) +if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR NOT CMAKE_BUILD_TYPE) + add_subdirectory(libs/catch2) +endif() + +# ------------------------------------------------------------------------------ +# Source Gathering +# ------------------------------------------------------------------------------ +file(GLOB_RECURSE SAKURA_CORE_SRCS "SakuraCore/src/*.cpp" "SakuraCore/src/*.h") + +# ------------------------------------------------------------------------------ +# SakuraCore STATIC Library Target +# ------------------------------------------------------------------------------ +add_library(SakuraCore STATIC ${SAKURA_CORE_SRCS}) + +target_include_directories(SakuraCore PUBLIC + "${CMAKE_CURRENT_SOURCE_DIR}/src" + "libs/spdlog/include" + "libs/imgui" + "libs/imgui/misc" + "libs/imgui/backends" + "libs/sdl3/include" +) + +target_link_libraries(SakuraCore PUBLIC + ImGui + SDL3::SDL3 + spdlog::spdlog +) + +# ------------------------------------------------------------------------------ +# Tests Executable Target +# ------------------------------------------------------------------------------ +if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR NOT CMAKE_BUILD_TYPE) + # The tests executable just needs its own test.cpp file + add_executable(tests "SakuraCore/test/test.cpp") + + # Link Catch2 and our newly created SakuraCore library! + # Because SakuraCore is PUBLIC above, 'tests' automatically gets SDL3, ImGui, etc. + target_include_directories(tests PRIVATE + "SakuraCore/src" + "libs/spdlog/include" + "libs/imgui" + "libs/imgui/misc" + "libs/imgui/backends" + "libs/sdl3/include" + ) + + target_link_libraries(tests PRIVATE + Catch2::Catch2WithMain + SakuraCore + ) +endif() + +# ------------------------------------------------------------------------------ +# Platform & Configuration Filters +# ------------------------------------------------------------------------------ +if(WIN32) + target_compile_definitions(SakuraCore PUBLIC PLATFORM_WINDOWS) + target_link_options(SakuraCore PUBLIC "/NODEFAULTLIB:MSVCRT") + + if(TARGET tests) + target_compile_definitions(tests PRIVATE PLATFORM_WINDOWS) + target_link_options(tests PRIVATE "/NODEFAULTLIB:MSVCRT") + endif() + +elseif(UNIX AND NOT APPLE) + target_compile_definitions(SakuraCore PUBLIC PLATFORM_LINUX) + target_link_libraries(SakuraCore PUBLIC dl pthread) + + if(TARGET tests) + target_compile_definitions(tests PRIVATE PLATFORM_LINUX) + target_link_libraries(tests PRIVATE dl pthread) + endif() +endif() + +# Debug vs Release definitions +target_compile_definitions(SakuraCore PUBLIC + $<$:DEBUG> + $<$:RELEASE> +) + +if(TARGET tests) + target_compile_definitions(tests PRIVATE + $<$:DEBUG> + $<$:RELEASE> + ) +endif() diff --git a/SakuraCore/src/Application.cpp b/SakuraCore/src/Application.cpp new file mode 100644 index 0000000..6df328d --- /dev/null +++ b/SakuraCore/src/Application.cpp @@ -0,0 +1,166 @@ +#include "Application.h" +#include "Event.h" +#include "Log.h" +#include "SDL3/SDL_render.h" +#include "imgui.h" +#include "imgui_impl_sdl3.h" +#include "imgui_impl_sdlrenderer3.h" + +Application::Application() : m_Window(nullptr), m_Renderer(nullptr), m_Surface(nullptr), m_isRunning(false) {} +Application::~Application() { Shutdown(); } + +bool Application::Init() { + SetRunningState(true); + + SakuraVNE::Log::Init(); + LOG_INFO("Initialized logger library"); + + LOG_INFO("window width: {0}, height: {1}", GetWindowData().width, GetWindowData().height); + + // Init sdl + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) == 0) { + LOG_ERROR("SDL could not be initialized! {0}", SDL_GetError()); + Shutdown(); + return false; + } + + SDL_WindowFlags windowFlags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE); + m_Window = SDL_CreateWindow(GetWindowData().title, GetWindowData().width, GetWindowData().height, windowFlags); + + if (!m_Window) { + LOG_ERROR("SDL window could not be created! {0}", SDL_GetError()); + Shutdown(); + + return false; + } else { + LOG_INFO("SDl window created"); + } + + if (GetWindowData().pos_x != -1 && GetWindowData().pos_y != -1) { + if (!SDL_SetWindowPosition(m_Window, GetWindowData().pos_x, GetWindowData().pos_y)) { + LOG_ERROR("Failed to set SDL_Window position {0}", SDL_GetError()); + } else { + LOG_INFO("SDL window position set to the initial value: x {0}, y {1}", GetWindowData().pos_x, GetWindowData().pos_y); + } + } else { + LOG_WARN("SDL window position not set. Will not attempt to set window position."); + } + + LOG_INFO("Available renderer drivers:"); + for (int i = 0; i < SDL_GetNumRenderDrivers(); i++) { + LOG_INFO("{0}. {1}", i + 1, SDL_GetRenderDriver(i)); + } + + m_Renderer = SDL_CreateRenderer(m_Window, nullptr); + if (!m_Renderer) { + LOG_ERROR("Renderer could not be created! {0}", SDL_GetError()); + } else { + LOG_INFO("SDL renderer created"); + LOG_INFO("Renderer: {0}", SDL_GetRendererName(m_Renderer)); + } + + SDL_SetRenderVSync(m_Renderer, 1); + + // Imgui init + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + + ImGuiIO &io = ImGui::GetIO(); + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; + + ImGui::StyleColorsDark(); + + ImGui_ImplSDL3_InitForSDLRenderer(m_Window, m_Renderer); + ImGui_ImplSDLRenderer3_Init(m_Renderer); + + return true; +} + +void Application::Run() { + bool demoWindowShow = false; + bool showOtherWindow = false; + ImVec4 clearColor = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + ImGuiIO &io = ImGui::GetIO(); + + while (GetRunningState()) { + SDL_Event event; + + while (SDL_PollEvent(&event)) { + ImGui_ImplSDL3_ProcessEvent(&event); + + if (event.type == SDL_EVENT_QUIT) { + SetRunningState(false); + LOG_INFO("Running state: {0}", GetRunningState()); + } + + if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(GetSDLWindow())) { + SetRunningState(false); + } + + if (event.type == SDL_EVENT_WINDOW_RESIZED) { + SDL_GetWindowSize(GetSDLWindow(), &GetWindowData().width, &GetWindowData().height); + + SetSDLWindowSurface(SDL_GetWindowSurface(GetSDLWindow())); + } + } + + ImGui_ImplSDLRenderer3_NewFrame(); + ImGui_ImplSDL3_NewFrame(); + ImGui::NewFrame(); + + if (demoWindowShow) { + ImGui::ShowDemoWindow(&demoWindowShow); + } + + // imgui demo window stuff or frame stuff + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello World!"); // creates window and add later stuff to it + + ImGui::Text("text stuff"); + ImGui::Checkbox("Demo checkbox", &showOtherWindow); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); + ImGui::ColorEdit3("clear color edit", (float *)&clearColor); + + if (ImGui::Button("Button")) + counter++; + + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application avg %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + + if (ImGui::Button("Quit")) { + SetRunningState(false); + } + + ImGui::End(); + + // Rendering + ImGui::Render(); + SDL_SetRenderScale(m_Renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + SDL_SetRenderDrawColor(m_Renderer, (Uint8)(clearColor.x * 255), (Uint8)(clearColor.y * 255), (Uint8)(clearColor.z * 255), (Uint8)(clearColor.w * 255)); + SDL_RenderClear(m_Renderer); + ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), m_Renderer); + SDL_RenderPresent(m_Renderer); + } +} + +void Application::Shutdown() { + LOG_WARN("Shutting down the application!"); + + ImGui_ImplSDLRenderer3_Shutdown(); + ImGui_ImplSDL3_Shutdown(); + ImGui::DestroyContext(); + + SDL_DestroyRenderer(m_Renderer); + + // Destroy window + SDL_DestroyWindow(m_Window); + + // Quit SDL subsystems + SDL_Quit(); +} diff --git a/SakuraCore/src/Application.h b/SakuraCore/src/Application.h new file mode 100644 index 0000000..23a86cc --- /dev/null +++ b/SakuraCore/src/Application.h @@ -0,0 +1,38 @@ +#pragma once + +#include "SDL3/SDL.h" + +struct WindowData { + int width = 1280; + int height = 720; + int pos_x = -1; + int pos_y = -1; + const char *title = "Sakura Visual Novel Engine"; +}; + +class Application { +public: + Application(); + ~Application(); + + bool Init(); + void Run(); + void Shutdown(); + + inline WindowData &GetWindowData() { return m_WindowData; } + inline SDL_Window *GetSDLWindow() { return m_Window; } + inline SDL_Surface *GetSDLWindowSurface() { return m_Surface; } + inline void SetSDLWindowSurface(SDL_Surface *newSurface) { m_Surface = newSurface; } + + bool &GetRunningState() { return m_isRunning; } + void SetRunningState(bool isRunning) { m_isRunning = isRunning; } + +private: + SDL_Window *m_Window; + SDL_Surface *m_Surface; + SDL_Renderer *m_Renderer; + + WindowData m_WindowData; + + bool m_isRunning; +}; diff --git a/SakuraCore/src/Event.cpp b/SakuraCore/src/Event.cpp new file mode 100644 index 0000000..b4a4691 --- /dev/null +++ b/SakuraCore/src/Event.cpp @@ -0,0 +1,6 @@ +#include "Event.h" +#include "Application.h" +#include "Log.h" +#include "SDL3/SDL.h" + +void SakuraVNE::ProcessEvents() {} diff --git a/SakuraCore/src/Event.h b/SakuraCore/src/Event.h new file mode 100644 index 0000000..144073c --- /dev/null +++ b/SakuraCore/src/Event.h @@ -0,0 +1,3 @@ +namespace SakuraVNE{ + void ProcessEvents(); +} diff --git a/SakuraCore/src/Layer.cpp b/SakuraCore/src/Layer.cpp new file mode 100644 index 0000000..a95d9d5 --- /dev/null +++ b/SakuraCore/src/Layer.cpp @@ -0,0 +1,6 @@ +#include "Layer.h" +#include + +namespace SakuraVNE { +Layer::Layer(const std::string &name) : m_LayerName(name) {} +} // namespace SakuraVNE diff --git a/SakuraCore/src/Layer.h b/SakuraCore/src/Layer.h new file mode 100644 index 0000000..3c636ff --- /dev/null +++ b/SakuraCore/src/Layer.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +namespace SakuraVNE { +class Layer { +public: + Layer(const std::string &name = "Layer"); + virtual ~Layer() = default; + + virtual void OnStart() {} + virtual void OnFrame(float timestamp) {} + virtual void OnEnd() {} + virtual void OnEvent() {} + virtual void OnAttach() {} + virtual void OnDetach() {} + + const std::string &GetName() const { return m_LayerName; } + +protected: + std::string m_LayerName; +}; +} // namespace SakuraVNE diff --git a/SakuraCore/src/LayerStack.cpp b/SakuraCore/src/LayerStack.cpp new file mode 100644 index 0000000..208035a --- /dev/null +++ b/SakuraCore/src/LayerStack.cpp @@ -0,0 +1,37 @@ +#include "LayerStack.h" +#include +#include + +namespace SakuraVNE { +LayerStack::~LayerStack() { + for (Layer *layer : m_LayerStack) { + layer->OnDetach(); + delete layer; + } +} + +void LayerStack::PushLayer(Layer *layer) { + m_LayerStack.emplace(m_LayerStack.begin() + m_LayerIndex, layer); + m_LayerIndex++; +} + +void LayerStack::PopLayer(Layer *layer) { + auto match = std::find(m_LayerStack.begin(), m_LayerStack.begin() + m_LayerIndex, layer); + if (match != m_LayerStack.begin() + m_LayerIndex) { + layer->OnDetach(); + m_LayerStack.erase(match); + m_LayerIndex--; + } +} + +void LayerStack::PushOverLay(Layer *layer) { m_LayerStack.emplace_back(layer); } + +void LayerStack::PopOverlay(Layer *layer) { + auto match = std::find(m_LayerStack.begin() + m_LayerIndex, m_LayerStack.end(), layer); + + if (match != m_LayerStack.end()) { + layer->OnDetach(); + m_LayerStack.erase(match); + } +} +} // namespace SakuraVNE diff --git a/SakuraCore/src/LayerStack.h b/SakuraCore/src/LayerStack.h new file mode 100644 index 0000000..713adf6 --- /dev/null +++ b/SakuraCore/src/LayerStack.h @@ -0,0 +1,25 @@ +#pragma once + +#include "Layer.h" +#include + +namespace SakuraVNE { +class LayerStack { +public: + LayerStack() = default; + ~LayerStack(); + + void PushLayer(Layer *layer); + void PopLayer(Layer *layer); + void PushOverLay(Layer *layer); + void PopOverlay(Layer *layer); + +#ifdef DEBUG + // this is only used for the tests for now, so it will be taken out of the release build + inline const std::vector &GetLayers() const { return m_LayerStack; } +#endif +private: + std::vector m_LayerStack; + unsigned int m_LayerIndex = 0; +}; +} // namespace SakuraVNE diff --git a/SakuraCore/src/Log.cpp b/SakuraCore/src/Log.cpp new file mode 100644 index 0000000..483d967 --- /dev/null +++ b/SakuraCore/src/Log.cpp @@ -0,0 +1,16 @@ +#include "Log.h" + +#include "spdlog/sinks/stdout_color_sinks.h" + +namespace SakuraVNE{ + + std::shared_ptr Log::m_Logger; + + + void Log::Init(){ + spdlog::set_pattern("%^[%T] %n: %v%$"); + + m_Logger = spdlog::stdout_color_mt("Sakura"); + m_Logger->set_level(spdlog::level::trace); + } +} \ No newline at end of file diff --git a/SakuraCore/src/Log.h b/SakuraCore/src/Log.h new file mode 100644 index 0000000..3e0979e --- /dev/null +++ b/SakuraCore/src/Log.h @@ -0,0 +1,23 @@ +#pragma once + +#include "spdlog/spdlog.h" +#include "spdlog/fmt/ostr.h" + +#include + +namespace SakuraVNE +{ + class Log + { + public: + static void Init(); + inline static std::shared_ptr& GetLogger() {return m_Logger;} + private: + static std::shared_ptr m_Logger; + }; +} + + +#define LOG_INFO(...) ::SakuraVNE::Log::GetLogger()->info(__VA_ARGS__) +#define LOG_WARN(...) ::SakuraVNE::Log::GetLogger()->warn(__VA_ARGS__) +#define LOG_ERROR(...) ::SakuraVNE::Log::GetLogger()->error(__VA_ARGS__) \ No newline at end of file diff --git a/SakuraCore/test/test.cpp b/SakuraCore/test/test.cpp new file mode 100644 index 0000000..fbaa274 --- /dev/null +++ b/SakuraCore/test/test.cpp @@ -0,0 +1,53 @@ +#include + +#include "Layer.h" +#include "LayerStack.h" + +#include +#include + +TEST_CASE("Layer operations", "[Layer]") { + SakuraVNE::LayerStack lstack; + const auto &layers = lstack.GetLayers(); + + SakuraVNE::Layer *layer1 = new SakuraVNE::Layer("layer1"); + lstack.PushLayer(layer1); + + SECTION("PushLayer should make the size 2") { + SakuraVNE::Layer *layer2 = new SakuraVNE::Layer("layer2"); + lstack.PushLayer(layer2); + REQUIRE(layers.size() == 2); + REQUIRE(layers[1]->GetName() == "layer2"); + } + SECTION("PopLayer should make the size 0") { + lstack.PopLayer(layer1); + REQUIRE(layers.size() == 0); + } + SECTION("PushOverlay should always put at the end of the list and should always be after the last fence index") { + SakuraVNE::Layer *layer2 = new SakuraVNE::Layer("layer2"); + lstack.PushOverLay(layer2); + REQUIRE(layers[1]->GetName() == "layer2"); + + SakuraVNE::Layer *layer3 = new SakuraVNE::Layer("layer3"); + lstack.PushLayer(layer3); + + REQUIRE(layers[1]->GetName() == "layer3"); + REQUIRE(layers[2]->GetName() == "layer2"); + } + SECTION("Pop overlay") { + SakuraVNE::Layer *layer6 = new SakuraVNE::Layer("layer6"); + lstack.PushOverLay(layer6); + REQUIRE(layers[1]->GetName() == "layer6"); + + lstack.PopOverlay(layer6); + + bool hasLayer2InVec = false; + for (auto layer : layers) { + if (layer->GetName() == "layer6") { + hasLayer2InVec = true; + } + } + + REQUIRE(hasLayer2InVec == false); + } +} diff --git a/generate.bat b/generate.bat new file mode 100644 index 0000000..7b9d525 --- /dev/null +++ b/generate.bat @@ -0,0 +1,11 @@ +echo Generating vs2026 project files... + +where cmake >target 2>nul +if %ERRORLEVEL% neq 0 ( + echo HIBA: A CMake nincs telepitve, vagy nincs hozzaadva a PATH-hoz. + pause + exit /b 1 +) +cmake -G "Visual Studio 18 2026" -A x64 +echo Done +PAUSE diff --git a/generate.sh b/generate.sh new file mode 100755 index 0000000..0373bdb --- /dev/null +++ b/generate.sh @@ -0,0 +1,8 @@ +#!/bin/bash +echo "Generating Makefiles..." +cmake -B build -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON +echo "Generating compile_commands.json for clangd..." +ln -sf build/compile_commands.json compile_commands.json +echo "Done!" + +echo "To compile run:\n cmake --build build -j": diff --git a/libs/catch2 b/libs/catch2 new file mode 160000 index 0000000..ccc49ba --- /dev/null +++ b/libs/catch2 @@ -0,0 +1 @@ +Subproject commit ccc49ba66484d881087fdc87fcc68b488c49bca4 diff --git a/libs/imgui b/libs/imgui new file mode 160000 index 0000000..5ffba73 --- /dev/null +++ b/libs/imgui @@ -0,0 +1 @@ +Subproject commit 5ffba73d973590180ee7ac718685678aad5a4857 diff --git a/libs/sdl3 b/libs/sdl3 new file mode 160000 index 0000000..5f78ded --- /dev/null +++ b/libs/sdl3 @@ -0,0 +1 @@ +Subproject commit 5f78ded3194a85ebdabc219f844811ba953b4450 diff --git a/libs/spdlog b/libs/spdlog new file mode 160000 index 0000000..45b67ee --- /dev/null +++ b/libs/spdlog @@ -0,0 +1 @@ +Subproject commit 45b67eee668507813743f84f1b1b9ab674ea221e