prior normal check for lights
This commit is contained in:
parent
f3098d8061
commit
e3829a73e4
4 changed files with 80 additions and 8 deletions
src/scene
|
@ -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()));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue