position the bevel cutter to cut

This commit is contained in:
numzero 2026-10-19 02:45:48 +03:00
parent 972aee716a
commit c600fa082c

View File

@ -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; use crate::render::mesh::GpuParams;
@ -67,6 +67,10 @@ pub struct Core {
params_gear: render::mesh::GpuParams, params_gear: render::mesh::GpuParams,
params_cutter: 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 { fn srgb_to_linear(color: Vec3) -> Vec3 {
@ -105,34 +109,33 @@ impl Core {
let depth = Self::create_depth_buffer(&device, pixel_size); let depth = Self::create_depth_buffer(&device, pixel_size);
let mesh_pipeline = render::mesh::Pipeline::new(&device); 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 { let bevel_gear_desc = bevel_gear::BevelGearDesc {
profile: Default::default(), profile: Default::default(),
teeth: args.tooth, teeth: args.tooth,
cone_halfangle: args.cone_halfangle, 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( let bevel_gear_mesh = bevel_gear::make_mesh(
&bevel_gear_desc, &bevel_gear_desc,
&bevel_gear::BevelGearVisual { &bevel_gear::BevelGearVisual {
pad_in: 4., pad_in: 4.,
pad_out: 0., 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_mesh()
.to_standard_mesh() .to_standard_mesh()
@ -156,6 +159,9 @@ impl Core {
mesh_cutter, mesh_cutter,
params_gear, params_gear,
params_cutter, params_cutter,
bevel_gear_desc,
bevel_gear_shape,
crown_gear_desc,
} }
} }
@ -177,24 +183,30 @@ impl Core {
.to_mat4(); .to_mat4();
let view = Mat4::from_mat3(camera::rotation(-args.cam_yaw, -args.cam_pitch)); let view = Mat4::from_mat3(camera::rotation(-args.cam_yaw, -args.cam_pitch));
let light = vec3(0.7, 0.5, 1.0).normalize(); let light = vec3(0.7, 0.5, 1.0).normalize();
let set_params = |target: &GpuParams, color, tfm| {
self.params_gear.set( target.set(
&self.queue, &self.queue,
render::mesh::Params { render::mesh::Params {
mvp: proj * view, mvp: proj * view * tfm,
light, light,
_zero: 0., _zero: 0.,
color: srgba_to_linear(vec4(0.2, 0.8, 0.1, 1.0)), color: srgba_to_linear(color),
}, },
); );
self.params_cutter.set( };
&self.queue,
render::mesh::Params { set_params(
mvp: proj * view, &self.params_gear,
light, vec4(0.2, 0.8, 0.1, 1.0),
_zero: 0., Affine3A::IDENTITY,
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()); let view = output.create_view(&wgpu::TextureViewDescriptor::default());