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