From ff80f7b9aaf4813c1c6b0c53b7ef2554148dc0ac Mon Sep 17 00:00:00 2001 From: Asuro Date: Fri, 19 Mar 2021 02:43:28 +0100 Subject: [PATCH] Select stuff (hit detection is still off) --- shaders/triangle.frag | 8 ++++++++ shaders/triangle.frag.spv | Bin 3580 -> 4112 bytes shaders/triangle.vert | 1 + shaders/triangle.vert.spv | Bin 4436 -> 4500 bytes src/game/player.rs | 26 +++++++++++++++++++++----- src/vulkan/gameobject.rs | 14 ++++++++++++-- src/vulkan/mod.rs | 5 ----- src/vulkan/pipelines.rs | 3 +-- 8 files changed, 43 insertions(+), 14 deletions(-) diff --git a/shaders/triangle.frag b/shaders/triangle.frag index eba1bc5..cc264b4 100644 --- a/shaders/triangle.frag +++ b/shaders/triangle.frag @@ -1,6 +1,11 @@ #version 450 #extension GL_ARB_separate_shader_objects : enable +layout(push_constant) uniform PushConstants { + mat4 model; + bool is_selected; +} push; + layout(binding = 0) uniform ObjectUniformData { mat4 view; mat4 projection; @@ -42,4 +47,7 @@ void main() { vec3 specular_color = specular_value * specular_strength * light_color; out_color = vec4(ambient_color + diffuse_color + specular_color, 1.0) * texture(diffuse_tex, tex_coords); + if (push.is_selected) { + out_color = mix(out_color, vec4(0.5, 0.5, 0.0, 1.0), 0.1); + } } \ No newline at end of file diff --git a/shaders/triangle.frag.spv b/shaders/triangle.frag.spv index e6711a2107bde311027d5b5db9f7db639f0482b0..779b42d8ce5b113572c3d90f7f90d00c9bc487e8 100644 GIT binary patch delta 605 zcmew(Jwbt&nMs+Qfq{{Mi-CioXCiMnWB10?gG}LU3{?ya3<0IZ8P556#U+V(CB+O3 z3~UUnU~vWp28P`Hl++xs7(^{20|P^5aeQ%VPHJ*VY6=4@0}De90|P@rX>kTfJu3q% zL-%G)=4!@R4+a*vF{}&>3?4|vDudLbiLo;ZF!cfV;z@Pv%P7Z3NIs*e#oQ0v9fq{XOfdQ=DngPNGxfmp-&A`H-&A`A= z%K!=-kU1<2bx`#nb43`K7#bNE7(nVk{3fV9AU+!dgC0XWM8IB$ft^8^fq|iefdMQA z61QhyU=U+qU;tTaz`(%Jz1ficFk8JN11s2$dIkn?$bsy(h5Dm`fq?-ezM6p*Y;Q9I z0|Q75WbbzdW`;uLcR@X`$H2e<(g^YcNP`^%GuRN2{7(iZxJ4jG{AFNduwYfx(V}fx&@+fx(x7fgzlMfuWCqfngy7 z1H&Q)1_ovZW(Fn(28Kh73=Av`oDA+h@s2@G@x`eHiA9Mesqw`bi7BZ?@%c$vsmUe9 z3=FIcEDXqYu`;kRa4;}1r02v3q!xvx7L}w{fZV_a6$i0Fa{0xXC7Jno46F>y3?TP` z#90~G8Tc6(82rJ8hvsFbdG=x%Rw~AOptm|*c24ygIokM z60R2HkCM#XRES!L*`Sch$xP2Ei7$XTfq{*I3v4#X9}u~e%%ap}koyvI;*0W25a#Jh=14B|KOa!ElnIQ?Jj{(9i1j$3$^$ZLQpacmDD^Qv% zNdm<`D>&^X<>#fwXXd4VQVYmjP+A0wm8XJYi@}3|6`Za>?%)Oy3=9nJ49s9LP&|7u zuz=$bBn65eka|$s0P&SU1Oo%u444=@0|Pjx!1RH_A6XxW57Gz9Cor=>VhDYZ^a!#W zq^<$Ud{7z#iA_Kf1EnpH*a9RmkbNMr4N$*;+y*kwoq>e`l$Jnw7UXmoUlGIs>t_L{ z84wp_2FQJ&Gz8*<%mdNLV#sa=sRQ`~qz>daP#A*5VD^ISlmi(6b`uLYeS!Eec~H6n z@j*&J?gEu1AU?=U5FcbFG9Q$tKzx{fPsID04~iyJnFI2RHk8i;@+boXg9HN$11|#u*nE)LAiMa$`4?iQ90Lb9{ejeg zFvtxcc^C%S4=R~K;Q)$fko_P&D4s!LF#CiUK&3y(KP(Kw3=ltp%mcYk66#NoljIm6 zX#gY#5ockLW?*38WMBZN4UqXDKBx=Otm(K;sLf2E-48 znh#13AoU>X6-U!oa`)(hpJ(l1FyGDFXuo$Zn7tSQwZwFff3`k?k^viXq!&0TqMT z#RkqZmJAFGApIcqAbF7gL3tM>4)Pl)586Z9iXb^qJ_Ye%VdID;Y@8Sv7(n7Y3~b^ z0o4N%hw1SI*Nvch9;5?Ojw0*vg6aW@!Sr}DFff3`K^UY9WFAO9fPswxl<$4O^&kTS z$ZU{WP}qRdtsk`g3`$=hzCQy414u1M9OOn&*%<(8%YqDLU|@iW1wzF@_Q1q~pkgq4 zLFNU6+K*s;3=AN7P#l2DK9D%b4WMv~fVSWL8Q2*>@fFFyzyJ~hVUV@Rc0@5SFo5Ji z;xK!op<*C)Ape5wjbUJ50I3DZfzltyUQjs%5(n7}QWM9(zyK11@#CRk!Nb4~j=KbC zyo2Htq!uJ!&%gqf1GVKr@*s0TS?B!=uS zP=gsH2J#n7T_#i=B#a^DMHZ-^!oa`)QV)^`mHnXj1chxj0|NudZjc(78KCw$NF3R& zTm}XPkQlOEpf)Z@3}P1~zvVM9Fo5)f)Pv+fc?1-e1<Ou0z;Zn)K zzyPuvqy}bJ6$1kUNF3R&YN!~pT{TcKh+U9ysbyeb0O<#*2g$?2r4A`vKx#nY0;=CY z;;?W5wYkyD=SBtw29P)`T$-S16Xw=t1_lO@7_wVipkl~wZH0Uoej%+LMMJ{OD+>W6^B4#uCzz`y{~19Rsj1_lO@9%Oe;hKeD(a|%=pzxi2L)JTkfq?8-XFnGZ4#Bo4}R^B5QyKxTpTfz*J)6V%27iT`C_WUydh GWB>rwvrby3?TP` z#90~G8Tc6(82rJ8hvsFbdG=x%Rw~AOptm|*c24ygIokM z60R2HkCM#XRES!L*`Sch$xP2Ei7$XTfq{*I3v4#X9}u~e%%ap}koyvI;*0W25jUo0CH0d z0|P@+CQJmRkC_1!FC}0uMJJtz%;_{t!H zfdOm=OpKj@0h}XX`ao#~Ss#cG(&vDr4AL;)BWxWIibUfcP-|pfUu+ z2ZaYnJt)qR`Jk`>@j+n&k_W{(h!66UFar~~yio*~JPcsA7y~l{8v_G_0s{ksI0Fj< z$X_5nNWUC3Er7%nz$Fx@%whni4{InNRGxs`BFezR07^q3b3lI4hVpqp9%W!)kYHe8 z;ALO{n-4M@WEUT}tbv#*$G`zjYalfs3~~cV9)>~ogGyUaIDq05WIu=xic^pn%swFo zP>Bxm4-11Z1H_LY^FV$9#S@4PGE0hqfq|2O0UVzovp{@M*#Hs)$;&|HVd`Q20=WmI z9>fR5HO#Ld_d?Q1gFQ&UCb)cu_!q?2hVo(hL3~gh0SY@%SXe^C0^}EvdMl`UkT}Rb z5FeCwKgU)O?UQNIi%TO1mKQL41&XptK9(n=!D0(<&(4fRYo)%pVL)44^a(QVViBs9c4) z6~qUXp~!qt`H9R2m7&OdP&o?XJ2J3>(~SrN1Gu~Zr6*fx+7)GBU;v53)QCaVfYLZj zjW`1X14w)l11mVaOE54nfb@aHLHa=HN|u3v0hHE|^?~vzNF1h59-LOu0z?l)mzU;x<-QUkNgl!1W(B#vyC z8B`3}E_0|D#4a{)p0QwHU;ya{sRzk}{13{zAaRi2KzYy(+SUWff$}Mc4+|SmeTN?3 zjtmS8AaNcBHgGy|g60QMe1hacplQyTfq?-e2l59feY!F*Fo48B{_tnu0K3nPfq?-e z4#FUDkbgk#hv{*L>H&$v^mu^lCs2J4(g7(mk@a{&^?<}+db}7I7(n764AKQM4>G_JPDfZUBW_IJEuk&%n+AimwO;1_qEA z2!rfIwj+{(fdM2B5{KCv1r-CS1Nj$ZZ!`k~14u1M4wU{t_JYbGkT}R*keXNq1_qEA zj2{OL3myh`aNNa1;~f-!AhjU*dIlD-Tml0F14tfZE~q>M@nLBy2}^!UhPDe~c7YnM zAiH6HNMm4N0Er>{D;+8Z@)t}UsBsKZ2MJ?Hd6CJ$zyQ(@QV)^`mHnXj1chxDsEy9R zzyMMMGb5XUfdM3rY!|2v4iZDQD;KH`VizR8f!ebm{UG%qc~Bk!g=Ic8tU&1;qy`i& zpmH4~4hxq;Ea6hbz`y_!hlNWq0|NsnJYjAHwW~p5$ZjoVU|;}=A-lBYBwRq9 zBanWOdXPMFxPUriAiF_oV0Kk9Fff3`k?pF2iXq!o4Hbjf1qqiL1_lO@evo>QJS<#l zk-`O}1{5x!`VAxw3zvE<;R0%3gT!Is(g;nPFt;`_Fff3`klor06+?Dw3sel^R!F$C zGB7ZJ^n=uc(3no6Bfq?;st(G7lsUDxc;uFff430_g*(0fi^1 QjRz9{%fQHB!NAA>0H2vg{r~^~ diff --git a/src/game/player.rs b/src/game/player.rs index 27a47a7..a23b7a5 100644 --- a/src/game/player.rs +++ b/src/game/player.rs @@ -1,4 +1,5 @@ use cgmath::{Deg, InnerSpace, Matrix4, One, Quaternion, Rad, Rotation, Rotation3, SquareMatrix, Vector3, vec3, vec4}; +use mgf::Intersection; use crate::game::player::PlayerMovementMode::{FirstPerson, Flying}; @@ -117,11 +118,26 @@ impl Updatable for Player { let ray_direction = self.camera.viewport_pos_to_ray(input.mouse_position, renderer.game_data.dimensions).unwrap(); let ray_origin: [f32; 3] = self.camera.position.into(); let ray = mgf::Ray::new(ray_origin.into(), ray_direction); - println!("Ray: {:?}", ray); - let collision_mesh = &renderer.game_data.meshes[renderer.game_data.game_objects[0].mesh_index].collision_mesh; - collision_mesh.bvh.raytrace(&ray, |v, is| { - println!("v: {:?}, is: {:?}", v, is); - }); + + let mut shortest_hit: Option<(usize, Intersection)> = None; + let mut shortest_hit_distance: f32 = f32::MAX; + + for i in 0..renderer.game_data.game_objects.len() { + let obj = &renderer.game_data.game_objects[i]; + let collision_mesh = &renderer.game_data.meshes[obj.mesh_index].collision_mesh; + collision_mesh.bvh.raytrace(&ray, |_, is| { + if is.t < shortest_hit_distance { + shortest_hit = Some((i, is)); + shortest_hit_distance = is.t; + } + }); + } + + if let Some((obj_index, intersection)) = shortest_hit { + let obj = &mut renderer.game_data.game_objects[obj_index]; + obj.is_selected = !obj.is_selected; + println!("Hit: {:?}, {:?}", obj.mesh_index, intersection); + } } // Rotation diff --git a/src/vulkan/gameobject.rs b/src/vulkan/gameobject.rs index 8f89481..2a1e914 100644 --- a/src/vulkan/gameobject.rs +++ b/src/vulkan/gameobject.rs @@ -6,6 +6,8 @@ use crate::input::InputState; use crate::vulkan::{RendererDescriptorSets, TextureHandle}; use crate::vulkan::{MeshHandle, VulkanRenderer}; +use super::pipelines::vs; + #[derive(Clone)] pub struct GameObject { pub mesh_index: usize, @@ -15,14 +17,15 @@ pub struct GameObject { pub rotation: Quaternion, pub scale: Vector3, pub children: Vec, - pub descriptor_sets: Vec> + pub descriptor_sets: Vec>, + pub is_selected: bool } impl GameObject { pub fn new(mesh: MeshHandle) -> GameObject { GameObject { mesh_index: mesh.index, texture_index: mesh.diffuse_handle, normal_map_index: mesh.normal_handle, position: Vector3::new(0.0, 0.0, 0.0), rotation: Quaternion::new(1.0, 0.0, 0.0, 0.0), scale: Vector3::new(1.0, 1.0, 1.0), children: vec![], - descriptor_sets: vec![] } + descriptor_sets: vec![], is_selected: false } } pub fn _set_position(&mut self, x: f32, y: f32, z: f32) { @@ -51,6 +54,13 @@ impl GameObject { self.rotation = self.rotation * Quaternion::from(Euler::new(Deg(x), Deg(y), Deg(z))); } + pub fn get_push_constants(&self) -> vs::ty::PushConstants { + vs::ty::PushConstants { + model: self.get_model_matrix().into(), + is_selected: if self.is_selected { 0 } else { 1 }, + } + } + pub fn get_model_matrix(&self) -> Matrix4 { let translation = Matrix4::from_translation(self.position); let rotation: Matrix4 = self.rotation.into(); diff --git a/src/vulkan/mod.rs b/src/vulkan/mod.rs index 3e2f87c..060cbbb 100644 --- a/src/vulkan/mod.rs +++ b/src/vulkan/mod.rs @@ -27,7 +27,6 @@ use pipelines::{Drawcall, LineShader}; use pipelines::line_vs::ty::LinePushConstants; use pipelines::DefaultShader; use pipelines::vs; -use pipelines::vs::ty::PushConstants; use crate::config::RenderConfig; use crate::vulkan::gameobject::{GameObject, GameObjectHandle}; @@ -91,7 +90,6 @@ pub struct Texture { pub struct GameData { pub start_time: SystemTime, pub line_vertices: Vec, - pub push_constants: PushConstants, pub line_push_constants: LinePushConstants, pub recreate_pipeline: bool, pub dimensions: [u32; 2], @@ -126,9 +124,6 @@ impl VulkanRenderer { pub fn init(line_vertices: Vec, enable_validation_layers: bool, render_config: RenderConfig) -> (VulkanRenderer, EventLoop<()>) { // Create empty game data struct to be filled let mut data = GameData { - push_constants: PushConstants { - model: Matrix4::identity().into(), - }, line_push_constants: LinePushConstants { model: Matrix4::identity().into(), view: Matrix4::identity().into(), diff --git a/src/vulkan/pipelines.rs b/src/vulkan/pipelines.rs index 23f04a9..c9628ab 100644 --- a/src/vulkan/pipelines.rs +++ b/src/vulkan/pipelines.rs @@ -140,8 +140,7 @@ impl Drawcall for DefaultShader { for i in 0..game_data.game_objects.len() { let game_object = &game_data.game_objects[i]; let mesh = &game_data.meshes[game_object.mesh_index]; - let mut push_constants = game_data.push_constants.clone(); - push_constants.model = game_object.get_model_matrix().into(); + let push_constants = game_object.get_push_constants(); builder.draw_indexed( self.pipeline.clone(),