diff --git a/src/lib.rs b/src/lib.rs index 66a39ae..643b3ad 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,9 @@ -use std::{error::Error, f32::consts::FRAC_PI_2}; +use std::{ + error::Error, + f32::consts::{FRAC_PI_2, PI}, +}; -use glam::{Affine3A, Mat4, Quat, UVec2, Vec3, Vec4, vec3, vec4}; +use glam::{Affine3A, FloatExt, Mat4, Quat, UVec2, Vec3, Vec4, vec3, vec4}; use crate::render::mesh::GpuParams; @@ -71,6 +74,7 @@ pub struct Core { bevel_gear_desc: bevel_gear::BevelGearDesc, bevel_gear_shape: bevel_gear::BevelGearShape, crown_gear_desc: crown_gear::CrownGearDesc, + t: f32, } fn srgb_to_linear(color: Vec3) -> Vec3 { @@ -162,6 +166,7 @@ impl Core { bevel_gear_desc, bevel_gear_shape, crown_gear_desc, + t: 0., } } @@ -195,6 +200,12 @@ impl Core { ); }; + let turn_teeth = self.t; + let bevel_turns = turn_teeth / self.bevel_gear_desc.teeth as f32; + let crown_skip_teeth = self.crown_gear_desc.pitch_radius.floor(); + let crown_turns = + (turn_teeth.fract_gl() + crown_skip_teeth) / (2. * self.crown_gear_desc.pitch_radius); + set_params( &self.params_gear, vec4(0.2, 0.8, 0.1, 1.0), @@ -204,7 +215,8 @@ impl Core { &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), + Quat::from_rotation_y(FRAC_PI_2 + self.bevel_gear_desc.cone_halfangle) + * Quat::from_rotation_z(2. * PI * crown_turns), vec3(0., 0., self.bevel_gear_desc.pitch_distance()), ), ); @@ -290,6 +302,7 @@ impl Core { let output = self.surface.get_current_texture().unwrap(); self.render(&output.texture, args); output.present(); + self.t += 1. / 60.; } } diff --git a/ui/src/viewport.cxx b/ui/src/viewport.cxx index 833cd83..14ca272 100644 --- a/ui/src/viewport.cxx +++ b/ui/src/viewport.cxx @@ -44,6 +44,7 @@ void Viewport::paintEvent(QPaintEvent* event) { if (!core) recreate(); core->redraw(args); + update(); } void Viewport::resizeEvent(QResizeEvent* event) {