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; }