Skip to content
Snippets Groups Projects
Select Git revision
  • 0a4595fdaef533c541471c078e9ae57982518f42
  • master default protected
  • MatrixModelParticle
  • CommonInterface
  • ParticleScene
  • new_particle_struct
6 results

Particle.hpp

  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Particle.hpp 1.80 KiB
    #pragma once
    
    #include <chrono>
    #include <vector>
    
    #include <CurveTools/CPU/CurveGenerator.hpp>
    
    namespace pg::particle
    {
    	class Particle
    	{
    	private:
    		size_t m_born;
    		ct::Point m_position;
    
    	public:
    		Particle(const ct::Point& position = ct::Point());
    		Particle(size_t born, const ct::Point& position = ct::Point());
       		virtual ~Particle() = default;
    			
    		inline size_t getBorn() const {return this->m_born;}
    		inline ct::Point getPosition() const {return this->m_position;}
    
    		inline bool isDead(size_t current_time, size_t max_time) const {return (current_time - this->m_born) > max_time;}
    
    		inline void setBorn(size_t born) {this->m_born = born;}
    		inline void setPosition(const ct::Point& position) {this->m_position = position;}
    
    		inline void translate(const ct::Point& position) {this->m_position += position;}
    		virtual void update(double = 0.0) = 0;
    
    		inline friend bool operator==(const Particle & p1, const Particle & p2) {return p1.m_position == p2.m_position && p1.m_born == p2.m_born;}
    		inline friend bool operator!=(const Particle & p1, const Particle & p2) {return !(p1 == p2);}
    
    		inline friend bool operator>(const Particle & p1, const Particle & p2) {return p1.m_born > p2.m_born;}
    		inline friend bool operator>=(const Particle & p1, const Particle & p2) {return p1 > p2 || p1 == p2;}
    		inline friend bool operator<(const Particle & p1, const Particle & p2) {return !(p1 >= p2);}
    		inline friend bool operator<=(const Particle & p1, const Particle & p2) {return !(p1 > p2);}
    
    		template <typename T>
    		static void purge(std::vector<T> & container, size_t current_time, size_t max_time) {
            	for (auto it = container.begin(); it != container.end();) {
    				if ((*it)->isDead(current_time, max_time)) {
    					it = container.erase(it);
    				}
    
    				if (it != container.end()) {
    					++it;
    				}
            	}
        	}
    	};
    }