diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/crepe/Particle.cpp | 3 | ||||
| -rw-r--r-- | src/crepe/Particle.h | 5 | ||||
| -rw-r--r-- | src/crepe/api/ParticleEmitter.cpp | 12 | ||||
| -rw-r--r-- | src/crepe/api/ParticleEmitter.h | 13 | ||||
| -rw-r--r-- | src/crepe/system/ParticleSystem.cpp | 72 | ||||
| -rw-r--r-- | src/crepe/system/ParticleSystem.h | 4 | ||||
| -rw-r--r-- | src/example/particles.cpp | 17 | ||||
| -rw-r--r-- | src/makefile | 2 | ||||
| -rw-r--r-- | src/test/ParticleTest.cpp | 103 | 
9 files changed, 129 insertions, 102 deletions
diff --git a/src/crepe/Particle.cpp b/src/crepe/Particle.cpp index 3777db0..ab55f37 100644 --- a/src/crepe/Particle.cpp +++ b/src/crepe/Particle.cpp @@ -2,7 +2,8 @@  using namespace crepe; -void Particle::reset(uint32_t lifespan, Vector2 position, Vector2 velocity, double angle) { +void Particle::reset(uint32_t lifespan, Vector2 position, Vector2 velocity, +					 double angle) {  	// Initialize the particle state  	this->time_in_life = 0;  	this->lifespan = lifespan; diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h index 88a015d..06431bb 100644 --- a/src/crepe/Particle.h +++ b/src/crepe/Particle.h @@ -15,6 +15,7 @@ namespace crepe {   */  class Particle {  	// TODO: add friend particleSsytem and rendersystem. Unit test will fail. +  public:  	//! Position of the particle in 2D space.  	Vector2 position; @@ -43,7 +44,8 @@ public:  	 * \param velocity  The initial velocity of the particle.  	 * \param angle     The angle of the particle's trajectory or orientation.  	 */ -	void reset(uint32_t lifespan, Vector2 position, Vector2 velocity, double angle); +	void reset(uint32_t lifespan, Vector2 position, Vector2 velocity, +			   double angle);  	/**  	 * \brief Updates the particle's state.  	 * @@ -58,7 +60,6 @@ public:  	 * movement.  	 */  	void stop_movement(); -	  };  } // namespace crepe diff --git a/src/crepe/api/ParticleEmitter.cpp b/src/crepe/api/ParticleEmitter.cpp index 1703026..e7f298c 100644 --- a/src/crepe/api/ParticleEmitter.cpp +++ b/src/crepe/api/ParticleEmitter.cpp @@ -1,20 +1,18 @@  #include "ParticleEmitter.h"  #include "Particle.h" -  using namespace crepe; -ParticleEmitter::ParticleEmitter(uint32_t game_object_id, const Data& data) : Component(game_object_id),data(data) { -    for (size_t i = 0; i < this->data.max_particles; i++) { -        this->data.particles.emplace_back(); -    } +ParticleEmitter::ParticleEmitter(uint32_t game_object_id, const Data & data) +	: Component(game_object_id), data(data) { +	for (size_t i = 0; i < this->data.max_particles; i++) { +		this->data.particles.emplace_back(); +	}  } -  ParticleEmitter::~ParticleEmitter() {  	std::vector<Particle>::iterator it = this->data.particles.begin();  	while (it != this->data.particles.end()) {  		it = this->data.particles.erase(it);  	}  } - diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index 037effe..83a1588 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -12,7 +12,6 @@  namespace crepe { -  /**   * \brief Data holder for particle emission parameters.   * @@ -28,7 +27,7 @@ public:  	 * This structure specifies the boundary's size and offset, as well as the  	 * behavior of particles upon reaching the boundary limits.  	 */ -	struct Boundary{ +	struct Boundary {  		//! boundary width (midpoint is emitter location)  		double width = 0.0;  		//! boundary height (midpoint is emitter location) @@ -45,7 +44,7 @@ public:  	 * Contains settings for the emitter’s position, particle speed, angle, lifespan,  	 * boundary, and the sprite used for rendering particles.  	 */ -	struct Data{ +	struct Data {  		//! position of the emitter  		Vector2 position;  		//! maximum number of particles @@ -71,8 +70,9 @@ public:  		//! collection of particles  		std::vector<Particle> particles;  		//! sprite reference -		const Sprite& sprite; -	};	 +		const Sprite & sprite; +	}; +  public:  	/**  	 * \brief Constructs a ParticleEmitter data holder with specified settings. @@ -80,8 +80,9 @@ public:  	 * \param game_object_id  Identifier for the game object using this emitter.  	 * \param data            Configuration data defining particle properties.  	 */ -	ParticleEmitter(uint32_t game_object_id, const Data& data); +	ParticleEmitter(uint32_t game_object_id, const Data & data);  	~ParticleEmitter(); +  public:  	//! Configuration data for particle emission settings.  	Data data; diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index ad6699b..4a25b47 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -1,10 +1,10 @@  #include <cmath> -#include <ctime>  #include <cstdlib> +#include <ctime>  #include "api/ParticleEmitter.h" -#include "api/Vector2.h"  #include "api/Transform.h" +#include "api/Vector2.h"  #include "ComponentManager.h"  #include "ParticleSystem.h" @@ -16,20 +16,25 @@ ParticleSystem::ParticleSystem() {}  void ParticleSystem::update() {  	// Get all emitters  	ComponentManager & mgr = ComponentManager::get_instance(); -	std::vector<std::reference_wrapper<ParticleEmitter>> emitters = mgr.get_components_by_type<ParticleEmitter>(); +	std::vector<std::reference_wrapper<ParticleEmitter>> emitters +		= mgr.get_components_by_type<ParticleEmitter>();  	for (ParticleEmitter & emitter : emitters) {  		// Get transform linked to emitter -		const Transform& transform = mgr.get_components_by_id<Transform>(emitter.game_object_id).front().get(); +		const Transform & transform +			= mgr.get_components_by_id<Transform>(emitter.game_object_id) +				  .front() +				  .get();  		// Emit particles based on emission_rate -		int updates = calculate_update(this->update_count, emitter.data.emission_rate); +		int updates +			= calculate_update(this->update_count, emitter.data.emission_rate);  		for (size_t i = 0; i < updates; i++) {  			emit_particle(emitter, transform);  		}  		// Update all particles -		for (Particle& particle : emitter.data.particles) { +		for (Particle & particle : emitter.data.particles) {  			if (particle.active) {  				particle.update();  			} @@ -42,23 +47,25 @@ void ParticleSystem::update() {  	this->update_count = (this->update_count + 1) % this->MAX_UPDATE_COUNT;  } -void ParticleSystem::emit_particle(ParticleEmitter & emitter, const Transform& transform) { +void ParticleSystem::emit_particle(ParticleEmitter & emitter, +								   const Transform & transform) {  	constexpr double DEG_TO_RAD = M_PI / 180.0;  	Vector2 initial_position = emitter.data.position + transform.position; -	double random_angle = generate_random_angle(emitter.data.min_angle, emitter.data.max_angle); +	double random_angle +		= generate_random_angle(emitter.data.min_angle, emitter.data.max_angle); -	double random_speed = generate_random_speed(emitter.data.min_speed, emitter.data.max_speed); +	double random_speed +		= generate_random_speed(emitter.data.min_speed, emitter.data.max_speed);  	double angle_radians = random_angle * DEG_TO_RAD; -	Vector2 velocity = { -		random_speed * std::cos(angle_radians), -		random_speed * std::sin(angle_radians) -	}; +	Vector2 velocity = {random_speed * std::cos(angle_radians), +						random_speed * std::sin(angle_radians)}; -	for (Particle& particle : emitter.data.particles) { +	for (Particle & particle : emitter.data.particles) {  		if (!particle.active) { -			particle.reset(emitter.data.end_lifespan, initial_position, velocity, random_angle); +			particle.reset(emitter.data.end_lifespan, initial_position, +						   velocity, random_angle);  			break;  		}  	} @@ -69,15 +76,17 @@ int ParticleSystem::calculate_update(int count, double emission) const {  	double fractional_part = emission - integer_part;  	if (fractional_part > 0) { -			int denominator = static_cast<int>(1.0 / fractional_part); -			return (count % denominator == 0) ? 1 : 0; +		int denominator = static_cast<int>(1.0 / fractional_part); +		return (count % denominator == 0) ? 1 : 0;  	}  	return static_cast<int>(emission);  } -void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform& transform) { -	Vector2 offset = emitter.data.boundary.offset + transform.position + emitter.data.position; +void ParticleSystem::check_bounds(ParticleEmitter & emitter, +								  const Transform & transform) { +	Vector2 offset = emitter.data.boundary.offset + transform.position +					 + emitter.data.position;  	double half_width = emitter.data.boundary.width / 2.0;  	double half_height = emitter.data.boundary.height / 2.0; @@ -86,9 +95,10 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform& tr  	const double TOP = offset.y - half_height;  	const double BOTTOM = offset.y + half_height; -	for (Particle& particle : emitter.data.particles) { -		const Vector2& position = particle.position; -		bool within_bounds = (position.x >= LEFT && position.x <= RIGHT && position.y >= TOP && position.y <= BOTTOM); +	for (Particle & particle : emitter.data.particles) { +		const Vector2 & position = particle.position; +		bool within_bounds = (position.x >= LEFT && position.x <= RIGHT +							  && position.y >= TOP && position.y <= BOTTOM);  		if (!within_bounds) {  			if (emitter.data.boundary.reset_on_exit) { @@ -104,22 +114,30 @@ void ParticleSystem::check_bounds(ParticleEmitter & emitter, const Transform& tr  	}  } -double ParticleSystem::generate_random_angle(double min_angle, double max_angle) const { +double ParticleSystem::generate_random_angle(double min_angle, +											 double max_angle) const {  	if (min_angle == max_angle) {  		return min_angle;  	} else if (min_angle < max_angle) { -		return min_angle + static_cast<double>(std::rand() % static_cast<int>(max_angle - min_angle)); +		return min_angle +			   + static_cast<double>(std::rand() +									 % static_cast<int>(max_angle - min_angle));  	} else {  		double angle_offset = (360 - min_angle) + max_angle; -		double random_angle = min_angle + static_cast<double>(std::rand() % static_cast<int>(angle_offset)); +		double random_angle = min_angle +							  + static_cast<double>( +								  std::rand() % static_cast<int>(angle_offset));  		return (random_angle >= 360) ? random_angle - 360 : random_angle;  	}  } -double ParticleSystem::generate_random_speed(double min_speed, double max_speed) const { +double ParticleSystem::generate_random_speed(double min_speed, +											 double max_speed) const {  	if (min_speed == max_speed) {  		return min_speed;  	} else { -		return min_speed + static_cast<double>(std::rand() % static_cast<int>(max_speed - min_speed)); +		return min_speed +			   + static_cast<double>(std::rand() +									 % static_cast<int>(max_speed - min_speed));  	}  } diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h index a74ea79..3155df1 100644 --- a/src/crepe/system/ParticleSystem.h +++ b/src/crepe/system/ParticleSystem.h @@ -27,7 +27,7 @@ private:  		* \param emitter Reference to the ParticleEmitter.  		* \param transform Const reference to the Transform component associated with the emitter.  		*/ -	void emit_particle(ParticleEmitter & emitter, const Transform& transform); +	void emit_particle(ParticleEmitter & emitter, const Transform & transform);  	/**  		* \brief Calculates the number of times particles should be emitted based on emission rate and update count. @@ -44,7 +44,7 @@ private:  		* \param emitter Reference to the ParticleEmitter.  		* \param transform Const reference to the Transform component associated with the emitter.  		*/ -	void check_bounds(ParticleEmitter & emitter, const Transform& transform); +	void check_bounds(ParticleEmitter & emitter, const Transform & transform);  	/**  		* \brief Generates a random angle for particle emission within the specified range. diff --git a/src/example/particles.cpp b/src/example/particles.cpp index 407df4e..6eab046 100644 --- a/src/example/particles.cpp +++ b/src/example/particles.cpp @@ -2,14 +2,13 @@  #include <crepe/api/AssetManager.h>  #include <crepe/Component.h> +#include <crepe/api/Color.h>  #include <crepe/api/GameObject.h> -#include <crepe/api/Rigidbody.h> -#include <crepe/api/Transform.h>  #include <crepe/api/ParticleEmitter.h> +#include <crepe/api/Rigidbody.h>  #include <crepe/api/Sprite.h>  #include <crepe/api/Texture.h> -#include <crepe/api/Color.h> - +#include <crepe/api/Transform.h>  using namespace crepe;  using namespace std; @@ -18,10 +17,10 @@ int main(int argc, char * argv[]) {  	GameObject game_object(0, "", "", Vector2{0, 0}, 0, 0);  	Color color(0, 0, 0, 0);  	Sprite test_sprite = game_object.add_component<Sprite>( -	make_shared<Texture>("../asset/texture/img.png"), color, -	FlipSettings{true, true}); +		make_shared<Texture>("../asset/texture/img.png"), color, +		FlipSettings{true, true});  	game_object.add_component<ParticleEmitter>(ParticleEmitter::Data{ -		.position = {0,0}, +		.position = {0, 0},  		.max_particles = 100,  		.emission_rate = 0,  		.min_speed = 0, @@ -30,11 +29,11 @@ int main(int argc, char * argv[]) {  		.max_angle = 0,  		.begin_lifespan = 0,  		.end_lifespan = 0, -		.force_over_time = Vector2{0,0}, +		.force_over_time = Vector2{0, 0},  		.boundary{  			.width = 0,  			.height = 0, -			.offset = Vector2{0,0}, +			.offset = Vector2{0, 0},  			.reset_on_exit = false,  		},  		.sprite = test_sprite, diff --git a/src/makefile b/src/makefile index 59298fd..356179e 100644 --- a/src/makefile +++ b/src/makefile @@ -87,7 +87,7 @@ LOEK += example/audio_internal.cpp  TODO += example/components_internal.cpp  MAX += example/ecs.cpp  LOEK += example/log.cpp -JARO += example/particle.cpp +JARO += example/particles.cpp  JARO += example/physics.cpp  TODO += example/rendering.cpp  LOEK += example/script.cpp diff --git a/src/test/ParticleTest.cpp b/src/test/ParticleTest.cpp index 7883eca..6fe3133 100644 --- a/src/test/ParticleTest.cpp +++ b/src/test/ParticleTest.cpp @@ -1,22 +1,20 @@  #include "api/Vector2.h" -#include <math.h>  #include <crepe/ComponentManager.h> +#include <crepe/Particle.h>  #include <crepe/api/Config.h>  #include <crepe/api/GameObject.h> +#include <crepe/api/ParticleEmitter.h>  #include <crepe/api/Rigidbody.h> +#include <crepe/api/Sprite.h>  #include <crepe/api/Transform.h> -#include <crepe/api/ParticleEmitter.h> -#include <crepe/Particle.h>  #include <crepe/system/ParticleSystem.h>  #include <gtest/gtest.h> -#include <crepe/api/Sprite.h> +#include <math.h>  using namespace std;  using namespace std::chrono_literals;  using namespace crepe; - -  class ParticlesTest : public ::testing::Test {  protected:  	ParticleSystem particle_system; @@ -25,17 +23,16 @@ protected:  		std::vector<std::reference_wrapper<Transform>> transforms  			= mgr.get_components_by_id<Transform>(0);  		if (transforms.empty()) { -		 -			 +  			GameObject game_object(0, "", "", Vector2{0, 0}, 0, 0);  			Color color(0, 0, 0, 0);  			Sprite test_sprite = game_object.add_component<Sprite>( -			make_shared<Texture>("../asset/texture/img.png"), color, -			FlipSettings{true, true}); +				make_shared<Texture>("../asset/texture/img.png"), color, +				FlipSettings{true, true});  			game_object.add_component<ParticleEmitter>(ParticleEmitter::Data{ -				.position = {0,0}, +				.position = {0, 0},  				.max_particles = 100,  				.emission_rate = 0,  				.min_speed = 0, @@ -44,11 +41,11 @@ protected:  				.max_angle = 0,  				.begin_lifespan = 0,  				.end_lifespan = 0, -				.force_over_time = Vector2{0,0}, +				.force_over_time = Vector2{0, 0},  				.boundary{  					.width = 0,  					.height = 0, -					.offset = Vector2{0,0}, +					.offset = Vector2{0, 0},  					.reset_on_exit = false,  				},  				.sprite = test_sprite, @@ -72,7 +69,7 @@ protected:  		emitter.data.end_lifespan = 0;  		emitter.data.force_over_time = Vector2{0, 0};  		emitter.data.boundary = {0, 0, Vector2{0, 0}, false}; -		for (auto& particle : emitter.data.particles) { +		for (auto & particle : emitter.data.particles) {  			particle.active = false;  		}  	} @@ -81,7 +78,8 @@ protected:  TEST_F(ParticlesTest, spawnParticle) {  	Config::get_instance().physics.gravity = 1;  	ComponentManager & mgr = ComponentManager::get_instance(); -	ParticleEmitter & emitter = mgr.get_components_by_id<ParticleEmitter>(0).front().get(); +	ParticleEmitter & emitter +		= mgr.get_components_by_id<ParticleEmitter>(0).front().get();  	emitter.data.end_lifespan = 5;  	emitter.data.boundary.height = 100;  	emitter.data.boundary.width = 100; @@ -89,7 +87,7 @@ TEST_F(ParticlesTest, spawnParticle) {  	emitter.data.max_angle = 0.1;  	emitter.data.max_speed = 10;  	emitter.data.max_angle = 10; -	particle_system.update();  +	particle_system.update();  	//check if nothing happend  	EXPECT_EQ(emitter.data.particles[0].active, false);  	emitter.data.emission_rate = 1; @@ -103,24 +101,30 @@ TEST_F(ParticlesTest, spawnParticle) {  	particle_system.update();  	EXPECT_EQ(emitter.data.particles[3].active, true); -	for (auto& particle : emitter.data.particles) { -        // Check velocity range -        EXPECT_GE(particle.velocity.x, emitter.data.min_speed);  // Speed should be greater than or equal to min_speed -        EXPECT_LE(particle.velocity.x, emitter.data.max_speed);  // Speed should be less than or equal to max_speed -		EXPECT_GE(particle.velocity.y, emitter.data.min_speed);  // Speed should be greater than or equal to min_speed -        EXPECT_LE(particle.velocity.y, emitter.data.max_speed);  // Speed should be less than or equal to max_speed - -        // Check angle range -        EXPECT_GE(particle.angle, emitter.data.min_angle);  // Angle should be greater than or equal to min_angle -        EXPECT_LE(particle.angle, emitter.data.max_angle);  // Angle should be less than or equal to max_angle -    } - +	for (auto & particle : emitter.data.particles) { +		// Check velocity range +		EXPECT_GE(particle.velocity.x, emitter.data.min_speed); +		// Speed should be greater than or equal to min_speed +		EXPECT_LE(particle.velocity.x, emitter.data.max_speed); +		// Speed should be less than or equal to max_speed +		EXPECT_GE(particle.velocity.y, emitter.data.min_speed); +		// Speed should be greater than or equal to min_speed +		EXPECT_LE(particle.velocity.y, emitter.data.max_speed); +		// Speed should be less than or equal to max_speed + +		// Check angle range +		EXPECT_GE(particle.angle, emitter.data.min_angle); +		// Angle should be greater than or equal to min_angle +		EXPECT_LE(particle.angle, emitter.data.max_angle); +		// Angle should be less than or equal to max_angle +	}  }  TEST_F(ParticlesTest, moveParticleHorizontal) {  	Config::get_instance().physics.gravity = 1;  	ComponentManager & mgr = ComponentManager::get_instance(); -	ParticleEmitter & emitter = mgr.get_components_by_id<ParticleEmitter>(0).front().get(); +	ParticleEmitter & emitter +		= mgr.get_components_by_id<ParticleEmitter>(0).front().get();  	emitter.data.end_lifespan = 100;  	emitter.data.boundary.height = 100;  	emitter.data.boundary.width = 100; @@ -128,17 +132,17 @@ TEST_F(ParticlesTest, moveParticleHorizontal) {  	emitter.data.max_speed = 1;  	emitter.data.max_angle = 0;  	emitter.data.emission_rate = 1; -	for (int a = 1; a < emitter.data.boundary.width/2; a++) { -		particle_system.update();  -		EXPECT_EQ(emitter.data.particles[0].position.x,a); +	for (int a = 1; a < emitter.data.boundary.width / 2; a++) { +		particle_system.update(); +		EXPECT_EQ(emitter.data.particles[0].position.x, a);  	}  } -  TEST_F(ParticlesTest, moveParticleVertical) {  	Config::get_instance().physics.gravity = 1;  	ComponentManager & mgr = ComponentManager::get_instance(); -	ParticleEmitter & emitter = mgr.get_components_by_id<ParticleEmitter>(0).front().get(); +	ParticleEmitter & emitter +		= mgr.get_components_by_id<ParticleEmitter>(0).front().get();  	emitter.data.end_lifespan = 100;  	emitter.data.boundary.height = 100;  	emitter.data.boundary.width = 100; @@ -147,16 +151,17 @@ TEST_F(ParticlesTest, moveParticleVertical) {  	emitter.data.min_angle = 90;  	emitter.data.max_angle = 90;  	emitter.data.emission_rate = 1; -	for (int a = 1; a < emitter.data.boundary.width/2; a++) { -		particle_system.update();  -		EXPECT_EQ(emitter.data.particles[0].position.y,a); +	for (int a = 1; a < emitter.data.boundary.width / 2; a++) { +		particle_system.update(); +		EXPECT_EQ(emitter.data.particles[0].position.y, a);  	}  }  TEST_F(ParticlesTest, boundaryParticleReset) {  	Config::get_instance().physics.gravity = 1;  	ComponentManager & mgr = ComponentManager::get_instance(); -	ParticleEmitter & emitter = mgr.get_components_by_id<ParticleEmitter>(0).front().get(); +	ParticleEmitter & emitter +		= mgr.get_components_by_id<ParticleEmitter>(0).front().get();  	emitter.data.end_lifespan = 100;  	emitter.data.boundary.height = 10;  	emitter.data.boundary.width = 10; @@ -166,16 +171,17 @@ TEST_F(ParticlesTest, boundaryParticleReset) {  	emitter.data.min_angle = 90;  	emitter.data.max_angle = 90;  	emitter.data.emission_rate = 1; -	for (int a = 0; a < emitter.data.boundary.width/2+1; a++) { -		particle_system.update();  +	for (int a = 0; a < emitter.data.boundary.width / 2 + 1; a++) { +		particle_system.update();  	} -	EXPECT_EQ(emitter.data.particles[0].active,false); +	EXPECT_EQ(emitter.data.particles[0].active, false);  }  TEST_F(ParticlesTest, boundaryParticleStop) {  	Config::get_instance().physics.gravity = 1;  	ComponentManager & mgr = ComponentManager::get_instance(); -	ParticleEmitter & emitter = mgr.get_components_by_id<ParticleEmitter>(0).front().get(); +	ParticleEmitter & emitter +		= mgr.get_components_by_id<ParticleEmitter>(0).front().get();  	emitter.data.end_lifespan = 100;  	emitter.data.boundary.height = 10;  	emitter.data.boundary.width = 10; @@ -185,13 +191,16 @@ TEST_F(ParticlesTest, boundaryParticleStop) {  	emitter.data.min_angle = 90;  	emitter.data.max_angle = 90;  	emitter.data.emission_rate = 1; -	for (int a = 0; a < emitter.data.boundary.width/2+1; a++) { -		particle_system.update();  +	for (int a = 0; a < emitter.data.boundary.width / 2 + 1; a++) { +		particle_system.update();  	}  	const double TOLERANCE = 0.01;  	EXPECT_NEAR(emitter.data.particles[0].velocity.x, 0, TOLERANCE);  	EXPECT_NEAR(emitter.data.particles[0].velocity.y, 0, TOLERANCE); -	if(emitter.data.particles[0].velocity.x != 0)	EXPECT_NEAR(std::abs(emitter.data.particles[0].position.x), emitter.data.boundary.height / 2, TOLERANCE); -	if(emitter.data.particles[0].velocity.y != 0)	EXPECT_NEAR(std::abs(emitter.data.particles[0].position.y), emitter.data.boundary.width / 2, TOLERANCE); +	if (emitter.data.particles[0].velocity.x != 0) +		EXPECT_NEAR(std::abs(emitter.data.particles[0].position.x), +					emitter.data.boundary.height / 2, TOLERANCE); +	if (emitter.data.particles[0].velocity.y != 0) +		EXPECT_NEAR(std::abs(emitter.data.particles[0].position.y), +					emitter.data.boundary.width / 2, TOLERANCE);  } -  |