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;
@ -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());