From 9478ce490a58cb53684c5f3c380cf4f1e557cf77 Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Tue, 20 Jul 2021 15:46:55 +0200
Subject: [PATCH] [#87] Compute bounding sphere per meshlet

---
 .../meshlet/include/vkcv/meshlet/Meshlet.hpp   | 10 ++++++----
 modules/meshlet/src/vkcv/meshlet/Meshlet.cpp   | 18 ++++++++++++++++++
 .../mesh_shader/resources/shaders/shader.mesh  | 10 ++++++----
 3 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp b/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp
index 498257c1..159bdb1a 100644
--- a/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp
+++ b/modules/meshlet/include/vkcv/meshlet/Meshlet.hpp
@@ -15,10 +15,12 @@ namespace vkcv::meshlet {
     };
 
     struct Meshlet {
-        uint32_t vertexOffset;
-        uint32_t vertexCount;
-        uint32_t indexOffset;
-        uint32_t indexCount;
+        uint32_t    vertexOffset;
+        uint32_t    vertexCount;
+        uint32_t    indexOffset;
+        uint32_t    indexCount;
+        glm::vec3   meanPosition;
+        float       boundingSphereRadius;
     };
 
     struct MeshShaderModelData {
diff --git a/modules/meshlet/src/vkcv/meshlet/Meshlet.cpp b/modules/meshlet/src/vkcv/meshlet/Meshlet.cpp
index 02bfa9d8..f5447a01 100644
--- a/modules/meshlet/src/vkcv/meshlet/Meshlet.cpp
+++ b/modules/meshlet/src/vkcv/meshlet/Meshlet.cpp
@@ -110,6 +110,24 @@ MeshShaderModelData createMeshShaderModelData(
             data.vertices.push_back(v);
         }
 
+        // compute mean position
+        meshlet.meanPosition = glm::vec3(0);
+        const uint32_t meshletLastVertexIndex = meshlet.vertexOffset + meshlet.vertexCount;
+
+        for (uint32_t vertexIndex = meshlet.vertexOffset; vertexIndex < meshletLastVertexIndex; vertexIndex++) {
+            const Vertex& v         = data.vertices[vertexIndex];
+            meshlet.meanPosition    += v.position;
+        }
+        meshlet.meanPosition /= meshlet.vertexCount;
+
+        // compute bounding sphere radius
+        meshlet.boundingSphereRadius = 0.f;
+        for (uint32_t vertexIndex = meshlet.vertexOffset; vertexIndex < meshletLastVertexIndex; vertexIndex++) {
+            const Vertex& v = data.vertices[vertexIndex];
+            const float d                   = glm::distance(v.position, meshlet.meanPosition);
+            meshlet.boundingSphereRadius    = glm::max(meshlet.boundingSphereRadius, d);
+        }
+
         data.meshlets.push_back(meshlet);
     }
 
diff --git a/projects/mesh_shader/resources/shaders/shader.mesh b/projects/mesh_shader/resources/shaders/shader.mesh
index 628d9841..97e73cbd 100644
--- a/projects/mesh_shader/resources/shaders/shader.mesh
+++ b/projects/mesh_shader/resources/shaders/shader.mesh
@@ -31,10 +31,12 @@ layout(std430, binding = 1) readonly buffer indexBuffer
 };
 
 struct Meshlet{
-    uint vertexOffset;
-    uint vertexCount;
-    uint indexOffset;
-    uint indexCount;
+    uint    vertexOffset;
+    uint    vertexCount;
+    uint    indexOffset;
+    uint    indexCount;
+    vec3    meanPosition;
+    float   boundingSphereRadius;
 };
 
 layout(std430, binding = 2) readonly buffer meshletBuffer
-- 
GitLab