diff --git a/CMakeLists.txt b/CMakeLists.txt index d9837b5..679b47f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ find_package(Ktx CONFIG REQUIRED) find_package(nlohmann_json CONFIG REQUIRED) find_package(fmt CONFIG REQUIRED) find_package(VulkanMemoryAllocator CONFIG REQUIRED) +find_package(OpenMP REQUIRED) if(UNIX) find_package(Threads REQUIRED) @@ -75,6 +76,7 @@ target_link_libraries(Engine PUBLIC crcpp) target_link_libraries(Engine PUBLIC fmt::fmt) target_link_libraries(Engine PUBLIC GPUOpen::VulkanMemoryAllocator) target_link_libraries(Engine PUBLIC slang) +target_link_libraries(Engine PUBLIC OpenMP::OpenMP_CXX) if(APPLE) target_link_libraries(Engine PUBLIC metal) SET(CMAKE_OSX_DEPLOYMENT_TARGET 14.3) diff --git a/res/shaders/lib/Scene.slang b/res/shaders/lib/Scene.slang index 914eea5..ee09564 100644 --- a/res/shaders/lib/Scene.slang +++ b/res/shaders/lib/Scene.slang @@ -41,5 +41,6 @@ struct Scene StructuredBuffer primitiveIndices; StructuredBuffer vertexIndices; }; +layout(set=1) ParameterBlock pScene; diff --git a/res/shaders/lib/VertexData.slang b/res/shaders/lib/VertexData.slang index 16abfc1..5592b8b 100644 --- a/res/shaders/lib/VertexData.slang +++ b/res/shaders/lib/VertexData.slang @@ -11,4 +11,5 @@ interface IVertexData VertexAttributes getAttributes(uint index); }; -uniform ParameterBlock pVertexData; \ No newline at end of file +layout(set=2) +ParameterBlock pVertexData; \ No newline at end of file diff --git a/src/Editor/Asset/MeshLoader.cpp b/src/Editor/Asset/MeshLoader.cpp index d722bab..f27a082 100644 --- a/src/Editor/Asset/MeshLoader.cpp +++ b/src/Editor/Asset/MeshLoader.cpp @@ -243,8 +243,8 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, const Array colors(mesh->mNumVertices); StaticMeshVertexData* vertexData = StaticMeshVertexData::getInstance(); - - for (uint32 i = 0; i < mesh->mNumVertices; ++i) +#pragma omp parallel for + for (int32 i = 0; i < mesh->mNumVertices; ++i) { positions[i] = Vector(mesh->mVertices[i].x, mesh->mVertices[i].y, mesh->mVertices[i].z); if (mesh->HasTextureCoords(0)) @@ -275,7 +275,6 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, const ArrayallocateVertexData(mesh->mNumVertices); vertexData->loadPositions(id, positions); vertexData->loadTexCoords(id, texCoords); @@ -285,7 +284,8 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, const ArrayloadColors(id, colors); Array indices(mesh->mNumFaces * 3); - for (size_t faceIndex = 0; faceIndex < mesh->mNumFaces; ++faceIndex) +#pragma omp parallel for + for (int32 faceIndex = 0; faceIndex < mesh->mNumFaces; ++faceIndex) { indices[faceIndex * 3 + 0] = mesh->mFaces[faceIndex].mIndices[0]; indices[faceIndex * 3 + 1] = mesh->mFaces[faceIndex].mIndices[1]; @@ -349,6 +349,27 @@ void MeshLoader::loadTextures(const aiScene* scene, const std::filesystem::path& }); } } + +Matrix4 convertMatrix(aiMatrix4x4 matrix) +{ + return Matrix4( + matrix.a1, matrix.a2, matrix.a3, matrix.a4, + matrix.b1, matrix.b2, matrix.b3, matrix.b4, + matrix.c1, matrix.c2, matrix.c3, matrix.c4, + matrix.d1, matrix.d2, matrix.d3, matrix.d4 + ); +} + +Matrix4 MeshLoader::loadNodeTransform(aiNode* node) +{ + Matrix4 parent = Matrix4(1); + if (node->mParent != nullptr) + { + parent = loadNodeTransform(node->mParent); + } + return parent * convertMatrix(node->mTransformation); +} + void MeshLoader::import(MeshImportArgs args, PMeshAsset meshAsset) { std::cout << "Starting to import "<mNumMeshes; ++i) { + if (globalMeshes[meshNode->mMeshes[i]] == nullptr) + { + continue; + } meshes.add(std::move(globalMeshes[meshNode->mMeshes[i]])); + meshes.back()->transform = loadNodeTransform(meshNode); } } meshAsset->meshes = std::move(meshes); meshAsset->physicsMesh = std::move(collider); - auto stream = AssetRegistry::createWriteStream((std::filesystem::path(meshAsset->getFolderPath()) / meshAsset->getName()).replace_extension("asset").string(), std::ios::binary); ArchiveBuffer archive; diff --git a/src/Editor/Asset/MeshLoader.h b/src/Editor/Asset/MeshLoader.h index 9ec1060..11a24a1 100644 --- a/src/Editor/Asset/MeshLoader.h +++ b/src/Editor/Asset/MeshLoader.h @@ -6,6 +6,7 @@ struct aiScene; struct aiTexel; +struct aiNode; namespace Seele { DECLARE_REF(Mesh) @@ -29,6 +30,7 @@ private: void loadGlobalMeshes(const aiScene* scene, const Array& materials, Array& globalMeshes, Component::Collider& collider); void convertAssimpARGB(unsigned char* dst, aiTexel* src, uint32 numPixels); + Matrix4 loadNodeTransform(aiNode* node); void import(MeshImportArgs args, PMeshAsset meshAsset); Gfx::PGraphics graphics; }; diff --git a/src/Editor/main.cpp b/src/Editor/main.cpp index 8d3b5e1..b0db6e2 100644 --- a/src/Editor/main.cpp +++ b/src/Editor/main.cpp @@ -57,10 +57,10 @@ int main() { AssetImporter::importMesh(MeshImportArgs{ .filePath = sourcePath / "import/models/cube.fbx", }); - //AssetImporter::importMesh(MeshImportArgs{ - // .filePath = sourcePath / "import/models/after-the-rain-vr-sound/source/Whitechapel.blend", - // .importPath = "Whitechapel" - // }); + AssetImporter::importMesh(MeshImportArgs{ + .filePath = sourcePath / "import/models/after-the-rain-vr-sound/source/Whitechapel.blend", + .importPath = "Whitechapel" + }); WindowCreateInfo mainWindowInfo; mainWindowInfo.title = "SeeleEngine"; mainWindowInfo.width = 1920; diff --git a/src/Engine/Graphics/Mesh.cpp b/src/Engine/Graphics/Mesh.cpp index 9633140..b1553cb 100644 --- a/src/Engine/Graphics/Mesh.cpp +++ b/src/Engine/Graphics/Mesh.cpp @@ -14,6 +14,7 @@ Mesh::~Mesh() void Mesh::save(ArchiveBuffer& buffer) const { + Serialization::save(buffer, transform); Serialization::save(buffer, vertexData->getTypeName()); Serialization::save(buffer, vertexCount); Serialization::save(buffer, indices); @@ -25,6 +26,7 @@ void Mesh::save(ArchiveBuffer& buffer) const void Mesh::load(ArchiveBuffer& buffer) { std::string typeName; + Serialization::load(buffer, transform); Serialization::load(buffer, typeName); Serialization::load(buffer, vertexCount); vertexData = VertexData::findByTypeName(typeName); diff --git a/src/Engine/Graphics/Mesh.h b/src/Engine/Graphics/Mesh.h index 90a4c03..6354b11 100644 --- a/src/Engine/Graphics/Mesh.h +++ b/src/Engine/Graphics/Mesh.h @@ -11,6 +11,8 @@ public: Mesh(); ~Mesh(); + // transform from importing + Matrix4 transform = Matrix4(1); VertexData* vertexData; MeshId id; uint64 vertexCount; diff --git a/src/Engine/Graphics/Shader.cpp b/src/Engine/Graphics/Shader.cpp index 1991a1c..1dbea30 100644 --- a/src/Engine/Graphics/Shader.cpp +++ b/src/Engine/Graphics/Shader.cpp @@ -150,5 +150,6 @@ void ShaderCompiler::createShaders(ShaderPermutation permutation, Gfx::OPipeline createInfo.entryPoint = "fragmentMain"; collection.fragmentShader = graphics->createFragmentShader(createInfo); } + collection.pipelineLayout->create(); shaders[perm] = std::move(collection); } diff --git a/src/Engine/Graphics/VertexData.cpp b/src/Engine/Graphics/VertexData.cpp index 110c25d..829a504 100644 --- a/src/Engine/Graphics/VertexData.cpp +++ b/src/Engine/Graphics/VertexData.cpp @@ -40,7 +40,7 @@ void VertexData::updateMesh(PMesh mesh, Component::Transform& transform) { matInstanceData.meshes.add(MeshInstanceData{ .instance = InstanceData { - .transformMatrix = transform.toMatrix(), + .transformMatrix = mesh->transform * transform.toMatrix(), }, .data = data, }); diff --git a/src/Engine/Graphics/Vulkan/Descriptor.cpp b/src/Engine/Graphics/Vulkan/Descriptor.cpp index abd97a9..8789cf4 100644 --- a/src/Engine/Graphics/Vulkan/Descriptor.cpp +++ b/src/Engine/Graphics/Vulkan/Descriptor.cpp @@ -324,11 +324,15 @@ PipelineLayout::~PipelineLayout() {} Map cachedLayouts; void PipelineLayout::create() { - vulkanDescriptorLayouts.resize(descriptorSetLayouts.size()); for (auto [name, desc] : descriptorSetLayouts) { PDescriptorLayout layout = desc.cast(); layout->create(); - vulkanDescriptorLayouts[parameterMapping[layout->getName()]] = layout->getHandle(); + uint32 parameterIndex = parameterMapping[layout->getName()]; + if (parameterIndex > vulkanDescriptorLayouts.size()) + { + vulkanDescriptorLayouts.resize(parameterIndex + 1); + } + vulkanDescriptorLayouts[parameterIndex] = layout->getHandle(); } Array vkPushConstants(pushConstants.size()); diff --git a/src/Engine/Graphics/slang-compile.cpp b/src/Engine/Graphics/slang-compile.cpp index ac0264a..a41231c 100644 --- a/src/Engine/Graphics/slang-compile.cpp +++ b/src/Engine/Graphics/slang-compile.cpp @@ -16,7 +16,7 @@ Slang::ComPtr Seele::generateShader(const ShaderCreateInfo& create } slang::SessionDesc sessionDesc; sessionDesc.flags = 0; - slang::CompilerOptionEntry option[2]; + StaticArray option; option[0].name = slang::CompilerOptionName::DumpIntermediates; option[0].value = slang::CompilerOptionValue(); option[0].value.kind = slang::CompilerOptionValueKind::Int; @@ -25,8 +25,16 @@ Slang::ComPtr Seele::generateShader(const ShaderCreateInfo& create option[1].value = slang::CompilerOptionValue(); option[1].value.kind = slang::CompilerOptionValueKind::Int; option[1].value.intValue0 = 1; - sessionDesc.compilerOptionEntries = option; - sessionDesc.compilerOptionEntryCount = 2; + option[2].name = slang::CompilerOptionName::DebugInformation; + option[2].value = slang::CompilerOptionValue(); + option[2].value.kind = slang::CompilerOptionValueKind::Int; + option[2].value.intValue0 = 3; + option[3].name = slang::CompilerOptionName::DebugInformationFormat; + option[3].value = slang::CompilerOptionValue(); + option[3].value.kind = slang::CompilerOptionValueKind::Int; + option[3].value.stringValue0 = "c7"; + sessionDesc.compilerOptionEntries = option.data(); + sessionDesc.compilerOptionEntryCount = option.size(); sessionDesc.defaultMatrixLayoutMode = SLANG_MATRIX_LAYOUT_COLUMN_MAJOR; Array macros; for(const auto& [key, val] : createInfo.defines) @@ -41,8 +49,6 @@ Slang::ComPtr Seele::generateShader(const ShaderCreateInfo& create slang::TargetDesc targetDesc; targetDesc.profile = globalSession->findProfile("sm_6_6"); targetDesc.format = target; - targetDesc.compilerOptionEntryCount = 2; - targetDesc.compilerOptionEntries = option; sessionDesc.targetCount = 1; sessionDesc.targets = &targetDesc; StaticArray searchPaths = {"shaders/", "shaders/lib/", "shaders/generated/"}; diff --git a/src/Engine/Serialization/Serialization.h b/src/Engine/Serialization/Serialization.h index ba1fb4c..86cee82 100644 --- a/src/Engine/Serialization/Serialization.h +++ b/src/Engine/Serialization/Serialization.h @@ -1,6 +1,7 @@ #pragma once #include "ArchiveBuffer.h" #include "Math/Vector.h" +#include "Math/Matrix.h" namespace Seele { @@ -52,6 +53,44 @@ namespace Serialization save(buffer, vec.y); save(buffer, vec.z); } + static void load(ArchiveBuffer& buffer, Matrix4& mat) + { + load(buffer, mat[0][0]); + load(buffer, mat[0][1]); + load(buffer, mat[0][2]); + load(buffer, mat[0][3]); + load(buffer, mat[1][0]); + load(buffer, mat[1][1]); + load(buffer, mat[1][2]); + load(buffer, mat[1][3]); + load(buffer, mat[2][0]); + load(buffer, mat[2][1]); + load(buffer, mat[2][2]); + load(buffer, mat[2][3]); + load(buffer, mat[3][0]); + load(buffer, mat[3][1]); + load(buffer, mat[3][2]); + load(buffer, mat[3][3]); + } + static void save(ArchiveBuffer& buffer, const Matrix4& mat) + { + save(buffer, mat[0][0]); + save(buffer, mat[0][1]); + save(buffer, mat[0][2]); + save(buffer, mat[0][3]); + save(buffer, mat[1][0]); + save(buffer, mat[1][1]); + save(buffer, mat[1][2]); + save(buffer, mat[1][3]); + save(buffer, mat[2][0]); + save(buffer, mat[2][1]); + save(buffer, mat[2][2]); + save(buffer, mat[2][3]); + save(buffer, mat[3][0]); + save(buffer, mat[3][1]); + save(buffer, mat[3][2]); + save(buffer, mat[3][3]); + } static void load(ArchiveBuffer& buffer, Vector& vec) { load(buffer, vec.x);