From dd568a75e33f7f425a227cdd431f4b529f9a6aa1 Mon Sep 17 00:00:00 2001
From: zomseffen <steffen@tom.bi>
Date: Mon, 13 Jan 2025 16:18:05 +0100
Subject: [PATCH] pre facing switch

---
 shaders/compiled/frag_rt_quad.spv | Bin 11068 -> 23196 bytes
 shaders/rt_quad.frag              | 106 +++++++++++++++++++++++++-----
 src/scene/empty_volume.rs         |  24 +++----
 src/scene/light.rs                |   8 +--
 src/scene/mod.rs                  |  12 +++-
 5 files changed, 117 insertions(+), 33 deletions(-)

diff --git a/shaders/compiled/frag_rt_quad.spv b/shaders/compiled/frag_rt_quad.spv
index 15b4f814b512aeb94222088c611fa16f462fe90c..16608e1a0c74a7c99e5cd0ccce2329ec41aaa49d 100644
GIT binary patch
literal 23196
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

literal 11068
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
TMVzM{!H&f?wK<n+&gCBgivN?{

diff --git a/shaders/rt_quad.frag b/shaders/rt_quad.frag
index 495d707..307b9aa 100644
--- a/shaders/rt_quad.frag
+++ b/shaders/rt_quad.frag
@@ -133,8 +133,8 @@ vec3 get_light_position(uint light_index) {
     return vec3(float(scene_info.infos[light_index]), float(scene_info.infos[light_index + 1]), float(scene_info.infos[light_index + 2]));
 }
 
-vec4 get_light_color(uint light_index) {
-    return vec4(float(scene_info.infos[light_index + 3]) / 255.0, float(scene_info.infos[light_index + 4]) / 255.0, float(scene_info.infos[light_index + 5]) / 255.0, 1.0);
+vec3 get_light_color(uint light_index) {
+    return vec3(float(scene_info.infos[light_index + 3]) / 255.0, float(scene_info.infos[light_index + 4]) / 255.0, float(scene_info.infos[light_index + 5]) / 255.0);
 }
 
 void main() {
@@ -147,22 +147,29 @@ void main() {
     uint max_light_num = scene_info.infos[0];
     uint light_num = 0;
     uint volume_index = fragVolumeStart;
-    uint light_index = scene_info.infos[fragVolumeStart + 3];
+    uint volume_pos_x = scene_info.infos[volume_index + 0]; 
+    uint volume_pos_y = scene_info.infos[volume_index + 1]; 
+    uint volume_pos_z = scene_info.infos[volume_index + 2]; 
+    uint light_index = scene_info.infos[volume_index + 6];
     vec3 light_direction = get_light_position(light_index) - origPosition;
-    vec4 light_color = get_light_color(light_index);
+    vec3 light_color = get_light_color(light_index);
     
     bool x_pos = light_direction.x > 0.0;
-    bool x_null = light_direction.x == 0.0;
+    bool x_null = (light_direction.x == 0.0);
     bool y_pos = light_direction.y > 0.0;
-    bool y_null = light_direction.y == 0.0;
+    bool y_null = (light_direction.y == 0.0);
     bool z_pos = light_direction.z > 0.0;
-    bool z_null = light_direction.z == 0.0;
+    bool z_null = (light_direction.z == 0.0);
 
-    uint max_iterations = max_light_num * 20;
+    vec3 color_sum = vec3(0.0, 0.0, 0.0) + (color_sample.xyz * 0.01);
+
+    uint max_iterations = 2; //max_light_num * 20;
     for (int i = 0; i < max_iterations; i++) {
-        float x_border = float(scene_info.infos[volume_index + 0] + scene_info.infos[volume_index + 3] * uint(x_pos));
-        float y_border = float(scene_info.infos[volume_index + 1] + scene_info.infos[volume_index + 4] * uint(y_pos));
-        float z_border = float(scene_info.infos[volume_index + 2] + scene_info.infos[volume_index + 5] * uint(z_pos));
+        float x_border = float(volume_pos_x + (scene_info.infos[volume_index + 3]) * uint(x_pos)) - 0.5;
+        float y_border = float(volume_pos_y + (scene_info.infos[volume_index + 4]) * uint(y_pos)) - 0.5;
+        float z_border = float(volume_pos_z + (scene_info.infos[volume_index + 5]) * uint(z_pos)) - 0.5;
+        
+        bool needs_next_light = false;
 
         // 2 is way behind the light position and should result in no collision being detected
         float x_factor = 2.0;
@@ -172,17 +179,84 @@ void main() {
             x_factor = (x_border - origPosition.x) / light_direction.x;
         }
         if (!y_null) {
-            float y_factor = (y_border - origPosition.y) / light_direction.y;
+            y_factor = (y_border - origPosition.y) / light_direction.y;
         }
         if (!z_null) {
-            float z_factor = (z_border - origPosition.z) / light_direction.z;
+            z_factor = (z_border - origPosition.z) / light_direction.z;
         }
 
-        
+        if ((x_factor >= 0.999 && y_factor >= 0.999 && z_factor >= 0.999)) {
+            // no hit, add light color result
+            color_sum += (color_sample.xyz * light_color) / (0.01 * light_direction.length() * light_direction.length() + 1.0);
+            needs_next_light = true;
+        } else {
+            // if there is a border hit before reaching the light
+            // change to the relevant next volume
+            // Todo: look into removing ifs from this
+            uint hit_facing = 0;
+            uint u = 0;
+            uint v = 0;
+            if (x_factor <= y_factor && x_factor <= z_factor) {
+                if (x_pos) {
+                    hit_facing = 3;
+                } else {
+                    hit_facing = 2;
+                }
+                vec3 intersection_pos = origPosition + x_factor * light_direction;
+                u = uint(ceil(intersection_pos.y)) - volume_pos_y;
+                v = uint(ceil(intersection_pos.z)) - volume_pos_z;
+            }
+
+            if (y_factor <= x_factor && y_factor <= z_factor) {
+                if (y_pos) {
+                    hit_facing = 5;
+                } else {
+                    hit_facing = 4;
+                }
+                vec3 intersection_pos = origPosition + y_factor * light_direction;
+                u = uint(ceil(intersection_pos.x)) - volume_pos_x;
+                v = uint(ceil(intersection_pos.z)) - volume_pos_z;
+            }
+
+            if (z_factor <= x_factor && z_factor <= y_factor) {
+                if (y_pos) {
+                    hit_facing = 0;
+                } else {
+                    hit_facing = 1;
+                }
+                vec3 intersection_pos = origPosition + z_factor * light_direction;
+                u = uint(ceil(intersection_pos.x)) - volume_pos_x;
+                v = uint(ceil(intersection_pos.y)) - volume_pos_y;
+            }
+            uint next_neighbor = sample_neighbor_from_scene_info(volume_index, uvec2(u, v), hit_facing);
+            uvec4 color_sample = sample_color_from_scene_info(volume_index, uvec2(u, v), hit_facing);
+
+            if (color_sample == uvec4(0, 0, 0, 0)) {
+                // not a color hit, so check neighbor
+                if (next_neighbor != 0) {
+                    color_sum = vec3(1.0, 0.0, 0.0);
+                    volume_index = next_neighbor;
+                    uint volume_pos_x = scene_info.infos[volume_index + 0]; 
+                    uint volume_pos_y = scene_info.infos[volume_index + 1]; 
+                    uint volume_pos_z = scene_info.infos[volume_index + 2];
+                } else {
+                    color_sum = vec3(0.0, 0.0, 1.0);
+                    // neightbor miss, shouldn't happen with a light inside of a volume. Might happen with ambient light. For now move on to next light.
+                    needs_next_light = true;
+                }
+            } else {
+                color_sum = vec3(1.0, 0.0, 1.0);
+                // color hit, move on to next light (may change once transparents are implemnted)
+                needs_next_light = true;
+            }
+        }
+        if (needs_next_light) {
+            break;
+        }
     }
 
-
-    outColor = color_sample;
+    // todo light color memory index does not contain the expected values -> check
+    outColor = vec4(color_sum, 1.0);
 
     /*if (scene_info.infos[1] == 16) {
         outColor = vec4(0, 1, 0, 1);
diff --git a/src/scene/empty_volume.rs b/src/scene/empty_volume.rs
index cbe73bb..d6407f6 100644
--- a/src/scene/empty_volume.rs
+++ b/src/scene/empty_volume.rs
@@ -216,8 +216,8 @@ impl EmptyVolume {
                                         bottom_roughness.push(128);
                                     }
                                     else {
-                                        bottom_colors.push(Vector3 { x: 255, y: 255, z: 255 });
-                                        bottom_roughness.push(255);
+                                        bottom_colors.push(Vector3 { x: 0, y: 0, z: 0 });
+                                        bottom_roughness.push(0);
                                     }
                                 }
                             }
@@ -242,8 +242,8 @@ impl EmptyVolume {
                                         top_roughness.push(128);
                                     }
                                     else {
-                                        top_colors.push(Vector3 { x: 255, y: 255, z: 255 });
-                                        top_roughness.push(255);
+                                        top_colors.push(Vector3 { x: 0, y: 0, z: 0 });
+                                        top_roughness.push(0);
                                     }
                                 }
                             }
@@ -269,8 +269,8 @@ impl EmptyVolume {
                                         back_roughness.push(128);
                                     }
                                     else {
-                                        back_colors.push(Vector3 { x: 255, y: 255, z: 255 });
-                                        back_roughness.push(255);
+                                        back_colors.push(Vector3 { x: 0, y: 0, z: 0 });
+                                        back_roughness.push(0);
                                     }
                                 }
                             }
@@ -296,8 +296,8 @@ impl EmptyVolume {
                                         front_roughness.push(128);
                                     }
                                     else {
-                                        front_colors.push(Vector3 { x: 255, y: 255, z: 255 });
-                                        front_roughness.push(255);
+                                        front_colors.push(Vector3 { x: 0, y: 0, z: 0 });
+                                        front_roughness.push(0);
                                     }
                                 }
                             }
@@ -323,8 +323,8 @@ impl EmptyVolume {
                                         left_roughness.push(128);
                                     }
                                     else {
-                                        left_colors.push(Vector3 { x: 255, y: 255, z: 255 });
-                                        left_roughness.push(255);
+                                        left_colors.push(Vector3 { x: 0, y: 0, z: 0 });
+                                        left_roughness.push(0);
                                     }
                                 }
                             }
@@ -350,8 +350,8 @@ impl EmptyVolume {
                                         right_roughness.push(128);
                                     }
                                     else {
-                                        right_colors.push(Vector3 { x: 255, y: 255, z: 255 });
-                                        right_roughness.push(255);
+                                        right_colors.push(Vector3 { x: 0, y: 0, z: 0 });
+                                        right_roughness.push(0);
                                     }
                                 }
                             }
diff --git a/src/scene/light.rs b/src/scene/light.rs
index a83b754..4893dd3 100644
--- a/src/scene/light.rs
+++ b/src/scene/light.rs
@@ -11,7 +11,7 @@ pub struct PointLight{
 
 impl PointLight {
     pub fn get_buffer_mem_size(&self) -> u32 {
-        4 * 3 + 4 * 3
+        3 + 3
     }
 
     pub fn insert_into_memory(&self, mut v: Vec<u32>) -> Vec<u32> { 
@@ -19,9 +19,9 @@ impl PointLight {
         v[self.memory_start + 1] = self.pos.y as u32;
         v[self.memory_start + 2] = self.pos.z as u32;
 
-        v[self.memory_start + 3] = self.color.x as u32;
-        v[self.memory_start + 4] = self.color.y as u32;
-        v[self.memory_start + 5] = self.color.z as u32;
+        v[self.memory_start + 3] = (self.color.x * 255.0) as u32;
+        v[self.memory_start + 4] = (self.color.y * 255.0) as u32;
+        v[self.memory_start + 5] = (self.color.z * 255.0) as u32;
         v
     }
 
diff --git a/src/scene/mod.rs b/src/scene/mod.rs
index 7d710ff..e241b51 100644
--- a/src/scene/mod.rs
+++ b/src/scene/mod.rs
@@ -6,7 +6,7 @@ use anyhow::Ok;
 use vulkanalia::prelude::v1_0::*;
 use anyhow::Result;
 
-use cgmath::{vec2, vec3};
+use cgmath::{vec2, vec3, Vector3};
 
 use std::cell::RefCell;
 use std::rc::Rc;
@@ -14,6 +14,7 @@ use std::rc::Rc;
 use crate::app_data;
 use crate::app_data::AppData;
 use crate::buffer;
+use crate::primitives::rec_cuboid::Cuboid;
 use crate::vertex;
 use crate::primitives::cube::Cube;
 use crate::primitives::drawable::Drawable;
@@ -117,6 +118,15 @@ impl Scene {
                 None => {}
             }
         }
+
+        let cube = Cuboid {
+            pos: vec3(11.0, 11.0, 11.0),
+            color: vec3(shade, 1.0, shade),
+            tex_coord: vec2(0.0, 0.0),
+            size: Vector3 {x: 0.5, y: 0.5, z: 0.5}
+        };
+        let index = self.sized_vertices.len();
+        cube.draw(&data.topology, index, self);
         
         let mut memory_index = 1; // zero should be the location for the overall length (also will be the invalid memory allocation for pointing to a nonexistant neighbor)
         for light in &mut self.point_lights {