diff --git a/src/main.rs b/src/main.rs index 68d545d..8e2db3c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -80,6 +80,21 @@ impl ObjMesh { } Ok(result) } + + fn flatten(&self) -> Vec { + self.faces.iter().map(|face| { + Face { + vertices: face.vertices.map(|iv| self.vertices[iv.vertex]), + normal: self.normals[face.vertices[0].normal], + } + }).collect() + } +} + +#[derive(Copy, Clone, Debug)] +struct Face { + vertices: [Vec3; 3], + normal: Vec3, } const W: i32 = 800; @@ -157,6 +172,7 @@ fn main() -> io::Result<()> { let f = File::open(&args[1])?; let mut f = BufReader::new(f); ObjMesh::read(&mut f)? + .flatten() }; let mut img = Image { w: W, @@ -179,14 +195,11 @@ fn main() -> io::Result<()> { 0.0, pitch.cos(), -pitch.sin(), 0.0, pitch.sin(), pitch.cos()); let m_camera = m_roll * m_pitch * m_yaw; - for f in mesh.faces { + for f in mesh { let vs = f.vertices - .map(|v| mesh.vertices[v.vertex]); - let vs = vs .map(|v| m_camera * v) .map(|v| vec2(W as f32 * 0.5 + v.x * SCALE, H as f32 * 0.5 + v.y * SCALE)); - let n = mesh.normals[f.vertices[0].normal]; - let color = glm::clamp(to_ivec3(n * 120.0 + 128.0), ivec3(0, 0, 0), ivec3(255, 255, 255)); + let color = glm::clamp(to_ivec3(f.normal * 120.0 + 128.0), ivec3(0, 0, 0), ivec3(255, 255, 255)); img.draw_tri(vs[0], vs[1], vs[2], Color(color.x as u8, color.y as u8, color.z as u8)); } let f = File::create("1.ppm")?;