diff --git a/src/karts/controller/local_player_controller.cpp b/src/karts/controller/local_player_controller.cpp index 28c73d55e..246578928 100644 --- a/src/karts/controller/local_player_controller.cpp +++ b/src/karts/controller/local_player_controller.cpp @@ -54,6 +54,8 @@ #include "input/gamepad_device.hpp" #include "input/sdl_controller.hpp" +#include "LinearMath/btTransform.h" + /** The constructor for a loca player kart, i.e. a player that is playing * on this machine (non-local player would be network clients). * \param kart_name Name of the kart. @@ -263,25 +265,23 @@ void LocalPlayerController::update(int ticks) { if (m_controls->getLookBack() || (UserConfigParams::m_reverse_look_threshold > 0 && m_kart->getSpeed() < -UserConfigParams::m_reverse_look_threshold)) - { camera->setMode(Camera::CM_REVERSE); - if (m_sky_particles_emitter) - { - m_sky_particles_emitter->setPosition(Vec3(0, 30, -100)); - m_sky_particles_emitter->setRotation(Vec3(0, 180, 0)); - } - } else { if (camera->getMode() == Camera::CM_REVERSE) - { camera->setMode(Camera::CM_NORMAL); - if (m_sky_particles_emitter) - { - m_sky_particles_emitter->setPosition(Vec3(0, 30, 100)); - m_sky_particles_emitter->setRotation(Vec3(0, 0, 0)); - } + } + if (m_sky_particles_emitter) + { + // Need to set it every frame to account for heading changes + btTransform local_trans(btQuaternion(Vec3(0, 1, 0), 0), + Vec3(0, 30, 100)); + if (camera->getMode() == Camera::CM_REVERSE) + { + local_trans = btTransform (btQuaternion(Vec3(0, 1, 0), + 180.0 * DEGREE_TO_RAD), Vec3(0, 30, -100)); } + setParticleEmitterPosition(local_trans); } } @@ -300,6 +300,22 @@ void LocalPlayerController::update(int ticks) } } // update +//----------------------------------------------------------------------------- +void LocalPlayerController::setParticleEmitterPosition(const btTransform& t) +{ +#ifndef SERVER_ONLY + btTransform world_trans(btQuaternion(Vec3(0, 1, 0), m_kart->getHeading()), + m_kart->getXYZ()); + world_trans *= t; + btTransform inv_kart = m_kart->getTrans().inverse(); + inv_kart *= world_trans; + m_sky_particles_emitter->setPosition(Vec3(inv_kart.getOrigin())); + Vec3 rotation; + rotation.setHPR(inv_kart.getRotation()); + m_sky_particles_emitter->setRotation(rotation.toIrrHPR()); +#endif +} // setParticleEmitterPosition + //----------------------------------------------------------------------------- /** Displays a penalty warning for player controlled karts. Called from * LocalPlayerKart::update() if necessary. diff --git a/src/karts/controller/local_player_controller.hpp b/src/karts/controller/local_player_controller.hpp index cb80c8407..64945760e 100644 --- a/src/karts/controller/local_player_controller.hpp +++ b/src/karts/controller/local_player_controller.hpp @@ -28,6 +28,7 @@ class AbstractKart; class ParticleEmitter; class SFXBase; class SFXBuffer; +class btTransform; /** PlayerKart manages control events from the player and moves * them to the Kart @@ -68,6 +69,7 @@ private: void nitroNotFullSound(); void doCrashHaptics(); + void setParticleEmitterPosition(const btTransform& t); public: LocalPlayerController(AbstractKart *kart,