aboutsummaryrefslogtreecommitdiff
path: root/src/crepe
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe')
-rw-r--r--src/crepe/facade/SDLContext.cpp15
-rw-r--r--src/crepe/facade/SDLContext.h27
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};
};