diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/crepe/Collider.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/Collider.h | 2 | ||||
| -rw-r--r-- | src/crepe/api/BoxCollider.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/api/BoxCollider.h | 2 | ||||
| -rw-r--r-- | src/crepe/api/CircleCollider.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/api/CircleCollider.h | 2 | ||||
| -rw-r--r-- | src/crepe/api/Rigidbody.h | 14 | ||||
| -rw-r--r-- | src/crepe/system/CollisionSystem.cpp | 18 | ||||
| -rw-r--r-- | src/crepe/system/CollisionSystem.h | 8 | ||||
| -rw-r--r-- | src/crepe/system/PhysicsSystem.cpp | 10 | ||||
| -rw-r--r-- | src/test/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/test/CollisionTest.cpp | 5 | ||||
| -rw-r--r-- | src/test/Profiling.cpp | 42 | 
13 files changed, 52 insertions, 59 deletions
| diff --git a/src/crepe/Collider.cpp b/src/crepe/Collider.cpp index 80a944d..9d94152 100644 --- a/src/crepe/Collider.cpp +++ b/src/crepe/Collider.cpp @@ -2,4 +2,4 @@  using namespace crepe; -Collider::Collider(game_object_id_t id, vec2 offset) : Component(id), offset(offset) {} +Collider::Collider(game_object_id_t id, const vec2& offset) : Component(id), offset(offset) {} diff --git a/src/crepe/Collider.h b/src/crepe/Collider.h index e1624b4..15d3a24 100644 --- a/src/crepe/Collider.h +++ b/src/crepe/Collider.h @@ -7,7 +7,7 @@ namespace crepe {  class Collider : public Component {  public: -	Collider(game_object_id_t id, vec2 offset); +	Collider(game_object_id_t id, const vec2& offset);  public:  	//! Offset of the collider relative to rigidbody position  diff --git a/src/crepe/api/BoxCollider.cpp b/src/crepe/api/BoxCollider.cpp index 6034837..1069e90 100644 --- a/src/crepe/api/BoxCollider.cpp +++ b/src/crepe/api/BoxCollider.cpp @@ -4,4 +4,4 @@  using namespace crepe; -BoxCollider::BoxCollider(game_object_id_t game_object_id,vec2 offset, float width, float height) : Collider(game_object_id,offset), width(width), height(height) {} +BoxCollider::BoxCollider(game_object_id_t game_object_id,const vec2& offset, float width, float height) : Collider(game_object_id,offset), width(width), height(height) {} diff --git a/src/crepe/api/BoxCollider.h b/src/crepe/api/BoxCollider.h index 2ce1ee8..c83d54a 100644 --- a/src/crepe/api/BoxCollider.h +++ b/src/crepe/api/BoxCollider.h @@ -12,7 +12,7 @@ namespace crepe {   */  class BoxCollider : public Collider {  public: -	BoxCollider(game_object_id_t game_object_id,vec2 offset, float width, float height); +	BoxCollider(game_object_id_t game_object_id,const vec2& offset, float width, float height);  	//! Width of box collider   	float width; diff --git a/src/crepe/api/CircleCollider.cpp b/src/crepe/api/CircleCollider.cpp index 497ebba..473734e 100644 --- a/src/crepe/api/CircleCollider.cpp +++ b/src/crepe/api/CircleCollider.cpp @@ -3,4 +3,4 @@  using namespace crepe; -CircleCollider::CircleCollider(game_object_id_t game_object_id,vec2 offset, float radius) : Collider(game_object_id,offset), radius(radius) {} +CircleCollider::CircleCollider(game_object_id_t game_object_id,const vec2& offset, float radius) : Collider(game_object_id,offset), radius(radius) {} diff --git a/src/crepe/api/CircleCollider.h b/src/crepe/api/CircleCollider.h index c61f027..bbcc330 100644 --- a/src/crepe/api/CircleCollider.h +++ b/src/crepe/api/CircleCollider.h @@ -14,7 +14,7 @@ namespace crepe {  class CircleCollider : public Collider {  public: -	CircleCollider(game_object_id_t game_object_id,vec2 offset, float radius); +	CircleCollider(game_object_id_t game_object_id,const vec2& offset, float radius);  	//! Radius of the circle collider.  	float radius; diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h index 446c5dd..63b1b51 100644 --- a/src/crepe/api/Rigidbody.h +++ b/src/crepe/api/Rigidbody.h @@ -54,7 +54,7 @@ public:  		//! objects mass  		float mass = 0.0;  		//! gravtiy scale -		float gravity_scale = 0.0; +		float gravity_scale = 0;  		//! Changes if physics apply  		BodyType body_type = BodyType::DYNAMIC;  		//! linear velocity of object @@ -62,20 +62,16 @@ public:  		//! maximum linear velocity of object  		vec2 max_linear_velocity = {INFINITY ,INFINITY};  		//! linear damping of object -		vec2 linear_damping; +		vec2 linear_velocity_factor;  		//! angular velocity of object -		float angular_velocity = 0.0; +		float angular_velocity = 1;  		//! max angular velocity of object  		float max_angular_velocity = INFINITY;  		//! angular damping of object -		float angular_damping = 0.0; +		float angular_velocity_factor = 1;  		//! movements constraints of object  		PhysicsConstraints constraints; -		//! if gravity applies -		bool use_gravity = true; -		//! if object bounces -		bool bounce = false; -		//! bounce factor of material +		//! bounce factor of material. 0.0 <= means all velocity is lost, 1.0 means it gets the same momentum but the mirrored direction. 0.5 is half of the velocity is saved.  		float elastisity = 0.0;  		//! offset of all colliders relative to transform position  		vec2 offset; diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 2fe3621..fbb16e8 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -146,10 +146,10 @@ std::pair<vec2,CollisionSystem::Direction> CollisionSystem::collision_handler(Co  		resolution.x = data1.rigidbody.data.linear_velocity.x * (resolution.y/data1.rigidbody.data.linear_velocity.y);  	} -	return {resolution,resolution_direction}; +	return std::make_pair(resolution,resolution_direction);  } -vec2 CollisionSystem::get_box_box_resolution(const BoxCollider& box_collider1,const BoxCollider& box_collider2,vec2 final_position1,vec2 final_position2) const +vec2 CollisionSystem::get_box_box_resolution(const BoxCollider& box_collider1,const BoxCollider& box_collider2,const vec2& final_position1,const vec2& final_position2) const  {  	vec2 resolution; // Default resolution vector  	vec2 delta = final_position2 - final_position1; @@ -183,7 +183,7 @@ vec2 CollisionSystem::get_box_box_resolution(const BoxCollider& box_collider1,co  	return resolution;  } -vec2 CollisionSystem::get_circle_circle_resolution(const CircleCollider& circle_collider1, const CircleCollider& circle_collider2, vec2 final_position1, vec2 final_position2) const  +vec2 CollisionSystem::get_circle_circle_resolution(const CircleCollider& circle_collider1, const CircleCollider& circle_collider2, const vec2& final_position1, const vec2& final_position2) const   {      vec2 delta = final_position2 - final_position1; @@ -205,7 +205,7 @@ vec2 CollisionSystem::get_circle_circle_resolution(const CircleCollider& circle_      return resolution;  } -vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider& circle_collider, const BoxCollider& box_collider, vec2 circle_position, vec2 box_position) const  +vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider& circle_collider, const BoxCollider& box_collider, const vec2& circle_position, const vec2& box_position) const   {      vec2 delta = circle_position - box_position; @@ -252,7 +252,7 @@ void CollisionSystem::static_collision_handler(CollisionInfo& info){  	info.first_transform.position += info.resolution;  	// If bounce is enabled mirror velocity -	if(info.first_rigidbody.data.bounce) { +	if(info.first_rigidbody.data.elastisity > 0) {  		if(info.resolution_direction == Direction::BOTH)  		{  			info.first_rigidbody.data.linear_velocity.y = -info.first_rigidbody.data.linear_velocity.y * info.first_rigidbody.data.elastisity; @@ -335,12 +335,12 @@ CollisionSystem::get_active_transform_and_rigidbody(game_object_id_t game_object      RefVector<Transform> transforms = this->component_manager.get_components_by_id<Transform>(game_object_id);      if (transforms.empty()) return std::nullopt; +		Transform& transform = transforms.front().get(); +    if (!transform.active) return std::nullopt; +      RefVector<Rigidbody> rigidbodies = this->component_manager.get_components_by_id<Rigidbody>(game_object_id);      if (rigidbodies.empty()) return std::nullopt; -    Transform& transform = transforms.front().get(); -    if (!transform.active) return std::nullopt; -      Rigidbody& rigidbody = rigidbodies.front().get();      if (!rigidbody.active) return std::nullopt; @@ -453,7 +453,7 @@ bool CollisionSystem::get_circle_circle_collision(const CircleCollider& circle1,  	return distance_squared <= radius_sum * radius_sum;  } -vec2 CollisionSystem::get_current_position(vec2 collider_offset, const Transform& transform, const Rigidbody& rigidbody) const { +vec2 CollisionSystem::get_current_position(const vec2& collider_offset, const Transform& transform, const Rigidbody& rigidbody) const {  	// Get the rotation in radians  	float radians1 = transform.rotation * (M_PI / 180.0); diff --git a/src/crepe/system/CollisionSystem.h b/src/crepe/system/CollisionSystem.h index 3f24db1..34c03ae 100644 --- a/src/crepe/system/CollisionSystem.h +++ b/src/crepe/system/CollisionSystem.h @@ -104,7 +104,7 @@ private:  		* \param rigidbody The Rigidbody of the associated game object.  		* \return The calculated position of the collider.  		*/ -	vec2 get_current_position(vec2 collider_offset, const Transform& transform, const Rigidbody& rigidbody) const; +	vec2 get_current_position(const vec2& collider_offset, const Transform& transform, const Rigidbody& rigidbody) const;  private: @@ -141,7 +141,7 @@ private:  		* \param position2 The position of the second BoxCollider.  		* \return The resolution vector for the collision.  		*/ -	vec2 get_box_box_resolution(const BoxCollider& box_collider1,const BoxCollider& box_collider2,vec2 position1,vec2 position2) const; +	vec2 get_box_box_resolution(const BoxCollider& box_collider1,const BoxCollider& box_collider2,const vec2& position1,const vec2& position2) const;  	/**  		* \brief Calculates the resolution vector for two CircleCollider. @@ -154,7 +154,7 @@ private:  		* \param position2 The position of the second CircleCollider.  		* \return The resolution vector for the collision.  		*/ -	vec2 get_circle_circle_resolution(const CircleCollider& circle_collider1, const CircleCollider& circle_collider2, vec2 final_position1, vec2 final_position2) const; +	vec2 get_circle_circle_resolution(const CircleCollider& circle_collider1, const CircleCollider& circle_collider2, const vec2& final_position1, const vec2& final_position2) const;  	/**  		* \brief Calculates the resolution vector for two CircleCollider. @@ -167,7 +167,7 @@ private:  		* \param box_position The position of the BocCollider.  		* \return The resolution vector for the collision.  		*/ -	vec2 get_circle_box_resolution(const CircleCollider& circle_collider, const BoxCollider& box_collider, vec2 circle_position, vec2 box_position) const; +	vec2 get_circle_box_resolution(const CircleCollider& circle_collider, const BoxCollider& box_collider, const vec2& circle_position, const vec2& box_position) const;  	/**  		* \brief Determines the appropriate collision handler for a collision. diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index 514a4b3..8f21727 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -25,17 +25,17 @@ void PhysicsSystem::update() {  					if (transform.game_object_id == rigidbody.game_object_id) {  						// Add gravity -						if (rigidbody.data.use_gravity) { +						if (rigidbody.data.gravity_scale > 0) {  							rigidbody.data.linear_velocity.y  								+= (rigidbody.data.mass * rigidbody.data.gravity_scale  									* gravity);  						}  						// Add damping -						if (rigidbody.data.angular_damping != 0) { -							rigidbody.data.angular_velocity *= rigidbody.data.angular_damping; +						if (rigidbody.data.angular_velocity_factor != 1 && rigidbody.data.angular_velocity_factor > 0) { +							rigidbody.data.angular_velocity *= rigidbody.data.angular_velocity_factor;  						} -						if (rigidbody.data.linear_damping != vec2{0, 0}) { -							rigidbody.data.linear_velocity *= rigidbody.data.linear_damping; +						if (rigidbody.data.linear_velocity_factor != vec2{1, 1} && rigidbody.data.linear_velocity_factor.x > 0 && rigidbody.data.linear_velocity_factor.y > 0) { +							rigidbody.data.linear_velocity *= rigidbody.data.linear_velocity_factor;  						}  						// Max velocity check diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 616e238..4555c0b 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -13,5 +13,5 @@ target_sources(test_main PUBLIC  	# ValueBrokerTest.cpp  	# DBTest.cpp  	# Vector2Test.cpp -	# Profiling.cpp +	Profiling.cpp  ) diff --git a/src/test/CollisionTest.cpp b/src/test/CollisionTest.cpp index ed40b1b..92ff7ba 100644 --- a/src/test/CollisionTest.cpp +++ b/src/test/CollisionTest.cpp @@ -65,7 +65,6 @@ public:  		world.add_component<Rigidbody>(Rigidbody::Data{  			// TODO: remove unrelated properties:  			.body_type = Rigidbody::BodyType::STATIC, -			.bounce = false,  			.offset = {0,0},  		});  		// Create a box with an inner size of 10x10 units @@ -80,8 +79,6 @@ public:  			.body_type = Rigidbody::BodyType::DYNAMIC,  			.linear_velocity = {0,0},  			.constraints = {0, 0, 0}, -			.use_gravity = true, -			.bounce = true,  			.elastisity = 1,  			.offset = {0,0},  		}); @@ -96,8 +93,6 @@ public:  			.body_type = Rigidbody::BodyType::DYNAMIC,  			.linear_velocity = {0,0},  			.constraints = {0, 0, 0}, -			.use_gravity = true, -			.bounce = true,  			.elastisity = 1,  			.offset = {0,0},  		}); diff --git a/src/test/Profiling.cpp b/src/test/Profiling.cpp index 2549c57..a88bf85 100644 --- a/src/test/Profiling.cpp +++ b/src/test/Profiling.cpp @@ -79,7 +79,8 @@ public:  	void SetUp() override {  		GameObject do_not_use = mgr.new_object("DO_NOT_USE","",{0,0}); -		do_not_use.add_component<Camera>(Color::WHITE); +		do_not_use.add_component<Camera>(Color::WHITE, ivec2{1080, 720}, +												   vec2{2000, 2000}, 1.0f);  		// initialize systems here:  		//calls init  		script_sys.update(); @@ -110,14 +111,19 @@ public:  	// Print timings of all functions  	void log_timings() const { -		std::stringstream ss; -        ss << "\nFunction timings:\n"; -        for (const auto& [name, duration] : timings) { -            ss << name << " took " << duration.count() / 1000.0 / average << " ms (" << duration.count() / average << " µs).\n"; -        } -        ss << "Total time: " << this->total_time.count() / 1000.0 / average << " ms (" << this->total_time.count() / average << " µs)\n"; -        ss << "Amount of gameobjects: " << game_object_count << "\n"; -        GTEST_LOG_(INFO) << ss.str(); +		std::string result = "\nFunction timings:\n"; +     +    for (const auto& [name, duration] : timings) { +        result += name + " took " + std::to_string(duration.count() / 1000.0 / average) + " ms (" + +                  std::to_string(duration.count() / average) + " µs).\n"; +    } + +    result += "Total time: " + std::to_string(this->total_time.count() / 1000.0 / average) + " ms (" + +              std::to_string(this->total_time.count() / average) + " µs)\n"; +     +    result += "Amount of gameobjects: " + std::to_string(game_object_count) + "\n"; + +    GTEST_LOG_(INFO) << result;  	}  	void clear_timings() { @@ -158,15 +164,14 @@ TEST_F(Profiling, Profiling_2) {  			//define gameobject used for testing  			GameObject gameobject = mgr.new_object("gameobject","",{static_cast<float>(game_object_count*2),0});  			gameobject.add_component<Rigidbody>(Rigidbody::Data{ -			.body_type = Rigidbody::BodyType::STATIC, -			.use_gravity = false, +				.gravity_scale = 0.0, +				.body_type = Rigidbody::BodyType::STATIC,  			});  			gameobject.add_component<BoxCollider>(vec2{0, 0}, 1, 1);  			gameobject.add_component<BehaviorScript>().set_script<TestScript>();  			Color color(0, 0, 0, 0); -			gameobject.add_component<Sprite>( -			make_shared<Texture>("asset/texture/green_square.png"), color, -			FlipSettings{true, true}); +			auto img = Texture("asset/texture/green_square.png"); +			Sprite & test_sprite = gameobject.add_component<Sprite>(img, color, Sprite::FlipSettings{false, false}, 1, 1, 500);  		}  		this->game_object_count++; @@ -190,17 +195,14 @@ TEST_F(Profiling, Profiling_3) {  			//define gameobject used for testing  			GameObject gameobject = mgr.new_object("gameobject","",{static_cast<float>(game_object_count*2),0});  			gameobject.add_component<Rigidbody>(Rigidbody::Data{ +			.gravity_scale = 0,  			.body_type = Rigidbody::BodyType::STATIC, -			.use_gravity = false,  			});  			gameobject.add_component<BoxCollider>(vec2{0, 0}, 1, 1);  			gameobject.add_component<BehaviorScript>().set_script<TestScript>();  			Color color(0, 0, 0, 0); -			gameobject.add_component<Sprite>( -			make_shared<Texture>("asset/texture/green_square.png"), color, -			FlipSettings{true, true}); -			Sprite & test_sprite = gameobject.add_component<Sprite>( -			make_shared<Texture>("asset/texture/img.png"), color, FlipSettings{false, false}); +			auto img = Texture("asset/texture/green_square.png"); +			Sprite & test_sprite = gameobject.add_component<Sprite>(img, color, Sprite::FlipSettings{false, false}, 1, 1, 500);  			auto & test = gameobject.add_component<ParticleEmitter>(ParticleEmitter::Data{  			.max_particles = 10,  			.emission_rate = 100, |