From f9be00604326a6dda719734ba90f43a9367c6300 Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Tue, 25 May 2021 11:58:50 +0200
Subject: [PATCH] [#35]Hacked camera into push constants

---
 include/vkcv/Core.hpp                         |   2 +-
 modules/camera/include/vkcv/camera/Camera.hpp |  25 +++++++++++-------
 projects/first_triangle/shaders/shader.vert   |  12 ++++++---
 projects/first_triangle/shaders/vert.spv      | Bin 1508 -> 1772 bytes
 projects/first_triangle/src/main.cpp          |  23 +++++++++-------
 src/vkcv/Core.cpp                             |   5 +++-
 src/vkcv/PipelineManager.cpp                  |  12 ++++-----
 7 files changed, 48 insertions(+), 31 deletions(-)

diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index 065c21d2..a3016f91 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -164,7 +164,7 @@ namespace vkcv
 		 * @brief render a beautiful triangle
 		*/
 		void renderTriangle(const PassHandle renderpassHandle, const PipelineHandle pipelineHandle,
-			const int width, const int height);
+			const int width, const int height, const size_t pushConstantSize, const void* pushConstantData);
 
 		/**
 		 * @brief end recording and present image
diff --git a/modules/camera/include/vkcv/camera/Camera.hpp b/modules/camera/include/vkcv/camera/Camera.hpp
index 90a2b003..64d8770e 100644
--- a/modules/camera/include/vkcv/camera/Camera.hpp
+++ b/modules/camera/include/vkcv/camera/Camera.hpp
@@ -8,15 +8,22 @@ namespace vkcv {
 
     class Camera {
     protected:
-        glm::mat4 m_view, m_projection;
-
-        int m_width, m_height;
-
-        float m_oldX, m_oldY,
-                m_near, m_far,
-                m_fov, m_ratio;
-
-        glm::vec3 m_position, m_direction, m_up;
+		glm::mat4 m_view;
+		glm::mat4 m_projection;
+
+		int m_width;
+		int m_height;
+
+		float m_oldX;
+		float m_oldY;
+		float m_near;
+		float m_far;
+		float m_fov;
+		float m_ratio;
+
+		glm::vec3 m_position;
+		glm::vec3 m_direction;
+		glm::vec3 m_up;
 
     public:
         Camera();
diff --git a/projects/first_triangle/shaders/shader.vert b/projects/first_triangle/shaders/shader.vert
index 1d278d5f..e129186a 100644
--- a/projects/first_triangle/shaders/shader.vert
+++ b/projects/first_triangle/shaders/shader.vert
@@ -3,11 +3,15 @@
 
 layout(location = 0) out vec3 fragColor;
 
+layout( push_constant ) uniform constants{
+    mat4 mvp;
+};
+
 void main()	{
     vec3 positions[3] = {
-        vec3(-0.5, 0.5, 0),
-        vec3( 0.5, 0.5, 0),
-        vec3(0, -0.5, 0)
+        vec3(-0.5, 0.5, -1),
+        vec3( 0.5, 0.5, -1),
+        vec3(0, -0.5, -1)
     };
     
     vec3 colors[3] = {
@@ -16,6 +20,6 @@ void main()	{
         vec3(0, 0, 1)
     };
 
-	gl_Position = vec4(positions[gl_VertexIndex], 1.0);
+	gl_Position = mvp * vec4(positions[gl_VertexIndex], 1.0);
 	fragColor = colors[gl_VertexIndex];
 }
\ No newline at end of file
diff --git a/projects/first_triangle/shaders/vert.spv b/projects/first_triangle/shaders/vert.spv
index bd1e0e682c52e6e38a5f5aba4eeaf8e73a70d741..03af5758ffff1b5b6505fe98b02044849026832d 100644
GIT binary patch
literal 1772
zcmYk6ZBNut5QQ)7F0TS2@}eSiT?J(k-vCimf@l_#O+ZQf+N`@3Yf5+17NUOQFZhc{
z{8fH2@jPuW={3XLbLPx+=HBa;`fG#6^qCPeW?q?WO`3i&#*CVQ)Hj+(&9yk`tgUZ6
zMlo(msSwSC8A|tM{XJ><A;6K<Wm~e6{`JfMk+^JzO{3}VetPT1Uau9k63>mlwK`tp
zcE5c0+DVLN1Wn`MpwWEqwtGD{PJRZS8~CB;cKk>x|I9--RM7chJ2>qW1r;fZJylG_
zTu~prZtN$1H`J%Zl+Cn!yBl;P5f#n5AbcFShhFsAixTgLpxBIOPb@DXb}-d*4k_=4
z$&vp{-I0^Um|d~G!0)~D<D?a~y~`M<NbEESE@Ks)mm{7<&v)h9YFC*Yk8;Z?NBrch
zCq>CD0kr6!b63r*`43@-38=$ee2rSid(5i+zBp!Ojb`qWV;(rX)iDPgJzI`F9Ov9n
zgnH=q3q4j+oXw%FsqsgP8qCJh12k7<)PSQ#LpAF1)L+RlGuWP|q(WC!4t=nn(QZKA
zk<BWfx?tkd!n{;R#;WIdSbO60!XxtJz&XNv8w`)0T4OS;3ya4yykqf1iq9`rrM7dC
zgN~TxCv(p7HvgJ<meoyZ4@V7~Pe0dXoEde{*!&sojXB@3`LjZB)W9r1mtz~V{EdQ^
z7(Cy*DWev7XgJ?n@|+3x&-Xdsc^U79^Smuj9Bx57?#|{A!#L+fdG3Jtc8;B#<KC*;
zgQ?4Rz;|S<IpLZ-b?IY4m3TvN)V?RreZo;2yp(gqm-D^VuL$!UzJVUhJA_03P@a3m
zz#H=P&iBF3b4;9kFz*)4rrtd7ls;K-f5q^B1TF84-zb|4=JyHwMrvZ*J9~KUWLMeC
z^7m!T#ksszE#`S3g9lgTS7ppX4s)!@s0ojT?>v&hf0Ty1;|Cv(Ww|HX!}S%or#Z)b
zhpNPRJd=@+o;dI6x9SpGm(d>@`r#ZmWsZy)m=TQ5_WwfrV*f9NIR|*#|F-t<<a6%e
Jf9iBg_8)N7hMWKZ

literal 1508
zcmZ9M>rd1`6van&m&YO?BH#nD>-q#-e8<EnK`_;16HpSrHg&gRP3>;lV$@ImXD0qt
zelhX<+L?9ZkjuU2+;eB{+$q#1+Ed1yGEFmQ9++w^nh7z+%$mv4``x2%ColS)hmY=}
zm^Zajh-Se|mvLRcKZkJ&xFT!Iwq-T_OvwL|xNc^Q-wk%(z6kPY7-nG+1^LIYA7#Pd
z{imo`<Y<~`{DT9(`!eVahe2L^OQIl&(<tc2nN;zY2;KCUE>3&NNq=0>kYc>2hH047
z>SH*_<02lUI!a94oRjYjl0hb-q5EDIK2CzeD0>%WMf6orY{e6kvs;LrD)r2v<m0qB
ziodHnYN{M}S8gwfhx>6}glR7t<(MM5lO!4C8k!gLW6=+Dl%{Itb=s#R?!s(8Wa051
zy(@ktj^0_bl^b!@Tk^{Pbo7Oe9$YOk9CP!PVLx=f82TW$VKL{g%UDZNp=+szJ&0En
zP0D++Rn_YwD>3<HVZItq#@e)aMlty{;ifz_aGo${gW=J$_nb`Yr^E9V-f?)L!e&cq
zYR|~1K}XK<i<bMJKWlZ=I6dbt$=HiJH151*#m4;Dar>?a!BOk#>0{Mmmvj2_V_I_X
zoOeOSUeuvso)_hr0dK|m%=40rH)eio^5o&x74ep?h8)IRc|&GS{;9=$f9{<;#Tff?
z4slDyqW-EpIZsACxGk%=y1A~HJ7eg#<k_2Ez#WUpQxD#@++%&yd`sMsMcr>P4SBSD
z6Z}oPS}=dl;OA14<E@C{nd39ndGgm}^tr3u=<$XOJv<urxG95wBMq~>WjVPKciVE@
z*XcGaNAHK)iMwvfs7Ftp_vLKnaYx3?TQYhDqj$aXPj|f6d&1lY-t~H4F+BCm5Bx{3
H@I>|(cxrZg

diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index 5ff33793..d9c16d57 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -24,7 +24,7 @@ int main(int argc, const char** argv) {
     std::shared_ptr<vkcv::TrackballCamera> trackball;
     camera.setPerspective( glm::radians(60.0f), windowWidth / (float)windowHeight, 0.1f, 10.f);
     glm::vec3 up(0.0f, 1.0f, 0.0f);
-    glm::vec3 position(1.0f, 0.0f, 0.0f);
+    glm::vec3 position(0.0f, 0.0f, 0.0f);
     glm::vec3 front(0.0f, 0.0f, -1.0f);
     glm::vec3 center = position + front;
     camera.lookAt(position, center, up);
@@ -41,7 +41,7 @@ int main(int argc, const char** argv) {
 
     // showing basic usage lambda events of window
     window.e_mouseMove.add([&](double x, double y) {
-        std::cout << "movement: " << x << " , " << y << std::endl;
+        //std::cout << "movement: " << x << " , " << y << std::endl;
 
         if (firstMouse) {
             lastX = x;
@@ -77,7 +77,7 @@ int main(int argc, const char** argv) {
         center = position + front;
         camera.lookAt(position, center, up);
 
-        std::cout << "New center: " << center.x << ", " << center.y << ", " << center.z << std::endl;
+		//std::cout << "New center: " << center.x << ", " << center.y << ", " << center.z << std::endl;
     });
 
     window.e_mouseScroll.add([&](double xoffset, double yoffset) {
@@ -90,37 +90,37 @@ int main(int argc, const char** argv) {
             fov = 45.0f;
         }
         camera.setFov(fov);
-        std::cout << "New FOV: " << fov << std::endl;
+		//std::cout << "New FOV: " << fov << std::endl;
     });
 
     window.e_key.add([&](int key, int scancode, int action, int mods) {
         switch (key) {
             case GLFW_KEY_W:
-                std::cout << "Move forward" << std::endl;
+				//std::cout << "Move forward" << std::endl;
                 position += cameraSpeed * front;
                 center = position + front;
                 camera.lookAt(position, center, up);
                 break;
             case GLFW_KEY_S:
-                std::cout << "Move left" << std::endl;
+				//std::cout << "Move left" << std::endl;
                 position -= cameraSpeed * front;
                 center = position + front;
                 camera.lookAt(position, center, up);
                 break;
             case GLFW_KEY_A:
-                std::cout << "Move backward" << std::endl;
+				//std::cout << "Move backward" << std::endl;
                 position -= glm::normalize(glm::cross(front, up)) * cameraSpeed;
                 center = position + front;
                 camera.lookAt(position, center, up);
                 break;
             case GLFW_KEY_D:
-                std::cout << "Move right" << std::endl;
+				//std::cout << "Move right" << std::endl;
                 position += glm::normalize(glm::cross(front, up)) * cameraSpeed;
                 center = position + front;
                 camera.lookAt(position, center, up);
                 break;
             default:
-                std::cout << "this key is not supported yet: " << std::endl;
+				__nop;//std::cout << "this key is not supported yet: " << std::endl;
         }
     });
 
@@ -211,7 +211,10 @@ int main(int argc, const char** argv) {
 	while (window.isWindowOpen())
 	{
 		core.beginFrame();
-	    core.renderTriangle(trianglePass, trianglePipeline, windowWidth, windowHeight);
+
+		const glm::mat4 mvp = camera.getProjection() * camera.getView();
+
+	    core.renderTriangle(trianglePass, trianglePipeline, windowWidth, windowHeight, sizeof(mvp), &mvp);
 	    core.endFrame();
 	}
 	return 0;
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index 48871511..2a8dddfc 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -167,7 +167,8 @@ namespace vkcv
 	}
 
 	void Core::renderTriangle(const PassHandle renderpassHandle, const PipelineHandle pipelineHandle, 
-		const int width, const int height) {
+		const int width, const int height, const size_t pushConstantSize, const void *pushConstantData) {
+
 		if (m_currentSwapchainImageIndex == std::numeric_limits<uint32_t>::max()) {
 			return;
 		}
@@ -184,7 +185,9 @@ namespace vkcv
 		m_CommandResources.commandBuffer.beginRenderPass(beginInfo, subpassContents, {});
 
 		const vk::Pipeline pipeline = m_PipelineManager->getVkPipeline(pipelineHandle);
+		const vk::PipelineLayout pipelineLayout = m_PipelineManager->getVkPipelineLayout(pipelineHandle);
 		m_CommandResources.commandBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline, {});
+		m_CommandResources.commandBuffer.pushConstants(pipelineLayout, vk::ShaderStageFlagBits::eAll, 0, pushConstantSize, pushConstantData);
 		m_CommandResources.commandBuffer.draw(3, 1, 0, 0, {});
 		m_CommandResources.commandBuffer.endRenderPass();
 	}
diff --git a/src/vkcv/PipelineManager.cpp b/src/vkcv/PipelineManager.cpp
index e6d6beea..576cb473 100644
--- a/src/vkcv/PipelineManager.cpp
+++ b/src/vkcv/PipelineManager.cpp
@@ -140,14 +140,14 @@ namespace vkcv
                 { 1.f,1.f,1.f,1.f }
         );
 
+		const size_t matrixPushConstantSize = 4 * 4 * sizeof(float);
+		const vk::PushConstantRange pushConstantRange(vk::ShaderStageFlagBits::eAll, 0, matrixPushConstantSize);
+
         // pipeline layout
         vk::PipelineLayoutCreateInfo pipelineLayoutCreateInfo(
-                {},
-                0,
-                {},
-                0,
-                {}
-        );
+			{},
+			{},
+			(pushConstantRange));
         vk::PipelineLayout vkPipelineLayout{};
         if (m_Device.createPipelineLayout(&pipelineLayoutCreateInfo, nullptr, &vkPipelineLayout) != vk::Result::eSuccess)
         {
-- 
GitLab