Esempio n. 1
0
/** 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
Esempio n. 3
0
/** 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
Esempio n. 5
0
// ----------------------------------------------------------------------------
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
Esempio n. 6
0
// ----------------------------------------------------------------------------
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