Fixed scenery
This commit is contained in:
parent
9a9a88360a
commit
ae6b1f6b0d
47
src/scene.rs
47
src/scene.rs
|
|
@ -1,8 +1,10 @@
|
||||||
use crate::anim::{self, SphereParams};
|
use crate::anim::{self, SphereParams};
|
||||||
use crate::trace::{self, Tracer, TracerData};
|
use crate::trace::{self, Tracer, TracerData};
|
||||||
|
use crate::Sphere;
|
||||||
use glam::{mat3, uvec2, vec3, UVec2, Vec3};
|
use glam::{mat3, uvec2, vec3, UVec2, Vec3};
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
struct CamLoc {
|
struct CamLoc {
|
||||||
eye: Vec3,
|
eye: Vec3,
|
||||||
forward: Vec3,
|
forward: Vec3,
|
||||||
|
|
@ -43,34 +45,28 @@ impl Renderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct SceneParams {
|
pub struct SceneParams {
|
||||||
pub spheres: Vec<SphereParams>,
|
spheres: Vec<Sphere>,
|
||||||
pub camera: SphereParams,
|
camera: CamLoc,
|
||||||
pub target: SphereParams,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SceneParams {
|
impl SceneParams {
|
||||||
pub fn new(n_spheres: u32) -> Self {
|
pub fn new(n_spheres: u32) -> Self {
|
||||||
let mut rng = rand_pcg::Pcg32::new(42, 0);
|
let mut rng = rand_pcg::Pcg32::new(42, 0);
|
||||||
let spheres: Vec<_> = {
|
const R: f32 = 100.;
|
||||||
let distr = anim::distr();
|
let sphere = Sphere {
|
||||||
(0..n_spheres).map(|_| distr(&mut rng)).collect()
|
center: vec3(0., 0., -R),
|
||||||
|
radius: R,
|
||||||
|
emit_color: vec3(0., 0., 0.),
|
||||||
|
reflect_color: Vec3::splat(0.3),
|
||||||
|
glossiness: 0.,
|
||||||
};
|
};
|
||||||
let camera = {
|
let spheres = vec![sphere];
|
||||||
let mut p = anim::distr()(&mut rng);
|
let camera = CamLoc {
|
||||||
p.amplitudes *= 2.0;
|
eye: vec3(-1., -1., 1.),
|
||||||
p.frequencies *= 0.1;
|
forward: vec3(1., 1., 0.).normalize(),
|
||||||
p
|
right: vec3(1., -1., 0.).normalize(),
|
||||||
};
|
};
|
||||||
let target = {
|
Self { spheres, camera }
|
||||||
let mut p = spheres[0];
|
|
||||||
p.phases -= 2. * PI * CAMERA_LAG * p.frequencies;
|
|
||||||
p
|
|
||||||
};
|
|
||||||
Self {
|
|
||||||
spheres,
|
|
||||||
camera,
|
|
||||||
target,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -100,14 +96,9 @@ impl Renderer {
|
||||||
time: f32,
|
time: f32,
|
||||||
seed: u32,
|
seed: u32,
|
||||||
) {
|
) {
|
||||||
let target = scene.target.to_sphere(time).center;
|
|
||||||
let eye = scene.camera.to_sphere(time).center;
|
|
||||||
let right = scene.camera.deriv(time);
|
|
||||||
let forward = target - eye;
|
|
||||||
let viewport = make_viewport(size.x, size.y);
|
let viewport = make_viewport(size.x, size.y);
|
||||||
let location = convert_location(CamLoc { eye, forward, right });
|
let location = convert_location(scene.camera);
|
||||||
let spheres: Vec<_> = scene.spheres.iter().map(|p| p.to_sphere(time)).collect();
|
let data = TracerData::new(&device, &self.tracer, &scene.spheres);
|
||||||
let data = TracerData::new(&device, &self.tracer, &spheres);
|
|
||||||
self.tracer.render(
|
self.tracer.render(
|
||||||
&mut render_pass.0,
|
&mut render_pass.0,
|
||||||
&data,
|
&data,
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@ fn trace_fragment(in: Varying) -> vec3f {
|
||||||
var env: vec3f; // in kilonits
|
var env: vec3f; // in kilonits
|
||||||
|
|
||||||
const ILLUMINANCE_LUX = 1e5;
|
const ILLUMINANCE_LUX = 1e5;
|
||||||
const ANGULAR_DIAMETER_DEG = 0.5; // Sun: 0.5°
|
const ANGULAR_DIAMETER_DEG = 20.0; // Sun: 0.5°
|
||||||
|
|
||||||
const PI = 3.141592653589793;
|
const PI = 3.141592653589793;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user