Fix tree creation

This commit is contained in:
hodasemi 2019-04-15 16:18:45 +02:00
parent 5317bd895b
commit f44716e2c4
4 changed files with 38 additions and 15 deletions

15
.vscode/launch.json vendored
View file

@ -7,23 +7,20 @@
{ {
"type": "lldb", "type": "lldb",
"request": "launch", "request": "launch",
"name": "Debug", "name": "Debug executable 'rustray'",
"cargo": { "cargo": {
"args": [ "args": [
"build" "build",
"--bin=rustray",
"--package=rustray"
], ],
"filter": { "filter": {
"name": "rust_opengl", "name": "rustray",
"kind": "bin" "kind": "bin"
} }
}, },
"linux": {
"env": {
"RUST_BACKTRACE": "1"
}
},
"args": [], "args": [],
"cwd": "${workspaceRoot}" "cwd": "${workspaceFolder}"
} }
] ]
} }

View file

@ -8,3 +8,4 @@ authors = ["hodasemi <michaelh.95@t-online.de>"]
cgmath = "*" cgmath = "*"
utilities = { git = "https://gitlab.com/hodasemi/utilities.git" } utilities = { git = "https://gitlab.com/hodasemi/utilities.git" }
image = "*" image = "*"
rand = "*"

View file

@ -57,7 +57,21 @@ impl<'a> AccelerationData<'a> {
discovered[v] = true; discovered[v] = true;
println!("{}\n{:?}", v, self.data[v]); print_aabb(v, self.data[v]);
let left_child = self.data[v].left_child;
if left_child != -1 {
if !discovered[left_child as usize] {
stack.push(left_child as usize);
}
}
let right_child = self.data[v].right_child;
if right_child != -1 {
if !discovered[right_child as usize] {
stack.push(right_child as usize);
}
}
} }
} }
} }
@ -122,12 +136,12 @@ impl<'a> AccelerationData<'a> {
let next_level_count = (current_level_count as f32 / 2.0).ceil() as u32; let next_level_count = (current_level_count as f32 / 2.0).ceil() as u32;
let next_level_start = start_index + current_level_count; let next_level_start = start_index + current_level_count;
for i in next_level_start..(next_level_start + next_level_count) { for i in 0..next_level_count {
let mut aabb = AABB::new(); let mut aabb = AABB::new();
let index = (start_index + i * 2) as usize; let index = (start_index + i * 2) as usize;
if i == (next_level_count + next_level_start - 1) && odd { if i == (next_level_count - 1) && odd {
aabb.bounds[0] = data[index].bounds[0]; aabb.bounds[0] = data[index].bounds[0];
aabb.bounds[1] = data[index].bounds[1]; aabb.bounds[1] = data[index].bounds[1];
aabb.left_child = index as isize; aabb.left_child = index as isize;
@ -142,7 +156,7 @@ impl<'a> AccelerationData<'a> {
data[0] = aabb; data[0] = aabb;
break; break;
} else { } else {
data[i as usize] = aabb; data[(next_level_start + i) as usize] = aabb;
} }
} }
@ -163,3 +177,7 @@ impl<'a> AccelerationData<'a> {
Vector3::new(v0.x.max(v1.x), v0.y.max(v1.y), v0.z.max(v1.z)) Vector3::new(v0.x.max(v1.x), v0.y.max(v1.y), v0.z.max(v1.z))
} }
} }
fn print_aabb(index: usize, aabb: AABB) {
println!("({}):\t{:?}", index, aabb);
}

View file

@ -1,5 +1,6 @@
use cgmath::{vec2, vec3, Vector3}; use cgmath::{vec2, vec3, Vector3};
use crate::rand::Rng;
use image::ImageBuffer; use image::ImageBuffer;
use utilities::prelude::*; use utilities::prelude::*;
@ -20,7 +21,11 @@ fn generate_grid(width: u32, height: u32) -> Vec<Triangle> {
for y in 0..height { for y in 0..height {
for x in 0..width { for x in 0..width {
let color = vec3(1.0, 0.0, 0.0); let color = vec3(
rand::thread_rng().gen_range(0.0, 1.0),
rand::thread_rng().gen_range(0.0, 1.0),
rand::thread_rng().gen_range(0.0, 1.0),
);
grid.push(Triangle::new( grid.push(Triangle::new(
Vertex::new(vec3(x as f32, y as f32, 0.0), vec2(0.0, 0.0)), Vertex::new(vec3(x as f32, y as f32, 0.0), vec2(0.0, 0.0)),
@ -42,7 +47,7 @@ fn generate_grid(width: u32, height: u32) -> Vec<Triangle> {
} }
fn main() { fn main() {
let input_data = generate_grid(3, 3); let input_data = generate_grid(5, 5);
/* /*
let camera = Camera::new( let camera = Camera::new(
@ -74,6 +79,8 @@ fn debug_raytracer_camera(dim_x: u32, dim_y: u32, camera: &Camera, data: &[Trian
let acceleration_data = AccelerationData::create_tree(data, 8); let acceleration_data = AccelerationData::create_tree(data, 8);
acceleration_data.print_tree();
for (x, y, pixel) in imgbuf.enumerate_pixels_mut() { for (x, y, pixel) in imgbuf.enumerate_pixels_mut() {
let ray = camera.primary_ray(x, dim_y - y, dim_x, dim_y); let ray = camera.primary_ray(x, dim_y - y, dim_x, dim_y);