diff --git a/src/lib.rs b/src/lib.rs index 9eee8b2..66a39ae 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,6 @@ -use std::error::Error; +use std::{error::Error, f32::consts::FRAC_PI_2}; -use glam::{Mat4, UVec2, Vec3, Vec4, vec3, vec4}; +use glam::{Affine3A, Mat4, Quat, UVec2, Vec3, Vec4, vec3, vec4}; use crate::render::mesh::GpuParams; @@ -67,6 +67,10 @@ pub struct Core { params_gear: render::mesh::GpuParams, params_cutter: render::mesh::GpuParams, + + bevel_gear_desc: bevel_gear::BevelGearDesc, + bevel_gear_shape: bevel_gear::BevelGearShape, + crown_gear_desc: crown_gear::CrownGearDesc, } fn srgb_to_linear(color: Vec3) -> Vec3 { @@ -105,34 +109,33 @@ impl Core { let depth = Self::create_depth_buffer(&device, pixel_size); let mesh_pipeline = render::mesh::Pipeline::new(&device); - let crown_gear_mesh = crown_gear::make_mesh_simple( - &crown_gear::CrownGearDesc { - profile: Default::default(), - pitch_radius: 24.0, - }, - &crown_gear::CrownGearVisual { - inner_radius: 16.0, - outer_radius: 30.0, - base_thickness: 2.0, - }, - 600, - ) - .to_mesh() - .to_standard_mesh() - .into_indexed(); - let bevel_gear_desc = bevel_gear::BevelGearDesc { profile: Default::default(), teeth: args.tooth, cone_halfangle: args.cone_halfangle, }; + let bevel_gear_shape = bevel_gear::BevelGearShape::new_blank(&bevel_gear_desc, 60); let bevel_gear_mesh = bevel_gear::make_mesh( &bevel_gear_desc, &bevel_gear::BevelGearVisual { pad_in: 4., pad_out: 0., }, - &bevel_gear::BevelGearShape::new_blank(&bevel_gear_desc, 60), + &bevel_gear_shape, + ) + .to_mesh() + .to_standard_mesh() + .into_indexed(); + + let crown_gear_desc = bevel_gear_desc.cutter(); + let crown_gear_mesh = crown_gear::make_mesh_simple( + &crown_gear_desc, + &crown_gear::CrownGearVisual { + inner_radius: crown_gear_desc.pitch_radius / 2., + outer_radius: crown_gear_desc.pitch_radius, + base_thickness: 2.0, + }, + 600, ) .to_mesh() .to_standard_mesh() @@ -156,6 +159,9 @@ impl Core { mesh_cutter, params_gear, params_cutter, + bevel_gear_desc, + bevel_gear_shape, + crown_gear_desc, } } @@ -177,24 +183,30 @@ impl Core { .to_mat4(); let view = Mat4::from_mat3(camera::rotation(-args.cam_yaw, -args.cam_pitch)); let light = vec3(0.7, 0.5, 1.0).normalize(); + let set_params = |target: &GpuParams, color, tfm| { + target.set( + &self.queue, + render::mesh::Params { + mvp: proj * view * tfm, + light, + _zero: 0., + color: srgba_to_linear(color), + }, + ); + }; - self.params_gear.set( - &self.queue, - render::mesh::Params { - mvp: proj * view, - light, - _zero: 0., - color: srgba_to_linear(vec4(0.2, 0.8, 0.1, 1.0)), - }, + set_params( + &self.params_gear, + vec4(0.2, 0.8, 0.1, 1.0), + Affine3A::IDENTITY, ); - self.params_cutter.set( - &self.queue, - render::mesh::Params { - mvp: proj * view, - light, - _zero: 0., - color: srgba_to_linear(vec4(0.8, 0.2, 0.1, 1.0)), - }, + set_params( + &self.params_cutter, + vec4(0.8, 0.2, 0.1, 1.0), + Affine3A::from_rotation_translation( + Quat::from_rotation_y(FRAC_PI_2 + self.bevel_gear_desc.cone_halfangle), + vec3(0., 0., self.bevel_gear_desc.pitch_distance()), + ), ); let view = output.create_view(&wgpu::TextureViewDescriptor::default());