|
|
@ -109,47 +109,50 @@ impl Corner {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub fn update(&mut self, font_dimensions: Point, destination: Point, dt: f32) -> bool {
|
|
|
|
pub fn update(&mut self, font_dimensions: Point, destination: Point, dt: f32) -> bool {
|
|
|
|
|
|
|
|
// Update destination if needed
|
|
|
|
if destination != self.previous_destination {
|
|
|
|
if destination != self.previous_destination {
|
|
|
|
self.t = 0.0;
|
|
|
|
self.t = 0.0;
|
|
|
|
self.start_position = self.current_position;
|
|
|
|
self.start_position = self.current_position;
|
|
|
|
self.previous_destination = destination;
|
|
|
|
self.previous_destination = destination;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let finished_animating = self.t >= 1.0; // Check first if animation's over, so we still render one frame at t == 1.0
|
|
|
|
// Check first if animation's over
|
|
|
|
|
|
|
|
if self.t > 1.0 {
|
|
|
|
if self.t <= 1.0 {
|
|
|
|
return false;
|
|
|
|
// Calculate window-space destination for corner
|
|
|
|
}
|
|
|
|
let relative_scaled_position: Point = (
|
|
|
|
|
|
|
|
self.relative_position.x * font_dimensions.x,
|
|
|
|
|
|
|
|
self.relative_position.y * font_dimensions.y,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
.into();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let corner_destination = destination + relative_scaled_position;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Calculate how much a corner will be lagging behind based on how much it's aligned
|
|
|
|
|
|
|
|
// with the direction of motion. Corners in front will move faster than corners in the
|
|
|
|
|
|
|
|
// back
|
|
|
|
|
|
|
|
let corner_direction = {
|
|
|
|
|
|
|
|
let mut d = destination - self.current_position;
|
|
|
|
|
|
|
|
d.normalize();
|
|
|
|
|
|
|
|
d
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let direction_alignment = corner_direction.dot(self.relative_position);
|
|
|
|
// Calculate window-space destination for corner
|
|
|
|
|
|
|
|
let relative_scaled_position: Point = (
|
|
|
|
|
|
|
|
self.relative_position.x * font_dimensions.x,
|
|
|
|
|
|
|
|
self.relative_position.y * font_dimensions.y,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
.into();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let corner_destination = destination + relative_scaled_position;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Calculate how much a corner will be lagging behind based on how much it's aligned
|
|
|
|
|
|
|
|
// with the direction of motion. Corners in front will move faster than corners in the
|
|
|
|
|
|
|
|
// back
|
|
|
|
|
|
|
|
let corner_direction = {
|
|
|
|
|
|
|
|
let mut d = destination - self.current_position;
|
|
|
|
|
|
|
|
d.normalize();
|
|
|
|
|
|
|
|
d
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
self.current_position = ease_point(
|
|
|
|
let direction_alignment = corner_direction.dot(self.relative_position);
|
|
|
|
ease_linear,
|
|
|
|
|
|
|
|
self.start_position,
|
|
|
|
|
|
|
|
corner_destination,
|
|
|
|
|
|
|
|
self.t);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let corner_dt = dt * lerp(1.0, 1.0 - CURSOR_TRAIL_SIZE, direction_alignment);
|
|
|
|
self.current_position =
|
|
|
|
|
|
|
|
ease_point(ease_linear, self.start_position, corner_destination, self.t);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if self.t == 1.0 {
|
|
|
|
|
|
|
|
// We are at destination, move t out of 0-1 range to stop the animation
|
|
|
|
|
|
|
|
self.t = 2.0;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
let corner_dt = dt * lerp(1.0, 1.0 - CURSOR_TRAIL_SIZE, direction_alignment);
|
|
|
|
self.t = (self.t + corner_dt / BASE_ANIMATION_LENGTH_SECONDS).min(1.0)
|
|
|
|
self.t = (self.t + corner_dt / BASE_ANIMATION_LENGTH_SECONDS).min(1.0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
!finished_animating
|
|
|
|
true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|