diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b0b2fd..574755b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,9 @@ find_package(assimp REQUIRED) find_package(JSON REQUIRED) find_package(GLFW REQUIRED) find_package(SPIRV REQUIRED) +find_package(GLM REQUIRED) +find_package(STB REQUIRED) +find_package(SLang REQUIRED) include_directories(${GLM_INCLUDE_DIRS}) include_directories(${STB_INCLUDE_DIRS}) @@ -58,18 +61,20 @@ include_directories(${JSON_INCLUDE_DIRS}) include_directories(${SPIRV_INCLUDE_DIRS}) include_directories(${ENGINE_ROOT}) include_directories(src/Engine) -add_definitions(${GLM_DEFINITIONS}) add_definitions(${Vulkan_DEFINITIONS}) add_definitions(${Boost_DEFINITIONS}) add_compile_definitions(GLFW_WINDOWS) if(WIN32) add_compile_definitions(USE_EXTENSIONS) endif() +if(CMAKE_DEBUG_POSTFIX) + add_compile_definitions(ENABLE_VALIDATION) +endif() add_executable(SeeleEngine "") target_link_libraries(SeeleEngine ${Vulkan_LIBRARY}) target_link_libraries(SeeleEngine ${Boost_LIBRARIES}) target_link_libraries(SeeleEngine ${GLFW_LIBRARIES}) -target_link_libraries(SeeleEngine ${SLANG_LIBRARY}) +target_link_libraries(SeeleEngine ${SLANG_LIBRARIES}) target_link_libraries(SeeleEngine ${ASSIMP_LIBRARIES}) target_link_libraries(SeeleEngine ${JSON_LIBRARY}) target_link_libraries(SeeleEngine ${SPIRV_LIBRARIES}) @@ -105,8 +110,7 @@ add_subdirectory(test/) add_custom_target(copy-runtime-files ALL COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/res $ - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SLANG_ROOT}/${SLANG_BINARY} $ - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SLANG_ROOT}/${SLANG_GLSLANG} $ + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SLANG_BINARY} $ + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SLANG_GLSLANG} $ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${GLFW_BINARY} $ - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${ASSIMP_BINARY} $ DEPENDS SeeleEngine) \ No newline at end of file diff --git a/cmake-variants.json b/cmake-variants.json index 31d9d3a..32d3500 100644 --- a/cmake-variants.json +++ b/cmake-variants.json @@ -14,7 +14,10 @@ "release": { "short": "Release", "long": "Optimize binary for speed", - "buildType": "Release" + "buildType": "Release", + "settings": { + "CMAKE_DEBUG_POSTFIX": "" + } } } }, diff --git a/cmake/FindAssimp.cmake b/cmake/FindAssimp.cmake index 320418c..8527d0e 100644 --- a/cmake/FindAssimp.cmake +++ b/cmake/FindAssimp.cmake @@ -26,17 +26,10 @@ if (WIN32) # Find library files find_library( ASSIMP_LIBRARY - NAMES assimp-vc${MSVC_TOOLSET_VERSION}-mt${CMAKE_DEBUG_POSTFIX} + NAMES assimp-vc${MSVC_TOOLSET_VERSION}-mt${CMAKE_DEBUG_POSTFIX}.lib PATHS $ENV{PROGRAMFILES}/lib ${ASSIMP_ROOT}/lib/) - - find_file( - ASSIMP_BINARY - NAMES assimp-vc${MSVC_TOOLSET_VERSION}-mt${CMAKE_DEBUG_POSTFIX}.dll - PATHS - $ENV{PROGRAMFILES}/bin - ${ASSIMP_ROOT}/bin/) else() # Find include files find_path( @@ -62,23 +55,10 @@ else() /opt/local/lib ${ASSIMP_ROOT}/lib DOC "The Assimp library") - - find_file( - ASSIMP_BINARY - NAMES assimp.so - PATHS - /usr/bin64 - /usr/bin - /usr/local/bin64 - /usr/local/bin - /sw/bin - /opt/local/bin - ${ASSIMP_ROOT}/lib - DOC "The Assimp binary") endif() # Handle REQUIRD argument, define *_FOUND variable -find_package_handle_standard_args(assimp DEFAULT_MSG ASSIMP_INCLUDE_DIR ASSIMP_LIBRARY ASSIMP_BINARY) +find_package_handle_standard_args(assimp DEFAULT_MSG ASSIMP_INCLUDE_DIR ASSIMP_LIBRARY) # Define GLFW_LIBRARIES and GLFW_INCLUDE_DIRS if (ASSIMP_FOUND) diff --git a/cmake/FindGLM.cmake b/cmake/FindGLM.cmake new file mode 100644 index 0000000..d69f294 --- /dev/null +++ b/cmake/FindGLM.cmake @@ -0,0 +1,53 @@ +# +# Find GLM +# +# Try to find GLM library. +# This module defines the following variables: +# - GLM_INCLUDE_DIRS +# - GLM_LIBRARIES +# - GLM_FOUND +# +# The following variables can be set as arguments for the module. +# - GLM_ROOT : Root library directory of GLM +# - GLM_USE_STATIC_LIBS : Specifies to use static version of GLM library (Windows only) +# +# References: +# - https://github.com/progschj/OpenGL-Examples/blob/master/cmake_modules/FindGLM.cmake +# - https://bitbucket.org/Ident8/cegui-mk2-opengl3-renderer/src/befd47200265/cmake/FindGLM.cmake +# + +# Additional modules +include(FindPackageHandleStandardArgs) + +if (WIN32) + # Find include files + find_path( + GLM_INCLUDE_DIR + NAMES GLM/glm.hpp + PATHS + $ENV{PROGRAMFILES}/include + ${GLM_ROOT} + DOC "The directory where GLM/glm.h resides") +else() + # Find include files + find_path( + GLM_INCLUDE_DIR + NAMES GLM/glfw.h + PATHS + /usr/include + /usr/local/include + /sw/include + /opt/local/include + DOC "The directory where GLM/glm.h resides") +endif() + +# Handle REQUIRD argument, define *_FOUND variable +find_package_handle_standard_args(GLM DEFAULT_MSG GLM_INCLUDE_DIR) + +# Define GLM_LIBRARIES and GLM_INCLUDE_DIRS +if (GLM_FOUND) + set(GLM_INCLUDE_DIRS ${GLM_INCLUDE_DIR}) +endif() + +# Hide some variables +mark_as_advanced(GLM_INCLUDE_DIR) \ No newline at end of file diff --git a/cmake/FindSLANG.cmake b/cmake/FindSLANG.cmake new file mode 100644 index 0000000..e381421 --- /dev/null +++ b/cmake/FindSLANG.cmake @@ -0,0 +1,103 @@ +# +# Find SLANG +# +# Try to find SLANG library. +# This module defines the following variables: +# - SLANG_INCLUDE_DIRS +# - SLANG_LIBRARIES +# - SLANG_FOUND +# +# The following variables can be set as arguments for the module. +# - SLANG_ROOT : Root library directory of SLANG +# +# References: +# - https://github.com/progschj/OpenGL-Examples/blob/master/cmake_modules/FindSLANG.cmake +# - https://bitbucket.org/Ident8/cegui-mk2-opengl3-renderer/src/befd47200265/cmake/FindSLANG.cmake +# + +# Additional modules +include(FindPackageHandleStandardArgs) + +if (WIN32) + set(SLANG_BINARY_PATH ${SLANG_ROOT}/bin/windows-${CMAKE_PLATFORM}/release/) + # Find include files + find_path( + SLANG_INCLUDE_DIR + NAMES slang.h + PATHS + $ENV{PROGRAMFILES}/include + ${SLANG_ROOT} + DOC "The directory where SLANG/slang.h resides") + + # Find library files + find_library( + SLANG_LIBRARY + NAMES slang.lib + PATHS + $ENV{PROGRAMFILES}/lib + ${SLANG_BINARY_PATH}) + + find_file( + SLANG_BINARY + NAMES slang.dll + PATHS + ${SLANG_BINARY_PATH}) + + find_file( + SLANG_GLSLANG + NAMES slang-glslang.dll + PATHS + ${SLANG_BINARY_PATH}) +else() + # Find include files + find_path( + SLANG_INCLUDE_DIR + NAMES slang.h + PATHS + /usr/include + /usr/local/include + /sw/include + /opt/local/include + DOC "The directory where GL/glfw.h resides") + + # Find library files + # Try to use static libraries + find_library( + SLANG_LIBRARY + NAMES slang.a + PATHS + /usr/lib64 + /usr/lib + /usr/local/lib64 + /usr/local/lib + /sw/lib + /opt/local/lib + ${SLANG_ROOT}/lib + DOC "The SLANG library") + + find_file( + SLANG_BINARY + NAMES slang.so + PATHS + /usr/lib64 + /usr/lib + /usr/local/lib64 + /usr/local/lib + /sw/lib + /opt/local/lib + ${SLANG_ROOT}/lib + ) +endif() + +# Handle REQUIRD argument, define *_FOUND variable +find_package_handle_standard_args(SLANG DEFAULT_MSG SLANG_INCLUDE_DIR SLANG_LIBRARY SLANG_BINARY SLANG_GLSLANG) + +# Define SLANG_LIBRARIES and SLANG_INCLUDE_DIRS +if (SLANG_FOUND) + set(SLANG_BINARIES ${SLANG_BINARY} ${SLANG_GLSLANG}) + set(SLANG_LIBRARIES ${SLANG_LIBRARY}) + set(SLANG_INCLUDE_DIRS ${SLANG_INCLUDE_DIR}) +endif() + +# Hide some variables +mark_as_advanced(SLANG_INCLUDE_DIR SLANG_LIBRARY SLANG_GLSLANG SLANG_BINARY) \ No newline at end of file diff --git a/cmake/FindSTB.cmake b/cmake/FindSTB.cmake new file mode 100644 index 0000000..21260a9 --- /dev/null +++ b/cmake/FindSTB.cmake @@ -0,0 +1,53 @@ +# +# Find STB +# +# Try to find STB library. +# This module defines the following variables: +# - STB_INCLUDE_DIRS +# - STB_LIBRARIES +# - STB_FOUND +# +# The following variables can be set as arguments for the module. +# - STB_ROOT : Root library directory of STB +# - STB_USE_STATIC_LIBS : Specifies to use static version of STB library (Windows only) +# +# References: +# - https://github.com/progschj/OpenGL-Examples/blob/master/cmake_modules/FindSTB.cmake +# - https://bitbucket.org/Ident8/cegui-mk2-opengl3-renderer/src/befd47200265/cmake/FindSTB.cmake +# + +# Additional modules +include(FindPackageHandleStandardArgs) + +if (WIN32) + # Find include files + find_path( + STB_INCLUDE_DIR + NAMES stb.h + PATHS + $ENV{PROGRAMFILES}/include + ${STB_ROOT} + DOC "The directory where STB/stb.h resides") +else() + # Find include files + find_path( + STB_INCLUDE_DIR + NAMES stb.h + PATHS + /usr/include + /usr/local/include + /sw/include + /opt/local/include + DOC "The directory where STB/stb.h resides") +endif() + +# Handle REQUIRD argument, define *_FOUND variable +find_package_handle_standard_args(STB DEFAULT_MSG STB_INCLUDE_DIR) + +# Define STB_LIBRARIES and STB_INCLUDE_DIRS +if (STB_FOUND) + set(STB_INCLUDE_DIRS ${STB_INCLUDE_DIR}) +endif() + +# Hide some variables +mark_as_advanced(STB_INCLUDE_DIR) \ No newline at end of file diff --git a/cmake/SuperBuild.cmake b/cmake/SuperBuild.cmake index 26e4601..3f0cb29 100644 --- a/cmake/SuperBuild.cmake +++ b/cmake/SuperBuild.cmake @@ -7,8 +7,9 @@ list(APPEND DEPENDENCIES assimp) set(ASSIMP_BUILD_TESTS OFF CACHE INTERNAL "") set(ASSIMP_BUILD_ASSIMP_TOOLS OFF CACHE INTERNAL "") set(ASSIMP_INSTALL OFF CACHE INTERNAL "") +set(BUILD_SHARED_LIBS ON CACHE INTERNAL "") -add_subdirectory(${ASSIMP_ROOT} ${}) +add_subdirectory(${ASSIMP_ROOT} ${ASSIMP_ROOT}) target_compile_definitions(assimp PRIVATE _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING) #-------------BOOST---------------- @@ -29,25 +30,13 @@ ExternalProject_Add(boost list (APPEND EXTRA_CMAKE_ARGS -DBoost_NO_SYSTEM_PATHS=ON) -#----------------GLM----------------------- -list(APPEND DEPENDENCIES glm) -ExternalProject_Add(glm - SOURCE_DIR ${GLM_ROOT} - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "") - -list(APPEND EXTRA_CMAKE_ARGS - -DGLM_INCLUDE_DIRS=${GLM_ROOT} - ) - #--------------------JSON------------------ list(APPEND DEPENDENCIES nlohmann_json) set(JSON_MultipleHeaders ON CACHE INTERNAL "") set(JSON_BuildTests OFF CACHE INTERNAL "") set(JSON_Install OFF CACHE INTERNAL "") -add_subdirectory(${JSON_ROOT}) +add_subdirectory(${JSON_ROOT} ${JSON_ROOT}) #--------------GLFW------------------------------ list(APPEND DEPENDENCIES glfw) @@ -59,10 +48,6 @@ set(GLFW_BUILD_INSTALL OFF CACHE BOOL "GLFW lib only" ) add_subdirectory(${GLFW_ROOT} ${GLFW_ROOT}) -#---------------STB_IMAGE------------------------ -list(APPEND EXTRA_CMAKE_ARGS - -DSTB_INCLUDE_DIRS=${STB_ROOT}) - #--------------SLang------------------------------ list(APPEND DEPENDENCIES slang) string(TOLOWER release_${CMAKE_PLATFORM} SLANG_CONFIG) @@ -74,9 +59,6 @@ ExternalProject_Add(slang BUILD_COMMAND msbuild -p:Configuration=Release -p:WarningLevel=0 -p:Platform=${CMAKE_PLATFORM} -p:WindowsTargetPlatformVersion=10.0 ${SLANG_ROOT}/source/slang/slang.vcxproj INSTALL_COMMAND "") - string(TOLOWER bin/windows-${CMAKE_PLATFORM}/Release/slang.dll SLANG_BINARY) - string(TOLOWER bin/windows-${CMAKE_PLATFORM}/Release/slang-glslang.dll SLANG_GLSLANG) - string(TOLOWER bin/windows-${CMAKE_PLATFORM}/Release/slang.lib SLANG_LIB_PATH) set(SLANG_LIB_PATH ${SLANG_ROOT}/${SLANG_LIB_PATH}) elseif(UNIX) ExternalProject_Add(slang @@ -91,13 +73,6 @@ ExternalProject_Add(slang set(SLANG_LIB_PATH) endif() -list(APPEND EXTRA_CMAKE_ARGS - -DSLANG_INCLUDE_DIRS=${EXTERNAL_ROOT}/slang - -DSLANG_LIBRARY=${SLANG_LIB_PATH} - -DSLANG_BINARY=${SLANG_BINARY} - -DSLANG_GLSLANG=${SLANG_GLSLANG}) - - #----------------SPIR-V-CROSS-------------------- list(APPEND DEPENDENCIES spirv-cross-reflect) set(SPIRV_CROSS_ENABLE_HLSL OFF CACHE BOOL "") diff --git a/src/Engine/Asset/MeshLoader.cpp b/src/Engine/Asset/MeshLoader.cpp index d48d42f..e46b4ab 100644 --- a/src/Engine/Asset/MeshLoader.cpp +++ b/src/Engine/Asset/MeshLoader.cpp @@ -146,7 +146,7 @@ VertexStreamComponent createVertexStream(uint32 size, aiVector2D* sourceData, Gf Gfx::PVertexBuffer vertexBuffer = graphics->createVertexBuffer(vbInfo); return VertexStreamComponent(vertexBuffer, 0, vbInfo.vertexSize, Gfx::SE_FORMAT_R32G32_SFLOAT); } -void MeshLoader::loadGlobalMeshes(const aiScene* scene, Array& globalMeshes, Array materials, Gfx::PGraphics graphics) +void MeshLoader::loadGlobalMeshes(const aiScene* scene, Array& globalMeshes, const Array& materials, Gfx::PGraphics graphics) { for (uint32 meshIndex = 0; meshIndex < scene->mNumMeshes; ++meshIndex) { @@ -176,7 +176,7 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, Array& globalMesh { //data.colorComponent = createVertexStream(mesh->mNumVertices, mesh->mColors[0], graphics); } - vertexShaderInput->setData(data); + vertexShaderInput->setData(std::move(data)); vertexShaderInput->init(graphics); Array indices(mesh->mNumFaces * 3); diff --git a/src/Engine/Asset/MeshLoader.h b/src/Engine/Asset/MeshLoader.h index cf30454..dff334c 100644 --- a/src/Engine/Asset/MeshLoader.h +++ b/src/Engine/Asset/MeshLoader.h @@ -22,7 +22,7 @@ public: private: void loadMaterials(const aiScene* scene, Array& globalMaterials, Gfx::PGraphics graphics); void loadTextures(const aiScene* scene, Gfx::PGraphics graphics, const std::filesystem::path& meshPath); - void loadGlobalMeshes(const aiScene* scene, Array& globalMeshes, Array materials, Gfx::PGraphics graphics); + void loadGlobalMeshes(const aiScene* scene, Array& globalMeshes, const Array& materials, Gfx::PGraphics graphics); void convertAssimpARGB(unsigned char* dst, aiTexel* src, uint32 numPixels); void import(const std::filesystem::path& path); diff --git a/src/Engine/Containers/Array.h b/src/Engine/Containers/Array.h index 135e28f..2e5ccca 100644 --- a/src/Engine/Containers/Array.h +++ b/src/Engine/Containers/Array.h @@ -54,8 +54,8 @@ namespace Seele { _data = new T[other.allocated]; assert(_data != nullptr); - std::memcpy(_data, other._data, sizeof(T) * allocated); refreshIterators(); + std::copy(other.begin(), other.end(), beginIt); } Array(Array &&other) noexcept : allocated(std::move(other.allocated)), arraySize(std::move(other.arraySize)) @@ -68,7 +68,7 @@ namespace Seele } Array &operator=(const Array &other) noexcept { - if (*this != other) + if (this != &other) { if (_data != nullptr) { @@ -77,14 +77,14 @@ namespace Seele allocated = other.allocated; arraySize = other.arraySize; _data = new T[other.allocated]; - std::memcpy(_data, other._data, sizeof(T) * allocated); refreshIterators(); + std::copy(other.begin(), other.end(), beginIt); } return *this; } Array &operator=(Array &&other) noexcept { - if (*this != other) + if (this != &other) { if (_data != nullptr) { @@ -94,6 +94,7 @@ namespace Seele arraySize = std::move(other.arraySize); _data = other._data; other._data = nullptr; + refreshIterators(); } return *this; } diff --git a/src/Engine/Containers/List.h b/src/Engine/Containers/List.h index cd43d40..8d7ce8d 100644 --- a/src/Engine/Containers/List.h +++ b/src/Engine/Containers/List.h @@ -20,12 +20,64 @@ public: tail = nullptr; beginIt = Iterator(root); endIt = Iterator(tail); - size = 0; + _size = 0; + } + List(const List& other) + { + //TODO: improve + for(const auto& it : other) + { + add(it); + } + } + List(List&& other) + : root(std::move(other.root)) + , tail(std::move(other.tail)) + , beginIt(std::move(other.beginIt)) + , endIt(std::move(other.endIt)) + , _size(std::move(other._size)) + { } ~List() { clear(); } + List& operator=(const List& other) + { + if(this != &other) + { + if(root != nullptr) + { + delete root; + } + if(tail != nullptr) + { + delete tail; + } + _size = 0; + for(const auto& it : other) + { + add(it); + } + } + return *this; + } + List& operator=(List&& other) + { + if(this != &other) + { + if(root != nullptr) + { + clear(); + } + root = other.root; + tail = other.tail; + beginIt = other.beginIt; + endIt = other.endIt; + _size = other._size; + } + return *this; + } template class IteratorBase { @@ -44,6 +96,29 @@ public: : node(i.node) { } + IteratorBase(IteratorBase&& i) + : node(std::move(i.node)) + { + } + ~IteratorBase() + { + } + IteratorBase& operator=(const IteratorBase& other) + { + if(this != &other) + { + node = other.node; + } + return *this; + } + IteratorBase& operator=(IteratorBase&& other) + { + if(this != &other) + { + node = std::move(other.node); + } + return *this; + } reference operator*() const { return node->data; @@ -129,7 +204,7 @@ public: Iterator insertedElement(tail); tail = newTail; refreshIterators(); - size++; + _size++; return insertedElement; } Iterator add(T&& value) @@ -147,12 +222,12 @@ public: Iterator insertedElement(tail); tail = newTail; refreshIterators(); - size++; + _size++; return insertedElement; } Iterator remove(Iterator pos) { - size--; + _size--; Node *prev = pos.node->prev; Node *next = pos.node->next; if (prev == nullptr) @@ -177,7 +252,7 @@ public: } Iterator insert(Iterator pos, const T &value) { - size++; + _size++; if (root == nullptr) { root = new Node(); @@ -212,20 +287,28 @@ public: } bool empty() { - return size == 0; + return _size == 0; } - uint32 length() + uint32 size() { - return size; + return _size; } Iterator begin() { return beginIt; } + const Iterator begin() const + { + return beginIt; + } Iterator end() { return endIt; } + const Iterator end() const + { + return endIt; + } private: void refreshIterators() @@ -237,6 +320,6 @@ private: Node *tail; Iterator beginIt; Iterator endIt; - uint32 size; + uint32 _size; }; } // namespace Seele \ No newline at end of file diff --git a/src/Engine/Containers/Map.h b/src/Engine/Containers/Map.h index 84db3ef..52c557b 100644 --- a/src/Engine/Containers/Map.h +++ b/src/Engine/Containers/Map.h @@ -27,12 +27,28 @@ private: Pair pair; Node *leftChild; Node *rightChild; + Node() + : leftChild(nullptr), rightChild(nullptr), pair(K(), V()) + { + } Node(const K &key) : leftChild(nullptr), rightChild(nullptr), pair(key, V()) { } - Node() - : leftChild(nullptr), rightChild(nullptr), pair(K(), V()) + Node(const Node& other) + : pair(other.pair.key, other.pair.value) + { + if(other.leftChild != nullptr) + { + leftChild = new Node(*other.leftChild); + } + if(other.rightChild != nullptr) + { + rightChild = new Node(*other.rightChild); + } + } + Node(Node&& other) + : leftChild(std::move(other.leftChild)), rightChild(std::move(other.rightChild)) { } ~Node() @@ -46,6 +62,45 @@ private: delete rightChild; } } + Node& operator=(const Node& other) + { + if(this != &other) + { + if(leftChild != nullptr) + { + delete leftChild; + } + if(rightChild != nullptr) + { + delete rightChild; + } + if(other.leftChild != nullptr) + { + leftChild = new Node(*other.leftChild); + } + if(other.rightChild != nullptr) + { + rightChild = new Node(*other.rightChild); + } + } + } + Node& operator=(Node&& other) + { + if(this != &other) + { + if(leftChild != nullptr) + { + delete leftChild; + } + if(rightChild != nullptr) + { + delete rightChild; + } + leftChild = std::move(other.leftChild); + rightChild = std::move(other.rightChild); + } + return *this; + } }; public: @@ -53,10 +108,48 @@ public: : root(nullptr), _size(0) { } + Map(const Map& other) + : root(new Node(*other.root)), _size(other._size) + { + refreshIterators(); + } + Map(Map&& other) + : root(std::move(other.root)), _size(other._size) + { + refreshIterators(); + } ~Map() { delete root; } + Map& operator=(const Map& other) + { + if(this != &other) + { + if(root != nullptr) + { + delete root; + } + root = new Node(*other.root); + _size = other.size; + refreshIterators(); + } + return *this; + } + Map& operator=(Map&& other) + { + if(this != &other) + { + if(root != nullptr) + { + delete root; + } + root = new Node(std::move(*other.root)); + _size = std::move(other._size); + refreshIterators(); + } + return *this; + } class Iterator { public: @@ -78,6 +171,28 @@ public: : node(i.node), traversal(i.traversal) { } + Iterator(Iterator&& i) + : node(std::move(i.node)), traversal(std::move(i.traversal)) + { + } + Iterator& operator=(const Iterator& other) + { + if(this != &other) + { + node = other.node; // No copy, since no ownership + traversal = other.traversal; + } + return *this; + } + Iterator& operator=(Iterator&& other) + { + if(this != &other) + { + node = std::move(other.node); + traversal = std::move(other.traversal); + } + return *this; + } reference operator*() const { return node->pair; diff --git a/src/Engine/Graphics/GraphicsResources.h b/src/Engine/Graphics/GraphicsResources.h index f0d3b52..28d856f 100644 --- a/src/Engine/Graphics/GraphicsResources.h +++ b/src/Engine/Graphics/GraphicsResources.h @@ -6,9 +6,9 @@ #include "MeshBatch.h" #include -#define ENABLE_VALIDATION -#ifdef DEBUG +#ifndef ENABLE_VALIDATION +#define ENABLE_VALIDATION 0 #endif namespace Seele @@ -483,7 +483,7 @@ public: virtual void setViewport(Gfx::PViewport viewport) = 0; virtual void bindPipeline(Gfx::PGraphicsPipeline pipeline) = 0; virtual void bindDescriptor(Gfx::PDescriptorSet set) = 0; - virtual void bindDescriptor(Array sets) = 0; + virtual void bindDescriptor(const Array& sets) = 0; virtual void bindVertexBuffer(const Array& streams) = 0; virtual void bindIndexBuffer(Gfx::PIndexBuffer indexBuffer) = 0; virtual void draw(const MeshBatchElement& data) = 0; diff --git a/src/Engine/Graphics/RenderPass/BasePass.cpp b/src/Engine/Graphics/RenderPass/BasePass.cpp index 22a5a7f..d9ae906 100644 --- a/src/Engine/Graphics/RenderPass/BasePass.cpp +++ b/src/Engine/Graphics/RenderPass/BasePass.cpp @@ -10,6 +10,7 @@ BasePassMeshProcessor::BasePassMeshProcessor(const PScene scene, Gfx::PViewport : MeshProcessor(scene, graphics) , target(viewport) , translucentBasePass(translucentBasePass) + , cachedPrimitiveIndex(0) { } @@ -23,7 +24,7 @@ void BasePassMeshProcessor::addMeshBatch( const Gfx::PRenderPass renderPass, Gfx::PPipelineLayout pipelineLayout, Gfx::PDescriptorLayout primitiveLayout, - Array descriptorSets, + Array& descriptorSets, int32 staticMeshId) { const PMaterialAsset material = batch.material; @@ -42,13 +43,12 @@ void BasePassMeshProcessor::addMeshBatch( } Gfx::PRenderCommand renderCommand = graphics->createRenderCommand(); renderCommand->setViewport(target); - uint32 primitiveDescriptorIndex = 0; for(uint32 i = 0; i < batch.elements.size(); ++i) { pipelineLayout->addDescriptorLayout(2, material->getRenderMaterial()->getDescriptorLayout()); pipelineLayout->create(); descriptorSets[2] = material->getDescriptor(); - descriptorSets[3] = cachedPrimitiveSets[primitiveDescriptorIndex++]; + descriptorSets[3] = cachedPrimitiveSets[cachedPrimitiveIndex++]; buildMeshDrawCommand(batch, // primitiveComponent, renderPass, @@ -74,6 +74,7 @@ void BasePassMeshProcessor::clearCommands() { renderCommands.clear(); cachedPrimitiveSets.clear(); + cachedPrimitiveIndex = 0; } BasePass::BasePass(const PScene scene, Gfx::PGraphics graphics, Gfx::PViewport viewport, PCameraActor source) @@ -140,7 +141,6 @@ void BasePass::beginFrame() uniformUpdate.size = sizeof(LightEnv); uniformUpdate.data = (uint8*)&scene->getLightEnvironment(); lightUniform->updateContents(uniformUpdate); - descriptorSets[0]->beginFrame(); descriptorSets[0]->updateBuffer(0, lightUniform); descriptorSets[0]->writeChanges(); @@ -155,7 +155,6 @@ void BasePass::beginFrame() uniformUpdate.size = sizeof(ScreenToViewParameter); uniformUpdate.data = (uint8*)&screenToViewParams; screenToViewParamBuffer->updateContents(uniformUpdate); - descriptorSets[1]->beginFrame(); descriptorSets[1]->updateBuffer(0, viewParamBuffer); descriptorSets[1]->updateBuffer(1, screenToViewParamBuffer); descriptorSets[1]->writeChanges(); diff --git a/src/Engine/Graphics/RenderPass/BasePass.h b/src/Engine/Graphics/RenderPass/BasePass.h index 622d52a..d53b43e 100644 --- a/src/Engine/Graphics/RenderPass/BasePass.h +++ b/src/Engine/Graphics/RenderPass/BasePass.h @@ -16,13 +16,14 @@ public: const Gfx::PRenderPass renderPass, Gfx::PPipelineLayout pipelineLayout, Gfx::PDescriptorLayout primitiveLayout, - Array descriptorSets, + Array& descriptorSets, int32 staticMeshId = -1) override; Array getRenderCommands(); void clearCommands(); private: Array renderCommands; Array cachedPrimitiveSets; + uint32 cachedPrimitiveIndex; Gfx::PViewport target; uint8 translucentBasePass; }; diff --git a/src/Engine/Graphics/RenderPass/MeshProcessor.cpp b/src/Engine/Graphics/RenderPass/MeshProcessor.cpp index 9ff9bbd..3cad0ac 100644 --- a/src/Engine/Graphics/RenderPass/MeshProcessor.cpp +++ b/src/Engine/Graphics/RenderPass/MeshProcessor.cpp @@ -21,7 +21,7 @@ void MeshProcessor::buildMeshDrawCommand( const Gfx::PRenderPass renderPass, Gfx::PPipelineLayout pipelineLayout, Gfx::PRenderCommand drawCommand, - Array descriptors, + const Array& descriptors, Gfx::PVertexShader vertexShader, Gfx::PControlShader controlShader, Gfx::PEvaluationShader evaluationShader, diff --git a/src/Engine/Graphics/RenderPass/MeshProcessor.h b/src/Engine/Graphics/RenderPass/MeshProcessor.h index 243e3fe..903793c 100644 --- a/src/Engine/Graphics/RenderPass/MeshProcessor.h +++ b/src/Engine/Graphics/RenderPass/MeshProcessor.h @@ -20,7 +20,7 @@ protected: const Gfx::PRenderPass renderPass, Gfx::PPipelineLayout pipelineLayout, Gfx::PDescriptorLayout primitiveLayout, - Array descriptorSets, + Array& descriptorSets, int32 staticMeshId = -1) = 0; void buildMeshDrawCommand( const MeshBatch& meshBatch, @@ -28,7 +28,7 @@ protected: const Gfx::PRenderPass renderPass, Gfx::PPipelineLayout pipelineLayout, Gfx::PRenderCommand drawCommand, - Array descriptors, + const Array& descriptors, Gfx::PVertexShader vertexShader, Gfx::PControlShader controlShader, Gfx::PEvaluationShader evaluationShader, diff --git a/src/Engine/Graphics/StaticMeshVertexInput.cpp b/src/Engine/Graphics/StaticMeshVertexInput.cpp index 649e9bf..e1343d4 100644 --- a/src/Engine/Graphics/StaticMeshVertexInput.cpp +++ b/src/Engine/Graphics/StaticMeshVertexInput.cpp @@ -61,9 +61,9 @@ void StaticMeshVertexInput::init(Gfx::PGraphics graphics) initDeclaration(graphics, elements); } -void StaticMeshVertexInput::setData(StaticMeshDataType data) +void StaticMeshVertexInput::setData(StaticMeshDataType&& data) { - this->data = data; + this->data = std::move(data); } IMPLEMENT_VERTEX_INPUT_TYPE(StaticMeshVertexInput, "StaticMeshVertexInput"); \ No newline at end of file diff --git a/src/Engine/Graphics/StaticMeshVertexInput.h b/src/Engine/Graphics/StaticMeshVertexInput.h index 47dee25..acfe591 100644 --- a/src/Engine/Graphics/StaticMeshVertexInput.h +++ b/src/Engine/Graphics/StaticMeshVertexInput.h @@ -21,7 +21,7 @@ public: StaticMeshVertexInput(std::string name); virtual ~StaticMeshVertexInput(); virtual void init(Gfx::PGraphics graphics) override; - void setData(StaticMeshDataType data); + void setData(StaticMeshDataType&& data); private: StaticMeshDataType data; }; diff --git a/src/Engine/Graphics/Vulkan/VulkanCommandBuffer.cpp b/src/Engine/Graphics/Vulkan/VulkanCommandBuffer.cpp index 2dee623..92157c4 100644 --- a/src/Engine/Graphics/Vulkan/VulkanCommandBuffer.cpp +++ b/src/Engine/Graphics/Vulkan/VulkanCommandBuffer.cpp @@ -177,7 +177,7 @@ void SecondaryCmdBuffer::bindDescriptor(Gfx::PDescriptorSet descriptorSet) VkDescriptorSet setHandle = descriptorSet.cast()->getHandle(); vkCmdBindDescriptorSets(handle, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->getLayout(), descriptorSet->getSetIndex(), 1, &setHandle, 0, nullptr); } -void SecondaryCmdBuffer::bindDescriptor(Array descriptorSets) +void SecondaryCmdBuffer::bindDescriptor(const Array& descriptorSets) { VkDescriptorSet* sets = new VkDescriptorSet[descriptorSets.size()]; for(uint32 i = 0; i < descriptorSets.size(); ++i) diff --git a/src/Engine/Graphics/Vulkan/VulkanCommandBuffer.h b/src/Engine/Graphics/Vulkan/VulkanCommandBuffer.h index ca59b39..0f7f8e5 100644 --- a/src/Engine/Graphics/Vulkan/VulkanCommandBuffer.h +++ b/src/Engine/Graphics/Vulkan/VulkanCommandBuffer.h @@ -80,7 +80,7 @@ public: virtual void setViewport(Gfx::PViewport viewport) override; virtual void bindPipeline(Gfx::PGraphicsPipeline pipeline) override; virtual void bindDescriptor(Gfx::PDescriptorSet descriptorSet) override; - virtual void bindDescriptor(Array descriptorSets) override; + virtual void bindDescriptor(const Array& descriptorSets) override; virtual void bindVertexBuffer(const Array& streams) override; virtual void bindIndexBuffer(Gfx::PIndexBuffer indexBuffer) override; virtual void draw(const MeshBatchElement& data) override; diff --git a/src/Engine/Graphics/Vulkan/VulkanDescriptorSets.cpp b/src/Engine/Graphics/Vulkan/VulkanDescriptorSets.cpp index e7ccf72..b9678f4 100644 --- a/src/Engine/Graphics/Vulkan/VulkanDescriptorSets.cpp +++ b/src/Engine/Graphics/Vulkan/VulkanDescriptorSets.cpp @@ -41,8 +41,6 @@ void DescriptorLayout::create() init::DescriptorSetLayoutCreateInfo(bindings.data(), bindings.size()); VK_CHECK(vkCreateDescriptorSetLayout(graphics->getDevice(), &createInfo, nullptr, &layoutHandle)); - std::cout << "creating descriptorlayout " << layoutHandle << std::endl; - allocator = new DescriptorAllocator(graphics, *this); boost::crc_32_type result; @@ -115,7 +113,6 @@ DescriptorSet::~DescriptorSet() void DescriptorSet::beginFrame() { - currentFrameSet = (currentFrameSet + 1) % Gfx::numFramesBuffered; } void DescriptorSet::endFrame() @@ -125,41 +122,39 @@ void DescriptorSet::endFrame() void DescriptorSet::updateBuffer(uint32_t binding, Gfx::PUniformBuffer uniformBuffer) { PUniformBuffer vulkanBuffer = uniformBuffer.cast(); - UniformBuffer* cachedBuffer = reinterpret_cast(cachedData[currentFrameSet][binding]); + UniformBuffer* cachedBuffer = reinterpret_cast(cachedData[Gfx::currentFrameIndex][binding]); if(vulkanBuffer->isDataEquals(cachedBuffer)) { return; } - VkDescriptorBufferInfo bufferInfo = init::DescriptorBufferInfo(vulkanBuffer->getHandle(), 0, vulkanBuffer->getSize()); - bufferInfos.add(bufferInfo); + bufferInfos.add(init::DescriptorBufferInfo(vulkanBuffer->getHandle(), 0, vulkanBuffer->getSize())); - VkWriteDescriptorSet writeDescriptor = init::WriteDescriptorSet(setHandle[currentFrameSet], VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, binding, &bufferInfos.back()); + VkWriteDescriptorSet writeDescriptor = init::WriteDescriptorSet(setHandle[Gfx::currentFrameIndex], VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, binding, &bufferInfos.back()); writeDescriptors.add(writeDescriptor); - cachedData[currentFrameSet][binding] = vulkanBuffer.getHandle(); + cachedData[Gfx::currentFrameIndex][binding] = vulkanBuffer.getHandle(); } void DescriptorSet::updateBuffer(uint32_t binding, Gfx::PStructuredBuffer uniformBuffer) { PStructuredBuffer vulkanBuffer = uniformBuffer.cast(); - StructuredBuffer* cachedBuffer = reinterpret_cast(cachedData[currentFrameSet][binding]); + StructuredBuffer* cachedBuffer = reinterpret_cast(cachedData[Gfx::currentFrameIndex][binding]); if(vulkanBuffer.getHandle() == cachedBuffer) { return; } - VkDescriptorBufferInfo bufferInfo = init::DescriptorBufferInfo(vulkanBuffer->getHandle(), 0, vulkanBuffer->getSize()); - bufferInfos.add(bufferInfo); + bufferInfos.add(init::DescriptorBufferInfo(vulkanBuffer->getHandle(), 0, vulkanBuffer->getSize())); - VkWriteDescriptorSet writeDescriptor = init::WriteDescriptorSet(setHandle[currentFrameSet], VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, binding, &bufferInfos.back()); + VkWriteDescriptorSet writeDescriptor = init::WriteDescriptorSet(setHandle[Gfx::currentFrameIndex], VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, binding, &bufferInfos.back()); writeDescriptors.add(writeDescriptor); - cachedData[currentFrameSet][binding] = vulkanBuffer.getHandle(); + cachedData[Gfx::currentFrameIndex][binding] = vulkanBuffer.getHandle(); } void DescriptorSet::updateSampler(uint32_t binding, Gfx::PSamplerState samplerState) { PSamplerState vulkanSampler = samplerState.cast(); - SamplerState* cachedSampler = reinterpret_cast(cachedData[currentFrameSet][binding]); + SamplerState* cachedSampler = reinterpret_cast(cachedData[Gfx::currentFrameIndex][binding]); if(vulkanSampler.getHandle() == cachedSampler) { return; @@ -171,16 +166,16 @@ void DescriptorSet::updateSampler(uint32_t binding, Gfx::PSamplerState samplerSt VK_IMAGE_LAYOUT_UNDEFINED); imageInfos.add(imageInfo); - VkWriteDescriptorSet writeDescriptor = init::WriteDescriptorSet(setHandle[currentFrameSet], VK_DESCRIPTOR_TYPE_SAMPLER, binding, &imageInfos.back()); + VkWriteDescriptorSet writeDescriptor = init::WriteDescriptorSet(setHandle[Gfx::currentFrameIndex], VK_DESCRIPTOR_TYPE_SAMPLER, binding, &imageInfos.back()); writeDescriptors.add(writeDescriptor); - cachedData[currentFrameSet][binding] = vulkanSampler.getHandle(); + cachedData[Gfx::currentFrameIndex][binding] = vulkanSampler.getHandle(); } void DescriptorSet::updateTexture(uint32_t binding, Gfx::PTexture texture, Gfx::PSamplerState samplerState) { TextureHandle* vulkanTexture = TextureBase::cast(texture); - TextureHandle* cachedTexture = reinterpret_cast(cachedData[currentFrameSet][binding]); + TextureHandle* cachedTexture = reinterpret_cast(cachedData[Gfx::currentFrameIndex][binding]); if(vulkanTexture == cachedTexture) { return; @@ -197,14 +192,14 @@ void DescriptorSet::updateTexture(uint32_t binding, Gfx::PTexture texture, Gfx:: imageInfo.sampler = vulkanSampler->sampler; } imageInfos.add(imageInfo); - VkWriteDescriptorSet writeDescriptor = init::WriteDescriptorSet(setHandle[currentFrameSet], samplerState != nullptr ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, binding, &imageInfos.back()); + VkWriteDescriptorSet writeDescriptor = init::WriteDescriptorSet(setHandle[Gfx::currentFrameIndex], samplerState != nullptr ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, binding, &imageInfos.back()); if (vulkanTexture->getUsage() & VK_IMAGE_USAGE_STORAGE_BIT) { writeDescriptor.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; } writeDescriptors.add(writeDescriptor); - cachedData[currentFrameSet][binding] = vulkanTexture; + cachedData[Gfx::currentFrameIndex][binding] = vulkanTexture; } bool DescriptorSet::operator<(Gfx::PDescriptorSet other) diff --git a/src/Engine/Graphics/Vulkan/VulkanDescriptorSets.h b/src/Engine/Graphics/Vulkan/VulkanDescriptorSets.h index 4e88a1b..fa406d6 100644 --- a/src/Engine/Graphics/Vulkan/VulkanDescriptorSets.h +++ b/src/Engine/Graphics/Vulkan/VulkanDescriptorSets.h @@ -64,7 +64,7 @@ public: { return poolHandle; } - inline DescriptorLayout getLayout() const + inline DescriptorLayout& getLayout() const { return layout; } @@ -83,7 +83,7 @@ class DescriptorSet : public Gfx::DescriptorSet { public: DescriptorSet(PGraphics graphics, PDescriptorAllocator owner) - : graphics(graphics), owner(owner), currentFrameSet(0) + : graphics(graphics), owner(owner) { } virtual ~DescriptorSet(); @@ -97,7 +97,7 @@ public: virtual bool operator<(Gfx::PDescriptorSet other); inline VkDescriptorSet getHandle() const { - return setHandle[currentFrameSet]; + return setHandle[Gfx::currentFrameIndex]; } virtual uint32 getSetIndex() const { @@ -113,7 +113,6 @@ private: // would not work anyways, so casts should be safe Array cachedData[Gfx::numFramesBuffered]; VkDescriptorSet setHandle[Gfx::numFramesBuffered]; - uint32 currentFrameSet; PDescriptorAllocator owner; PGraphics graphics; friend class DescriptorAllocator; diff --git a/src/Engine/Graphics/Vulkan/VulkanGraphics.cpp b/src/Engine/Graphics/Vulkan/VulkanGraphics.cpp index 89417fe..da11af9 100644 --- a/src/Engine/Graphics/Vulkan/VulkanGraphics.cpp +++ b/src/Engine/Graphics/Vulkan/VulkanGraphics.cpp @@ -282,7 +282,8 @@ Array Graphics::getRequiredExtensions() { extensions.add(glfwExtensions[i]); } -#ifdef ENABLE_VALIDATION + std::cout << ENABLE_VALIDATION << std::endl; +#if ENABLE_VALIDATION extensions.add(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); #endif // ENABLE_VALIDATION return extensions; @@ -308,7 +309,7 @@ void Graphics::initInstance(GraphicsInitializer initInfo) } info.enabledExtensionCount = (uint32)extensions.size(); info.ppEnabledExtensionNames = extensions.data(); -#ifdef ENABLE_VALIDATION +#if ENABLE_VALIDATION info.enabledLayerCount = (uint32)initInfo.layers.size(); info.ppEnabledLayerNames = initInfo.layers.data(); #else diff --git a/src/Engine/Graphics/Vulkan/VulkanPipelineCache.cpp b/src/Engine/Graphics/Vulkan/VulkanPipelineCache.cpp index 4c8e7d8..dd1d21c 100644 --- a/src/Engine/Graphics/Vulkan/VulkanPipelineCache.cpp +++ b/src/Engine/Graphics/Vulkan/VulkanPipelineCache.cpp @@ -55,6 +55,7 @@ PGraphicsPipeline PipelineCache::createPipeline(const GraphicsPipelineCreateInfo createInfo.stageCount = 0; VkPipelineTessellationStateCreateInfo tessInfo; + std::memset(&tessInfo, 0, sizeof(VkPipelineTessellationStateCreateInfo)); VkPipelineShaderStageCreateInfo stageInfos[5]; std::memset(stageInfos, 0, sizeof(stageInfos)); @@ -119,7 +120,8 @@ PGraphicsPipeline PipelineCache::createPipeline(const GraphicsPipelineCreateInfo Array attributes; Map bindingToStream; Map streamToBinding; - std::memset(bindings.data(), 0, sizeof(VkVertexInputBindingDescription) * 16); // if default allocation size ever changes, this breaks + assert(DEFAULT_ALLOC_SIZE == 16); + std::memset(bindings.data(), 0, sizeof(VkVertexInputBindingDescription) * 16); std::memset(attributes.data(), 0, sizeof(VkVertexInputAttributeDescription) * 16); for(auto& element : vertexStreams) { diff --git a/src/Engine/Graphics/Vulkan/VulkanShader.cpp b/src/Engine/Graphics/Vulkan/VulkanShader.cpp index cdf8af4..a9b16f8 100644 --- a/src/Engine/Graphics/Vulkan/VulkanShader.cpp +++ b/src/Engine/Graphics/Vulkan/VulkanShader.cpp @@ -83,7 +83,6 @@ static Gfx::SeDescriptorType getTypeFromKind(slang::TypeReflection::Kind kind) void Shader::create(const ShaderCreateInfo& createInfo) { - std::cout << "--------------------------------" << std::endl; entryPointName = createInfo.entryPoint; static SlangSession* session = spCreateSession(NULL); diff --git a/src/Engine/Graphics/Vulkan/VulkanTexture.cpp b/src/Engine/Graphics/Vulkan/VulkanTexture.cpp index d150155..b6dcc19 100644 --- a/src/Engine/Graphics/Vulkan/VulkanTexture.cpp +++ b/src/Engine/Graphics/Vulkan/VulkanTexture.cpp @@ -138,6 +138,10 @@ TextureHandle::TextureHandle(PGraphics graphics, VkImageViewType viewType, // When loading a texture from a file, we will almost always use it as a texture map for fragment shaders changeLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); } + if(usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) + { + changeLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); + } VkImageViewCreateInfo viewInfo = init::ImageViewCreateInfo(); diff --git a/src/Engine/Material/Material.cpp b/src/Engine/Material/Material.cpp index ab17f26..09fc091 100644 --- a/src/Engine/Material/Material.cpp +++ b/src/Engine/Material/Material.cpp @@ -47,7 +47,6 @@ void Material::compile() json j; stream >> j; materialName = j["name"].get(); - std::cout << "Compiling material " << materialName << std::endl; //Shader file needs to conform to the slang standard, which prohibits _ materialName.erase(std::remove(materialName.begin(), materialName.end(), '_'), materialName.end()); std::ofstream codeStream("./shaders/generated/"+materialName+".slang"); diff --git a/src/Engine/Material/MaterialAsset.cpp b/src/Engine/Material/MaterialAsset.cpp index a272b98..e694370 100644 --- a/src/Engine/Material/MaterialAsset.cpp +++ b/src/Engine/Material/MaterialAsset.cpp @@ -48,7 +48,7 @@ void MaterialAsset::updateDescriptorData() descriptorSet->writeChanges(); } -Gfx::PDescriptorSet MaterialAsset::getDescriptor() const +const Gfx::PDescriptorSet MaterialAsset::getDescriptor() const { return descriptorSet; } \ No newline at end of file diff --git a/src/Engine/Material/MaterialAsset.h b/src/Engine/Material/MaterialAsset.h index c408019..6f16422 100644 --- a/src/Engine/Material/MaterialAsset.h +++ b/src/Engine/Material/MaterialAsset.h @@ -24,7 +24,7 @@ public: // This needs to be called while the descriptorset is unused void updateDescriptorData(); - Gfx::PDescriptorSet getDescriptor() const; + const Gfx::PDescriptorSet getDescriptor() const; protected: //For now its simply the collection of parameters, since there is no point for expressions Array parameters; diff --git a/src/Engine/MinimalEngine.h b/src/Engine/MinimalEngine.h index 635b2e8..a749b24 100644 --- a/src/Engine/MinimalEngine.h +++ b/src/Engine/MinimalEngine.h @@ -135,8 +135,8 @@ public: else { object = (RefObject *)registeredObj->value; + object->addRef(); } - object->addRef(); } explicit RefPtr(RefObject *other) : object(other) diff --git a/src/Engine/Scene/Scene.cpp b/src/Engine/Scene/Scene.cpp index f2f13cb..4c84606 100644 --- a/src/Engine/Scene/Scene.cpp +++ b/src/Engine/Scene/Scene.cpp @@ -33,7 +33,7 @@ void Scene::addActor(PActor actor) void Scene::addPrimitiveComponent(PPrimitiveComponent comp) { primitives.add(comp); - for(auto batch : comp->staticMeshes) + for(auto& batch : comp->staticMeshes) { PrimitiveUniformBuffer data; data.actorWorldPosition = Vector4(comp->getTransform().getPosition(), 1); diff --git a/test/Engine/Containers/Array.cpp b/test/Engine/Containers/Array.cpp index 56279d5..8def8d1 100644 --- a/test/Engine/Containers/Array.cpp +++ b/test/Engine/Containers/Array.cpp @@ -1,5 +1,6 @@ #include "EngineTest.h" #include "Containers/Array.h" +#include "MinimalEngine.h" #include #include #define BOOST_TEST_MODULE SeeleEngine @@ -112,6 +113,32 @@ BOOST_AUTO_TEST_CASE(random_access) BOOST_CHECK_EQUAL(array[0], 4); } +class TestStruct +{ +public: + uint32 data; + ~TestStruct() + { + data = 1; + } +}; +DECLARE_REF(TestStruct); + +BOOST_AUTO_TEST_CASE(refptr_interaction) +{ + uint32* dataPtr; + { + PTestStruct test = new TestStruct(); + test->data = 32123; + dataPtr = &test->data; + { + Array arr(1); + arr[0] = test; + } + BOOST_CHECK_EQUAL(test->data, 32123); + } +} + /*BOOST_AUTO_TEST_CASE(benchmark) { using namespace std::chrono; diff --git a/test/Engine/Containers/List.cpp b/test/Engine/Containers/List.cpp index f6e71bf..37f8c12 100644 --- a/test/Engine/Containers/List.cpp +++ b/test/Engine/Containers/List.cpp @@ -26,10 +26,6 @@ BOOST_AUTO_TEST_CASE(basic_insert) List::Iterator it = list.find(3); it = list.insert(it, 1); BOOST_REQUIRE_EQUAL(*it, 1); - for (auto i : list) - { - std::cout << i << std::endl; - } BOOST_REQUIRE_EQUAL(list.length(), 4); } BOOST_AUTO_TEST_CASE(basic_remove) @@ -41,10 +37,6 @@ BOOST_AUTO_TEST_CASE(basic_remove) List::Iterator it = list.find(3); it = list.remove(it); BOOST_REQUIRE_EQUAL(*it, 4); - for (auto i : list) - { - std::cout << i << std::endl; - } BOOST_REQUIRE_EQUAL(list.length(), 2); } diff --git a/test/Engine/Containers/Map.cpp b/test/Engine/Containers/Map.cpp index 47e183a..531fbda 100644 --- a/test/Engine/Containers/Map.cpp +++ b/test/Engine/Containers/Map.cpp @@ -31,13 +31,10 @@ BOOST_AUTO_TEST_CASE(for_each) map[6] = 4; map[4] = 7; int count = 0; - std::cout << "Map start" << std::endl; for(auto it = map.begin(); it != map.end(); ++it) { - std::cout << (*it).key << std::endl; count++; } - std::cout << "Map end" << std::endl; BOOST_REQUIRE_EQUAL(count, 4); }