From aa7aafe944c30d17ba3c8435bf7a1da0067a7939 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 16 Oct 2025 19:43:51 +0200 Subject: [PATCH 1/9] feat: engine as library --- CMakeLists.txt | 102 +----------------- engine/CMakeLists.txt | 89 +++++++++++++++ {contrib => engine/contrib}/stb_image.h | 0 .../include/engine}/IO/file_manager.h | 0 .../include/engine}/IO/parser.h | 0 {include => engine/include/engine}/app/app.h | 0 .../include/engine}/components/batch.h | 2 +- .../include/engine}/components/camera.h | 0 .../include/engine}/components/light.h | 2 +- .../include/engine}/components/mesh.h | 2 +- .../include/engine}/components/rotate.h | 0 .../include/engine}/components/transform.h | 0 .../include/engine}/renderer/basics.h | 2 +- .../include/engine}/renderer/debug.h | 0 .../include/engine}/renderer/engine.h | 6 +- .../include/engine}/renderer/material.h | 2 +- .../include/engine}/renderer/mesh.h | 2 +- .../include/engine}/renderer/renderer.h | 2 +- .../include/engine}/renderer/shader.h | 0 .../include/engine}/renderer/texture.h | 0 .../include/engine}/renderer/wavefront.h | 8 +- .../include/engine}/window/event.h | 0 .../include/engine}/window/events/window.h | 0 .../include/engine}/window/window.h | 2 +- {src => engine/src}/IO/file_manager.cpp | 2 +- {src => engine/src}/IO/parser.cpp | 2 +- {src => engine/src}/components/batch.cpp | 2 +- {src => engine/src}/main.cpp | 22 ++-- {src => engine/src}/renderer/debug.cpp | 2 +- {src => engine/src}/renderer/engine.cpp | 6 +- {src => engine/src}/renderer/mesh.cpp | 2 +- {src => engine/src}/renderer/renderer.cpp | 16 +-- {src => engine/src}/renderer/shader.cpp | 2 +- {src => engine/src}/renderer/texture.cpp | 2 +- {src => engine/src}/renderer/wavefront.cpp | 6 +- {src => engine/src}/shaders/depth.fs | 0 {src => engine/src}/shaders/depth.vs | 0 {src => engine/src}/shaders/main.vs | 0 {src => engine/src}/shaders/pbr.fs | 0 {src => engine/src}/window/window.cpp | 6 +- sandbox/CMakeLists.txt | 10 ++ sandbox/src/main.cpp | 6 ++ 42 files changed, 160 insertions(+), 147 deletions(-) create mode 100644 engine/CMakeLists.txt rename {contrib => engine/contrib}/stb_image.h (100%) rename {include => engine/include/engine}/IO/file_manager.h (100%) rename {include => engine/include/engine}/IO/parser.h (100%) rename {include => engine/include/engine}/app/app.h (100%) rename {include => engine/include/engine}/components/batch.h (93%) rename {include => engine/include/engine}/components/camera.h (100%) rename {include => engine/include/engine}/components/light.h (93%) rename {include => engine/include/engine}/components/mesh.h (80%) rename {include => engine/include/engine}/components/rotate.h (100%) rename {include => engine/include/engine}/components/transform.h (100%) rename {include => engine/include/engine}/renderer/basics.h (92%) rename {include => engine/include/engine}/renderer/debug.h (100%) rename {include => engine/include/engine}/renderer/engine.h (75%) rename {include => engine/include/engine}/renderer/material.h (97%) rename {include => engine/include/engine}/renderer/mesh.h (93%) rename {include => engine/include/engine}/renderer/renderer.h (94%) rename {include => engine/include/engine}/renderer/shader.h (100%) rename {include => engine/include/engine}/renderer/texture.h (100%) rename {include => engine/include/engine}/renderer/wavefront.h (90%) rename {include => engine/include/engine}/window/event.h (100%) rename {include => engine/include/engine}/window/events/window.h (100%) rename {include => engine/include/engine}/window/window.h (97%) rename {src => engine/src}/IO/file_manager.cpp (94%) rename {src => engine/src}/IO/parser.cpp (99%) rename {src => engine/src}/components/batch.cpp (92%) rename {src => engine/src}/main.cpp (95%) rename {src => engine/src}/renderer/debug.cpp (98%) rename {src => engine/src}/renderer/engine.cpp (88%) rename {src => engine/src}/renderer/mesh.cpp (98%) rename {src => engine/src}/renderer/renderer.cpp (96%) rename {src => engine/src}/renderer/shader.cpp (99%) rename {src => engine/src}/renderer/texture.cpp (96%) rename {src => engine/src}/renderer/wavefront.cpp (99%) rename {src => engine/src}/shaders/depth.fs (100%) rename {src => engine/src}/shaders/depth.vs (100%) rename {src => engine/src}/shaders/main.vs (100%) rename {src => engine/src}/shaders/pbr.fs (100%) rename {src => engine/src}/window/window.cpp (97%) create mode 100644 sandbox/CMakeLists.txt create mode 100644 sandbox/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 04cbb07..c1e9feb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.16) project(CodingGame LANGUAGES C CXX) +set(ENGINE_TARGET engine) + # ---------- Build-type defaults (only affects single-config generators like Ninja/Make) ---------- if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) @@ -12,7 +14,7 @@ if (UNIX) FetchContent_Declare( glm GIT_REPOSITORY https://github.com/g-truc/glm.git - GIT_TAG bf71a834948186f4097caa076cd2663c69a10e1e # refs/tags/1.0.1 + GIT_TAG a532f5b1cf27d6a3c099437e6959cf7e398a0a67 # refs/tags/1.0.2 ) FetchContent_MakeAvailable(glm) @@ -34,99 +36,5 @@ elseif (MSVC) # vcpkg find_package(EnTT CONFIG REQUIRED) endif() -add_executable(CodingGame - src/IO/parser.cpp - src/IO/file_manager.cpp - - src/window/window.cpp - - src/components/batch.cpp - - src/renderer/debug.cpp - src/renderer/mesh.cpp - src/renderer/shader.cpp - src/renderer/texture.cpp - src/renderer/wavefront.cpp - src/renderer/engine.cpp - src/renderer/renderer.cpp - - src/main.cpp -) - -set_property(TARGET CodingGame PROPERTY CXX_STANDARD 17) -set_property(TARGET CodingGame PROPERTY CXX_STANDARD_REQUIRED ON) - -file(COPY src/shaders DESTINATION ${CMAKE_BINARY_DIR}/) - -target_include_directories(CodingGame PRIVATE - ${CMAKE_SOURCE_DIR}/include - ${CMAKE_SOURCE_DIR}/contrib -) -target_link_libraries(CodingGame PRIVATE - SDL3::SDL3 - OpenGL::GL - GLEW::GLEW - glm::glm - EnTT::EnTT -) - -# ---------- Visibility (helps optimizer & smaller binaries on Release) ---------- -# Only affects non-Windows compilers -set_target_properties(CodingGame PROPERTIES - CXX_VISIBILITY_PRESET hidden - VISIBILITY_INLINES_HIDDEN YES -) - -# ---------- Per-config flags ---------- -# Debug flags (your original intent, kept) -if (MSVC) - target_compile_options(CodingGame PRIVATE $<$:/Zi>) - target_link_options(CodingGame PRIVATE $<$:/DEBUG:FULL>) -else() - target_compile_options(CodingGame PRIVATE $<$:-ggdb>) -endif() - -# Release flags -if (MSVC) - # /O2: optimize speed, /GL: whole program opt (LTCG), /DNDEBUG: disable asserts - target_compile_options(CodingGame PRIVATE - $<$:/O2> - $<$:/DNDEBUG> - $<$:/O2> - ) - # Link-time codegen & extra linker opts for smaller/faster binaries - target_link_options(CodingGame PRIVATE - $<$:/LTCG /OPT:ICF /OPT:REF> - $<$:/LTCG /OPT:ICF /OPT:REF> - ) -else() - # GCC/Clang - # -O3 for max opts, -ffast-math optional but can be risky; we keep it OFF by default. - option(CODINGGAME_USE_MARCH_NATIVE "Enable -march=native on Release for this machine" ON) - target_compile_options(CodingGame PRIVATE - $<$:-O3> - $<$,$>:-march=native> - $<$:-DNDEBUG> - $<$:-O3 -g> - ) - # Linker: enable LTO when available; optionally strip symbols on non-Apple - include(CheckIPOSupported) # IPO == LTO in CMake terms - check_ipo_supported(RESULT ipo_supported OUTPUT ipo_msg) - if(ipo_supported) - set_property(TARGET CodingGame PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) - set_property(TARGET CodingGame PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) - endif() - - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT APPLE) - # -s strips symbols at link stage (use only for pure Release) - target_link_options(CodingGame PRIVATE $<$:-s>) - endif() -endif() - -# ---------- Windows: copy runtime DLLs ---------- -if (WIN32) - add_custom_command(TARGET CodingGame POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - $ $ - COMMAND_EXPAND_LISTS) -endif() \ No newline at end of file +add_subdirectory(engine) +add_subdirectory(sandbox) diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt new file mode 100644 index 0000000..d5e1e46 --- /dev/null +++ b/engine/CMakeLists.txt @@ -0,0 +1,89 @@ +add_library(${ENGINE_TARGET} STATIC + src/IO/parser.cpp + src/IO/file_manager.cpp + + src/window/window.cpp + + src/components/batch.cpp + + src/renderer/debug.cpp + src/renderer/mesh.cpp + src/renderer/shader.cpp + src/renderer/texture.cpp + src/renderer/wavefront.cpp + src/renderer/engine.cpp + src/renderer/renderer.cpp + + src/main.cpp +) + +set_target_properties(${ENGINE_TARGET} PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN YES +) + +target_include_directories(${ENGINE_TARGET} PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/contrib +) +target_link_libraries(${ENGINE_TARGET} PUBLIC + SDL3::SDL3 + OpenGL::GL + GLEW::GLEW + glm::glm + EnTT::EnTT +) + +if (MSVC) + target_compile_options(${ENGINE_TARGET} PRIVATE $<$:/Zi>) + target_link_options(${ENGINE_TARGET} PRIVATE $<$:/DEBUG:FULL>) +else() + target_compile_options(${ENGINE_TARGET} PRIVATE $<$:-ggdb>) +endif() + +# Release flags +if (MSVC) + # /O2: optimize speed, /GL: whole program opt (LTCG), /DNDEBUG: disable asserts + target_compile_options(${ENGINE_TARGET} PRIVATE + $<$:/O2> + $<$:/DNDEBUG> + $<$:/O2> + ) + # Link-time codegen & extra linker opts for smaller/faster binaries + target_link_options(${ENGINE_TARGET} PRIVATE + $<$:/LTCG /OPT:ICF /OPT:REF> + $<$:/LTCG /OPT:ICF /OPT:REF> + ) +else() + # GCC/Clang + # -O3 for max opts, -ffast-math optional but can be risky; we keep it OFF by default. + option(CODINGGAME_USE_MARCH_NATIVE "Enable -march=native on Release for this machine" ON) + target_compile_options(${ENGINE_TARGET} PRIVATE + $<$:-O3> + $<$,$>:-march=native> + $<$:-DNDEBUG> + $<$:-O3 -g> + ) + # Linker: enable LTO when available; optionally strip symbols on non-Apple + include(CheckIPOSupported) # IPO == LTO in CMake terms + check_ipo_supported(RESULT ipo_supported OUTPUT ipo_msg) + if(ipo_supported) + set_property(TARGET ${ENGINE_TARGET} PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) + set_property(TARGET ${ENGINE_TARGET} PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) + endif() + + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT APPLE) + # -s strips symbols at link stage (use only for pure Release) + target_link_options(${ENGINE_TARGET} PRIVATE $<$:-s>) + endif() +endif() + +# ---------- Windows: copy runtime DLLs ---------- +if (WIN32) + add_custom_command(TARGET ${ENGINE_TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ $ + COMMAND_EXPAND_LISTS) +endif() diff --git a/contrib/stb_image.h b/engine/contrib/stb_image.h similarity index 100% rename from contrib/stb_image.h rename to engine/contrib/stb_image.h diff --git a/include/IO/file_manager.h b/engine/include/engine/IO/file_manager.h similarity index 100% rename from include/IO/file_manager.h rename to engine/include/engine/IO/file_manager.h diff --git a/include/IO/parser.h b/engine/include/engine/IO/parser.h similarity index 100% rename from include/IO/parser.h rename to engine/include/engine/IO/parser.h diff --git a/include/app/app.h b/engine/include/engine/app/app.h similarity index 100% rename from include/app/app.h rename to engine/include/engine/app/app.h diff --git a/include/components/batch.h b/engine/include/engine/components/batch.h similarity index 93% rename from include/components/batch.h rename to engine/include/engine/components/batch.h index 55f11a6..9bf18eb 100644 --- a/include/components/batch.h +++ b/engine/include/engine/components/batch.h @@ -1,7 +1,7 @@ #ifndef COMPONENT_BATCH_H_ #define COMPONENT_BATCH_H_ -#include "renderer/renderer.h" +#include "engine/renderer/renderer.h" // requires mesh component struct batch { diff --git a/include/components/camera.h b/engine/include/engine/components/camera.h similarity index 100% rename from include/components/camera.h rename to engine/include/engine/components/camera.h diff --git a/include/components/light.h b/engine/include/engine/components/light.h similarity index 93% rename from include/components/light.h rename to engine/include/engine/components/light.h index 493dc77..8e5baf1 100644 --- a/include/components/light.h +++ b/engine/include/engine/components/light.h @@ -2,7 +2,7 @@ #define COMPONENTS_LIGHT_H_ #include -#include "renderer/renderer.h" +#include "engine/renderer/renderer.h" struct light { friend class Renderer; diff --git a/include/components/mesh.h b/engine/include/engine/components/mesh.h similarity index 80% rename from include/components/mesh.h rename to engine/include/engine/components/mesh.h index 08c64e5..0e576d4 100644 --- a/include/components/mesh.h +++ b/engine/include/engine/components/mesh.h @@ -2,7 +2,7 @@ #define COMPONENTS_MESH_H_ #include -#include "renderer/wavefront.h" +#include "engine/renderer/wavefront.h" struct mesh { std::shared_ptr object; diff --git a/include/components/rotate.h b/engine/include/engine/components/rotate.h similarity index 100% rename from include/components/rotate.h rename to engine/include/engine/components/rotate.h diff --git a/include/components/transform.h b/engine/include/engine/components/transform.h similarity index 100% rename from include/components/transform.h rename to engine/include/engine/components/transform.h diff --git a/include/renderer/basics.h b/engine/include/engine/renderer/basics.h similarity index 92% rename from include/renderer/basics.h rename to engine/include/engine/renderer/basics.h index 1a7e7d1..f1a7301 100644 --- a/include/renderer/basics.h +++ b/engine/include/engine/renderer/basics.h @@ -3,7 +3,7 @@ #include -#include "renderer/mesh.h" +#include "engine/renderer/mesh.h" class Vertex { friend class Mesh; diff --git a/include/renderer/debug.h b/engine/include/engine/renderer/debug.h similarity index 100% rename from include/renderer/debug.h rename to engine/include/engine/renderer/debug.h diff --git a/include/renderer/engine.h b/engine/include/engine/renderer/engine.h similarity index 75% rename from include/renderer/engine.h rename to engine/include/engine/renderer/engine.h index 466b855..2653ca0 100644 --- a/include/renderer/engine.h +++ b/engine/include/engine/renderer/engine.h @@ -4,10 +4,10 @@ #include #include -#include "window/window.h" -#include "window/events/window.h" +#include "engine/window/window.h" +#include "engine/window/events/window.h" -#include "app/app.h" +#include "engine/app/app.h" class Engine { public: diff --git a/include/renderer/material.h b/engine/include/engine/renderer/material.h similarity index 97% rename from include/renderer/material.h rename to engine/include/engine/renderer/material.h index 57b84fe..2dda85e 100644 --- a/include/renderer/material.h +++ b/engine/include/engine/renderer/material.h @@ -4,7 +4,7 @@ #include #include -#include "texture.h" +#include "engine/renderer/texture.h" class Material { private: diff --git a/include/renderer/mesh.h b/engine/include/engine/renderer/mesh.h similarity index 93% rename from include/renderer/mesh.h rename to engine/include/engine/renderer/mesh.h index cc2e506..9c9a912 100644 --- a/include/renderer/mesh.h +++ b/engine/include/engine/renderer/mesh.h @@ -5,7 +5,7 @@ #include #include -#include "renderer/basics.h" +#include "engine/renderer/basics.h" class Mesh { public: // TODO: abstract away diff --git a/include/renderer/renderer.h b/engine/include/engine/renderer/renderer.h similarity index 94% rename from include/renderer/renderer.h rename to engine/include/engine/renderer/renderer.h index 79946ce..f9c8f46 100644 --- a/include/renderer/renderer.h +++ b/engine/include/engine/renderer/renderer.h @@ -4,7 +4,7 @@ #include #include -#include "renderer/shader.h" +#include "engine/renderer/shader.h" // TODO: make static or singleton class Renderer { diff --git a/include/renderer/shader.h b/engine/include/engine/renderer/shader.h similarity index 100% rename from include/renderer/shader.h rename to engine/include/engine/renderer/shader.h diff --git a/include/renderer/texture.h b/engine/include/engine/renderer/texture.h similarity index 100% rename from include/renderer/texture.h rename to engine/include/engine/renderer/texture.h diff --git a/include/renderer/wavefront.h b/engine/include/engine/renderer/wavefront.h similarity index 90% rename from include/renderer/wavefront.h rename to engine/include/engine/renderer/wavefront.h index 2ee0081..5289cba 100644 --- a/include/renderer/wavefront.h +++ b/engine/include/engine/renderer/wavefront.h @@ -7,10 +7,10 @@ #include #include -#include "shader.h" -#include "renderer/renderer.h" -#include "renderer/material.h" -#include "renderer/mesh.h" +#include "engine/renderer/shader.h" +#include "engine/renderer/renderer.h" +#include "engine/renderer/material.h" +#include "engine/renderer/mesh.h" enum ObjElement { OHASH, MTLLIB, USEMTL, O, V, VN, VT, F, OUNKNOWN }; enum MtlElement { MHASH, NEWMTL, NS, KA, KS, KD, NI, D, ILLUM, MAP_KD, MAP_KA, MUNKNOWN }; diff --git a/include/window/event.h b/engine/include/engine/window/event.h similarity index 100% rename from include/window/event.h rename to engine/include/engine/window/event.h diff --git a/include/window/events/window.h b/engine/include/engine/window/events/window.h similarity index 100% rename from include/window/events/window.h rename to engine/include/engine/window/events/window.h diff --git a/include/window/window.h b/engine/include/engine/window/window.h similarity index 97% rename from include/window/window.h rename to engine/include/engine/window/window.h index 7d562a4..282946c 100644 --- a/include/window/window.h +++ b/engine/include/engine/window/window.h @@ -3,7 +3,7 @@ #include #include -#include "event.h" +#include "engine/window/event.h" #define ENGINE_GL_MAJOR_VERSION 4 #define ENGINE_GL_MINOR_VERSION 6 diff --git a/src/IO/file_manager.cpp b/engine/src/IO/file_manager.cpp similarity index 94% rename from src/IO/file_manager.cpp rename to engine/src/IO/file_manager.cpp index 745f7cc..6e7255b 100644 --- a/src/IO/file_manager.cpp +++ b/engine/src/IO/file_manager.cpp @@ -1,4 +1,4 @@ -#include "IO/file_manager.h" +#include "engine/IO/file_manager.h" #include #include diff --git a/src/IO/parser.cpp b/engine/src/IO/parser.cpp similarity index 99% rename from src/IO/parser.cpp rename to engine/src/IO/parser.cpp index 4d59c64..4a02b83 100644 --- a/src/IO/parser.cpp +++ b/engine/src/IO/parser.cpp @@ -2,7 +2,7 @@ #include // for strtof (fallback) #include -#include "IO/parser.h" +#include "engine/IO/parser.h" // Skip whitespace void Parser::SkipSpaces() { diff --git a/src/components/batch.cpp b/engine/src/components/batch.cpp similarity index 92% rename from src/components/batch.cpp rename to engine/src/components/batch.cpp index c0e9301..632c643 100644 --- a/src/components/batch.cpp +++ b/engine/src/components/batch.cpp @@ -1,6 +1,6 @@ #include -#include "components/batch.h" +#include "engine/components/batch.h" unsigned int batch::LastID = 0; diff --git a/src/main.cpp b/engine/src/main.cpp similarity index 95% rename from src/main.cpp rename to engine/src/main.cpp index 69298a3..cfcfd6a 100644 --- a/src/main.cpp +++ b/engine/src/main.cpp @@ -12,19 +12,19 @@ #include #include -#include "renderer/shader.h" -#include "renderer/wavefront.h" -#include "renderer/engine.h" -#include "renderer/renderer.h" +#include "engine/renderer/shader.h" +#include "engine/renderer/wavefront.h" +#include "engine/renderer/engine.h" +#include "engine/renderer/renderer.h" -#include "IO/file_manager.h" +#include "engine/IO/file_manager.h" -#include "components/transform.h" -#include "components/light.h" -#include "components/camera.h" -#include "components/mesh.h" -#include "components/rotate.h" -#include "components/batch.h" +#include "engine/components/transform.h" +#include "engine/components/light.h" +#include "engine/components/camera.h" +#include "engine/components/mesh.h" +#include "engine/components/rotate.h" +#include "engine/components/batch.h" class Game : public IApplication { public: diff --git a/src/renderer/debug.cpp b/engine/src/renderer/debug.cpp similarity index 98% rename from src/renderer/debug.cpp rename to engine/src/renderer/debug.cpp index 281962e..c9c4e61 100644 --- a/src/renderer/debug.cpp +++ b/engine/src/renderer/debug.cpp @@ -1,4 +1,4 @@ -#include "renderer/debug.h" +#include "engine/renderer/debug.h" #include diff --git a/src/renderer/engine.cpp b/engine/src/renderer/engine.cpp similarity index 88% rename from src/renderer/engine.cpp rename to engine/src/renderer/engine.cpp index ab25987..a956e12 100644 --- a/src/renderer/engine.cpp +++ b/engine/src/renderer/engine.cpp @@ -1,9 +1,9 @@ #include -#include "renderer/engine.h" -#include "window/event.h" +#include "engine/renderer/engine.h" +#include "engine/window/event.h" -#include "renderer/wavefront.h" +#include "engine/renderer/wavefront.h" std::unique_ptr Engine::s_app = nullptr; std::shared_ptr Engine::s_window = nullptr; diff --git a/src/renderer/mesh.cpp b/engine/src/renderer/mesh.cpp similarity index 98% rename from src/renderer/mesh.cpp rename to engine/src/renderer/mesh.cpp index ee02817..f453f32 100644 --- a/src/renderer/mesh.cpp +++ b/engine/src/renderer/mesh.cpp @@ -1,6 +1,6 @@ #include -#include "renderer/mesh.h" +#include "engine/renderer/mesh.h" Mesh::Mesh() { m_vao = 0; diff --git a/src/renderer/renderer.cpp b/engine/src/renderer/renderer.cpp similarity index 96% rename from src/renderer/renderer.cpp rename to engine/src/renderer/renderer.cpp index 7c8e9bd..e30d84b 100644 --- a/src/renderer/renderer.cpp +++ b/engine/src/renderer/renderer.cpp @@ -9,15 +9,15 @@ #define GLM_ENABLE_EXPERIMENTAL #include -#include "renderer/renderer.h" -#include "window/window.h" -#include "IO/file_manager.h" +#include "engine/renderer/renderer.h" +#include "engine/window/window.h" +#include "engine/IO/file_manager.h" -#include "components/transform.h" -#include "components/camera.h" -#include "components/light.h" -#include "components/mesh.h" -#include "components/batch.h" +#include "engine/components/transform.h" +#include "engine/components/camera.h" +#include "engine/components/light.h" +#include "engine/components/mesh.h" +#include "engine/components/batch.h" Renderer::Renderer(entt::registry& registry) : m_registry(registry) { diff --git a/src/renderer/shader.cpp b/engine/src/renderer/shader.cpp similarity index 99% rename from src/renderer/shader.cpp rename to engine/src/renderer/shader.cpp index ed58acb..4f33a68 100644 --- a/src/renderer/shader.cpp +++ b/engine/src/renderer/shader.cpp @@ -1,6 +1,6 @@ #include #include -#include "renderer/shader.h" +#include "engine/renderer/shader.h" Shader::Shader() { diff --git a/src/renderer/texture.cpp b/engine/src/renderer/texture.cpp similarity index 96% rename from src/renderer/texture.cpp rename to engine/src/renderer/texture.cpp index 8b67ca4..04539c8 100644 --- a/src/renderer/texture.cpp +++ b/engine/src/renderer/texture.cpp @@ -2,7 +2,7 @@ #include #include -#include "renderer/texture.h" +#include "engine/renderer/texture.h" #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" diff --git a/src/renderer/wavefront.cpp b/engine/src/renderer/wavefront.cpp similarity index 99% rename from src/renderer/wavefront.cpp rename to engine/src/renderer/wavefront.cpp index 731b48d..cd5effd 100644 --- a/src/renderer/wavefront.cpp +++ b/engine/src/renderer/wavefront.cpp @@ -5,9 +5,9 @@ #include #include -#include "IO/parser.h" -#include "renderer/mesh.h" -#include "renderer/wavefront.h" +#include "engine/IO/parser.h" +#include "engine/renderer/mesh.h" +#include "engine/renderer/wavefront.h" #define DEFAULT_MATERIAL_NAME "default" diff --git a/src/shaders/depth.fs b/engine/src/shaders/depth.fs similarity index 100% rename from src/shaders/depth.fs rename to engine/src/shaders/depth.fs diff --git a/src/shaders/depth.vs b/engine/src/shaders/depth.vs similarity index 100% rename from src/shaders/depth.vs rename to engine/src/shaders/depth.vs diff --git a/src/shaders/main.vs b/engine/src/shaders/main.vs similarity index 100% rename from src/shaders/main.vs rename to engine/src/shaders/main.vs diff --git a/src/shaders/pbr.fs b/engine/src/shaders/pbr.fs similarity index 100% rename from src/shaders/pbr.fs rename to engine/src/shaders/pbr.fs diff --git a/src/window/window.cpp b/engine/src/window/window.cpp similarity index 97% rename from src/window/window.cpp rename to engine/src/window/window.cpp index 54cf89c..3716bbe 100644 --- a/src/window/window.cpp +++ b/engine/src/window/window.cpp @@ -1,12 +1,12 @@ #include -#include "window/window.h" -#include "window/events/window.h" +#include "engine/window/window.h" +#include "engine/window/events/window.h" #include #include -#include "renderer/debug.h" +#include "engine/renderer/debug.h" std::shared_ptr Window::s_instance = nullptr; diff --git a/sandbox/CMakeLists.txt b/sandbox/CMakeLists.txt new file mode 100644 index 0000000..afca6d7 --- /dev/null +++ b/sandbox/CMakeLists.txt @@ -0,0 +1,10 @@ +set(SANDBOX_TARGET sandbox) + +add_executable(${SANDBOX_TARGET} src/main.cpp) + +set_target_properties(${SANDBOX_TARGET} PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON +) + +target_link_libraries(${SANDBOX_TARGET} PRIVATE ${ENGINE_TARGET}) diff --git a/sandbox/src/main.cpp b/sandbox/src/main.cpp new file mode 100644 index 0000000..0fe67cc --- /dev/null +++ b/sandbox/src/main.cpp @@ -0,0 +1,6 @@ +#include +#include "engine/renderer/engine.h" + +int main(int argc, char **argv) { + return 0; +} From bd7f52ae3d086db472f2902d068f8b87fece3021 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 16 Oct 2025 19:48:01 +0200 Subject: [PATCH 2/9] feat: rename engine.h to core.h + remove main.cpp file including in cmake --- engine/CMakeLists.txt | 4 +- .../engine/renderer/{engine.h => core.h} | 0 engine/src/main.cpp | 238 ----------------- engine/src/renderer/{engine.cpp => core.cpp} | 2 +- engine/src/renderer/renderer.cpp | 8 +- sandbox/src/main.cpp | 240 +++++++++++++++++- 6 files changed, 243 insertions(+), 249 deletions(-) rename engine/include/engine/renderer/{engine.h => core.h} (100%) delete mode 100644 engine/src/main.cpp rename engine/src/renderer/{engine.cpp => core.cpp} (96%) diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index d5e1e46..ccd380e 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -11,10 +11,10 @@ add_library(${ENGINE_TARGET} STATIC src/renderer/shader.cpp src/renderer/texture.cpp src/renderer/wavefront.cpp - src/renderer/engine.cpp + src/renderer/core.cpp src/renderer/renderer.cpp - src/main.cpp + # src/main.cpp ) set_target_properties(${ENGINE_TARGET} PROPERTIES diff --git a/engine/include/engine/renderer/engine.h b/engine/include/engine/renderer/core.h similarity index 100% rename from engine/include/engine/renderer/engine.h rename to engine/include/engine/renderer/core.h diff --git a/engine/src/main.cpp b/engine/src/main.cpp deleted file mode 100644 index cfcfd6a..0000000 --- a/engine/src/main.cpp +++ /dev/null @@ -1,238 +0,0 @@ -#ifndef WIN32 -#define GLEW_STATIC -#endif - -#include -#include - -#ifdef WIN32 -#include -#endif -#include -#include -#include - -#include "engine/renderer/shader.h" -#include "engine/renderer/wavefront.h" -#include "engine/renderer/engine.h" -#include "engine/renderer/renderer.h" - -#include "engine/IO/file_manager.h" - -#include "engine/components/transform.h" -#include "engine/components/light.h" -#include "engine/components/camera.h" -#include "engine/components/mesh.h" -#include "engine/components/rotate.h" -#include "engine/components/batch.h" - -class Game : public IApplication { -public: - Game() : m_renderer(m_registry) { - Object* lightObj = Object::LoadFile("./assets/sphere.obj"); - const auto lght = m_registry.create(); - m_registry.emplace(lght, glm::vec3(5.f, 5.f, 5.f), glm::vec3(0.f)); - m_registry.emplace(lght, light::LightType::DIRECTIONAL, glm::vec3(1.f, 1.f, 1.f), 1.5f); - m_registry.emplace(lght, std::shared_ptr(lightObj)); - - const auto cameraEntity = m_registry.create(); - m_registry.emplace(cameraEntity, glm::vec3(0.f, 2.f, 2.f)); - m_registry.emplace(cameraEntity); - - Object* targetObj = Object::LoadFile("./assets/wizard/wizard.obj"); - const auto targetEntity = m_registry.create(); - m_registry.emplace(targetEntity, glm::vec3(0.f, 0.0f, 0.f)); - m_registry.emplace(targetEntity, std::shared_ptr(targetObj)); - - Object* grass = Object::LoadFile("./assets/grass_block/grass_block.obj"); - const auto cubeEntity = m_registry.create(); - m_registry.emplace(cubeEntity, glm::vec3(-1.5f, 0.4f, 0.f)); - m_registry.emplace(cubeEntity, std::shared_ptr(grass)); - - // Cube template (use shared object to avoid reloading 1000 times) - std::shared_ptr cubeObj = std::shared_ptr(Object::LoadFile("./assets/grass_block/grass_block.obj")); - const auto batchEntt = m_registry.create(); - m_registry.emplace(batchEntt); - m_registry.emplace(batchEntt, cubeObj); - auto cubeBatch = m_registry.get(batchEntt); - // Generate 1000 random cubes - for (int i = 0; i < 1000; ++i) { - const auto cubeEntity = m_registry.create(); - - float x = static_cast(rand()) / RAND_MAX * 200.f - 100.f; // range [-100, 100] - float y = static_cast(rand()) / RAND_MAX * 10.f; // range [0, 10] - float z = static_cast(rand()) / RAND_MAX * 200.f - 100.f; // range [-100, 100] - - m_registry.emplace(cubeEntity, glm::vec3(x, y, z)); - m_registry.emplace(cubeEntity); - m_registry.emplace(cubeEntity, cubeBatch.id()); - } - - Object* floorObj = Object::LoadFile("./assets/plane.obj"); - const auto floorEntt = m_registry.create(); - m_registry.emplace(floorEntt, glm::vec3(0.f)); - m_registry.emplace(floorEntt, std::shared_ptr(floorObj)); - } - ~Game() override {} - - void OnInit() override { - std::cout << "Game initialized" << std::endl; - - m_angle = 3.45f; - m_lastTicks = SDL_GetTicks(); - - m_paused = false; - - m_yaw = -90.0f; // looking along -Z initially - m_pitch = 0.0f; // no vertical tilt - - // FPS tracking - m_startTicks = SDL_GetTicks(); - m_frameCount = 0; - - m_renderer.Init(); - m_renderer.GenerateShadowMaps(); - } - - void OnWindowResized(const WindowResized& event) override { - m_renderer.OnWindowResized(event.w, event.h); - } - - void OnUpdate() override { - m_currentTicks = SDL_GetTicks(); - float deltaTime = static_cast(m_currentTicks - m_lastTicks) / 1000.0f; // seconds - - m_lastTicks = m_currentTicks; - - float mouseXRel, mouseYRel; - SDL_GetRelativeMouseState(&mouseXRel, &mouseYRel); - - float sensitivity = 0.1f; // tweak as needed - m_yaw += mouseXRel * sensitivity; - m_pitch -= mouseYRel * sensitivity; // invert Y for typical FPS control - - // clamp pitch to avoid flipping - // if (pitch > 89.0f) pitch = 89.0f; - // if (pitch < -89.0f) pitch = -89.0f; - m_pitch = glm::clamp(m_pitch, -89.0f, 89.0f); - - // convert to direction vector - glm::vec3 cameraViewDirection(0.f, 0.f, -1.f); - cameraViewDirection.x = cos(glm::radians(m_yaw)) * cos(glm::radians(m_pitch)); - cameraViewDirection.y = sin(glm::radians(m_pitch)); - cameraViewDirection.z = sin(glm::radians(m_yaw)) * cos(glm::radians(m_pitch)); - cameraViewDirection = glm::normalize(cameraViewDirection); - - glm::vec3 velocity(0.f); - - const bool* state = SDL_GetKeyboardState(nullptr); - - if (state[SDL_SCANCODE_P]) m_paused = !m_paused; - - glm::vec3 front = glm::normalize(glm::vec3(cameraViewDirection.x, 0.f, cameraViewDirection.z)); - glm::vec3 right = glm::normalize(glm::cross(front, glm::vec3(0.f, 1.f, 0.f))); - - if (state[SDL_SCANCODE_W]) velocity += front; - if (state[SDL_SCANCODE_S]) velocity -= front; - if (state[SDL_SCANCODE_A]) velocity -= right; - if (state[SDL_SCANCODE_D]) velocity += right; - if (state[SDL_SCANCODE_SPACE]) velocity.y += 1.f; - if (state[SDL_SCANCODE_LSHIFT]) velocity.y -= 1.f; - - auto view = m_registry.view(); - for (auto [cam, camTransform] : view.each()) { - camTransform.position += velocity * deltaTime * 2.5f; // speed is e.g. 2.5f - camTransform.rotation = cameraViewDirection; - } - - // update rotation - if (!m_paused) { - m_angle += glm::radians(45.0f) * deltaTime; // 72° per second - if (m_angle > glm::two_pi()) { - m_angle -= glm::two_pi(); // keep value small - } - } - - // ---- Day-night simulation ---- - m_dayTime += deltaTime; - if (m_dayTime > m_dayLength) - m_dayTime -= m_dayLength; // loop every "day" - - float dayProgress = m_dayTime / m_dayLength; // 0.0 -> 1.0 - float sunAngle = dayProgress * glm::two_pi(); // radians through the sky - - // Compute sun direction (rotating around X axis) - // At t=0.0 sun at east horizon, at π/2 overhead, at π west horizon - glm::vec3 sunDir = glm::normalize(glm::vec3(0.0f, sin(sunAngle), cos(sunAngle))); - - // Compute intensity: bright at noon, dim at dusk/dawn, dark at night - float intensity = glm::max(sin(sunAngle), (double)0.0f); // 0 at night, 1 at noon - intensity = glm::mix(0.05f, 1.5f, intensity); // keep some ambient even at night - - // Optional: tint color (warm at sunrise/sunset) - glm::vec3 dayColor = glm::vec3(1.0f, 0.95f, 0.9f); - glm::vec3 sunsetColor= glm::vec3(1.0f, 0.6f, 0.3f); - float sunsetFactor = glm::clamp(1.0f - abs(sin(sunAngle)) * 2.0f, 0.0f, 1.0f); - glm::vec3 sunColor = glm::mix(dayColor, sunsetColor, sunsetFactor); - - // Update the directional light in the registry - auto lightsView = m_registry.view(); - for (auto [entity, l, t] : lightsView.each()) { - if (l.type == light::LightType::DIRECTIONAL) { - // "position" for directional light often stores direction vector - // If your system instead uses transform.rotation, adjust accordingly - t.position = sunDir * 15.f; // use this as light direction - l.color = sunColor; - l.intensity = intensity; - } - } - - auto rotateEntts = m_registry.view(); - for (auto [entity, t] : rotateEntts.each()) { - // auto targetTransform = rotateEntts.get(entity); - if (!m_registry.all_of(entity)) { - t.rotation.y = m_angle; - } - } - } - - void OnRender() override { - m_renderer.Render(); - - m_frameCount++; - m_currentTicks = SDL_GetTicks(); - Uint64 elapsed = m_currentTicks - m_startTicks; - - if (elapsed >= 1000) { // one second passed - double fps = static_cast(m_frameCount) / (static_cast(elapsed) / 1000.0); - std::cout << "FPS: " << fps << std::endl; - m_frameCount = 0; - m_startTicks = m_currentTicks; - } - } -private: - Renderer m_renderer; - entt::registry m_registry; - - float m_angle; - Uint64 m_lastTicks; - - float m_dayTime = 0.0f; // accumulates time for day-night cycle - float m_dayLength = 60.0f; // seconds per full day cycle - - bool m_paused = false; - - float m_yaw = -90.0f; // looking along -Z initially - float m_pitch = 0.0f; // no vertical tilt - - // FPS tracking - Uint64 m_startTicks; - int m_frameCount; - - Uint64 m_currentTicks; -}; - -int main() { - Engine::Run(std::make_unique()); - return 0; -} \ No newline at end of file diff --git a/engine/src/renderer/engine.cpp b/engine/src/renderer/core.cpp similarity index 96% rename from engine/src/renderer/engine.cpp rename to engine/src/renderer/core.cpp index a956e12..e8564f2 100644 --- a/engine/src/renderer/engine.cpp +++ b/engine/src/renderer/core.cpp @@ -1,6 +1,6 @@ #include -#include "engine/renderer/engine.h" +#include "engine/renderer/core.h" #include "engine/window/event.h" #include "engine/renderer/wavefront.h" diff --git a/engine/src/renderer/renderer.cpp b/engine/src/renderer/renderer.cpp index e30d84b..bdc7c58 100644 --- a/engine/src/renderer/renderer.cpp +++ b/engine/src/renderer/renderer.cpp @@ -29,13 +29,13 @@ Renderer::Renderer(entt::registry& registry) : m_registry(registry) ); m_shader.init( - FileManager::read("./src/shaders/main.vs"), - FileManager::read("./src/shaders/pbr.fs") + FileManager::read("./engine/src/shaders/main.vs"), + FileManager::read("./engine/src/shaders/pbr.fs") ); m_depthShader.init( - FileManager::read("./src/shaders/depth.vs"), - FileManager::read("./src/shaders/depth.fs") + FileManager::read("./engine/src/shaders/depth.vs"), + FileManager::read("./engine/src/shaders/depth.fs") ); m_model = glm::mat4(1.f); diff --git a/sandbox/src/main.cpp b/sandbox/src/main.cpp index 0fe67cc..c455da5 100644 --- a/sandbox/src/main.cpp +++ b/sandbox/src/main.cpp @@ -1,6 +1,238 @@ -#include -#include "engine/renderer/engine.h" +#ifndef WIN32 +#define GLEW_STATIC +#endif -int main(int argc, char **argv) { +#include +#include + +#ifdef WIN32 +#include +#endif +#include +#include +#include + +#include "engine/renderer/shader.h" +#include "engine/renderer/wavefront.h" +#include "engine/renderer/core.h" +#include "engine/renderer/renderer.h" + +#include "engine/IO/file_manager.h" + +#include "engine/components/transform.h" +#include "engine/components/light.h" +#include "engine/components/camera.h" +#include "engine/components/mesh.h" +#include "engine/components/rotate.h" +#include "engine/components/batch.h" + +class Game : public IApplication { +public: + Game() : m_renderer(m_registry) { + Object* lightObj = Object::LoadFile("./assets/sphere.obj"); + const auto lght = m_registry.create(); + m_registry.emplace(lght, glm::vec3(5.f, 5.f, 5.f), glm::vec3(0.f)); + m_registry.emplace(lght, light::LightType::DIRECTIONAL, glm::vec3(1.f, 1.f, 1.f), 1.5f); + m_registry.emplace(lght, std::shared_ptr(lightObj)); + + const auto cameraEntity = m_registry.create(); + m_registry.emplace(cameraEntity, glm::vec3(0.f, 2.f, 2.f)); + m_registry.emplace(cameraEntity); + + Object* targetObj = Object::LoadFile("./assets/wizard/wizard.obj"); + const auto targetEntity = m_registry.create(); + m_registry.emplace(targetEntity, glm::vec3(0.f, 0.0f, 0.f)); + m_registry.emplace(targetEntity, std::shared_ptr(targetObj)); + + Object* grass = Object::LoadFile("./assets/grass_block/grass_block.obj"); + const auto cubeEntity = m_registry.create(); + m_registry.emplace(cubeEntity, glm::vec3(-1.5f, 0.4f, 0.f)); + m_registry.emplace(cubeEntity, std::shared_ptr(grass)); + + // Cube template (use shared object to avoid reloading 1000 times) + std::shared_ptr cubeObj = std::shared_ptr(Object::LoadFile("./assets/grass_block/grass_block.obj")); + const auto batchEntt = m_registry.create(); + m_registry.emplace(batchEntt); + m_registry.emplace(batchEntt, cubeObj); + auto cubeBatch = m_registry.get(batchEntt); + // Generate 1000 random cubes + for (int i = 0; i < 1000; ++i) { + const auto cubeEntity = m_registry.create(); + + float x = static_cast(rand()) / RAND_MAX * 200.f - 100.f; // range [-100, 100] + float y = static_cast(rand()) / RAND_MAX * 10.f; // range [0, 10] + float z = static_cast(rand()) / RAND_MAX * 200.f - 100.f; // range [-100, 100] + + m_registry.emplace(cubeEntity, glm::vec3(x, y, z)); + m_registry.emplace(cubeEntity); + m_registry.emplace(cubeEntity, cubeBatch.id()); + } + + Object* floorObj = Object::LoadFile("./assets/plane.obj"); + const auto floorEntt = m_registry.create(); + m_registry.emplace(floorEntt, glm::vec3(0.f)); + m_registry.emplace(floorEntt, std::shared_ptr(floorObj)); + } + ~Game() override {} + + void OnInit() override { + std::cout << "Game initialized" << std::endl; + + m_angle = 3.45f; + m_lastTicks = SDL_GetTicks(); + + m_paused = false; + + m_yaw = -90.0f; // looking along -Z initially + m_pitch = 0.0f; // no vertical tilt + + // FPS tracking + m_startTicks = SDL_GetTicks(); + m_frameCount = 0; + + m_renderer.Init(); + m_renderer.GenerateShadowMaps(); + } + + void OnWindowResized(const WindowResized& event) override { + m_renderer.OnWindowResized(event.w, event.h); + } + + void OnUpdate() override { + m_currentTicks = SDL_GetTicks(); + float deltaTime = static_cast(m_currentTicks - m_lastTicks) / 1000.0f; // seconds + + m_lastTicks = m_currentTicks; + + float mouseXRel, mouseYRel; + SDL_GetRelativeMouseState(&mouseXRel, &mouseYRel); + + float sensitivity = 0.1f; // tweak as needed + m_yaw += mouseXRel * sensitivity; + m_pitch -= mouseYRel * sensitivity; // invert Y for typical FPS control + + // clamp pitch to avoid flipping + // if (pitch > 89.0f) pitch = 89.0f; + // if (pitch < -89.0f) pitch = -89.0f; + m_pitch = glm::clamp(m_pitch, -89.0f, 89.0f); + + // convert to direction vector + glm::vec3 cameraViewDirection(0.f, 0.f, -1.f); + cameraViewDirection.x = cos(glm::radians(m_yaw)) * cos(glm::radians(m_pitch)); + cameraViewDirection.y = sin(glm::radians(m_pitch)); + cameraViewDirection.z = sin(glm::radians(m_yaw)) * cos(glm::radians(m_pitch)); + cameraViewDirection = glm::normalize(cameraViewDirection); + + glm::vec3 velocity(0.f); + + const bool* state = SDL_GetKeyboardState(nullptr); + + if (state[SDL_SCANCODE_P]) m_paused = !m_paused; + + glm::vec3 front = glm::normalize(glm::vec3(cameraViewDirection.x, 0.f, cameraViewDirection.z)); + glm::vec3 right = glm::normalize(glm::cross(front, glm::vec3(0.f, 1.f, 0.f))); + + if (state[SDL_SCANCODE_W]) velocity += front; + if (state[SDL_SCANCODE_S]) velocity -= front; + if (state[SDL_SCANCODE_A]) velocity -= right; + if (state[SDL_SCANCODE_D]) velocity += right; + if (state[SDL_SCANCODE_SPACE]) velocity.y += 1.f; + if (state[SDL_SCANCODE_LSHIFT]) velocity.y -= 1.f; + + auto view = m_registry.view(); + for (auto [cam, camTransform] : view.each()) { + camTransform.position += velocity * deltaTime * 2.5f; // speed is e.g. 2.5f + camTransform.rotation = cameraViewDirection; + } + + // update rotation + if (!m_paused) { + m_angle += glm::radians(45.0f) * deltaTime; // 72° per second + if (m_angle > glm::two_pi()) { + m_angle -= glm::two_pi(); // keep value small + } + } + + // ---- Day-night simulation ---- + m_dayTime += deltaTime; + if (m_dayTime > m_dayLength) + m_dayTime -= m_dayLength; // loop every "day" + + float dayProgress = m_dayTime / m_dayLength; // 0.0 -> 1.0 + float sunAngle = dayProgress * glm::two_pi(); // radians through the sky + + // Compute sun direction (rotating around X axis) + // At t=0.0 sun at east horizon, at π/2 overhead, at π west horizon + glm::vec3 sunDir = glm::normalize(glm::vec3(0.0f, sin(sunAngle), cos(sunAngle))); + + // Compute intensity: bright at noon, dim at dusk/dawn, dark at night + float intensity = glm::max(sin(sunAngle), (double)0.0f); // 0 at night, 1 at noon + intensity = glm::mix(0.05f, 1.5f, intensity); // keep some ambient even at night + + // Optional: tint color (warm at sunrise/sunset) + glm::vec3 dayColor = glm::vec3(1.0f, 0.95f, 0.9f); + glm::vec3 sunsetColor= glm::vec3(1.0f, 0.6f, 0.3f); + float sunsetFactor = glm::clamp(1.0f - abs(sin(sunAngle)) * 2.0f, 0.0f, 1.0f); + glm::vec3 sunColor = glm::mix(dayColor, sunsetColor, sunsetFactor); + + // Update the directional light in the registry + auto lightsView = m_registry.view(); + for (auto [entity, l, t] : lightsView.each()) { + if (l.type == light::LightType::DIRECTIONAL) { + // "position" for directional light often stores direction vector + // If your system instead uses transform.rotation, adjust accordingly + t.position = sunDir * 15.f; // use this as light direction + l.color = sunColor; + l.intensity = intensity; + } + } + + auto rotateEntts = m_registry.view(); + for (auto [entity, t] : rotateEntts.each()) { + // auto targetTransform = rotateEntts.get(entity); + if (!m_registry.all_of(entity)) { + t.rotation.y = m_angle; + } + } + } + + void OnRender() override { + m_renderer.Render(); + + m_frameCount++; + m_currentTicks = SDL_GetTicks(); + Uint64 elapsed = m_currentTicks - m_startTicks; + + if (elapsed >= 1000) { // one second passed + double fps = static_cast(m_frameCount) / (static_cast(elapsed) / 1000.0); + std::cout << "FPS: " << fps << std::endl; + m_frameCount = 0; + m_startTicks = m_currentTicks; + } + } +private: + Renderer m_renderer; + entt::registry m_registry; + + float m_angle; + Uint64 m_lastTicks; + + float m_dayTime = 0.0f; // accumulates time for day-night cycle + float m_dayLength = 60.0f; // seconds per full day cycle + + bool m_paused = false; + + float m_yaw = -90.0f; // looking along -Z initially + float m_pitch = 0.0f; // no vertical tilt + + // FPS tracking + Uint64 m_startTicks; + int m_frameCount; + + Uint64 m_currentTicks; +}; + +int main() { + Engine::Run(std::make_unique()); return 0; -} +} \ No newline at end of file From 800d0eb8e4e44231dfdfe6fe2d1440eed85bd0c3 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 16 Oct 2025 19:56:17 +0200 Subject: [PATCH 3/9] feat: move entrypoint to the engine --- engine/include/engine/app/app.h | 2 ++ engine/include/engine/engine.h | 19 +++++++++++++++++++ sandbox/src/main.cpp | 24 +++++++----------------- 3 files changed, 28 insertions(+), 17 deletions(-) create mode 100644 engine/include/engine/engine.h diff --git a/engine/include/engine/app/app.h b/engine/include/engine/app/app.h index 00646c6..6cf1881 100644 --- a/engine/include/engine/app/app.h +++ b/engine/include/engine/app/app.h @@ -1,6 +1,8 @@ #ifndef APPLICATION_H_ #define APPLICATION_H_ +#include "engine/window/events/window.h" + class IApplication { public: virtual ~IApplication() = default; diff --git a/engine/include/engine/engine.h b/engine/include/engine/engine.h new file mode 100644 index 0000000..99e9e9e --- /dev/null +++ b/engine/include/engine/engine.h @@ -0,0 +1,19 @@ +#ifndef WIN32 +#define GLEW_STATIC +#endif + +#include + +#ifdef WIN32 +#include +#endif + +#include "engine/app/app.h" +#include "engine/renderer/core.h" + +extern IApplication* CreateApplication(); + +int main() { + Engine::Run(std::unique_ptr(CreateApplication())); + return 0; +} \ No newline at end of file diff --git a/sandbox/src/main.cpp b/sandbox/src/main.cpp index c455da5..05d0dd8 100644 --- a/sandbox/src/main.cpp +++ b/sandbox/src/main.cpp @@ -1,23 +1,12 @@ -#ifndef WIN32 -#define GLEW_STATIC -#endif - #include -#include -#ifdef WIN32 -#include -#endif #include -#include -#include +#include -#include "engine/renderer/shader.h" #include "engine/renderer/wavefront.h" -#include "engine/renderer/core.h" #include "engine/renderer/renderer.h" -#include "engine/IO/file_manager.h" +#include "engine/app/app.h" #include "engine/components/transform.h" #include "engine/components/light.h" @@ -26,6 +15,8 @@ #include "engine/components/rotate.h" #include "engine/components/batch.h" +#include "engine/engine.h" + class Game : public IApplication { public: Game() : m_renderer(m_registry) { @@ -232,7 +223,6 @@ private: Uint64 m_currentTicks; }; -int main() { - Engine::Run(std::make_unique()); - return 0; -} \ No newline at end of file +IApplication* CreateApplication() { + return new Game(); +} From faf9b672222b719d89a31257ca5cd1f218d23b2d Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 16 Oct 2025 20:03:18 +0200 Subject: [PATCH 4/9] fix: relative mouse mode resets --- engine/src/window/window.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engine/src/window/window.cpp b/engine/src/window/window.cpp index 3716bbe..ba66723 100644 --- a/engine/src/window/window.cpp +++ b/engine/src/window/window.cpp @@ -31,6 +31,8 @@ Window::Window(const char* title, int width, int height) { } SDL_SetWindowRelativeMouseMode(m_handle, true); + SDL_Rect boundaries = {0, 0, m_width, m_height}; + SDL_SetWindowMouseRect(m_handle, &boundaries); m_context = SDL_GL_CreateContext(m_handle); @@ -121,6 +123,9 @@ void Window::ProcessEvents() { width, height); Dispatch(WindowResized{ m_width, m_height }); + SDL_SetWindowRelativeMouseMode(m_handle, true); + SDL_Rect boundaries = {0, 0, m_width, m_height}; + SDL_SetWindowMouseRect(m_handle, &boundaries); } break; default: break; From 472cc6b14722aabafaf5ab6a6ee24bf0a9263521 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 16 Oct 2025 20:20:12 +0200 Subject: [PATCH 5/9] feat: dynamic library support --- engine/CMakeLists.txt | 4 +++- engine/include/engine/app/app.h | 3 ++- engine/include/engine/components/batch.h | 3 ++- engine/include/engine/components/camera.h | 4 +++- engine/include/engine/components/light.h | 6 ++++-- engine/include/engine/components/mesh.h | 6 ++++-- engine/include/engine/components/rotate.h | 4 +++- engine/include/engine/components/transform.h | 3 ++- engine/include/engine/export.h | 9 +++++++++ engine/include/engine/renderer/core.h | 3 ++- engine/include/engine/renderer/renderer.h | 3 ++- engine/include/engine/renderer/shader.h | 4 +++- engine/include/engine/renderer/wavefront.h | 4 +++- 13 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 engine/include/engine/export.h diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index ccd380e..8c2446c 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(${ENGINE_TARGET} STATIC +add_library(${ENGINE_TARGET} SHARED src/IO/parser.cpp src/IO/file_manager.cpp @@ -24,6 +24,8 @@ set_target_properties(${ENGINE_TARGET} PROPERTIES VISIBILITY_INLINES_HIDDEN YES ) +target_compile_definitions(${ENGINE_TARGET} PRIVATE ENGINE_BUILD_SHARED) + target_include_directories(${ENGINE_TARGET} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/contrib diff --git a/engine/include/engine/app/app.h b/engine/include/engine/app/app.h index 6cf1881..f57b6fa 100644 --- a/engine/include/engine/app/app.h +++ b/engine/include/engine/app/app.h @@ -2,8 +2,9 @@ #define APPLICATION_H_ #include "engine/window/events/window.h" +#include "engine/export.h" -class IApplication { +class ENGINE_API IApplication { public: virtual ~IApplication() = default; diff --git a/engine/include/engine/components/batch.h b/engine/include/engine/components/batch.h index 9bf18eb..efc2f55 100644 --- a/engine/include/engine/components/batch.h +++ b/engine/include/engine/components/batch.h @@ -2,9 +2,10 @@ #define COMPONENT_BATCH_H_ #include "engine/renderer/renderer.h" +#include "engine/export.h" // requires mesh component -struct batch { +struct ENGINE_API batch { friend class Renderer; public: // requires transform component diff --git a/engine/include/engine/components/camera.h b/engine/include/engine/components/camera.h index 5f56021..1dcf7aa 100644 --- a/engine/include/engine/components/camera.h +++ b/engine/include/engine/components/camera.h @@ -1,6 +1,8 @@ #ifndef COMPONENTS_PLAYER_H_ #define COMPONENTS_PLAYER_H_ -struct camera {}; +#include "engine/export.h" + +struct ENGINE_API camera {}; #endif // COMPONENTS_PLAYER_H_ \ No newline at end of file diff --git a/engine/include/engine/components/light.h b/engine/include/engine/components/light.h index 8e5baf1..a22187c 100644 --- a/engine/include/engine/components/light.h +++ b/engine/include/engine/components/light.h @@ -2,9 +2,11 @@ #define COMPONENTS_LIGHT_H_ #include -#include "engine/renderer/renderer.h" -struct light { +#include "engine/renderer/renderer.h" +#include "engine/export.h" + +struct ENGINE_API light { friend class Renderer; public: enum LightType { diff --git a/engine/include/engine/components/mesh.h b/engine/include/engine/components/mesh.h index 0e576d4..ba40534 100644 --- a/engine/include/engine/components/mesh.h +++ b/engine/include/engine/components/mesh.h @@ -2,9 +2,11 @@ #define COMPONENTS_MESH_H_ #include -#include "engine/renderer/wavefront.h" -struct mesh { +#include "engine/renderer/wavefront.h" +#include "engine/export.h" + +struct ENGINE_API mesh { std::shared_ptr object; }; diff --git a/engine/include/engine/components/rotate.h b/engine/include/engine/components/rotate.h index ca5f5f4..6057922 100644 --- a/engine/include/engine/components/rotate.h +++ b/engine/include/engine/components/rotate.h @@ -1,6 +1,8 @@ #ifndef COMPONENT_ROTATE_H_ #define COMPONENT_ROTATE_H_ -struct rotate {}; +#include "engine/export.h" + +struct ENGINE_API rotate {}; #endif // COMPONENT_ROTATE_H_ \ No newline at end of file diff --git a/engine/include/engine/components/transform.h b/engine/include/engine/components/transform.h index 87b6b26..a551e5d 100644 --- a/engine/include/engine/components/transform.h +++ b/engine/include/engine/components/transform.h @@ -2,8 +2,9 @@ #define COMPONENTS_TRANSFORM_H_ #include +#include "engine/export.h" -struct transform { +struct ENGINE_API transform { glm::vec3 position; glm::vec3 rotation; glm::vec3 scale; diff --git a/engine/include/engine/export.h b/engine/include/engine/export.h new file mode 100644 index 0000000..6612ce6 --- /dev/null +++ b/engine/include/engine/export.h @@ -0,0 +1,9 @@ +#pragma once + +#if defined(_WIN32) && defined(ENGINE_BUILD_SHARED) + #define ENGINE_API __declspec(dllexport) +#elif defined(_WIN32) + #define ENGINE_API __declspec(dllimport) +#else + #define ENGINE_API __attribute__((visibility("default"))) +#endif \ No newline at end of file diff --git a/engine/include/engine/renderer/core.h b/engine/include/engine/renderer/core.h index 2653ca0..134f1ce 100644 --- a/engine/include/engine/renderer/core.h +++ b/engine/include/engine/renderer/core.h @@ -8,8 +8,9 @@ #include "engine/window/events/window.h" #include "engine/app/app.h" +#include "engine/export.h" -class Engine { +class ENGINE_API Engine { public: static void Run(std::unique_ptr app); private: diff --git a/engine/include/engine/renderer/renderer.h b/engine/include/engine/renderer/renderer.h index f9c8f46..8e38900 100644 --- a/engine/include/engine/renderer/renderer.h +++ b/engine/include/engine/renderer/renderer.h @@ -5,9 +5,10 @@ #include #include "engine/renderer/shader.h" +#include "engine/export.h" // TODO: make static or singleton -class Renderer { +class ENGINE_API Renderer { public: Renderer(entt::registry& registry); diff --git a/engine/include/engine/renderer/shader.h b/engine/include/engine/renderer/shader.h index e5f0639..251ad9e 100644 --- a/engine/include/engine/renderer/shader.h +++ b/engine/include/engine/renderer/shader.h @@ -5,7 +5,9 @@ #include -class Shader +#include "engine/export.h" + +class ENGINE_API Shader { public: Shader(); diff --git a/engine/include/engine/renderer/wavefront.h b/engine/include/engine/renderer/wavefront.h index 5289cba..70dd22d 100644 --- a/engine/include/engine/renderer/wavefront.h +++ b/engine/include/engine/renderer/wavefront.h @@ -12,10 +12,12 @@ #include "engine/renderer/material.h" #include "engine/renderer/mesh.h" +#include "engine/export.h" + enum ObjElement { OHASH, MTLLIB, USEMTL, O, V, VN, VT, F, OUNKNOWN }; enum MtlElement { MHASH, NEWMTL, NS, KA, KS, KD, NI, D, ILLUM, MAP_KD, MAP_KA, MUNKNOWN }; -class Object { +class ENGINE_API Object { friend class Renderer; private: static inline int NormalizeIndex(int idx, int baseCount); From ab917089b51a78f770803134346b326adaf3b4b3 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Fri, 17 Oct 2025 12:16:56 +0200 Subject: [PATCH 6/9] fix: windows glm --- sandbox/src/main.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sandbox/src/main.cpp b/sandbox/src/main.cpp index 05d0dd8..d9b2027 100644 --- a/sandbox/src/main.cpp +++ b/sandbox/src/main.cpp @@ -3,6 +3,11 @@ #include #include +#ifdef _WIN32 +#define GLM_ENABLE_EXPERIMENTAL +#include +#endif + #include "engine/renderer/wavefront.h" #include "engine/renderer/renderer.h" @@ -157,7 +162,7 @@ public: glm::vec3 sunDir = glm::normalize(glm::vec3(0.0f, sin(sunAngle), cos(sunAngle))); // Compute intensity: bright at noon, dim at dusk/dawn, dark at night - float intensity = glm::max(sin(sunAngle), (double)0.0f); // 0 at night, 1 at noon + float intensity = glm::max(static_cast(sin(sunAngle)), static_cast(0.0f)); // 0 at night, 1 at noon intensity = glm::mix(0.05f, 1.5f, intensity); // keep some ambient even at night // Optional: tint color (warm at sunrise/sunset) From a32222f22fdd86ff83544e4f9c1b377a04f31db1 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Fri, 17 Oct 2025 12:17:44 +0200 Subject: [PATCH 7/9] fix: correct windows define --- engine/src/renderer/renderer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/engine/src/renderer/renderer.cpp b/engine/src/renderer/renderer.cpp index bdc7c58..a1fd91a 100644 --- a/engine/src/renderer/renderer.cpp +++ b/engine/src/renderer/renderer.cpp @@ -1,8 +1,7 @@ #include -#include #include #include -#ifdef WIN32 +#ifdef _WIN32 #include #endif #include From 3f18601ffc97d3e89c71e3f2f38089953d06e2c1 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Fri, 17 Oct 2025 12:34:33 +0200 Subject: [PATCH 8/9] fix: make entrypoint work on windows --- engine/include/engine/engine.h | 6 ++++-- sandbox/src/main.cpp | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/engine/include/engine/engine.h b/engine/include/engine/engine.h index 99e9e9e..b5ca99e 100644 --- a/engine/include/engine/engine.h +++ b/engine/include/engine/engine.h @@ -1,10 +1,12 @@ -#ifndef WIN32 +#pragma once + +#ifndef _WIN32 #define GLEW_STATIC #endif #include -#ifdef WIN32 +#ifdef _WIN32 #include #endif diff --git a/sandbox/src/main.cpp b/sandbox/src/main.cpp index d9b2027..8caf6cc 100644 --- a/sandbox/src/main.cpp +++ b/sandbox/src/main.cpp @@ -35,18 +35,18 @@ public: m_registry.emplace(cameraEntity, glm::vec3(0.f, 2.f, 2.f)); m_registry.emplace(cameraEntity); - Object* targetObj = Object::LoadFile("./assets/wizard/wizard.obj"); + Object* targetObj = Object::LoadFile("./assets/monkey.obj"); const auto targetEntity = m_registry.create(); m_registry.emplace(targetEntity, glm::vec3(0.f, 0.0f, 0.f)); m_registry.emplace(targetEntity, std::shared_ptr(targetObj)); - Object* grass = Object::LoadFile("./assets/grass_block/grass_block.obj"); + Object* grass = Object::LoadFile("./assets/cube.obj"); const auto cubeEntity = m_registry.create(); m_registry.emplace(cubeEntity, glm::vec3(-1.5f, 0.4f, 0.f)); m_registry.emplace(cubeEntity, std::shared_ptr(grass)); // Cube template (use shared object to avoid reloading 1000 times) - std::shared_ptr cubeObj = std::shared_ptr(Object::LoadFile("./assets/grass_block/grass_block.obj")); + std::shared_ptr cubeObj = std::shared_ptr(Object::LoadFile("./assets/cube.obj")); const auto batchEntt = m_registry.create(); m_registry.emplace(batchEntt); m_registry.emplace(batchEntt, cubeObj); From 86825103ee90a37d79faaaac1d636c911fa1a04a Mon Sep 17 00:00:00 2001 From: LandaMm Date: Fri, 17 Oct 2025 13:23:49 +0200 Subject: [PATCH 9/9] fix: correct dll specs + copy dlls --- engine/CMakeLists.txt | 31 +++++++++++++++++++++---------- engine/include/engine/engine.h | 4 ---- engine/include/engine/export.h | 21 ++++++++++++++++----- sandbox/CMakeLists.txt | 9 +++++++++ 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 8c2446c..e880d76 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -1,4 +1,6 @@ -add_library(${ENGINE_TARGET} SHARED +option(ENGINE_BUILD_SHARED "Build the Engine library as a shared library" ON) + +set(SOURCES src/IO/parser.cpp src/IO/file_manager.cpp @@ -17,6 +19,24 @@ add_library(${ENGINE_TARGET} SHARED # src/main.cpp ) +#if (ENGINE_BUILD_SHARED) +# add_library(${ENGINE_TARGET} SHARED ${SOURCES}) +#else() +# add_library(${ENGINE_TARGET} STATIC ${SOURCES}) +#endif() + +if(ENGINE_BUILD_SHARED) + add_library(${ENGINE_TARGET} SHARED ${SOURCES}) + if(WIN32) + target_compile_definitions(${ENGINE_TARGET} PRIVATE ENGINE_BUILD_SHARED ENGINE_EXPORTS) + else() + target_compile_definitions(${ENGINE_TARGET} PRIVATE ENGINE_BUILD_SHARED) + endif() +else() + add_library(${ENGINE_TARGET} STATIC ${SOURCES}) + target_compile_definitions(${ENGINE_TARGET} PRIVATE ENGINE_STATIC) +endif() + set_target_properties(${ENGINE_TARGET} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON @@ -24,8 +44,6 @@ set_target_properties(${ENGINE_TARGET} PROPERTIES VISIBILITY_INLINES_HIDDEN YES ) -target_compile_definitions(${ENGINE_TARGET} PRIVATE ENGINE_BUILD_SHARED) - target_include_directories(${ENGINE_TARGET} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/contrib @@ -82,10 +100,3 @@ else() endif() endif() -# ---------- Windows: copy runtime DLLs ---------- -if (WIN32) - add_custom_command(TARGET ${ENGINE_TARGET} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - $ $ - COMMAND_EXPAND_LISTS) -endif() diff --git a/engine/include/engine/engine.h b/engine/include/engine/engine.h index b5ca99e..c533939 100644 --- a/engine/include/engine/engine.h +++ b/engine/include/engine/engine.h @@ -1,9 +1,5 @@ #pragma once -#ifndef _WIN32 -#define GLEW_STATIC -#endif - #include #ifdef _WIN32 diff --git a/engine/include/engine/export.h b/engine/include/engine/export.h index 6612ce6..6dba46c 100644 --- a/engine/include/engine/export.h +++ b/engine/include/engine/export.h @@ -1,9 +1,20 @@ #pragma once -#if defined(_WIN32) && defined(ENGINE_BUILD_SHARED) - #define ENGINE_API __declspec(dllexport) -#elif defined(_WIN32) - #define ENGINE_API __declspec(dllimport) +// For static libs, ENGINE_API should be empty. +#if defined(_WIN32) + #if defined(ENGINE_BUILD_SHARED) + #if defined(ENGINE_EXPORTS) + #define ENGINE_API __declspec(dllexport) + #else + #define ENGINE_API __declspec(dllimport) + #endif + #else + #define ENGINE_API + #endif #else - #define ENGINE_API __attribute__((visibility("default"))) + #if defined(ENGINE_BUILD_SHARED) + #define ENGINE_API __attribute__((visibility("default"))) + #else + #define ENGINE_API + #endif #endif \ No newline at end of file diff --git a/sandbox/CMakeLists.txt b/sandbox/CMakeLists.txt index afca6d7..a6be27e 100644 --- a/sandbox/CMakeLists.txt +++ b/sandbox/CMakeLists.txt @@ -8,3 +8,12 @@ set_target_properties(${SANDBOX_TARGET} PROPERTIES ) target_link_libraries(${SANDBOX_TARGET} PRIVATE ${ENGINE_TARGET}) + +# --- Copy engine.dll and all dependent DLLs next to sandbox.exe --- +if (WIN32) + add_custom_command(TARGET ${SANDBOX_TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ $ + COMMAND_EXPAND_LISTS + ) +endif()