Simulant  21.12-1292
A portable game engine for Windows, OSX, Linux, Dreamcast, and PSP
alpha_fader.h
1 #pragma once
2 
3 #include "../particle_script.h"
4 #include "../../nodes/particles/particle.h"
5 
6 #include "curves.h"
7 
8 namespace smlt {
9 
10 class AlphaFader:
11  public Manipulator {
12 public:
13  AlphaFader(ParticleScript* script, const std::vector<float>& alphas, bool interpolate):
14  Manipulator(script, "alpha_fader"),
15  alphas_(alphas),
16  interpolate_(interpolate) {}
17 
18 private:
19  void do_manipulate(ParticleSystem*, Particle* particles, std::size_t particle_count, float) const {
20  auto size = (float) alphas_.size();
21  float fsize = float(size);
22  Particle* particle = particles;
23  for(auto i = 0u; i < particle_count; ++i, ++particle) {
24  const float e = (particle->lifetime - particle->ttl);
25  const float n = smlt::fast_divide(e, particle->lifetime);
26  const float fsizen = fsize * n;
27 
28  uint8_t color = smlt::clamp(fsizen, 0.0f, fsize);
29 
30  particle->color.a = alphas_[color];
31 
32  if(interpolate_) {
33  const float f = fsizen - std::floor(fsizen);
34  auto next_alpha = alphas_[std::min((uint32_t) color + 1, (uint32_t) size - 1)];
35  particle->color.a = (particle->color.a * (1.0f - f)) + (next_alpha * f);
36  }
37  }
38  }
39 
40  std::vector<float> alphas_;
41  bool interpolate_ = true;
42 };
43 
44 }
smlt::Manipulator
Definition: particle_script.h:38
smlt
Definition: animation.cpp:25
smlt::ParticleSystem
Definition: particle_system.h:30
smlt::Particle
Definition: particle.h:9
smlt::ParticleScript
Definition: particle_script.h:71
smlt::AlphaFader
Definition: alpha_fader.h:11