feat: CameraNode fov is now configurable
This commit is contained in:
parent
62c36b9660
commit
2fbc198d7d
|
@ -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;
|
||||
|
|
|
@ -14,6 +14,7 @@ typedef struct CameraController {
|
|||
float max_speed_time;
|
||||
Transformable target;
|
||||
float time_rotated;
|
||||
CameraNode *camera;
|
||||
} CameraController;
|
||||
|
||||
extern SceneNode *CreateCameraController(Transformable target);
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
typedef struct CameraNode {
|
||||
SceneNode *node;
|
||||
Transformable transform;
|
||||
float fov;
|
||||
} CameraNode;
|
||||
|
||||
//! Instantiate new camera node
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue