From 62c36b96600ea90eb32d9618844306a835fc4240 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 26 Sep 2024 14:09:29 +0200 Subject: [PATCH] chore: clarity camera controller tick function --- src/camera_controller.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/camera_controller.c b/src/camera_controller.c index 2cbe9c6..9aa1733 100644 --- a/src/camera_controller.c +++ b/src/camera_controller.c @@ -42,14 +42,18 @@ void CameraControllerTick(CameraController *self, double delta) { Transform current = self->transform.tc->get_global_transform(self->transform.data); self->target.tc->force_update(self->target.data); Transform target = self->target.tc->get_global_transform(self->target.data); + // calculate time multiplier... float const time_mul = fminf(1.f, fmaxf(0.1f, powf(self->time_rotated / self->max_speed_time, 0.5f))); + // ... angle difference ... float const angle = QuaternionAngleDifference(current.rotation, target.rotation); + // ... and maximum frame step size float const step = self->rotation_speed * time_mul * delta; - self->time_rotated += delta; - if(step < angle) - target.rotation = QuaternionSlerp(current.rotation, target.rotation, step / angle); - else if(self->time_rotated > delta) + if(angle > 0.f) + target.rotation = QuaternionSlerp(current.rotation, target.rotation, fminf(fminf(step, angle) / angle, 0.99f)); + if(step > angle && self->time_rotated > delta) self->time_rotated -= 3.f * delta; - else self->time_rotated = 0.f; + else if(step > angle) + self->time_rotated = 0.f; + self->time_rotated += delta; self->transform.tc->set_global_transform(self->transform.data, target); }