fix: renamed PlayerController functions
had forgotten from renaming the struct
This commit is contained in:
parent
c2f7381ce5
commit
cc475fc550
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue