bool AgeFadeParticleAffector::affect(ParticleSystemRefPtr System, Int32 ParticleIndex, const Time& elps)
{
    Real32 Alpha(0.0f);
    if(System->getAge(ParticleIndex)<getFadeInTime())
    {
        lerp<Real32>(getStartAlpha(), getFadeToAlpha(),1.0f-((getFadeInTime() - System->getAge(ParticleIndex))/getFadeInTime()), Alpha); 
    }
    else if(System->getLifespan(ParticleIndex) < 0 || (System->getAge(ParticleIndex)< System->getLifespan(ParticleIndex)-getFadeOutTime()))
    {
        Alpha = getFadeToAlpha();
    }
    else
    {
        //lerp
        lerp<Real32>(getFadeToAlpha(), getEndAlpha(), ((System->getAge(ParticleIndex)-System->getLifespan(ParticleIndex)+getFadeOutTime())/(getFadeOutTime())), Alpha);
    }

    Color4f Color = System->getColor(ParticleIndex);
    Color[3] = Alpha;
    System->setColor(Color, ParticleIndex);

    
    return false;
}
bool RandomMovementParticleAffector::affect(ParticleSystemRefPtr System, Int32 ParticleIndex, const Time& elps)
{
    //System->setUpdateSecAttribs(false);
    Real32 x,
           y,
           z,
           age(System->getAge(ParticleIndex));

    if(getAttributeAffected() == VELOCITY_ATTRIBUTE)
    {
        Vec3f vel = System->getSecVelocity(ParticleIndex);
        // grab each value independently , and adjust the phase for each
        // axis, since we have a 3D phase and the 1D distribution only takes
        // one value
        Real32 velSum = vel.x() + vel.y() + vel.z();

        getPerlinDistribution()->setPhase(getPhase().x() + velSum);
        x = getPerlinDistribution()->generate(vel.x() + age);
        getPerlinDistribution()->setPhase(getPhase().y() + velSum);
        y = getPerlinDistribution()->generate(vel.y() + age);
        getPerlinDistribution()->setPhase(getPhase().z() + velSum);
        z = getPerlinDistribution()->generate(vel.z() + age);


        System->setVelocity(Vec3f(x,y,z) + vel,ParticleIndex);

    }else // affecting position	
    {
        Pnt3f pos = System->getSecPosition(ParticleIndex);
        Real32 posSum = pos.x() + pos.y() + pos.z();

        getPerlinDistribution()->setPhase(getPhase().x() + posSum);
        x = getPerlinDistribution()->generate(pos.x() + age);
        getPerlinDistribution()->setPhase(getPhase().y() + posSum);
        y = getPerlinDistribution()->generate(pos.y() + age);
        getPerlinDistribution()->setPhase(getPhase().z() + posSum);
        z = getPerlinDistribution()->generate(pos.z() + age);


        System->setPosition(Pnt3f(x,y,z) + pos.subZero(),ParticleIndex);
    }

    return false;
}
bool AgeSizeParticleAffector::affect(ParticleSystemRefPtr System, Int32 ParticleIndex, const Time& elps)
{
    if(getMFAges()->size()!=getMFSizes()->size())
    {
        return false;
    }
    else
    {
        Real32 time;
        UInt32 i(0);
        Real32 Age(System->getAge(ParticleIndex)),Lifespan(System->getLifespan(ParticleIndex));
        if(Lifespan < 0.0)
        {
            return false;
        }

        time = (Age)/(Lifespan);
        for( ;i<getMFAges()->size() && time>getAges(i);++i)
        {
            
        }

        if(i == getMFSizes()->size())
        {
            System->setSize(getMFSizes()->back(),ParticleIndex);
        }
        else if(i == 0.0)
        {
            System->setSize(getMFSizes()->front(),ParticleIndex);
        }
        else
        {
            Vec3f size;
            time = (time - getAges(i-1))/(getAges(i)-getAges(i-1));

            lerp(getSizes(i-1),getSizes(i),time,size);
            System->setSize(size,ParticleIndex);
        }


    }
    return false;
}