From a2c6e25d892c8034676a21e78058cf305c1341c6 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Tue, 29 Nov 2022 02:26:47 +0100
Subject: [PATCH] Fix building acceleration structures from static scenes

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 include/vkcv/Core.hpp                                |  3 ++-
 modules/scene/src/vkcv/scene/Mesh.cpp                | 10 +++++++++-
 modules/scene/src/vkcv/scene/MeshPart.cpp            | 12 ++++++++----
 .../resources/shaders/ambientOcclusion.rchit         |  5 +----
 projects/rt_ambient_occlusion/src/main.cpp           |  9 ++++++---
 src/vkcv/AccelerationStructureManager.cpp            | 12 ++++++++++--
 src/vkcv/AccelerationStructureManager.hpp            |  3 ++-
 src/vkcv/Core.cpp                                    |  8 ++++++--
 8 files changed, 44 insertions(+), 18 deletions(-)

diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index 3e5b6e5f..985c0fc6 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -968,7 +968,8 @@ namespace vkcv {
 		 * @return Acceleration structure handle
 		 */
 		AccelerationStructureHandle createAccelerationStructure(
-				const std::vector<GeometryData> &geometryData);
+				const std::vector<GeometryData> &geometryData,
+				const BufferHandle &transformBuffer = {});
 		
 		/**
 		 * @brief Creates an acceleration structure handle built with a given list of
diff --git a/modules/scene/src/vkcv/scene/Mesh.cpp b/modules/scene/src/vkcv/scene/Mesh.cpp
index cd0509e7..4accf44b 100644
--- a/modules/scene/src/vkcv/scene/Mesh.cpp
+++ b/modules/scene/src/vkcv/scene/Mesh.cpp
@@ -138,7 +138,15 @@ namespace vkcv::scene {
 			return;
 		}
 		
-		const AccelerationStructureHandle handle = core.createAccelerationStructure(geometryData);
+		const glm::mat4 transformT = glm::transpose(m_transform);
+		
+		auto transformBuffer = buffer<glm::mat4>(core, BufferType::ACCELERATION_STRUCTURE_INPUT, 1);
+		transformBuffer.fill(&(transformT));
+		
+		const AccelerationStructureHandle handle = core.createAccelerationStructure(
+				geometryData,
+				transformBuffer.getHandle()
+		);
 		
 		if (handle) {
 			accelerationStructures.push_back(handle);
diff --git a/modules/scene/src/vkcv/scene/MeshPart.cpp b/modules/scene/src/vkcv/scene/MeshPart.cpp
index 88070f02..aa82a27d 100644
--- a/modules/scene/src/vkcv/scene/MeshPart.cpp
+++ b/modules/scene/src/vkcv/scene/MeshPart.cpp
@@ -41,9 +41,13 @@ namespace vkcv::scene {
 			}
 		}
 		
-		const uint32_t stride = vertexGroup.numVertices > 0? static_cast<uint32_t>(
-				vertexGroup.vertexBuffer.data.size() / vertexGroup.numVertices
-		) : 0;
+		uint32_t stride = 0;
+		for (const auto& attr : vertexGroup.vertexBuffer.attributes) {
+			if (attr.type == asset::PrimitiveType::POSITION) {
+				stride = attr.stride;
+				break;
+			}
+		}
 		
 		if ((positionAttributeIndex < m_data.getVertexBufferBindings().size()) &&
 			(stride > 0)) {
@@ -89,7 +93,7 @@ namespace vkcv::scene {
 			m_data.setCount(vertexGroup.numVertices);
 			
 			if (m_geometry.isValid()) {
-				m_geometry.setCount(vertexGroup.numIndices);
+				m_geometry.setCount(vertexGroup.numVertices);
 			}
 		}
 		
diff --git a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit
index 5f578536..79636ffc 100644
--- a/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit
+++ b/projects/rt_ambient_occlusion/resources/shaders/ambientOcclusion.rchit
@@ -24,8 +24,6 @@ layout(binding = 3, set = 0, scalar) buffer rtIndices
 void main() {
     payload.worldPosition = vec3(1.0, 0.0, 0.5);
 
-    payload.worldNormal = vec3(1.0 - attributes.x - attributes.y, attributes.xy);
-/*
     ivec3 indicesVec = ivec3(indices[3 * gl_PrimitiveID + 0], indices[3 * gl_PrimitiveID + 1], indices[3 * gl_PrimitiveID + 2]);
 
     // current triangle
@@ -42,8 +40,7 @@ void main() {
     const vec3 objectNormal = cross(v1 - v0, v2 - v0);
 
     payload.worldNormal = normalize((objectNormal * gl_WorldToObjectEXT).xyz);
-
     payload.worldNormal = faceforward(payload.worldNormal, gl_WorldRayDirectionEXT, payload.worldNormal);
-*/
+
     payload.hitSky = 0.0f;
 }
diff --git a/projects/rt_ambient_occlusion/src/main.cpp b/projects/rt_ambient_occlusion/src/main.cpp
index 608b8a5e..c5472e9f 100644
--- a/projects/rt_ambient_occlusion/src/main.cpp
+++ b/projects/rt_ambient_occlusion/src/main.cpp
@@ -55,9 +55,7 @@ int main(int argc, const char** argv) {
 			core,
 			"../first_scene/assets/Sponza/Sponza.gltf",
 			{
-					vkcv::asset::PrimitiveType::POSITION,
-					vkcv::asset::PrimitiveType::NORMAL,
-					vkcv::asset::PrimitiveType::TEXCOORD_0
+					vkcv::asset::PrimitiveType::POSITION
 			}
 	);
 	
@@ -67,6 +65,7 @@ int main(int argc, const char** argv) {
 
 	vkcv::camera::CameraManager cameraManager(core.getWindow(windowHandle));
 	auto camHandle = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+	auto camHandle2 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 	
 	cameraManager.getCamera(camHandle).setPosition(glm::vec3(0, 0, -3));
 	cameraManager.getCamera(camHandle).setNearFar(0.1f, 30.0f);
@@ -149,6 +148,10 @@ int main(int argc, const char** argv) {
 		raytracingPushData.camera_right = glm::vec4(glm::cross(cameraManager.getActiveCamera().getUp(), cameraManager.getActiveCamera().getFront()), 0);
 		raytracingPushData.camera_up = glm::vec4(cameraManager.getActiveCamera().getUp(),0);
 		raytracingPushData.camera_forward = glm::vec4(cameraManager.getActiveCamera().getFront(),0);
+		
+		raytracingPushData.camera_right = glm::normalize(raytracingPushData.camera_right);
+		raytracingPushData.camera_up = glm::normalize(raytracingPushData.camera_up);
+		raytracingPushData.camera_forward = glm::normalize(raytracingPushData.camera_forward);
 
 		vkcv::PushConstants pushConstants = vkcv::pushConstants<RaytracingPushConstantData>();
 		pushConstants.appendDrawcall(raytracingPushData);
diff --git a/src/vkcv/AccelerationStructureManager.cpp b/src/vkcv/AccelerationStructureManager.cpp
index b673921b..6b08cfd9 100644
--- a/src/vkcv/AccelerationStructureManager.cpp
+++ b/src/vkcv/AccelerationStructureManager.cpp
@@ -235,7 +235,8 @@ namespace vkcv {
 	}
 	
 	AccelerationStructureHandle AccelerationStructureManager::createAccelerationStructure(
-			const std::vector<GeometryData> &geometryData) {
+			const std::vector<GeometryData> &geometryData,
+			const BufferHandle &transformBuffer) {
 		std::vector<vk::AccelerationStructureGeometryKHR> geometries;
 		std::vector<vk::AccelerationStructureBuildGeometryInfoKHR> geometryInfos;
 		std::vector<std::vector<vk::AccelerationStructureBuildRangeInfoKHR>> rangeInfos;
@@ -253,6 +254,13 @@ namespace vkcv {
 		
 		auto& bufferManager = getBufferManager();
 		
+		vk::DeviceAddress transformBufferAddress;
+		if (transformBuffer) {
+			transformBufferAddress = bufferManager.getBufferDeviceAddress(transformBuffer);
+		} else {
+			transformBufferAddress = 0;
+		}
+		
 		vk::DeviceSize accelerationStructureSize = 0;
 		vk::DeviceSize scratchBufferSize = 0;
 		
@@ -286,7 +294,7 @@ namespace vkcv {
 					static_cast<uint32_t>(vertexCount - 1),
 					indexType,
 					indexBufferAddress,
-					{}
+					transformBufferAddress
 			);
 			
 			const vk::AccelerationStructureGeometryKHR asGeometry (
diff --git a/src/vkcv/AccelerationStructureManager.hpp b/src/vkcv/AccelerationStructureManager.hpp
index 5e773669..d5afaadd 100644
--- a/src/vkcv/AccelerationStructureManager.hpp
+++ b/src/vkcv/AccelerationStructureManager.hpp
@@ -77,7 +77,8 @@ namespace vkcv {
 				const AccelerationStructureHandle &handle) const;
 		
 		[[nodiscard]] AccelerationStructureHandle createAccelerationStructure(
-				const std::vector<GeometryData> &geometryData);
+				const std::vector<GeometryData> &geometryData,
+				const BufferHandle &transformBuffer);
 		
 		[[nodiscard]] AccelerationStructureHandle createAccelerationStructure(
 				const std::vector<AccelerationStructureHandle> &accelerationStructures);
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index f2152223..4f37b9b2 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -1352,8 +1352,12 @@ namespace vkcv {
 	}
 	
 	AccelerationStructureHandle Core::createAccelerationStructure(
-			const std::vector<GeometryData> &geometryData) {
-		return m_AccelerationStructureManager->createAccelerationStructure(geometryData);
+			const std::vector<GeometryData> &geometryData,
+			const BufferHandle &transformBuffer) {
+		return m_AccelerationStructureManager->createAccelerationStructure(
+				geometryData,
+				transformBuffer
+		);
 	}
 	
 	AccelerationStructureHandle Core::createAccelerationStructure(
-- 
GitLab