fix renderHands with third person cameras

This commit is contained in:
MihailRis
2024-10-31 21:27:30 +03:00
parent 2c16f986e1
commit e217476e84
7 changed files with 25 additions and 23 deletions
+2 -2
View File
@@ -37,10 +37,10 @@ LevelFrontend::LevelFrontend(
auto soundsCamera = currentPlayer->currentCamera.get(); auto soundsCamera = currentPlayer->currentCamera.get();
if (soundsCamera == currentPlayer->spCamera.get() || if (soundsCamera == currentPlayer->spCamera.get() ||
soundsCamera == currentPlayer->tpCamera.get()) { soundsCamera == currentPlayer->tpCamera.get()) {
soundsCamera = currentPlayer->camera.get(); soundsCamera = currentPlayer->fpCamera.get();
} }
bool relative = player == currentPlayer && bool relative = player == currentPlayer &&
soundsCamera == currentPlayer->camera.get(); soundsCamera == currentPlayer->fpCamera.get();
if (!relative) { if (!relative) {
pos = player->getPosition(); pos = player->getPosition();
} }
+2 -2
View File
@@ -48,7 +48,7 @@ LevelScreen::LevelScreen(Engine* engine, std::unique_ptr<Level> level)
worldRenderer->clear(); worldRenderer->clear();
})); }));
keepAlive(settings.camera.fov.observe([=](double value) { keepAlive(settings.camera.fov.observe([=](double value) {
controller->getPlayer()->camera->setFov(glm::radians(value)); controller->getPlayer()->fpCamera->setFov(glm::radians(value));
})); }));
keepAlive(Events::getBinding(BIND_CHUNKS_RELOAD).onactived.add([=](){ keepAlive(Events::getBinding(BIND_CHUNKS_RELOAD).onactived.add([=](){
controller->getLevel()->chunks->saveAndClear(); controller->getLevel()->chunks->saveAndClear();
@@ -93,7 +93,7 @@ void LevelScreen::saveWorldPreview() {
int previewSize = settings.ui.worldPreviewSize.get(); int previewSize = settings.ui.worldPreviewSize.get();
// camera special copy for world preview // camera special copy for world preview
Camera camera = *player->camera; Camera camera = *player->fpCamera;
camera.setFov(glm::radians(70.0f)); camera.setFov(glm::radians(70.0f));
DrawContext pctx(nullptr, {Window::width, Window::height}, batch.get()); DrawContext pctx(nullptr, {Window::width, Window::height}, batch.get());
+7 -5
View File
@@ -284,7 +284,7 @@ void WorldRenderer::renderDebugLines(
if (showChunkBorders) { if (showChunkBorders) {
linesShader->uniformMatrix("u_projview", camera.getProjView()); linesShader->uniformMatrix("u_projview", camera.getProjView());
glm::vec3 coord = player->camera->position; glm::vec3 coord = player->fpCamera->position;
if (coord.x < 0) coord.x--; if (coord.x < 0) coord.x--;
if (coord.z < 0) coord.z--; if (coord.z < 0) coord.z--;
int cx = floordiv(static_cast<int>(coord.x), CHUNK_W); int cx = floordiv(static_cast<int>(coord.x), CHUNK_W);
@@ -432,7 +432,9 @@ void WorldRenderer::draw(
// Debug lines // Debug lines
if (hudVisible) { if (hudVisible) {
renderLines(camera, linesShader, ctx); renderLines(camera, linesShader, ctx);
renderHands(camera, assets); if (player->currentCamera == player->fpCamera) {
renderHands(camera, assets);
}
} }
} }
if (hudVisible && player->debug) { if (hudVisible && player->debug) {
@@ -450,9 +452,9 @@ void WorldRenderer::draw(
} }
void WorldRenderer::renderBlockOverlay(const DrawContext& wctx, const Assets& assets) { void WorldRenderer::renderBlockOverlay(const DrawContext& wctx, const Assets& assets) {
int x = std::floor(player->camera->position.x); int x = std::floor(player->currentCamera->position.x);
int y = std::floor(player->camera->position.y); int y = std::floor(player->currentCamera->position.y);
int z = std::floor(player->camera->position.z); int z = std::floor(player->currentCamera->position.z);
auto block = level->chunks->get(x, y, z); auto block = level->chunks->get(x, y, z);
if (block && block->id) { if (block && block->id) {
const auto& def = const auto& def =
+3 -3
View File
@@ -41,7 +41,7 @@ CameraControl::CameraControl(
const std::shared_ptr<Player>& player, const CameraSettings& settings const std::shared_ptr<Player>& player, const CameraSettings& settings
) )
: player(player), : player(player),
camera(player->camera), camera(player->fpCamera),
settings(settings), settings(settings),
offset(0.0f, 0.7f, 0.0f) { offset(0.0f, 0.7f, 0.0f) {
} }
@@ -353,7 +353,7 @@ static void pick_block(
voxel* PlayerController::updateSelection(float maxDistance) { voxel* PlayerController::updateSelection(float maxDistance) {
auto indices = level->content->getIndices(); auto indices = level->content->getIndices();
auto chunks = level->chunks.get(); auto chunks = level->chunks.get();
auto camera = player->camera.get(); auto camera = player->fpCamera.get();
auto& selection = player->selection; auto& selection = player->selection;
glm::vec3 end; glm::vec3 end;
@@ -416,7 +416,7 @@ voxel* PlayerController::updateSelection(float maxDistance) {
void PlayerController::processRightClick(const Block& def, const Block& target) { void PlayerController::processRightClick(const Block& def, const Block& target) {
const auto& selection = player->selection; const auto& selection = player->selection;
auto chunks = level->chunks.get(); auto chunks = level->chunks.get();
auto camera = player->camera.get(); auto camera = player->fpCamera.get();
blockstate state {}; blockstate state {};
state.rotation = determine_rotation(&def, selection.normal, camera->dir); state.rotation = determine_rotation(&def, selection.normal, camera->dir);
+1 -1
View File
@@ -85,7 +85,7 @@ static int l_set_rot(lua::State* L) {
static int l_get_dir(lua::State* L) { static int l_get_dir(lua::State* L) {
if (auto player = get_player(L, 1)) { if (auto player = get_player(L, 1)) {
return lua::pushvec3(L, player->camera->front); return lua::pushvec3(L, player->fpCamera->front);
} }
return 0; return 0;
} }
+9 -9
View File
@@ -40,11 +40,11 @@ Player::Player(
position(position), position(position),
inventory(std::move(inv)), inventory(std::move(inv)),
eid(eid), eid(eid),
camera(level->getCamera("core:first-person")), fpCamera(level->getCamera("core:first-person")),
spCamera(level->getCamera("core:third-person-front")), spCamera(level->getCamera("core:third-person-front")),
tpCamera(level->getCamera("core:third-person-back")), tpCamera(level->getCamera("core:third-person-back")),
currentCamera(camera) { currentCamera(fpCamera) {
camera->setFov(glm::radians(90.0f)); fpCamera->setFov(glm::radians(90.0f));
spCamera->setFov(glm::radians(90.0f)); spCamera->setFov(glm::radians(90.0f));
tpCamera->setFov(glm::radians(90.0f)); tpCamera->setFov(glm::radians(90.0f));
} }
@@ -93,16 +93,16 @@ void Player::updateInput(PlayerInput& input, float delta) {
glm::vec3 dir(0, 0, 0); glm::vec3 dir(0, 0, 0);
if (input.moveForward) { if (input.moveForward) {
dir += camera->dir; dir += fpCamera->dir;
} }
if (input.moveBack) { if (input.moveBack) {
dir -= camera->dir; dir -= fpCamera->dir;
} }
if (input.moveRight) { if (input.moveRight) {
dir += camera->right; dir += fpCamera->right;
} }
if (input.moveLeft) { if (input.moveLeft) {
dir -= camera->right; dir -= fpCamera->right;
} }
if (glm::length(dir) > 0.0f) { if (glm::length(dir) > 0.0f) {
dir = glm::normalize(dir); dir = glm::normalize(dir);
@@ -166,7 +166,7 @@ void Player::postUpdate() {
auto& skeleton = entity->getSkeleton(); auto& skeleton = entity->getSkeleton();
skeleton.visible = currentCamera != camera; skeleton.visible = currentCamera != fpCamera;
auto body = skeleton.config->find("body"); auto body = skeleton.config->find("body");
auto head = skeleton.config->find("head"); auto head = skeleton.config->find("head");
@@ -289,7 +289,7 @@ void Player::deserialize(const dv::value& src) {
const auto& posarr = src["position"]; const auto& posarr = src["position"];
dv::get_vec(posarr, position); dv::get_vec(posarr, position);
camera->position = position; fpCamera->position = position;
const auto& rotarr = src["rotation"]; const auto& rotarr = src["rotation"];
dv::get_vec(rotarr, cam); dv::get_vec(rotarr, cam);
+1 -1
View File
@@ -52,7 +52,7 @@ class Player : public Object, public Serializable {
entityid_t eid; entityid_t eid;
entityid_t selectedEid; entityid_t selectedEid;
public: public:
std::shared_ptr<Camera> camera, spCamera, tpCamera; std::shared_ptr<Camera> fpCamera, spCamera, tpCamera;
std::shared_ptr<Camera> currentCamera; std::shared_ptr<Camera> currentCamera;
bool debug = false; bool debug = false;
glm::vec3 cam {}; glm::vec3 cam {};