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:
parent
4a0a6723af
commit
681d127ff1
|
@ -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,
|
-- ^ collision_removal: if true then particle is removed when it collides,
|
||||||
-- ^ requires collisiondetection = true to have any effect
|
-- ^ requires collisiondetection = true to have any effect
|
||||||
attached = ObjectRef,
|
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 = false,
|
||||||
-- ^ vertical: if true faces player using y axis only
|
-- ^ vertical: if true faces player using y axis only
|
||||||
texture = "image.png",
|
texture = "image.png",
|
||||||
|
|
|
@ -61,6 +61,7 @@ public:
|
||||||
virtual bool getCollisionBox(aabb3f *toset){return false;}
|
virtual bool getCollisionBox(aabb3f *toset){return false;}
|
||||||
virtual bool collideWithObjects(){return false;}
|
virtual bool collideWithObjects(){return false;}
|
||||||
virtual v3f getPosition(){return v3f(0,0,0);}
|
virtual v3f getPosition(){return v3f(0,0,0);}
|
||||||
|
virtual float getYaw() const {return 0;}
|
||||||
virtual scene::ISceneNode *getSceneNode(){return NULL;}
|
virtual scene::ISceneNode *getSceneNode(){return NULL;}
|
||||||
virtual scene::IMeshSceneNode *getMeshSceneNode(){return NULL;}
|
virtual scene::IMeshSceneNode *getMeshSceneNode(){return NULL;}
|
||||||
virtual scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(){return NULL;}
|
virtual scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(){return NULL;}
|
||||||
|
|
|
@ -313,7 +313,8 @@ public:
|
||||||
{return &m_selection_box;}
|
{return &m_selection_box;}
|
||||||
v3f getPosition()
|
v3f getPosition()
|
||||||
{return m_position;}
|
{return m_position;}
|
||||||
|
inline float getYaw() const
|
||||||
|
{return 0;}
|
||||||
std::string infoText()
|
std::string infoText()
|
||||||
{return m_infotext;}
|
{return m_infotext;}
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,10 @@ public:
|
||||||
aabb3f *getSelectionBox();
|
aabb3f *getSelectionBox();
|
||||||
|
|
||||||
v3f getPosition();
|
v3f getPosition();
|
||||||
|
inline float getYaw() const
|
||||||
|
{
|
||||||
|
return m_yaw;
|
||||||
|
}
|
||||||
|
|
||||||
scene::ISceneNode *getSceneNode();
|
scene::ISceneNode *getSceneNode();
|
||||||
|
|
||||||
|
|
|
@ -253,13 +253,18 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
|
||||||
m_time += dtime;
|
m_time += dtime;
|
||||||
|
|
||||||
bool unloaded = false;
|
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 (m_attached_id != 0) {
|
||||||
if (ClientActiveObject *attached = env->getActiveObject(m_attached_id))
|
if (ClientActiveObject *attached = env->getActiveObject(m_attached_id)) {
|
||||||
attached_offset = attached->getPosition() / BS;
|
attached_pos = attached->getPosition() / BS;
|
||||||
else
|
attached_yaw = attached->getYaw();
|
||||||
|
is_attached = true;
|
||||||
|
} else {
|
||||||
unloaded = true;
|
unloaded = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (m_spawntime != 0) // Spawner exists for a predefined timespan
|
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 pos = random_v3f(m_minpos, m_maxpos);
|
||||||
v3f vel = random_v3f(m_minvel, m_maxvel);
|
v3f vel = random_v3f(m_minvel, m_maxvel);
|
||||||
v3f acc = random_v3f(m_minacc, m_maxacc);
|
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
|
float exptime = rand()/(float)RAND_MAX
|
||||||
*(m_maxexptime-m_minexptime)
|
*(m_maxexptime-m_minexptime)
|
||||||
+m_minexptime;
|
+m_minexptime;
|
||||||
|
@ -321,10 +333,18 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
|
||||||
{
|
{
|
||||||
if (rand()/(float)RAND_MAX < dtime)
|
if (rand()/(float)RAND_MAX < dtime)
|
||||||
{
|
{
|
||||||
v3f pos = random_v3f(m_minpos, m_maxpos)
|
v3f pos = random_v3f(m_minpos, m_maxpos);
|
||||||
+ attached_offset;
|
|
||||||
v3f vel = random_v3f(m_minvel, m_maxvel);
|
v3f vel = random_v3f(m_minvel, m_maxvel);
|
||||||
v3f acc = random_v3f(m_minacc, m_maxacc);
|
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
|
float exptime = rand()/(float)RAND_MAX
|
||||||
*(m_maxexptime-m_minexptime)
|
*(m_maxexptime-m_minexptime)
|
||||||
+m_minexptime;
|
+m_minexptime;
|
||||||
|
|
Loading…
Reference in New Issue