From 053e28a33ab395f4b75dabbad4bf0dac27aa74eb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Filip=20Szczepa=C5=84ski?= <jazz2rulez@gmail.com>
Date: Sun, 9 Jan 2022 00:04:35 +0100
Subject: [PATCH] Avoid Intel graphics ivec3/uvec3 bug.

---
 assets/voxygen/shaders/fluid-vert.glsl                  | 3 ++-
 assets/voxygen/shaders/light-shadows-directed-vert.glsl | 4 ++--
 assets/voxygen/shaders/point-light-shadows-vert.glsl    | 4 ++--
 assets/voxygen/shaders/sprite-vert.glsl                 | 8 ++++----
 assets/voxygen/shaders/terrain-vert.glsl                | 4 ++--
 5 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/assets/voxygen/shaders/fluid-vert.glsl b/assets/voxygen/shaders/fluid-vert.glsl
index 0d68559912..0b7c8b541e 100644
--- a/assets/voxygen/shaders/fluid-vert.glsl
+++ b/assets/voxygen/shaders/fluid-vert.glsl
@@ -49,7 +49,8 @@ layout(location = 1) flat out uint f_pos_norm;
 const float EXTRA_NEG_Z = 65536.0/*65536.1*/;
 
 void main() {
-    f_pos = vec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0x1FFFFu)) - vec3(0, 0, EXTRA_NEG_Z) + model_offs - focus_off.xyz;
+    f_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0x1FFFFu) - EXTRA_NEG_Z) + model_offs - focus_off.xyz;
+
     // f_pos.z -= 250.0 * (1.0 - min(1.0001 - 0.02 / pow(tick.x - load_time, 10.0), 1.0));
     // f_pos.z -= min(32.0, 25.0 * pow(distance(focus_pos.xy, f_pos.xy) / view_distance.x, 20.0));
 
diff --git a/assets/voxygen/shaders/light-shadows-directed-vert.glsl b/assets/voxygen/shaders/light-shadows-directed-vert.glsl
index 99aeaa61b1..1ff6fbffd9 100644
--- a/assets/voxygen/shaders/light-shadows-directed-vert.glsl
+++ b/assets/voxygen/shaders/light-shadows-directed-vert.glsl
@@ -51,10 +51,10 @@ uniform u_locals {
 
 // out vec4 shadowMapCoord;
 
-const int EXTRA_NEG_Z = 32768;
+const float EXTRA_NEG_Z = 32768.0;
 
 void main() {
-    vec3 f_chunk_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z));
+    vec3 f_chunk_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0xFFFFu) - EXTRA_NEG_Z);
     vec3 f_pos = f_chunk_pos + (model_offs - focus_off.xyz);
     // f_pos = v_pos;
     // vec3 f_pos = f_chunk_pos + model_offs;
diff --git a/assets/voxygen/shaders/point-light-shadows-vert.glsl b/assets/voxygen/shaders/point-light-shadows-vert.glsl
index 7670a2f368..507c831bc0 100644
--- a/assets/voxygen/shaders/point-light-shadows-vert.glsl
+++ b/assets/voxygen/shaders/point-light-shadows-vert.glsl
@@ -41,14 +41,14 @@ uniform u_locals {
 
 // out vec4 shadowMapCoord;
 
-const int EXTRA_NEG_Z = 32768;
+const float EXTRA_NEG_Z = 32768.0;
 
 layout( push_constant ) uniform PointLightMatrix {
   mat4 lightShadowMatrix;
 };
 
 void main() {
-    vec3 f_chunk_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z));
+    vec3 f_chunk_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0xFFFFu) - EXTRA_NEG_Z);
     vec3 f_pos = f_chunk_pos + model_offs - focus_off.xyz;
     // f_pos = v_pos;
     // vec3 f_pos = f_chunk_pos + model_offs;
diff --git a/assets/voxygen/shaders/sprite-vert.glsl b/assets/voxygen/shaders/sprite-vert.glsl
index 097e5e25f2..2cbd92f05f 100644
--- a/assets/voxygen/shaders/sprite-vert.glsl
+++ b/assets/voxygen/shaders/sprite-vert.glsl
@@ -51,8 +51,8 @@ layout(location = 4) out vec2 f_inst_light;
 const float SCALE = 1.0 / 11.0;
 const float SCALE_FACTOR = pow(SCALE, 1.3) * 0.2;
 
-const int EXTRA_NEG_Z = 32768;
-const int VERT_EXTRA_NEG_Z = 128;
+const float EXTRA_NEG_Z = 32768.0;
+const float VERT_EXTRA_NEG_Z = 128.0;
 const uint VERT_PAGE_SIZE = 256;
 
 void main() {
@@ -75,7 +75,7 @@ void main() {
     uint v_atlas_pos = pos_atlas_pos_norm_ao.y;
 
     // Expand the model vertex position bits into float values
-    vec3 v_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 8, 16)) & uvec3(0xFFu, 0xFFu, 0x0FFFu)) - ivec3(0, 0, VERT_EXTRA_NEG_Z));
+    vec3 v_pos = vec3(v_pos_norm & 0xFFu, (v_pos_norm >> 8) & 0xFFu, float((v_pos_norm >> 16) & 0x0FFFu) - VERT_EXTRA_NEG_Z);
 
     // Transform into chunk space and scale
     f_pos = (inst_mat * vec4(v_pos, 1.0)).xyz;
@@ -118,7 +118,7 @@ void main() {
 
     // Position of the sprite block in the chunk
     // Used solely for highlighting the selected sprite 
-    vec3 inst_chunk_pos = vec3(ivec3((uvec3(inst_pos_ori) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z));
+    vec3 inst_chunk_pos = vec3(inst_pos_ori & 0x3Fu, (inst_pos_ori >> 6) & 0x3Fu, float((inst_pos_ori >> 12) & 0xFFFFu) - EXTRA_NEG_Z);
     // Select glowing
     vec3 sprite_pos = inst_chunk_pos + chunk_offs;
     f_select = (select_pos.w > 0 && select_pos.xyz == sprite_pos) ? 1.0 : 0.0;
diff --git a/assets/voxygen/shaders/terrain-vert.glsl b/assets/voxygen/shaders/terrain-vert.glsl
index 36be96776d..11bfd3254a 100644
--- a/assets/voxygen/shaders/terrain-vert.glsl
+++ b/assets/voxygen/shaders/terrain-vert.glsl
@@ -67,12 +67,12 @@ layout(location = 2) flat out float f_load_time;
 
 // uniform sampler2DRect t_col_light;
 
-const int EXTRA_NEG_Z = 32768;
+const float EXTRA_NEG_Z = 32768.0;
 
 void main() {
     // over it (if this vertex to see if it intersects.
     // f_chunk_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z));
-    vec3 f_chunk_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z));
+    vec3 f_chunk_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0xFFFFu) - EXTRA_NEG_Z);
     f_pos = f_chunk_pos + model_offs - focus_off.xyz;
 
     f_load_time = load_time;