Skip to content

Commit

Permalink
Particles: Make attached particle spawners respect the parent's yaw
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
orwell96 authored and paramat committed Nov 18, 2016
1 parent 4a0a672 commit 681d127
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 10 deletions.
3 changes: 2 additions & 1 deletion doc/lua_api.txt
Expand Up @@ -4152,7 +4152,8 @@ The Biome API is still in an experimental phase and subject to change.
-- ^ collision_removal: if true then particle is removed when it collides,
-- ^ requires collisiondetection = true to have any effect
attached = ObjectRef,
-- ^ attached: if defined, makes particle positions relative to this object.
-- ^ attached: if defined, particle positions, velocities and accelerations
-- ^ are relative to this object's position and yaw.
vertical = false,
-- ^ vertical: if true faces player using y axis only
texture = "image.png",
Expand Down
1 change: 1 addition & 0 deletions src/clientobject.h
Expand Up @@ -61,6 +61,7 @@ class ClientActiveObject : public ActiveObject
virtual bool getCollisionBox(aabb3f *toset){return false;}
virtual bool collideWithObjects(){return false;}
virtual v3f getPosition(){return v3f(0,0,0);}
virtual float getYaw() const {return 0;}
virtual scene::ISceneNode *getSceneNode(){return NULL;}
virtual scene::IMeshSceneNode *getMeshSceneNode(){return NULL;}
virtual scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(){return NULL;}
Expand Down
3 changes: 2 additions & 1 deletion src/content_cao.cpp
Expand Up @@ -313,7 +313,8 @@ class ItemCAO : public ClientActiveObject
{return &m_selection_box;}
v3f getPosition()
{return m_position;}

inline float getYaw() const
{return 0;}
std::string infoText()
{return m_infotext;}

Expand Down
4 changes: 4 additions & 0 deletions src/content_cao.h
Expand Up @@ -136,6 +136,10 @@ class GenericCAO : public ClientActiveObject
aabb3f *getSelectionBox();

v3f getPosition();
inline float getYaw() const
{
return m_yaw;
}

scene::ISceneNode *getSceneNode();

Expand Down
36 changes: 28 additions & 8 deletions src/particles.cpp
Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 681d127

Please sign in to comment.