void ParticleSpawner::spawnParticle(ClientEnvironment *env, float radius, bool is_attached, const v3f &attached_pos, float attached_yaw) { v3f ppos = m_player->getPosition() / BS; v3f pos = random_v3f(m_minpos, m_maxpos); // Need to apply this first or the following check // will be wrong for attached spawners if (is_attached) { pos.rotateXZBy(attached_yaw); pos += attached_pos; } if (pos.getDistanceFrom(ppos) > radius) return; v3f vel = random_v3f(m_minvel, m_maxvel); v3f acc = random_v3f(m_minacc, m_maxacc); if (is_attached) { // Apply attachment yaw vel.rotateXZBy(attached_yaw); acc.rotateXZBy(attached_yaw); } float exptime = rand() / (float)RAND_MAX * (m_maxexptime - m_minexptime) + m_minexptime; float size = rand() / (float)RAND_MAX * (m_maxsize - m_minsize) + m_minsize; m_particlemanager->addParticle(new Particle( m_gamedef, m_player, env, pos, vel, acc, exptime, size, m_collisiondetection, m_collision_removal, m_object_collision, m_vertical, m_texture, v2f(0.0, 0.0), v2f(1.0, 1.0), m_animation, m_glow )); }
void ParticleSpawner::step(float dtime, ClientEnvironment* env) { m_time += dtime; bool unloaded = false; 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_pos = attached->getPosition() / BS; attached_yaw = attached->getYaw(); is_attached = true; } else { unloaded = true; } } if (m_spawntime != 0) // Spawner exists for a predefined timespan { for(std::vector<float>::iterator i = m_spawntimes.begin(); i != m_spawntimes.end();) { if ((*i) <= m_time && m_amount > 0) { m_amount--; // Pretend to, but don't actually spawn a // particle if it is attached to an unloaded // object. if (!unloaded) { 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; float size = rand()/(float)RAND_MAX *(m_maxsize-m_minsize) +m_minsize; Particle* toadd = new Particle( m_gamedef, m_smgr, m_player, env, pos, vel, acc, exptime, size, m_collisiondetection, m_collision_removal, m_vertical, m_texture, v2f(0.0, 0.0), v2f(1.0, 1.0), m_animation, m_glow); m_particlemanager->addParticle(toadd); } i = m_spawntimes.erase(i); } else { ++i; } } } else // Spawner exists for an infinity timespan, spawn on a per-second base { // Skip this step if attached to an unloaded object if (unloaded) return; for (int i = 0; i <= m_amount; i++) { if (rand()/(float)RAND_MAX < dtime) { 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; float size = rand()/(float)RAND_MAX *(m_maxsize-m_minsize) +m_minsize; Particle* toadd = new Particle( m_gamedef, m_smgr, m_player, env, pos, vel, acc, exptime, size, m_collisiondetection, m_collision_removal, m_vertical, m_texture, v2f(0.0, 0.0), v2f(1.0, 1.0), m_animation, m_glow); m_particlemanager->addParticle(toadd); } } } }
void ParticleSpawner::step(float dtime, ClientEnvironment* env) { m_time += dtime; if (m_spawntime != 0) // Spawner exists for a predefined timespan { for(std::vector<float>::iterator i = m_spawntimes.begin(); i != m_spawntimes.end();) { if ((*i) <= m_time && m_amount > 0) { m_amount--; v3f pos = random_v3f(m_minpos, m_maxpos); v3f vel = random_v3f(m_minvel, m_maxvel); v3f acc = random_v3f(m_minacc, m_maxacc); float exptime = rand()/(float)RAND_MAX *(m_maxexptime-m_minexptime) +m_minexptime; float size = rand()/(float)RAND_MAX *(m_maxsize-m_minsize) +m_minsize; Particle* toadd = new Particle( m_gamedef, m_smgr, m_player, env, pos, vel, acc, exptime, size, m_collisiondetection, m_vertical, m_texture, v2f(0.0, 0.0), v2f(1.0, 1.0)); m_particlemanager->addParticle(toadd); i = m_spawntimes.erase(i); } else { ++i; } } } else // Spawner exists for an infinity timespan, spawn on a per-second base { for (int i = 0; i <= m_amount; i++) { if (rand()/(float)RAND_MAX < dtime) { v3f pos = random_v3f(m_minpos, m_maxpos); v3f vel = random_v3f(m_minvel, m_maxvel); v3f acc = random_v3f(m_minacc, m_maxacc); float exptime = rand()/(float)RAND_MAX *(m_maxexptime-m_minexptime) +m_minexptime; float size = rand()/(float)RAND_MAX *(m_maxsize-m_minsize) +m_minsize; Particle* toadd = new Particle( m_gamedef, m_smgr, m_player, env, pos, vel, acc, exptime, size, m_collisiondetection, m_vertical, m_texture, v2f(0.0, 0.0), v2f(1.0, 1.0)); m_particlemanager->addParticle(toadd); } } } }