From df334c3941ff4ff2017feadee540153e4436af7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Con=C3=A1l?= Date: Wed, 7 Feb 2024 10:39:07 -0500 Subject: [PATCH] Got mouse and keyboard movement working -- I think --- Input/Input.cpp | 9 +++------ Renderer/Renderer.cpp | 4 ++-- Renderer/Renderer.hpp | 2 +- Renderer/UniformBuffer.cpp | 4 ---- Renderer/UniformBuffer.hpp | 8 ++++---- Scene/Camera.hpp | 6 +++++- UI/UI.cpp | 11 ++++++++++- assets/shaders/ray.frag | 35 +++++++++++++++++++++++++++++++---- assets/shaders/ray.frag.spv | Bin 1020 -> 2724 bytes assets/shaders/ray.vert | 13 +++++++++---- assets/shaders/ray.vert.spv | Bin 1304 -> 2132 bytes 11 files changed, 65 insertions(+), 27 deletions(-) diff --git a/Input/Input.cpp b/Input/Input.cpp index 1a0ab09..efd510a 100644 --- a/Input/Input.cpp +++ b/Input/Input.cpp @@ -82,18 +82,15 @@ void Input::handleMovementKeys(Renderer& ren) { forward = glm::vec3(glm::sin(ren.cam.theta)*glm::cos(ren.cam.phi), glm::cos(ren.cam.theta), glm::sin(ren.cam.theta)*glm::sin(ren.cam.phi)); else forward = glm::vec3(glm::cos(ren.cam.phi), 0.0, glm::sin(ren.cam.phi)); - const auto right = glm::cross(forward, glm::vec3(0.0, 1.0, 0.0)); + const auto right = glm::cross(glm::vec3(0.0, 1.0, 0.0), forward); const auto speed = glfwGetKey(in, GLFW_KEY_LEFT_SHIFT)? 2.0f : 1.0f; - if(glfwGetKey(in, GLFW_KEY_UP)) { - ren.cam.theta -= 0.01; - } if(glfwGetKey(in, GLFW_KEY_UP)) { - ren.cam.theta -= 0.01; + ren.cam.theta -= 0.02; } if(glfwGetKey(in, GLFW_KEY_DOWN)) { - ren.cam.theta += 0.01; + ren.cam.theta += 0.02; } if(glfwGetKey(in, GLFW_KEY_LEFT)) { diff --git a/Renderer/Renderer.cpp b/Renderer/Renderer.cpp index f441cc4..5f961da 100644 --- a/Renderer/Renderer.cpp +++ b/Renderer/Renderer.cpp @@ -324,10 +324,10 @@ void Renderer::draw() { auto sz = win.getDimensions(); uniform_buffer->upload(UniformData{ + .view = cam.view(), .viewport = glm::vec2(viewport.width, viewport.y), .time = time, - .cam_pos = cam.pos, - .cam_dir = cam.dir(), + .focal_length = 2.0, }); command_buffer->bind(*pipeline); diff --git a/Renderer/Renderer.hpp b/Renderer/Renderer.hpp index e904240..e53ae31 100644 --- a/Renderer/Renderer.hpp +++ b/Renderer/Renderer.hpp @@ -58,7 +58,7 @@ struct Renderer { std::unique_ptr ui; - Camera cam{ .pos = glm::vec3(0.0, -10.0, 0.0), }; + Camera cam{ .pos = glm::vec3(0.0, 0.0, -1.0), }; bool capture_mouse = false; bool flycam = false; diff --git a/Renderer/UniformBuffer.cpp b/Renderer/UniformBuffer.cpp index 87eb174..c344d5b 100644 --- a/Renderer/UniformBuffer.cpp +++ b/Renderer/UniformBuffer.cpp @@ -8,10 +8,6 @@ UniformBuffer::UniformBuffer(vk::PhysicalDevice phys_dev, vk::Device dev) { vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible ); - Log::debug("Offset of time: %zu\n", offsetof(UniformData, time)); - Log::debug("Offset of cam_pos: %zu\n", offsetof(UniformData, cam_pos)); - Log::debug("Offset of viewport: %zu\n", offsetof(UniformData, viewport)); - } void UniformBuffer::upload(const UniformData& data) { diff --git a/Renderer/UniformBuffer.hpp b/Renderer/UniformBuffer.hpp index 4e47551..6cc0297 100644 --- a/Renderer/UniformBuffer.hpp +++ b/Renderer/UniformBuffer.hpp @@ -12,19 +12,19 @@ /* Uniform: * * layout (set = 0, binding = 0) uniform Matrices { + * mat4 view; * vec2 viewport; * float time; - * vec3 cam_pos; - * vec3 cam_dir; + * float focal_length; * }; * */ struct UniformData { + glm::mat4 view; glm::vec2 viewport; float time; - glm::vec3 cam_pos; - glm::vec3 cam_dir; + float focal_length = 2.0; }; struct UniformBuffer { diff --git a/Scene/Camera.hpp b/Scene/Camera.hpp index 15b2f54..bd799b7 100644 --- a/Scene/Camera.hpp +++ b/Scene/Camera.hpp @@ -15,7 +15,11 @@ struct Camera { glm::vec3 pos = glm::vec3(0.0f); inline glm::vec3 dir() { - return glm::vec3(sin(theta) * cos(phi), cos(theta), sin(theta) * sin(phi)); + return glm::normalize(glm::vec3( + sin(theta) * cos(phi), + cos(theta), + sin(theta) * sin(phi) + )); } inline glm::mat4 view() { diff --git a/UI/UI.cpp b/UI/UI.cpp index 5403320..6239537 100644 --- a/UI/UI.cpp +++ b/UI/UI.cpp @@ -89,9 +89,18 @@ void UI::newFrame() { ImGui::SetNextWindowBgAlpha(0.5f); ImGui::Begin("Rendering Info", nullptr); + auto target = info.cam.dir() + info.cam.pos; + ImGui::Text("FPS: %f", info.fps); ImGui::Text("Time: %f", info.time); - ImGui::Checkbox("Fly Camera", &info.flycam); + ImGui::Text("Target: %f %f %f", target.x, target.y, target.z); + ImGui::SliderFloat("Theta", &info.cam.theta, 0.0, glm::pi()); + ImGui::SliderFloat("Phi", &info.cam.phi, 0.0, glm::two_pi()); + + ImGui::SliderFloat("X", &info.cam.pos.x, -10.0, 10.0); + ImGui::SliderFloat("Y", &info.cam.pos.y, -10.0, 10.0); + ImGui::SliderFloat("Z", &info.cam.pos.z, -10.0, 10.0); + ImGui::End(); } diff --git a/assets/shaders/ray.frag b/assets/shaders/ray.frag index 432dfb4..546ca09 100644 --- a/assets/shaders/ray.frag +++ b/assets/shaders/ray.frag @@ -1,16 +1,43 @@ #version 450 core layout (set = 0, binding = 0) uniform Matrices { + mat4 view; vec2 viewport; float time; - vec3 cam_pos; - vec3 cam_dir; }; -layout (location = 0) in vec2 texCoord; +layout (location = 0) in vec3 pos; +layout (location = 1) in vec3 dir; layout (location = 0) out vec4 fragColor; + +float sphere(vec3 p, vec3 center, float r) { + return length(p) - r; +} + +float sdf(vec3 pos) { + return sphere(pos, vec3(0.0, 0.0, 10.0), 3.0); +} + +float raycast() { + float t = 0.0; + for(int i = 0; i < 64; i++) { + float dt = sdf(pos + dir * t); + if(dt < 0.0001*t) + return t; + else if(dt > 200.0) + return -1; + t += dt; + } + + return -1; +} + void main() { - fragColor = vec4(abs(texCoord), abs(cos(time)), 1.0); + float d = raycast(); + + vec3 col = vec3(1.0-d*0.075); + + fragColor = vec4(col, 1.0); } \ No newline at end of file diff --git a/assets/shaders/ray.frag.spv b/assets/shaders/ray.frag.spv index e22c90e112dbcd4447efa473b500f52eab4ace53..e1f38d415efc7d3342adcbcdfdcc5ec0824ac47d 100644 GIT binary patch literal 2724 zcmZQ(Qf6mhU}WHC;AJRafB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N*wB3=CkLo0ypglCWT4V6b9fU`SyqP z4^)2)$Y1$6V0VJzAgw4d-8nxeALciZ`+O5iiZYW^i$QK@V_;Q<&kQm5rkUNz? zhJxi-7(jebyn%#-8JNK7QxTj}8Nh5Y24)5}1_lNN1_lOk1{Ma8{UAOl2PiPGFmNz1 zfW<)KAU-FQ4^pGZz{bGEzyQ_{QU}5yc|`^m29O^>YCvKj`$VAXv>8~y>SaL=Vqjo^ z@gd=*;HbmE2DVS0fq?;}282O!Fm)hzGB7weh%&G+XhPi$3L}u)w4iPSiG$RGXdNVb zKzw5c1_n@AiZC!Sn1J=OFqkudN(hKQtr;MEP`U(}3*&?07{mve3-Xr}D7>~`w1Dw_ z!1j1J!}tMUe#3qcA7pPB)D93Iq(2rSZx7?gGcYjBnmN-J6bH%BumY7kAb+KR%N7O( zkT}RaAU-IKf#OJlfrTL(lpmmF6i9y#R6i(9$U)N^NDWLJWG1K}1IdH(1;|VgACy)= zVrC4i;IsjFNG4507=#VM#<2H6A36Xp!e;JgDWk6~<3c?@EM!VgpygTj=b zfq?<$c5!f>#K6GA04kjr7$l%+2AtNQ>Ol5LGB7ZJ^uxkRiUFb)B>sOty2@*p>Z#F5<$s((Ok29+BicZxyX333Oh zUIDoSaQBIK_xE@A zag9$dD2OjEsmw`@&&kY7jZeueN=+`wEK3Ec<3LiEnU|bXnu4r=m4O9pKFnTL237`; z-DyRM>CX8%`9%y23?MO(TS`(Zob&UGQb6tli3u<;F!&~x6lEr-7K6mt7}yvpseo+aC&BnkA76*k#NoH;;vKYue$%(n~1^LAcFm<4i0g0t#7BR3gFf#~&G%zqQ zxHGVT-3AL|5Fg|&7~cbG4@kK(h+tq~fQf~0Hrbp29P*NJ%|tTKge$&_54uvApLUCxB#gI z*$I*ZVURh33=sE${0%Y(#0U8eWREBV3xhD!%^-8Np?ndj-5~v2oeIh311kdqgDnFK*zLT~w9Ui72IliY%?9ZK$vHBxGJxz5V_*Qs zJ;-j5UXVTF3=9k)agbgRUjnKZWClnMCN2pT2bl>{6Ue{{4ohhU1_qE?klSElGEgy) ne*+lU!SN)^z`y`f3z7qw1@fOA12Z`Nf#m)&Ffv#$FfsrDaI;27 diff --git a/assets/shaders/ray.vert b/assets/shaders/ray.vert index fae414f..78fbeb3 100644 --- a/assets/shaders/ray.vert +++ b/assets/shaders/ray.vert @@ -2,16 +2,21 @@ layout (location = 0) in vec2 aCoord; -layout (location = 0) out vec2 texCoord; +layout (location = 0) out vec3 pos; +layout (location = 1) out vec3 dir; layout (set = 0, binding = 0) uniform Matrices { + mat4 view; vec2 viewport; float time; - vec3 cam_pos; - vec3 cam_dir; + float focal_length; }; void main() { - texCoord = aCoord; + vec4 p = view * vec4(aCoord.x * viewport.x/viewport.y, aCoord.y, 0.0, 1.0); + pos = p.xyz; + p-= view * vec4(0.0, 0.0, -focal_length, 1.0); + dir = normalize(p.xyz); + gl_Position = vec4(aCoord, 0.0, 1.0); } \ No newline at end of file diff --git a/assets/shaders/ray.vert.spv b/assets/shaders/ray.vert.spv index 39540e7e5a52b007af8d7add0072ad8c8db9d887..c9c0626a1abe64ab6d1bd3407d95e0e043d46ef6 100644 GIT binary patch literal 2132 zcmZQ(Qf6mhU}WHC;AL=UfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!NCH9jXZFEu_TvnVyWB(p3Pq>ckgU1nZ#PH76V0#*hV24p)~8JNK? zDPUk=U}a!s;9+23@J%c!%1llz2Dyn1Dh6VgWu}&cXf_5musV=mL1G2@MI{h%h<=cp zOEPm)A!6)cwIH9TNqg&7^~5jm4Si511Y?eL4s&v>k0;gw1aLQ%?v&9&g8Q2&Y7!(*77{nP^7(n3z z;)C=mFt9LiFff3{K;jbMTma#NigDuoN zkQ+eZ42n}woPgW`k^^CoJ@!yDK=L4SKzvZz2AKnrcZJG>^qMiSg3|yfEOlDbB-aWqX&4yf85kHqdO_kay`a1WN;@FEpzwg% z0m_3QxelmaP<{pJ2Z_VnrUG>vvOZM?1_qFL00TQXt!pqaFo5)e#6fWkir0w@tYA4! z1_lO@e?e;Opk+5m4CDq-IO#GlfXj1#1`cps>oG7efW$x;6vm+R14{ECy`cC9$%EVm z3R`_>m>`EOsNw>NgVcb+%?PRnlvY4?g2L9Afq?-eUeCY+&T}RV3=AMKn14(e7#KkQ z0AY|EvVY7N7#KiyfYgA@1Np%m>W5~ipDh>|7(ikmwIFwc(ga8hrrrvw9_D9j1_lO@ z7ziW#nTLT5940ovd50g6stGLF)f9Ffv#$FfsrD)GLW7 literal 1304 zcmZQ(Qf6mhU}WHC;AK!^fB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N;uK3j+f~ZenI0h{Fli%fKMaz`(%Fz|6qJz`$^Zk%57Qfs4W2C*IxP-`&SGKDnSE zzPO|^CpA7NGcPqhC9^0sxg@hJ6{L;>NnK`Ma!zRqvI15H76xSdSQ%IuKz5d-RygP9 z7o~vQ08+!vz`&3Q6=7vyV-RFuU`Wr24@fNvOD!r%tpKTGgNlRLAi4bF%#zIfJO(xf zcCdO-IDo}7^GbpsCUa!W~OF4PSWF_0UQ z6LaGW@{1W@>Ogjb#8NVg7(jL^f(&6`U~p$(0f&9@zkQm55m>7r+5(CALI|DP=Jdiq&Jjf3qGnGLE0|Nt03}hxq43v^!Vjw*r zF##lXAhSVY3Shr5gTn-*4&*P8A7SYi#s`UktP*Bm0;fSmaB5@#v&9&g8Q2&Y7(ix; zGq5nQGcbVpAoCO$Siq?oWFJV}8p;QyF_0KYo{IsLYZ$=#K=L3y$loBpfXw5Cng`;{7^Gw7+4rU{sg%PBqj$f-GfVU;yz!c8H_#CBXa!dyx4uQ1d}{gZu$X8z4O(e}miwibGJC zfW$y@APmw63P(`bf#gB%0`WoN4-zwDU