diff --git a/CMakeLists.txt b/CMakeLists.txt index f1ba947..16dc3be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,9 +4,12 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_DEBUG_POSTFIX "-d") +set(target_prefix facade) + project(facade) option(FACADE_BUILD_SHADERS "Build facade shaders" ON) +option(FACADE_PCH "Use PCH" ON) if(FACADE_BUILD_SHADERS) find_program(glslc glslc) @@ -17,14 +20,8 @@ if(FACADE_BUILD_SHADERS) endif() endif() -set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -try_compile(has_make_unique_for_overwrite "${CMAKE_CURRENT_BINARY_DIR}" SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/cmake/src/make_unique_for_overwrite.cpp") - -add_subdirectory(ext) -add_subdirectory(cmake/interface) add_subdirectory(tools/embed_shader) - -add_subdirectory(facade-lib) +add_subdirectory(lib) if(FACADE_BUILD_SHADERS) message(STATUS "Adding build step to embed shaders") @@ -57,5 +54,16 @@ target_sources(${PROJECT_NAME} PRIVATE src/bin/unlit_frag.spv.hpp ) -target_link_libraries(${PROJECT_NAME} PRIVATE facade::lib facade::compile-options) +target_link_libraries(${PROJECT_NAME} PRIVATE + facade::context + facade::editor + facade::compile-options +) + +string(TOUPPER ${target_prefix} target_prefix_upper) + +if(${${target_prefix_upper}_PCH}) + target_precompile_headers(${PROJECT_NAME} REUSE_FROM ${target_prefix}-vk) +endif() + target_include_directories(${PROJECT_NAME} PRIVATE src) diff --git a/cmake/interface/CMakeLists.txt b/cmake/interface/CMakeLists.txt deleted file mode 100644 index 2b7e5c4..0000000 --- a/cmake/interface/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -project(facade-compile-options) - -add_library(${PROJECT_NAME} INTERFACE) -add_library(facade::compile-options ALIAS ${PROJECT_NAME}) - -if(CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_CXX_COMPILER_ID STREQUAL GNU) - target_compile_options(${PROJECT_NAME} INTERFACE - -Wall -Wextra -Wpedantic -Werror=return-type - ) - - if(CMAKE_CXX_COMPILER_ID STREQUAL GNU AND NOT CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) - target_compile_options(${PROJECT_NAME} INTERFACE -Wconversion) - endif() -endif() - -if(CMAKE_GENERATOR MATCHES "^(Visual Studio)") - target_compile_options(${PROJECT_NAME} INTERFACE /MP) -endif() diff --git a/facade-lib/CMakeLists.txt b/facade-lib/CMakeLists.txt deleted file mode 100644 index 1abcc22..0000000 --- a/facade-lib/CMakeLists.txt +++ /dev/null @@ -1,177 +0,0 @@ -project(facade-lib) - -find_package(Threads) - -add_library(${PROJECT_NAME}) -add_library(facade::lib ALIAS ${PROJECT_NAME}) - -target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) - -target_link_libraries(${PROJECT_NAME} - PUBLIC - glfw::glfw - glm::glm - facade::vk - facade::vma - facade::dear_imgui - djson::djson - fmt::fmt - - PRIVATE - spirv-cross-glsl - facade::compile-options - facade::stb-image - Threads::Threads -) - -if(CMAKE_SYSTEM_NAME STREQUAL Linux) - target_link_libraries(${PROJECT_NAME} PRIVATE pthread) -endif() - -target_precompile_headers(${PROJECT_NAME} PUBLIC - - - - - - - - - - - -) - -target_include_directories(${PROJECT_NAME} - PUBLIC - include - - PRIVATE - src -) - -target_compile_definitions(${PROJECT_NAME} - PUBLIC - GLM_FORCE_XYZW_ONLY - GLM_FORCE_RADIANS - GLM_FORCE_DEPTH_ZERO_TO_ONE - GLM_FORCE_SILENT_WARNINGS - GLM_ENABLE_EXPERIMENTAL - GLM_EXT_INCLUDED - $<$:FACADE_DEBUG> - $<$:FACADE_MUFO> -) - -target_sources(${PROJECT_NAME} PRIVATE - include/facade/defines.hpp - - include/facade/util/async_queue.hpp - include/facade/util/byte_buffer.hpp - include/facade/util/colour_space.hpp - include/facade/util/data_provider.hpp - include/facade/util/defer_queue.hpp - include/facade/util/enum_array.hpp - include/facade/util/error.hpp - include/facade/util/fixed_string.hpp - include/facade/util/flex_array.hpp - include/facade/util/geometry.hpp - include/facade/util/image.hpp - include/facade/util/logger.hpp - include/facade/util/mufo.hpp - include/facade/util/nvec3.hpp - include/facade/util/pinned.hpp - include/facade/util/ring_buffer.hpp - include/facade/util/time.hpp - include/facade/util/type_id.hpp - include/facade/util/unique.hpp - include/facade/util/visitor.hpp - - include/facade/vk/buffer.hpp - include/facade/vk/cmd.hpp - include/facade/vk/defer.hpp - include/facade/vk/descriptor_set.hpp - include/facade/vk/drawer.hpp - include/facade/vk/gfx.hpp - include/facade/vk/pipeline.hpp - include/facade/vk/pipes.hpp - include/facade/vk/render_frame.hpp - include/facade/vk/render_pass.hpp - include/facade/vk/render_target.hpp - include/facade/vk/set_allocator.hpp - include/facade/vk/shader.hpp - include/facade/vk/spir_v.hpp - include/facade/vk/static_mesh.hpp - include/facade/vk/swapchain.hpp - include/facade/vk/texture.hpp - include/facade/vk/vk.hpp - include/facade/vk/vma.hpp - include/facade/vk/wsi.hpp - - include/facade/glfw/glfw.hpp - include/facade/glfw/input.hpp - - include/facade/dear_imgui/dear_imgui.hpp - - include/facade/scene/camera.hpp - include/facade/scene/fly_cam.hpp - include/facade/scene/id.hpp - include/facade/scene/lights.hpp - include/facade/scene/material.hpp - include/facade/scene/node_data.hpp - include/facade/scene/node.hpp - include/facade/scene/rect.hpp - include/facade/scene/renderer.hpp - include/facade/scene/scene.hpp - include/facade/scene/transform.hpp - - include/facade/engine/engine.hpp - - include/facade/editor/common.hpp - include/facade/editor/inspector.hpp - include/facade/editor/log.hpp - include/facade/editor/scene_tree.hpp - - src/util/data_provider.cpp - src/util/geometry.cpp - src/util/image.cpp - src/util/logger.cpp - src/util/time.cpp - - src/vk/buffer.cpp - src/vk/cmd.cpp - src/vk/descriptor_set.cpp - src/vk/drawer.cpp - src/vk/gfx.cpp - src/vk/pipeline.cpp - src/vk/pipes.cpp - src/vk/render_frame.cpp - src/vk/render_pass.cpp - src/vk/set_allocator.cpp - src/vk/shader.cpp - src/vk/spir_v.cpp - src/vk/static_mesh.cpp - src/vk/swapchain.cpp - src/vk/texture.cpp - src/vk/vk.cpp - src/vk/vma.cpp - - src/glfw/glfw.cpp - - src/dear_imgui/dear_imgui.cpp - - src/detail/gltf.cpp - src/detail/gltf.hpp - - src/scene/camera.cpp - src/scene/material.cpp - src/scene/renderer.cpp - src/scene/scene.cpp - src/scene/transform.cpp - - src/engine/engine.cpp - - src/editor/common.cpp - src/editor/inspector.cpp - src/editor/log.cpp - src/editor/scene_tree.cpp -) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt new file mode 100644 index 0000000..bf57eaf --- /dev/null +++ b/lib/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.18 FATAL_ERROR) + +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_DEBUG_POSTFIX "-d") + +project(${target_prefix}-lib) + +add_subdirectory(ext) +add_subdirectory(interface) +add_subdirectory(util) +add_subdirectory(vk) +add_subdirectory(glfw) +add_subdirectory(render) +add_subdirectory(scene) +add_subdirectory(engine) +add_subdirectory(editor) +add_subdirectory(context) diff --git a/lib/context/CMakeLists.txt b/lib/context/CMakeLists.txt new file mode 100644 index 0000000..a3f2e5a --- /dev/null +++ b/lib/context/CMakeLists.txt @@ -0,0 +1,39 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +project(${target_prefix}-context) + +add_library(${PROJECT_NAME}) +add_library(${target_prefix}::context ALIAS ${PROJECT_NAME}) + +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) + +target_include_directories(${PROJECT_NAME} + PUBLIC + include + + PRIVATE + src +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + ${target_prefix}::engine + ${target_prefix}::scene + + PRIVATE + ${target_prefix}::compile-options +) + +string(TOUPPER ${target_prefix} target_prefix_upper) + +if(${${target_prefix_upper}_PCH}) + target_precompile_headers(${PROJECT_NAME} REUSE_FROM ${target_prefix}-vk) +endif() + +target_sources(${PROJECT_NAME} PRIVATE + include/${target_prefix}/context/context.hpp + + src/context.cpp +) diff --git a/lib/context/include/facade/context/context.hpp b/lib/context/include/facade/context/context.hpp new file mode 100644 index 0000000..7294141 --- /dev/null +++ b/lib/context/include/facade/context/context.hpp @@ -0,0 +1,28 @@ +#pragma once +#include +#include +#include + +namespace facade { +class Context { + public: + Context(Engine::CreateInfo const& create_info = {}); + + void add_shader(Shader shader); + + void show(bool reset_dt); + + bool running() const { return engine.running(); } + float next_frame(); + + void request_stop() { engine.request_stop(); } + + Engine engine; + Scene scene; + + private: + DeltaTime m_dt{}; + vk::CommandBuffer m_cb{}; + bool m_ready_to_render{}; +}; +} // namespace facade diff --git a/lib/context/src/context.cpp b/lib/context/src/context.cpp new file mode 100644 index 0000000..ece3c8a --- /dev/null +++ b/lib/context/src/context.cpp @@ -0,0 +1,22 @@ +#include + +namespace facade { +Context::Context(Engine::CreateInfo const& create_info) : engine(create_info), scene(engine.gfx()) {} + +void Context::add_shader(Shader shader) { engine.add_shader(std::move(shader)); } + +void Context::show(bool reset_dt) { + engine.show_window(); + if (reset_dt) { m_dt = {}; } +} + +float Context::next_frame() { + if (m_ready_to_render) { + if (m_cb) { scene.render(engine.renderer(), m_cb); } + engine.submit(); + } + if (!engine.next_frame(m_cb)) { m_cb = vk::CommandBuffer{}; } + m_ready_to_render = true; + return m_dt(); +} +} // namespace facade diff --git a/lib/editor/CMakeLists.txt b/lib/editor/CMakeLists.txt new file mode 100644 index 0000000..c1eef9f --- /dev/null +++ b/lib/editor/CMakeLists.txt @@ -0,0 +1,44 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +project(${target_prefix}-editor) + +add_library(${PROJECT_NAME}) +add_library(${target_prefix}::editor ALIAS ${PROJECT_NAME}) + +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) + +target_include_directories(${PROJECT_NAME} + PUBLIC + include + + PRIVATE + src +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + ${target_prefix}::scene + + PRIVATE + ${target_prefix}::compile-options +) + +string(TOUPPER ${target_prefix} target_prefix_upper) + +if(${${target_prefix_upper}_PCH}) + target_precompile_headers(${PROJECT_NAME} REUSE_FROM ${target_prefix}-vk) +endif() + +target_sources(${PROJECT_NAME} PRIVATE + include/${target_prefix}/editor/common.hpp + include/${target_prefix}/editor/inspector.hpp + include/${target_prefix}/editor/log.hpp + include/${target_prefix}/editor/scene_tree.hpp + + src/common.cpp + src/inspector.cpp + src/log.cpp + src/scene_tree.cpp +) diff --git a/facade-lib/include/facade/editor/common.hpp b/lib/editor/include/facade/editor/common.hpp similarity index 100% rename from facade-lib/include/facade/editor/common.hpp rename to lib/editor/include/facade/editor/common.hpp diff --git a/facade-lib/include/facade/editor/inspector.hpp b/lib/editor/include/facade/editor/inspector.hpp similarity index 100% rename from facade-lib/include/facade/editor/inspector.hpp rename to lib/editor/include/facade/editor/inspector.hpp diff --git a/facade-lib/include/facade/editor/log.hpp b/lib/editor/include/facade/editor/log.hpp similarity index 100% rename from facade-lib/include/facade/editor/log.hpp rename to lib/editor/include/facade/editor/log.hpp diff --git a/facade-lib/include/facade/editor/scene_tree.hpp b/lib/editor/include/facade/editor/scene_tree.hpp similarity index 100% rename from facade-lib/include/facade/editor/scene_tree.hpp rename to lib/editor/include/facade/editor/scene_tree.hpp diff --git a/facade-lib/src/editor/common.cpp b/lib/editor/src/common.cpp similarity index 100% rename from facade-lib/src/editor/common.cpp rename to lib/editor/src/common.cpp diff --git a/facade-lib/src/editor/inspector.cpp b/lib/editor/src/inspector.cpp similarity index 100% rename from facade-lib/src/editor/inspector.cpp rename to lib/editor/src/inspector.cpp diff --git a/facade-lib/src/editor/log.cpp b/lib/editor/src/log.cpp similarity index 100% rename from facade-lib/src/editor/log.cpp rename to lib/editor/src/log.cpp diff --git a/facade-lib/src/editor/scene_tree.cpp b/lib/editor/src/scene_tree.cpp similarity index 100% rename from facade-lib/src/editor/scene_tree.cpp rename to lib/editor/src/scene_tree.cpp diff --git a/lib/engine/CMakeLists.txt b/lib/engine/CMakeLists.txt new file mode 100644 index 0000000..2d96b03 --- /dev/null +++ b/lib/engine/CMakeLists.txt @@ -0,0 +1,38 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +project(${target_prefix}-engine) + +add_library(${PROJECT_NAME}) +add_library(${target_prefix}::engine ALIAS ${PROJECT_NAME}) + +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) + +target_include_directories(${PROJECT_NAME} + PUBLIC + include + + PRIVATE + src +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + ${target_prefix}::render + + PRIVATE + ${target_prefix}::compile-options +) + +string(TOUPPER ${target_prefix} target_prefix_upper) + +if(${${target_prefix_upper}_PCH}) + target_precompile_headers(${PROJECT_NAME} REUSE_FROM ${target_prefix}-vk) +endif() + +target_sources(${PROJECT_NAME} PRIVATE + include/${target_prefix}/engine/engine.hpp + + src/engine.cpp +) diff --git a/facade-lib/include/facade/engine/engine.hpp b/lib/engine/include/facade/engine/engine.hpp similarity index 81% rename from facade-lib/include/facade/engine/engine.hpp rename to lib/engine/include/facade/engine/engine.hpp index 202f34f..b0e08b7 100644 --- a/facade-lib/include/facade/engine/engine.hpp +++ b/lib/engine/include/facade/engine/engine.hpp @@ -1,6 +1,5 @@ #pragma once #include -#include #include namespace facade { @@ -27,18 +26,20 @@ class Engine { explicit Engine(CreateInfo const& info = {}); bool add_shader(Shader shader); - void show(bool reset_dt); - void hide(); + void show_window(); + void hide_window(); bool running() const; - float next_frame(); - void render(Scene& scene) const; + bool next_frame(vk::CommandBuffer& out); + void submit(); void request_stop(); + void reload(CreateInfo const& info); + Glfw::Window window() const; Gfx const& gfx() const; Input const& input() const; - Renderer const& renderer() const; + Renderer& renderer() const; private: struct Impl; diff --git a/facade-lib/src/engine/engine.cpp b/lib/engine/src/engine.cpp similarity index 75% rename from facade-lib/src/engine/engine.cpp rename to lib/engine/src/engine.cpp index 18913d0..9311e99 100644 --- a/facade-lib/src/engine/engine.cpp +++ b/lib/engine/src/engine.cpp @@ -1,6 +1,5 @@ #include -#include -#include +#include #include namespace facade { @@ -35,9 +34,6 @@ struct Engine::Impl { Renderer renderer; - DeltaTime dt{}; - std::optional cb{}; - Impl(CreateInfo const& info) : window(make_window(info.extent, info.title)), vulkan(GlfwWsi{window}), gfx{vulkan.gfx()}, renderer(gfx, window, make_renderer_info(vulkan.gpu(), info.msaa_samples)) {} @@ -48,39 +44,29 @@ Engine& Engine::operator=(Engine&&) noexcept = default; Engine::~Engine() noexcept = default; Engine::Engine(CreateInfo const& info) : m_impl(std::make_unique(info)) { - if (info.auto_show) { show(true); } + if (info.auto_show) { show_window(); } } bool Engine::add_shader(Shader shader) { return m_impl->renderer.add_shader(shader); } -void Engine::show(bool reset_dt) { - glfwShowWindow(m_impl->window.get()); - if (reset_dt) { m_impl->dt = {}; } -} +void Engine::show_window() { glfwShowWindow(m_impl->window.get()); } -void Engine::hide() { glfwHideWindow(m_impl->window.get()); } +void Engine::hide_window() { glfwHideWindow(m_impl->window.get()); } bool Engine::running() const { return !glfwWindowShouldClose(m_impl->window.get()); } -float Engine::next_frame() { - assert(!m_impl->cb); +bool Engine::next_frame(vk::CommandBuffer& out) { m_impl->window.get().glfw->poll_events(); - auto cb = vk::CommandBuffer{}; - if (!m_impl->renderer.next_frame({&cb, 1})) { return m_impl->dt(); } - m_impl->cb = cb; - return m_impl->dt(); + if (!m_impl->renderer.next_frame({&out, 1})) { return false; } + return true; } -void Engine::request_stop() { glfwSetWindowShouldClose(m_impl->window.get(), GLFW_TRUE); } +void Engine::submit() { m_impl->renderer.render(); } -void Engine::render(Scene& scene) const { - if (m_impl->cb) { scene.render(m_impl->renderer, *m_impl->cb); } - m_impl->renderer.render(); - m_impl->cb.reset(); -} +void Engine::request_stop() { glfwSetWindowShouldClose(m_impl->window.get(), GLFW_TRUE); } Gfx const& Engine::gfx() const { return m_impl->gfx; } Glfw::Window Engine::window() const { return m_impl->window; } Input const& Engine::input() const { return m_impl->window.get().state().input; } -Renderer const& Engine::renderer() const { return m_impl->renderer; } +Renderer& Engine::renderer() const { return m_impl->renderer; } } // namespace facade diff --git a/ext/.gitignore b/lib/ext/.gitignore similarity index 100% rename from ext/.gitignore rename to lib/ext/.gitignore diff --git a/ext/CMakeLists.txt b/lib/ext/CMakeLists.txt similarity index 79% rename from ext/CMakeLists.txt rename to lib/ext/CMakeLists.txt index a7745a3..1021fec 100644 --- a/ext/CMakeLists.txt +++ b/lib/ext/CMakeLists.txt @@ -1,10 +1,14 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + file(ARCHIVE_EXTRACT INPUT "${CMAKE_CURRENT_SOURCE_DIR}/src.zip" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}") add_subdirectory(src/vk_dynamic) -add_library(${PROJECT_NAME}::vk ALIAS vk-dynamic) +add_library(${target_prefix}::vk-dynamic ALIAS vk-dynamic) add_subdirectory(src/vma) -add_library(${PROJECT_NAME}::vma ALIAS vma) +add_library(${target_prefix}::vma ALIAS vma) set(GLFW_VULKAN_STATIC OFF) set(GLFW_INSTALL OFF) @@ -38,10 +42,10 @@ set(SPIRV_CROSS_SKIP_INSTALL ON) add_subdirectory(src/spirv_cross) add_subdirectory(src/dear_imgui) -add_library(${PROJECT_NAME}::dear_imgui ALIAS dear_imgui) +add_library(${target_prefix}::dear_imgui ALIAS dear_imgui) add_subdirectory(src/stb) -add_library(${PROJECT_NAME}::stb-image ALIAS stb-image) +add_library(${target_prefix}::stb-image ALIAS stb-image) add_subdirectory(src/djson) diff --git a/ext/src.zip b/lib/ext/src.zip similarity index 100% rename from ext/src.zip rename to lib/ext/src.zip diff --git a/lib/glfw/CMakeLists.txt b/lib/glfw/CMakeLists.txt new file mode 100644 index 0000000..18c6d6e --- /dev/null +++ b/lib/glfw/CMakeLists.txt @@ -0,0 +1,42 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +project(${target_prefix}-glfw) + +find_package(Threads) + +add_library(${PROJECT_NAME}) +add_library(${target_prefix}::glfw ALIAS ${PROJECT_NAME}) + +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) + +target_include_directories(${PROJECT_NAME} + PUBLIC + include + + PRIVATE + src +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + ${target_prefix}::vk + glfw::glfw + + PRIVATE + ${target_prefix}::compile-options +) + +string(TOUPPER ${target_prefix} target_prefix_upper) + +if(${${target_prefix_upper}_PCH}) + target_precompile_headers(${PROJECT_NAME} REUSE_FROM ${target_prefix}-vk) +endif() + +target_sources(${PROJECT_NAME} PRIVATE + include/${target_prefix}/glfw/glfw.hpp + include/${target_prefix}/glfw/input.hpp + + src/glfw.cpp +) diff --git a/facade-lib/include/facade/glfw/glfw.hpp b/lib/glfw/include/facade/glfw/glfw.hpp similarity index 100% rename from facade-lib/include/facade/glfw/glfw.hpp rename to lib/glfw/include/facade/glfw/glfw.hpp diff --git a/facade-lib/include/facade/glfw/input.hpp b/lib/glfw/include/facade/glfw/input.hpp similarity index 100% rename from facade-lib/include/facade/glfw/input.hpp rename to lib/glfw/include/facade/glfw/input.hpp diff --git a/facade-lib/src/glfw/glfw.cpp b/lib/glfw/src/glfw.cpp similarity index 100% rename from facade-lib/src/glfw/glfw.cpp rename to lib/glfw/src/glfw.cpp diff --git a/lib/interface/CMakeLists.txt b/lib/interface/CMakeLists.txt new file mode 100644 index 0000000..6c92c03 --- /dev/null +++ b/lib/interface/CMakeLists.txt @@ -0,0 +1,42 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +string(TOUPPER ${target_prefix} define_prefix) + +project(${target_prefix}-interface) + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) +try_compile(has_make_unique_for_overwrite "${CMAKE_CURRENT_BINARY_DIR}" SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/make_unique_for_overwrite.cpp") + +add_library(${target_prefix}-interface INTERFACE) +add_library(${target_prefix}::interface ALIAS ${target_prefix}-interface) + +target_compile_definitions(${target_prefix}-interface + INTERFACE + $<$:${define_prefix}_DEBUG> + $<$:${define_prefix}_MUFO> +) + +target_include_directories(${target_prefix}-interface INTERFACE include) + +target_sources(${target_prefix}-interface PRIVATE + include/${target_prefix}/defines.hpp +) + +add_library(${target_prefix}-compile-options INTERFACE) +add_library(${target_prefix}::compile-options ALIAS ${target_prefix}-compile-options) + +if(CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_CXX_COMPILER_ID STREQUAL GNU) + target_compile_options(${target_prefix}-compile-options INTERFACE + -Wall -Wextra -Wpedantic -Werror=return-type + ) + + if(CMAKE_CXX_COMPILER_ID STREQUAL GNU AND NOT CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) + target_compile_options(${target_prefix}-compile-options INTERFACE -Wconversion) + endif() +endif() + +if(CMAKE_GENERATOR MATCHES "^(Visual Studio)") + target_compile_options(${target_prefix}-compile-options INTERFACE /MP) +endif() diff --git a/facade-lib/include/facade/defines.hpp b/lib/interface/include/facade/defines.hpp similarity index 100% rename from facade-lib/include/facade/defines.hpp rename to lib/interface/include/facade/defines.hpp diff --git a/cmake/src/make_unique_for_overwrite.cpp b/lib/interface/src/make_unique_for_overwrite.cpp similarity index 100% rename from cmake/src/make_unique_for_overwrite.cpp rename to lib/interface/src/make_unique_for_overwrite.cpp diff --git a/lib/render/CMakeLists.txt b/lib/render/CMakeLists.txt new file mode 100644 index 0000000..ea3c432 --- /dev/null +++ b/lib/render/CMakeLists.txt @@ -0,0 +1,41 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +project(${target_prefix}-render) + +add_library(${PROJECT_NAME}) +add_library(${target_prefix}::render ALIAS ${PROJECT_NAME}) + +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) + +target_include_directories(${PROJECT_NAME} + PUBLIC + include + + PRIVATE + src +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + ${target_prefix}::glfw + ${target_prefix}::dear_imgui + + PRIVATE + ${target_prefix}::compile-options +) + +string(TOUPPER ${target_prefix} target_prefix_upper) + +if(${${target_prefix_upper}_PCH}) + target_precompile_headers(${PROJECT_NAME} REUSE_FROM ${target_prefix}-vk) +endif() + +target_sources(${PROJECT_NAME} PRIVATE + include/${target_prefix}/render/renderer.hpp + + src/detail/dear_imgui.cpp + src/detail/dear_imgui.hpp + src/renderer.cpp +) diff --git a/facade-lib/include/facade/scene/renderer.hpp b/lib/render/include/facade/render/renderer.hpp similarity index 100% rename from facade-lib/include/facade/scene/renderer.hpp rename to lib/render/include/facade/render/renderer.hpp diff --git a/facade-lib/src/dear_imgui/dear_imgui.cpp b/lib/render/src/detail/dear_imgui.cpp similarity index 86% rename from facade-lib/src/dear_imgui/dear_imgui.cpp rename to lib/render/src/detail/dear_imgui.cpp index f66f585..6dbc1b6 100644 --- a/facade-lib/src/dear_imgui/dear_imgui.cpp +++ b/lib/render/src/detail/dear_imgui.cpp @@ -1,9 +1,10 @@ #include #include #include -#include -#include +#include #include +#include +#include namespace facade { namespace { @@ -22,17 +23,19 @@ vk::UniqueDescriptorPool make_pool(vk::Device const device) { return device.createDescriptorPoolUnique(pool_info); } +glm::vec4 to_linear(glm::vec4 const& srgb) { return glm::convertSRGBToLinear(srgb); } + void correct_style() { auto* colours = ImGui::GetStyle().Colors; for (int i = 0; i < ImGuiCol_COUNT; ++i) { auto& colour = colours[i]; - auto const corrected = Material::to_linear(glm::vec4{colour.x, colour.y, colour.z, colour.w}); + auto const corrected = to_linear(glm::vec4{colour.x, colour.y, colour.z, colour.w}); colour = {corrected.x, corrected.y, corrected.z, corrected.w}; } } } // namespace -DearImgui::DearImgui(CreateInfo const& info) { +DearImGui::DearImGui(CreateInfo const& info) { m_pool = make_pool(info.gfx.device); IMGUI_CHECKVERSION(); @@ -73,7 +76,7 @@ DearImgui::DearImgui(CreateInfo const& info) { ImGui_ImplVulkan_DestroyFontUploadObjects(); } -DearImgui::~DearImgui() { +DearImGui::~DearImGui() { if (!m_pool) { return; } m_pool.getOwner().waitIdle(); ImGui_ImplVulkan_Shutdown(); @@ -81,16 +84,16 @@ DearImgui::~DearImgui() { ImGui::DestroyContext(); } -void DearImgui::new_frame() { +void DearImGui::new_frame() { ImGui_ImplVulkan_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); } -void DearImgui::end_frame() { +void DearImGui::end_frame() { // ImGui::Render calls ImGui::EndFrame ImGui::Render(); } -void DearImgui::render(vk::CommandBuffer const cb) { ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), cb); } +void DearImGui::render(vk::CommandBuffer const cb) { ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), cb); } } // namespace facade diff --git a/facade-lib/include/facade/dear_imgui/dear_imgui.hpp b/lib/render/src/detail/dear_imgui.hpp similarity index 81% rename from facade-lib/include/facade/dear_imgui/dear_imgui.hpp rename to lib/render/src/detail/dear_imgui.hpp index a4ba9c0..9182c3a 100644 --- a/facade-lib/include/facade/dear_imgui/dear_imgui.hpp +++ b/lib/render/src/detail/dear_imgui.hpp @@ -5,7 +5,7 @@ #include namespace facade { -class DearImgui { +class DearImGui { public: struct CreateInfo { Gfx gfx{}; @@ -15,14 +15,14 @@ class DearImgui { ColourSpace swapchain{ColourSpace::eSrgb}; }; - DearImgui(CreateInfo const& info); - ~DearImgui(); + DearImGui(CreateInfo const& info); + ~DearImGui(); void new_frame(); void end_frame(); void render(vk::CommandBuffer cb); - DearImgui& operator=(DearImgui&&) = delete; + DearImGui& operator=(DearImGui&&) = delete; private: vk::UniqueDescriptorPool m_pool{}; diff --git a/facade-lib/src/scene/renderer.cpp b/lib/render/src/renderer.cpp similarity index 98% rename from facade-lib/src/scene/renderer.cpp rename to lib/render/src/renderer.cpp index 0e1a399..6d08ad6 100644 --- a/facade-lib/src/scene/renderer.cpp +++ b/lib/render/src/renderer.cpp @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include #include #include @@ -44,7 +44,7 @@ struct Renderer::Impl { Pipes pipes; RenderPass render_pass; RenderFrames<> render_frames; - DearImgui dear_imgui; + DearImGui dear_imgui; Shader::Db shader_db{}; std::optional render_target{}; @@ -73,7 +73,7 @@ struct Renderer::Impl { Impl(Gfx gfx, Glfw::Window window, Renderer::CreateInfo const& info) : gfx{gfx}, window{window}, swapchain{gfx, GlfwWsi{window}.make_surface(gfx.instance)}, pipes(gfx, info.samples), render_pass(gfx, info.samples, this->swapchain.info.imageFormat, depth_format(gfx.gpu)), render_frames(make_render_frames(gfx, info.command_buffers)), - dear_imgui(DearImgui::CreateInfo{ + dear_imgui(DearImGui::CreateInfo{ gfx, window, render_pass.render_pass(), diff --git a/lib/scene/CMakeLists.txt b/lib/scene/CMakeLists.txt new file mode 100644 index 0000000..d804b0e --- /dev/null +++ b/lib/scene/CMakeLists.txt @@ -0,0 +1,54 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +project(${target_prefix}-scene) + +add_library(${PROJECT_NAME}) +add_library(${target_prefix}::scene ALIAS ${PROJECT_NAME}) + +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) + +target_include_directories(${PROJECT_NAME} + PUBLIC + include + + PRIVATE + src +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + ${target_prefix}::render + djson::djson + + PRIVATE + ${target_prefix}::compile-options +) + +string(TOUPPER ${target_prefix} target_prefix_upper) + +if(${${target_prefix_upper}_PCH}) + target_precompile_headers(${PROJECT_NAME} REUSE_FROM ${target_prefix}-vk) +endif() + +target_sources(${PROJECT_NAME} PRIVATE + include/${target_prefix}/scene/camera.hpp + include/${target_prefix}/scene/fly_cam.hpp + include/${target_prefix}/scene/id.hpp + include/${target_prefix}/scene/lights.hpp + include/${target_prefix}/scene/material.hpp + include/${target_prefix}/scene/node_data.hpp + include/${target_prefix}/scene/node.hpp + include/${target_prefix}/scene/rect.hpp + include/${target_prefix}/scene/scene.hpp + include/${target_prefix}/scene/transform.hpp + + src/detail/gltf.cpp + src/detail/gltf.hpp + + src/camera.cpp + src/material.cpp + src/scene.cpp + src/transform.cpp +) diff --git a/facade-lib/include/facade/scene/camera.hpp b/lib/scene/include/facade/scene/camera.hpp similarity index 100% rename from facade-lib/include/facade/scene/camera.hpp rename to lib/scene/include/facade/scene/camera.hpp diff --git a/facade-lib/include/facade/scene/fly_cam.hpp b/lib/scene/include/facade/scene/fly_cam.hpp similarity index 100% rename from facade-lib/include/facade/scene/fly_cam.hpp rename to lib/scene/include/facade/scene/fly_cam.hpp diff --git a/facade-lib/include/facade/scene/id.hpp b/lib/scene/include/facade/scene/id.hpp similarity index 100% rename from facade-lib/include/facade/scene/id.hpp rename to lib/scene/include/facade/scene/id.hpp diff --git a/facade-lib/include/facade/scene/lights.hpp b/lib/scene/include/facade/scene/lights.hpp similarity index 100% rename from facade-lib/include/facade/scene/lights.hpp rename to lib/scene/include/facade/scene/lights.hpp diff --git a/facade-lib/include/facade/scene/material.hpp b/lib/scene/include/facade/scene/material.hpp similarity index 100% rename from facade-lib/include/facade/scene/material.hpp rename to lib/scene/include/facade/scene/material.hpp diff --git a/facade-lib/include/facade/scene/node.hpp b/lib/scene/include/facade/scene/node.hpp similarity index 100% rename from facade-lib/include/facade/scene/node.hpp rename to lib/scene/include/facade/scene/node.hpp diff --git a/facade-lib/include/facade/scene/node_data.hpp b/lib/scene/include/facade/scene/node_data.hpp similarity index 100% rename from facade-lib/include/facade/scene/node_data.hpp rename to lib/scene/include/facade/scene/node_data.hpp diff --git a/facade-lib/include/facade/scene/rect.hpp b/lib/scene/include/facade/scene/rect.hpp similarity index 100% rename from facade-lib/include/facade/scene/rect.hpp rename to lib/scene/include/facade/scene/rect.hpp diff --git a/facade-lib/include/facade/scene/scene.hpp b/lib/scene/include/facade/scene/scene.hpp similarity index 100% rename from facade-lib/include/facade/scene/scene.hpp rename to lib/scene/include/facade/scene/scene.hpp diff --git a/facade-lib/include/facade/scene/transform.hpp b/lib/scene/include/facade/scene/transform.hpp similarity index 100% rename from facade-lib/include/facade/scene/transform.hpp rename to lib/scene/include/facade/scene/transform.hpp diff --git a/facade-lib/src/scene/camera.cpp b/lib/scene/src/camera.cpp similarity index 100% rename from facade-lib/src/scene/camera.cpp rename to lib/scene/src/camera.cpp diff --git a/facade-lib/src/detail/gltf.cpp b/lib/scene/src/detail/gltf.cpp similarity index 99% rename from facade-lib/src/detail/gltf.cpp rename to lib/scene/src/detail/gltf.cpp index 0cde933..df6810c 100644 --- a/facade-lib/src/detail/gltf.cpp +++ b/lib/scene/src/detail/gltf.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/facade-lib/src/detail/gltf.hpp b/lib/scene/src/detail/gltf.hpp similarity index 98% rename from facade-lib/src/detail/gltf.hpp rename to lib/scene/src/detail/gltf.hpp index 096ba35..4a1077e 100644 --- a/facade-lib/src/detail/gltf.hpp +++ b/lib/scene/src/detail/gltf.hpp @@ -3,8 +3,8 @@ #include #include #include -#include #include +#include #include #include #include diff --git a/facade-lib/src/scene/material.cpp b/lib/scene/src/material.cpp similarity index 100% rename from facade-lib/src/scene/material.cpp rename to lib/scene/src/material.cpp diff --git a/facade-lib/src/scene/scene.cpp b/lib/scene/src/scene.cpp similarity index 99% rename from facade-lib/src/scene/scene.cpp rename to lib/scene/src/scene.cpp index 53ca4b3..d96e24e 100644 --- a/facade-lib/src/scene/scene.cpp +++ b/lib/scene/src/scene.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include diff --git a/facade-lib/src/scene/transform.cpp b/lib/scene/src/transform.cpp similarity index 100% rename from facade-lib/src/scene/transform.cpp rename to lib/scene/src/transform.cpp diff --git a/lib/util/CMakeLists.txt b/lib/util/CMakeLists.txt new file mode 100644 index 0000000..d2a16ce --- /dev/null +++ b/lib/util/CMakeLists.txt @@ -0,0 +1,90 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +project(${target_prefix}-util) + +find_package(Threads) + +add_library(${PROJECT_NAME}) +add_library(${target_prefix}::util ALIAS ${PROJECT_NAME}) + +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) + +target_include_directories(${PROJECT_NAME} + PUBLIC + include + + PRIVATE + src +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + fmt::fmt + glm::glm + ${target_prefix}::interface + + PRIVATE + ${target_prefix}::stb-image + ${target_prefix}::compile-options + + Threads::Threads +) + +string(TOUPPER ${target_prefix} target_prefix_upper) + +if(${${target_prefix_upper}_PCH}) + target_precompile_headers(${PROJECT_NAME} PRIVATE + + + + + + + + + + ) +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL Linux) + target_link_libraries(${PROJECT_NAME} PRIVATE pthread) +endif() + +target_compile_definitions(${PROJECT_NAME} + PUBLIC + GLM_FORCE_XYZW_ONLY + GLM_FORCE_RADIANS + GLM_FORCE_DEPTH_ZERO_TO_ONE + GLM_FORCE_SILENT_WARNINGS + GLM_ENABLE_EXPERIMENTAL + GLM_EXT_INCLUDED +) + +target_sources(${PROJECT_NAME} PRIVATE + include/${target_prefix}/util/async_queue.hpp + include/${target_prefix}/util/byte_buffer.hpp + include/${target_prefix}/util/colour_space.hpp + include/${target_prefix}/util/data_provider.hpp + include/${target_prefix}/util/defer_queue.hpp + include/${target_prefix}/util/enum_array.hpp + include/${target_prefix}/util/error.hpp + include/${target_prefix}/util/fixed_string.hpp + include/${target_prefix}/util/flex_array.hpp + include/${target_prefix}/util/image.hpp + include/${target_prefix}/util/logger.hpp + include/${target_prefix}/util/mufo.hpp + include/${target_prefix}/util/nvec3.hpp + include/${target_prefix}/util/pinned.hpp + include/${target_prefix}/util/ring_buffer.hpp + include/${target_prefix}/util/time.hpp + include/${target_prefix}/util/type_id.hpp + include/${target_prefix}/util/unique.hpp + include/${target_prefix}/util/visitor.hpp + + src/data_provider.cpp + src/image.cpp + src/logger.cpp + src/time.cpp +) diff --git a/facade-lib/include/facade/util/async_queue.hpp b/lib/util/include/facade/util/async_queue.hpp similarity index 100% rename from facade-lib/include/facade/util/async_queue.hpp rename to lib/util/include/facade/util/async_queue.hpp diff --git a/facade-lib/include/facade/util/byte_buffer.hpp b/lib/util/include/facade/util/byte_buffer.hpp similarity index 100% rename from facade-lib/include/facade/util/byte_buffer.hpp rename to lib/util/include/facade/util/byte_buffer.hpp diff --git a/facade-lib/include/facade/util/colour_space.hpp b/lib/util/include/facade/util/colour_space.hpp similarity index 100% rename from facade-lib/include/facade/util/colour_space.hpp rename to lib/util/include/facade/util/colour_space.hpp diff --git a/facade-lib/include/facade/util/data_provider.hpp b/lib/util/include/facade/util/data_provider.hpp similarity index 100% rename from facade-lib/include/facade/util/data_provider.hpp rename to lib/util/include/facade/util/data_provider.hpp diff --git a/facade-lib/include/facade/util/defer_queue.hpp b/lib/util/include/facade/util/defer_queue.hpp similarity index 100% rename from facade-lib/include/facade/util/defer_queue.hpp rename to lib/util/include/facade/util/defer_queue.hpp diff --git a/facade-lib/include/facade/util/enum_array.hpp b/lib/util/include/facade/util/enum_array.hpp similarity index 100% rename from facade-lib/include/facade/util/enum_array.hpp rename to lib/util/include/facade/util/enum_array.hpp diff --git a/facade-lib/include/facade/util/error.hpp b/lib/util/include/facade/util/error.hpp similarity index 100% rename from facade-lib/include/facade/util/error.hpp rename to lib/util/include/facade/util/error.hpp diff --git a/facade-lib/include/facade/util/fixed_string.hpp b/lib/util/include/facade/util/fixed_string.hpp similarity index 100% rename from facade-lib/include/facade/util/fixed_string.hpp rename to lib/util/include/facade/util/fixed_string.hpp diff --git a/facade-lib/include/facade/util/flex_array.hpp b/lib/util/include/facade/util/flex_array.hpp similarity index 100% rename from facade-lib/include/facade/util/flex_array.hpp rename to lib/util/include/facade/util/flex_array.hpp diff --git a/facade-lib/include/facade/util/image.hpp b/lib/util/include/facade/util/image.hpp similarity index 100% rename from facade-lib/include/facade/util/image.hpp rename to lib/util/include/facade/util/image.hpp diff --git a/facade-lib/include/facade/util/logger.hpp b/lib/util/include/facade/util/logger.hpp similarity index 100% rename from facade-lib/include/facade/util/logger.hpp rename to lib/util/include/facade/util/logger.hpp diff --git a/facade-lib/include/facade/util/mufo.hpp b/lib/util/include/facade/util/mufo.hpp similarity index 100% rename from facade-lib/include/facade/util/mufo.hpp rename to lib/util/include/facade/util/mufo.hpp diff --git a/facade-lib/include/facade/util/nvec3.hpp b/lib/util/include/facade/util/nvec3.hpp similarity index 100% rename from facade-lib/include/facade/util/nvec3.hpp rename to lib/util/include/facade/util/nvec3.hpp diff --git a/facade-lib/include/facade/util/pinned.hpp b/lib/util/include/facade/util/pinned.hpp similarity index 100% rename from facade-lib/include/facade/util/pinned.hpp rename to lib/util/include/facade/util/pinned.hpp diff --git a/facade-lib/include/facade/util/ring_buffer.hpp b/lib/util/include/facade/util/ring_buffer.hpp similarity index 100% rename from facade-lib/include/facade/util/ring_buffer.hpp rename to lib/util/include/facade/util/ring_buffer.hpp diff --git a/facade-lib/include/facade/util/time.hpp b/lib/util/include/facade/util/time.hpp similarity index 100% rename from facade-lib/include/facade/util/time.hpp rename to lib/util/include/facade/util/time.hpp diff --git a/facade-lib/include/facade/util/type_id.hpp b/lib/util/include/facade/util/type_id.hpp similarity index 100% rename from facade-lib/include/facade/util/type_id.hpp rename to lib/util/include/facade/util/type_id.hpp diff --git a/facade-lib/include/facade/util/unique.hpp b/lib/util/include/facade/util/unique.hpp similarity index 100% rename from facade-lib/include/facade/util/unique.hpp rename to lib/util/include/facade/util/unique.hpp diff --git a/facade-lib/include/facade/util/visitor.hpp b/lib/util/include/facade/util/visitor.hpp similarity index 100% rename from facade-lib/include/facade/util/visitor.hpp rename to lib/util/include/facade/util/visitor.hpp diff --git a/facade-lib/src/util/data_provider.cpp b/lib/util/src/data_provider.cpp similarity index 100% rename from facade-lib/src/util/data_provider.cpp rename to lib/util/src/data_provider.cpp diff --git a/facade-lib/src/util/image.cpp b/lib/util/src/image.cpp similarity index 100% rename from facade-lib/src/util/image.cpp rename to lib/util/src/image.cpp diff --git a/facade-lib/src/util/logger.cpp b/lib/util/src/logger.cpp similarity index 100% rename from facade-lib/src/util/logger.cpp rename to lib/util/src/logger.cpp diff --git a/facade-lib/src/util/time.cpp b/lib/util/src/time.cpp similarity index 100% rename from facade-lib/src/util/time.cpp rename to lib/util/src/time.cpp diff --git a/lib/vk/CMakeLists.txt b/lib/vk/CMakeLists.txt new file mode 100644 index 0000000..b31cbd6 --- /dev/null +++ b/lib/vk/CMakeLists.txt @@ -0,0 +1,89 @@ +if("${target_prefix}" STREQUAL "") + message(FATAL_ERROR "target_prefix unset") +endif() + +project(${target_prefix}-vk) + +add_library(${PROJECT_NAME}) +add_library(${target_prefix}::vk ALIAS ${PROJECT_NAME}) + +target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20) + +target_include_directories(${PROJECT_NAME} + PUBLIC + include + + PRIVATE + src +) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + ${target_prefix}::vma + ${target_prefix}::util + + PRIVATE + spirv-cross-glsl + ${target_prefix}::compile-options +) + +string(TOUPPER ${target_prefix} target_prefix_upper) + +if(${${target_prefix_upper}_PCH}) + target_precompile_headers(${PROJECT_NAME} PRIVATE + + + + + + + + + + + + ) +endif() + +target_sources(${PROJECT_NAME} PRIVATE + include/${target_prefix}/vk/buffer.hpp + include/${target_prefix}/vk/cmd.hpp + include/${target_prefix}/vk/defer.hpp + include/${target_prefix}/vk/descriptor_set.hpp + include/${target_prefix}/vk/drawer.hpp + include/${target_prefix}/vk/geometry.hpp + include/${target_prefix}/vk/gfx.hpp + include/${target_prefix}/vk/pipeline.hpp + include/${target_prefix}/vk/pipes.hpp + include/${target_prefix}/vk/render_frame.hpp + include/${target_prefix}/vk/render_pass.hpp + include/${target_prefix}/vk/render_target.hpp + include/${target_prefix}/vk/set_allocator.hpp + include/${target_prefix}/vk/shader.hpp + include/${target_prefix}/vk/spir_v.hpp + include/${target_prefix}/vk/static_mesh.hpp + include/${target_prefix}/vk/swapchain.hpp + include/${target_prefix}/vk/texture.hpp + include/${target_prefix}/vk/vk.hpp + include/${target_prefix}/vk/vma.hpp + include/${target_prefix}/vk/wsi.hpp + + src/buffer.cpp + src/cmd.cpp + src/descriptor_set.cpp + src/drawer.cpp + src/geometry.cpp + src/gfx.cpp + src/pipeline.cpp + src/pipes.cpp + src/render_frame.cpp + src/render_pass.cpp + src/set_allocator.cpp + src/shader.cpp + src/spir_v.cpp + src/static_mesh.cpp + src/swapchain.cpp + src/texture.cpp + src/vk.cpp + src/vma.cpp +) diff --git a/facade-lib/include/facade/vk/buffer.hpp b/lib/vk/include/facade/vk/buffer.hpp similarity index 100% rename from facade-lib/include/facade/vk/buffer.hpp rename to lib/vk/include/facade/vk/buffer.hpp diff --git a/facade-lib/include/facade/vk/cmd.hpp b/lib/vk/include/facade/vk/cmd.hpp similarity index 100% rename from facade-lib/include/facade/vk/cmd.hpp rename to lib/vk/include/facade/vk/cmd.hpp diff --git a/facade-lib/include/facade/vk/defer.hpp b/lib/vk/include/facade/vk/defer.hpp similarity index 100% rename from facade-lib/include/facade/vk/defer.hpp rename to lib/vk/include/facade/vk/defer.hpp diff --git a/facade-lib/include/facade/vk/descriptor_set.hpp b/lib/vk/include/facade/vk/descriptor_set.hpp similarity index 100% rename from facade-lib/include/facade/vk/descriptor_set.hpp rename to lib/vk/include/facade/vk/descriptor_set.hpp diff --git a/facade-lib/include/facade/vk/drawer.hpp b/lib/vk/include/facade/vk/drawer.hpp similarity index 100% rename from facade-lib/include/facade/vk/drawer.hpp rename to lib/vk/include/facade/vk/drawer.hpp diff --git a/facade-lib/include/facade/util/geometry.hpp b/lib/vk/include/facade/vk/geometry.hpp similarity index 100% rename from facade-lib/include/facade/util/geometry.hpp rename to lib/vk/include/facade/vk/geometry.hpp diff --git a/facade-lib/include/facade/vk/gfx.hpp b/lib/vk/include/facade/vk/gfx.hpp similarity index 100% rename from facade-lib/include/facade/vk/gfx.hpp rename to lib/vk/include/facade/vk/gfx.hpp diff --git a/facade-lib/include/facade/vk/pipeline.hpp b/lib/vk/include/facade/vk/pipeline.hpp similarity index 100% rename from facade-lib/include/facade/vk/pipeline.hpp rename to lib/vk/include/facade/vk/pipeline.hpp diff --git a/facade-lib/include/facade/vk/pipes.hpp b/lib/vk/include/facade/vk/pipes.hpp similarity index 100% rename from facade-lib/include/facade/vk/pipes.hpp rename to lib/vk/include/facade/vk/pipes.hpp diff --git a/facade-lib/include/facade/vk/render_frame.hpp b/lib/vk/include/facade/vk/render_frame.hpp similarity index 100% rename from facade-lib/include/facade/vk/render_frame.hpp rename to lib/vk/include/facade/vk/render_frame.hpp diff --git a/facade-lib/include/facade/vk/render_pass.hpp b/lib/vk/include/facade/vk/render_pass.hpp similarity index 100% rename from facade-lib/include/facade/vk/render_pass.hpp rename to lib/vk/include/facade/vk/render_pass.hpp diff --git a/facade-lib/include/facade/vk/render_target.hpp b/lib/vk/include/facade/vk/render_target.hpp similarity index 100% rename from facade-lib/include/facade/vk/render_target.hpp rename to lib/vk/include/facade/vk/render_target.hpp diff --git a/facade-lib/include/facade/vk/set_allocator.hpp b/lib/vk/include/facade/vk/set_allocator.hpp similarity index 100% rename from facade-lib/include/facade/vk/set_allocator.hpp rename to lib/vk/include/facade/vk/set_allocator.hpp diff --git a/facade-lib/include/facade/vk/shader.hpp b/lib/vk/include/facade/vk/shader.hpp similarity index 100% rename from facade-lib/include/facade/vk/shader.hpp rename to lib/vk/include/facade/vk/shader.hpp diff --git a/facade-lib/include/facade/vk/spir_v.hpp b/lib/vk/include/facade/vk/spir_v.hpp similarity index 97% rename from facade-lib/include/facade/vk/spir_v.hpp rename to lib/vk/include/facade/vk/spir_v.hpp index ff46465..1f46c14 100644 --- a/facade-lib/include/facade/vk/spir_v.hpp +++ b/lib/vk/include/facade/vk/spir_v.hpp @@ -1,6 +1,7 @@ #pragma once #include #include +#include namespace facade { struct SpirV { diff --git a/facade-lib/include/facade/vk/static_mesh.hpp b/lib/vk/include/facade/vk/static_mesh.hpp similarity index 100% rename from facade-lib/include/facade/vk/static_mesh.hpp rename to lib/vk/include/facade/vk/static_mesh.hpp diff --git a/facade-lib/include/facade/vk/swapchain.hpp b/lib/vk/include/facade/vk/swapchain.hpp similarity index 100% rename from facade-lib/include/facade/vk/swapchain.hpp rename to lib/vk/include/facade/vk/swapchain.hpp diff --git a/facade-lib/include/facade/vk/texture.hpp b/lib/vk/include/facade/vk/texture.hpp similarity index 100% rename from facade-lib/include/facade/vk/texture.hpp rename to lib/vk/include/facade/vk/texture.hpp diff --git a/facade-lib/include/facade/vk/vk.hpp b/lib/vk/include/facade/vk/vk.hpp similarity index 100% rename from facade-lib/include/facade/vk/vk.hpp rename to lib/vk/include/facade/vk/vk.hpp diff --git a/facade-lib/include/facade/vk/vma.hpp b/lib/vk/include/facade/vk/vma.hpp similarity index 100% rename from facade-lib/include/facade/vk/vma.hpp rename to lib/vk/include/facade/vk/vma.hpp diff --git a/facade-lib/include/facade/vk/wsi.hpp b/lib/vk/include/facade/vk/wsi.hpp similarity index 100% rename from facade-lib/include/facade/vk/wsi.hpp rename to lib/vk/include/facade/vk/wsi.hpp diff --git a/facade-lib/src/vk/buffer.cpp b/lib/vk/src/buffer.cpp similarity index 100% rename from facade-lib/src/vk/buffer.cpp rename to lib/vk/src/buffer.cpp diff --git a/facade-lib/src/vk/cmd.cpp b/lib/vk/src/cmd.cpp similarity index 100% rename from facade-lib/src/vk/cmd.cpp rename to lib/vk/src/cmd.cpp diff --git a/facade-lib/src/vk/descriptor_set.cpp b/lib/vk/src/descriptor_set.cpp similarity index 100% rename from facade-lib/src/vk/descriptor_set.cpp rename to lib/vk/src/descriptor_set.cpp diff --git a/facade-lib/src/vk/drawer.cpp b/lib/vk/src/drawer.cpp similarity index 100% rename from facade-lib/src/vk/drawer.cpp rename to lib/vk/src/drawer.cpp diff --git a/facade-lib/src/util/geometry.cpp b/lib/vk/src/geometry.cpp similarity index 99% rename from facade-lib/src/util/geometry.cpp rename to lib/vk/src/geometry.cpp index 6d839c4..e8d70c9 100644 --- a/facade-lib/src/util/geometry.cpp +++ b/lib/vk/src/geometry.cpp @@ -1,6 +1,6 @@ #include -#include #include +#include #include auto facade::make_cube(glm::vec3 size, glm::vec3 rgb, glm::vec3 const o) -> Geometry { diff --git a/facade-lib/src/vk/gfx.cpp b/lib/vk/src/gfx.cpp similarity index 100% rename from facade-lib/src/vk/gfx.cpp rename to lib/vk/src/gfx.cpp diff --git a/facade-lib/src/vk/pipeline.cpp b/lib/vk/src/pipeline.cpp similarity index 100% rename from facade-lib/src/vk/pipeline.cpp rename to lib/vk/src/pipeline.cpp diff --git a/facade-lib/src/vk/pipes.cpp b/lib/vk/src/pipes.cpp similarity index 99% rename from facade-lib/src/vk/pipes.cpp rename to lib/vk/src/pipes.cpp index 9614669..c9e5428 100644 --- a/facade-lib/src/vk/pipes.cpp +++ b/lib/vk/src/pipes.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/facade-lib/src/vk/render_frame.cpp b/lib/vk/src/render_frame.cpp similarity index 100% rename from facade-lib/src/vk/render_frame.cpp rename to lib/vk/src/render_frame.cpp diff --git a/facade-lib/src/vk/render_pass.cpp b/lib/vk/src/render_pass.cpp similarity index 100% rename from facade-lib/src/vk/render_pass.cpp rename to lib/vk/src/render_pass.cpp diff --git a/facade-lib/src/vk/set_allocator.cpp b/lib/vk/src/set_allocator.cpp similarity index 100% rename from facade-lib/src/vk/set_allocator.cpp rename to lib/vk/src/set_allocator.cpp diff --git a/facade-lib/src/vk/shader.cpp b/lib/vk/src/shader.cpp similarity index 100% rename from facade-lib/src/vk/shader.cpp rename to lib/vk/src/shader.cpp diff --git a/facade-lib/src/vk/spir_v.cpp b/lib/vk/src/spir_v.cpp similarity index 100% rename from facade-lib/src/vk/spir_v.cpp rename to lib/vk/src/spir_v.cpp diff --git a/facade-lib/src/vk/static_mesh.cpp b/lib/vk/src/static_mesh.cpp similarity index 97% rename from facade-lib/src/vk/static_mesh.cpp rename to lib/vk/src/static_mesh.cpp index 5b6659c..d5c3a1d 100644 --- a/facade-lib/src/vk/static_mesh.cpp +++ b/lib/vk/src/static_mesh.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include diff --git a/facade-lib/src/vk/swapchain.cpp b/lib/vk/src/swapchain.cpp similarity index 100% rename from facade-lib/src/vk/swapchain.cpp rename to lib/vk/src/swapchain.cpp diff --git a/facade-lib/src/vk/texture.cpp b/lib/vk/src/texture.cpp similarity index 100% rename from facade-lib/src/vk/texture.cpp rename to lib/vk/src/texture.cpp diff --git a/facade-lib/src/vk/vk.cpp b/lib/vk/src/vk.cpp similarity index 100% rename from facade-lib/src/vk/vk.cpp rename to lib/vk/src/vk.cpp diff --git a/facade-lib/src/vk/vma.cpp b/lib/vk/src/vma.cpp similarity index 100% rename from facade-lib/src/vk/vma.cpp rename to lib/vk/src/vma.cpp diff --git a/misc/launch.json b/misc/launch.json deleted file mode 100644 index 475eb94..0000000 --- a/misc/launch.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - // Modify this file and copy to .vscode/ (in the project root) to enable F5 debugging, - // setting custom working directories, using a custom Vulkan loader, etc - "version": "0.2.0", - "configurations": [ - { - "name": "(gdb) Launch", - "type": "cppdbg", - "request": "launch", - "program": "${command:cmake.launchTargetPath}", - "args": [], - "stopAtEntry": false, - "cwd": "${workspaceFolder}", - "environment": [ - { - "name": "LD_LIBRARY_PATH", - "value": "/path/to/vulkan-sdk/lib" - }, - { - "name": "VK_LAYER_PATH", - "value": "/path/to/vulkan-sdk/etc/vulkan/explicit_layer.d" - } - ], - "externalConsole": false, - "MIMode": "gdb", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - }, - { - "description": "Set Disassembly Flavor to Intel", - "text": "-gdb-set disassembly-flavor intel", - "ignoreFailures": true - } - ] - } - ] -} diff --git a/src/main.cpp b/src/main.cpp index 368a561..246be44 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,27 +4,26 @@ #include #include #include -#include #include - -#include +#include #include +#include #include -#include -#include - -#include #include #include #include +#include + #include #include +#include + using namespace facade; namespace { @@ -238,65 +237,68 @@ struct MainMenu { }; void run() { - auto engine = Engine{}; - - auto lit = shaders::lit(); - lit.id = "default"; - engine.add_shader(lit); - engine.add_shader(shaders::unlit()); + auto context = std::optional{}; struct DummyDataProvider : DataProvider { ByteBuffer load(std::string_view) const override { return {}; } }; - auto scene = Scene{engine.gfx()}; - scene.dir_lights.push_back(DirLight{.direction = glm::normalize(glm::vec3{-1.0f, -1.0f, -1.0f}), .diffuse = glm::vec3{5.0f}}); - auto material_id = Id{}; auto node_id = Id{}; auto post_scene_load = [&] { - scene.camera().transform.set_position({0.0f, 0.0f, 5.0f}); + context->scene.camera().transform.set_position({0.0f, 0.0f, 5.0f}); auto material = std::make_unique(); material->albedo = {1.0f, 0.0f, 0.0f}; - material_id = scene.add(std::move(material)); - auto static_mesh_id = scene.add(StaticMesh{engine.gfx(), make_cubed_sphere(1.0f, 32)}); - auto mesh_id = scene.add(Mesh{.primitives = {Mesh::Primitive{static_mesh_id, material_id}}}); + material_id = context->scene.add(std::move(material)); + auto static_mesh_id = context->scene.add(StaticMesh{context->engine.gfx(), make_cubed_sphere(1.0f, 32)}); + auto mesh_id = context->scene.add(Mesh{.primitives = {Mesh::Primitive{static_mesh_id, material_id}}}); auto node = Node{}; node.attach(mesh_id); node.instances.emplace_back().set_position({1.0f, -5.0f, -20.0f}); node.instances.emplace_back().set_position({-1.0f, 1.0f, 0.0f}); - node_id = scene.add(std::move(node), 0); + node_id = context->scene.add(std::move(node), 0); + context->show(true); }; - scene.load_gltf(dj::Json::parse(test_json_v), DummyDataProvider{}); - post_scene_load(); + auto init = [&] { + context.emplace(); + auto lit = shaders::lit(); + lit.id = "default"; + context->add_shader(lit); + context->add_shader(shaders::unlit()); + + context->scene.dir_lights.push_back(DirLight{.direction = glm::normalize(glm::vec3{-1.0f, -1.0f, -1.0f}), .diffuse = glm::vec3{5.0f}}); + context->scene.load_gltf(dj::Json::parse(test_json_v), DummyDataProvider{}); + post_scene_load(); + }; + + init(); float const drot_z[] = {100.0f, -150.0f}; auto main_menu = MainMenu{}; - engine.show(true); - while (engine.running()) { - auto const dt = engine.next_frame(); - auto const& state = engine.window().state(); + while (context->running()) { + auto const dt = context->next_frame(); + auto const& state = context->engine.window().state(); auto const& input = state.input; bool const mouse_look = input.mouse.held(GLFW_MOUSE_BUTTON_RIGHT); - if (input.keyboard.pressed(GLFW_KEY_ESCAPE)) { engine.request_stop(); } - glfwSetInputMode(engine.window(), GLFW_CURSOR, mouse_look ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL); + if (input.keyboard.pressed(GLFW_KEY_ESCAPE)) { context->request_stop(); } + glfwSetInputMode(context->engine.window(), GLFW_CURSOR, mouse_look ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL); if (!state.file_drops.empty()) { auto const& file = state.file_drops.front(); - if (!load_gltf(scene, file)) { + if (!load_gltf(context->scene, file)) { logger::warn("Failed to load GLTF: [{}]", file); } else { post_scene_load(); } } - auto& camera = scene.camera(); + auto& camera = context->scene.camera(); if (auto fly_cam = FlyCam{camera.transform}) { if (input.keyboard.held(GLFW_KEY_A) || input.keyboard.held(GLFW_KEY_LEFT)) { fly_cam.move_right(-dt); } if (input.keyboard.held(GLFW_KEY_D) || input.keyboard.held(GLFW_KEY_RIGHT)) { fly_cam.move_right(dt); } @@ -307,17 +309,22 @@ void run() { if (mouse_look) { fly_cam.rotate({input.mouse.delta_pos().x, -input.mouse.delta_pos().y}); } } + if (input.keyboard.pressed(GLFW_KEY_R)) { + logger::info("Reloading..."); + context.reset(); + init(); + continue; + } + // TEMP CODE - auto* node = scene.find_node(node_id); + auto* node = context->scene.find_node(node_id); node->instances[0].rotate(glm::radians(drot_z[0]) * dt, {0.0f, 1.0f, 0.0f}); node->instances[1].rotate(glm::radians(drot_z[1]) * dt, {1.0f, 0.0f, 0.0f}); ImGui::ShowDemoWindow(); - main_menu.display(engine, scene, dt); + main_menu.display(context->engine, context->scene, dt); // TEMP CODE - - engine.render(scene); } } } // namespace