Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert recent camera change & fix #5270 #5302

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 10 additions & 14 deletions src/config/user_config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1037,12 +1037,12 @@ namespace UserConfigParams
"Camera settings for player.") );

PARAM_PREFIX FloatUserConfigParam m_camera_distance
PARAM_DEFAULT( FloatUserConfigParam(2.8, "distance",
PARAM_DEFAULT( FloatUserConfigParam(1.0, "distance",
&m_camera_normal,
"Distance between kart and camera"));

PARAM_PREFIX FloatUserConfigParam m_camera_forward_up_angle
PARAM_DEFAULT( FloatUserConfigParam(25, "forward-up-angle",
PARAM_DEFAULT( FloatUserConfigParam(0, "forward-up-angle",
&m_camera_normal,
"Angle between camera and plane of kart (pitch) when the camera is pointing forward"));

Expand All @@ -1062,7 +1062,7 @@ namespace UserConfigParams
"Angle between camera and plane of kart (pitch) when the camera is pointing backwards. This is usually larger than the forward-up-angle, since the kart itself otherwise obstricts too much of the view"));

PARAM_PREFIX IntUserConfigParam m_camera_fov
PARAM_DEFAULT( IntUserConfigParam(85, "fov",
PARAM_DEFAULT( IntUserConfigParam(80, "fov",
&m_camera_normal,
"Focal distance (single player)"));

Expand All @@ -1076,22 +1076,18 @@ namespace UserConfigParams
"The current used camera. 0=Custom; 1=Standard; 2=Drone chase") );

// ---- Standard camera settings
PARAM_PREFIX BoolUserConfigParam m_camera_updated_one_five
PARAM_DEFAULT( BoolUserConfigParam(false, "camera-updated-one-five",
"Used to update the standard camera values for users upgrading to 1.5") );

PARAM_PREFIX GroupUserConfigParam m_standard_camera_settings
PARAM_DEFAULT( GroupUserConfigParam(
"standard-camera-settings",
"Standard camera settings for player.") );

PARAM_PREFIX FloatUserConfigParam m_standard_camera_distance
PARAM_DEFAULT( FloatUserConfigParam(2.8, "distance",
PARAM_DEFAULT( FloatUserConfigParam(1.0, "distance",
&m_standard_camera_settings,
"Distance between kart and camera"));

PARAM_PREFIX FloatUserConfigParam m_standard_camera_forward_up_angle
PARAM_DEFAULT( FloatUserConfigParam(25, "forward-up-angle",
PARAM_DEFAULT( FloatUserConfigParam(0, "forward-up-angle",
&m_standard_camera_settings,
"Angle between camera and plane of kart (pitch) when the camera is pointing forward"));

Expand All @@ -1111,7 +1107,7 @@ namespace UserConfigParams
"Angle between camera and plane of kart (pitch) when the camera is pointing backwards. This is usually larger than the forward-up-angle, since the kart itself otherwise obstricts too much of the view"));

PARAM_PREFIX IntUserConfigParam m_standard_camera_fov
PARAM_DEFAULT( IntUserConfigParam(85, "fov",
PARAM_DEFAULT( IntUserConfigParam(80, "fov",
&m_standard_camera_settings,
"Focal distance (single player)"));

Expand Down Expand Up @@ -1168,12 +1164,12 @@ namespace UserConfigParams
"Saved custom camera settings for player.") );

PARAM_PREFIX FloatUserConfigParam m_saved_camera_distance
PARAM_DEFAULT( FloatUserConfigParam(2.8, "distance",
PARAM_DEFAULT( FloatUserConfigParam(1.0, "distance",
&m_saved_camera_settings,
"Distance between kart and camera"));

PARAM_PREFIX FloatUserConfigParam m_saved_camera_forward_up_angle
PARAM_DEFAULT( FloatUserConfigParam(25, "forward-up-angle",
PARAM_DEFAULT( FloatUserConfigParam(0, "forward-up-angle",
&m_saved_camera_settings,
"Angle between camera and plane of kart (pitch) when the camera is pointing forward"));

Expand All @@ -1193,7 +1189,7 @@ namespace UserConfigParams
"Angle between camera and plane of kart (pitch) when the camera is pointing backwards. This is usually larger than the forward-up-angle, since the kart itself otherwise obstricts too much of the view"));

PARAM_PREFIX IntUserConfigParam m_saved_camera_fov
PARAM_DEFAULT( IntUserConfigParam(85, "fov",
PARAM_DEFAULT( IntUserConfigParam(80, "fov",
&m_saved_camera_settings,
"Focal distance (single player)"));

Expand Down Expand Up @@ -1474,4 +1470,4 @@ extern UserConfig *user_config;

#endif

/*EOF*/
/*EOF*/
2 changes: 0 additions & 2 deletions src/graphics/camera/camera.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,6 @@ class Camera : public NoCopy
/** Returns the type of this camera. */
CameraType getType() { return m_type; }
// ------------------------------------------------------------------------
bool isNormal() { return (m_type == CM_TYPE_NORMAL); }
// ------------------------------------------------------------------------
/** Sets the field of view for the irrlicht camera. */
void setFoV() { m_camera->setFOV(m_fov); }
// ------------------------------------------------------------------------
Expand Down
85 changes: 33 additions & 52 deletions src/graphics/camera/camera_normal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
#include "karts/kart.hpp"
#include "karts/kart_properties.hpp"
#include "karts/skidding.hpp"
#include "network/rewind_manager.hpp"
#include "tracks/track.hpp"

// ============================================================================
Expand All @@ -45,7 +44,7 @@
*/
CameraNormal::CameraNormal(Camera::CameraType type, int camera_index,
AbstractKart* kart)
: Camera(type, camera_index, kart), m_camera_offset(0, 0, -15.0f)
: Camera(type, camera_index, kart), m_camera_offset(0., 1., -15.0f)
{
m_distance = kart ? UserConfigParams::m_camera_distance : 1000.0f;
m_ambient_light = Track::getCurrentTrack()->getDefaultAmbientColor();
Expand All @@ -66,9 +65,7 @@ CameraNormal::CameraNormal(Camera::CameraType type, int camera_index,

if (kart)
{
btTransform btt = kart->getSmoothedTrans();
m_kart_position = btt.getOrigin();
m_kart_rotation = btt.getRotation();
snapToPosition(true);
}
} // Camera

Expand All @@ -82,8 +79,6 @@ void CameraNormal::moveCamera(float dt, bool smooth, float cam_angle, float dist
{
if(!m_kart) return;

if (RewindManager::get()->isRewinding()) return;

Kart *kart = dynamic_cast<Kart*>(m_kart);
if (kart->isFlying())
{
Expand All @@ -105,37 +100,26 @@ void CameraNormal::moveCamera(float dt, bool smooth, float cam_angle, float dist
float skid_factor = ks->getVisualSkidRotation();

float skid_angle = asinf(skid_factor);

// Adjust the distance of the camera to the kart with speed
// Note that distance is negative (< 0)
float ratio = current_speed / max_speed_without_zipper;

ratio = ratio > -0.12f ? ratio : -0.12f;
float speed_factor = ((distance - 2.0f) - 1.0f * ratio) / (distance - 2.0f);
float camera_distance = distance * speed_factor;

// Adjust the camera angle
// distance of camera from kart in x and z plane
float camera_distance = -1.25f - 2.5f * ratio;
float min_distance = (distance * 2.0f);
if (distance > 0) camera_distance += distance + 1; // note that distance < 0
if (camera_distance > min_distance) camera_distance = min_distance; // don't get too close to the kart

float tan_up = 0;
if (cam_angle > 0) tan_up = tanf(cam_angle) * std::max(distance - 1.0f, distance * (1.0f + 0.25f * ratio));
// Avoid a camera razing the ground (it generates a lot of terrain clipping with the current near value of 1.0)
if (tan_up > -0.5f)
tan_up = -0.5f;

// Defines how far the camera should be from the player's kart.
float squared_x = distance * sinf(skid_angle / 2);
squared_x *= squared_x;
float squared_y = tan_up;
squared_y *= squared_y;
float squared_z = distance * cosf(skid_angle / 2);
squared_z *= squared_z;
float length = sqrt(squared_x + squared_y + squared_z);
float camera_distance_factor = -camera_distance * camera_distance / length;

Vec3 wanted_camera_offset(camera_distance_factor * sinf(skid_angle / 2),
-tan_up,
camera_distance_factor * cosf(skid_angle / 2));
if (cam_angle > 0) tan_up = tanf(cam_angle) * distance;

// Defines how far camera should be from player kart.
Vec3 wanted_camera_offset(camera_distance * sinf(skid_angle / 2),
(0.85f + ratio / 2.5f) - tan_up,
camera_distance * cosf(skid_angle / 2));

float delta = 1;
float delta2 = 1;
float delta2 = 0.5;
if (smooth)
{
delta = (dt*5.0f);
Expand Down Expand Up @@ -189,10 +173,23 @@ void CameraNormal::moveCamera(float dt, bool smooth, float cam_angle, float dist
} // moveCamera

//-----------------------------------------------------------------------------
void CameraNormal::snapToPosition()
void CameraNormal::snapToPosition(bool reset_distance)
{
float angle = UserConfigParams::m_camera_forward_up_angle * DEGREE_TO_RAD;
moveCamera(1.0f, false, angle, -m_distance);
btTransform btt = m_kart->getSmoothedTrans();
const Vec3& up = btt.getBasis().getColumn(1);
m_camera->setUpVector(up.toIrrVector());

if (reset_distance)
{
m_kart_position = btt.getOrigin();
m_kart_rotation = btt.getRotation();
m_camera_offset = irr::core::vector3df(0., 1., -15.);
}
else
{
float angle = UserConfigParams::m_camera_forward_up_angle * DEGREE_TO_RAD;
moveCamera(1.0f, false, angle, -m_distance);
}
} // snapToPosition

//-----------------------------------------------------------------------------
Expand All @@ -207,22 +204,6 @@ void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle,
float *sideway, float *distance,
bool *smoothing, float *cam_roll_angle)
{
// Update the standard camera for users updating to 1.5
if(!UserConfigParams::m_camera_updated_one_five)
{
UserConfigParams::m_standard_camera_fov.revertToDefaults();
UserConfigParams::m_standard_camera_distance.revertToDefaults();
UserConfigParams::m_standard_camera_forward_up_angle.revertToDefaults();
if (UserConfigParams::m_camera_present == 1) // Currently using a standard camera
{
UserConfigParams::m_camera_fov.revertToDefaults();
UserConfigParams::m_camera_distance.revertToDefaults();
UserConfigParams::m_camera_forward_up_angle.revertToDefaults();
m_distance = UserConfigParams::m_camera_distance;
}
UserConfigParams::m_camera_updated_one_five = true;
}

switch(getMode())
{
case CM_NORMAL:
Expand Down Expand Up @@ -469,4 +450,4 @@ void CameraNormal::positionCamera(float dt, float above_kart, float cam_angle,
btMatrix3x3 m(q);
m_camera->setUpVector(((Vec3)m.getColumn(1)).toIrrVector());
}
} // positionCamera
} // positionCamera
6 changes: 3 additions & 3 deletions src/graphics/camera/camera_normal.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ class CameraNormal : public Camera
virtual ~CameraNormal() {}
public:

void snapToPosition();
// ------------------------------------------------------------------------
void snapToPosition(bool reset_distance);
// ------------------------------------------------------------------------
bool isDebug() { return false; }
// ------------------------------------------------------------------------
bool isFPS() { return false; }
Expand All @@ -95,4 +95,4 @@ class CameraNormal : public Camera

#endif

/* EOF */
/* EOF */
2 changes: 1 addition & 1 deletion src/karts/controller/local_player_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ void LocalPlayerController::update(int ticks)
if (camera->getMode() == Camera::CM_REVERSE)
{
camera->setMode(Camera::CM_NORMAL);
dynamic_cast<CameraNormal*>(camera)->snapToPosition();
dynamic_cast<CameraNormal*>(camera)->snapToPosition(false);
}
}
if (m_sky_particles_emitter)
Expand Down
33 changes: 16 additions & 17 deletions src/modes/world.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,11 @@ void World::reset(bool restart)
// explosion animation will be created
ProjectileManager::get()->cleanup();
resetAllKarts();

if (restart)
{
m_snap_camera = true;
}
// Note: track reset must be called after all karts exist, since check
// objects need to allocate data structures depending on the number
// of karts.
Expand Down Expand Up @@ -895,9 +900,6 @@ void World::resetAllKarts()
{
Camera* cam = Camera::getCamera(i);
cam->setInitialTransform();
// Ensure that smoothed cameras start from a correct position
if (cam->isNormal())
dynamic_cast<CameraNormal*>(cam)->snapToPosition();
}
}
} // resetAllKarts
Expand Down Expand Up @@ -944,8 +946,6 @@ void World::moveKartTo(AbstractKart* kart, const btTransform &transform)
// This will set the physics transform
Track::getCurrentTrack()->findGround(kart);
Track::getCurrentTrack()->getCheckManager()->resetAfterKartMove(kart);

m_snap_camera = true;
} // moveKartTo

// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -1029,18 +1029,6 @@ void World::updateWorld(int ticks)
m_schedule_unpause = false;
}

if (m_snap_camera)
{
m_snap_camera = false;
for(unsigned int i=0; i<Camera::getNumCameras(); i++)
{
Camera* cam = Camera::getCamera(i);
// Ensure that smoothed cameras start from a correct position
if (cam->isNormal())
dynamic_cast<CameraNormal*>(cam)->snapToPosition();
}
}

// Don't update world if a menu is shown or the race is over.
// Exceptions : - Networking (local pause doesn't affect the server or other players)
// - Benchmarking (a pause would mess up measurements)
Expand Down Expand Up @@ -1176,6 +1164,17 @@ void World::update(int ticks)
}
#endif

if (m_snap_camera)
{
m_snap_camera = false;
for(unsigned int i=0; i<Camera::getNumCameras(); i++)
{
Camera* cam = Camera::getCamera(i);
// Ensure that smoothed cameras start from a correct position
dynamic_cast<CameraNormal*>(cam)->snapToPosition(true);
}
}

PROFILER_PUSH_CPU_MARKER("World::update (sub-updates)", 0x20, 0x7F, 0x00);
WorldStatus::update(ticks);
PROFILER_POP_CPU_MARKER();
Expand Down
Loading