Skip to content
Permalink
Browse files

Camera: Fix shooting line offsets (#9681)

Removes duplicated offset calculations from Game and use whatever the Camera class returns.
This keeps the eye position nicely in sync, and gets rid of duplicated code.
  • Loading branch information
SmallJoker committed Apr 16, 2020
1 parent 5cbe843 commit 45999b74e610b13e8cda20c0c420e152b9837ea6
Showing with 31 additions and 24 deletions.
  1. +15 −11 src/client/camera.cpp
  2. +6 −0 src/client/camera.h
  3. +7 −13 src/client/game.cpp
  4. +3 −0 src/client/localplayer.h
@@ -333,17 +333,21 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r
fall_bobbing *= m_cache_fall_bobbing_amount;
}

// Calculate players eye offset for different camera modes
v3f PlayerEyeOffset = player->getEyeOffset();
if (m_camera_mode == CAMERA_MODE_FIRST)
PlayerEyeOffset += player->eye_offset_first;
else
PlayerEyeOffset += player->eye_offset_third;

// Set head node transformation
m_headnode->setPosition(PlayerEyeOffset+v3f(0,cameratilt*-player->hurt_tilt_strength+fall_bobbing,0));
m_headnode->setRotation(v3f(player->getPitch(), 0, cameratilt*player->hurt_tilt_strength));
m_headnode->updateAbsolutePosition();
// Calculate and translate the head SceneNode offsets
{
v3f eye_offset = player->getEyeOffset();
if (m_camera_mode == CAMERA_MODE_FIRST)
eye_offset += player->eye_offset_first;
else
eye_offset += player->eye_offset_third;

// Set head node transformation
eye_offset.Y += cameratilt * -player->hurt_tilt_strength + fall_bobbing;
m_headnode->setPosition(eye_offset);
m_headnode->setRotation(v3f(player->getPitch(), 0,
cameratilt * player->hurt_tilt_strength));
m_headnode->updateAbsolutePosition();
}

// Compute relative camera position and target
v3f rel_cam_pos = v3f(0,0,0);
@@ -75,6 +75,12 @@ class Camera
return m_camera_position;
}

// Returns the absolute position of the head SceneNode in the world
inline v3f getHeadPosition() const
{
return m_headnode->getAbsolutePosition();
}

// Get the camera direction (in absolute camera coordinates).
// This has view bobbing applied.
inline v3f getDirection() const
@@ -3029,16 +3029,9 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
{
LocalPlayer *player = client->getEnv().getLocalPlayer();

v3f player_position = player->getPosition();
v3f player_eye_position = player->getEyePosition();
v3f camera_position = camera->getPosition();
v3f camera_direction = camera->getDirection();
v3s16 camera_offset = camera->getOffset();

if (camera->getCameraMode() == CAMERA_MODE_FIRST)
player_eye_position += player->eye_offset_first;
else
player_eye_position += player->eye_offset_third;
const v3f head_position = camera->getHeadPosition();
const v3f camera_direction = camera->getDirection();
const v3s16 camera_offset = camera->getOffset();

/*
Calculate what block is the crosshair pointing to
@@ -3053,11 +3046,11 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
core::line3d<f32> shootline;

if (camera->getCameraMode() != CAMERA_MODE_THIRD_FRONT) {
shootline = core::line3d<f32>(player_eye_position,
player_eye_position + camera_direction * BS * d);
shootline = core::line3d<f32>(head_position,
head_position + camera_direction * BS * d);
} else {
// prevent player pointing anything in front-view
shootline = core::line3d<f32>(camera_position, camera_position);
shootline = core::line3d<f32>(head_position, head_position);
}

#ifdef HAVE_TOUCHSCREENGUI
@@ -3145,6 +3138,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
} else if (pointed.type == POINTEDTHING_NODE) {
handlePointingAtNode(pointed, selected_item, hand_item, dtime);
} else if (pointed.type == POINTEDTHING_OBJECT) {
v3f player_position = player->getPosition();
handlePointingAtObject(pointed, tool_item, player_position, show_debug);
} else if (input->getLeftState()) {
// When button is held down in air, show continuous animation
@@ -135,6 +135,9 @@ class LocalPlayer : public Player
}

v3f getPosition() const { return m_position; }

// Non-transformed eye offset getters
// For accurate positions, use the Camera functions
v3f getEyePosition() const { return m_position + getEyeOffset(); }
v3f getEyeOffset() const;
void setEyeHeight(float eye_height) { m_eye_height = eye_height; }

0 comments on commit 45999b7

Please sign in to comment.
You can’t perform that action at this time.