From 30619771afa84509ec475d9be74edac1c95d5552 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 6 Jul 2020 23:04:13 +0100 Subject: [PATCH] Improved block picking --- assets/voxygen/shaders/sprite-vert.glsl | 2 +- assets/voxygen/shaders/terrain-frag.glsl | 12 ++++++++ voxygen/src/session.rs | 35 ++++++++---------------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/assets/voxygen/shaders/sprite-vert.glsl b/assets/voxygen/shaders/sprite-vert.glsl index 11de3a8b2f..91cc75e6d2 100644 --- a/assets/voxygen/shaders/sprite-vert.glsl +++ b/assets/voxygen/shaders/sprite-vert.glsl @@ -50,7 +50,7 @@ void main() { // Select glowing if (select_pos.w > 0 && select_pos.xyz == floor(sprite_pos)) { - f_col = f_col * 8.0; + f_col *= 8.0; } f_light = 1.0; diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index edbd8833f8..037357d0af 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -21,6 +21,10 @@ out vec4 tgt_color; #include #include +float vmax(vec3 v) { + return max(v.x, max(v.y, v.z)); +} + void main() { // First 3 normals are negative, next 3 are positive vec3 normals[6] = vec3[](vec3(-1,0,0), vec3(1,0,0), vec3(0,-1,0), vec3(0,1,0), vec3(0,0,-1), vec3(0,0,1)); @@ -46,6 +50,14 @@ void main() { diffuse_light += point_light * ao; vec3 col = f_col + hash(vec4(floor(f_chunk_pos * 3.0 - f_norm * 0.5), 0)) * 0.02; // Small-scale noise + + // Select glowing + if (select_pos.w > 0 && select_pos.xyz == floor(f_pos - f_norm * 0.01)) { + if (vmax(abs(mod(f_pos - f_norm * 0.5, 1.0) - 0.5)) > 0.45) { + col *= 0.5; + } + } + vec3 surf_color = illuminate(srgb_to_linear(col), light, diffuse_light, ambient_light); float fog_level = fog(f_pos.xyz, focus_pos.xyz, medium.x); diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index c22d4e81f8..d257c4ed6f 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -256,6 +256,13 @@ impl PlayState for SessionState { } }; + let can_build = self.client + .borrow() + .state() + .read_storage::() + .get(self.client.borrow().entity()) + .is_some(); + // Only highlight collectables self.scene.set_select_pos(select_pos.filter(|sp| { self.client @@ -263,7 +270,7 @@ impl PlayState for SessionState { .state() .terrain() .get(*sp) - .map(|b| b.is_collectible()) + .map(|b| b.is_collectible() || can_build) .unwrap_or(false) })); @@ -279,16 +286,9 @@ impl PlayState for SessionState { return PlayStateResult::Shutdown; }, Event::InputUpdate(GameInput::Primary, state) => { - // Check the existence of CanBuild component. If it's here, use LMB to - // break blocks, if not, use it to attack + // If we can build, use LMB to break blocks, if not, use it to attack let mut client = self.client.borrow_mut(); - if state - && client - .state() - .read_storage::() - .get(client.entity()) - .is_some() - { + if state && can_build { if let Some(select_pos) = select_pos { client.remove_block(select_pos); } @@ -302,13 +302,7 @@ impl PlayState for SessionState { let mut client = self.client.borrow_mut(); - if state - && client - .state() - .read_storage::() - .get(client.entity()) - .is_some() - { + if state && can_build { if let Some(build_pos) = build_pos { client.place_block(build_pos, self.selected_block); } @@ -319,12 +313,7 @@ impl PlayState for SessionState { Event::InputUpdate(GameInput::Roll, state) => { let client = self.client.borrow(); - if client - .state() - .read_storage::() - .get(client.entity()) - .is_some() - { + if can_build { if state { if let Some(block) = select_pos .and_then(|sp| client.state().terrain().get(sp).ok().copied())