From cc475fc550df8a554048d210868b2a40ab84c18c Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 25 Sep 2024 21:37:31 +0200 Subject: [PATCH] fix: renamed PlayerController functions had forgotten from renaming the struct --- src/main.c | 2 +- src/player_controller.c | 70 ++++++++++++++++++++++++++--------------- src/player_controller.h | 29 ++++++++--------- 3 files changed, 61 insertions(+), 40 deletions(-) diff --git a/src/main.c b/src/main.c index 51e8f61..dc03fe6 100644 --- a/src/main.c +++ b/src/main.c @@ -31,7 +31,7 @@ SceneNode *CreateModelScene() { SceneNode *model_parent = CreateTransformNode(); // create the rest of the scene with a mesh and a functionality node SceneNodeAddChild(model_parent, CreateMeshRenderEntity("rider")); - SceneNodeAddChild(model_parent, CreateTestObject()); + SceneNodeAddChild(model_parent, CreatePlayerController()); // move the renderer's parent transform Transformable transformable = TC_CAST(model_parent->entity, Transformable); Transform transform = transformable.tc->get_global_transform(transformable.data); diff --git a/src/player_controller.c b/src/player_controller.c index 7b177a5..c7c3971 100644 --- a/src/player_controller.c +++ b/src/player_controller.c @@ -11,78 +11,98 @@ REFLECT_TYPECLASS(PlayerController, Renderable); END_REFLECT(PlayerController); impl_Drop_for(PlayerController, - DestroyTestObject + DestroyPlayerController ) impl_Renderable_for(PlayerController, - TestObjectDraw + PlayerControllerDraw ) impl_SceneNodeEntity_for(PlayerController, - TestObjectEnterTree, - TestObjectExitTree, - TestObjectTick + PlayerControllerEnterTree, + PlayerControllerExitTree, + PlayerControllerTick ) -SceneNode *CreateTestObject() { +SceneNode *CreatePlayerController() { PlayerController *self = new(PlayerController); self->rotation = self->fly_input = Vector2Zero(); self->stopped = false; return CreateSceneNode(PlayerController_as_SceneNodeEntity(self)); } -void DestroyTestObject(PlayerController *self) { +void DestroyPlayerController(PlayerController *self) { free(self); } -void TestObjectEnterTree(PlayerController *self) { +void PlayerControllerEnterTree(PlayerController *self) { self->transform = TC_CAST(self->node->parent->entity, Transformable); AddRenderable(PlayerController_as_Renderable(self)); - AddListener("pitch_up", ButtonInputListener(self, TestObjectUpInput)); - AddListener("pitch_down", ButtonInputListener(self, TestObjectDownInput)); - AddListener("roll_left", ButtonInputListener(self, TestObjectLeftInput)); - AddListener("roll_right", ButtonInputListener(self, TestObjectRightInput)); - AddListener("stop", ButtonInputListener(self, TestObjectStopInput)); + DisableCursor(); + AddListener("pitch_up", ButtonInputListener(self, PlayerControllerUpInput)); + AddListener("pitch_down", ButtonInputListener(self, PlayerControllerDownInput)); + AddListener("roll_left", ButtonInputListener(self, PlayerControllerLeftInput)); + AddListener("roll_right", ButtonInputListener(self, PlayerControllerRightInput)); + AddListener("stop", ButtonInputListener(self, PlayerControllerStopInput)); } -void TestObjectExitTree(PlayerController *self) { +void PlayerControllerExitTree(PlayerController *self) { RemoveRenderable(PlayerController_as_Renderable(self)); } -void TestObjectDraw(PlayerController *self) { +void PlayerControllerDraw(PlayerController *self) { } -void TestObjectTick(PlayerController *self, double delta) { - if(self->stopped) return; +//! angular acceleration limited to local X and Z axes +static +void PlayerControllerTickAngularAcceleration(PlayerController *self, double delta) { Vector2 diff = Vector2Subtract(self->fly_input, self->rotation); float const length = Vector2Length(diff); if(length != 0.f) self->rotation = Vector2Add(self->rotation, Vector2Scale(diff, 1.0f/length * fminf(4.f * delta, length))); +} + +//! linear acceleration limited to the local Z axis +static +void PlayerControllerTickLinearAcceleration(PlayerController *self, double delta) { + float const target = (!self->stopped && self->rotation.y == 0.f) ? 30.f : 20.f; + float const speed_diff = target - self->speed; + self->speed = self->speed + copysignf(fminf(fabsf(speed_diff), 10.f * delta), speed_diff); +} + +//! Update linear transform based on velocities +static +void PlayerControllerTickTransform(PlayerController *self, double delta) { Transform global_transform = self->transform.tc->get_global_transform(self->transform.data); Matrix global_matrix = TransformGetMatrix(global_transform); - global_transform.translation = Vector3Add(global_transform.translation, Vector3Scale(MATRIX_FORWARD(global_matrix), 20.f * delta)); - global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_FORWARD(global_matrix), self->rotation.x * 4.f * delta), global_transform.rotation); - global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_RIGHT(global_matrix), self->rotation.y * 4.f * delta), global_transform.rotation); + global_transform.translation = Vector3Add(global_transform.translation, Vector3Scale(MATRIX_FORWARD(global_matrix), self->speed * delta)); + global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_FORWARD(global_matrix), self->rotation.x * 2.f * delta), global_transform.rotation); + global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_RIGHT(global_matrix), self->rotation.y * 2.5f * delta), global_transform.rotation); self->transform.tc->set_global_transform(self->transform.data, global_transform); } +void PlayerControllerTick(PlayerController *self, double delta) { + PlayerControllerTickAngularAcceleration(self, delta); + PlayerControllerTickLinearAcceleration(self, delta); + PlayerControllerTickTransform(self, delta); +} -void TestObjectLeftInput(PlayerController *self, bool value) { +void PlayerControllerLeftInput(PlayerController *self, bool value) { self->fly_input.x += value ? -1 : +1; } -void TestObjectRightInput(PlayerController *self, bool value) { +void PlayerControllerRightInput(PlayerController *self, bool value) { self->fly_input.x += value ? +1 : -1; } -void TestObjectUpInput(PlayerController *self, bool value) { +void PlayerControllerUpInput(PlayerController *self, bool value) { self->fly_input.y += value ? -1 : +1; } -void TestObjectDownInput(PlayerController *self, bool value) { +void PlayerControllerDownInput(PlayerController *self, bool value) { self->fly_input.y += value ? +1 : -1; } -void TestObjectStopInput(PlayerController *self, bool value) { +void PlayerControllerStopInput(PlayerController *self, bool value) { self->stopped = value; } diff --git a/src/player_controller.h b/src/player_controller.h index ff2a3b3..f5de4cb 100644 --- a/src/player_controller.h +++ b/src/player_controller.h @@ -1,5 +1,5 @@ -#ifndef TEST_OBJECT_H -#define TEST_OBJECT_H +#ifndef PLAYER_CONTROLLER_H +#define PLAYER_CONTROLLER_H #include "core/scene.h" #include "core/scene_node_entity.h" @@ -14,26 +14,27 @@ typedef struct PlayerController { Transformable transform; Vector2 fly_input; Vector2 rotation; + float speed; bool stopped; } PlayerController; -SceneNode *CreateTestObject(); -void DestroyTestObject(PlayerController *self); +SceneNode *CreatePlayerController(); +void DestroyPlayerController(PlayerController *self); -extern void TestObjectEnterTree(PlayerController *self); -extern void TestObjectExitTree(PlayerController *self); -extern void TestObjectDraw(PlayerController *self); -extern void TestObjectTick(PlayerController *self, double delta); +extern void PlayerControllerEnterTree(PlayerController *self); +extern void PlayerControllerExitTree(PlayerController *self); +extern void PlayerControllerDraw(PlayerController *self); +extern void PlayerControllerTick(PlayerController *self, double delta); -extern void TestObjectLeftInput(PlayerController *self, bool value); -extern void TestObjectRightInput(PlayerController *self, bool value); -extern void TestObjectUpInput(PlayerController *self, bool value); -extern void TestObjectDownInput(PlayerController *self, bool value); -extern void TestObjectStopInput(PlayerController *self, bool value); +extern void PlayerControllerLeftInput(PlayerController *self, bool value); +extern void PlayerControllerRightInput(PlayerController *self, bool value); +extern void PlayerControllerUpInput(PlayerController *self, bool value); +extern void PlayerControllerDownInput(PlayerController *self, bool value); +extern void PlayerControllerStopInput(PlayerController *self, bool value); DECL_REFLECT(PlayerController); decl_typeclass_impl(SceneNodeEntity, PlayerController); decl_typeclass_impl(Drop, PlayerController); decl_typeclass_impl(Renderable, PlayerController); -#endif // !TEST_OBJECT_H +#endif // !PLAYER_CONTROLLER_H