Move camera!
This commit is contained in:
parent
3767f44468
commit
db48a786ac
|
|
@ -1,6 +1,6 @@
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
use glam::{uvec2, vec2, vec3};
|
use glam::{mat3, uvec2, vec2, vec3, Vec3};
|
||||||
use image::ImageReader;
|
use image::ImageReader;
|
||||||
use present::Presenter;
|
use present::Presenter;
|
||||||
use trace::{Tracer, TracerData, TracerEnv, Vertex};
|
use trace::{Tracer, TracerData, TracerEnv, Vertex};
|
||||||
|
|
@ -16,17 +16,22 @@ mod trace;
|
||||||
|
|
||||||
pub use trace::Sphere;
|
pub use trace::Sphere;
|
||||||
|
|
||||||
fn make_viewport(w: u32, h: u32) -> [Vertex; 4] {
|
fn make_viewport(eye: Vec3, w: u32, h: u32) -> [Vertex; 4] {
|
||||||
let size = uvec2(w, h).as_vec2();
|
let size = uvec2(w, h).as_vec2();
|
||||||
let size = size.normalize();
|
let size = size.normalize();
|
||||||
let (w, h) = (size.x, size.y);
|
let (w, h, d) = (size.x, size.y, 1.);
|
||||||
let r = 1.0f32;
|
|
||||||
let screen_coord = [vec2(-1., -1.), vec2(1., -1.), vec2(-1., 1.), vec2(1., 1.)];
|
let screen_coord = [vec2(-1., -1.), vec2(1., -1.), vec2(-1., 1.), vec2(1., 1.)];
|
||||||
let eye = vec3(-r, 0., 0.);
|
|
||||||
let world_coord = [vec3(0., -w, -h), vec3(0., w, -h), vec3(0., -w, h), vec3(0., w, h)];
|
let up = Vec3::Z;
|
||||||
|
let fwd = -eye.normalize();
|
||||||
|
let right = eye.cross(up).normalize();
|
||||||
|
let up = eye.cross(right).normalize();
|
||||||
|
let m = mat3(fwd, right, up);
|
||||||
|
|
||||||
|
let world_coord = [vec3(d, -w, -h), vec3(d, w, -h), vec3(d, -w, h), vec3(d, w, h)];
|
||||||
[0, 1, 2, 3].map(|k| Vertex {
|
[0, 1, 2, 3].map(|k| Vertex {
|
||||||
eye,
|
eye,
|
||||||
world: world_coord[k],
|
world: eye + m * (world_coord[k]),
|
||||||
screen: screen_coord[k],
|
screen: screen_coord[k],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -49,11 +54,16 @@ fn main() {
|
||||||
let output_format = wgpu::TextureFormat::Bgra8UnormSrgb;
|
let output_format = wgpu::TextureFormat::Bgra8UnormSrgb;
|
||||||
let hdr_format = wgpu::TextureFormat::Rgba16Float;
|
let hdr_format = wgpu::TextureFormat::Rgba16Float;
|
||||||
let mut tracer = Tracer::new(&device, hdr_format);
|
let mut tracer = Tracer::new(&device, hdr_format);
|
||||||
|
let mut rng = rand_pcg::Pcg32::new(42, 0);
|
||||||
let sphere_params: Vec<_> = {
|
let sphere_params: Vec<_> = {
|
||||||
let mut rng = rand_pcg::Pcg32::new(42, 0);
|
|
||||||
let distr = anim::distr();
|
let distr = anim::distr();
|
||||||
(0..N_SPHERES).map(|_| distr(&mut rng)).collect()
|
(0..N_SPHERES).map(|_| distr(&mut rng)).collect()
|
||||||
};
|
};
|
||||||
|
let camera_params = {
|
||||||
|
let mut p = anim::distr()(&mut rng);
|
||||||
|
p.frequencies *= 0.1;
|
||||||
|
p
|
||||||
|
};
|
||||||
let tracer_env = TracerEnv::new(&device, &tracer, &envmap);
|
let tracer_env = TracerEnv::new(&device, &tracer, &envmap);
|
||||||
|
|
||||||
let presenter = Presenter::new(&device, output_format);
|
let presenter = Presenter::new(&device, output_format);
|
||||||
|
|
@ -80,7 +90,6 @@ fn main() {
|
||||||
desired_maximum_frame_latency: 2,
|
desired_maximum_frame_latency: 2,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
tracer.set_view(&queue, &make_viewport(physical_size.width, physical_size.height));
|
|
||||||
surface_configured = true;
|
surface_configured = true;
|
||||||
}
|
}
|
||||||
WindowEvent::RedrawRequested => {
|
WindowEvent::RedrawRequested => {
|
||||||
|
|
@ -122,6 +131,8 @@ fn main() {
|
||||||
for _ in 0..RAYS_PER_PIXEL {
|
for _ in 0..RAYS_PER_PIXEL {
|
||||||
frame += 1;
|
frame += 1;
|
||||||
let time = frame as f32 / (60. * RAYS_PER_PIXEL as f32);
|
let time = frame as f32 / (60. * RAYS_PER_PIXEL as f32);
|
||||||
|
let camera_pos = camera_params.to_sphere(time).center;
|
||||||
|
tracer.set_view(&queue, &make_viewport(camera_pos, size.width, size.height));
|
||||||
let spheres: Vec<_> = sphere_params.iter().map(|p| p.to_sphere(time)).collect();
|
let spheres: Vec<_> = sphere_params.iter().map(|p| p.to_sphere(time)).collect();
|
||||||
let data = TracerData::new(&device, &tracer, &spheres);
|
let data = TracerData::new(&device, &tracer, &spheres);
|
||||||
tracer.render(
|
tracer.render(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user