renderer can now handle arbitrary large images (moved on the heap)

Codinget 3 years ago
parent daa1c78f7a
commit e930180563
  1. 17
      src/consts.rs
  2. 2
      src/main.rs
  3. 10
      src/structs/cam.rs

@ -19,19 +19,22 @@ pub const ANGLE_POWER: f64 = 2.;
//pub const IMG_WIDTH: usize = 480;
//pub const IMG_WIDTH: usize = 1280;
pub const IMG_WIDTH: usize = 1080;
//pub const IMG_WIDTH: usize = 1080;
//pub const IMG_WIDTH: usize = 1920;
pub const IMG_WIDTH: usize = 4961;
//pub const IMG_HEIGHT: usize = 480;
//pub const IMG_HEIGHT: usize = 720;
pub const IMG_HEIGHT: usize = 1080;
//pub const IMG_HEIGHT: usize = 1080;
pub const IMG_HEIGHT: usize = 3508;
pub const IMG_DIM: usize = if IMG_HEIGHT > IMG_WIDTH { IMG_HEIGHT } else { IMG_WIDTH };
pub const IMG_SIZE: usize = IMG_WIDTH * IMG_HEIGHT;
pub const IMG_BYTE_SIZE: usize = IMG_SIZE * 3;
//pub const SUPERSAMPLING: usize = 1;
pub const SUPERSAMPLING: usize = 2;
//pub const RAYS_PER_PIXEL: usize = 1;
pub const SUPERSAMPLING: usize = 1;
//pub const SUPERSAMPLING: usize = 2;
pub const RAYS_PER_PIXEL: usize = 1;
//pub const RAYS_PER_PIXEL: usize = 50;
pub const RAYS_PER_PIXEL: usize = 500;
//pub const RAYS_PER_PIXEL: usize = 500;
//pub const MAX_BOUNCES: u32 = 1;
//pub const MAX_BOUNCES: u32 = 4;
//pub const MAX_BOUNCES: u32 = 8;
@ -39,7 +42,7 @@ pub const MAX_BOUNCES: u32 = 10;
//pub const THREAD_COUNT: usize = 1;
pub const THREAD_COUNT: usize = 12;
pub const SLICES_PER_THREAD: usize = 16;
pub const SLICES_PER_THREAD: usize = 32;
pub const REPORT_STATUS: bool = true;
pub const UP: Vec3 = Y;

@ -85,7 +85,7 @@ fn default_scene3() -> Scene {
fn main() {
// get scene and camera
let scene = scene_from_file("scenes/insidemirror.lua".to_owned()).unwrap();
let scene = scene_from_file("scenes/randomspheres.lua".to_owned()).unwrap();
//let scene = default_scene3();
let cam = default_cam();

@ -56,7 +56,7 @@ struct Slice {
type CastData = [Option<RayData>; MAX_BOUNCES as usize];
const NONE_CAST_DATA: CastData = [None; MAX_BOUNCES as usize];
pub type Image = [u8; IMG_BYTE_SIZE];
pub type Image = Vec<u8>;
fn l2s(l: f64) -> u8 {
(f64::powf(f64::clamp(l, 0., 1.), 1./2.2) * 255. + 0.5) as u8
@ -128,7 +128,8 @@ impl Cam {
}
let lights = scene.get_lights();
let mut pixels = [0; IMG_BYTE_SIZE];
let mut pixels = Vec::with_capacity(IMG_BYTE_SIZE);
pixels.resize(IMG_BYTE_SIZE, 0u8);
for y in 0..IMG_HEIGHT {
for x in 0..IMG_WIDTH {
let field_pos = (x + y*IMG_WIDTH) * 3;
@ -136,7 +137,7 @@ impl Cam {
}
if REPORT_STATUS {
stderr.write_all(format!("\x1b[1K\x1b[GRendering... {}/{} rows ({:.2}%)", y+1, IMG_HEIGHT, (y+1) as f64/IMG_HEIGHT as f64).as_bytes()).unwrap();
stderr.write_all(format!("\x1b[1K\x1b[GRendering... {}/{} rows ({:.2}%)", y+1, IMG_HEIGHT, (y+1) as f64*100./IMG_HEIGHT as f64).as_bytes()).unwrap();
stderr.flush().unwrap();
}
}
@ -150,7 +151,8 @@ impl Cam {
}
pub fn render_multithreaded<T: Obj + Clone>(&self, scene: &T) -> Image {
let mut pixels = [0; IMG_BYTE_SIZE];
let mut pixels = Vec::with_capacity(IMG_BYTE_SIZE);
pixels.resize(IMG_BYTE_SIZE, 0u8);
crossbeam::scope(|scope| {
// initialize everything for render

Loading…
Cancel
Save