diff --git a/res/shaders/lib/Scene.slang b/res/shaders/lib/Scene.slang index 0e37c04..3567f00 100644 --- a/res/shaders/lib/Scene.slang +++ b/res/shaders/lib/Scene.slang @@ -39,7 +39,7 @@ struct Scene StructuredBuffer meshData; StructuredBuffer meshletInfos; StructuredBuffer primitiveIndices; - StructuredBuffer vertexIndices; + StructuredBuffer vertexIndices; }; ParameterBlock pScene; diff --git a/src/Editor/Asset/MeshLoader.cpp b/src/Editor/Asset/MeshLoader.cpp index 2a00cb6..c871ec8 100644 --- a/src/Editor/Asset/MeshLoader.cpp +++ b/src/Editor/Asset/MeshLoader.cpp @@ -258,12 +258,9 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, const ArrayloadBiTangents(id, biTangents); vertexData->loadColors(id, colors); - Array indices(mesh->mNumFaces * 3); + Array indices(mesh->mNumFaces * 3); for (size_t faceIndex = 0; faceIndex < mesh->mNumFaces; ++faceIndex) { - assert(mesh->mFaces[faceIndex].mIndices[0] < std::numeric_limits::max()); - assert(mesh->mFaces[faceIndex].mIndices[1] < std::numeric_limits::max()); - assert(mesh->mFaces[faceIndex].mIndices[2] < std::numeric_limits::max()); indices[faceIndex * 3 + 0] = mesh->mFaces[faceIndex].mIndices[0]; indices[faceIndex * 3 + 1] = mesh->mFaces[faceIndex].mIndices[1]; indices[faceIndex * 3 + 2] = mesh->mFaces[faceIndex].mIndices[2]; diff --git a/src/Engine/Component/ShapeBase.cpp b/src/Engine/Component/ShapeBase.cpp index 8ccbe46..229eefd 100644 --- a/src/Engine/Component/ShapeBase.cpp +++ b/src/Engine/Component/ShapeBase.cpp @@ -127,7 +127,7 @@ void computeFaceIntegrals(Face& f, ComputationState& state) + w * (2 * (n[state.A] * state.Paa + n[state.B] * state.Pab) + w * state.Pa)); } -void computeVolumeIntegrals(const Array vertices, const Array& indices, ComputationState& state) +void computeVolumeIntegrals(const Array vertices, const Array& indices, ComputationState& state) { std::memset(&state, 0, sizeof(ComputationState)); for (size_t i = 0; i < indices.size(); i+=3) @@ -172,7 +172,7 @@ void computeVolumeIntegrals(const Array vertices, const Array& i state.TP /= 2.0f; } -void computePhysicsParamsForMesh(Array& vertices, const Array& indices, Matrix3& bodyInertia, Vector& centerOfMass, float& mass) +void computePhysicsParamsForMesh(Array& vertices, const Array& indices, Matrix3& bodyInertia, Vector& centerOfMass, float& mass) { ComputationState state; computeVolumeIntegrals(vertices, indices, state); @@ -200,7 +200,7 @@ ShapeBase::ShapeBase() } -ShapeBase::ShapeBase(Array vertices, Array indices) +ShapeBase::ShapeBase(Array vertices, Array indices) : vertices(vertices) , indices(indices) { @@ -217,7 +217,7 @@ ShapeBase ShapeBase::transform(const Component::Transform& transform) const return result; } -void ShapeBase::addCollider(Array verts, Array inds, Matrix4 matrix) +void ShapeBase::addCollider(Array verts, Array inds, Matrix4 matrix) { size_t indOffset = vertices.size(); for(auto vert : verts) diff --git a/src/Engine/Component/ShapeBase.h b/src/Engine/Component/ShapeBase.h index 5f3b748..a036c2a 100644 --- a/src/Engine/Component/ShapeBase.h +++ b/src/Engine/Component/ShapeBase.h @@ -10,15 +10,15 @@ namespace Component struct ShapeBase { ShapeBase(); - ShapeBase(Array vertices, Array indices); + ShapeBase(Array vertices, Array indices); ShapeBase transform(const Component::Transform& transform) const; - void addCollider(Array vertices, Array indices, Matrix4 matrix); + void addCollider(Array vertices, Array indices, Matrix4 matrix); void visualize() const; Vector centerOfMass; float mass; Matrix3 bodyInertia; Array vertices; - Array indices; + Array indices; }; } // namespace Component } // namespace Seele diff --git a/src/Engine/Graphics/Mesh.h b/src/Engine/Graphics/Mesh.h index d49a09c..90a4c03 100644 --- a/src/Engine/Graphics/Mesh.h +++ b/src/Engine/Graphics/Mesh.h @@ -15,7 +15,7 @@ public: MeshId id; uint64 vertexCount; PMaterialInstanceAsset referencedMaterial; - Array indices; + Array indices; Array meshlets; void save(ArchiveBuffer& buffer) const; void load(ArchiveBuffer& buffer); diff --git a/src/Engine/Graphics/Meshlet.cpp b/src/Engine/Graphics/Meshlet.cpp index 585e838..aad824a 100644 --- a/src/Engine/Graphics/Meshlet.cpp +++ b/src/Engine/Graphics/Meshlet.cpp @@ -61,20 +61,26 @@ void addTriangle(Array& meshlets, Meshlet& current, Triangle tri) } } -void Meshlet::build(const Array& positions, const Array& indices, Array& meshlets) +void Meshlet::build(const Array& positions, const Array& indices, Array& meshlets) { Meshlet current = { .numVertices = 0, .numPrimitives = 0, }; - for (size_t i = 0; i < indices.size() / 3; ++i) + Array triangles(indices.size() / 3); + for (size_t i = 0; i < triangles.size(); ++i) { - addTriangle(meshlets, current, Triangle{ + triangles.add(Triangle{ .indices = { indices[i * 3 + 0], indices[i * 3 + 1], indices[i * 3 + 2], }, }); + + } + if (current.numVertices > 0) + { + completeMeshlet(meshlets, current); } } diff --git a/src/Engine/Graphics/Meshlet.h b/src/Engine/Graphics/Meshlet.h index 3acf913..88afea2 100644 --- a/src/Engine/Graphics/Meshlet.h +++ b/src/Engine/Graphics/Meshlet.h @@ -7,10 +7,10 @@ namespace Seele struct Meshlet { AABB boundingBox; - uint16 uniqueVertices[Gfx::numVerticesPerMeshlet]; // unique vertiex indices in the vertex data + uint32 uniqueVertices[Gfx::numVerticesPerMeshlet]; // unique vertiex indices in the vertex data uint8 primitiveLayout[Gfx::numPrimitivesPerMeshlet * 3]; // indices into the uniqueVertices array, only uint8 needed uint32 numVertices; uint32 numPrimitives; - static void build(const Array& positions, const Array& indices, Array& meshlets); + static void build(const Array& positions, const Array& indices, Array& meshlets); }; } // namespace Seele \ No newline at end of file diff --git a/src/Engine/Graphics/VertexData.cpp b/src/Engine/Graphics/VertexData.cpp index 87ac929..bf0df23 100644 --- a/src/Engine/Graphics/VertexData.cpp +++ b/src/Engine/Graphics/VertexData.cpp @@ -142,7 +142,7 @@ void VertexData::createDescriptors() } } -void VertexData::loadMesh(MeshId id, Array loadedIndices, Array loadedMeshlets) +void VertexData::loadMesh(MeshId id, Array loadedIndices, Array loadedMeshlets) { meshlets.reserve(meshlets.size() + loadedMeshlets.size()); vertexIndices.reserve(vertexIndices.size() + loadedMeshlets.size() * Gfx::numVerticesPerMeshlet); @@ -183,13 +183,13 @@ void VertexData::loadMesh(MeshId id, Array loadedIndices, Array meshData[id][0].firstIndex = indices.size(); meshData[id][0].numIndices = loadedIndices.size(); indices.resize(indices.size() + loadedIndices.size()); - std::memcpy(indices.data() + meshData[id][0].firstIndex, loadedIndices.data(), loadedIndices.size() * sizeof(uint16)); + std::memcpy(indices.data() + meshData[id][0].firstIndex, loadedIndices.data(), loadedIndices.size() * sizeof(uint32)); indexBuffer = graphics->createIndexBuffer(IndexBufferCreateInfo{ .sourceData = { - .size = sizeof(uint16) * indices.size(), + .size = sizeof(uint32) * indices.size(), .data = (uint8*)indices.data(), }, - .indexType = Gfx::SE_INDEX_TYPE_UINT16, + .indexType = Gfx::SE_INDEX_TYPE_UINT32, }); meshletBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{ .sourceData = { @@ -201,7 +201,7 @@ void VertexData::loadMesh(MeshId id, Array loadedIndices, Array }); vertexIndicesBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{ .sourceData = { - .size = sizeof(uint16) * vertexIndices.size(), + .size = sizeof(uint32) * vertexIndices.size(), .data = (uint8*)vertexIndices.data(), }, .numElements = vertexIndices.size(), diff --git a/src/Engine/Graphics/VertexData.h b/src/Engine/Graphics/VertexData.h index 06ff082..95d7c91 100644 --- a/src/Engine/Graphics/VertexData.h +++ b/src/Engine/Graphics/VertexData.h @@ -61,7 +61,7 @@ public: void resetMeshData(); void updateMesh(PMesh mesh, Component::Transform& transform); void createDescriptors(); - void loadMesh(MeshId id, Array indices, Array meshlets); + void loadMesh(MeshId id, Array indices, Array meshlets); MeshId allocateVertexData(uint64 numVertices); uint64 getMeshOffset(MeshId id); uint64 getMeshVertexCount(MeshId id); @@ -100,8 +100,8 @@ protected: Map meshVertexCounts; Array meshlets; Array primitiveIndices; - Array vertexIndices; - Array indices; + Array vertexIndices; + Array indices; Gfx::PGraphics graphics; Gfx::ODescriptorLayout instanceDataLayout; // for mesh shading