From af1b32d91d7f2bd4685309b269a438839b449607 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 15 Jul 2024 14:06:49 +0300 Subject: [PATCH] remove camera latency --- res/content/base/models/player.mtl | 13 ++++++ res/content/base/models/player.obj | 8 ++-- src/logic/PlayerController.cpp | 18 +++----- src/logic/PlayerController.hpp | 1 - src/objects/Player.cpp | 70 +++++++++++++++--------------- 5 files changed, 59 insertions(+), 51 deletions(-) create mode 100644 res/content/base/models/player.mtl diff --git a/res/content/base/models/player.mtl b/res/content/base/models/player.mtl new file mode 100644 index 00000000..21707271 --- /dev/null +++ b/res/content/base/models/player.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'player.blend' +# Material Count: 1 + +newmtl entities/player +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 1 +map_Kd /home/ubuntu/Projects/Cpp/VoxelEngine-Cpp/res/content/base/textures/entities/player.png diff --git a/res/content/base/models/player.obj b/res/content/base/models/player.obj index d0be9e17..f9f65297 100644 --- a/res/content/base/models/player.obj +++ b/res/content/base/models/player.obj @@ -6,10 +6,10 @@ v 0.125000 -0.900000 -0.125000 v 0.125000 -0.900000 0.125000 v -0.125000 -0.900000 0.125000 v -0.125000 -0.900000 -0.125000 -v 0.125000 0.700000 -0.125000 -v 0.125000 0.700000 0.125000 -v -0.125000 0.700000 0.125000 -v -0.125000 0.700000 -0.125000 +v 0.125000 0.491919 -0.125000 +v 0.125000 0.491919 0.125000 +v -0.125000 0.491919 0.125000 +v -0.125000 0.491919 -0.125000 vt 0.783122 0.009685 vt 0.982503 0.009685 vt 0.982503 0.209065 diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index 5c4bf69c..6bb8ccc4 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -163,6 +163,8 @@ void CameraControl::update(const PlayerInput& input, float delta, Chunks* chunks auto spCamera = player->spCamera; auto tpCamera = player->tpCamera; + refresh(); + if (player->currentCamera == spCamera) { spCamera->position = chunks->rayCastToObstacle( camera->position, camera->front, 3.0f) - 0.2f * camera->front; @@ -256,16 +258,17 @@ void PlayerController::postUpdate(float delta, bool input, bool pause) { if (!pause) { updateFootsteps(delta); } - player->postUpdate(); - camControl.refresh(); - if (!pause) { - updateCamera(delta, input); + + if (!pause && input) { + camControl.updateMouse(this->input); } if (input) { updateInteraction(); } else { player->selection = {}; } + player->postUpdate(); + camControl.update(this->input, delta, level->chunks.get()); } void PlayerController::updateKeyboard() { @@ -283,13 +286,6 @@ void PlayerController::updateKeyboard() { input.flight = Events::jactive(BIND_PLAYER_FLIGHT); } -void PlayerController::updateCamera(float delta, bool movement) { - if (movement) { - camControl.updateMouse(input); - } - camControl.update(input, delta, level->chunks.get()); -} - void PlayerController::resetKeyboard() { input.zoom = false; input.moveForward = false; diff --git a/src/logic/PlayerController.hpp b/src/logic/PlayerController.hpp index 521e7ec3..140a001f 100644 --- a/src/logic/PlayerController.hpp +++ b/src/logic/PlayerController.hpp @@ -66,7 +66,6 @@ class PlayerController { std::vector blockInteractionCallbacks; void updateKeyboard(); - void updateCamera(float delta, bool movement); void resetKeyboard(); void updatePlayer(float delta); void updateInteraction(); diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index 5a22221c..2f1dfc7e 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -62,25 +62,11 @@ Hitbox* Player::getHitbox() { } void Player::updateInput(PlayerInput& input, float delta) { - auto entity = level->entities->get(eid); - if (!entity.has_value()) { + auto hitbox = getHitbox(); + if (hitbox == nullptr) { return; } - auto& hitbox = entity->getRigidbody().hitbox; - auto& skeleton = entity->getSkeleton(); - - skeleton.visible = currentCamera != camera; - - size_t bodyIndex = skeleton.config->find("body")->getIndex(); - size_t headIndex = skeleton.config->find("head")->getIndex(); - - skeleton.pose.matrices[bodyIndex] = - glm::rotate(glm::mat4(1.0f), glm::radians(cam.x-90), glm::vec3(0, 1, 0)); - skeleton.pose.matrices[headIndex] = glm::rotate(glm::rotate( - glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.6f, 0.0f)), - glm::radians(-cam.y), glm::vec3(0, 0, 1)), glm::radians(90.0f), glm::vec3(0, 1, 0)); - - bool crouch = input.shift && hitbox.grounded && !input.sprint; + bool crouch = input.shift && hitbox->grounded && !input.sprint; float speed = this->speed; if (flight){ speed *= FLIGHT_SPEED_MUL; @@ -89,7 +75,7 @@ void Player::updateInput(PlayerInput& input, float delta) { speed *= CHEAT_SPEED_MUL; } - hitbox.crouching = crouch; + hitbox->crouching = crouch; if (crouch) { speed *= CROUCH_SPEED_MUL; } else if (input.sprint) { @@ -111,37 +97,37 @@ void Player::updateInput(PlayerInput& input, float delta) { } if (glm::length(dir) > 0.0f){ dir = glm::normalize(dir); - hitbox.velocity += dir * speed * delta * 9.0f; + hitbox->velocity += dir * speed * delta * 9.0f; } - hitbox.linearDamping = PLAYER_GROUND_DAMPING; - hitbox.verticalDamping = flight; - hitbox.gravityScale = flight ? 0.0f : 1.0f; + hitbox->linearDamping = PLAYER_GROUND_DAMPING; + hitbox->verticalDamping = flight; + hitbox->gravityScale = flight ? 0.0f : 1.0f; if (flight){ - hitbox.linearDamping = PLAYER_AIR_DAMPING; + hitbox->linearDamping = PLAYER_AIR_DAMPING; if (input.jump){ - hitbox.velocity.y += speed * delta * 9; + hitbox->velocity.y += speed * delta * 9; } if (input.shift){ - hitbox.velocity.y -= speed * delta * 9; + hitbox->velocity.y -= speed * delta * 9; } } - if (!hitbox.grounded) { - hitbox.linearDamping = PLAYER_AIR_DAMPING; + if (!hitbox->grounded) { + hitbox->linearDamping = PLAYER_AIR_DAMPING; } - if (input.jump && hitbox.grounded){ - hitbox.velocity.y = JUMP_FORCE; + if (input.jump && hitbox->grounded){ + hitbox->velocity.y = JUMP_FORCE; } if ((input.flight && !noclip) || (input.noclip && flight == noclip)){ flight = !flight; if (flight){ - hitbox.velocity.y += 1.0f; + hitbox->velocity.y += 1.0f; } } - hitbox.type = noclip ? BodyType::KINEMATIC : BodyType::DYNAMIC; + hitbox->type = noclip ? BodyType::KINEMATIC : BodyType::DYNAMIC; if (input.noclip) { noclip = !noclip; } @@ -150,18 +136,32 @@ void Player::updateInput(PlayerInput& input, float delta) { } void Player::postUpdate() { - auto hitbox = getHitbox(); - if (hitbox == nullptr) { + auto entity = level->entities->get(eid); + if (!entity.has_value()) { return; } - position = hitbox->position; + auto& hitbox = entity->getRigidbody().hitbox; + position = hitbox.position; - if (flight && hitbox->grounded) { + if (flight && hitbox.grounded) { flight = false; } if (spawnpoint.y <= 0.1) { attemptToFindSpawnpoint(); } + + auto& skeleton = entity->getSkeleton(); + + skeleton.visible = currentCamera != camera; + + size_t bodyIndex = skeleton.config->find("body")->getIndex(); + size_t headIndex = skeleton.config->find("head")->getIndex(); + + skeleton.pose.matrices[bodyIndex] = + glm::rotate(glm::mat4(1.0f), glm::radians(cam.x-90), glm::vec3(0, 1, 0)); + skeleton.pose.matrices[headIndex] = glm::rotate(glm::rotate( + glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.4f, 0.0f)), + glm::radians(-cam.y), glm::vec3(0, 0, 1)), glm::radians(90.0f), glm::vec3(0, 1, 0)); } void Player::teleport(glm::vec3 position) {