feat: added yaw keys
This commit is contained in:
parent
a9bc57a175
commit
f79fda16e9
|
@ -56,7 +56,9 @@ void ConfigureInput() {
|
||||||
AddAction("pitch_down", INPUT_LISTENER_KEY, 0, KEY_W);
|
AddAction("pitch_down", INPUT_LISTENER_KEY, 0, KEY_W);
|
||||||
AddAction("roll_left", INPUT_LISTENER_KEY, 0, KEY_A);
|
AddAction("roll_left", INPUT_LISTENER_KEY, 0, KEY_A);
|
||||||
AddAction("roll_right", INPUT_LISTENER_KEY, 0, KEY_D);
|
AddAction("roll_right", INPUT_LISTENER_KEY, 0, KEY_D);
|
||||||
AddAction("stop", INPUT_LISTENER_KEY, 0, KEY_SPACE);
|
AddAction("yaw_right", INPUT_LISTENER_KEY, 0, KEY_E);
|
||||||
|
AddAction("yaw_left", INPUT_LISTENER_KEY, 0, KEY_Q);
|
||||||
|
AddAction("brake", INPUT_LISTENER_KEY, 0, KEY_SPACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#include "player_controller.h"
|
#include "player_controller.h"
|
||||||
#include "core/render.h"
|
#include "core/render.h"
|
||||||
#include "utils/debug.h"
|
|
||||||
#include "core/input.h"
|
#include "core/input.h"
|
||||||
|
#include "utils/typeclass_helpers.h"
|
||||||
|
#include "utils/debug.h"
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
|
||||||
START_REFLECT(PlayerController);
|
START_REFLECT(PlayerController);
|
||||||
|
@ -21,8 +22,14 @@ impl_SceneNodeEntity_for(PlayerController,
|
||||||
|
|
||||||
SceneNode *CreatePlayerController() {
|
SceneNode *CreatePlayerController() {
|
||||||
PlayerController *self = new(PlayerController);
|
PlayerController *self = new(PlayerController);
|
||||||
self->rotation = self->fly_input = Vector2Zero();
|
*self = (PlayerController) {
|
||||||
self->stopped = false;
|
.node = NULL,
|
||||||
|
.transform = tc_null(Transformable),
|
||||||
|
.rotation = Vector3Zero(),
|
||||||
|
.fly_input = Vector3Zero(),
|
||||||
|
.speed = 10.f,
|
||||||
|
.brake = false
|
||||||
|
};
|
||||||
return CreateSceneNode(PlayerController_as_SceneNodeEntity(self));
|
return CreateSceneNode(PlayerController_as_SceneNodeEntity(self));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,30 +40,39 @@ void DestroyPlayerController(PlayerController *self) {
|
||||||
void PlayerControllerEnterTree(PlayerController *self) {
|
void PlayerControllerEnterTree(PlayerController *self) {
|
||||||
self->transform = TC_CAST(self->node->parent->entity, Transformable);
|
self->transform = TC_CAST(self->node->parent->entity, Transformable);
|
||||||
DisableCursor();
|
DisableCursor();
|
||||||
AddListener("pitch_up", ButtonInputListener(self, PlayerControllerUpInput));
|
AddListener("pitch_up", ButtonInputListener(self, PlayerControllerInputPitchUp));
|
||||||
AddListener("pitch_down", ButtonInputListener(self, PlayerControllerDownInput));
|
AddListener("pitch_down", ButtonInputListener(self, PlayerControllerInputPitchDown));
|
||||||
AddListener("roll_left", ButtonInputListener(self, PlayerControllerLeftInput));
|
AddListener("roll_left", ButtonInputListener(self, PlayerControllerInputRollLeft));
|
||||||
AddListener("roll_right", ButtonInputListener(self, PlayerControllerRightInput));
|
AddListener("roll_right", ButtonInputListener(self, PlayerControllerInputRollRight));
|
||||||
AddListener("stop", ButtonInputListener(self, PlayerControllerStopInput));
|
AddListener("yaw_left", ButtonInputListener(self, PlayerControllerInputYawLeft));
|
||||||
|
AddListener("yaw_right", ButtonInputListener(self, PlayerControllerInputYawRight));
|
||||||
|
AddListener("stop", ButtonInputListener(self, PlayerControllerInputBrake));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerControllerExitTree(PlayerController *self) {
|
void PlayerControllerExitTree(PlayerController *self) {
|
||||||
RemoveAllListeners(self);
|
RemoveAllListeners(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
float MoveTowards(float from, float to, float delta) {
|
||||||
|
if(from == to) return to;
|
||||||
|
float const diff = to - from;
|
||||||
|
float const sign = signbit(diff) ? -1.f : 1.f;
|
||||||
|
return from + sign * fminf(delta, fabsf(diff));
|
||||||
|
}
|
||||||
|
|
||||||
//! angular acceleration limited to local X and Z axes
|
//! angular acceleration limited to local X and Z axes
|
||||||
static
|
static
|
||||||
void PlayerControllerTickAngularAcceleration(PlayerController *self, double delta) {
|
void PlayerControllerTickAngularAcceleration(PlayerController *self, double delta) {
|
||||||
Vector2 diff = Vector2Subtract(self->fly_input, self->rotation);
|
self->rotation.x = MoveTowards(self->rotation.x, self->fly_input.x, delta * 4.f);
|
||||||
float const length = Vector2Length(diff);
|
self->rotation.y = MoveTowards(self->rotation.y, self->fly_input.y, delta * 4.f);
|
||||||
if(length != 0.f)
|
self->rotation.z = MoveTowards(self->rotation.z, self->fly_input.z, delta * 4.f);
|
||||||
self->rotation = Vector2Add(self->rotation, Vector2Scale(diff, 1.0f/length * fminf(4.f * delta, length)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! 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 ? 5.f : (self->rotation.y == 0.f ? 30.f : 10.f);
|
float const target = self->brake ? 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), 15.f * delta), speed_diff);
|
self->speed = self->speed + copysignf(fminf(fabsf(speed_diff), 15.f * delta), speed_diff);
|
||||||
}
|
}
|
||||||
|
@ -69,6 +85,7 @@ void PlayerControllerTickTransform(PlayerController *self, double delta) {
|
||||||
global_transform.translation = Vector3Add(global_transform.translation, Vector3Scale(MATRIX_FORWARD(global_matrix), self->speed * 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 * 2.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 * 2.5f * delta), global_transform.rotation);
|
global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_RIGHT(global_matrix), self->rotation.y * 2.5f * delta), global_transform.rotation);
|
||||||
|
global_transform.rotation = QuaternionMultiply(QuaternionFromAxisAngle(MATRIX_UP(global_matrix), self->rotation.z * 1.f * 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,22 +95,30 @@ void PlayerControllerTick(PlayerController *self, double delta) {
|
||||||
PlayerControllerTickTransform(self, delta);
|
PlayerControllerTickTransform(self, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerControllerLeftInput(PlayerController *self, bool value) {
|
void PlayerControllerInputRollLeft(PlayerController *self, bool value) {
|
||||||
self->fly_input.x += value ? -1 : +1;
|
self->fly_input.x += value ? -1 : +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerControllerRightInput(PlayerController *self, bool value) {
|
void PlayerControllerInputRollRight(PlayerController *self, bool value) {
|
||||||
self->fly_input.x += value ? +1 : -1;
|
self->fly_input.x += value ? +1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerControllerUpInput(PlayerController *self, bool value) {
|
void PlayerControllerInputPitchUp(PlayerController *self, bool value) {
|
||||||
self->fly_input.y += value ? -1 : +1;
|
self->fly_input.y += value ? -1 : +1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerControllerDownInput(PlayerController *self, bool value) {
|
void PlayerControllerInputPitchDown(PlayerController *self, bool value) {
|
||||||
self->fly_input.y += value ? +1 : -1;
|
self->fly_input.y += value ? +1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerControllerStopInput(PlayerController *self, bool value) {
|
void PlayerControllerInputYawRight(PlayerController *self, bool value) {
|
||||||
self->stopped = value;
|
self->fly_input.z += value ? -1 : +1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayerControllerInputYawLeft(PlayerController *self, bool value) {
|
||||||
|
self->fly_input.z += value ? +1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayerControllerInputBrake(PlayerController *self, bool value) {
|
||||||
|
self->brake = value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,10 +12,10 @@
|
||||||
typedef struct PlayerController {
|
typedef struct PlayerController {
|
||||||
SceneNode *node;
|
SceneNode *node;
|
||||||
Transformable transform;
|
Transformable transform;
|
||||||
Vector2 fly_input;
|
Vector3 fly_input;
|
||||||
Vector2 rotation;
|
Vector3 rotation;
|
||||||
float speed;
|
float speed;
|
||||||
bool stopped;
|
bool brake;
|
||||||
} PlayerController;
|
} PlayerController;
|
||||||
|
|
||||||
SceneNode *CreatePlayerController();
|
SceneNode *CreatePlayerController();
|
||||||
|
@ -25,11 +25,13 @@ extern void PlayerControllerEnterTree(PlayerController *self);
|
||||||
extern void PlayerControllerExitTree(PlayerController *self);
|
extern void PlayerControllerExitTree(PlayerController *self);
|
||||||
extern void PlayerControllerTick(PlayerController *self, double delta);
|
extern void PlayerControllerTick(PlayerController *self, double delta);
|
||||||
|
|
||||||
extern void PlayerControllerLeftInput(PlayerController *self, bool value);
|
extern void PlayerControllerInputRollLeft(PlayerController *self, bool value);
|
||||||
extern void PlayerControllerRightInput(PlayerController *self, bool value);
|
extern void PlayerControllerInputRollRight(PlayerController *self, bool value);
|
||||||
extern void PlayerControllerUpInput(PlayerController *self, bool value);
|
extern void PlayerControllerInputPitchUp(PlayerController *self, bool value);
|
||||||
extern void PlayerControllerDownInput(PlayerController *self, bool value);
|
extern void PlayerControllerInputPitchDown(PlayerController *self, bool value);
|
||||||
extern void PlayerControllerStopInput(PlayerController *self, bool value);
|
extern void PlayerControllerInputYawRight(PlayerController *self, bool value);
|
||||||
|
extern void PlayerControllerInputYawLeft(PlayerController *self, bool value);
|
||||||
|
extern void PlayerControllerInputBrake(PlayerController *self, bool value);
|
||||||
|
|
||||||
DECL_REFLECT(PlayerController);
|
DECL_REFLECT(PlayerController);
|
||||||
decl_typeclass_impl(SceneNodeEntity, PlayerController);
|
decl_typeclass_impl(SceneNodeEntity, PlayerController);
|
||||||
|
|
Loading…
Reference in a new issue