mirror of
https://github.com/luanti-org/luanti.git
synced 2025-10-13 08:35:20 +02:00
Particles: Make attached particle spawners respect the parent's yaw
Position, velocity and acceleration vectors of particles are rotated by the yaw of the parent object so that they are truly relative to it. Clarify new attached particle spawner behavior in lua_api.txt.
This commit is contained in:
@@ -253,12 +253,17 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
|
||||
m_time += dtime;
|
||||
|
||||
bool unloaded = false;
|
||||
v3f attached_offset = v3f(0,0,0);
|
||||
bool is_attached = false;
|
||||
v3f attached_pos = v3f(0,0,0);
|
||||
float attached_yaw = 0;
|
||||
if (m_attached_id != 0) {
|
||||
if (ClientActiveObject *attached = env->getActiveObject(m_attached_id))
|
||||
attached_offset = attached->getPosition() / BS;
|
||||
else
|
||||
if (ClientActiveObject *attached = env->getActiveObject(m_attached_id)) {
|
||||
attached_pos = attached->getPosition() / BS;
|
||||
attached_yaw = attached->getYaw();
|
||||
is_attached = true;
|
||||
} else {
|
||||
unloaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_spawntime != 0) // Spawner exists for a predefined timespan
|
||||
@@ -277,8 +282,15 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
|
||||
v3f pos = random_v3f(m_minpos, m_maxpos);
|
||||
v3f vel = random_v3f(m_minvel, m_maxvel);
|
||||
v3f acc = random_v3f(m_minacc, m_maxacc);
|
||||
// Make relative to offest
|
||||
pos += attached_offset;
|
||||
|
||||
if (is_attached) {
|
||||
// Apply attachment yaw and position
|
||||
pos.rotateXZBy(attached_yaw);
|
||||
pos += attached_pos;
|
||||
vel.rotateXZBy(attached_yaw);
|
||||
acc.rotateXZBy(attached_yaw);
|
||||
}
|
||||
|
||||
float exptime = rand()/(float)RAND_MAX
|
||||
*(m_maxexptime-m_minexptime)
|
||||
+m_minexptime;
|
||||
@@ -321,10 +333,18 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
|
||||
{
|
||||
if (rand()/(float)RAND_MAX < dtime)
|
||||
{
|
||||
v3f pos = random_v3f(m_minpos, m_maxpos)
|
||||
+ attached_offset;
|
||||
v3f pos = random_v3f(m_minpos, m_maxpos);
|
||||
v3f vel = random_v3f(m_minvel, m_maxvel);
|
||||
v3f acc = random_v3f(m_minacc, m_maxacc);
|
||||
|
||||
if (is_attached) {
|
||||
// Apply attachment yaw and position
|
||||
pos.rotateXZBy(attached_yaw);
|
||||
pos += attached_pos;
|
||||
vel.rotateXZBy(attached_yaw);
|
||||
acc.rotateXZBy(attached_yaw);
|
||||
}
|
||||
|
||||
float exptime = rand()/(float)RAND_MAX
|
||||
*(m_maxexptime-m_minexptime)
|
||||
+m_minexptime;
|
||||
|
Reference in New Issue
Block a user