Make sure sky particles always fall vertically

This commit is contained in:
Benau 2022-10-15 14:31:07 +08:00
parent 1fc460ff4e
commit cfb10dbb1f
2 changed files with 31 additions and 13 deletions

View File

@ -54,6 +54,8 @@
#include "input/gamepad_device.hpp" #include "input/gamepad_device.hpp"
#include "input/sdl_controller.hpp" #include "input/sdl_controller.hpp"
#include "LinearMath/btTransform.h"
/** The constructor for a loca player kart, i.e. a player that is playing /** The constructor for a loca player kart, i.e. a player that is playing
* on this machine (non-local player would be network clients). * on this machine (non-local player would be network clients).
* \param kart_name Name of the kart. * \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 && if (m_controls->getLookBack() || (UserConfigParams::m_reverse_look_threshold > 0 &&
m_kart->getSpeed() < -UserConfigParams::m_reverse_look_threshold)) m_kart->getSpeed() < -UserConfigParams::m_reverse_look_threshold))
{
camera->setMode(Camera::CM_REVERSE); 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 else
{ {
if (camera->getMode() == Camera::CM_REVERSE) if (camera->getMode() == Camera::CM_REVERSE)
{
camera->setMode(Camera::CM_NORMAL); camera->setMode(Camera::CM_NORMAL);
if (m_sky_particles_emitter) }
{ if (m_sky_particles_emitter)
m_sky_particles_emitter->setPosition(Vec3(0, 30, 100)); {
m_sky_particles_emitter->setRotation(Vec3(0, 0, 0)); // 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 } // 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 /** Displays a penalty warning for player controlled karts. Called from
* LocalPlayerKart::update() if necessary. * LocalPlayerKart::update() if necessary.

View File

@ -28,6 +28,7 @@ class AbstractKart;
class ParticleEmitter; class ParticleEmitter;
class SFXBase; class SFXBase;
class SFXBuffer; class SFXBuffer;
class btTransform;
/** PlayerKart manages control events from the player and moves /** PlayerKart manages control events from the player and moves
* them to the Kart * them to the Kart
@ -68,6 +69,7 @@ private:
void nitroNotFullSound(); void nitroNotFullSound();
void doCrashHaptics(); void doCrashHaptics();
void setParticleEmitterPosition(const btTransform& t);
public: public:
LocalPlayerController(AbstractKart *kart, LocalPlayerController(AbstractKart *kart,