Move camera update to update graphics
This commit is contained in:
@@ -196,8 +196,8 @@ void Camera::setMode(Mode mode)
|
||||
(m_mode==CM_FALLING && mode==CM_NORMAL) )
|
||||
{
|
||||
Vec3 start_offset(0, 1.6f, -3);
|
||||
Vec3 current_position = m_kart->getTrans()(start_offset);
|
||||
Vec3 target_position = m_kart->getTrans()(Vec3(0, 0, 1));
|
||||
Vec3 current_position = m_kart->getSmoothedTrans()(start_offset);
|
||||
Vec3 target_position = m_kart->getSmoothedTrans()(Vec3(0, 0, 1));
|
||||
// Don't set position and target the same, otherwise
|
||||
// nan values will be calculated in ViewArea of camera
|
||||
m_camera->setPosition(current_position.toIrrVector());
|
||||
@@ -236,7 +236,7 @@ void Camera::setInitialTransform()
|
||||
{
|
||||
if (m_kart == NULL) return;
|
||||
Vec3 start_offset(0, 1.6f, -3);
|
||||
Vec3 current_position = m_kart->getTrans()(start_offset);
|
||||
Vec3 current_position = m_kart->getSmoothedTrans()(start_offset);
|
||||
assert(!std::isnan(current_position.getX()));
|
||||
assert(!std::isnan(current_position.getY()));
|
||||
assert(!std::isnan(current_position.getZ()));
|
||||
@@ -246,7 +246,7 @@ void Camera::setInitialTransform()
|
||||
// direction till smoothMoveCamera has corrected this. Setting target
|
||||
// to position doesn't make sense, but smoothMoves will adjust the
|
||||
// value before the first frame is rendered
|
||||
Vec3 target_position = m_kart->getTrans()(Vec3(0, 0, 1));
|
||||
Vec3 target_position = m_kart->getSmoothedTrans()(Vec3(0, 0, 1));
|
||||
m_camera->setTarget(target_position.toIrrVector());
|
||||
m_camera->setRotation(core::vector3df(0, 0, 0));
|
||||
m_camera->setFOV(m_fov);
|
||||
@@ -274,7 +274,7 @@ void Camera::update(float dt)
|
||||
if (race_manager->getNumLocalPlayers() < 2)
|
||||
{
|
||||
Vec3 heading(sin(m_kart->getHeading()), 0.0f, cos(m_kart->getHeading()));
|
||||
SFXManager::get()->positionListener(m_kart->getXYZ(),
|
||||
SFXManager::get()->positionListener(m_kart->getSmoothedXYZ(),
|
||||
heading,
|
||||
Vec3(0, 1, 0));
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@ void CameraDebug::update(float dt)
|
||||
// high above the kart straight down.
|
||||
if (m_default_debug_Type==CM_DEBUG_TOP_OF_KART)
|
||||
{
|
||||
core::vector3df xyz = m_kart->getXYZ().toIrrVector();
|
||||
core::vector3df xyz = m_kart->getSmoothedXYZ().toIrrVector();
|
||||
m_camera->setTarget(xyz);
|
||||
#define CLOSE_TO_KART
|
||||
#ifdef CLOSE_TO_KART
|
||||
@@ -118,9 +118,9 @@ void CameraDebug::update(float dt)
|
||||
}
|
||||
else if (m_default_debug_Type==CM_DEBUG_SIDE_OF_KART)
|
||||
{
|
||||
core::vector3df xyz = m_kart->getXYZ().toIrrVector();
|
||||
core::vector3df xyz = m_kart->getSmoothedXYZ().toIrrVector();
|
||||
Vec3 offset(3, 0, 0);
|
||||
offset = m_kart->getTrans()(offset);
|
||||
offset = m_kart->getSmoothedTrans()(offset);
|
||||
m_camera->setTarget(xyz);
|
||||
m_camera->setPosition(offset.toIrrVector());
|
||||
}
|
||||
@@ -136,7 +136,7 @@ void CameraDebug::update(float dt)
|
||||
// above the kart).
|
||||
// Note: this code is replicated from smoothMoveCamera so that
|
||||
// the camera keeps on pointing to the same spot.
|
||||
core::vector3df current_target = (m_kart->getXYZ().toIrrVector()
|
||||
core::vector3df current_target = (m_kart->getSmoothedXYZ().toIrrVector()
|
||||
+core::vector3df(0, above_kart, 0));
|
||||
m_camera->setTarget(current_target);
|
||||
}
|
||||
@@ -158,7 +158,7 @@ void CameraDebug::positionCamera(float dt, float above_kart, float cam_angle,
|
||||
float side_way, float distance )
|
||||
{
|
||||
Vec3 wanted_position;
|
||||
Vec3 wanted_target = m_kart->getXYZ();
|
||||
Vec3 wanted_target = m_kart->getSmoothedXYZ();
|
||||
if(m_default_debug_Type==CM_DEBUG_GROUND)
|
||||
{
|
||||
const btWheelInfo &w = m_kart->getVehicle()->getWheelInfo(2);
|
||||
@@ -170,7 +170,7 @@ void CameraDebug::positionCamera(float dt, float above_kart, float cam_angle,
|
||||
Vec3 relative_position(side_way,
|
||||
fabsf(distance)*tan_up+above_kart,
|
||||
distance);
|
||||
btTransform t=m_kart->getTrans();
|
||||
btTransform t=m_kart->getSmoothedTrans();
|
||||
if(stk_config->m_camera_follow_skid &&
|
||||
m_kart->getSkidding()->getVisualSkidRotation()!=0)
|
||||
{
|
||||
@@ -196,7 +196,7 @@ void CameraDebug::positionCamera(float dt, float above_kart, float cam_angle,
|
||||
if (kart && !kart->isFlying())
|
||||
{
|
||||
// Rotate the up vector (0,1,0) by the rotation ... which is just column 1
|
||||
Vec3 up = m_kart->getTrans().getBasis().getColumn(1);
|
||||
Vec3 up = m_kart->getSmoothedTrans().getBasis().getColumn(1);
|
||||
float f = 0.04f; // weight for new up vector to reduce shaking
|
||||
m_camera->setUpVector( f * up.toIrrVector() +
|
||||
(1.0f - f) * m_camera->getUpVector());
|
||||
|
||||
@@ -87,7 +87,7 @@ void CameraEnd::update(float dt)
|
||||
// First test if the kart is close enough to the next end camera, and
|
||||
// if so activate it.
|
||||
if( m_end_cameras.size()>0 &&
|
||||
m_end_cameras[m_next_end_camera].isReached(m_kart->getXYZ()))
|
||||
m_end_cameras[m_next_end_camera].isReached(m_kart->getSmoothedXYZ()))
|
||||
{
|
||||
m_current_end_camera = m_next_end_camera;
|
||||
if(m_end_cameras[m_current_end_camera].m_type
|
||||
@@ -116,7 +116,7 @@ void CameraEnd::update(float dt)
|
||||
// after changing the relative position in order to get the right
|
||||
// position here).
|
||||
const core::vector3df &cp = m_camera->getPosition();
|
||||
const Vec3 &kp = m_kart->getXYZ();
|
||||
const Vec3 &kp = m_kart->getSmoothedXYZ();
|
||||
// Estimate the fov, assuming that the vector from the camera to
|
||||
// the kart and the kart length are orthogonal to each other
|
||||
// --> tan (fov) = kart_length / camera_kart_distance
|
||||
@@ -125,7 +125,7 @@ void CameraEnd::update(float dt)
|
||||
float fov = 6*atan2(m_kart->getKartLength(),
|
||||
(cp-kp.toIrrVector()).getLength());
|
||||
m_camera->setFOV(fov);
|
||||
m_camera->setTarget(m_kart->getXYZ().toIrrVector());
|
||||
m_camera->setTarget(m_kart->getSmoothedXYZ().toIrrVector());
|
||||
break;
|
||||
}
|
||||
case EndCameraInformation::EC_AHEAD_OF_KART:
|
||||
|
||||
@@ -224,7 +224,7 @@ void CameraFPS::update(float dt)
|
||||
m_local_up = up;
|
||||
|
||||
// Move the camera with the kart
|
||||
btTransform t = m_kart->getTrans();
|
||||
btTransform t = m_kart->getSmoothedTrans();
|
||||
if (stk_config->m_camera_follow_skid &&
|
||||
m_kart->getSkidding()->getVisualSkidRotation() != 0)
|
||||
{
|
||||
|
||||
@@ -53,13 +53,13 @@ CameraNormal::CameraNormal(Camera::CameraType type, int camera_index,
|
||||
m_rotation_range = 0.4f;
|
||||
m_rotation_range = 0.0f;
|
||||
m_kart_position = btVector3(0, 0, 0);
|
||||
m_kart_rotation = btQuaternion(0, 0, 0, 0);
|
||||
m_kart_rotation = btQuaternion(0, 0, 0, 1);
|
||||
reset();
|
||||
m_camera->setNearValue(1.0f);
|
||||
|
||||
if (kart)
|
||||
{
|
||||
btTransform btt = kart->getTrans();
|
||||
btTransform btt = kart->getSmoothedTrans();
|
||||
m_kart_position = btt.getOrigin();
|
||||
m_kart_rotation = btt.getRotation();
|
||||
}
|
||||
@@ -74,24 +74,23 @@ CameraNormal::CameraNormal(Camera::CameraType type, int camera_index,
|
||||
void CameraNormal::moveCamera(float dt, bool smooth)
|
||||
{
|
||||
if(!m_kart) return;
|
||||
|
||||
|
||||
Kart *kart = dynamic_cast<Kart*>(m_kart);
|
||||
if (kart->isFlying())
|
||||
{
|
||||
Vec3 vec3 = m_kart->getXYZ() + Vec3(sin(m_kart->getHeading()) * -4.0f,
|
||||
Vec3 vec3 = m_kart->getSmoothedXYZ() + Vec3(sin(m_kart->getHeading()) * -4.0f,
|
||||
0.5f,
|
||||
cos(m_kart->getHeading()) * -4.0f);
|
||||
m_camera->setTarget(m_kart->getXYZ().toIrrVector());
|
||||
m_camera->setTarget(m_kart->getSmoothedXYZ().toIrrVector());
|
||||
m_camera->setPosition(vec3.toIrrVector());
|
||||
return;
|
||||
} // kart is flying
|
||||
|
||||
|
||||
core::vector3df current_position = m_camera->getPosition();
|
||||
// Smoothly interpolate towards the position and target
|
||||
const KartProperties *kp = m_kart->getKartProperties();
|
||||
float max_speed_without_zipper = kp->getEngineMaxSpeed();
|
||||
float current_speed = m_kart->getSmoothedSpeed();
|
||||
float current_speed = m_kart->getSpeed();
|
||||
|
||||
const Skidding *ks = m_kart->getSkidding();
|
||||
float skid_factor = ks->getVisualSkidRotation();
|
||||
@@ -110,18 +109,16 @@ void CameraNormal::moveCamera(float dt, bool smooth)
|
||||
(0.85f + ratio / 2.5f),
|
||||
camera_distance * cos(skid_angle / 2));
|
||||
|
||||
|
||||
//m_smooth_dt = 0.3f * dt + 0.7f * m_smooth_dt;
|
||||
float delta = 1;
|
||||
float delta2 = 1;
|
||||
if (smooth)
|
||||
{
|
||||
{
|
||||
delta = (dt*5.0f);
|
||||
if (delta < 0.0f)
|
||||
delta = 0.0f;
|
||||
else if (delta > 1.0f)
|
||||
delta = 1.0f;
|
||||
|
||||
|
||||
delta2 = dt * 8.0f;
|
||||
if (delta2 < 0)
|
||||
delta2 = 0;
|
||||
@@ -130,7 +127,7 @@ void CameraNormal::moveCamera(float dt, bool smooth)
|
||||
}
|
||||
m_camera_offset += (wanted_camera_offset - m_camera_offset) * delta;
|
||||
|
||||
btTransform btt = m_kart->getTrans();
|
||||
btTransform btt = m_kart->getSmoothedTrans();
|
||||
m_kart_position = btt.getOrigin();
|
||||
btQuaternion q1, q2;
|
||||
q1 = m_kart_rotation.normalized();
|
||||
@@ -141,19 +138,18 @@ void CameraNormal::moveCamera(float dt, bool smooth)
|
||||
m_kart_rotation = q1.slerp(q2, delta2);
|
||||
|
||||
btt.setOrigin(m_kart_position);
|
||||
btt.setRotation(m_kart_rotation);
|
||||
btt.setRotation(q1);
|
||||
|
||||
Vec3 m_kart_camera_position_with_offset = btt(m_camera_offset);
|
||||
Vec3 kart_camera_position_with_offset = btt(m_camera_offset);
|
||||
// next target
|
||||
Vec3 current_target = btt(Vec3(0, 0.5f, 0));
|
||||
// new required position of camera
|
||||
current_position = m_kart_camera_position_with_offset.toIrrVector();
|
||||
|
||||
current_position = kart_camera_position_with_offset.toIrrVector();
|
||||
|
||||
//Log::info("CAM_DEBUG", "OFFSET: %f %f %f TRANSFORMED %f %f %f TARGET %f %f %f",
|
||||
// wanted_camera_offset.x(), wanted_camera_offset.y(), wanted_camera_offset.z(),
|
||||
// m_kart_camera_position_with_offset.x(), m_kart_camera_position_with_offset.y(),
|
||||
// m_kart_camera_position_with_offset.z(), current_target.x(), current_target.y(),
|
||||
// kart_camera_position_with_offset.x(), kart_camera_position_with_offset.y(),
|
||||
// kart_camera_position_with_offset.z(), current_target.x(), current_target.y(),
|
||||
// current_target.z());
|
||||
|
||||
if(getMode()!=CM_FALLING)
|
||||
@@ -164,11 +160,14 @@ void CameraNormal::moveCamera(float dt, bool smooth)
|
||||
assert(!std::isnan(m_camera->getPosition().Y));
|
||||
assert(!std::isnan(m_camera->getPosition().Z));
|
||||
|
||||
} // MoveCamera
|
||||
} // moveCamera
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void CameraNormal::snapToPosition()
|
||||
{
|
||||
moveCamera(1, false);
|
||||
}
|
||||
moveCamera(1.0f, false);
|
||||
} // snapToPosition
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/** Determine the camera settings for the current frame.
|
||||
* \param above_kart How far above the camera should aim at.
|
||||
@@ -261,7 +260,7 @@ void CameraNormal::update(float dt)
|
||||
// above the kart).
|
||||
// Note: this code is replicated from smoothMoveCamera so that
|
||||
// the camera keeps on pointing to the same spot.
|
||||
core::vector3df current_target = (m_kart->getXYZ().toIrrVector()
|
||||
core::vector3df current_target = (m_kart->getSmoothedXYZ().toIrrVector()
|
||||
+ core::vector3df(0, above_kart, 0));
|
||||
m_camera->setTarget(current_target);
|
||||
}
|
||||
@@ -286,13 +285,13 @@ void CameraNormal::positionCamera(float dt, float above_kart, float cam_angle,
|
||||
float side_way, float distance, float smoothing)
|
||||
{
|
||||
Vec3 wanted_position;
|
||||
Vec3 wanted_target = m_kart->getTrans()(Vec3(0, above_kart, 0));
|
||||
Vec3 wanted_target = m_kart->getSmoothedTrans()(Vec3(0, above_kart, 0));
|
||||
|
||||
float tan_up = tan(cam_angle);
|
||||
Vec3 relative_position(side_way,
|
||||
fabsf(distance)*tan_up+above_kart,
|
||||
distance);
|
||||
btTransform t=m_kart->getTrans();
|
||||
btTransform t=m_kart->getSmoothedTrans();
|
||||
if(stk_config->m_camera_follow_skid &&
|
||||
m_kart->getSkidding()->getVisualSkidRotation()!=0)
|
||||
{
|
||||
@@ -325,7 +324,7 @@ void CameraNormal::positionCamera(float dt, float above_kart, float cam_angle,
|
||||
if (kart && !kart->isFlying())
|
||||
{
|
||||
// Rotate the up vector (0,1,0) by the rotation ... which is just column 1
|
||||
Vec3 up = m_kart->getTrans().getBasis().getColumn(1);
|
||||
Vec3 up = m_kart->getSmoothedTrans().getBasis().getColumn(1);
|
||||
float f = 0.04f; // weight for new up vector to reduce shaking
|
||||
m_camera->setUpVector( f * up.toIrrVector() +
|
||||
(1.0f - f) * m_camera->getUpVector());
|
||||
|
||||
@@ -989,6 +989,11 @@ void World::updateGraphics(float dt)
|
||||
}
|
||||
}
|
||||
|
||||
PROFILER_PUSH_CPU_MARKER("World::updateGraphics (camera)", 0x60, 0x7F, 0);
|
||||
for (unsigned int i = 0; i < Camera::getNumCameras(); i++)
|
||||
Camera::getCamera(i)->update(dt);
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
|
||||
projectile_manager->updateGraphics(dt);
|
||||
Track::getCurrentTrack()->updateGraphics(dt);
|
||||
} // updateGraphics
|
||||
@@ -1038,18 +1043,6 @@ void World::update(int ticks)
|
||||
}
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
|
||||
// Updating during a rewind introduces stuttering in the camera
|
||||
if (!RewindManager::get()->isRewinding())
|
||||
{
|
||||
PROFILER_PUSH_CPU_MARKER("World::update (camera)", 0x60, 0x7F, 0x00);
|
||||
|
||||
for (unsigned int i = 0; i < Camera::getNumCameras(); i++)
|
||||
{
|
||||
Camera::getCamera(i)->update(stk_config->ticks2Time(ticks));
|
||||
}
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
} // if !rewind
|
||||
|
||||
if(race_manager->isRecordingRace()) ReplayRecorder::get()->update(ticks);
|
||||
Scripting::ScriptEngine *script_engine = Scripting::ScriptEngine::getInstance();
|
||||
if (script_engine) script_engine->update(ticks);
|
||||
|
||||
Reference in New Issue
Block a user