From 88f613cbb2e4aaf3ed55ac0c6490706dd6f6f19d Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 18 Nov 2024 20:12:31 +0100 Subject: rendering based on world unites instead of pixels --- src/crepe/api/Animator.cpp | 2 +- src/crepe/api/Camera.h | 39 +++++++++++++++---------------------- src/crepe/facade/SDLContext.cpp | 36 ++++++++++++++-------------------- src/crepe/facade/SDLContext.h | 2 +- src/crepe/system/AnimatorSystem.cpp | 3 ++- src/crepe/system/AnimatorSystem.h | 3 +-- src/crepe/system/RenderSystem.cpp | 1 - src/example/rendering.cpp | 9 +++++++-- 8 files changed, 43 insertions(+), 52 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index 464b0fd..f3d809c 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -18,7 +18,7 @@ Animator::Animator(game_object_id_t id, Sprite & ss, int row, int col, int col_a animator_rect.h /= col; animator_rect.w /= row; animator_rect.x = 0; - animator_rect.y = col_animator * animator_rect.h; + animator_rect.y = (col_animator - 1)* animator_rect.h; this->active = false; } Animator::~Animator() { dbg_trace(); } diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index 73d4ef4..dfccd24 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -28,32 +28,25 @@ public: //! Background color of the camera view. Color bg_color; - Vector2 pos = {0,0}; - - Vector2 screen = {640,480}; - - Vector2 viewport = {500,500}; - - /* - //! screen width in pixel coordinates - double screen_w = 480; - - //! screen height in pixel coordinates - double screen_h = 640; - - //! screen widht in world units - double viewport_w = 500.0f; - - //! screen height in world units - double viewport_h = 500.0f; + /** + * \pos The position of the camera in world units + */ + Vector2 pos = {0, 0}; - //! X-coordinate of the camera position. in world space - double x = 0.0; + /** + * \screen the display size in pixels ( output resolution ) + */ + Vector2 screen = {640, 480}; - //! Y-coordinate of the camera position. in world space - double y = 0.0; + /** + * \viewport is the area of the world visible through the camera (in world units) + */ + Vector2 viewport = {500, 500}; - */ + /** + * \scale scaling factor from world units to pixel coordinates + */ + Vector2 scale = {0,0}; //! Zoom level of the camera view. double zoom = 1.0f; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 5185adc..785b285 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -111,21 +111,10 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); - double screen_aspect = cam.screen.x / cam.screen.y; - double viewport_aspect = cam.viewport.x / cam.viewport.y; - Vector2 scale; - if (screen_aspect > viewport_aspect) { - scale.x = scale.y = cam.screen.x / cam.viewport.x; - } else { - scale.y = scale.x = cam.screen.y / cam.viewport.y; - } - - Vector2 zoomed_viewport = cam.viewport * cam.zoom; - Vector2 pixel_coord = (transform.position - cam.pos) * scale; - - double pixel_w = sprite.sprite_rect.w * transform.scale * scale.x; - double pixel_h = sprite.sprite_rect.h * transform.scale * scale.y; + Vector2 pixel_coord = (transform.position - cam.pos) * cam.scale; + double pixel_w = sprite.sprite_rect.w * transform.scale * cam.scale.x; + double pixel_h = sprite.sprite_rect.h * transform.scale * cam.scale.y; // decides which part of the sprite will be drawn SDL_Rect srcrect = { @@ -147,7 +136,18 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const &dstrect, transform.rotation, NULL, render_flip); } -void SDLContext::camera(const Camera & cam) { +void SDLContext::camera(Camera & cam) { + + double screen_aspect = cam.screen.x / cam.screen.y; + double viewport_aspect = cam.viewport.x / cam.viewport.y; + Vector2 zoomed_viewport = cam.viewport * cam.zoom; + + if (screen_aspect > viewport_aspect) { + cam.scale.x = cam.scale.y = cam.screen.x / zoomed_viewport.x; + } else { + cam.scale.y = cam.scale.x = cam.screen.y / zoomed_viewport.y; + } + if (this->viewport.w != cam.screen.x && this->viewport.h != cam.screen.y) { this->viewport.w = cam.screen.x; @@ -155,12 +155,6 @@ void SDLContext::camera(const Camera & cam) { SDL_SetWindowSize(this->game_window.get(), cam.screen.x , cam.screen.y); } - /* - this->viewport.x = static_cast(cam.x) - (SCREEN_WIDTH / 2); - this->viewport.y = static_cast(cam.y) - (SCREEN_HEIGHT / 2); - - */ - SDL_SetRenderDrawColor(this->game_renderer.get(), cam.bg_color.r, cam.bg_color.g, cam.bg_color.b, cam.bg_color.a); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 007092b..b69e509 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -137,7 +137,7 @@ private: * \brief Sets the current camera for rendering. * \param camera Reference to the Camera object. */ - void camera(const Camera & camera); + void camera(Camera & camera); private: //! sdl Window diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp index 9d18873..ceb5bfd 100644 --- a/src/crepe/system/AnimatorSystem.cpp +++ b/src/crepe/system/AnimatorSystem.cpp @@ -3,8 +3,8 @@ #include #include "api/Animator.h" -#include "facade/SDLContext.h" +#include "facade/SDLContext.h" #include "AnimatorSystem.h" #include "ComponentManager.h" @@ -19,6 +19,7 @@ void AnimatorSystem::update() { uint64_t tick = SDLContext::get_instance().get_ticks(); for (Animator & a : animations) { if (a.active) { + // (10 frames per second) a.curr_row = (tick / 100) % a.row; a.animator_rect.x = (a.curr_row * a.animator_rect.w) + a.curr_col; a.spritesheet.sprite_rect = a.animator_rect; diff --git a/src/crepe/system/AnimatorSystem.h b/src/crepe/system/AnimatorSystem.h index 56cc7b3..f8179a9 100644 --- a/src/crepe/system/AnimatorSystem.h +++ b/src/crepe/system/AnimatorSystem.h @@ -21,12 +21,11 @@ public: /** * \brief Updates the Animator components. * - * This method is called periodically (likely every frame) to update the state of all + * This method is called to update the state of all * Animator components, moving the animations forward and managing their behavior (e.g., * looping). */ void update() override; - // FIXME: never say "likely" in the documentation lmao }; } // namespace crepe diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index fa3d0de..989a82f 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -5,7 +5,6 @@ #include "../api/Sprite.h" #include "../api/Transform.h" #include "../facade/SDLContext.h" -#include "../util/Log.h" #include "RenderSystem.h" diff --git a/src/example/rendering.cpp b/src/example/rendering.cpp index 3631c76..1db57e5 100644 --- a/src/example/rendering.cpp +++ b/src/example/rendering.cpp @@ -1,4 +1,6 @@ +#include "api/Animator.h" #include "api/Camera.h" +#include "system/AnimatorSystem.h" #include #include #include @@ -22,6 +24,7 @@ int main() { ComponentManager mgr{}; RenderSystem sys{mgr}; + AnimatorSystem anim_sys {mgr}; GameObject obj = mgr.new_object("name", "tag", Vector2{250, 0}, 0, 1); GameObject obj1 = mgr.new_object("name", "tag", Vector2{500, 0}, 1, 0.1); @@ -30,10 +33,10 @@ int main() { // Normal adding components { Color color(0, 0, 0, 0); - obj.add_component(make_shared("../asset/texture/img.png"), color, + Sprite & sprite = obj.add_component(make_shared("../asset/spritesheet/spritesheet_test.png"), color, FlipSettings{false, false}); Camera & cam = obj.add_component(Color::get_red()); - + obj.add_component(sprite, 4,1,1).active = true; } /* { @@ -51,8 +54,10 @@ int main() { } */ + auto start = std::chrono::steady_clock::now(); while (std::chrono::steady_clock::now() - start < std::chrono::seconds(5)) { + anim_sys.update(); sys.update(); } } -- cgit v1.2.3