/** Updates nitro dependent particle effects. * \param nitro_frac Nitro fraction/ */ void KartGFX::updateNitroGraphics(float nitro_frac) { #ifndef SERVER_ONLY // Upate particle effects (creation rate, and emitter size // depending on speed) // -------------------------------------------------------- if (nitro_frac > 0) { setCreationRateRelative(KartGFX::KGFX_NITRO1, nitro_frac); setCreationRateRelative(KartGFX::KGFX_NITRO2, nitro_frac); setCreationRateRelative(KartGFX::KGFX_NITROSMOKE1, nitro_frac); setCreationRateRelative(KartGFX::KGFX_NITROSMOKE2, nitro_frac); if (CVS->isGLSL()) m_nitro_light->setVisible(true); } else { setCreationRateAbsolute(KartGFX::KGFX_NITRO1, 0); setCreationRateAbsolute(KartGFX::KGFX_NITRO2, 0); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE1, 0); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE2, 0); if (CVS->isGLSL()) m_nitro_light->setVisible(false); } // Exhaust is always emitting setCreationRateRelative(KartGFX::KGFX_EXHAUST1, 1.0); setCreationRateRelative(KartGFX::KGFX_EXHAUST2, 1.0); #endif } // updateGraphics
/** Sets the creation rate as a relative fraction between minimum (f=0) and * maximum (f=1) of the creation rates defined in the particle kind. * \param fraction Fraction to use. */ void ParticleEmitter::setCreationRateRelative(float fraction) { assert(fraction >= 0.0f); assert(fraction <= 1.0f); const float min_rate = (float)(m_particle_type->getMinRate()); const float max_rate = (float)(m_particle_type->getMaxRate()); setCreationRateAbsolute(min_rate + fraction*(max_rate - min_rate)); } // setCreationRateRelative
/** Updates nitro dependent particle effects. * \param nitro_frac Nitro fraction/ */ void KartGFX::updateNitroGraphics(float nitro_frac) { // Upate particle effects (creation rate, and emitter size // depending on speed) // -------------------------------------------------------- if (nitro_frac > 0) { setCreationRateRelative(KartGFX::KGFX_NITRO1, nitro_frac); setCreationRateRelative(KartGFX::KGFX_NITRO2, nitro_frac); setCreationRateRelative(KartGFX::KGFX_NITROSMOKE1, nitro_frac); setCreationRateRelative(KartGFX::KGFX_NITROSMOKE2, nitro_frac); m_nitro_light->setVisible(true); } else { setCreationRateAbsolute(KartGFX::KGFX_NITRO1, 0); setCreationRateAbsolute(KartGFX::KGFX_NITRO2, 0); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE1, 0); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE2, 0); m_nitro_light->setVisible(false); } } // updateGraphics
void ParticleEmitter::update(float dt) { assert(m_magic_number == 0x58781325); // No particles to emit, nothing to do if (m_emitter->getMinParticlesPerSecond() == 0) return; // the emission direction does not automatically follow the orientation of // the node so fix that manually... core::matrix4 transform = m_node->getAbsoluteTransformation(); core::vector3df velocity(m_particle_type->getVelocityX(), m_particle_type->getVelocityY(), m_particle_type->getVelocityZ()); transform.rotateVect(velocity); m_emitter->setDirection(velocity); if (m_emission_decay_rate > 0) { m_max_rate = m_min_rate = std::max(0.0f, (m_min_rate - m_emission_decay_rate*dt)); setCreationRateAbsolute(m_min_rate); } // There seems to be no way to randomise the velocity for particles, // so we have to do this manually, by changing the default velocity. // Irrlicht expects velocity (called 'direction') in m/ms!! /* const int x = m_particle_type->getAngleSpreadX(); const int y = m_particle_type->getAngleSpreadY(); const int z = m_particle_type->getAngleSpreadZ(); Vec3 dir(cos(DEGREE_TO_RAD*(rand()%x - x/2))*m_particle_type->getVelocityX(), sin(DEGREE_TO_RAD*(rand()%y - x/2))*m_particle_type->getVelocityY(), sin(DEGREE_TO_RAD*(rand()%z - x/2))*m_particle_type->getVelocityZ()); m_emitter->setDirection(dir.toIrrVector()); */ } // update
// ---------------------------------------------------------------------------- void KartGFX::setGFXFromReplay(int nitro, bool zipper, int skidding, bool red_skidding) { #ifndef SERVER_ONLY if (nitro > 0) { setCreationRateAbsolute(KartGFX::KGFX_NITRO1, (float)nitro); setCreationRateAbsolute(KartGFX::KGFX_NITRO2, (float)nitro); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE1, (float)nitro); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE2, (float)nitro); if (CVS->isGLSL()) m_nitro_light->setVisible(true); } else { setCreationRateAbsolute(KartGFX::KGFX_NITRO1, 0.0f); setCreationRateAbsolute(KartGFX::KGFX_NITRO2, 0.0f); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE1, 0.0f); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE2, 0.0f); if (CVS->isGLSL()) m_nitro_light->setVisible(false); } if (zipper) setCreationRateAbsolute(KartGFX::KGFX_ZIPPER, 800.0f); if (skidding > 0) { const ParticleKind* skid_kind = red_skidding ? m_skid_kind2 : m_skid_kind1; if (m_all_emitters[KGFX_SKID1L]) m_all_emitters[KGFX_SKID1L]->setParticleType(skid_kind); if (m_all_emitters[KGFX_SKID1R]) m_all_emitters[KGFX_SKID1R]->setParticleType(skid_kind); if (CVS->isGLSL()) { m_skidding_light_1->setVisible(!red_skidding); m_skidding_light_2->setVisible(red_skidding); } setCreationRateAbsolute(KartGFX::KGFX_SKIDL, (float)skidding); setCreationRateAbsolute(KartGFX::KGFX_SKIDR, (float)skidding); } else { setCreationRateAbsolute(KartGFX::KGFX_SKIDL, 0.0f); setCreationRateAbsolute(KartGFX::KGFX_SKIDR, 0.0f); if (CVS->isGLSL()) { m_skidding_light_1->setVisible(false); m_skidding_light_2->setVisible(false); } } #endif } // setGFXFromReplay
// ---------------------------------------------------------------------------- void KartGFX::setGFXFromReplay(int nitro, bool zipper, int skidding, bool red_skidding) { if (nitro > 0) { setCreationRateAbsolute(KartGFX::KGFX_NITRO1, (float)nitro); setCreationRateAbsolute(KartGFX::KGFX_NITRO2, (float)nitro); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE1, (float)nitro); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE2, (float)nitro); m_nitro_light->setVisible(true); } else if (m_nitro_light->isVisible() && nitro == 0) { setCreationRateAbsolute(KartGFX::KGFX_NITRO1, 0.0f); setCreationRateAbsolute(KartGFX::KGFX_NITRO2, 0.0f); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE1, 0.0f); setCreationRateAbsolute(KartGFX::KGFX_NITROSMOKE2, 0.0f); m_nitro_light->setVisible(false); } if (zipper) setCreationRateAbsolute(KartGFX::KGFX_ZIPPER, 800.0f); if (skidding > 0) { if (!m_skidding_light_1->isVisible() && !red_skidding) { if (m_all_emitters[KGFX_SKID1L]) m_all_emitters[KGFX_SKID1L]->setParticleType(m_skid_kind1); if (m_all_emitters[KGFX_SKID1R]) m_all_emitters[KGFX_SKID1R]->setParticleType(m_skid_kind1); m_skidding_light_1->setVisible(true); m_skidding_light_2->setVisible(false); } if (!m_skidding_light_2->isVisible() && red_skidding) { if (m_all_emitters[KGFX_SKID1L]) m_all_emitters[KGFX_SKID1L]->setParticleType(m_skid_kind2); if (m_all_emitters[KGFX_SKID1R]) m_all_emitters[KGFX_SKID1R]->setParticleType(m_skid_kind2); m_skidding_light_1->setVisible(false); m_skidding_light_2->setVisible(true); } setCreationRateAbsolute(KartGFX::KGFX_SKIDL, (float)skidding); setCreationRateAbsolute(KartGFX::KGFX_SKIDR, (float)skidding); } else if ((m_skidding_light_1->isVisible() || m_skidding_light_2->isVisible()) && skidding == 0) { setCreationRateAbsolute(KartGFX::KGFX_SKIDL, 0.0f); setCreationRateAbsolute(KartGFX::KGFX_SKIDR, 0.0f); m_skidding_light_1->setVisible(false); m_skidding_light_2->setVisible(false); } } // setGFXFromReplay