diff --git a/src/main.rs b/src/main.rs index 51360d0..223503e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -224,8 +224,8 @@ impl App { image::create_texture_image_view(&device, &mut data)?; image::create_texture_sampler(&device, &mut data)?; - let cur_pos = generators::generate_test_scene(&mut scene_handler, &mut data)?; - //let cur_pos = generators::generate_test_scene2(&mut scene_handler, &mut data, 21, 21,1, 5)?; + //let cur_pos = generators::generate_test_scene(&mut scene_handler, &mut data)?; + let cur_pos = generators::generate_test_scene2(&mut scene_handler, &mut data, 31, 31,1, 5)?; scene_handler.prepare_data(&instance, &device, &mut data)?; buffer::create_uniform_buffers(&instance, &device, &mut data)?; diff --git a/src/scene/empty_volume.rs b/src/scene/empty_volume.rs index dd5be73..893cc92 100644 --- a/src/scene/empty_volume.rs +++ b/src/scene/empty_volume.rs @@ -1,4 +1,4 @@ -use cgmath::{ElementWise, Vector3}; +use cgmath::{ElementWise, InnerSpace, Vector3}; use std::cell::{RefCell, Ref}; use std::rc::Rc; @@ -978,7 +978,70 @@ impl EmptyVolume { pub fn select_lights(&self, lights: LightsIter, light_number: u32, min_light_weight: f32) -> Vec<u32> { let mut weighted_indices = vec![]; - for light in lights { + for light in lights { + let mut has_hitable_side = false; + if self.color_bottom.len() > 0 { + let center = self.real_position + Vector3{x: self.size_x as f32 * 0.5, y: self.size_y as f32 * 0.5, z: self.size_z as f32 * 0.0 - 0.5} * self.scale; + let normal = Vector3 {x: 0.0, y: 0.0, z: 1.0}; + + let dir = light.borrow().get_direction(center); + if normal.dot(dir) < 0.0 { + has_hitable_side = true; + } + } + if self.color_top.len() > 0 { + let center = self.real_position + Vector3{x: self.size_x as f32 * 0.5, y: self.size_y as f32 * 0.5, z: self.size_z as f32 * 1.0 - 0.5} * self.scale; + let normal = Vector3 {x: 0.0, y: 0.0, z: -1.0}; + + let dir = light.borrow().get_direction(center); + if normal.dot(dir) < 0.0 { + has_hitable_side = true; + } + } + + if self.color_front.len() > 0 { + let center = self.real_position + Vector3{x: self.size_x as f32 * 0.5, y: self.size_y as f32 * 0.0 - 0.5, z: self.size_z as f32 * 0.5} * self.scale; + let normal = Vector3 {x: 0.0, y: 1.0, z: 0.0}; + + let dir = light.borrow().get_direction(center); + if normal.dot(dir) < 0.0 { + has_hitable_side = true; + } + } + + if self.color_back.len() > 0 { + let center = self.real_position + Vector3{x: self.size_x as f32 * 0.5, y: self.size_y as f32 * 1.0 - 0.5, z: self.size_z as f32 * 0.5} * self.scale; + let normal = Vector3 {x: 0.0, y: -1.0, z: 0.0}; + + let dir = light.borrow().get_direction(center); + if normal.dot(dir) < 0.0 { + has_hitable_side = true; + } + } + + if self.color_left.len() > 0 { + let center = self.real_position + Vector3{x: self.size_x as f32 * 0.0 - 0.5, y: self.size_y as f32 * 0.5, z: self.size_z as f32 * 0.5} * self.scale; + let normal = Vector3 {x: 1.0, y: 0.0, z: 0.0}; + + let dir = light.borrow().get_direction(center); + if normal.dot(dir) < 0.0 { + has_hitable_side = true; + } + } + + if self.color_right.len() > 0 { + let center = self.real_position + Vector3{x: self.size_x as f32 * 1.0 - 0.5, y: self.size_y as f32 * 0.5, z: self.size_z as f32 * 0.5} * self.scale; + let normal = Vector3 {x: -1.0, y: 0.0, z: 0.0}; + + let dir = light.borrow().get_direction(center); + if normal.dot(dir) < 0.0 { + has_hitable_side = true; + } + } + + if !has_hitable_side { + continue; + } let weight = light.borrow().weighted_distance(self.real_position, Vector3{x: self.size_x as f32, y: self.size_y as f32, z: self.size_z as f32} * self.scale); if weight >= min_light_weight { weighted_indices.push((weight, light.borrow().get_memory_start())); diff --git a/src/scene/generators.rs b/src/scene/generators.rs index a3ead57..c40c5da 100644 --- a/src/scene/generators.rs +++ b/src/scene/generators.rs @@ -58,8 +58,8 @@ pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<(Poi pos: vec3(10.0, 10.0, 10.0), color: vec3(0.0, 0.0, 0.9), tex_coord: vec2(0.0, 0.0), - transparent: true, - roughness: 32, + transparent: false, + roughness: 128, }; oct_tree1.set_cube(cube.clone()); @@ -67,8 +67,8 @@ pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<(Poi pos: vec3(10.0, 10.0, 9.0), color: vec3(0.0, 0.0, 0.9), tex_coord: vec2(0.0, 0.0), - transparent: true, - roughness: 32, + transparent: false, + roughness: 128, }; oct_tree1.set_cube(cube.clone()); diff --git a/src/scene/light.rs b/src/scene/light.rs index a7e15c5..9c64389 100644 --- a/src/scene/light.rs +++ b/src/scene/light.rs @@ -14,6 +14,7 @@ pub enum LightType { pub trait Light { fn get_light_type(&self) -> LightType; fn weighted_distance(&self, pos: Vector3<f32>, size: Vector3<f32>) -> f32; + fn get_direction(&self, pos: Vector3<f32>) -> Vector3<f32>; } pub trait LightSource: Light + Memorizable {} @@ -109,6 +110,10 @@ impl Light for PointLight { light_intensity / distance.powf(2.0) } + + fn get_direction(&self, pos: Vector3<f32>) -> Vector3<f32> { + (pos - self.pos).normalize() + } } impl LightSource for PointLight {} @@ -157,6 +162,10 @@ impl Light for DirectionalLight { light_intensity } + + fn get_direction(&self, pos: Vector3<f32>) -> Vector3<f32> { + self.direction.clone().normalize() + } } impl LightSource for DirectionalLight {}