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..e880d76 --- /dev/null +++ b/engine/CMakeLists.txt @@ -0,0 +1,102 @@ +option(ENGINE_BUILD_SHARED "Build the Engine library as a shared library" ON) + +set(SOURCES + 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/core.cpp + src/renderer/renderer.cpp + + # 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 + 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() + 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 77% rename from include/app/app.h rename to engine/include/engine/app/app.h index 00646c6..f57b6fa 100644 --- a/include/app/app.h +++ b/engine/include/engine/app/app.h @@ -1,7 +1,10 @@ #ifndef APPLICATION_H_ #define APPLICATION_H_ -class IApplication { +#include "engine/window/events/window.h" +#include "engine/export.h" + +class ENGINE_API IApplication { public: virtual ~IApplication() = default; diff --git a/include/components/batch.h b/engine/include/engine/components/batch.h similarity index 84% rename from include/components/batch.h rename to engine/include/engine/components/batch.h index 55f11a6..efc2f55 100644 --- a/include/components/batch.h +++ b/engine/include/engine/components/batch.h @@ -1,10 +1,11 @@ #ifndef COMPONENT_BATCH_H_ #define COMPONENT_BATCH_H_ -#include "renderer/renderer.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/include/components/camera.h b/engine/include/engine/components/camera.h similarity index 61% rename from include/components/camera.h rename to engine/include/engine/components/camera.h index 5f56021..1dcf7aa 100644 --- a/include/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/include/components/light.h b/engine/include/engine/components/light.h similarity index 84% rename from include/components/light.h rename to engine/include/engine/components/light.h index 493dc77..a22187c 100644 --- a/include/components/light.h +++ b/engine/include/engine/components/light.h @@ -2,9 +2,11 @@ #define COMPONENTS_LIGHT_H_ #include -#include "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/include/components/mesh.h b/engine/include/engine/components/mesh.h similarity index 60% rename from include/components/mesh.h rename to engine/include/engine/components/mesh.h index 08c64e5..ba40534 100644 --- a/include/components/mesh.h +++ b/engine/include/engine/components/mesh.h @@ -2,9 +2,11 @@ #define COMPONENTS_MESH_H_ #include -#include "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/include/components/rotate.h b/engine/include/engine/components/rotate.h similarity index 60% rename from include/components/rotate.h rename to engine/include/engine/components/rotate.h index ca5f5f4..6057922 100644 --- a/include/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/include/components/transform.h b/engine/include/engine/components/transform.h similarity index 77% rename from include/components/transform.h rename to engine/include/engine/components/transform.h index 87b6b26..a551e5d 100644 --- a/include/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/engine.h b/engine/include/engine/engine.h new file mode 100644 index 0000000..c533939 --- /dev/null +++ b/engine/include/engine/engine.h @@ -0,0 +1,17 @@ +#pragma once + +#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/engine/include/engine/export.h b/engine/include/engine/export.h new file mode 100644 index 0000000..6dba46c --- /dev/null +++ b/engine/include/engine/export.h @@ -0,0 +1,20 @@ +#pragma once + +// 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 + #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/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/engine.h b/engine/include/engine/renderer/core.h similarity index 65% rename from include/renderer/engine.h rename to engine/include/engine/renderer/core.h index 466b855..134f1ce 100644 --- a/include/renderer/engine.h +++ b/engine/include/engine/renderer/core.h @@ -4,12 +4,13 @@ #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" +#include "engine/export.h" -class Engine { +class ENGINE_API Engine { public: static void Run(std::unique_ptr app); private: 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/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 87% rename from include/renderer/renderer.h rename to engine/include/engine/renderer/renderer.h index 79946ce..8e38900 100644 --- a/include/renderer/renderer.h +++ b/engine/include/engine/renderer/renderer.h @@ -4,10 +4,11 @@ #include #include -#include "renderer/shader.h" +#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/include/renderer/shader.h b/engine/include/engine/renderer/shader.h similarity index 96% rename from include/renderer/shader.h rename to engine/include/engine/renderer/shader.h index e5f0639..251ad9e 100644 --- a/include/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/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 86% rename from include/renderer/wavefront.h rename to engine/include/engine/renderer/wavefront.h index 2ee0081..70dd22d 100644 --- a/include/renderer/wavefront.h +++ b/engine/include/engine/renderer/wavefront.h @@ -7,15 +7,17 @@ #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" + +#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); 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/renderer/engine.cpp b/engine/src/renderer/core.cpp similarity index 88% rename from src/renderer/engine.cpp rename to engine/src/renderer/core.cpp index ab25987..e8564f2 100644 --- a/src/renderer/engine.cpp +++ b/engine/src/renderer/core.cpp @@ -1,9 +1,9 @@ #include -#include "renderer/engine.h" -#include "window/event.h" +#include "engine/renderer/core.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/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/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 93% rename from src/renderer/renderer.cpp rename to engine/src/renderer/renderer.cpp index 7c8e9bd..a1fd91a 100644 --- a/src/renderer/renderer.cpp +++ b/engine/src/renderer/renderer.cpp @@ -1,23 +1,22 @@ #include -#include #include #include -#ifdef WIN32 +#ifdef _WIN32 #include #endif #include #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) { @@ -29,13 +28,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/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 91% rename from src/window/window.cpp rename to engine/src/window/window.cpp index 54cf89c..ba66723 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; @@ -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; diff --git a/sandbox/CMakeLists.txt b/sandbox/CMakeLists.txt new file mode 100644 index 0000000..a6be27e --- /dev/null +++ b/sandbox/CMakeLists.txt @@ -0,0 +1,19 @@ +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}) + +# --- 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() diff --git a/src/main.cpp b/sandbox/src/main.cpp similarity index 90% rename from src/main.cpp rename to sandbox/src/main.cpp index 69298a3..8caf6cc 100644 --- a/src/main.cpp +++ b/sandbox/src/main.cpp @@ -1,30 +1,26 @@ -#ifndef WIN32 -#define GLEW_STATIC -#endif - #include -#include -#ifdef WIN32 -#include -#endif #include -#include -#include +#include -#include "renderer/shader.h" -#include "renderer/wavefront.h" -#include "renderer/engine.h" -#include "renderer/renderer.h" +#ifdef _WIN32 +#define GLM_ENABLE_EXPERIMENTAL +#include +#endif -#include "IO/file_manager.h" +#include "engine/renderer/wavefront.h" +#include "engine/renderer/renderer.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/app/app.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" + +#include "engine/engine.h" class Game : public IApplication { public: @@ -39,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); @@ -166,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) @@ -232,7 +228,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(); +}