fix renderHands with third person cameras
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 {};
|
||||||
|
|||||||
Reference in New Issue
Block a user