diff --git a/Cargo.lock b/Cargo.lock index 601f97e..9377e98 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -439,6 +439,15 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glam" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc46dd3ec48fdd8e693a98d2b8bafae273a2d54c1de02a2a7e3d57d501f39677" +dependencies = [ + "bytemuck", +] + [[package]] name = "glow" version = "0.14.2" @@ -1164,6 +1173,7 @@ name = "raytracing3" version = "0.1.0" dependencies = [ "bytemuck", + "glam", "pollster", "wgpu", "winit", diff --git a/Cargo.toml b/Cargo.toml index 636f01f..8a5188a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] bytemuck = { version = "1.21.0", features = ["derive"] } +glam = { version = "0.29.2", features = ["bytemuck"] } pollster = "0.4.0" wgpu = "23.0.1" winit = "0.30.6" diff --git a/src/main.rs b/src/main.rs index 97b5347..d4e6d7e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use std::error::Error; +use glam::{vec2, vec3}; use trace::{Sphere, Tracer, TracerData, Vertex}; use winit::{ event::{Event, WindowEvent}, @@ -14,9 +15,14 @@ fn make_viewport(w: u32, h: u32) -> [Vertex; 4] { let h = h as f32; let (w, h) = (1.0f32.max(w / h), 1.0f32.max(h / w)); let r = 3.0f32; - let screen_coord = [[-h, -w], [h, -w], [-h, w], [h, w]]; - let eye = [-r, 0.0, 0.0]; - let world_coord = [[0.0, -1.0, -1.0], [0.0, 1.0, -1.0], [0.0, -1.0, 1.0], [0.0, 1.0, 1.0]]; + let screen_coord = [vec2(-h, -w), vec2(h, -w), vec2(-h, w), vec2(h, w)]; + let eye = vec3(-r, 0.0, 0.0); + let world_coord = [ + vec3(0.0, -1.0, -1.0), + vec3(0.0, 1.0, -1.0), + vec3(0.0, -1.0, 1.0), + vec3(0.0, 1.0, 1.0), + ]; [0, 1, 2, 3].map(|k| Vertex { eye, world: world_coord[k], @@ -49,18 +55,18 @@ fn main() { &tracer, &[ Sphere { - center: [0.0, 0.0, 0.0], + center: vec3(0.0, 0.0, 0.0), radius: 0.5, - emit_color: [0.0, 0.0, 0.5], - reflect_color: [1.0, 0.5, 0.0], + emit_color: vec3(0.0, 0.0, 0.5), + reflect_color: vec3(1.0, 0.5, 0.0), pad1: 0., pad2: 0., }, Sphere { - center: [-2.0, 0.0, 2.0], + center: vec3(-2.0, 0.0, 2.0), radius: 0.5, - emit_color: [0.5, 0.5, 0.5], - reflect_color: [0.0, 0.5, 0.0], + emit_color: vec3(0.5, 0.5, 0.5), + reflect_color: vec3(0.0, 0.5, 0.0), pad1: 0., pad2: 0., }, diff --git a/src/trace.rs b/src/trace.rs index 1e9b80d..a7ab316 100644 --- a/src/trace.rs +++ b/src/trace.rs @@ -1,6 +1,7 @@ use std::mem::{self, offset_of}; use bytemuck::{bytes_of, cast_slice, Pod, Zeroable}; +use glam::{Vec2, Vec3}; use wgpu::util::DeviceExt; #[derive(Debug, Clone, Copy, Pod, Zeroable)] @@ -14,20 +15,20 @@ pub struct Params { #[derive(Debug, Clone, Copy, Pod, Zeroable)] #[repr(C)] pub struct Sphere { - pub center: [f32; 3], + pub center: Vec3, pub radius: f32, - pub emit_color: [f32; 3], + pub emit_color: Vec3, pub pad1: f32, - pub reflect_color: [f32; 3], + pub reflect_color: Vec3, pub pad2: f32, } #[derive(Debug, Clone, Copy, Pod, Zeroable)] #[repr(C)] pub struct Vertex { - pub eye: [f32; 3], - pub world: [f32; 3], - pub screen: [f32; 2], + pub eye: Vec3, + pub world: Vec3, + pub screen: Vec2, } pub struct Tracer {