diff --git a/.gitignore b/.gitignore index c0bf3f4..434b503 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ +vcpkg_installed/ # Visual Studio 2015/2017 cache/options directory .vs/ diff --git a/.gitmodules b/.gitmodules index 349db04..102d888 100644 --- a/.gitmodules +++ b/.gitmodules @@ -39,4 +39,7 @@ url = https://github.com/d-bahr/CRCpp.git [submodule "external/odeint"] path = external/odeint - url = https://github.com/headmyshoulder/odeint-v2.git \ No newline at end of file + url = https://github.com/headmyshoulder/odeint-v2.git +[submodule "external/vcpkg"] + path = external/vcpkg + url = https://github.com/Microsoft/vcpkg.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 62cd737..bc1f0bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,4 @@ cmake_minimum_required(VERSION 3.7...3.23) - if(${CMAKE_VERSION} VERSION_LESS 3.12) cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) endif() @@ -15,24 +14,12 @@ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) set(ENGINE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/src/Engine) set(EXTERNAL_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/external) -set(ASSIMP_ROOT ${EXTERNAL_ROOT}/assimp) -set(BOOST_ROOT ${EXTERNAL_ROOT}/boost) -set(SLANG_ROOT ${EXTERNAL_ROOT}/slang) -set(GLM_ROOT ${EXTERNAL_ROOT}/glm) -set(GLFW_ROOT ${EXTERNAL_ROOT}/glfw) -set(CRCPP_ROOT ${EXTERNAL_ROOT}/CRCpp) -set(JSON_ROOT ${EXTERNAL_ROOT}/json) -set(KTX_ROOT ${EXTERNAL_ROOT}/ktx) -set(STB_ROOT ${EXTERNAL_ROOT}/stb) -set(TTFPARSER_ROOT ${EXTERNAL_ROOT}/ttf-parser) -set(FREETYPE_ROOT ${EXTERNAL_ROOT}/freetype) -set(SPIRV_ROOT ${EXTERNAL_ROOT}/SPIRV-Cross) -set(ENTT_ROOT ${EXTERNAL_ROOT}/entt) -set(ODEINT_ROOT ${EXTERNAL_ROOT}/odeint) -set(THREADPOOL_ROOT ${EXTERNAL_ROOT}/thread-pool) -set(ZLIB_ROOT ${EXTERNAL_ROOT}/zlib) -set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/) +set(CMAKE_TOOLCHAIN_FILE ${EXTERNAL_ROOT}/vcpkg/scripts/buildsystems/vcpkg.cmake) + +set(CRCPP_ROOT ${EXTERNAL_ROOT}/CRCpp) +set(TTFPARSER_ROOT ${EXTERNAL_ROOT}/ttf-parser) + set(Boost_NO_WARN_NEW_VERSIONS 1) project (Seele) @@ -50,6 +37,15 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_CURRENT_SOURCE_DIR}/bin) find_package(Vulkan REQUIRED) +find_package(assimp CONFIG REQUIRED) +find_package(Stb REQUIRED) +find_package(thread-pool CONFIG REQUIRED) +find_package(EnTT CONFIG REQUIRED) +find_package(FreeType CONFIG REQUIRED) +find_package(glfw3 CONFIG REQUIRED) +find_package(glm CONFIG REQUIRED) +find_package(Ktx CONFIG REQUIRED) +find_package(nlohmann_json CONFIG REQUIRED) if(UNIX) find_package(Threads REQUIRED) @@ -66,17 +62,14 @@ target_include_directories(Engine PRIVATE src/Engine) target_link_libraries(Engine PUBLIC Vulkan::Vulkan) target_link_libraries(Engine PUBLIC EnTT::EnTT) target_link_libraries(Engine PUBLIC glfw) -target_link_libraries(Engine PUBLIC glm) +target_link_libraries(Engine PUBLIC glm::glm) target_link_libraries(Engine PUBLIC freetype) -target_link_libraries(Engine PUBLIC slang) -target_link_libraries(Engine PUBLIC assimp) -target_link_libraries(Engine PUBLIC ktx) -target_link_libraries(Engine PUBLIC stb) +target_link_libraries(Engine PUBLIC assimp::assimp) +target_link_libraries(Engine PUBLIC KTX::ktx) target_link_libraries(Engine PUBLIC nlohmann_json::nlohmann_json) target_link_libraries(Engine PUBLIC dp::thread-pool) target_link_libraries(Engine PUBLIC crcpp) -target_link_libraries(Engine PUBLIC odeint) -target_link_libraries(Engine PUBLIC zlib) +target_link_libraries(Engine PUBLIC shader-slang) if(UNIX) target_link_libraries(Engine PUBLIC Threads::Threads) target_link_libraries(Engine PUBLIC dl) @@ -85,6 +78,7 @@ endif() add_executable(Editor "") target_link_libraries(Editor PRIVATE Engine) target_include_directories(Editor PRIVATE src/Editor) +target_include_directories(Editor PRIVATE ${Stb_INCLUDE_DIR}) target_compile_definitions(Editor PRIVATE EDITOR=1) add_executable(AssetViewer "") @@ -109,8 +103,8 @@ target_precompile_headers(Engine if(MSVC) set(_CRT_SECURE_NO_WARNINGS) - target_compile_options(Engine PUBLIC /std:c++20 /Zi /MP14 /W4 /DEBUG "/WX-") - target_compile_options(Editor PUBLIC /std:c++20 /Zi /MP14 /W4 /DEBUG "/WX-") + target_compile_options(Engine PUBLIC /std:c++20 /Zi /MP14 /W4 /DEBUG /wd4505) + target_compile_options(Editor PUBLIC /std:c++20 /Zi /MP14 /W4 /DEBUG) target_sources(Engine INTERFACE $ $ @@ -131,7 +125,7 @@ if(WIN32) add_custom_target(dll_copy ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ COMMAND_EXPAND_LISTS - DEPENDS Editor slang-build) + DEPENDS Editor) else() add_custom_target(dll_copy ALL COMMAND ${CMAKE_COMMAND} -E true) @@ -140,26 +134,14 @@ endif() add_custom_target(SeeleEngine ALL COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/res $ COMMAND_EXPAND_LISTS - DEPENDS Editor slang-build dll_copy) + DEPENDS Editor dll_copy) install( TARGETS AssetViewer Editor Engine - EnTT - glfw - glm - freetype - assimp - ktx - stb crcpp - nlohmann_json - ThreadPool - zlib - IrrXML - odeint EXPORT EngineTargets FILE_SET HEADERS diff --git a/CMakeSettings.json b/CMakeSettings.json index 84f0da2..de49079 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -34,8 +34,7 @@ "buildCommandArgs": "", "ctestCommandArgs": "", "inheritEnvironments": [ "msvc_x64" ], - "intelliSenseMode": "windows-msvc-x64", - "variables": [] + "intelliSenseMode": "windows-msvc-x64" } ] } \ No newline at end of file diff --git a/cmake/SuperBuild.cmake b/cmake/SuperBuild.cmake index 077ad6b..828e431 100644 --- a/cmake/SuperBuild.cmake +++ b/cmake/SuperBuild.cmake @@ -1,154 +1,177 @@ include (ExternalProject) #--------------ZLIB------------------------------ -add_subdirectory(${ZLIB_ROOT} ${ZLIB_ROOT}) +#add_subdirectory(${ZLIB_ROOT} ${ZLIB_ROOT}) #--------------FreeType------------------------------ -add_subdirectory(${FREETYPE_ROOT}) +#add_subdirectory(${FREETYPE_ROOT}) #------------ASSIMP--------------- -set(ASSIMP_BUILD_TESTS OFF CACHE INTERNAL "") -set(ASSIMP_BUILD_SAMPLES OFF CACHE INTERNAL "") -set(ASSIMP_BUILD_OVERALLS OFF CACHE INTERNAL "") -set(ASSIMP_BUILD_ASSIMP_TOOLS OFF CACHE INTERNAL "") -add_subdirectory(${ASSIMP_ROOT}) -target_compile_definitions(assimp PRIVATE _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING) -if(WIN32) - target_compile_options(assimp PRIVATE /WX- /MP14) -else() - target_compile_options(assimp PRIVATE -Wno-error -fPIC) - target_compile_options(IrrXML PRIVATE -fPIC) -endif() +#set(ASSIMP_BUILD_TESTS OFF CACHE INTERNAL "") +#set(ASSIMP_BUILD_SAMPLES OFF CACHE INTERNAL "") +#set(ASSIMP_BUILD_OVERALLS OFF CACHE INTERNAL "") +#set(ASSIMP_BUILD_ASSIMP_TOOLS OFF CACHE INTERNAL "") +#add_subdirectory(${ASSIMP_ROOT}) +#target_compile_definitions(assimp PRIVATE _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING) +#if(WIN32) +# target_compile_options(assimp PRIVATE /WX- /MP14) +#else() +# target_compile_options(assimp PRIVATE -Wno-error -fPIC) +# target_compile_options(IrrXML PRIVATE -fPIC) +#endif() #-----------------KTX---------------------------- -set(KTX_FEATURE_TESTS off) -set(KTX_FEATURE_TOOLS off) - -add_subdirectory(${KTX_ROOT}) - -if(MSVC) - target_compile_options(ktx PRIVATE /WX-) -else() - target_compile_options(ktx PRIVATE -Wno-error) -endif() +#set(KTX_FEATURE_TESTS off) +#set(KTX_FEATURE_TOOLS off) +# +#add_subdirectory(${KTX_ROOT}) +# +#if(MSVC) +# target_compile_options(ktx PRIVATE /WX-) +#else() +# target_compile_options(ktx PRIVATE -Wno-error) +#endif() #--------------------JSON------------------ -set(JSON_MultipleHeaders ON CACHE INTERNAL "") -set(JSON_BuildTests OFF CACHE INTERNAL "") -set(JSON_Install ON CACHE INTERNAL "") - -add_subdirectory(${JSON_ROOT}) +#set(JSON_MultipleHeaders ON CACHE INTERNAL "") +#set(JSON_BuildTests OFF CACHE INTERNAL "") +#set(JSON_Install ON CACHE INTERNAL "") +# +#add_subdirectory(${JSON_ROOT}) #--------------GLFW------------------------------ -set(ENKITS_BUILD_EXAMPLES OFF CACHE BOOL "Build basic example applications" ) -set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "GLFW lib only" ) -set(GLFW_BUILD_TESTS OFF CACHE BOOL "GLFW lib only" ) -set(GLFW_BUILD_DOCS OFF CACHE BOOL "GLFW lib only" ) -set(GLFW_BUILD_INSTALL OFF CACHE BOOL "GLFW lib only" ) -set(GLFW_VULKAN_STATIC OFF CACHE BOOL "GLFW vulkan static") - -add_subdirectory(${GLFW_ROOT}) +#set(ENKITS_BUILD_EXAMPLES OFF CACHE BOOL "Build basic example applications" ) +#set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "GLFW lib only" ) +#set(GLFW_BUILD_TESTS OFF CACHE BOOL "GLFW lib only" ) +#set(GLFW_BUILD_DOCS OFF CACHE BOOL "GLFW lib only" ) +#set(GLFW_BUILD_INSTALL OFF CACHE BOOL "GLFW lib only" ) +#set(GLFW_VULKAN_STATIC OFF CACHE BOOL "GLFW vulkan static") +# +#add_subdirectory(${GLFW_ROOT}) #--------------EnTT------------------------------ -add_subdirectory(${ENTT_ROOT}) +#add_subdirectory(${ENTT_ROOT}) #--------------thread-pool------------------------------ -set(TP_BUILD_TESTS OFF) -set(TP_BUILD_EXAMPLES OFF) -set(TP_BUILD_BENCHMARKS OFF) +#set(TP_BUILD_TESTS OFF) +#set(TP_BUILD_EXAMPLES OFF) +#set(TP_BUILD_BENCHMARKS OFF) +# +#add_subdirectory(${THREADPOOL_ROOT}) -add_subdirectory(${THREADPOOL_ROOT}) - -if(MSVC) - target_compile_options(ThreadPool INTERFACE /W0) -endif() +#if(MSVC) +# target_compile_options(ThreadPool INTERFACE /W0) +#endif() #--------------SLang------------------------------ -string(TOLOWER release_x64 SLANG_CONFIG) +add_library(shader-slang-glslang SHARED IMPORTED) +add_library(shader-slang SHARED IMPORTED) if(WIN32) -string(TOLOWER ${SLANG_ROOT}/bin/windows-x64/release SLANG_BINARY_DIR) -ExternalProject_Add(slang-build - SOURCE_DIR ${SLANG_ROOT} - BINARY_DIR ${SLANG_ROOT} - CONFIGURE_COMMAND ${SLANG_ROOT}/premake.bat vs2019 --file=${SLANG_ROOT}/premake5.lua --arch=x64 --deps=true - BUILD_COMMAND msbuild -p:PlatformToolset=v143 -p:Configuration=Release -p:Platform=x64 slang.sln - INSTALL_COMMAND "" -) -elseif(UNIX) -set(SLANG_BINARY_DIR ${SLANG_ROOT}/bin/linux-x64/release) -ExternalProject_Add(slang-build - SOURCE_DIR ${SLANG_ROOT} - BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} - CONFIGURE_COMMAND ${CMAKE_SOURCE_DIR}/premake5 --file=${CMAKE_SOURCE_DIR}/external/slang/premake5.lua gmake2 --arch=x64 --deps=true --build-location=build/linux - BUILD_COMMAND make -C ${CMAKE_SOURCE_DIR}/external/slang/build/linux config=${SLANG_CONFIG} - INSTALL_COMMAND "" -) -endif() - -add_library(slang-llvm SHARED IMPORTED) -if(WIN32) - target_link_libraries(slang-llvm INTERFACE - $ - $ - ) - set_target_properties(slang-llvm PROPERTIES IMPORTED_IMPLIB ${SLANG_BINARY_DIR}/slang.lib) - set_target_properties(slang-llvm PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/slang-llvm.dll) + set(SLANG_ROOT ${EXTERNAL_ROOT}/vcpkg/packages/shader-slang_x64-windows/) + set_target_properties(shader-slang-glslang PROPERTIES IMPORTED_LOCATION ${SLANG_ROOT}/bin/slang-glslang.dll) + set_target_properties(shader-slang-glslang PROPERTIES IMPORTED_IMPLIB ${SLANG_ROOT}/lib/slang.lib) + set_target_properties(shader-slang PROPERTIES IMPORTED_LOCATION ${SLANG_ROOT}/bin/slang.dll) + set_target_properties(shader-slang PROPERTIES IMPORTED_IMPLIB ${SLANG_ROOT}/lib/slang.lib) + target_link_libraries(shader-slang INTERFACE shader-slang-glslang) + install(FILES + ${SLANG_ROOT}/bin/slang-glslang.dll + ${SLANG_ROOT}/bin/slang.dll + DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) + install(FILES + ${SLANG_ROOT}/lib/slang.lib + DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) else() - set_target_properties(slang-llvm PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/libslang-llvm.so) + endif() - -add_library(slang-glslang SHARED IMPORTED) - -if(WIN32) - target_link_libraries(slang-glslang INTERFACE - $ - $ - ) - set_target_properties(slang-glslang PROPERTIES IMPORTED_IMPLIB ${SLANG_BINARY_DIR}/slang.lib) - set_target_properties(slang-glslang PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/slang-glslang.dll) -else() - set_target_properties(slang-glslang PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/libslang-glslang.so) -endif() - -add_library(slang SHARED IMPORTED) - -target_include_directories(slang INTERFACE - $ +target_include_directories(shader-slang INTERFACE + $ $ ) -if(WIN32) - target_link_libraries(slang INTERFACE - $ - $ - ) - set_target_properties(slang PROPERTIES IMPORTED_IMPLIB ${SLANG_BINARY_DIR}/slang.lib) - set_target_properties(slang PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/slang.dll) -else() - set_target_properties(slang PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/libslang.so) -endif() -target_link_libraries(slang INTERFACE slang-glslang) -target_link_libraries(slang INTERFACE slang-llvm) - -install(DIRECTORY - ${SLANG_ROOT} - DESTINATION ${CMAKE_INSTALL_PREFIX}/include - FILES_MATCHING PATTERN "*.h" -) - -install(FILES - $ - $ - $ - DESTINATION ${CMAKE_INSTALL_PREFIX}/lib -) - -install(FILES - $ - $ - $ - DESTINATION ${CMAKE_INSTALL_PREFIX}/bin -) +#string(TOLOWER release_x64 SLANG_CONFIG) +#if(WIN32) +#string(TOLOWER ${SLANG_ROOT}/bin/windows-x64/release SLANG_BINARY_DIR) +#ExternalProject_Add(slang-build +# SOURCE_DIR ${SLANG_ROOT} +# BINARY_DIR ${SLANG_ROOT} +# CONFIGURE_COMMAND ${SLANG_ROOT}/premake.bat vs2019 --file=${SLANG_ROOT}/premake5.lua --arch=x64 --deps=true +# BUILD_COMMAND msbuild -p:PlatformToolset=v143 -p:Configuration=Release -p:Platform=x64 slang.sln +# INSTALL_COMMAND "" +#) +#elseif(UNIX) +#set(SLANG_BINARY_DIR ${SLANG_ROOT}/bin/linux-x64/release) +#ExternalProject_Add(slang-build +# SOURCE_DIR ${SLANG_ROOT} +# BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} +# CONFIGURE_COMMAND ${CMAKE_SOURCE_DIR}/premake5 --file=${CMAKE_SOURCE_DIR}/external/slang/premake5.lua gmake2 --arch=x64 --deps=true --build-location=build/linux +# BUILD_COMMAND make -C ${CMAKE_SOURCE_DIR}/external/slang/build/linux config=${SLANG_CONFIG} +# INSTALL_COMMAND "" +#) +#endif() +# +#add_library(slang-llvm SHARED IMPORTED) +#if(WIN32) +# target_link_libraries(slang-llvm INTERFACE +# $ +# $ +# ) +# set_target_properties(slang-llvm PROPERTIES IMPORTED_IMPLIB ${SLANG_BINARY_DIR}/slang.lib) +# set_target_properties(slang-llvm PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/slang-llvm.dll) +#else() +# set_target_properties(slang-llvm PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/libslang-llvm.so) +#endif() +# +#add_library(slang-glslang SHARED IMPORTED) +# +#if(WIN32) +# target_link_libraries(slang-glslang INTERFACE +# $ +# $ +# ) +# set_target_properties(slang-glslang PROPERTIES IMPORTED_IMPLIB ${SLANG_BINARY_DIR}/slang.lib) +# set_target_properties(slang-glslang PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/slang-glslang.dll) +#else() +# set_target_properties(slang-glslang PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/libslang-glslang.so) +#endif() +# +#add_library(slang SHARED IMPORTED) +# +#target_include_directories(slang INTERFACE +# $ +# $ +#) +#if(WIN32) +# target_link_libraries(slang INTERFACE +# $ +# $ +# ) +# set_target_properties(slang PROPERTIES IMPORTED_IMPLIB ${SLANG_BINARY_DIR}/slang.lib) +# set_target_properties(slang PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/slang.dll) +#else() +# set_target_properties(slang PROPERTIES IMPORTED_LOCATION ${SLANG_BINARY_DIR}/libslang.so) +#endif() +#target_link_libraries(slang INTERFACE slang-glslang) +#target_link_libraries(slang INTERFACE slang-llvm) +# +#install(DIRECTORY +# ${SLANG_ROOT} +# DESTINATION ${CMAKE_INSTALL_PREFIX}/include +# FILES_MATCHING PATTERN "*.h" +#) +# +#install(FILES +# $ +# $ +# $ +# DESTINATION ${CMAKE_INSTALL_PREFIX}/lib +#) +# +#install(FILES +# $ +# $ +# $ +# DESTINATION ${CMAKE_INSTALL_PREFIX}/bin +#) #--------------CRC++------------------------------ add_library(crcpp INTERFACE) @@ -164,48 +187,35 @@ install(FILES ) #--------------GLM------------------------------ -add_library(glm INTERFACE) -target_include_directories(glm INTERFACE - $ - $ -) - -install(DIRECTORY - ${GLM_ROOT}/glm - DESTINATION ${CMAKE_INSTALL_PREFIX}/include - FILES_MATCHING PATTERN "*.h*" -) - -install(DIRECTORY - ${GLM_ROOT}/glm - DESTINATION ${CMAKE_INSTALL_PREFIX}/include - FILES_MATCHING PATTERN "*.inl" -) - -#--------------STB----------------------------------- -add_library(stb INTERFACE) - -target_include_directories(stb INTERFACE - $ - $ -) - -install(DIRECTORY - ${STB_ROOT} - DESTINATION ${CMAKE_INSTALL_PREFIX}/include - FILES_MATCHING PATTERN "*.h" -) - -#--------------ODEINT----------------------------------- -add_library(odeint INTERFACE) - -target_include_directories(odeint INTERFACE - $ - $ -) - -install(DIRECTORY - ${ODEINT_ROOT} - DESTINATION ${CMAKE_INSTALL_PREFIX}/include - FILES_MATCHING PATTERN "*.hpp" -) +#add_library(glm INTERFACE) +#target_include_directories(glm INTERFACE +# $ +# $ +#) +# +#install(DIRECTORY +# ${GLM_ROOT}/glm +# DESTINATION ${CMAKE_INSTALL_PREFIX}/include +# FILES_MATCHING PATTERN "*.h*" +#) +# +#install(DIRECTORY +# ${GLM_ROOT}/glm +# DESTINATION ${CMAKE_INSTALL_PREFIX}/include +# FILES_MATCHING PATTERN "*.inl" +#) +# +##--------------STB----------------------------------- +#add_library(stb INTERFACE) +# +#target_include_directories(stb INTERFACE +# $ +# $ +#) +# +#install(DIRECTORY +# ${STB_ROOT} +# DESTINATION ${CMAKE_INSTALL_PREFIX}/include +# FILES_MATCHING PATTERN "*.h" +#) +# \ No newline at end of file diff --git a/external/vcpkg b/external/vcpkg new file mode 160000 index 0000000..16ee2ec --- /dev/null +++ b/external/vcpkg @@ -0,0 +1 @@ +Subproject commit 16ee2ecb31788c336ace8bb14c21801efb6836e4 diff --git a/premake5 b/premake5 deleted file mode 100755 index bcb51ce..0000000 Binary files a/premake5 and /dev/null differ diff --git a/src/Editor/main.cpp b/src/Editor/main.cpp index 3798a38..bac03c6 100644 --- a/src/Editor/main.cpp +++ b/src/Editor/main.cpp @@ -222,7 +222,6 @@ int main() mainWindowInfo.title = "SeeleEngine"; mainWindowInfo.width = 1920; mainWindowInfo.height = 1080; - mainWindowInfo.numSamples = 1; mainWindowInfo.preferredFormat = Gfx::SE_FORMAT_B8G8R8A8_SRGB; auto window = windowManager->addWindow(graphics, mainWindowInfo); ViewportCreateInfo sceneViewInfo; @@ -230,6 +229,7 @@ int main() sceneViewInfo.dimensions.size.y = 1080; sceneViewInfo.dimensions.offset.x = 0; sceneViewInfo.dimensions.offset.y = 0; + sceneViewInfo.numSamples = Gfx::SE_SAMPLE_COUNT_1_BIT; OGameView sceneView = new Editor::PlayView(graphics, window, sceneViewInfo, binaryPath.generic_string()); //ViewportCreateInfo inspectorViewInfo; diff --git a/src/Engine/Component/Camera.cpp b/src/Engine/Component/Camera.cpp index b88a2bd..73c250f 100644 --- a/src/Engine/Component/Camera.cpp +++ b/src/Engine/Component/Camera.cpp @@ -10,6 +10,7 @@ using namespace Seele::Math; Camera::Camera() : viewMatrix(Matrix4()) , bNeedsViewBuild(false) + , cameraPos(Vector()) { yaw = 3.1415f/2; pitch = 0; diff --git a/src/Engine/Component/Camera.h b/src/Engine/Component/Camera.h index 788e17d..1cfc50d 100644 --- a/src/Engine/Component/Camera.h +++ b/src/Engine/Component/Camera.h @@ -30,7 +30,6 @@ struct Camera void buildViewMatrix(); Matrix4 viewMatrix; Vector cameraPos; - Vector cameraDirection; //Transforms relative to actor float yaw; float pitch; diff --git a/src/Engine/Graphics/Graphics.cpp b/src/Engine/Graphics/Graphics.cpp index 1ba5ab5..d3e23c7 100644 --- a/src/Engine/Graphics/Graphics.cpp +++ b/src/Engine/Graphics/Graphics.cpp @@ -1,5 +1,6 @@ #include "Graphics.h" #include "Shader.h" +#include "Graphics.h" using namespace Seele::Gfx; @@ -11,4 +12,3 @@ Graphics::Graphics() Graphics::~Graphics() { } - diff --git a/src/Engine/Graphics/Graphics.h b/src/Engine/Graphics/Graphics.h index 8811f1a..4eb2b64 100644 --- a/src/Engine/Graphics/Graphics.h +++ b/src/Engine/Graphics/Graphics.h @@ -82,6 +82,8 @@ public: virtual ODescriptorLayout createDescriptorLayout(const std::string& name = "") = 0; virtual OPipelineLayout createPipelineLayout(PPipelineLayout baseLayout = nullptr) = 0; + virtual void resolveTexture(Gfx::PTexture source, Gfx::PTexture destination) = 0; + bool supportMeshShading() const { return meshShadingEnabled; } protected: QueueFamilyMapping queueMapping; diff --git a/src/Engine/Graphics/Initializer.h b/src/Engine/Graphics/Initializer.h index 29f69f5..08bedeb 100644 --- a/src/Engine/Graphics/Initializer.h +++ b/src/Engine/Graphics/Initializer.h @@ -64,7 +64,7 @@ struct TextureCreateInfo uint32 layers = 1; uint32 elements = 1; uint32 samples = 1; - Gfx::SeImageUsageFlagBits usage = Gfx::SE_IMAGE_USAGE_SAMPLED_BIT; + Gfx::SeImageUsageFlags usage = Gfx::SE_IMAGE_USAGE_SAMPLED_BIT; Gfx::SeMemoryPropertyFlags memoryProps = Gfx::SE_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; }; struct SamplerCreateInfo diff --git a/src/Engine/Graphics/RenderPass/BasePass.cpp b/src/Engine/Graphics/RenderPass/BasePass.cpp index 5482130..9aaaa5e 100644 --- a/src/Engine/Graphics/RenderPass/BasePass.cpp +++ b/src/Engine/Graphics/RenderPass/BasePass.cpp @@ -71,6 +71,7 @@ void BasePass::render() tLightGrid->pipelineBarrier( Gfx::SE_ACCESS_SHADER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT, Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + colorBuffer->changeLayout(Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); descriptorSets[INDEX_VIEW_PARAMS] = viewParamsSet; descriptorSets[INDEX_LIGHT_ENV] = scene->getLightEnvironment()->getDescriptorSet(); @@ -131,7 +132,7 @@ void BasePass::render() pipelineInfo.pipelineLayout = std::move(layout); pipelineInfo.renderPass = renderPass; pipelineInfo.depthStencilState.depthCompareOp = Gfx::SE_COMPARE_OP_LESS_OR_EQUAL; - pipelineInfo.rasterizationState.lineWidth = 10.f; + pipelineInfo.multisampleState.samples = viewport->getSamples(); Gfx::PGraphicsPipeline pipeline = graphics->createGraphicsPipeline(std::move(pipelineInfo)); command->bindPipeline(pipeline); } @@ -143,6 +144,7 @@ void BasePass::render() pipelineInfo.pipelineLayout = std::move(layout); pipelineInfo.renderPass = renderPass; pipelineInfo.depthStencilState.depthCompareOp = Gfx::SE_COMPARE_OP_LESS_OR_EQUAL; + pipelineInfo.multisampleState.samples = viewport->getSamples(); Gfx::PGraphicsPipeline pipeline = graphics->createGraphicsPipeline(std::move(pipelineInfo)); command->bindPipeline(pipeline); } @@ -185,22 +187,24 @@ void BasePass::endFrame() void BasePass::publishOutputs() { colorBuffer = graphics->createTexture2D(TextureCreateInfo{ + .format = viewport->getOwner()->getBackBuffer()->getFormat(), .width = viewport->getWidth(), .height = viewport->getHeight(), .samples = viewport->getSamples(), - .usage = Gfx::SE_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, - .memoryProps = Gfx::SE_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | Gfx::SE_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, + .usage = Gfx::SE_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, }); - colorAttachment = new Gfx::RenderTargetAttachment(colorBuffer, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_DONT_CARE); - resolveAttachment = new Gfx::SwapchainAttachment(viewport->getOwner(), Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_STORE); - resources->registerRenderPassOutput("BASEPASS_COLOR", resolveAttachment); + colorAttachment = new Gfx::RenderTargetAttachment(colorBuffer, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_STORE); + resources->registerRenderPassOutput("BASEPASS_COLOR", colorAttachment); } void BasePass::createRenderPass() { Gfx::PRenderTargetAttachment depthAttachment = resources->requestRenderTarget("DEPTHPREPASS_DEPTH"); depthAttachment->loadOp = Gfx::SE_ATTACHMENT_LOAD_OP_LOAD; - Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout(colorAttachment, depthAttachment, resolveAttachment); + Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout{ + .colorAttachments = { colorAttachment }, + .depthAttachment = depthAttachment, + }; renderPass = graphics->createRenderPass(std::move(layout), viewport); oLightIndexList = resources->requestBuffer("LIGHTCULLING_OLIGHTLIST"); tLightIndexList = resources->requestBuffer("LIGHTCULLING_TLIGHTLIST"); diff --git a/src/Engine/Graphics/RenderPass/BasePass.h b/src/Engine/Graphics/RenderPass/BasePass.h index 741c887..6c3d93c 100644 --- a/src/Engine/Graphics/RenderPass/BasePass.h +++ b/src/Engine/Graphics/RenderPass/BasePass.h @@ -19,7 +19,6 @@ public: virtual void createRenderPass() override; static void modifyRenderPassMacros(Map& defines); private: - Gfx::ORenderTargetAttachment resolveAttachment; Gfx::ORenderTargetAttachment colorAttachment; Gfx::OTexture2D colorBuffer; Gfx::PTexture2D depthBuffer; diff --git a/src/Engine/Graphics/RenderPass/DepthPrepass.cpp b/src/Engine/Graphics/RenderPass/DepthPrepass.cpp index 71be909..f504d5e 100644 --- a/src/Engine/Graphics/RenderPass/DepthPrepass.cpp +++ b/src/Engine/Graphics/RenderPass/DepthPrepass.cpp @@ -91,6 +91,7 @@ void DepthPrepass::render() pipelineInfo.pipelineLayout = std::move(layout); pipelineInfo.renderPass = renderPass; pipelineInfo.depthStencilState.depthCompareOp = Gfx::SE_COMPARE_OP_LESS_OR_EQUAL; + pipelineInfo.multisampleState.samples = viewport->getSamples(); Gfx::PGraphicsPipeline pipeline = graphics->createGraphicsPipeline(std::move(pipelineInfo)); command->bindPipeline(pipeline); } @@ -102,6 +103,7 @@ void DepthPrepass::render() pipelineInfo.pipelineLayout = std::move(layout); pipelineInfo.renderPass = renderPass; pipelineInfo.depthStencilState.depthCompareOp = Gfx::SE_COMPARE_OP_LESS_OR_EQUAL; + pipelineInfo.multisampleState.samples = viewport->getSamples(); Gfx::PGraphicsPipeline pipeline = graphics->createGraphicsPipeline(std::move(pipelineInfo)); command->bindPipeline(pipeline); } @@ -120,7 +122,7 @@ void DepthPrepass::render() { command->bindIndexBuffer(vertexData->getIndexBuffer()); uint32 instanceOffset = 0; - for (const auto& [instance, meshData] : instance.meshes) + for (const auto& [_, meshData] : instance.meshes) { if (meshData.numIndices > 0) { @@ -148,25 +150,30 @@ void DepthPrepass::publishOutputs() .format = Gfx::SE_FORMAT_D32_SFLOAT, .width = viewport->getOwner()->getFramebufferWidth(), .height = viewport->getOwner()->getFramebufferHeight(), + .samples = viewport->getSamples(), .usage = Gfx::SE_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, }; depthBuffer = graphics->createTexture2D(depthBufferInfo); depthAttachment = new Gfx::RenderTargetAttachment(depthBuffer, Gfx::SE_ATTACHMENT_LOAD_OP_CLEAR, Gfx::SE_ATTACHMENT_STORE_OP_STORE); depthAttachment->clear.depthStencil.depth = 1.0f; + depthBufferInfo.samples = Gfx::SE_SAMPLE_COUNT_1_BIT; + depthResolveBuffer = graphics->createTexture2D(depthBufferInfo); + depthResolveAttachment = + new Gfx::RenderTargetAttachment(depthResolveBuffer, Gfx::SE_ATTACHMENT_LOAD_OP_DONT_CARE, Gfx::SE_ATTACHMENT_STORE_OP_STORE); resources->registerRenderPassOutput("DEPTHPREPASS_DEPTH", depthAttachment); + resources->registerRenderPassOutput("DEPTHPREPASS_RESOLVED_DEPTH", depthResolveAttachment); } void DepthPrepass::createRenderPass() { - Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout(depthAttachment); + Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout{ + .depthAttachment = depthAttachment, + .depthResolveAttachment = depthResolveAttachment, + }; renderPass = graphics->createRenderPass(std::move(layout), viewport); } void DepthPrepass::modifyRenderPassMacros(Map& defines) { - defines["INDEX_VIEW_PARAMS"] = "0"; - defines["INDEX_MATERIAL"] = "1"; - defines["INDEX_VERTEX_DATA"] = "2"; - defines["INDEX_SCENE_DATA"] = "3"; } diff --git a/src/Engine/Graphics/RenderPass/DepthPrepass.h b/src/Engine/Graphics/RenderPass/DepthPrepass.h index 4e556cf..0a7c9ce 100644 --- a/src/Engine/Graphics/RenderPass/DepthPrepass.h +++ b/src/Engine/Graphics/RenderPass/DepthPrepass.h @@ -19,7 +19,9 @@ public: static void modifyRenderPassMacros(Map& defines); private: Gfx::ORenderTargetAttachment depthAttachment; + Gfx::ORenderTargetAttachment depthResolveAttachment; Gfx::OTexture2D depthBuffer; + Gfx::OTexture2D depthResolveBuffer; Array descriptorSets; diff --git a/src/Engine/Graphics/RenderPass/LightCullingPass.cpp b/src/Engine/Graphics/RenderPass/LightCullingPass.cpp index 88f812d..1175503 100644 --- a/src/Engine/Graphics/RenderPass/LightCullingPass.cpp +++ b/src/Engine/Graphics/RenderPass/LightCullingPass.cpp @@ -174,7 +174,7 @@ void LightCullingPass::publishOutputs() void LightCullingPass::createRenderPass() { - depthAttachment = resources->requestRenderTarget("DEPTHPREPASS_DEPTH")->getTexture(); + depthAttachment = resources->requestRenderTarget("DEPTHPREPASS_RESOLVED_DEPTH")->getTexture(); } void LightCullingPass::modifyRenderPassMacros(Map&) diff --git a/src/Engine/Graphics/RenderPass/SkyboxRenderPass.cpp b/src/Engine/Graphics/RenderPass/SkyboxRenderPass.cpp index 232ac8a..1155eab 100644 --- a/src/Engine/Graphics/RenderPass/SkyboxRenderPass.cpp +++ b/src/Engine/Graphics/RenderPass/SkyboxRenderPass.cpp @@ -25,13 +25,6 @@ void SkyboxRenderPass::beginFrame(const Component::Camera& cam) RenderPass::beginFrame(cam); DataSource uniformUpdate; - viewParams.viewMatrix = cam.getViewMatrix(); - viewParams.projectionMatrix = viewport->getProjectionMatrix(); - viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 1); - viewParams.screenDimensions = Vector2(static_cast(viewport->getWidth()), static_cast(viewport->getHeight())); - uniformUpdate.size = sizeof(ViewParameter); - uniformUpdate.data = (uint8*)&viewParams; - viewParamsBuffer->updateContents(uniformUpdate); skyboxDataLayout->reset(); textureLayout->reset(); skyboxDataSet = skyboxDataLayout->allocateDescriptorSet(); @@ -54,6 +47,8 @@ void SkyboxRenderPass::render() renderCommand->draw(36, 1, 0, 0); graphics->executeCommands(Array{ renderCommand }); graphics->endRenderPass(); + baseColorAttachment->getTexture()->changeLayout(Gfx::SE_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + graphics->resolveTexture(baseColorAttachment->getTexture(), viewport->getOwner()->getBackBuffer()); } void SkyboxRenderPass::endFrame() @@ -63,15 +58,6 @@ void SkyboxRenderPass::endFrame() void SkyboxRenderPass::publishOutputs() { - UniformBufferCreateInfo viewCreateInfo = { - .sourceData = DataSource { - .size = sizeof(ViewParameter), - .data = nullptr, - }, - .dynamic = true - }; - viewParamsBuffer = graphics->createUniformBuffer(viewCreateInfo); - skyboxDataLayout = graphics->createDescriptorLayout("SkyboxDescLayout"); skyboxDataLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER); skyboxDataLayout->create(); @@ -86,11 +72,14 @@ void SkyboxRenderPass::publishOutputs() void SkyboxRenderPass::createRenderPass() { - Gfx::PRenderTargetAttachment baseColorAttachment = resources->requestRenderTarget("BASEPASS_COLOR"); + baseColorAttachment = resources->requestRenderTarget("BASEPASS_COLOR"); baseColorAttachment->loadOp = Gfx::SE_ATTACHMENT_LOAD_OP_LOAD; Gfx::PRenderTargetAttachment depthAttachment = resources->requestRenderTarget("DEPTHPREPASS_DEPTH"); depthAttachment->loadOp = Gfx::SE_ATTACHMENT_LOAD_OP_LOAD; - Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout(baseColorAttachment, depthAttachment); + Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout{ + .colorAttachments = { baseColorAttachment }, + .depthAttachment = depthAttachment + }; renderPass = graphics->createRenderPass(std::move(layout), viewport); ShaderCreateInfo createInfo; @@ -118,5 +107,6 @@ void SkyboxRenderPass::createRenderPass() gfxInfo.topology = Gfx::SE_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; gfxInfo.pipelineLayout = std::move(pipelineLayout); gfxInfo.renderPass = renderPass; + gfxInfo.multisampleState.samples = viewport->getSamples(); pipeline = graphics->createGraphicsPipeline(std::move(gfxInfo)); } diff --git a/src/Engine/Graphics/RenderPass/SkyboxRenderPass.h b/src/Engine/Graphics/RenderPass/SkyboxRenderPass.h index 7734d5c..151f68f 100644 --- a/src/Engine/Graphics/RenderPass/SkyboxRenderPass.h +++ b/src/Engine/Graphics/RenderPass/SkyboxRenderPass.h @@ -18,8 +18,8 @@ public: virtual void publishOutputs() override; virtual void createRenderPass() override; private: + Gfx::PRenderTargetAttachment baseColorAttachment; Gfx::OVertexBuffer cubeBuffer; - Gfx::OUniformBuffer viewParamsBuffer; Gfx::ODescriptorLayout skyboxDataLayout; Gfx::PDescriptorSet skyboxDataSet; Gfx::ODescriptorLayout textureLayout; diff --git a/src/Engine/Graphics/RenderPass/TextPass.cpp b/src/Engine/Graphics/RenderPass/TextPass.cpp index 88ca832..7049f43 100644 --- a/src/Engine/Graphics/RenderPass/TextPass.cpp +++ b/src/Engine/Graphics/RenderPass/TextPass.cpp @@ -158,7 +158,10 @@ void TextPass::createRenderPass() .size = sizeof(TextData)}); pipelineLayout->create(); - Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout(renderTarget, depthAttachment); + Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout{ + .colorAttachments = {renderTarget}, + .depthAttachment = depthAttachment + }; renderPass = graphics->createRenderPass(std::move(layout), viewport); Gfx::LegacyPipelineCreateInfo pipelineInfo; diff --git a/src/Engine/Graphics/RenderPass/UIPass.cpp b/src/Engine/Graphics/RenderPass/UIPass.cpp index 665d437..360bb76 100644 --- a/src/Engine/Graphics/RenderPass/UIPass.cpp +++ b/src/Engine/Graphics/RenderPass/UIPass.cpp @@ -136,7 +136,10 @@ void UIPass::createRenderPass() pipelineLayout->addDescriptorLayout(0, descriptorLayout); pipelineLayout->create(); - Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout(std::move(renderTarget), std::move(depthAttachment)); + Gfx::ORenderTargetLayout layout = new Gfx::RenderTargetLayout{ + .colorAttachments = { renderTarget }, + .depthAttachment = depthAttachment + }; renderPass = graphics->createRenderPass(std::move(layout), viewport); Gfx::LegacyPipelineCreateInfo pipelineInfo; diff --git a/src/Engine/Graphics/RenderTarget.cpp b/src/Engine/Graphics/RenderTarget.cpp index d165d15..a86f300 100644 --- a/src/Engine/Graphics/RenderTarget.cpp +++ b/src/Engine/Graphics/RenderTarget.cpp @@ -21,73 +21,3 @@ RenderTargetAttachment::RenderTargetAttachment(PTexture2D texture, RenderTargetAttachment::~RenderTargetAttachment() { } - -SwapchainAttachment::SwapchainAttachment(PWindow owner, - SeAttachmentLoadOp loadOp, - SeAttachmentStoreOp storeOp, - SeAttachmentLoadOp stencilLoadOp, - SeAttachmentStoreOp stencilStoreOp) - : RenderTargetAttachment(nullptr, loadOp, storeOp, stencilLoadOp, stencilStoreOp), owner(owner) -{ - clear.color.float32[0] = 0.0f; - clear.color.float32[1] = 0.0f; - clear.color.float32[2] = 0.0f; - clear.color.float32[3] = 1.0f; - componentFlags = SE_COLOR_COMPONENT_R_BIT | SE_COLOR_COMPONENT_G_BIT | SE_COLOR_COMPONENT_B_BIT | SE_COLOR_COMPONENT_A_BIT; -} - -SwapchainAttachment::~SwapchainAttachment() -{ -} - - -RenderTargetLayout::RenderTargetLayout() - : inputAttachments() - , colorAttachments() - , depthAttachment() - , width(0) - , height(0) -{ -} - -RenderTargetLayout::RenderTargetLayout(PRenderTargetAttachment depthAttachment) - : inputAttachments() - , colorAttachments() - , depthAttachment(depthAttachment) - , width(depthAttachment->getTexture()->getWidth()) - , height(depthAttachment->getTexture()->getHeight()) -{ -} - -RenderTargetLayout::RenderTargetLayout(PRenderTargetAttachment colorAttachment, PRenderTargetAttachment depthAttachment) - : colorAttachments({colorAttachment}) - , depthAttachment(depthAttachment) - , width(depthAttachment->getTexture()->getWidth()) - , height(depthAttachment->getTexture()->getHeight()) -{ -} -RenderTargetLayout::RenderTargetLayout(Array colorAttachments, PRenderTargetAttachment depthAttachment) - : inputAttachments() - , colorAttachments(colorAttachments) - , depthAttachment(depthAttachment) - , width(depthAttachment->getTexture()->getWidth()) - , height(depthAttachment->getTexture()->getHeight()) -{ -} -RenderTargetLayout::RenderTargetLayout(Array inputAttachments, Array colorAttachments, PRenderTargetAttachment depthAttachment) - : inputAttachments(inputAttachments) - , colorAttachments(colorAttachments) - , depthAttachment(depthAttachment) - , width(depthAttachment->getTexture()->getWidth()) - , height(depthAttachment->getTexture()->getHeight()) -{ -} - -RenderTargetLayout::RenderTargetLayout(PRenderTargetAttachment colorAttachment, PRenderTargetAttachment depthAttachment, PRenderTargetAttachment resolveAttachment) - : colorAttachments({ colorAttachment }) - , depthAttachment(depthAttachment) - , resolveAttachments({ resolveAttachment }) - , width(depthAttachment->getTexture()->getWidth()) - , height(depthAttachment->getTexture()->getHeight()) -{ -} diff --git a/src/Engine/Graphics/RenderTarget.h b/src/Engine/Graphics/RenderTarget.h index f0b73dd..28a743a 100644 --- a/src/Engine/Graphics/RenderTarget.h +++ b/src/Engine/Graphics/RenderTarget.h @@ -15,24 +15,24 @@ public: SeAttachmentStoreOp storeOp = SE_ATTACHMENT_STORE_OP_STORE, SeAttachmentLoadOp stencilLoadOp = SE_ATTACHMENT_LOAD_OP_DONT_CARE, SeAttachmentStoreOp stencilStoreOp = SE_ATTACHMENT_STORE_OP_DONT_CARE); - virtual ~RenderTargetAttachment(); - virtual PTexture2D getTexture() + ~RenderTargetAttachment(); + PTexture2D getTexture() { return texture; } - virtual SeFormat getFormat() const + SeFormat getFormat() const { return texture->getFormat(); } - virtual SeSampleCountFlags getNumSamples() const + SeSampleCountFlags getNumSamples() const { return texture->getNumSamples(); } - virtual uint32 getWidth() const + uint32 getWidth() const { return texture->getWidth(); } - virtual uint32 getHeight() const + uint32 getHeight() const { return texture->getHeight(); } @@ -51,53 +51,14 @@ protected: }; DEFINE_REF(RenderTargetAttachment) -class SwapchainAttachment : public RenderTargetAttachment -{ -public: - SwapchainAttachment(PWindow owner, - SeAttachmentLoadOp loadOp = SE_ATTACHMENT_LOAD_OP_LOAD, - SeAttachmentStoreOp storeOp = SE_ATTACHMENT_STORE_OP_STORE, - SeAttachmentLoadOp stencilLoadOp = SE_ATTACHMENT_LOAD_OP_DONT_CARE, - SeAttachmentStoreOp stencilStoreOp = SE_ATTACHMENT_STORE_OP_DONT_CARE); - virtual ~SwapchainAttachment(); - virtual PTexture2D getTexture() override - { - return owner->getBackBuffer(); - } - virtual SeFormat getFormat() const override - { - return owner->getSwapchainFormat(); - } - virtual SeSampleCountFlags getNumSamples() const override - { - return Gfx::SE_SAMPLE_COUNT_1_BIT; - } - virtual uint32 getWidth() const - { - return owner->getFramebufferWidth(); - } - virtual uint32 getHeight() const - { - return owner->getFramebufferHeight(); - } -private: - PWindow owner; -}; -DEFINE_REF(SwapchainAttachment) - class RenderTargetLayout { public: - RenderTargetLayout(); - RenderTargetLayout(PRenderTargetAttachment depthAttachment); - RenderTargetLayout(PRenderTargetAttachment colorAttachment, PRenderTargetAttachment depthAttachment); - RenderTargetLayout(Array colorAttachments, PRenderTargetAttachment depthAttachmet); - RenderTargetLayout(Array inputAttachments, Array colorAttachments, PRenderTargetAttachment depthAttachment); - RenderTargetLayout(PRenderTargetAttachment colorAttachment, PRenderTargetAttachment depthAttachment, PRenderTargetAttachment resolveAttachment); Array inputAttachments; Array colorAttachments; Array resolveAttachments; PRenderTargetAttachment depthAttachment; + PRenderTargetAttachment depthResolveAttachment; uint32 width; uint32 height; }; diff --git a/src/Engine/Graphics/Shader.h b/src/Engine/Graphics/Shader.h index 36102cf..40de5df 100644 --- a/src/Engine/Graphics/Shader.h +++ b/src/Engine/Graphics/Shader.h @@ -71,36 +71,36 @@ struct ShaderPermutation { std::memset(taskFile, 0, sizeof(taskFile)); hasTaskShader = 1; - std::strncpy(taskFile, name.data(), 32); + strncpy_s(taskFile, sizeof(taskFile), name.data(), 32); } void setVertexFile(std::string_view name) { std::memset(vertexMeshFile, 0, sizeof(vertexMeshFile)); useMeshShading = 0; - std::strncpy(vertexMeshFile, name.data(), 32); + strncpy_s(vertexMeshFile, sizeof(vertexMeshFile), name.data(), 32); } void setMeshFile(std::string_view name) { std::memset(vertexMeshFile, 0, sizeof(vertexMeshFile)); useMeshShading = 1; - std::strncpy(vertexMeshFile, name.data(), 32); + strncpy_s(vertexMeshFile, sizeof(vertexMeshFile), name.data(), 32); } void setFragmentFile(std::string_view name) { std::memset(fragmentFile, 0, sizeof(fragmentFile)); hasFragment = 1; - std::strncpy(fragmentFile, name.data(), 32); + strncpy_s(fragmentFile, sizeof(fragmentFile), name.data(), 32); } void setVertexData(std::string_view name) { std::memset(vertexDataName, 0, sizeof(vertexDataName)); - std::strncpy(vertexDataName, name.data(), 32); + strncpy_s(vertexDataName, sizeof(vertexDataName), name.data(), 32); } void setMaterial(std::string_view name) { std::memset(materialName, 0, sizeof(materialName)); useMaterial = 1; - std::strncpy(materialName, name.data(), 32); + strncpy_s(materialName, sizeof(materialName), name.data(), 32); } }; //Hashed ShaderPermutation for fast lookup diff --git a/src/Engine/Graphics/VertexData.cpp b/src/Engine/Graphics/VertexData.cpp index 4f83fae..1a09994 100644 --- a/src/Engine/Graphics/VertexData.cpp +++ b/src/Engine/Graphics/VertexData.cpp @@ -201,9 +201,9 @@ VertexData* Seele::VertexData::findByTypeName(std::string name) return nullptr; } -void Seele::VertexData::init(Gfx::PGraphics graphics) +void Seele::VertexData::init(Gfx::PGraphics _graphics) { - this->graphics = graphics; + graphics = _graphics; verticesAllocated = NUM_DEFAULT_ELEMENTS; instanceDataLayout = graphics->createDescriptorLayout("VertexDataInstanceLayout"); instanceDataLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER); diff --git a/src/Engine/Graphics/Vulkan/Framebuffer.cpp b/src/Engine/Graphics/Vulkan/Framebuffer.cpp index fba1f88..0c720a4 100644 --- a/src/Engine/Graphics/Vulkan/Framebuffer.cpp +++ b/src/Engine/Graphics/Vulkan/Framebuffer.cpp @@ -33,6 +33,14 @@ Framebuffer::Framebuffer(PGraphics graphics, PRenderPass renderPass, Gfx::PRende width = std::max(width, vkColorAttachment->getWidth()); height = std::max(height, vkColorAttachment->getHeight()); } + for (auto resolveAttachment : layout->resolveAttachments) + { + PTexture2D vkResolveAttachment = resolveAttachment->getTexture().cast(); + attachments.add(vkResolveAttachment->getView()); + description.resolveAttachments[description.numResolveAttachments++] = vkResolveAttachment->getView(); + width = std::max(width, vkResolveAttachment->getWidth()); + height = std::max(height, vkResolveAttachment->getHeight()); + } if (layout->depthAttachment != nullptr) { PTexture2D vkDepthAttachment = layout->depthAttachment->getTexture().cast(); @@ -41,6 +49,14 @@ Framebuffer::Framebuffer(PGraphics graphics, PRenderPass renderPass, Gfx::PRende width = std::max(width, vkDepthAttachment->getWidth()); height = std::max(height, vkDepthAttachment->getHeight()); } + if (layout->depthResolveAttachment != nullptr) + { + PTexture2D vkDepthAttachment = layout->depthResolveAttachment->getTexture().cast(); + attachments.add(vkDepthAttachment->getView()); + description.depthResolveAttachment = vkDepthAttachment->getView(); + width = std::max(width, vkDepthAttachment->getWidth()); + height = std::max(height, vkDepthAttachment->getHeight()); + } VkFramebufferCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, .pNext = nullptr, diff --git a/src/Engine/Graphics/Vulkan/Framebuffer.h b/src/Engine/Graphics/Vulkan/Framebuffer.h index 02c231e..2621c8c 100644 --- a/src/Engine/Graphics/Vulkan/Framebuffer.h +++ b/src/Engine/Graphics/Vulkan/Framebuffer.h @@ -12,9 +12,12 @@ struct FramebufferDescription { StaticArray inputAttachments; StaticArray colorAttachments; + StaticArray resolveAttachments; VkImageView depthAttachment; + VkImageView depthResolveAttachment; uint32 numInputAttachments; uint32 numColorAttachments; + uint32 numResolveAttachments; }; class Framebuffer { diff --git a/src/Engine/Graphics/Vulkan/Graphics.cpp b/src/Engine/Graphics/Vulkan/Graphics.cpp index c4d5a37..86e9da0 100644 --- a/src/Engine/Graphics/Vulkan/Graphics.cpp +++ b/src/Engine/Graphics/Vulkan/Graphics.cpp @@ -237,6 +237,42 @@ Gfx::OPipelineLayout Graphics::createPipelineLayout(Gfx::PPipelineLayout baseLay return new PipelineLayout(this, baseLayout); } +void Graphics::resolveTexture(Gfx::PTexture source, Gfx::PTexture destination) +{ + PTextureBase sourceTex = source.cast(); + PTextureBase destinationTex = destination.cast(); + VkImageResolve resolve = { + .srcSubresource = VkImageSubresourceLayers { + .aspectMask = sourceTex->getAspect(), + .mipLevel = 0, + .baseArrayLayer = 0, + .layerCount = 1, + }, + .srcOffset = VkOffset3D { + .x = 0, + .y = 0, + .z = 0, + }, + .dstSubresource = VkImageSubresourceLayers { + .aspectMask = sourceTex->getAspect(), + .mipLevel = 0, + .baseArrayLayer = 0, + .layerCount = 1, + }, + .dstOffset = VkOffset3D { + .x = 0, + .y = 0, + .z = 0, + }, + .extent = VkExtent3D { + .width = sourceTex->getWidth(), + .height = sourceTex->getHeight(), + .depth = sourceTex->getDepth(), + }, + }; + vkCmdResolveImage(getGraphicsCommands()->getCommands()->getHandle(), sourceTex->getImage(), cast(sourceTex->getLayout()), destinationTex->getImage(), cast(destinationTex->getLayout()), 1, &resolve); +} + void Graphics::vkCmdDrawMeshTasksEXT(VkCommandBuffer handle, uint32 groupX, uint32 groupY, uint32 groupZ) { cmdDrawMeshTasks(handle, groupX, groupY, groupZ); @@ -410,7 +446,7 @@ void Graphics::pickPhysicalDevice() { if (std::strcmp(VK_EXT_MESH_SHADER_EXTENSION_NAME, extensionProps[i].extensionName) == 0) { - //meshShadingEnabled = true; + meshShadingEnabled = true; break; } } diff --git a/src/Engine/Graphics/Vulkan/Graphics.h b/src/Engine/Graphics/Vulkan/Graphics.h index 0724402..4b7a872 100644 --- a/src/Engine/Graphics/Vulkan/Graphics.h +++ b/src/Engine/Graphics/Vulkan/Graphics.h @@ -68,6 +68,8 @@ public: virtual Gfx::ODescriptorLayout createDescriptorLayout(const std::string& name = "") override; virtual Gfx::OPipelineLayout createPipelineLayout(Gfx::PPipelineLayout baseLayout = nullptr) override; + virtual void resolveTexture(Gfx::PTexture source, Gfx::PTexture destination) override; + void vkCmdDrawMeshTasksEXT(VkCommandBuffer handle, uint32 groupX, uint32 groupY, uint32 groupZ); protected: PFN_vkCmdDrawMeshTasksEXT cmdDrawMeshTasks; diff --git a/src/Engine/Graphics/Vulkan/RenderPass.cpp b/src/Engine/Graphics/Vulkan/RenderPass.cpp index f4a95cc..672b1d0 100644 --- a/src/Engine/Graphics/Vulkan/RenderPass.cpp +++ b/src/Engine/Graphics/Vulkan/RenderPass.cpp @@ -17,15 +17,20 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx renderArea.offset.x = viewport->getOffsetX(); renderArea.offset.y = viewport->getOffsetY(); subpassContents = VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS; - Array attachments; - Array inputRefs; - Array colorRefs; - VkAttachmentReference depthRef; + Array attachments; + Array inputRefs; + Array colorRefs; + Array resolveRefs; + VkAttachmentReference2 depthRef; + VkAttachmentReference2 depthResolveRef; + uint32 attachmentCounter = 0; for (auto& inputAttachment : layout->inputAttachments) { PTexture2D image = inputAttachment->getTexture().cast(); - VkAttachmentDescription& desc = attachments.add() = { + VkAttachmentDescription2& desc = attachments.add() = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, .flags = 0, .format = cast(image->getFormat()), .loadOp = cast(inputAttachment->getLoadOp()), @@ -33,7 +38,7 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx .stencilLoadOp = cast(inputAttachment->getStencilLoadOp()), .stencilStoreOp = cast(inputAttachment->getStencilStoreOp()), .initialLayout = image->isDepthStencil() ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, - .finalLayout = desc.initialLayout, + .finalLayout = image->isDepthStencil() ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, }; inputRefs.add() = { @@ -44,6 +49,8 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx for (auto& colorAttachment : layout->colorAttachments) { attachments.add() = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, .flags = 0, .format = cast(colorAttachment->getFormat()), .samples = (VkSampleCountFlagBits)colorAttachment->getNumSamples(), @@ -62,6 +69,37 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx } colorRefs.add() = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, + .pNext = nullptr, + .attachment = attachmentCounter++, + .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + }; + } + for (auto& resolveAttachment : layout->resolveAttachments) + { + attachments.add() = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .format = cast(resolveAttachment->getFormat()), + .samples = (VkSampleCountFlagBits)resolveAttachment->getNumSamples(), + .loadOp = cast(resolveAttachment->getLoadOp()), + .storeOp = cast(resolveAttachment->getStoreOp()), + .stencilLoadOp = cast(resolveAttachment->getStencilLoadOp()), + .stencilStoreOp = cast(resolveAttachment->getStencilStoreOp()), + .initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + }; + + VkClearValue& clearValue = clearValues.add(); + if (attachments.back().loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) + { + clearValue = cast(resolveAttachment->clear); + } + + resolveRefs.add() = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, + .pNext = nullptr, .attachment = attachmentCounter++, .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, }; @@ -70,6 +108,8 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx { PTexture2D image = layout->depthAttachment->getTexture().cast(); attachments.add() = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, .flags = 0, .format = cast(image->getFormat()), .samples = (VkSampleCountFlagBits)image->getNumSamples(), @@ -80,28 +120,66 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx .initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, .finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, }; - + VkClearValue& clearValue = clearValues.add(); - if(attachments.back().loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) + if (attachments.back().loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) { clearValue = cast(layout->depthAttachment->clear); } depthRef = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, + .pNext = nullptr, .attachment = attachmentCounter++, .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, }; } - VkSubpassDescription subPassDesc = { + if (layout->depthResolveAttachment != nullptr) + { + PTexture2D image = layout->depthResolveAttachment->getTexture().cast(); + attachments.add() = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, + .pNext = nullptr, + .flags = 0, + .format = cast(image->getFormat()), + .samples = (VkSampleCountFlagBits)image->getNumSamples(), + .loadOp = cast(layout->depthResolveAttachment->getLoadOp()), + .storeOp = cast(layout->depthResolveAttachment->getStoreOp()), + .stencilLoadOp = cast(layout->depthResolveAttachment->getStencilLoadOp()), + .stencilStoreOp = cast(layout->depthResolveAttachment->getStencilStoreOp()), + .initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + .finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + }; + depthResolveRef = { + .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, + .pNext = nullptr, + .attachment = attachmentCounter++, + .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + }; + } + + VkSubpassDescriptionDepthStencilResolve depthResolve = { + .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE, + .pNext = nullptr, + .depthResolveMode = VK_RESOLVE_MODE_AVERAGE_BIT, + .stencilResolveMode = VK_RESOLVE_MODE_AVERAGE_BIT, + .pDepthStencilResolveAttachment = &depthResolveRef, + }; + VkSubpassDescription2 subPassDesc = { + .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, + .pNext = layout->depthResolveAttachment != nullptr ? &depthResolve : nullptr, .flags = 0, .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, .inputAttachmentCount = (uint32)inputRefs.size(), .pInputAttachments = inputRefs.data(), .colorAttachmentCount = (uint32)colorRefs.size(), .pColorAttachments = colorRefs.data(), + .pResolveAttachments = resolveRefs.size() > 0 ? resolveRefs.data() : nullptr, .pDepthStencilAttachment = &depthRef, }; - VkSubpassDependency dependency = { + VkSubpassDependency2 dependency = { + .sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, + .pNext = nullptr, .srcSubpass = VK_SUBPASS_EXTERNAL, .dstSubpass = 0, .srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, @@ -110,8 +188,8 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, }; - VkRenderPassCreateInfo info = { - .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, + VkRenderPassCreateInfo2 info = { + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2, .pNext = nullptr, .attachmentCount = (uint32)attachments.size(), .pAttachments = attachments.data(), @@ -121,7 +199,7 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout _layout, Gfx .pDependencies = &dependency, }; - VK_CHECK(vkCreateRenderPass(graphics->getDevice(), &info, nullptr, &renderPass)); + VK_CHECK(vkCreateRenderPass2(graphics->getDevice(), &info, nullptr, &renderPass)); } RenderPass::~RenderPass() diff --git a/src/Engine/Graphics/Vulkan/Texture.cpp b/src/Engine/Graphics/Vulkan/Texture.cpp index ca44bf4..130fec7 100644 --- a/src/Engine/Graphics/Vulkan/Texture.cpp +++ b/src/Engine/Graphics/Vulkan/Texture.cpp @@ -71,6 +71,13 @@ TextureBase::TextureBase(PGraphics graphics, VkImageViewType viewType, default: break; } + if ((usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) == 0) + { + usage = usage + | VK_IMAGE_USAGE_TRANSFER_DST_BIT + | VK_IMAGE_USAGE_TRANSFER_SRC_BIT + | VK_IMAGE_USAGE_SAMPLED_BIT; + } VkImageCreateInfo info = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .pNext = nullptr, @@ -86,10 +93,7 @@ TextureBase::TextureBase(PGraphics graphics, VkImageViewType viewType, .arrayLayers = arrayCount * layerCount, .samples = (VkSampleCountFlagBits)samples, .tiling = VK_IMAGE_TILING_OPTIMAL, - .usage = usage - | VK_IMAGE_USAGE_TRANSFER_DST_BIT - | VK_IMAGE_USAGE_TRANSFER_SRC_BIT - | VK_IMAGE_USAGE_SAMPLED_BIT, + .usage = usage, .sharingMode = VK_SHARING_MODE_EXCLUSIVE, .initialLayout = cast(layout), }; @@ -112,7 +116,7 @@ TextureBase::TextureBase(PGraphics graphics, VkImageViewType viewType, }; vkGetImageMemoryRequirements2(graphics->getDevice(), &reqInfo, &requirements); - allocation = pool->allocate(requirements, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, image); + allocation = pool->allocate(requirements, createInfo.memoryProps, image); vkBindImageMemory(graphics->getDevice(), image, allocation->getHandle(), allocation->getOffset()); } @@ -158,6 +162,10 @@ TextureBase::TextureBase(PGraphics graphics, VkImageViewType viewType, { changeLayout(Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); } + else if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) + { + changeLayout(Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + } else { changeLayout(Gfx::SE_IMAGE_LAYOUT_GENERAL); diff --git a/src/Engine/Graphics/Vulkan/Texture.h b/src/Engine/Graphics/Vulkan/Texture.h index 4c1a115..f8d7ee7 100644 --- a/src/Engine/Graphics/Vulkan/Texture.h +++ b/src/Engine/Graphics/Vulkan/Texture.h @@ -14,7 +14,18 @@ public: TextureBase(PGraphics graphics, VkImageViewType viewType, const TextureCreateInfo& createInfo, Gfx::QueueType& owner, VkImage existingImage = VK_NULL_HANDLE); virtual ~TextureBase(); - + uint32 getWidth() const + { + return width; + } + uint32 getHeight() const + { + return height; + } + uint32 getDepth() const + { + return depth; + } constexpr VkImage getImage() const { return image; @@ -78,6 +89,7 @@ protected: uint8 ownsImage; friend class Graphics; }; +DEFINE_REF(TextureBase) class Texture2D : public Gfx::Texture2D, public TextureBase { diff --git a/src/Engine/Graphics/Vulkan/Window.cpp b/src/Engine/Graphics/Vulkan/Window.cpp index 735de61..e5e8e79 100644 --- a/src/Engine/Graphics/Vulkan/Window.cpp +++ b/src/Engine/Graphics/Vulkan/Window.cpp @@ -101,7 +101,7 @@ void Window::beginFrame() { glfwPollEvents(); vkAcquireNextImageKHR(graphics->getDevice(), swapchain, std::numeric_limits::max(), imageAvailableSemaphores[currentSemaphoreIndex]->getHandle(), VK_NULL_HANDLE, ¤tImageIndex); - swapChainTextures[currentImageIndex]->changeLayout(Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + swapChainTextures[currentImageIndex]->changeLayout(Gfx::SE_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); graphics->getGraphicsCommands()->getCommands()->waitForSemaphore(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, imageAvailableSemaphores[currentSemaphoreIndex]); } @@ -299,7 +299,7 @@ void Window::createSwapChain() .imageColorSpace = format.colorSpace, .imageExtent = extent, .imageArrayLayers = 1, - .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE, .preTransform = capabilities.currentTransform, .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, @@ -322,7 +322,7 @@ void Window::createSwapChain() .layers = 1, .elements = 1, .samples = 1, - .usage = Gfx::SE_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + .usage = Gfx::SE_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | Gfx::SE_IMAGE_USAGE_TRANSFER_DST_BIT, }, swapChainImages[i]); imageAvailableSemaphores[i] = new Semaphore(graphics); renderingDoneSemaphores[i] = new Semaphore(graphics); diff --git a/src/Engine/Material/ShaderExpression.cpp b/src/Engine/Material/ShaderExpression.cpp index 11e56a4..c4cd6ec 100644 --- a/src/Engine/Material/ShaderExpression.cpp +++ b/src/Engine/Material/ShaderExpression.cpp @@ -223,7 +223,7 @@ void SamplerParameter::save(ArchiveBuffer& buffer) const void SamplerParameter::load(ArchiveBuffer& buffer) { ShaderParameter::load(buffer); - data = buffer.getGraphics()->createSampler({}); + data = buffer.getGraphics()->createSampler(SamplerCreateInfo{}); } CombinedTextureParameter::CombinedTextureParameter(std::string name, uint32 byteOffset, uint32 binding) diff --git a/src/Engine/Material/ShaderExpression.h b/src/Engine/Material/ShaderExpression.h index 109c2b2..0f4cc9f 100644 --- a/src/Engine/Material/ShaderExpression.h +++ b/src/Engine/Material/ShaderExpression.h @@ -31,8 +31,9 @@ struct ExpressionOutput void load(ArchiveBuffer& buffer); }; DECLARE_REF(ShaderExpression); -struct ShaderExpression +class ShaderExpression { +public: Map inputs; ExpressionOutput output; std::string key; diff --git a/src/Engine/Physics/PhysicsSystem.cpp b/src/Engine/Physics/PhysicsSystem.cpp index 851c537..7d660ea 100644 --- a/src/Engine/Physics/PhysicsSystem.cpp +++ b/src/Engine/Physics/PhysicsSystem.cpp @@ -1,5 +1,4 @@ #include "PhysicsSystem.h" -#include #include using namespace Seele; @@ -214,8 +213,9 @@ Array PhysicsSystem::integratePhysics(const Array& bo *xdot++ = result[i].torque.z; } }; - boost::numeric::odeint::stepper_rk4, float> stepper; - boost::numeric::odeint::integrate_const(stepper, dxdt, buffer, t0, tdelta, tdelta); + //TODO + //boost::numeric::odeint::runge_kutta4, float> stepper; + //boost::numeric::odeint::integrate_const(stepper, dxdt, buffer, t0, tdelta, tdelta); deserializeArray(result, buffer); return result; } diff --git a/src/Engine/Physics/PhysicsSystem.h b/src/Engine/Physics/PhysicsSystem.h index c39566b..d71ecab 100644 --- a/src/Engine/Physics/PhysicsSystem.h +++ b/src/Engine/Physics/PhysicsSystem.h @@ -17,24 +17,24 @@ public: private: struct Body { - entt::entity id; - float inverseMass; - Vector centerOfMass; - Matrix3 iBody, iBodyInv; - Vector scale; + entt::entity id = entt::entity(); + float inverseMass = 0.0f; + Vector centerOfMass = Vector(); + Matrix3 iBody = Matrix3(), iBodyInv = Matrix3(); + Vector scale = Vector(); - Vector x; - Quaternion q; - Vector P; - Vector L; + Vector x = Vector(); + Quaternion q = Quaternion(); + Vector P = Vector(); + Vector L = Vector(); - Matrix3 iInv; - Matrix3 R; - Vector v; - Vector omega; - Vector force; - Vector torque; - Matrix4 matrix; + Matrix3 iInv = Matrix3(); + Matrix3 R = Matrix3(); + Vector v = Vector(); + Vector omega = Vector(); + Vector force = Vector(); + Vector torque = Vector(); + Matrix4 matrix = Matrix4(); Vector ptVelocity(Vector p) const {return v + glm::cross(omega, p - x + centerOfMass);} void updateMatrix() { Matrix4 scaleMatrix = glm::scale(Matrix4(1), scale); diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..c2c2a96 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,15 @@ +{ + "dependencies": [ + "assimp", + "entt", + "stb", + "dp-thread-pool", + "entt", + "freetype", + "glfw3", + "glm", + "ktx", + "nlohmann-json", + "shader-slang" + ] +} \ No newline at end of file