From c6c021b2f6a76725160440f59ed00cb85f24207f Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Mon, 5 Jul 2021 18:29:26 +0200
Subject: [PATCH] [#56] Fixed annoying camera to get rid of pitch and yaw
 members

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 modules/camera/include/vkcv/camera/Camera.hpp | 19 +++++--
 modules/camera/src/vkcv/camera/Camera.cpp     | 49 +++++++++++++------
 modules/scene/src/vkcv/scene/Mesh.cpp         |  5 +-
 modules/scene/src/vkcv/scene/Scene.cpp        |  6 +++
 projects/first_scene/src/main.cpp             |  9 +++-
 5 files changed, 67 insertions(+), 21 deletions(-)

diff --git a/modules/camera/include/vkcv/camera/Camera.hpp b/modules/camera/include/vkcv/camera/Camera.hpp
index ce32d3f8..8a8c5df5 100644
--- a/modules/camera/include/vkcv/camera/Camera.hpp
+++ b/modules/camera/include/vkcv/camera/Camera.hpp
@@ -3,6 +3,8 @@
 #include <glm/glm.hpp>
 #include <glm/gtc/matrix_transform.hpp>
 #include <glm/gtc/matrix_access.hpp>
+#include <glm/vec3.hpp>
+#include <glm/mat4x4.hpp>
 
 namespace vkcv::camera {
 
@@ -20,9 +22,6 @@ namespace vkcv::camera {
 		glm::vec3 m_up;
         glm::vec3 m_position;
         glm::vec3 m_center;
-
-        float m_pitch;
-        float m_yaw;
 	
 		/**
 		 * @brief Sets the view matrix of the camera to @p view
@@ -156,6 +155,20 @@ namespace vkcv::camera {
          * @param[in] center The new center point.
          */
         void setCenter(const glm::vec3& center);
+        
+        /**
+         * @brief Gets the angles of the camera.
+         * @param[out] pitch The pitch value in radians
+         * @param[out] yaw The yaw value in radians
+         */
+		void getAngles(float& pitch, float& yaw);
+  
+		/**
+		 * @brief Sets the angles of the camera.
+		 * @param pitch The new pitch value in radians
+		 * @param yaw The new yaw value in radians
+		 */
+		void setAngles(float pitch, float yaw);
 
         /**
          * @brief Gets the pitch value of the camera in degrees.
diff --git a/modules/camera/src/vkcv/camera/Camera.cpp b/modules/camera/src/vkcv/camera/Camera.cpp
index e78974e6..87d09aa9 100644
--- a/modules/camera/src/vkcv/camera/Camera.cpp
+++ b/modules/camera/src/vkcv/camera/Camera.cpp
@@ -10,8 +10,6 @@ namespace vkcv::camera {
 			glm::vec3(0.0f, 0.0f, 0.0f),
 			glm::vec3(0.0f, 1.0f, 0.0f)
 		);
-  
-		setFront(glm::normalize(m_center - m_position));
     }
 
     Camera::~Camera() = default;
@@ -93,16 +91,11 @@ namespace vkcv::camera {
     }
 
     glm::vec3 Camera::getFront() const {
-        glm::vec3 direction;
-        direction.x = std::sin(glm::radians(m_yaw)) * std::cos(glm::radians(m_pitch));
-        direction.y = std::sin(glm::radians(m_pitch));
-        direction.z = std::cos(glm::radians(m_yaw)) * std::cos(glm::radians(m_pitch));
-        return glm::normalize(direction);
+        return glm::normalize(m_center - m_position);
     }
     
     void Camera::setFront(const glm::vec3 &front) {
-		m_pitch = std::atan2(front.y, std::sqrt(front.x * front.x + front.z * front.z));
-		m_yaw = std::atan2(front.x, front.z);
+		setCenter(m_position + front);
     }
 
     const glm::vec3& Camera::getPosition() const {
@@ -128,21 +121,47 @@ namespace vkcv::camera {
 	void Camera::setUp(const glm::vec3 &up) {
 		lookAt(m_position, m_center, up);
 	}
-
-    float Camera::getPitch() const {
-        return m_pitch;
+	
+	void Camera::getAngles(float& pitch, float& yaw) {
+		const auto front = getFront();
+		
+		pitch = std::atan2(front[1], std::sqrt(
+				front[0] * front[0] + front[2] * front[2]
+		));
+		
+		yaw = std::atan2(front[0], front[2]);
+	}
+	
+	void Camera::setAngles(float pitch, float yaw) {
+		float cosPitch = std::cos(pitch);
+		
+		setFront(glm::vec3(
+				std::sin(yaw) * cosPitch,
+				std::sin(pitch),
+				std::cos(yaw) * cosPitch
+		));
+	}
+	
+	float Camera::getPitch() const {
+    	const auto front = getFront();
+    	
+        return glm::degrees(std::atan2(front[1], std::sqrt(
+        		front[0] * front[0] + front[2] * front[2]
+		)));
     }
 
     void Camera::setPitch(float pitch) {
-        m_pitch = pitch;
+		setAngles(glm::radians(pitch), glm::radians(getYaw()));
     }
 
     float Camera::getYaw() const {
-        return m_yaw;
+		const auto front = getFront();
+	
+		return glm::degrees(std::atan2(front[0], front[2]));
     }
 
     void Camera::setYaw(float yaw) {
-        m_yaw = yaw;
+		setAngles(glm::radians(getPitch()), glm::radians(yaw));
     }
 
 }
\ No newline at end of file
diff --git a/modules/scene/src/vkcv/scene/Mesh.cpp b/modules/scene/src/vkcv/scene/Mesh.cpp
index 38e42666..c7ba1e0f 100644
--- a/modules/scene/src/vkcv/scene/Mesh.cpp
+++ b/modules/scene/src/vkcv/scene/Mesh.cpp
@@ -82,6 +82,8 @@ namespace vkcv::scene {
 	static glm::vec3 projectPoint(const glm::mat4& transform, const glm::vec3& point) {
 		const glm::vec4 position = transform * glm::vec4(point, 1.0f);
 		
+		//std::cout << "POS: " << position.x << " " << position.y << " " << position.z << " " << position.w << std::endl;
+		
 		return glm::vec3(
 				position[0] / position[3],
 				position[1] / position[3],
@@ -95,7 +97,7 @@ namespace vkcv::scene {
 				glm::vec3(+1.0f, +1.0f, +1.0f)
 		);
 		
-		return frustum.intersects(bounds);
+		return bounds.intersects(frustum);
 	}
 	
 	void Mesh::recordDrawcalls(const glm::mat4& viewProjection,
@@ -118,6 +120,7 @@ namespace vkcv::scene {
 			}
 			
 			if (!checkFrustum(aabb)) {
+				m_drawcalls[i].instanceCount = 2;
 				continue;
 			}
 			
diff --git a/modules/scene/src/vkcv/scene/Scene.cpp b/modules/scene/src/vkcv/scene/Scene.cpp
index aa8c83b4..e85bb5c9 100644
--- a/modules/scene/src/vkcv/scene/Scene.cpp
+++ b/modules/scene/src/vkcv/scene/Scene.cpp
@@ -66,6 +66,10 @@ namespace vkcv::scene {
 		return m_materials[index].m_data;
 	}
 	
+	std::ostream& operator << (std::ostream& out, const glm::vec3& vec) {
+		return out << vec.x << " " << vec.y << " " << vec.z;
+	}
+	
 	void Scene::recordDrawcalls(CommandStreamHandle       		&cmdStream,
 								const camera::Camera			&camera,
 								const PassHandle                &pass,
@@ -74,6 +78,8 @@ namespace vkcv::scene {
 		std::vector<glm::mat4> matrices;
 		std::vector<DrawcallInfo> drawcalls;
 		
+		std::cout << camera.getPosition() << " | " << camera.getFront() << std::endl;
+		
 		const glm::mat4 viewProjection = camera.getMVP();
 		
 		for (auto& node : m_nodes) {
diff --git a/projects/first_scene/src/main.cpp b/projects/first_scene/src/main.cpp
index 28de0add..37d3d35b 100644
--- a/projects/first_scene/src/main.cpp
+++ b/projects/first_scene/src/main.cpp
@@ -25,8 +25,13 @@ int main(int argc, const char** argv) {
 	vkcv::camera::CameraManager cameraManager(window);
 	uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 	uint32_t camIndex1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
-
-	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -3));
+	
+	glm::vec3 pos (-7.96175f, 0.889579f, -0.514462f);
+	glm::vec3 front (-0.504636f, -0.603207f, 0.617643f);
+	cameraManager.getCamera(camIndex0).setPosition(pos);
+	cameraManager.getCamera(camIndex0).setFront(front);
+	
+	//cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -3));
 	cameraManager.getCamera(camIndex0).setNearFar(0.1f, 30.0f);
 	
 	cameraManager.getCamera(camIndex1).setNearFar(0.1f, 30.0f);
-- 
GitLab