diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 70 |
1 files changed, 47 insertions, 23 deletions
diff --git a/src/main.rs b/src/main.rs index dc29e2b..b624c33 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,9 +4,12 @@ mod sdl; pub mod win; pub mod sdf; -use nalgebra::{Vector3, Matrix3, Rotation3}; +use nalgebra::{Vector3, Matrix3, Rotation3, Matrix4}; +use std::time::Instant; + type Vec3 = Vector3<f32>; type Mat3 = Matrix3<f32>; +type Mat4 = Matrix4<f32>; type Rot3 = Rotation3<f32>; struct View { @@ -26,10 +29,23 @@ impl Default for View { } impl View { - /// `camera_rotation() * vec3(0, 0, -1)` is the direction the camera is pointing - fn camera_rotation(&self) -> Mat3 { + /// `rotation() * vec3(0, 0, -1)` is the direction the camera is pointing + fn rotation(&self) -> Mat3 { *Rot3::from_euler_angles(self.pitch, self.yaw, 0.0).matrix() } + + fn translation(&self) -> Mat4 { + Mat4::new_translation(&self.pos) + } + + fn transform(&self) -> Mat4 { + self.translation() * self.rotation().to_homogeneous() + } + + fn inv_transform(&self) -> Mat4 { + // this matrix should always be invertible + self.transform().try_inverse().unwrap() + } } @@ -42,14 +58,13 @@ fn try_main() -> Result<(), String> { let mut fshader_source = String::new(); fshader_source.push_str(" IN vec2 pos; -uniform vec3 u_camera_position; -uniform mat3 u_camera_rotation; +uniform mat4 u_transform; "); my_sdf.to_glsl(&mut fshader_source); fshader_source.push_str(" -#define ITERATIONS 30 -#define AA_X 2 -#define AA_Y 2 +#define ITERATIONS 20 +#define AA_X 1 +#define AA_Y 1 @@ -81,35 +96,32 @@ vec3 normal(vec3 p) k.yyx*sdf(p + k.yyx*h) + k.yxy*sdf(p + k.yxy*h) + k.xxx*sdf(p + k.xxx*h); - vec3 noise_normal = k.xyy*fbm(p + k.xyy*h) + - k.yyx*fbm(p + k.yyx*h) + - k.yxy*fbm(p + k.yxy*h) + - k.xxx*fbm(p + k.xxx*h); - return normalize(sdf_normal + 0.003 * noise_normal); + return normalize(sdf_normal); } void main() { - float focal_length = 0.3; + float focal_length = 1.0; float min_dist = 10.; vec2 inv_screen_size = 1.0 / vec2(1280.0, 720.0); // @TODO vec2 aa_delta = inv_screen_size / vec2(AA_X, AA_Y); vec3 final_color = vec3(0); for (int m = 0; m < AA_X; m++) { for (int n = 0; n < AA_Y; n++) { - vec3 p = u_camera_position; vec2 aa_offset = vec2(float(m), float(n)) * aa_delta; - vec3 delta = normalize(u_camera_rotation * vec3(pos + aa_offset, -focal_length)); + vec3 absolute_pos = vec3(pos + aa_offset, -focal_length); + vec3 delta = normalize(absolute_pos); int i; for (i = 0; i < ITERATIONS; i++) { + vec3 p = (u_transform * vec4(absolute_pos, 1.0)).xyz; float dist = sdf(p); min_dist = min(min_dist, dist); if (dist <= 0.01) { float L = 0.3 + max(0., dot(normal(p), normalize(vec3(.8,1,.6)))); final_color += L * vec3(1.0, 0.0, 0.0); - break; } - p += dist * delta; + if (dist > 100.0) break;//little optimization + absolute_pos += dist * delta; } } } @@ -146,28 +158,40 @@ void main() { let mut view = View::default(); + window.set_mouse_relative(true); + + let mut frame_time = Instant::now(); + let mut show_debug_info = false; + 'mainloop: loop { while let Some(event) = window.next_event() { use win::Event::*; + use win::Key::*; match event { - Quit => break 'mainloop, + Quit | KeyDown(Escape) => break 'mainloop, + KeyDown(F1) => show_debug_info = !show_debug_info, + MouseMotion { xrel, yrel, .. } => { + view.yaw += xrel as f32 * 0.01; + view.pitch += yrel as f32 * 0.01; + }, _ => {}, } } window.viewport_full_screen(); - view.yaw += 0.002; - window.clear_screen(win::ColorF32::BLACK); window.use_program(&program); window.uniform1f("u_aspect_ratio", window.aspect_ratio()); - window.uniform3f("u_camera_position", view.pos.x, view.pos.y, view.pos.z); - window.uniform3x3f("u_camera_rotation", view.camera_rotation().as_slice()); + window.uniform4x4f("u_transform", view.inv_transform().as_slice()); window.draw_array(&array); window.swap(); + if show_debug_info { + println!("frame time = {:?}",frame_time.elapsed()); + frame_time = Instant::now(); + } } Ok(()) |