fix: renamed PlayerController functions

had forgotten from renaming the struct
This commit is contained in:
Sara 2024-09-25 21:37:31 +02:00
parent c2f7381ce5
commit cc475fc550
3 changed files with 61 additions and 40 deletions

View file

@ -31,7 +31,7 @@ SceneNode *CreateModelScene() {
SceneNode *model_parent = CreateTransformNode(); SceneNode *model_parent = CreateTransformNode();
// create the rest of the scene with a mesh and a functionality node // create the rest of the scene with a mesh and a functionality node
SceneNodeAddChild(model_parent, CreateMeshRenderEntity("rider")); SceneNodeAddChild(model_parent, CreateMeshRenderEntity("rider"));
SceneNodeAddChild(model_parent, CreateTestObject()); SceneNodeAddChild(model_parent, CreatePlayerController());
// move the renderer's parent transform // move the renderer's parent transform
Transformable transformable = TC_CAST(model_parent->entity, Transformable); Transformable transformable = TC_CAST(model_parent->entity, Transformable);
Transform transform = transformable.tc->get_global_transform(transformable.data); Transform transform = transformable.tc->get_global_transform(transformable.data);

View file

@ -11,78 +11,98 @@ REFLECT_TYPECLASS(PlayerController, Renderable);
END_REFLECT(PlayerController); END_REFLECT(PlayerController);
impl_Drop_for(PlayerController, impl_Drop_for(PlayerController,
DestroyTestObject DestroyPlayerController
) )
impl_Renderable_for(PlayerController, impl_Renderable_for(PlayerController,
TestObjectDraw PlayerControllerDraw
) )
impl_SceneNodeEntity_for(PlayerController, impl_SceneNodeEntity_for(PlayerController,
TestObjectEnterTree, PlayerControllerEnterTree,
TestObjectExitTree, PlayerControllerExitTree,
TestObjectTick PlayerControllerTick
) )
SceneNode *CreateTestObject() { SceneNode *CreatePlayerController() {
PlayerController *self = new(PlayerController); PlayerController *self = new(PlayerController);
self->rotation = self->fly_input = Vector2Zero(); self->rotation = self->fly_input = Vector2Zero();
self->stopped = false; self->stopped = false;
return CreateSceneNode(PlayerController_as_SceneNodeEntity(self)); return CreateSceneNode(PlayerController_as_SceneNodeEntity(self));
} }
void DestroyTestObject(PlayerController *self) { void DestroyPlayerController(PlayerController *self) {
free(self); free(self);
} }
void TestObjectEnterTree(PlayerController *self) { void PlayerControllerEnterTree(PlayerController *self) {
self->transform = TC_CAST(self->node->parent->entity, Transformable); self->transform = TC_CAST(self->node->parent->entity, Transformable);
AddRenderable(PlayerController_as_Renderable(self)); AddRenderable(PlayerController_as_Renderable(self));
AddListener("pitch_up", ButtonInputListener(self, TestObjectUpInput)); DisableCursor();
AddListener("pitch_down", ButtonInputListener(self, TestObjectDownInput)); AddListener("pitch_up", ButtonInputListener(self, PlayerControllerUpInput));
AddListener("roll_left", ButtonInputListener(self, TestObjectLeftInput)); AddListener("pitch_down", ButtonInputListener(self, PlayerControllerDownInput));
AddListener("roll_right", ButtonInputListener(self, TestObjectRightInput)); AddListener("roll_left", ButtonInputListener(self, PlayerControllerLeftInput));
AddListener("stop", ButtonInputListener(self, TestObjectStopInput)); AddListener("roll_right", ButtonInputListener(self, PlayerControllerRightInput));
AddListener("stop", ButtonInputListener(self, PlayerControllerStopInput));
} }
void TestObjectExitTree(PlayerController *self) { void PlayerControllerExitTree(PlayerController *self) {
RemoveRenderable(PlayerController_as_Renderable(self)); RemoveRenderable(PlayerController_as_Renderable(self));
} }
void TestObjectDraw(PlayerController *self) { void PlayerControllerDraw(PlayerController *self) {
} }
void TestObjectTick(PlayerController *self, double delta) { //! angular acceleration limited to local X and Z axes
if(self->stopped) return; static
void PlayerControllerTickAngularAcceleration(PlayerController *self, double delta) {
Vector2 diff = Vector2Subtract(self->fly_input, self->rotation); Vector2 diff = Vector2Subtract(self->fly_input, self->rotation);
float const length = Vector2Length(diff); float const length = Vector2Length(diff);
if(length != 0.f) if(length != 0.f)
self->rotation = Vector2Add(self->rotation, Vector2Scale(diff, 1.0f/length * fminf(4.f * delta, length))); 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); Transform global_transform = self->transform.tc->get_global_transform(self->transform.data);
Matrix global_matrix = TransformGetMatrix(global_transform); Matrix global_matrix = TransformGetMatrix(global_transform);
global_transform.translation = Vector3Add(global_transform.translation, Vector3Scale(MATRIX_FORWARD(global_matrix), 20.f * delta)); 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 * 4.f * delta), global_transform.rotation); 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 * 4.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); 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; 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; 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; 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; self->fly_input.y += value ? +1 : -1;
} }
void TestObjectStopInput(PlayerController *self, bool value) { void PlayerControllerStopInput(PlayerController *self, bool value) {
self->stopped = value; self->stopped = value;
} }

View file

@ -1,5 +1,5 @@
#ifndef TEST_OBJECT_H #ifndef PLAYER_CONTROLLER_H
#define TEST_OBJECT_H #define PLAYER_CONTROLLER_H
#include "core/scene.h" #include "core/scene.h"
#include "core/scene_node_entity.h" #include "core/scene_node_entity.h"
@ -14,26 +14,27 @@ typedef struct PlayerController {
Transformable transform; Transformable transform;
Vector2 fly_input; Vector2 fly_input;
Vector2 rotation; Vector2 rotation;
float speed;
bool stopped; bool stopped;
} PlayerController; } PlayerController;
SceneNode *CreateTestObject(); SceneNode *CreatePlayerController();
void DestroyTestObject(PlayerController *self); void DestroyPlayerController(PlayerController *self);
extern void TestObjectEnterTree(PlayerController *self); extern void PlayerControllerEnterTree(PlayerController *self);
extern void TestObjectExitTree(PlayerController *self); extern void PlayerControllerExitTree(PlayerController *self);
extern void TestObjectDraw(PlayerController *self); extern void PlayerControllerDraw(PlayerController *self);
extern void TestObjectTick(PlayerController *self, double delta); extern void PlayerControllerTick(PlayerController *self, double delta);
extern void TestObjectLeftInput(PlayerController *self, bool value); extern void PlayerControllerLeftInput(PlayerController *self, bool value);
extern void TestObjectRightInput(PlayerController *self, bool value); extern void PlayerControllerRightInput(PlayerController *self, bool value);
extern void TestObjectUpInput(PlayerController *self, bool value); extern void PlayerControllerUpInput(PlayerController *self, bool value);
extern void TestObjectDownInput(PlayerController *self, bool value); extern void PlayerControllerDownInput(PlayerController *self, bool value);
extern void TestObjectStopInput(PlayerController *self, bool value); extern void PlayerControllerStopInput(PlayerController *self, bool value);
DECL_REFLECT(PlayerController); DECL_REFLECT(PlayerController);
decl_typeclass_impl(SceneNodeEntity, PlayerController); decl_typeclass_impl(SceneNodeEntity, PlayerController);
decl_typeclass_impl(Drop, PlayerController); decl_typeclass_impl(Drop, PlayerController);
decl_typeclass_impl(Renderable, PlayerController); decl_typeclass_impl(Renderable, PlayerController);
#endif // !TEST_OBJECT_H #endif // !PLAYER_CONTROLLER_H