104 lines
3.0 KiB
Rust
104 lines
3.0 KiB
Rust
// Generate table for traversal order of quad BVHs.
|
|
|
|
use std::env;
|
|
use std::fs::File;
|
|
use std::io::Write;
|
|
use std::path::Path;
|
|
|
|
fn main() {
|
|
// Build the traversal table.
|
|
let mut traversal_table = [
|
|
Vec::new(),
|
|
Vec::new(),
|
|
Vec::new(),
|
|
Vec::new(),
|
|
Vec::new(),
|
|
Vec::new(),
|
|
Vec::new(),
|
|
Vec::new(),
|
|
];
|
|
for raydir in 0..8 {
|
|
let ray = [raydir & 1, (raydir >> 1) & 1, (raydir >> 2) & 1];
|
|
|
|
for s2 in 0..3 {
|
|
for s1 in 0..3 {
|
|
for s0 in 0..3 {
|
|
let mut perm = [0, 1, 2, 3];
|
|
if ray[s1] == 1 {
|
|
perm.swap(0, 1);
|
|
}
|
|
if ray[s2] == 1 {
|
|
perm.swap(2, 3);
|
|
}
|
|
if ray[s0] == 1 {
|
|
perm.swap(0, 2);
|
|
perm.swap(1, 3);
|
|
}
|
|
traversal_table[raydir]
|
|
.push(perm[0] + (perm[1] << 2) + (perm[2] << 4) + (perm[3] << 6));
|
|
}
|
|
}
|
|
}
|
|
|
|
for s1 in 0..3 {
|
|
for s0 in 0..3 {
|
|
let mut perm = [0, 1, 2];
|
|
if ray[s1] == 1 {
|
|
perm.swap(0, 1);
|
|
}
|
|
if ray[s0] == 1 {
|
|
perm.swap(0, 1);
|
|
perm.swap(0, 2);
|
|
}
|
|
traversal_table[raydir].push(perm[0] + (perm[1] << 2) + (perm[2] << 4));
|
|
}
|
|
}
|
|
|
|
for s1 in 0..3 {
|
|
for s0 in 0..3 {
|
|
let mut perm = [0, 1, 2];
|
|
if ray[s1] == 1 {
|
|
perm.swap(1, 2);
|
|
}
|
|
if ray[s0] == 1 {
|
|
perm.swap(0, 2);
|
|
perm.swap(0, 1);
|
|
}
|
|
traversal_table[raydir].push(perm[0] + (perm[1] << 2) + (perm[2] << 4));
|
|
}
|
|
}
|
|
|
|
for s0 in 0..3 {
|
|
let mut perm = [0, 1];
|
|
if ray[s0] == 1 {
|
|
perm.swap(0, 1);
|
|
}
|
|
traversal_table[raydir].push(perm[0] + (perm[1] << 2));
|
|
}
|
|
}
|
|
|
|
// Write traversal table to Rust file
|
|
let out_dir = env::var("OUT_DIR").unwrap();
|
|
let dest_path = Path::new(&out_dir).join("table_inc.rs");
|
|
let mut f = File::create(&dest_path).unwrap();
|
|
|
|
f.write_all("pub static TRAVERSAL_TABLE: [[u8; 48]; 8] = [".as_bytes())
|
|
.unwrap();
|
|
|
|
for sub_table in traversal_table.iter() {
|
|
f.write_all("\n [".as_bytes()).unwrap();
|
|
for (i, n) in sub_table.iter().enumerate() {
|
|
if i == 27 || i == 36 || i == 45 {
|
|
f.write_all("\n ".as_bytes()).unwrap();
|
|
}
|
|
f.write_all(format!("{}", n).as_bytes()).unwrap();
|
|
if i != 47 {
|
|
f.write_all(", ".as_bytes()).unwrap();
|
|
}
|
|
}
|
|
f.write_all("],".as_bytes()).unwrap();
|
|
}
|
|
|
|
f.write_all("\n];".as_bytes()).unwrap();
|
|
}
|