Trying to switch to 16 bit indices
This commit is contained in:
@@ -35,7 +35,7 @@ struct AABB
|
|||||||
float3 max;
|
float3 max;
|
||||||
float pad1;
|
float pad1;
|
||||||
bool insideFrustum(float4x4 transform, Frustum frustum)
|
bool insideFrustum(float4x4 transform, Frustum frustum)
|
||||||
{
|
{
|
||||||
float4 corners[8];
|
float4 corners[8];
|
||||||
corners[0] = mul(transform, float4(min.x, min.y, min.z, 1.0f));
|
corners[0] = mul(transform, float4(min.x, min.y, min.z, 1.0f));
|
||||||
corners[1] = mul(transform, float4(min.x, min.y, max.z, 1.0f));
|
corners[1] = mul(transform, float4(min.x, min.y, max.z, 1.0f));
|
||||||
@@ -47,12 +47,10 @@ struct AABB
|
|||||||
corners[7] = mul(transform, float4(max.x, max.y, max.z, 1.0f));
|
corners[7] = mul(transform, float4(max.x, max.y, max.z, 1.0f));
|
||||||
for(int i = 0; i < 8; ++i)
|
for(int i = 0; i < 8; ++i)
|
||||||
{
|
{
|
||||||
float3 adjusted = corners[i].xyz / corners[i].w;
|
if(frustum.pointInside(corners[i].xyz))
|
||||||
if(frustum.pointInside(adjusted))
|
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import Bounding;
|
|||||||
|
|
||||||
struct MeshletDescription
|
struct MeshletDescription
|
||||||
{
|
{
|
||||||
BoundingSphere bounding;
|
AABB bounding;
|
||||||
uint32_t vertexCount;
|
uint32_t vertexCount;
|
||||||
uint32_t primitiveCount;
|
uint32_t primitiveCount;
|
||||||
uint32_t vertexOffset;
|
uint32_t vertexOffset;
|
||||||
@@ -13,7 +13,7 @@ struct MeshletDescription
|
|||||||
|
|
||||||
struct MeshData
|
struct MeshData
|
||||||
{
|
{
|
||||||
BoundingSphere bounding;
|
AABB bounding;
|
||||||
uint32_t numMeshlets;
|
uint32_t numMeshlets;
|
||||||
uint32_t meshletOffset;
|
uint32_t meshletOffset;
|
||||||
uint32_t firstIndex;
|
uint32_t firstIndex;
|
||||||
@@ -39,7 +39,7 @@ struct Scene
|
|||||||
StructuredBuffer<MeshData> meshData;
|
StructuredBuffer<MeshData> meshData;
|
||||||
StructuredBuffer<MeshletDescription> meshletInfos;
|
StructuredBuffer<MeshletDescription> meshletInfos;
|
||||||
StructuredBuffer<uint8_t> primitiveIndices;
|
StructuredBuffer<uint8_t> primitiveIndices;
|
||||||
StructuredBuffer<uint32_t> vertexIndices;
|
StructuredBuffer<uint16_t> vertexIndices;
|
||||||
};
|
};
|
||||||
|
|
||||||
ParameterBlock<Scene> pScene;
|
ParameterBlock<Scene> pScene;
|
||||||
|
|||||||
@@ -258,9 +258,12 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, const Array<PMaterialIns
|
|||||||
vertexData->loadBiTangents(id, biTangents);
|
vertexData->loadBiTangents(id, biTangents);
|
||||||
vertexData->loadColors(id, colors);
|
vertexData->loadColors(id, colors);
|
||||||
|
|
||||||
Array<uint32> indices(mesh->mNumFaces * 3);
|
Array<uint16> indices(mesh->mNumFaces * 3);
|
||||||
for (size_t faceIndex = 0; faceIndex < mesh->mNumFaces; ++faceIndex)
|
for (size_t faceIndex = 0; faceIndex < mesh->mNumFaces; ++faceIndex)
|
||||||
{
|
{
|
||||||
|
assert(mesh->mFaces[faceIndex].mIndices[0] < std::numeric_limits<uint16>::max());
|
||||||
|
assert(mesh->mFaces[faceIndex].mIndices[1] < std::numeric_limits<uint16>::max());
|
||||||
|
assert(mesh->mFaces[faceIndex].mIndices[2] < std::numeric_limits<uint16>::max());
|
||||||
indices[faceIndex * 3 + 0] = mesh->mFaces[faceIndex].mIndices[0];
|
indices[faceIndex * 3 + 0] = mesh->mFaces[faceIndex].mIndices[0];
|
||||||
indices[faceIndex * 3 + 1] = mesh->mFaces[faceIndex].mIndices[1];
|
indices[faceIndex * 3 + 1] = mesh->mFaces[faceIndex].mIndices[1];
|
||||||
indices[faceIndex * 3 + 2] = mesh->mFaces[faceIndex].mIndices[2];
|
indices[faceIndex * 3 + 2] = mesh->mFaces[faceIndex].mIndices[2];
|
||||||
|
|||||||
@@ -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));
|
+ w * (2 * (n[state.A] * state.Paa + n[state.B] * state.Pab) + w * state.Pa));
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeVolumeIntegrals(const Array<Vector> vertices, const Array<uint32>& indices, ComputationState& state)
|
void computeVolumeIntegrals(const Array<Vector> vertices, const Array<uint16>& indices, ComputationState& state)
|
||||||
{
|
{
|
||||||
std::memset(&state, 0, sizeof(ComputationState));
|
std::memset(&state, 0, sizeof(ComputationState));
|
||||||
for (size_t i = 0; i < indices.size(); i+=3)
|
for (size_t i = 0; i < indices.size(); i+=3)
|
||||||
@@ -172,7 +172,7 @@ void computeVolumeIntegrals(const Array<Vector> vertices, const Array<uint32>& i
|
|||||||
state.TP /= 2.0f;
|
state.TP /= 2.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void computePhysicsParamsForMesh(Array<Vector>& vertices, const Array<uint32_t>& indices, Matrix3& bodyInertia, Vector& centerOfMass, float& mass)
|
void computePhysicsParamsForMesh(Array<Vector>& vertices, const Array<uint16>& indices, Matrix3& bodyInertia, Vector& centerOfMass, float& mass)
|
||||||
{
|
{
|
||||||
ComputationState state;
|
ComputationState state;
|
||||||
computeVolumeIntegrals(vertices, indices, state);
|
computeVolumeIntegrals(vertices, indices, state);
|
||||||
@@ -200,7 +200,7 @@ ShapeBase::ShapeBase()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShapeBase::ShapeBase(Array<Vector> vertices, Array<uint32> indices)
|
ShapeBase::ShapeBase(Array<Vector> vertices, Array<uint16> indices)
|
||||||
: vertices(vertices)
|
: vertices(vertices)
|
||||||
, indices(indices)
|
, indices(indices)
|
||||||
{
|
{
|
||||||
@@ -217,7 +217,7 @@ ShapeBase ShapeBase::transform(const Component::Transform& transform) const
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShapeBase::addCollider(Array<Vector> verts, Array<uint32> inds, Matrix4 matrix)
|
void ShapeBase::addCollider(Array<Vector> verts, Array<uint16> inds, Matrix4 matrix)
|
||||||
{
|
{
|
||||||
size_t indOffset = vertices.size();
|
size_t indOffset = vertices.size();
|
||||||
for(auto vert : verts)
|
for(auto vert : verts)
|
||||||
|
|||||||
@@ -10,15 +10,15 @@ namespace Component
|
|||||||
struct ShapeBase
|
struct ShapeBase
|
||||||
{
|
{
|
||||||
ShapeBase();
|
ShapeBase();
|
||||||
ShapeBase(Array<Vector> vertices, Array<uint32> indices);
|
ShapeBase(Array<Vector> vertices, Array<uint16> indices);
|
||||||
ShapeBase transform(const Component::Transform& transform) const;
|
ShapeBase transform(const Component::Transform& transform) const;
|
||||||
void addCollider(Array<Vector> vertices, Array<uint32> indices, Matrix4 matrix);
|
void addCollider(Array<Vector> vertices, Array<uint16> indices, Matrix4 matrix);
|
||||||
void visualize() const;
|
void visualize() const;
|
||||||
Vector centerOfMass;
|
Vector centerOfMass;
|
||||||
float mass;
|
float mass;
|
||||||
Matrix3 bodyInertia;
|
Matrix3 bodyInertia;
|
||||||
Array<Vector> vertices;
|
Array<Vector> vertices;
|
||||||
Array<uint32> indices;
|
Array<uint16> indices;
|
||||||
};
|
};
|
||||||
} // namespace Component
|
} // namespace Component
|
||||||
} // namespace Seele
|
} // namespace Seele
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ public:
|
|||||||
MeshId id;
|
MeshId id;
|
||||||
uint64 vertexCount;
|
uint64 vertexCount;
|
||||||
PMaterialInstanceAsset referencedMaterial;
|
PMaterialInstanceAsset referencedMaterial;
|
||||||
Array<uint32> indices;
|
Array<uint16> indices;
|
||||||
Array<Meshlet> meshlets;
|
Array<Meshlet> meshlets;
|
||||||
void save(ArchiveBuffer& buffer) const;
|
void save(ArchiveBuffer& buffer) const;
|
||||||
void load(ArchiveBuffer& buffer);
|
void load(ArchiveBuffer& buffer);
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ void completeMeshlet(Array<Meshlet>& meshlets, Meshlet& current)
|
|||||||
{
|
{
|
||||||
meshlets.add(current);
|
meshlets.add(current);
|
||||||
current = {
|
current = {
|
||||||
|
.boundingBox = AABB(),
|
||||||
.numVertices = 0,
|
.numVertices = 0,
|
||||||
.numPrimitives = 0,
|
.numPrimitives = 0,
|
||||||
};
|
};
|
||||||
@@ -60,40 +61,20 @@ void addTriangle(Array<Meshlet>& meshlets, Meshlet& current, Triangle tri)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Meshlet::build(const Array<Vector>& positions, const Array<uint32>& indices, Array<Meshlet>& meshlets)
|
void Meshlet::build(const Array<Vector>& positions, const Array<uint16>& indices, Array<Meshlet>& meshlets)
|
||||||
{
|
{
|
||||||
Meshlet current = {
|
Meshlet current = {
|
||||||
.numVertices = 0,
|
.numVertices = 0,
|
||||||
.numPrimitives = 0,
|
.numPrimitives = 0,
|
||||||
};
|
};
|
||||||
Array<Triangle> triangles(indices.size() / 3);
|
for (size_t i = 0; i < indices.size() / 3; ++i)
|
||||||
for (size_t i = 0; i < triangles.size(); ++i)
|
|
||||||
{
|
{
|
||||||
triangles[i].indices[0] = indices[i * 3 + 0];
|
addTriangle(meshlets, current, Triangle{
|
||||||
triangles[i].indices[1] = indices[i * 3 + 1];
|
.indices = {
|
||||||
triangles[i].indices[2] = indices[i * 3 + 2];
|
indices[i * 3 + 0],
|
||||||
}
|
indices[i * 3 + 1],
|
||||||
while (!triangles.empty())
|
indices[i * 3 + 2],
|
||||||
{
|
},
|
||||||
uint32 best = 0;
|
});
|
||||||
float lowestSurface = std::numeric_limits<float>::max();
|
|
||||||
AABB newAABB;
|
|
||||||
for (uint32 i = 0; i < triangles.size(); ++i)
|
|
||||||
{
|
|
||||||
AABB adjusted = current.boundingBox;
|
|
||||||
adjusted.adjust(positions[triangles[i].indices[0]]);
|
|
||||||
adjusted.adjust(positions[triangles[i].indices[1]]);
|
|
||||||
adjusted.adjust(positions[triangles[i].indices[2]]);
|
|
||||||
float surface = adjusted.surfaceArea();
|
|
||||||
if (surface < lowestSurface)
|
|
||||||
{
|
|
||||||
lowestSurface = surface;
|
|
||||||
best = i;
|
|
||||||
newAABB = adjusted;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
current.boundingBox = newAABB;
|
|
||||||
addTriangle(meshlets, current, triangles[best]);
|
|
||||||
triangles.removeAt(best);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ namespace Seele
|
|||||||
struct Meshlet
|
struct Meshlet
|
||||||
{
|
{
|
||||||
AABB boundingBox;
|
AABB boundingBox;
|
||||||
uint32 uniqueVertices[Gfx::numVerticesPerMeshlet]; // unique vertiex indices in the vertex data
|
uint16 uniqueVertices[Gfx::numVerticesPerMeshlet]; // unique vertiex indices in the vertex data
|
||||||
uint8 primitiveLayout[Gfx::numPrimitivesPerMeshlet * 3]; // indices into the uniqueVertices array, only uint8 needed
|
uint8 primitiveLayout[Gfx::numPrimitivesPerMeshlet * 3]; // indices into the uniqueVertices array, only uint8 needed
|
||||||
uint32 numVertices;
|
uint32 numVertices;
|
||||||
uint32 numPrimitives;
|
uint32 numPrimitives;
|
||||||
static void build(const Array<Vector>& positions, const Array<uint32>& indices, Array<Meshlet>& meshlets);
|
static void build(const Array<Vector>& positions, const Array<uint16>& indices, Array<Meshlet>& meshlets);
|
||||||
};
|
};
|
||||||
} // namespace Seele
|
} // namespace Seele
|
||||||
@@ -44,43 +44,43 @@ void VertexData::updateMesh(PMesh mesh, Component::Transform& transform)
|
|||||||
},
|
},
|
||||||
.data = data,
|
.data = data,
|
||||||
});
|
});
|
||||||
//for (size_t i = 0; i < data.numMeshlets; ++i)
|
for (size_t i = 0; i < data.numMeshlets; ++i)
|
||||||
//{
|
{
|
||||||
// auto bounding = meshlets[data.meshletOffset + i].bounding;
|
auto bounding = meshlets[data.meshletOffset + i].bounding;
|
||||||
// StaticArray<Vector, 8> corners;
|
StaticArray<Vector, 8> corners;
|
||||||
// corners[0] = transform.toMatrix() * Vector4(bounding.min.x, bounding.min.y, bounding.min.z, 1);
|
corners[0] = transform.toMatrix() * Vector4(bounding.min.x, bounding.min.y, bounding.min.z, 1);
|
||||||
// corners[1] = transform.toMatrix() * Vector4(bounding.min.x, bounding.min.y, bounding.max.z, 1);
|
corners[1] = transform.toMatrix() * Vector4(bounding.min.x, bounding.min.y, bounding.max.z, 1);
|
||||||
// corners[2] = transform.toMatrix() * Vector4(bounding.min.x, bounding.max.y, bounding.min.z, 1);
|
corners[2] = transform.toMatrix() * Vector4(bounding.min.x, bounding.max.y, bounding.min.z, 1);
|
||||||
// corners[3] = transform.toMatrix() * Vector4(bounding.min.x, bounding.max.y, bounding.max.z, 1);
|
corners[3] = transform.toMatrix() * Vector4(bounding.min.x, bounding.max.y, bounding.max.z, 1);
|
||||||
// corners[4] = transform.toMatrix() * Vector4(bounding.max.x, bounding.min.y, bounding.min.z, 1);
|
corners[4] = transform.toMatrix() * Vector4(bounding.max.x, bounding.min.y, bounding.min.z, 1);
|
||||||
// corners[5] = transform.toMatrix() * Vector4(bounding.max.x, bounding.min.y, bounding.max.z, 1);
|
corners[5] = transform.toMatrix() * Vector4(bounding.max.x, bounding.min.y, bounding.max.z, 1);
|
||||||
// corners[6] = transform.toMatrix() * Vector4(bounding.max.x, bounding.max.y, bounding.min.z, 1);
|
corners[6] = transform.toMatrix() * Vector4(bounding.max.x, bounding.max.y, bounding.min.z, 1);
|
||||||
// corners[7] = transform.toMatrix() * Vector4(bounding.max.x, bounding.max.y, bounding.max.z, 1);
|
corners[7] = transform.toMatrix() * Vector4(bounding.max.x, bounding.max.y, bounding.max.z, 1);
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[0], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[0], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[1], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[1], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[0], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[0], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[2], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[2], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[1], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[1], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[3], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[3], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[2], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[2], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[3], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[3], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[0], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[0], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[4], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[4], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[1], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[1], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[5], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[5], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[2], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[2], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[6], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[6], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[3], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[3], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[7], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[7], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[4], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[4], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[5], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[5], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[4], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[4], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[6], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[6], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[6], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[6], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[7], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[7], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[5], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[5], .color = meshlets[data.meshletOffset + i].color });
|
||||||
// addDebugVertex(DebugVertex{ .position = corners[7], .color = meshlets[data.meshletOffset + i].color });
|
addDebugVertex(DebugVertex{ .position = corners[7], .color = meshlets[data.meshletOffset + i].color });
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
matInstanceData.materialInstance = referencedInstance;
|
matInstanceData.materialInstance = referencedInstance;
|
||||||
referencedInstance->updateDescriptor();
|
referencedInstance->updateDescriptor();
|
||||||
@@ -142,7 +142,7 @@ void VertexData::createDescriptors()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexData::loadMesh(MeshId id, Array<uint32> loadedIndices, Array<Meshlet> loadedMeshlets)
|
void VertexData::loadMesh(MeshId id, Array<uint16> loadedIndices, Array<Meshlet> loadedMeshlets)
|
||||||
{
|
{
|
||||||
meshlets.reserve(meshlets.size() + loadedMeshlets.size());
|
meshlets.reserve(meshlets.size() + loadedMeshlets.size());
|
||||||
vertexIndices.reserve(vertexIndices.size() + loadedMeshlets.size() * Gfx::numVerticesPerMeshlet);
|
vertexIndices.reserve(vertexIndices.size() + loadedMeshlets.size() * Gfx::numVerticesPerMeshlet);
|
||||||
@@ -164,7 +164,7 @@ void VertexData::loadMesh(MeshId id, Array<uint32> loadedIndices, Array<Meshlet>
|
|||||||
primitiveIndices.resize(primitiveOffset + (m.numPrimitives * 3));
|
primitiveIndices.resize(primitiveOffset + (m.numPrimitives * 3));
|
||||||
std::memcpy(primitiveIndices.data() + primitiveOffset, m.primitiveLayout, m.numPrimitives * 3 * sizeof(uint8));
|
std::memcpy(primitiveIndices.data() + primitiveOffset, m.primitiveLayout, m.numPrimitives * 3 * sizeof(uint8));
|
||||||
meshlets.add(MeshletDescription{
|
meshlets.add(MeshletDescription{
|
||||||
.bounding = m.boundingBox.toSphere(),
|
.bounding = m.boundingBox,//.toSphere(),
|
||||||
.vertexCount = m.numVertices,
|
.vertexCount = m.numVertices,
|
||||||
.primitiveCount = m.numPrimitives,
|
.primitiveCount = m.numPrimitives,
|
||||||
.vertexOffset = vertexOffset,
|
.vertexOffset = vertexOffset,
|
||||||
@@ -173,7 +173,7 @@ void VertexData::loadMesh(MeshId id, Array<uint32> loadedIndices, Array<Meshlet>
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
meshData[id].add(MeshData{
|
meshData[id].add(MeshData{
|
||||||
.bounding = meshAABB.toSphere(),
|
.bounding = meshAABB,//.toSphere(),
|
||||||
.numMeshlets = numMeshlets,
|
.numMeshlets = numMeshlets,
|
||||||
.meshletOffset = meshletOffset,
|
.meshletOffset = meshletOffset,
|
||||||
.indicesOffset = (uint32)meshOffsets[id],
|
.indicesOffset = (uint32)meshOffsets[id],
|
||||||
@@ -183,13 +183,13 @@ void VertexData::loadMesh(MeshId id, Array<uint32> loadedIndices, Array<Meshlet>
|
|||||||
meshData[id][0].firstIndex = indices.size();
|
meshData[id][0].firstIndex = indices.size();
|
||||||
meshData[id][0].numIndices = loadedIndices.size();
|
meshData[id][0].numIndices = loadedIndices.size();
|
||||||
indices.resize(indices.size() + loadedIndices.size());
|
indices.resize(indices.size() + loadedIndices.size());
|
||||||
std::memcpy(indices.data() + meshData[id][0].firstIndex, loadedIndices.data(), loadedIndices.size() * sizeof(uint32));
|
std::memcpy(indices.data() + meshData[id][0].firstIndex, loadedIndices.data(), loadedIndices.size() * sizeof(uint16));
|
||||||
indexBuffer = graphics->createIndexBuffer(IndexBufferCreateInfo{
|
indexBuffer = graphics->createIndexBuffer(IndexBufferCreateInfo{
|
||||||
.sourceData = {
|
.sourceData = {
|
||||||
.size = sizeof(uint32) * indices.size(),
|
.size = sizeof(uint16) * indices.size(),
|
||||||
.data = (uint8*)indices.data(),
|
.data = (uint8*)indices.data(),
|
||||||
},
|
},
|
||||||
.indexType = Gfx::SE_INDEX_TYPE_UINT32,
|
.indexType = Gfx::SE_INDEX_TYPE_UINT16,
|
||||||
});
|
});
|
||||||
meshletBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
|
meshletBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
|
||||||
.sourceData = {
|
.sourceData = {
|
||||||
@@ -201,7 +201,7 @@ void VertexData::loadMesh(MeshId id, Array<uint32> loadedIndices, Array<Meshlet>
|
|||||||
});
|
});
|
||||||
vertexIndicesBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
|
vertexIndicesBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
|
||||||
.sourceData = {
|
.sourceData = {
|
||||||
.size = sizeof(uint32) * vertexIndices.size(),
|
.size = sizeof(uint16) * vertexIndices.size(),
|
||||||
.data = (uint8*)vertexIndices.data(),
|
.data = (uint8*)vertexIndices.data(),
|
||||||
},
|
},
|
||||||
.numElements = vertexIndices.size(),
|
.numElements = vertexIndices.size(),
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public:
|
|||||||
};
|
};
|
||||||
struct MeshData
|
struct MeshData
|
||||||
{
|
{
|
||||||
BoundingSphere bounding;
|
AABB bounding;
|
||||||
uint32 numMeshlets = 0;
|
uint32 numMeshlets = 0;
|
||||||
uint32 meshletOffset = 0;
|
uint32 meshletOffset = 0;
|
||||||
uint32 firstIndex = 0;
|
uint32 firstIndex = 0;
|
||||||
@@ -61,7 +61,7 @@ public:
|
|||||||
void resetMeshData();
|
void resetMeshData();
|
||||||
void updateMesh(PMesh mesh, Component::Transform& transform);
|
void updateMesh(PMesh mesh, Component::Transform& transform);
|
||||||
void createDescriptors();
|
void createDescriptors();
|
||||||
void loadMesh(MeshId id, Array<uint32> indices, Array<Meshlet> meshlets);
|
void loadMesh(MeshId id, Array<uint16> indices, Array<Meshlet> meshlets);
|
||||||
MeshId allocateVertexData(uint64 numVertices);
|
MeshId allocateVertexData(uint64 numVertices);
|
||||||
uint64 getMeshOffset(MeshId id);
|
uint64 getMeshOffset(MeshId id);
|
||||||
uint64 getMeshVertexCount(MeshId id);
|
uint64 getMeshVertexCount(MeshId id);
|
||||||
@@ -85,7 +85,7 @@ protected:
|
|||||||
VertexData();
|
VertexData();
|
||||||
struct MeshletDescription
|
struct MeshletDescription
|
||||||
{
|
{
|
||||||
BoundingSphere bounding;
|
AABB bounding;
|
||||||
uint32_t vertexCount;
|
uint32_t vertexCount;
|
||||||
uint32_t primitiveCount;
|
uint32_t primitiveCount;
|
||||||
uint32_t vertexOffset;
|
uint32_t vertexOffset;
|
||||||
@@ -100,8 +100,8 @@ protected:
|
|||||||
Map<MeshId, uint64> meshVertexCounts;
|
Map<MeshId, uint64> meshVertexCounts;
|
||||||
Array<MeshletDescription> meshlets;
|
Array<MeshletDescription> meshlets;
|
||||||
Array<uint8> primitiveIndices;
|
Array<uint8> primitiveIndices;
|
||||||
Array<uint32> vertexIndices;
|
Array<uint16> vertexIndices;
|
||||||
Array<uint32> indices;
|
Array<uint16> indices;
|
||||||
Gfx::PGraphics graphics;
|
Gfx::PGraphics graphics;
|
||||||
Gfx::ODescriptorLayout instanceDataLayout;
|
Gfx::ODescriptorLayout instanceDataLayout;
|
||||||
// for mesh shading
|
// for mesh shading
|
||||||
|
|||||||
@@ -140,8 +140,8 @@ struct AABB
|
|||||||
corners[5] = Vector(max.x, min.y, max.z);
|
corners[5] = Vector(max.x, min.y, max.z);
|
||||||
corners[6] = Vector(max.x, max.y, min.z);
|
corners[6] = Vector(max.x, max.y, min.z);
|
||||||
corners[7] = Vector(max.x, max.y, max.z);
|
corners[7] = Vector(max.x, max.y, max.z);
|
||||||
Vector tmin = Vector(1, 1, 1) * std::numeric_limits<float>::max();
|
Vector tmin = Vector(std::numeric_limits<float>::max());
|
||||||
Vector tmax = Vector(1, 1, 1) * std::numeric_limits<float>::lowest();
|
Vector tmax = Vector(std::numeric_limits<float>::lowest());
|
||||||
for(int i = 0; i < 8; ++i)
|
for(int i = 0; i < 8; ++i)
|
||||||
{
|
{
|
||||||
Vector transformed = matrix * Vector4(corners[i], 1.0f);
|
Vector transformed = matrix * Vector4(corners[i], 1.0f);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ GameView::GameView(Gfx::PGraphics graphics, PWindow window, const ViewportCreate
|
|||||||
renderGraph.addPass(new DepthPrepass(graphics, scene));
|
renderGraph.addPass(new DepthPrepass(graphics, scene));
|
||||||
renderGraph.addPass(new LightCullingPass(graphics, scene));
|
renderGraph.addPass(new LightCullingPass(graphics, scene));
|
||||||
renderGraph.addPass(new BasePass(graphics, scene));
|
renderGraph.addPass(new BasePass(graphics, scene));
|
||||||
//renderGraph.addPass(new DebugPass(graphics, scene));
|
renderGraph.addPass(new DebugPass(graphics, scene));
|
||||||
//renderGraph.addPass(new SkyboxRenderPass(graphics, scene));
|
//renderGraph.addPass(new SkyboxRenderPass(graphics, scene));
|
||||||
renderGraph.setViewport(viewport);
|
renderGraph.setViewport(viewport);
|
||||||
renderGraph.createRenderPass();
|
renderGraph.createRenderPass();
|
||||||
|
|||||||
Reference in New Issue
Block a user