diff options
| -rw-r--r-- | src/crepe/api/Config.h | 2 | ||||
| -rw-r--r-- | src/crepe/api/LoopManager.h | 1 | ||||
| -rw-r--r-- | src/crepe/api/Rigidbody.h | 4 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.cpp | 39 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.h | 23 | ||||
| -rw-r--r-- | src/crepe/system/AISystem.cpp | 10 | ||||
| -rw-r--r-- | src/crepe/system/PhysicsSystem.cpp | 131 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.cpp | 23 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.h | 11 | ||||
| -rw-r--r-- | src/example/AITest.cpp | 24 | ||||
| -rw-r--r-- | src/example/game.cpp | 45 | ||||
| -rw-r--r-- | src/example/rendering_particle.cpp | 14 | ||||
| -rw-r--r-- | src/test/InputTest.cpp | 45 | ||||
| -rw-r--r-- | src/test/LoopManagerTest.cpp | 10 | ||||
| -rw-r--r-- | src/test/LoopTimerTest.cpp | 5 | ||||
| -rw-r--r-- | src/test/PhysicsTest.cpp | 46 | ||||
| -rw-r--r-- | src/test/Profiling.cpp | 1 | 
17 files changed, 228 insertions, 206 deletions
| diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 159be99..47a81b7 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -53,7 +53,7 @@ struct Config final {  		 *  		 * Gravity value of game.  		 */ -		double gravity = 1; +		float gravity = 10;  	} physics;  	//! default window settings diff --git a/src/crepe/api/LoopManager.h b/src/crepe/api/LoopManager.h index 2915315..40e6b38 100644 --- a/src/crepe/api/LoopManager.h +++ b/src/crepe/api/LoopManager.h @@ -12,7 +12,6 @@  #include "../manager/SceneManager.h"  #include "../system/System.h" -  namespace crepe {  /**   * \brief Main game loop manager diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h index 40c6bf1..b08c8db 100644 --- a/src/crepe/api/Rigidbody.h +++ b/src/crepe/api/Rigidbody.h @@ -53,7 +53,7 @@ public:  	 */  	struct Data {  		//! objects mass -		float mass = 0.0; +		float mass = 1;  		/**  		* \brief Gravity scale factor.  		* @@ -79,7 +79,7 @@ public:  		//! Linear velocity of the object (speed and direction).  		vec2 linear_velocity;  		//! Maximum linear velocity of the object. This limits the object's speed. -		vec2 max_linear_velocity = {INFINITY, INFINITY}; +		float max_linear_velocity = INFINITY;  		//! Linear velocity coefficient. This scales the object's velocity for adjustment or damping.  		vec2 linear_velocity_coefficient = {1, 1};  		//! \} diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 38d12f6..274c14a 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -2,6 +2,7 @@  #include <SDL2/SDL_blendmode.h>  #include <SDL2/SDL_image.h>  #include <SDL2/SDL_keycode.h> +#include <SDL2/SDL_pixels.h>  #include <SDL2/SDL_rect.h>  #include <SDL2/SDL_render.h>  #include <SDL2/SDL_surface.h> @@ -236,15 +237,12 @@ SDL_FRect SDLContext::get_dst_rect(const DestinationRectangleData & ctx) const {  	if (data.size.y == 0 && data.size.x != 0) {  		size.y = data.size.x / aspect_ratio;  	} +	size *= cam_aux_data.render_scale * ctx.img_scale * data.scale_offset; -	const CameraValues & cam = ctx.cam; - -	size *= cam.render_scale * ctx.img_scale * data.scale_offset; - -	vec2 screen_pos -		= (ctx.pos + data.position_offset - cam.cam_pos + (cam.zoomed_viewport) / 2) -			  * cam.render_scale -		  - size / 2 + cam.bar_size; +	vec2 screen_pos = (ctx.pos + data.position_offset - cam_aux_data.cam_pos +					   + (cam_aux_data.zoomed_viewport) / 2) +						  * cam_aux_data.render_scale +					  - size / 2 + cam_aux_data.bar_size;  	return SDL_FRect{  		.x = screen_pos.x, @@ -273,7 +271,6 @@ void SDLContext::draw(const RenderContext & ctx) {  	SDL_FRect dstrect = this->get_dst_rect(SDLContext::DestinationRectangleData{  		.sprite = ctx.sprite,  		.texture = ctx.texture, -		.cam = ctx.cam,  		.pos = ctx.pos,  		.img_scale = ctx.scale,  	}); @@ -285,10 +282,9 @@ void SDLContext::draw(const RenderContext & ctx) {  					  angle, NULL, render_flip);  } -SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { +void SDLContext::update_camera_view(const Camera & cam, const vec2 & new_pos) {  	const Camera::Data & cam_data = cam.data; -	CameraValues ret_cam;  	// resize window  	int w, h;  	SDL_GetWindowSize(this->game_window.get(), &w, &h); @@ -296,9 +292,10 @@ SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) {  		SDL_SetWindowSize(this->game_window.get(), cam.screen.x, cam.screen.y);  	} -	vec2 & zoomed_viewport = ret_cam.zoomed_viewport; -	vec2 & bar_size = ret_cam.bar_size; -	vec2 & render_scale = ret_cam.render_scale; +	vec2 & zoomed_viewport = this->cam_aux_data.zoomed_viewport; +	vec2 & bar_size = this->cam_aux_data.bar_size; +	vec2 & render_scale = this->cam_aux_data.render_scale; +	this->cam_aux_data.cam_pos = new_pos;  	zoomed_viewport = cam.viewport_size * cam_data.zoom;  	float screen_aspect = static_cast<float>(cam.screen.x) / cam.screen.y; @@ -340,8 +337,6 @@ SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) {  	// fill bg color  	SDL_RenderFillRect(this->game_renderer.get(), &bg); - -	return ret_cam;  }  std::unique_ptr<SDL_Texture, std::function<void(SDL_Texture *)>> @@ -377,7 +372,11 @@ ivec2 SDLContext::get_size(const Texture & ctx) {  std::vector<SDLContext::EventData> SDLContext::get_events() {  	std::vector<SDLContext::EventData> event_list;  	SDL_Event event; +	const CameraAuxiliaryData & cam = this->cam_aux_data;  	while (SDL_PollEvent(&event)) { +		ivec2 mouse_pos; +		mouse_pos.x = (event.button.x - cam.bar_size.x) / cam.render_scale.x; +		mouse_pos.y = (event.button.y - cam.bar_size.y) / cam.render_scale.y;  		switch (event.type) {  			case SDL_QUIT:  				event_list.push_back(EventData{ @@ -401,7 +400,7 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {  				event_list.push_back(EventData{  					.event_type = SDLContext::EventType::MOUSEDOWN,  					.mouse_button = sdl_to_mousebutton(event.button.button), -					.mouse_position = {event.button.x, event.button.y}, +					.mouse_position = mouse_pos,  				});  				break;  			case SDL_MOUSEBUTTONUP: { @@ -410,21 +409,21 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {  				event_list.push_back(EventData{  					.event_type = SDLContext::EventType::MOUSEUP,  					.mouse_button = sdl_to_mousebutton(event.button.button), -					.mouse_position = {event.button.x, event.button.y}, +					.mouse_position = mouse_pos,  				});  			} break;  			case SDL_MOUSEMOTION: {  				event_list.push_back(  					EventData{.event_type = SDLContext::EventType::MOUSEMOVE, -							  .mouse_position = {event.motion.x, event.motion.y}, +							  .mouse_position = mouse_pos,  							  .rel_mouse_move = {event.motion.xrel, event.motion.yrel}});  			} break;  			case SDL_MOUSEWHEEL: {  				event_list.push_back(EventData{  					.event_type = SDLContext::EventType::MOUSEWHEEL, -					.mouse_position = {event.motion.x, event.motion.y}, +					.mouse_position = mouse_pos,  					// TODO: why is this needed?  					.scroll_direction = event.wheel.y < 0 ? -1 : 1,  					.scroll_delta = event.wheel.preciseY, diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 957ee32..554880f 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -25,7 +25,6 @@ class Texture;  class Mediator;  /** - * \class SDLContext   * \brief Facade for the SDL library   *   * SDLContext is a singleton that handles the SDL window and renderer, provides methods for @@ -34,7 +33,7 @@ class Mediator;  class SDLContext {  public:  	//! data that the camera component cannot hold -	struct CameraValues { +	struct CameraAuxiliaryData {  		//! zoomed in viewport in game_units  		vec2 zoomed_viewport; @@ -65,7 +64,6 @@ public:  	struct RenderContext {  		const Sprite & sprite;  		const Texture & texture; -		const CameraValues & cam;  		const vec2 & pos;  		const double & angle;  		const double & scale; @@ -194,18 +192,20 @@ public:  	void present_screen();  	/** -	 * \brief sets the background of the camera (will be adjusted in future PR) -	 * \param camera Reference to the Camera object. -	 * \return camera data the component cannot store +	 * \brief calculates camera view settings. such as black_bars, zoomed_viewport, scaling and +	 * adjusting window size. +	 * +	 * \note only supports windowed mode. +	 * \param camera Reference to the current Camera object in the scene. +	 * \param new_pos new camera position from transform and offset  	 */ -	CameraValues set_camera(const Camera & camera); +	void update_camera_view(const Camera & camera, const vec2 & new_pos);  public:  	//! the data needed to construct a sdl dst rectangle  	struct DestinationRectangleData {  		const Sprite & sprite;  		const Texture & texture; -		const CameraValues & cam;  		const vec2 & pos;  		const double & img_scale;  	}; @@ -235,6 +235,13 @@ private:  	//! black bars rectangle to draw  	SDL_FRect black_bars[2] = {}; + +	/** +	 * \cam_aux_data extra data that the component cannot hold. +	 * +	 * - this is defined in this class because get_events() needs this information aswell +	 */ +	CameraAuxiliaryData cam_aux_data;  };  } // namespace crepe diff --git a/src/crepe/system/AISystem.cpp b/src/crepe/system/AISystem.cpp index d231c7c..680dbb8 100644 --- a/src/crepe/system/AISystem.cpp +++ b/src/crepe/system/AISystem.cpp @@ -13,12 +13,10 @@ using namespace std::chrono;  void AISystem::update() {  	const Mediator & mediator = this->mediator;  	ComponentManager & mgr = mediator.component_manager; -	LoopTimerManager & timer = mediator.loop_timer; -	RefVector<AI> ai_components = mgr.get_components_by_type<AI>();  	LoopTimerManager & loop_timer = mediator.loop_timer; +	RefVector<AI> ai_components = mgr.get_components_by_type<AI>(); -	//TODO: Use fixed loop dt (this is not available at master at the moment) -	duration_t dt = loop_timer.get_delta_time(); +	float dt = loop_timer.get_scaled_fixed_delta_time().count();  	// Loop through all AI components  	for (AI & ai : ai_components) { @@ -45,7 +43,7 @@ void AISystem::update() {  		// Calculate the acceleration (using the above calculated force)  		vec2 acceleration = force / rigidbody.data.mass;  		// Finally, update Rigidbody's velocity -		rigidbody.data.linear_velocity += acceleration * duration_cast<seconds>(dt).count(); +		rigidbody.data.linear_velocity += acceleration * dt;  	}  } @@ -146,7 +144,7 @@ vec2 AISystem::arrive(const AI & ai, const Rigidbody & rigidbody,  		}  		float speed = distance / ai.arrive_deceleration; -		speed = std::min(speed, rigidbody.data.max_linear_velocity.length()); +		speed = std::min(speed, rigidbody.data.max_linear_velocity);  		vec2 desired_velocity = to_target * (speed / distance);  		return desired_velocity - rigidbody.data.linear_velocity; diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index ebf4439..3b3b8ab 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -5,88 +5,95 @@  #include "../api/Transform.h"  #include "../api/Vector2.h"  #include "../manager/ComponentManager.h" +#include "../manager/LoopTimerManager.h" +#include "../manager/Mediator.h"  #include "PhysicsSystem.h"  using namespace crepe;  void PhysicsSystem::update() { -	ComponentManager & mgr = this->mediator.component_manager; + +	const Mediator & mediator = this->mediator; +	ComponentManager & mgr = mediator.component_manager; +	LoopTimerManager & loop_timer = mediator.loop_timer;  	RefVector<Rigidbody> rigidbodies = mgr.get_components_by_type<Rigidbody>(); -	RefVector<Transform> transforms = mgr.get_components_by_type<Transform>(); +	float dt = loop_timer.get_scaled_fixed_delta_time().count(); -	double gravity = Config::get_instance().physics.gravity; +	float gravity = Config::get_instance().physics.gravity;  	for (Rigidbody & rigidbody : rigidbodies) {  		if (!rigidbody.active) continue; +		Transform & transform +			= mgr.get_components_by_id<Transform>(rigidbody.game_object_id).front().get();  		switch (rigidbody.data.body_type) {  			case Rigidbody::BodyType::DYNAMIC: -				for (Transform & transform : transforms) { -					if (transform.game_object_id == rigidbody.game_object_id) { +				if (transform.game_object_id == rigidbody.game_object_id) { +					// Add gravity -						// Add 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_velocity_coefficient > 0) { -							rigidbody.data.angular_velocity -								*= rigidbody.data.angular_velocity_coefficient; -						} -						if (rigidbody.data.linear_velocity_coefficient.x > 0 -							&& rigidbody.data.linear_velocity_coefficient.y > 0) { -							rigidbody.data.linear_velocity -								*= rigidbody.data.linear_velocity_coefficient; -						} +					if (rigidbody.data.mass <= 0) { +						throw std::runtime_error("Mass must be greater than 0"); +					} -						// Max velocity check -						if (rigidbody.data.angular_velocity -							> rigidbody.data.max_angular_velocity) { -							rigidbody.data.angular_velocity -								= rigidbody.data.max_angular_velocity; -						} else if (rigidbody.data.angular_velocity -								   < -rigidbody.data.max_angular_velocity) { -							rigidbody.data.angular_velocity -								= -rigidbody.data.max_angular_velocity; -						} +					if (gravity <= 0) { +						throw std::runtime_error("Config Gravity must be greater than 0"); +					} -						if (rigidbody.data.linear_velocity.x -							> rigidbody.data.max_linear_velocity.x) { -							rigidbody.data.linear_velocity.x -								= rigidbody.data.max_linear_velocity.x; -						} else if (rigidbody.data.linear_velocity.x -								   < -rigidbody.data.max_linear_velocity.x) { -							rigidbody.data.linear_velocity.x -								= -rigidbody.data.max_linear_velocity.x; -						} +					if (rigidbody.data.gravity_scale > 0 && !rigidbody.data.constraints.y) { +						rigidbody.data.linear_velocity.y +							+= (rigidbody.data.mass * rigidbody.data.gravity_scale * gravity +								* dt); +					} +					// Add coefficient rotation +					if (rigidbody.data.angular_velocity_coefficient > 0) { +						rigidbody.data.angular_velocity +							*= std::pow(rigidbody.data.angular_velocity_coefficient, dt); +					} -						if (rigidbody.data.linear_velocity.y -							> rigidbody.data.max_linear_velocity.y) { -							rigidbody.data.linear_velocity.y -								= rigidbody.data.max_linear_velocity.y; -						} else if (rigidbody.data.linear_velocity.y -								   < -rigidbody.data.max_linear_velocity.y) { -							rigidbody.data.linear_velocity.y -								= -rigidbody.data.max_linear_velocity.y; -						} +					// Add coefficient movement horizontal +					if (rigidbody.data.linear_velocity_coefficient.x > 0 +						&& !rigidbody.data.constraints.x) { +						rigidbody.data.linear_velocity.x +							*= std::pow(rigidbody.data.linear_velocity_coefficient.x, dt); +					} -						// Move object -						if (!rigidbody.data.constraints.rotation) { -							transform.rotation += rigidbody.data.angular_velocity; -							transform.rotation = std::fmod(transform.rotation, 360.0); -							if (transform.rotation < 0) { -								transform.rotation += 360.0; -							} -						} -						if (!rigidbody.data.constraints.x) { -							transform.position.x += rigidbody.data.linear_velocity.x; -						} -						if (!rigidbody.data.constraints.y) { -							transform.position.y += rigidbody.data.linear_velocity.y; +					// Add coefficient movement horizontal +					if (rigidbody.data.linear_velocity_coefficient.y > 0 +						&& !rigidbody.data.constraints.y) { +						rigidbody.data.linear_velocity.y +							*= std::pow(rigidbody.data.linear_velocity_coefficient.y, dt); +					} + +					// Max velocity check +					if (rigidbody.data.angular_velocity +						> rigidbody.data.max_angular_velocity) { +						rigidbody.data.angular_velocity = rigidbody.data.max_angular_velocity; +					} else if (rigidbody.data.angular_velocity +							   < -rigidbody.data.max_angular_velocity) { +						rigidbody.data.angular_velocity = -rigidbody.data.max_angular_velocity; +					} + +					// Set max velocity to maximum length +					if (rigidbody.data.linear_velocity.length() +						> rigidbody.data.max_linear_velocity) { +						rigidbody.data.linear_velocity.normalize(); +						rigidbody.data.linear_velocity *= rigidbody.data.max_linear_velocity; +					} + +					// Move object +					if (!rigidbody.data.constraints.rotation) { +						transform.rotation += rigidbody.data.angular_velocity * dt; +						transform.rotation = std::fmod(transform.rotation, 360.0); +						if (transform.rotation < 0) { +							transform.rotation += 360.0;  						}  					} +					if (!rigidbody.data.constraints.x) { +						transform.position.x += rigidbody.data.linear_velocity.x * dt; +					} +					if (!rigidbody.data.constraints.y) { +						transform.position.y += rigidbody.data.linear_velocity.y * dt; +					}  				}  				break;  			case Rigidbody::BodyType::KINEMATIC: diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 51340fb..afd9548 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -15,6 +15,7 @@  #include "../manager/ResourceManager.h"  #include "RenderSystem.h" +#include "types.h"  using namespace crepe;  using namespace std; @@ -29,7 +30,7 @@ void RenderSystem::present_screen() {  	ctx.present_screen();  } -SDLContext::CameraValues RenderSystem::update_camera() { +void RenderSystem::update_camera() {  	ComponentManager & mgr = this->mediator.component_manager;  	SDLContext & ctx = this->mediator.sdl_context;  	RefVector<Camera> cameras = mgr.get_components_by_type<Camera>(); @@ -40,9 +41,9 @@ SDLContext::CameraValues RenderSystem::update_camera() {  		if (!cam.active) continue;  		const Transform & transform  			= mgr.get_components_by_id<Transform>(cam.game_object_id).front().get(); -		SDLContext::CameraValues cam_val = ctx.set_camera(cam); -		cam_val.cam_pos = transform.position + cam.data.postion_offset; -		return cam_val; +		vec2 new_camera_pos = transform.position + cam.data.postion_offset; +		ctx.update_camera_view(cam, new_camera_pos); +		return;  	}  	throw std::runtime_error("No active cameras in current scene");  } @@ -69,8 +70,7 @@ void RenderSystem::update() {  	this->present_screen();  } -bool RenderSystem::render_particle(const Sprite & sprite, const SDLContext::CameraValues & cam, -								   const double & scale) { +bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) {  	ComponentManager & mgr = this->mediator.component_manager;  	SDLContext & ctx = this->mediator.sdl_context; @@ -93,7 +93,6 @@ bool RenderSystem::render_particle(const Sprite & sprite, const SDLContext::Came  			ctx.draw(SDLContext::RenderContext{  				.sprite = sprite,  				.texture = res, -				.cam = cam,  				.pos = p.position,  				.angle = p.angle,  				.scale = scale, @@ -102,8 +101,7 @@ bool RenderSystem::render_particle(const Sprite & sprite, const SDLContext::Came  	}  	return rendering_particles;  } -void RenderSystem::render_normal(const Sprite & sprite, const SDLContext::CameraValues & cam, -								 const Transform & tm) { +void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) {  	SDLContext & ctx = this->mediator.sdl_context;  	ResourceManager & resource_manager = this->mediator.resource_manager;  	const Texture & res = resource_manager.get<Texture>(sprite.source); @@ -111,7 +109,6 @@ void RenderSystem::render_normal(const Sprite & sprite, const SDLContext::Camera  	ctx.draw(SDLContext::RenderContext{  		.sprite = sprite,  		.texture = res, -		.cam = cam,  		.pos = tm.position,  		.angle = tm.rotation,  		.scale = tm.scale, @@ -120,7 +117,7 @@ void RenderSystem::render_normal(const Sprite & sprite, const SDLContext::Camera  void RenderSystem::render() {  	ComponentManager & mgr = this->mediator.component_manager; -	const SDLContext::CameraValues & cam = this->update_camera(); +	this->update_camera();  	RefVector<Sprite> sprites = mgr.get_components_by_type<Sprite>();  	RefVector<Sprite> sorted_sprites = this->sort(sprites); @@ -130,10 +127,10 @@ void RenderSystem::render() {  		const Transform & transform  			= mgr.get_components_by_id<Transform>(sprite.game_object_id).front().get(); -		bool rendered_particles = this->render_particle(sprite, cam, transform.scale); +		bool rendered_particles = this->render_particle(sprite, transform.scale);  		if (rendered_particles) continue; -		this->render_normal(sprite, cam, transform); +		this->render_normal(sprite, transform);  	}  } diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index e270a6b..fc7b46e 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -2,8 +2,6 @@  #include <cmath> -#include "facade/SDLContext.h" -  #include "System.h"  #include "types.h" @@ -14,7 +12,6 @@ class Sprite;  class Transform;  /** - * \class RenderSystem   * \brief Manages rendering operations for all game objects.   *   * RenderSystem is responsible for rendering, clearing and presenting the screen, and @@ -37,7 +34,7 @@ private:  	void present_screen();  	//! Updates the active camera used for rendering. -	SDLContext::CameraValues update_camera(); +	void update_camera();  	//! Renders the whole screen  	void render(); @@ -52,8 +49,7 @@ private:  	 *  constructor is now protected i cannot make tmp inside  	 * \return true if particles have been rendered  	 */ -	bool render_particle(const Sprite & sprite, const SDLContext::CameraValues & cam, -						 const double & scale); +	bool render_particle(const Sprite & sprite, const double & scale);  	/**  	 * \brief renders a sprite with a Transform component on the screen @@ -61,8 +57,7 @@ private:  	 * \param sprite  the sprite component that holds all the data  	 * \param tm the Transform component that holds the position,rotation and scale  	 */ -	void render_normal(const Sprite & sprite, const SDLContext::CameraValues & cam, -					   const Transform & tm); +	void render_normal(const Sprite & sprite, const Transform & tm);  	/**  	 * \brief sort a vector sprite objects with diff --git a/src/example/AITest.cpp b/src/example/AITest.cpp index f4efc9f..93ba500 100644 --- a/src/example/AITest.cpp +++ b/src/example/AITest.cpp @@ -8,7 +8,6 @@  #include <crepe/api/Scene.h>  #include <crepe/api/Script.h>  #include <crepe/api/Sprite.h> -#include <crepe/api/Texture.h>  #include <crepe/manager/Mediator.h>  #include <crepe/types.h> @@ -47,14 +46,19 @@ public:  		GameObject game_object1 = mgr.new_object("", "", vec2{0, 0}, 0, 1);  		GameObject game_object2 = mgr.new_object("", "", vec2{0, 0}, 0, 1); -		Texture img = Texture("asset/texture/test_ap43.png"); -		game_object1.add_component<Sprite>(img, Sprite::Data{ -													.color = Color::MAGENTA, -													.flip = Sprite::FlipSettings{false, false}, -													.sorting_in_layer = 1, -													.order_in_layer = 1, -													.size = {0, 195}, -												}); +		Asset img{"asset/texture/test_ap43.png"}; + +		Sprite & test_sprite = game_object1.add_component<Sprite>( +			img, Sprite::Data{ +					 .color = Color::MAGENTA, +					 .flip = Sprite::FlipSettings{false, false}, +					 .sorting_in_layer = 2, +					 .order_in_layer = 2, +					 .size = {0, 100}, +					 .angle_offset = 0, +					 .position_offset = {0, 0}, +				 }); +  		AI & ai = game_object1.add_component<AI>(3000);  		// ai.arrive_on();  		// ai.flee_on(); @@ -63,7 +67,7 @@ public:  		ai.make_oval_path(1000, 500, {0, 500}, 4.7124, false);  		game_object1.add_component<Rigidbody>(Rigidbody::Data{  			.mass = 0.1f, -			.max_linear_velocity = {40, 40}, +			.max_linear_velocity = 40,  		});  		game_object1.add_component<BehaviorScript>().set_script<Script1>(); diff --git a/src/example/game.cpp b/src/example/game.cpp index 4239c15..5361f3a 100644 --- a/src/example/game.cpp +++ b/src/example/game.cpp @@ -2,6 +2,7 @@  #include "api/Scene.h"  #include "manager/ComponentManager.h"  #include "manager/Mediator.h" +#include "types.h"  #include <crepe/api/BoxCollider.h>  #include <crepe/api/Camera.h>  #include <crepe/api/Color.h> @@ -11,7 +12,6 @@  #include <crepe/api/Rigidbody.h>  #include <crepe/api/Script.h>  #include <crepe/api/Sprite.h> -#include <crepe/api/Texture.h>  #include <crepe/api/Transform.h>  #include <crepe/api/Vector2.h> @@ -66,6 +66,11 @@ class MyScript1 : public Script {  				//add collider switch  				break;  			} +			case Keycode::Q: { +				Rigidbody & rg = this->get_component<Rigidbody>(); +				rg.data.angular_velocity = 1; +				break; +			}  			default:  				break;  		} @@ -184,15 +189,18 @@ public:  		world.add_component<BoxCollider>(vec2{screen_size_width / 2 + world_collider / 2, 0},  										 vec2{world_collider, world_collider}); // right  		world.add_component<Camera>( -			Color::WHITE,  			ivec2{static_cast<int>(screen_size_width), static_cast<int>(screen_size_height)}, -			vec2{screen_size_width, screen_size_height}, 1.0f); +			vec2{screen_size_width, screen_size_height}, +			Camera::Data{ +				.bg_color = Color::WHITE, +				.zoom = 1, +			});  		GameObject game_object1 = mgr.new_object(  			"Name", "Tag", vec2{screen_size_width / 2, screen_size_height / 2}, 0, 1);  		game_object1.add_component<Rigidbody>(Rigidbody::Data{  			.mass = 1, -			.gravity_scale = 0, +			.gravity_scale = 1,  			.body_type = Rigidbody::BodyType::DYNAMIC,  			.linear_velocity = {0, 0},  			.constraints = {0, 0, 0}, @@ -203,15 +211,20 @@ public:  		// add box with boxcollider  		game_object1.add_component<BoxCollider>(vec2{0, 0}, vec2{20, 20});  		game_object1.add_component<BehaviorScript>().set_script<MyScript1>(); -		auto img1 = Texture("asset/texture/square.png"); -		game_object1.add_component<Sprite>(img1, color, Sprite::FlipSettings{false, false}, 1, -										   1, 20); + +		Asset img1{"asset/texture/square.png"}; +		game_object1.add_component<Sprite>(img1, Sprite::Data{ +													 .size = {20, 20}, +												 });  		//add circle with cirlcecollider deactiveated  		game_object1.add_component<CircleCollider>(vec2{0, 0}, 10).active = false; -		auto img2 = Texture("asset/texture/circle.png"); +		Asset img2{"asset/texture/circle.png"};  		game_object1 -			.add_component<Sprite>(img2, color, Sprite::FlipSettings{false, false}, 1, 1, 20) +			.add_component<Sprite>(img2, +								   Sprite::Data{ +									   .size = {20, 20}, +								   })  			.active  			= false; @@ -230,15 +243,19 @@ public:  		// add box with boxcollider  		game_object2.add_component<BoxCollider>(vec2{0, 0}, vec2{20, 20});  		game_object2.add_component<BehaviorScript>().set_script<MyScript2>(); -		auto img3 = Texture("asset/texture/square.png"); -		game_object2.add_component<Sprite>(img3, color, Sprite::FlipSettings{false, false}, 1, -										   1, 20); + +		game_object2.add_component<Sprite>(img1, Sprite::Data{ +													 .size = {20, 20}, +												 });  		//add circle with cirlcecollider deactiveated  		game_object2.add_component<CircleCollider>(vec2{0, 0}, 10).active = false; -		auto img4 = Texture("asset/texture/circle.png"); +  		game_object2 -			.add_component<Sprite>(img4, color, Sprite::FlipSettings{false, false}, 1, 1, 20) +			.add_component<Sprite>(img2, +								   Sprite::Data{ +									   .size = {20, 20}, +								   })  			.active  			= false;  	} diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index bd4ef95..13e625f 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -1,6 +1,7 @@  #include "api/Asset.h"  #include <crepe/Component.h>  #include <crepe/api/Animator.h> +#include <crepe/api/Button.h>  #include <crepe/api/Camera.h>  #include <crepe/api/Color.h>  #include <crepe/api/GameObject.h> @@ -66,10 +67,21 @@ public:  		//auto & anim = game_object.add_component<Animator>(test_sprite,ivec2{32, 64}, uvec2{4,1}, Animator::Data{});  		//anim.set_anim(0); -		auto & cam = game_object.add_component<Camera>(ivec2{1280, 720}, vec2{400, 400}, +		auto & cam = game_object.add_component<Camera>(ivec2{720, 1280}, vec2{400, 400},  													   Camera::Data{  														   .bg_color = Color::WHITE,  													   }); + +		function<void()> on_click = [&]() { cout << "button clicked" << std::endl; }; +		function<void()> on_enter = [&]() { cout << "enter" << std::endl; }; +		function<void()> on_exit = [&]() { cout << "exit" << std::endl; }; + +		auto & button +			= game_object.add_component<Button>(vec2{200, 200}, vec2{0, 0}, on_click, false); +		button.on_mouse_enter = on_enter; +		button.on_mouse_exit = on_exit; +		button.is_toggle = true; +		button.active = true;  	}  	string get_name() const { return "TestScene"; }; diff --git a/src/test/InputTest.cpp b/src/test/InputTest.cpp index 29ef941..8b40cea 100644 --- a/src/test/InputTest.cpp +++ b/src/test/InputTest.cpp @@ -1,3 +1,4 @@ +#include "system/RenderSystem.h"  #include <gtest/gtest.h>  #define protected public  #define private public @@ -27,14 +28,20 @@ public:  	SDLContext sdl_context{mediator};  	InputSystem input_system{mediator}; +	RenderSystem render{mediator};  	EventManager event_manager{mediator};  	//GameObject camera;  protected:  	void SetUp() override { -		mediator.event_manager = event_manager; -		mediator.component_manager = mgr; -		event_manager.clear(); +		GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); +		auto & camera +			= obj.add_component<Camera>(ivec2{500, 500}, vec2{500, 500}, +										Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); +		render.update(); +		//mediator.event_manager = event_manager; +		//mediator.component_manager = mgr; +		//event_manager.clear();  	}  	void simulate_mouse_click(int mouse_x, int mouse_y, Uint8 mouse_button) { @@ -59,10 +66,6 @@ protected:  };  TEST_F(InputTest, MouseDown) { -	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); -	auto & camera = obj.add_component<Camera>( -		ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); -	camera.active = true;  	bool mouse_triggered = false;  	EventHandler<MousePressEvent> on_mouse_down = [&](const MousePressEvent & event) {  		mouse_triggered = true; @@ -89,10 +92,6 @@ TEST_F(InputTest, MouseDown) {  }  TEST_F(InputTest, MouseUp) { -	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); -	auto & camera = obj.add_component<Camera>( -		ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); -	camera.active = true;  	bool function_triggered = false;  	EventHandler<MouseReleaseEvent> on_mouse_release = [&](const MouseReleaseEvent & e) {  		function_triggered = true; @@ -117,10 +116,6 @@ TEST_F(InputTest, MouseUp) {  }  TEST_F(InputTest, MouseMove) { -	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); -	auto & camera = obj.add_component<Camera>( -		ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); -	camera.active = true;  	bool function_triggered = false;  	EventHandler<MouseMoveEvent> on_mouse_move = [&](const MouseMoveEvent & e) {  		function_triggered = true; @@ -147,10 +142,6 @@ TEST_F(InputTest, MouseMove) {  }  TEST_F(InputTest, KeyDown) { -	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); -	auto & camera = obj.add_component<Camera>( -		ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); -	camera.active = true;  	bool function_triggered = false;  	// Define event handler for KeyPressEvent @@ -178,10 +169,6 @@ TEST_F(InputTest, KeyDown) {  }  TEST_F(InputTest, KeyUp) { -	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); -	auto & camera = obj.add_component<Camera>( -		ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); -	camera.active = true;  	bool function_triggered = false;  	EventHandler<KeyReleaseEvent> on_key_release = [&](const KeyReleaseEvent & event) {  		function_triggered = true; @@ -202,10 +189,6 @@ TEST_F(InputTest, KeyUp) {  }  TEST_F(InputTest, MouseClick) { -	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); -	auto & camera = obj.add_component<Camera>( -		ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); -	camera.active = true;  	bool on_click_triggered = false;  	EventHandler<MouseClickEvent> on_mouse_click = [&](const MouseClickEvent & event) {  		on_click_triggered = true; @@ -223,10 +206,6 @@ TEST_F(InputTest, MouseClick) {  }  TEST_F(InputTest, testButtonClick) { -	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); -	auto & camera = obj.add_component<Camera>( -		ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); -	camera.active = true;  	GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);  	bool button_clicked = false;  	std::function<void()> on_click = [&]() { button_clicked = true; }; @@ -250,10 +229,6 @@ TEST_F(InputTest, testButtonClick) {  }  TEST_F(InputTest, testButtonHover) { -	GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); -	auto & camera = obj.add_component<Camera>( -		ivec2{0, 0}, vec2{500, 500}, Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); -	camera.active = true;  	GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1);  	bool button_clicked = false;  	std::function<void()> on_click = [&]() { button_clicked = true; }; diff --git a/src/test/LoopManagerTest.cpp b/src/test/LoopManagerTest.cpp index af89d64..df132ae 100644 --- a/src/test/LoopManagerTest.cpp +++ b/src/test/LoopManagerTest.cpp @@ -10,7 +10,7 @@  using namespace std::chrono;  using namespace crepe; -class LoopManagerTest : public ::testing::Test { +class DISABLED_LoopManagerTest : public ::testing::Test {  protected:  	class TestGameLoop : public crepe::LoopManager {  	public: @@ -22,7 +22,7 @@ protected:  	void SetUp() override {}  }; -TEST_F(LoopManagerTest, FixedUpdate) { +TEST_F(DISABLED_LoopManagerTest, FixedUpdate) {  	// Arrange  	test_loop.loop_timer.set_target_framerate(60); @@ -43,7 +43,8 @@ TEST_F(LoopManagerTest, FixedUpdate) {  	// Test finished  } -TEST_F(LoopManagerTest, ScaledFixedUpdate) { + +TEST_F(DISABLED_LoopManagerTest, ScaledFixedUpdate) {  	// Arrange  	test_loop.loop_timer.set_target_framerate(60); @@ -64,7 +65,8 @@ TEST_F(LoopManagerTest, ScaledFixedUpdate) {  	// Test finished  } -TEST_F(LoopManagerTest, ShutDown) { + +TEST_F(DISABLED_LoopManagerTest, ShutDown) {  	// Arrange  	test_loop.loop_timer.set_target_framerate(60);  	// Start the loop in a separate thread diff --git a/src/test/LoopTimerTest.cpp b/src/test/LoopTimerTest.cpp index 5e1eccf..d76bf45 100644 --- a/src/test/LoopTimerTest.cpp +++ b/src/test/LoopTimerTest.cpp @@ -1,10 +1,13 @@  #include <chrono>  #include <gtest/gtest.h>  #include <thread> +  #define private public  #define protected public +  #include <crepe/manager/LoopTimerManager.h>  #include <crepe/manager/Mediator.h> +  using namespace std::chrono;  using namespace crepe; @@ -57,7 +60,7 @@ TEST_F(LoopTimerTest, DeltaTimeCalculation) {  	ASSERT_NEAR(delta_time.count(), elapsed_time, 1);  } -TEST_F(LoopTimerTest, getCurrentTime) { +TEST_F(LoopTimerTest, DISABLED_getCurrentTime) {  	// Set the target FPS to 60 (16.67 ms per frame)  	loop_timer.set_target_framerate(60); diff --git a/src/test/PhysicsTest.cpp b/src/test/PhysicsTest.cpp index 43d2931..3afb3c7 100644 --- a/src/test/PhysicsTest.cpp +++ b/src/test/PhysicsTest.cpp @@ -3,6 +3,8 @@  #include <crepe/api/Rigidbody.h>  #include <crepe/api/Transform.h>  #include <crepe/manager/ComponentManager.h> +#include <crepe/manager/LoopTimerManager.h> +#include <crepe/manager/Mediator.h>  #include <crepe/system/PhysicsSystem.h>  #include <gtest/gtest.h> @@ -16,6 +18,7 @@ class PhysicsTest : public ::testing::Test {  public:  	ComponentManager component_manager{m};  	PhysicsSystem system{m}; +	LoopTimerManager loop_timer{m};  	void SetUp() override {  		ComponentManager & mgr = this->component_manager; @@ -27,7 +30,7 @@ public:  				.mass = 1,  				.gravity_scale = 1,  				.body_type = Rigidbody::BodyType::DYNAMIC, -				.max_linear_velocity = vec2{10, 10}, +				.max_linear_velocity = 10,  				.max_angular_velocity = 10,  				.constraints = {0, 0},  			}); @@ -55,39 +58,40 @@ TEST_F(PhysicsTest, gravity) {  	EXPECT_EQ(transform.position.y, 0);  	system.update(); -	EXPECT_EQ(transform.position.y, 1); +	EXPECT_NEAR(transform.position.y, 0.0004, 0.0001);  	system.update(); -	EXPECT_EQ(transform.position.y, 3); +	EXPECT_NEAR(transform.position.y, 0.002, 0.001);  }  TEST_F(PhysicsTest, max_velocity) {  	ComponentManager & mgr = this->component_manager;  	vector<reference_wrapper<Rigidbody>> rigidbodies = mgr.get_components_by_id<Rigidbody>(0);  	Rigidbody & rigidbody = rigidbodies.front().get(); +	rigidbody.data.gravity_scale = 0;  	ASSERT_FALSE(rigidbodies.empty());  	EXPECT_EQ(rigidbody.data.linear_velocity.y, 0);  	rigidbody.add_force_linear({100, 100});  	rigidbody.add_force_angular(100);  	system.update(); -	EXPECT_EQ(rigidbody.data.linear_velocity.y, 10); -	EXPECT_EQ(rigidbody.data.linear_velocity.x, 10); +	EXPECT_NEAR(rigidbody.data.linear_velocity.y, 7.07, 0.01); +	EXPECT_NEAR(rigidbody.data.linear_velocity.x, 7.07, 0.01);  	EXPECT_EQ(rigidbody.data.angular_velocity, 10);  	rigidbody.add_force_linear({-100, -100});  	rigidbody.add_force_angular(-100);  	system.update(); -	EXPECT_EQ(rigidbody.data.linear_velocity.y, -10); -	EXPECT_EQ(rigidbody.data.linear_velocity.x, -10); +	EXPECT_NEAR(rigidbody.data.linear_velocity.y, -7.07, 0.01); +	EXPECT_NEAR(rigidbody.data.linear_velocity.x, -7.07, 0.01);  	EXPECT_EQ(rigidbody.data.angular_velocity, -10);  }  TEST_F(PhysicsTest, movement) { -	Config::get_instance().physics.gravity = 0;  	ComponentManager & mgr = this->component_manager;  	vector<reference_wrapper<Rigidbody>> rigidbodies = mgr.get_components_by_id<Rigidbody>(0);  	Rigidbody & rigidbody = rigidbodies.front().get(); +	rigidbody.data.gravity_scale = 0;  	vector<reference_wrapper<Transform>> transforms = mgr.get_components_by_id<Transform>(0);  	const Transform & transform = transforms.front().get();  	ASSERT_FALSE(rigidbodies.empty()); @@ -96,31 +100,33 @@ TEST_F(PhysicsTest, movement) {  	rigidbody.add_force_linear({1, 1});  	rigidbody.add_force_angular(1);  	system.update(); -	EXPECT_EQ(transform.position.x, 1); -	EXPECT_EQ(transform.position.y, 1); -	EXPECT_EQ(transform.rotation, 1); +	EXPECT_NEAR(transform.position.x, 0.02, 0.001); +	EXPECT_NEAR(transform.position.y, 0.02, 0.001); +	EXPECT_NEAR(transform.rotation, 0.02, 0.001);  	rigidbody.data.constraints = {1, 1, 1}; -	EXPECT_EQ(transform.position.x, 1); -	EXPECT_EQ(transform.position.y, 1); -	EXPECT_EQ(transform.rotation, 1); - +	EXPECT_NEAR(transform.position.x, 0.02, 0.001); +	EXPECT_NEAR(transform.position.y, 0.02, 0.001); +	EXPECT_NEAR(transform.rotation, 0.02, 0.001); +	rigidbody.data.constraints = {0, 0, 0};  	rigidbody.data.linear_velocity_coefficient.x = 0.5;  	rigidbody.data.linear_velocity_coefficient.y = 0.5;  	rigidbody.data.angular_velocity_coefficient = 0.5;  	system.update(); -	EXPECT_EQ(rigidbody.data.linear_velocity.x, 0.5); -	EXPECT_EQ(rigidbody.data.linear_velocity.y, 0.5); -	EXPECT_EQ(rigidbody.data.angular_velocity, 0.5); +	EXPECT_NEAR(rigidbody.data.linear_velocity.x, 0.98, 0.01); +	EXPECT_NEAR(rigidbody.data.linear_velocity.y, 0.98, 0.01); +	EXPECT_NEAR(rigidbody.data.angular_velocity, 0.98, 0.01);  	rigidbody.data.constraints = {1, 1, 0};  	rigidbody.data.angular_velocity_coefficient = 0;  	rigidbody.data.max_angular_velocity = 1000;  	rigidbody.data.angular_velocity = 360;  	system.update(); -	EXPECT_EQ(transform.rotation, 1); +	EXPECT_NEAR(transform.rotation, 7.24, 0.01);  	rigidbody.data.angular_velocity = -360;  	system.update(); -	EXPECT_EQ(transform.rotation, 1); +	EXPECT_NEAR(transform.rotation, 0.04, 0.001); +	system.update(); +	EXPECT_NEAR(transform.rotation, 352.84, 0.01);  } diff --git a/src/test/Profiling.cpp b/src/test/Profiling.cpp index cc4c637..35f52dc 100644 --- a/src/test/Profiling.cpp +++ b/src/test/Profiling.cpp @@ -17,6 +17,7 @@  #include <crepe/api/Rigidbody.h>  #include <crepe/api/Script.h>  #include <crepe/api/Transform.h> +#include <crepe/facade/SDLContext.h>  #include <crepe/manager/ComponentManager.h>  #include <crepe/manager/EventManager.h>  #include <crepe/system/CollisionSystem.h> |