From 2fbc198d7deb9087156285393b4efd5fcf3e2693 Mon Sep 17 00:00:00 2001 From: Sara Date: Fri, 27 Sep 2024 10:33:12 +0200 Subject: [PATCH] feat: CameraNode fov is now configurable --- src/camera_controller.c | 11 ++++++++--- src/camera_controller.h | 1 + src/core/camera_node.c | 7 ++++++- src/core/camera_node.h | 1 + src/player_controller.c | 4 ++-- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/camera_controller.c b/src/camera_controller.c index 9aa1733..cc772fc 100644 --- a/src/camera_controller.c +++ b/src/camera_controller.c @@ -1,4 +1,5 @@ #include "camera_controller.h" +#include "core/camera_node.h" #include "utils/mirror.h" START_REFLECT(CameraController); @@ -18,10 +19,11 @@ SceneNode *CreateCameraController(Transformable target) { CameraController *self = new(CameraController); *self = (CameraController){ .transform = tc_null(Transformable), - .rotation_speed = 5.f, + .rotation_speed = 2.f, .max_speed_time = 4.f, .target = target, - .time_rotated = 0.f + .time_rotated = 0.f, + .camera = NULL, }; SceneNode *node = CreateSceneNode(CameraController_as_SceneNodeEntity(self)); return node; @@ -34,6 +36,9 @@ void DestroyCameraController(CameraController *self) { void CameraControllerEnterTree(CameraController *self) { self->transform = TC_CAST(self->node->parent->entity, Transformable); self->global = self->transform.tc->get_global_transform(self->transform.data); + SceneNode *camera_node = SceneNodeGetChildByTypeid(self->node->parent, GET_TYPEID(CameraNode), true); + self->camera = camera_node->entity.data; + self->camera->fov = 100; } void CameraControllerExitTree(CameraController *self) {} @@ -51,7 +56,7 @@ void CameraControllerTick(CameraController *self, double 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; + self->time_rotated = fminf(self->time_rotated - 3.f * delta, self->max_speed_time * 0.5f); else if(step > angle) self->time_rotated = 0.f; self->time_rotated += delta; diff --git a/src/camera_controller.h b/src/camera_controller.h index 29b2279..ca0d689 100644 --- a/src/camera_controller.h +++ b/src/camera_controller.h @@ -14,6 +14,7 @@ typedef struct CameraController { float max_speed_time; Transformable target; float time_rotated; + CameraNode *camera; } CameraController; extern SceneNode *CreateCameraController(Transformable target); diff --git a/src/core/camera_node.c b/src/core/camera_node.c index 6d21434..cef88ec 100644 --- a/src/core/camera_node.c +++ b/src/core/camera_node.c @@ -20,6 +20,11 @@ impl_SceneNodeEntity_for(CameraNode, SceneNode *CreateCameraNode() { CameraNode *self = new(CameraNode); + *self = (CameraNode){ + .fov = 60, + .node = NULL, + .transform = tc_null(Transformable) + }; return CreateSceneNode(CameraNode_as_SceneNodeEntity(self)); } @@ -51,7 +56,7 @@ Camera3D CameraNodeGetCamera(CameraNode *self) { Vector3 forward = MATRIX_FORWARD(mat); // construct a new camera at the global transform location and facing the forward vector return (Camera3D){ - .fovy = 90, + .fovy = self->fov, .position = global_transform.translation, .projection = CAMERA_PERSPECTIVE, .target = Vector3Add(global_transform.translation, forward), diff --git a/src/core/camera_node.h b/src/core/camera_node.h index 8837bfd..79fd2b0 100644 --- a/src/core/camera_node.h +++ b/src/core/camera_node.h @@ -10,6 +10,7 @@ typedef struct CameraNode { SceneNode *node; Transformable transform; + float fov; } CameraNode; //! Instantiate new camera node diff --git a/src/player_controller.c b/src/player_controller.c index 4910ba6..7253ac4 100644 --- a/src/player_controller.c +++ b/src/player_controller.c @@ -56,9 +56,9 @@ void PlayerControllerTickAngularAcceleration(PlayerController *self, double delt //! linear acceleration limited to the local Z axis static void PlayerControllerTickLinearAcceleration(PlayerController *self, double delta) { - float const target = self->stopped ? 10.f : (self->rotation.y == 0.f ? 30.f : 20.f); + float const target = self->stopped ? 5.f : (self->rotation.y == 0.f ? 30.f : 10.f); float const speed_diff = target - self->speed; - self->speed = self->speed + copysignf(fminf(fabsf(speed_diff), 10.f * delta), speed_diff); + self->speed = self->speed + copysignf(fminf(fabsf(speed_diff), 15.f * delta), speed_diff); } //! Update linear transform based on velocities