By now, we have defined only the clWanderBehaviour
class. To implement flocking algorithms, we need to store information about all the boids at once. Such a collection is called a Swarm here. The clSwarm
class holds a vector of clBoid
objects and implements a number of routines used in boid control calculations:
class clSwarm: public iIntrusiveCounter { public: std::vector< clPtr<clBoid> > m_Boids; clSwarm() {}
For debugging and visual demonstration purposes, the GenerateRandom()
method allocates a number of clBoid
objects with random positions and zero velocities:
void GenerateRandom( size_t N ) { m_Boids.reserve( N ); for ( size_t i = 0; i != N; i++ ) { m_Boids.emplace_back( make_intrusive<clBoid>() );
By default, each boid has a Wandering behavior:
m_Boids.back()->m_Behaviour = make_intrusive<clWanderBehaviour>(); m_Boids.back()->m_Swarm = this;
Positions are random and are also kept within the -1..+1 range...