/**
* Triangles
* Copyright (C) 2016 POSITIVE MENTAL ATTITUDE
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/**
* This is based on a wiki entry
* https://github.com/SFML/SFML/wiki/Source:-Particle-System
*/
#include
#include
#include "Particle.hpp"
ParticleSystem::ParticleSystem(int width, int height):
_origin(0, 0),
_particleSpeed(20.f),
_dissolutionRate(60.f),
_enabled(true)
{
_colors.push_back(sf::Color::White);
_image.create( width, height, sf::Color::Transparent);
_texture.loadFromImage(_image);
_sprite = sf::Sprite(_texture);
}
ParticleSystem::~ParticleSystem()
{
for(auto it = _particles.begin(); it != _particles.end(); it++)
delete *it;
}
void ParticleSystem::fuel(int particles, float angle)
{
if(!_enabled)
return;
if(particles < 0)
particles = -particles;
if(_particles.size() > 40000)
return;
Particle* particle;
for(int i = 0; i < particles; i++)
{
particle = new Particle();
particle->pos.x = _origin.x;
particle->pos.y = _origin.y;
particle->vel.x = float((rand() % 30000 - 15000) / 1000.f);
particle->vel.y = float((rand() % 30000 - 15000) / 1000.f);
particle->color = _colors[rand() % _colors.size()];
particle->transparency = 255.f;
particle->color.a = sf::Uint8(particle->transparency);
_particles.push_back(particle);
}
}
void ParticleSystem::update(sf::Time delta)
{
if(!_enabled)
return;
float time = delta.asSeconds();
for(auto it = _particles.begin(); it != _particles.end(); it++ )
{
(*it)->pos.x += (*it)->vel.x * time * _particleSpeed;
(*it)->pos.y += (*it)->vel.y * time * _particleSpeed;
(*it)->transparency -= (_dissolutionRate * time);
(*it)->color.a = sf::Uint8((*it)->transparency);
if((*it)->pos.x > _image.getSize().x || (*it)->pos.x < 0 || (*it)->pos.y > _image.getSize().y || (*it)->pos.y < 0 || (*it)->color.a < 10)
{
delete (*it);
it = _particles.erase(it);
if(it == _particles.end())
return;
}
}
}
void ParticleSystem::render()
{
if(!_enabled)
return;
for(auto it = _particles.begin(); it != _particles.end(); it++)
_image.setPixel((int)(*it)->pos.x, (int)(*it)->pos.y, (*it)->color);
_texture.update(_image);
}
void ParticleSystem::clear()
{
if(!_enabled)
return;
for(auto it = _particles.begin(); it != _particles.end(); it++ )
_image.setPixel( (int)(*it)->pos.x, (int)(*it)->pos.y, sf::Color::Transparent);
}
void ParticleSystem::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
target.draw(_sprite);
}