diff options
| -rw-r--r-- | src/crepe/facade/SDLContext.cpp | 15 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.h | 27 | 
2 files changed, 33 insertions, 9 deletions
| diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 4619c46..778e746 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -167,6 +167,7 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform,  void SDLContext::set_camera(const Camera & cam, Vector2 & scale) { +	// resize window  	if (this->viewport.w != (int) cam.screen.x && this->viewport.h != (int) cam.screen.y) {  		SDL_SetWindowSize(this->game_window.get(), (int) cam.screen.x, (int) cam.screen.y);  		this->viewport.h = cam.screen.y; @@ -175,33 +176,43 @@ void SDLContext::set_camera(const Camera & cam, Vector2 & scale) {  	double screen_aspect = cam.screen.x / cam.screen.y;  	double viewport_aspect = cam.viewport.x / cam.viewport.y; - +	 +	// decide scaling factor for world to screen  	scale = cam.screen / cam.viewport * cam.zoom;  	SDL_Rect view; - +	 +	// calculate black bars  	if (screen_aspect > viewport_aspect) { +		// lettorboxing  		view.h = static_cast<int>(cam.screen.y / cam.zoom);  		view.w = static_cast<int>(cam.screen.y * viewport_aspect);  		view.x = static_cast<int>(cam.screen.x - view.w) / 2;  		view.y = 0;  	} else { +		// pillarboxing  		view.h = static_cast<int>(cam.screen.x / viewport_aspect);  		view.w = static_cast<int>(cam.screen.x / cam.zoom);  		view.x = 0;  		view.y = static_cast<int>(cam.screen.y - view.h) / 2;  	} + +	// set drawing area   	SDL_RenderSetViewport(this->game_renderer.get(), &view);  	SDL_RenderSetLogicalSize(this->game_renderer.get(), cam.viewport.x, cam.viewport.y); + +	// set bg color  	SDL_SetRenderDrawColor(this->game_renderer.get(), cam.bg_color.r, cam.bg_color.g,  						   cam.bg_color.b, cam.bg_color.a); +  	SDL_Rect bg = {  		.x = 0,  		.y = 0,  		.w = static_cast<int>(cam.viewport.x),  		.h = static_cast<int>(cam.viewport.y),  	}; +	// fill bg color  	SDL_RenderFillRect(this->game_renderer.get(), &bg);  } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 4d97699..03f9ec9 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -116,11 +116,22 @@ private:  	 * \brief Draws a sprite to the screen using the specified transform and camera.  	 * \param sprite Reference to the Sprite to draw.  	 * \param transform Reference to the Transform for positioning. -	 * \param camera Reference to the Camera for view adjustments. +	 * \param cam_pos position of the current camera in the scene +	 * \param cam_scale multiplier for the world to screen  	 */  	void draw(const Sprite & sprite, const Transform & transform, const Vector2 & cam_pos,  			  const Vector2 & cam_scale); +	/** +	 * \brief Draws a particle to the screen using the specified parameters +	 * +	 * \param  sprite Referenceto the sprite to draw +	 * \param  pos particle position in world units  +	 * \param  angle particle angle in degrees +	 * \param  cam_pos camera position in world units +	 * \param  img_scale scalar multiplier to increase image size  +	 * \param  cam_scale camera scalar for world to screen +	 */  	void draw_particle(const Sprite & sprite, const Vector2 & pos, const double & angle,  					   const Vector2 & cam_pos, const double & img_scale,  					   const Vector2 & cam_scale); @@ -145,14 +156,15 @@ private:  	 * \return sdl rectangle to draw a src image  	 */  	SDL_Rect get_src_rect(const Sprite & sprite) const; +  	/** -	 * \brief calculates the sqaure size of the image for an destination +	 * \brief calculates the sqaure size of the image for destination  	 * -	 * \param sprite Reference to the sprite to calculate the rectangle -	 * \param pos the pos in pixel positions -	 * \param scale the multiplier to increase of decrease for the specified sprite  -	 * \param cam Reference to the current camera in the scene to calculate the position based -	 * on the camera  +	 * \param sprite Reference to the sprite to calculate rectangle +	 * \param pos the pos in world units +	 * \param cam_pos the camera position in world units +	 * \param img_scale the image multiplier for increasing img size  +	 * \param scale the multiplier for world to screen   	 * \return sdl rectangle to draw a dst image to draw on the screen  	 */  	SDL_Rect get_dst_rect(const Sprite & sprite, const Vector2 & pos, const Vector2 & cam_pos, @@ -166,6 +178,7 @@ private:  	std::unique_ptr<SDL_Renderer, std::function<void(SDL_Renderer *)>> game_renderer;  	//! viewport for the camera window +	//todo change this so that it becomes a vec2 for only width and height  	SDL_Rect viewport = {0, 0, 1280, 720};  }; |