feat: CameraNode fov is now configurable
This commit is contained in:
parent
62c36b9660
commit
2fbc198d7d
|
@ -1,4 +1,5 @@
|
||||||
#include "camera_controller.h"
|
#include "camera_controller.h"
|
||||||
|
#include "core/camera_node.h"
|
||||||
#include "utils/mirror.h"
|
#include "utils/mirror.h"
|
||||||
|
|
||||||
START_REFLECT(CameraController);
|
START_REFLECT(CameraController);
|
||||||
|
@ -18,10 +19,11 @@ SceneNode *CreateCameraController(Transformable target) {
|
||||||
CameraController *self = new(CameraController);
|
CameraController *self = new(CameraController);
|
||||||
*self = (CameraController){
|
*self = (CameraController){
|
||||||
.transform = tc_null(Transformable),
|
.transform = tc_null(Transformable),
|
||||||
.rotation_speed = 5.f,
|
.rotation_speed = 2.f,
|
||||||
.max_speed_time = 4.f,
|
.max_speed_time = 4.f,
|
||||||
.target = target,
|
.target = target,
|
||||||
.time_rotated = 0.f
|
.time_rotated = 0.f,
|
||||||
|
.camera = NULL,
|
||||||
};
|
};
|
||||||
SceneNode *node = CreateSceneNode(CameraController_as_SceneNodeEntity(self));
|
SceneNode *node = CreateSceneNode(CameraController_as_SceneNodeEntity(self));
|
||||||
return node;
|
return node;
|
||||||
|
@ -34,6 +36,9 @@ void DestroyCameraController(CameraController *self) {
|
||||||
void CameraControllerEnterTree(CameraController *self) {
|
void CameraControllerEnterTree(CameraController *self) {
|
||||||
self->transform = TC_CAST(self->node->parent->entity, Transformable);
|
self->transform = TC_CAST(self->node->parent->entity, Transformable);
|
||||||
self->global = self->transform.tc->get_global_transform(self->transform.data);
|
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) {}
|
void CameraControllerExitTree(CameraController *self) {}
|
||||||
|
@ -51,7 +56,7 @@ void CameraControllerTick(CameraController *self, double delta) {
|
||||||
if(angle > 0.f)
|
if(angle > 0.f)
|
||||||
target.rotation = QuaternionSlerp(current.rotation, target.rotation, fminf(fminf(step, angle) / angle, 0.99f));
|
target.rotation = QuaternionSlerp(current.rotation, target.rotation, fminf(fminf(step, angle) / angle, 0.99f));
|
||||||
if(step > angle && self->time_rotated > delta)
|
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)
|
else if(step > angle)
|
||||||
self->time_rotated = 0.f;
|
self->time_rotated = 0.f;
|
||||||
self->time_rotated += delta;
|
self->time_rotated += delta;
|
||||||
|
|
|
@ -14,6 +14,7 @@ typedef struct CameraController {
|
||||||
float max_speed_time;
|
float max_speed_time;
|
||||||
Transformable target;
|
Transformable target;
|
||||||
float time_rotated;
|
float time_rotated;
|
||||||
|
CameraNode *camera;
|
||||||
} CameraController;
|
} CameraController;
|
||||||
|
|
||||||
extern SceneNode *CreateCameraController(Transformable target);
|
extern SceneNode *CreateCameraController(Transformable target);
|
||||||
|
|
|
@ -20,6 +20,11 @@ impl_SceneNodeEntity_for(CameraNode,
|
||||||
|
|
||||||
SceneNode *CreateCameraNode() {
|
SceneNode *CreateCameraNode() {
|
||||||
CameraNode *self = new(CameraNode);
|
CameraNode *self = new(CameraNode);
|
||||||
|
*self = (CameraNode){
|
||||||
|
.fov = 60,
|
||||||
|
.node = NULL,
|
||||||
|
.transform = tc_null(Transformable)
|
||||||
|
};
|
||||||
return CreateSceneNode(CameraNode_as_SceneNodeEntity(self));
|
return CreateSceneNode(CameraNode_as_SceneNodeEntity(self));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +56,7 @@ Camera3D CameraNodeGetCamera(CameraNode *self) {
|
||||||
Vector3 forward = MATRIX_FORWARD(mat);
|
Vector3 forward = MATRIX_FORWARD(mat);
|
||||||
// construct a new camera at the global transform location and facing the forward vector
|
// construct a new camera at the global transform location and facing the forward vector
|
||||||
return (Camera3D){
|
return (Camera3D){
|
||||||
.fovy = 90,
|
.fovy = self->fov,
|
||||||
.position = global_transform.translation,
|
.position = global_transform.translation,
|
||||||
.projection = CAMERA_PERSPECTIVE,
|
.projection = CAMERA_PERSPECTIVE,
|
||||||
.target = Vector3Add(global_transform.translation, forward),
|
.target = Vector3Add(global_transform.translation, forward),
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
typedef struct CameraNode {
|
typedef struct CameraNode {
|
||||||
SceneNode *node;
|
SceneNode *node;
|
||||||
Transformable transform;
|
Transformable transform;
|
||||||
|
float fov;
|
||||||
} CameraNode;
|
} CameraNode;
|
||||||
|
|
||||||
//! Instantiate new camera node
|
//! Instantiate new camera node
|
||||||
|
|
|
@ -56,9 +56,9 @@ void PlayerControllerTickAngularAcceleration(PlayerController *self, double delt
|
||||||
//! linear acceleration limited to the local Z axis
|
//! linear acceleration limited to the local Z axis
|
||||||
static
|
static
|
||||||
void PlayerControllerTickLinearAcceleration(PlayerController *self, double delta) {
|
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;
|
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
|
//! Update linear transform based on velocities
|
||||||
|
|
Loading…
Reference in a new issue