vange-rs icon indicating copy to clipboard operation
vange-rs copied to clipboard

Lighting under cables is weird

Open kvark opened this issue 3 years ago • 2 comments

Follow-up to #178, which was the source of regression here. vangers-cable-issue

kvark avatar Jan 16 '22 06:01 kvark

Here is the original code - https://github.com/KranX/Vangers/blob/60b4dec789f1e68ed99b5601350248bdf9ad2744/src/terra/land.cpp#L1014-L1048

It seems to me that the artifacts should have been present in the original game as well. Neither the double level or single level code paths don't bother checking if the cells to the left/right are double-level or not.

kvark avatar Jan 16 '22 06:01 kvark

Tried following the original code verbatim, it doesn't solve it:

diff --git a/res/shader/color.inc.wgsl b/res/shader/color.inc.wgsl
index 43cb6a6..8e28f73 100644
--- a/res/shader/color.inc.wgsl
+++ b/res/shader/color.inc.wgsl
@@ -40,9 +40,20 @@ fn evaluate_palette(ty: u32, value_in: f32, ycoord: f32) -> f32 {
 fn evaluate_color_id(ty: u32, tex_coord: vec2<f32>, height_normalized: f32, lit_factor: f32) -> f32 {
     // See the original code in "land.cpp": `LINE_render()`
     //Note: we could have a different code path for double level here
-    let diff =
-        textureSampleLevel(t_Height, s_Main, tex_coord, 0.0, vec2<i32>(0, 0)).x -
-        textureSampleLevel(t_Height, s_Main, tex_coord, 0.0, vec2<i32>(-2, 0)).x;
+    let pos = tex_coord * u_Surface.texture_scale.xy;
+    let tci = vec2<i32>(pos - floor(pos / u_Surface.texture_scale.xy) * u_Surface.texture_scale.xy);
+
+    let meta = textureLoad(t_Meta, tci, 0).x;
+    var diff = 0.0;
+    if ((meta & c_DoubleLevelMask) != 0u) {
+    diff =
+        textureLoad(t_Height, (tci | vec2<i32>(1, 0)) + vec2<i32>(2, 0), 0).x -
+        textureLoad(t_Height, (tci | vec2<i32>(1, 0)) + vec2<i32>(0, 0), 0).x;
+    } else {
+        diff =
+        textureLoad(t_Height, tci + vec2<i32>(1, 0), 0).x -
+        textureLoad(t_Height, tci + vec2<i32>(-1, 0), 0).x;
+    }
     // See the original code in "land.cpp": `TERRAIN_MATERIAL` etc
     let material = select(vec3<f32>(1.0), vec3<f32>(5.0, 1.25, 0.5), ty == 0u);
     let light_clr = evaluate_light(material, diff);

kvark avatar Jan 16 '22 06:01 kvark