feat: CameraNode fov is now configurable

This commit is contained in:
Sara 2024-09-27 10:33:12 +02:00
parent 62c36b9660
commit 2fbc198d7d
5 changed files with 18 additions and 6 deletions

View file

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

View file

@ -14,6 +14,7 @@ typedef struct CameraController {
float max_speed_time;
Transformable target;
float time_rotated;
CameraNode *camera;
} CameraController;
extern SceneNode *CreateCameraController(Transformable target);

View file

@ -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),

View file

@ -10,6 +10,7 @@
typedef struct CameraNode {
SceneNode *node;
Transformable transform;
float fov;
} CameraNode;
//! Instantiate new camera node

View file

@ -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