From 1a30887a7dc2bad9fb3f0a417d90d2e31ea01b7c Mon Sep 17 00:00:00 2001
From: zomseffen <steffen@tom.bi>
Date: Fri, 28 Feb 2025 14:06:20 +0100
Subject: [PATCH] clamp to quad

---
 shaders/compiled/frag_rt_quad.spv | Bin 46376 -> 46712 bytes
 shaders/compiled/vert_rt_quad.spv | Bin 2892 -> 3228 bytes
 shaders/rt_quad.frag              |  32 +++++++++++++++++++-----------
 shaders/rt_quad.vert              |   8 ++++++++
 src/primitives/quad.rs            |  16 +++++++++++----
 src/scene/generators.rs           |   2 +-
 src/vertex.rs                     |  26 +++++++++++++++++++-----
 7 files changed, 62 insertions(+), 22 deletions(-)

diff --git a/shaders/compiled/frag_rt_quad.spv b/shaders/compiled/frag_rt_quad.spv
index 18213c1a8337e560ddc049edd5ff12fdc4a09b2d..216c16163e7f1d0cc4d8c28b80cc265169eb0e96 100644
GIT binary patch
delta 7770
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
ASO5S3

delta 7410
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
FF9NPwWL*FN

diff --git a/shaders/compiled/vert_rt_quad.spv b/shaders/compiled/vert_rt_quad.spv
index 64d060ce38083553631a6f3cb5cd06594268ba69..2dbe2575789335b429815af250e1dd0b61ce52df 100644
GIT binary patch
delta 379
zcmX>jHb;_|nMs+Qfq{{Mn}L@haU!oNqtHZWQ{HF>28I|QjsxQOjiug9ajXn%3?R|m
z%)Fq);*!*&fc#=0mjNUWQkj|Oiy{LO2kFjDtiVto4^fXKvw0tr6;r4?12fnTKA^li
z0}Gff2V}EA`5=1`d}gruFts4NKys{5wIDmd{LNokE;D&501b%(3NZt*7Z6)R`5-TW
z#6Wy+APusD5y}Ut2N{bjAHVq^do#0xEl@egm{=eNX|aR49K?soB>>qVSAgU|#(?;L
JfreWEF#yNPG$;T7

delta 54
zcmbOuc}9$vnMs+Qfq{{Mn}L@hY9g;GBi}@4(~TV-Oq&guEtobRV7<V!`2j}_Gsj<`
IA`2h}06t?3cmMzZ

diff --git a/shaders/rt_quad.frag b/shaders/rt_quad.frag
index d5747b9..2e2a32a 100644
--- a/shaders/rt_quad.frag
+++ b/shaders/rt_quad.frag
@@ -4,6 +4,8 @@ layout(location = 0) in vec2 fragRasterPos;
 layout(location = 1) flat in uint fragVolumeStart;
 layout(location = 2) in vec3 origPosition;
 layout(location = 3) flat in uint facing;
+layout(location = 4) flat in uvec2 minRasterPos;
+layout(location = 5) flat in uvec2 maxRasterPos;
 
 layout(location = 0) out vec4 outColor;
 
@@ -468,15 +470,21 @@ vec3 clamp_to_volume(uint volume_start, vec3 position) {
     return vec3(min(max(position.x, low_x_border), high_x_border), min(max(position.y, low_y_border), high_y_border), min(max(position.z, low_z_border), high_z_border));
 }
 
-vec3 add_reflection(vec3 view_vector, uint f, uint volume_start, vec3 pos, uvec4 color_sample, vec3 color_sum) {
-    vec3 orig_color_sample = vec3(float(color_sample.x) / 255.0, float(color_sample.y) / 255.0, float(color_sample.z) / 255.0);
+vec2 clamp_to_quad(vec2 raster_pos, uvec2 min_raster_pos, uvec2 max_raster_pos) {
+    return vec2(max(min_raster_pos.x, min(max_raster_pos.x - 1, raster_pos.x)), max(min_raster_pos.y, min(max_raster_pos.y - 1, raster_pos.y)));
+}
 
-    vec3 reflection_direction = reflect_vector(view_vector, f);
-    Tracing reflection_tracing = trace_ray(volume_start, pos, reflection_direction, pos_infinity, 0, max_iterations_per_light, true);
+vec3 add_reflection(vec3 view_vector, uint f, uint volume_start, vec3 pos, uvec4 color_sample, vec3 color_sum) {
     float reflectivity = 1.0 - float(color_sample.w) / 255.0;
-    if (reflection_tracing.has_hit || reflection_tracing.has_transparent_hit) {
-        vec3 color_from_reflection = diffuse_tracing(reflection_tracing.end_volume, reflection_tracing.end_raster, reflection_tracing.end_pos, reflection_tracing.end_facing) * orig_color_sample;
-        color_sum = color_sum * (1.0 - reflectivity) + color_from_reflection * reflectivity;
+
+    if (reflectivity > 0.01) {
+        vec3 orig_color_sample = vec3(float(color_sample.x) / 255.0, float(color_sample.y) / 255.0, float(color_sample.z) / 255.0);
+        vec3 reflection_direction = reflect_vector(view_vector, f);
+        Tracing reflection_tracing = trace_ray(volume_start, pos, reflection_direction, pos_infinity, 0, max_iterations_per_light, true);
+        if (reflection_tracing.has_hit || reflection_tracing.has_transparent_hit) {
+            vec3 color_from_reflection = diffuse_tracing(reflection_tracing.end_volume, reflection_tracing.end_raster, reflection_tracing.end_pos, reflection_tracing.end_facing) * orig_color_sample;
+            color_sum = color_sum * (1.0 - reflectivity) + color_from_reflection * reflectivity;
+        }
     }
 
     return color_sum;
@@ -484,13 +492,14 @@ vec3 add_reflection(vec3 view_vector, uint f, uint volume_start, vec3 pos, uvec4
 
 void main() {
     vec3 clamped_pos = clamp_to_volume(fragVolumeStart, origPosition);
-    uvec4 color_roughness = sample_color_from_scene_info(fragVolumeStart, fragRasterPos, facing);
+    vec2 clamped_raster_pos = clamp_to_quad(fragRasterPos, minRasterPos, maxRasterPos);
+    uvec4 color_roughness = sample_color_from_scene_info(fragVolumeStart, clamped_raster_pos, facing);
     vec3 orig_color_sample = vec3(float(color_roughness.x) / 255.0, float(color_roughness.y) / 255.0, float(color_roughness.z) / 255.0);
     vec3 color_sum;
 
-    uint orig_neighbor = sample_neighbor_from_scene_info(fragVolumeStart, fragRasterPos, facing);
+    uint orig_neighbor = sample_neighbor_from_scene_info(fragVolumeStart, clamped_raster_pos, facing);
     if (orig_neighbor != 0) {
-        vec3 color_direct = diffuse_tracing(fragVolumeStart, fragRasterPos, clamped_pos, facing);
+        vec3 color_direct = diffuse_tracing(fragVolumeStart, clamped_raster_pos, clamped_pos, facing);
         color_direct = add_reflection(normalize(clamped_pos - ubo.camera_pos), facing, fragVolumeStart, clamped_pos, color_roughness, color_direct);
 
         Tracing t = trace_ray(fragVolumeStart, ubo.camera_pos, clamped_pos - ubo.camera_pos, pos_infinity, 0, max_iterations_per_light, false);
@@ -507,11 +516,10 @@ void main() {
         }
     }
     else {
-        color_sum = diffuse_tracing(fragVolumeStart, fragRasterPos, clamped_pos, facing);
+        color_sum = diffuse_tracing(fragVolumeStart, clamped_raster_pos, clamped_pos, facing);
 
         color_sum = add_reflection(normalize(clamped_pos - ubo.camera_pos), facing, fragVolumeStart, clamped_pos, color_roughness, color_sum);
     }
 
     outColor = vec4(color_sum, 1.0);
-    //outColor = vec4(orig_color_sample, 1.0);
 }
\ No newline at end of file
diff --git a/shaders/rt_quad.vert b/shaders/rt_quad.vert
index d43d6e1..b5e9b2b 100644
--- a/shaders/rt_quad.vert
+++ b/shaders/rt_quad.vert
@@ -14,12 +14,17 @@ layout(location = 0) in vec3 inPosition;
 layout(location = 1) in uvec2 inRasterPos;
 layout(location = 2) in uint inVolumeStart;
 layout(location = 3) in uint inFacing;
+layout(location = 4) in uvec2 inMinRasterPos;
+layout(location = 5) in uvec2 inMaxRasterPos;
 
 layout(location = 0) out vec2 rasterPos;
 layout(location = 1) flat out uint volumeStart;
 layout(location = 2) out vec3 origPosition;
 layout(location = 3) flat out uint facing;
 
+layout(location = 4) flat out uvec2 minRasterPos;
+layout(location = 5) flat out uvec2 maxRasterPos;
+
 void main() {
     if (ubo.use_geom_shader[0]) {
         gl_Position = ubo.geom_rot * ubo.model *  vec4(inPosition, 1.0);
@@ -30,4 +35,7 @@ void main() {
     volumeStart = inVolumeStart;
     origPosition = inPosition;
     facing = inFacing;
+
+    minRasterPos = inMinRasterPos;
+    maxRasterPos = inMaxRasterPos;
 }
\ No newline at end of file
diff --git a/src/primitives/quad.rs b/src/primitives/quad.rs
index b055edb..a6926d1 100644
--- a/src/primitives/quad.rs
+++ b/src/primitives/quad.rs
@@ -24,28 +24,36 @@ impl Drawable for Quad {
                 vec3(self.pos1.x as f32, self.pos1.y as f32, self.pos1.z as f32),
                 self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 0, y: 0}),
                 self.volume_index,
-                self.facing
+                self.facing,
+                self.raster_pos,
+                self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}),
             ));
             // 1 top right far
             scene.rt_vertices.push(vertex::RTVertex::new(
                 vec3(self.pos2.x as f32, self.pos2.y as f32, self.pos2.z as f32),
                 self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 0, y: 1}),
                 self.volume_index,
-                self.facing
+                self.facing,
+                self.raster_pos,
+                self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}),
             ));
             // 2 top left near
             scene.rt_vertices.push(vertex::RTVertex::new(
                 vec3(self.pos3.x as f32, self.pos3.y as f32, self.pos3.z as f32),
                 self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}),
                 self.volume_index,
-                self.facing
+                self.facing,
+                self.raster_pos,
+                self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}),
             ));
             // 3 top right near
             scene.rt_vertices.push(vertex::RTVertex::new(
                 vec3(self.pos4.x as f32, self.pos4.y as f32, self.pos4.z as f32),
                 self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 0}),
                 self.volume_index,
-                self.facing
+                self.facing,
+                self.raster_pos,
+                self.raster_pos + self.size.mul_element_wise(cgmath::Vector2 {x: 1, y: 1}),
             ));
             
             // change node order while preserving texture coordinates
diff --git a/src/scene/generators.rs b/src/scene/generators.rs
index 78c629e..3b3a6fa 100644
--- a/src/scene/generators.rs
+++ b/src/scene/generators.rs
@@ -215,5 +215,5 @@ pub fn generate_test_scene2(scene: &mut Scene, data: &mut AppData, chunk_num_x:
     scene.directional_lights.push(Rc::new(RefCell::new(DirectionalLight { direction: vec3(0.0, 0.0, -1.0), color: vec3(0.1, 0.1, 0.1), memory_start: 0 })));
     scene.oct_trees = oct_trees;
 
-    Ok(cgmath::point3((max_x as f32 / 2.0) as f32, (max_y as f32 / 2.0) as f32, height_map[(max_x as f32 / 2.0).floor() as usize][(max_y as f32 / 2.0).floor() as usize] + 2.0))
+    Ok(cgmath::point3((max_x as f32 / 2.0) as f32, (max_y as f32 / 2.0) as f32, height_map[(max_x as f32 / 2.0).floor() as usize][(max_y as f32 / 2.0).floor() as usize] + 2000.0))
 }
\ No newline at end of file
diff --git a/src/vertex.rs b/src/vertex.rs
index 3d5c6e7..90cead4 100644
--- a/src/vertex.rs
+++ b/src/vertex.rs
@@ -181,14 +181,16 @@ pub struct RTVertex {
     pub raster_pos: cgmath::Vector2<u32>,
     pub volume_start: u32,
     facing: Facing,
+    min_raster_pos: cgmath::Vector2<u32>,
+    max_raster_pos: cgmath::Vector2<u32>,
 }
 
 impl RTVertex {
-    pub const fn new(pos: Vec3, raster_pos: cgmath::Vector2<u32>, volume_start: u32, facing: Facing) -> Self {
-        Self { pos, raster_pos, volume_start, facing }
+    pub const fn new(pos: Vec3, raster_pos: cgmath::Vector2<u32>, volume_start: u32, facing: Facing, min_raster_pos: cgmath::Vector2<u32>, max_raster_pos: cgmath::Vector2<u32>) -> Self {
+        Self { pos, raster_pos, volume_start, facing, min_raster_pos, max_raster_pos }
     }
 }
-impl VertexContainer<4> for RTVertex {
+impl VertexContainer<6> for RTVertex {
     fn binding_description() -> vk::VertexInputBindingDescription {
         vk::VertexInputBindingDescription::builder()
             .binding(0)
@@ -197,7 +199,7 @@ impl VertexContainer<4> for RTVertex {
             .build()
     }
 
-    fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 4] {
+    fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 6] {
         let pos = vk::VertexInputAttributeDescription::builder()
             .binding(0)
             .location(0)
@@ -226,7 +228,21 @@ impl VertexContainer<4> for RTVertex {
             .offset((size_of::<Vec3>() + size_of::<cgmath::Vector2<u32>>() + size_of::<u32>()) as u32)
             .build();
 
-        [pos, raster_pos, volume_start, facing]
+        let min_raster_pos = vk::VertexInputAttributeDescription::builder()
+            .binding(0)
+            .location(4)
+            .format(vk::Format::R32G32_UINT)
+            .offset((size_of::<Vec3>() + size_of::<cgmath::Vector2<u32>>() + size_of::<u32>() + size_of::<u32>()) as u32)
+            .build();
+
+        let max_raster_pos = vk::VertexInputAttributeDescription::builder()
+            .binding(0)
+            .location(5)
+            .format(vk::Format::R32G32_UINT)
+            .offset((size_of::<Vec3>() + size_of::<cgmath::Vector2<u32>>() + size_of::<u32>() + size_of::<u32>() + size_of::<cgmath::Vector2<u32>>()) as u32)
+            .build();
+
+        [pos, raster_pos, volume_start, facing, min_raster_pos, max_raster_pos]
     }
 }