main.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. use std::path::Path;
  2. mod random;
  3. mod geometry;
  4. mod image;
  5. mod mesh;
  6. mod bsdf;
  7. mod bvh;
  8. use crate::geometry::Vec3;
  9. use crate::random::RNG;
  10. use crate::mesh::Mesh;
  11. use crate::geometry::Ray;
  12. use crate::image::Image;
  13. use crate::bvh::BVH;
  14. // ┏┳┓┏━┓╻┏┓╻
  15. // ┃┃┃┣━┫┃┃┗┫
  16. // ╹ ╹╹ ╹╹╹ ╹
  17. fn print_bvh_stats(bvh: &BVH) {
  18. print!("Triangles in leaf: ");
  19. fn discover_leaves(bvh: &BVH) {
  20. match bvh {
  21. BVH::Leaf(_, v) => {
  22. print!("{} ", v.len());
  23. },
  24. BVH::Node(_, left, right) => {
  25. discover_leaves(left);
  26. discover_leaves(right);
  27. }
  28. }
  29. }
  30. discover_leaves(bvh);
  31. println!();
  32. }
  33. fn main() {
  34. let m = Mesh::load("benchmarks/suzanne.obj");
  35. println!("First vertex: {}", m[0].vertices[m[0].vertices.len() - 1]);
  36. println!("Building BVH…");
  37. let bvh = BVH::from(&m, 12);
  38. println!("BVH created");
  39. print_bvh_stats(&bvh);
  40. println!("Triangle center: {}", m[0].faces[0].center);
  41. let mut rng = RNG::create();
  42. // Generate camera rays
  43. // Camera has origin 0,0 and will look downwards on z axis.
  44. const SPP : u16 = 1;
  45. const WIDTH : u16 = 256;
  46. const HEIGHT : u16 = 256;
  47. const D: f32 = 1.0; // distance of image plane to camera origin
  48. const FOV : f32 = 80.0; // opening angle of camera
  49. let mut img = Image::new(WIDTH, HEIGHT);
  50. let mut intersection_counts = vec!();
  51. for x in 0..WIDTH {
  52. for y in 0..HEIGHT {
  53. let target_x = (f32::from(x) / f32::from(WIDTH) - 0.5) * (FOV / 2.0).tan() * D;
  54. let target_y = (f32::from(y) / f32::from(HEIGHT) - 0.5) * (FOV / 2.0).tan() * D;
  55. let pixel = img.mod_pixel(x.into(), y.into());
  56. let mut r = Ray {
  57. origin: Vec3 {
  58. x: 0.0,
  59. y: 0.0,
  60. z: 0.0,
  61. },
  62. direction: Vec3 {
  63. x: target_x,
  64. y: target_y,
  65. z: D
  66. },
  67. n_inv: Vec3::new(0.0, 0.0, 0.0)
  68. };
  69. r.calc_n_inv();
  70. //println!("Shooting ray {} {} {}", target_x, target_y, D);
  71. for _ in 0..SPP {
  72. let (count, intersection) = bvh.intersect(&r, 0);
  73. intersection_counts.push(count);
  74. if intersection.is_some() {
  75. //println!("HIT! {}", r.direction);
  76. }
  77. let color = intersection
  78. .map(|i| Vec3::new(255.0, 255.0, 0.0))
  79. .unwrap_or(Vec3::new(0.0, 0.0, 0.0));
  80. //let sample : Vec3= 255.0 / f32::from(SPP) * raytrace(&r);
  81. //println!("{} --> {}", r.direction, sample);
  82. *pixel += color;
  83. }
  84. }
  85. if x % (WIDTH / 100) == 0 {
  86. println!("Progress: {:.0}%", 100.0 * f32::from(x) / f32::from(WIDTH));
  87. }
  88. }
  89. let intersections_per_ray = (intersection_counts.iter().sum::<usize>() as f64) / (f64::from((WIDTH as u32)* (HEIGHT as u32)* (SPP as u32)));
  90. //println!("Intersections per ray: {}", intersections_per_ray);
  91. println!("Intersections per ray: {}", intersections_per_ray);
  92. img.save_bmp(&Path::new("Render.bmp")).expect("Failed to save rendered image");
  93. }