From 767f40a61952892d60d204ecaaffa07e7e396d28 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 14 Nov 2024 10:05:08 +0100 Subject: color paremeter in sprite works --- src/crepe/facade/SDLContext.cpp | 15 +++++++++++++++ src/crepe/facade/SDLContext.h | 23 +++++++++++++++++++++++ src/crepe/system/RenderSystem.h | 1 + src/example/rendering.cpp | 2 +- src/example/rendering_particle.cpp | 4 ++-- 5 files changed, 42 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 378ccee..4bc4cf8 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -6,10 +6,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include "../api/Sprite.h" @@ -110,6 +112,13 @@ void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()); } +void SDLContext::set_rbg_texture(const std::shared_ptr& texture, const uint8_t& r, const uint8_t& g, const uint8_t& b){ + SDL_SetTextureColorMod(texture->texture.get(), r, g, b); +} +void SDLContext::set_alpha_texture(const std::shared_ptr& texture, const uint8_t& alpha){ + SDL_SetTextureAlphaMod(texture->texture.get(), alpha ); +} + void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Camera & cam) { @@ -117,6 +126,11 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); + sprite.sprite_image->texture.get(); + + this->set_rbg_texture(sprite.sprite_image, sprite.color.r, sprite.color.g, sprite.color.b); + this->set_alpha_texture(sprite.sprite_image, sprite.color.a); + double adjusted_x = (transform.position.x - cam.x) * cam.zoom; double adjusted_y = (transform.position.y - cam.y) * cam.zoom; double adjusted_w = sprite.sprite_rect.w * transform.scale * cam.zoom; @@ -129,6 +143,7 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, .h = sprite.sprite_rect.h, }; + SDL_Rect dstrect = { .x = static_cast(adjusted_x), .y = static_cast(adjusted_y), diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index c4392bd..5b5ee3e 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -145,6 +146,28 @@ private: */ void camera(const Camera & camera); + /** + * \brief changes the texture rbg values with the given parameters + * it sets the allowed color inside a image. So if all the colors are 255 (MAXIMUM) + * it will show the given texture. however if the one of the colors is reduced it will reduce the + * + * + * \param texture the given texture to adjust + * \param r Red color + * \param g Green color + * \param b Blue color + */ + void set_rbg_texture(const std::shared_ptr& texture, const uint8_t& r, const uint8_t& g, const uint8_t& b); + + + /** + * \brief Modifies the transparency of the given texture + * + * \param texture modify the given texture alpha channel + * \param alpha alpha channel + */ + void set_alpha_texture(const std::shared_ptr& texture, const uint8_t& alpha); + private: //! sdl Window std::unique_ptr> game_window; diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 468f79b..feefa09 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -59,6 +59,7 @@ private: void render_normal(const Sprite &, const Transform & tm); + /** * \todo Include color handling for sprites. * \todo Add text rendering using SDL_ttf for text components. diff --git a/src/example/rendering.cpp b/src/example/rendering.cpp index a7cb5d6..f481f03 100644 --- a/src/example/rendering.cpp +++ b/src/example/rendering.cpp @@ -33,7 +33,7 @@ int main() { obj.add_component(Color::get_red()); } { - Color color(0, 0, 0, 0); + Color color(255, 0, 0, 0); obj1.add_component(make_shared("../asset/texture/second.png"), color, FlipSettings{true, true}); obj1.add_component(make_shared("../asset/texture/second.png"), color, FlipSettings{true, true}); } diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index dd08354..cb95ede 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -22,9 +22,9 @@ using namespace std; int main(int argc, char * argv[]) { GameObject game_object(0, "", "", Vector2{100, 100}, 0, 0.1); - Color color(0, 0, 0, 0); + Color color(255, 255, 255, 0); Sprite test_sprite = game_object.add_component( - make_shared("../asset/texture/img.png"), color, + make_shared("../asset/texture/img.png"), Color::get_red(), FlipSettings{false, false}); game_object.add_component(ParticleEmitter::Data{ .position = {0, 0}, -- cgit v1.2.3 From 5e6b80ba9fe18143b994a301ab0ba1ba54072b43 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 14 Nov 2024 10:23:04 +0100 Subject: Working color, fucked up git merge --- src/crepe/Particle.cpp | 4 ++-- src/crepe/Particle.h | 7 +++---- src/crepe/api/AssetManager.h | 3 ++- src/crepe/api/ParticleEmitter.cpp | 14 ++++---------- src/crepe/api/ParticleEmitter.h | 14 ++++---------- src/crepe/facade/SDLContext.cpp | 2 +- src/crepe/system/ParticleSystem.cpp | 2 -- src/crepe/system/ParticleSystem.h | 15 ++++++--------- src/crepe/system/PhysicsSystem.h | 10 ++++------ src/crepe/system/RenderSystem.h | 2 -- src/example/rendering.cpp | 7 ++++--- 11 files changed, 30 insertions(+), 50 deletions(-) (limited to 'src') diff --git a/src/crepe/Particle.cpp b/src/crepe/Particle.cpp index ab55f37..582edf4 100644 --- a/src/crepe/Particle.cpp +++ b/src/crepe/Particle.cpp @@ -2,8 +2,8 @@ using namespace crepe; -void Particle::reset(uint32_t lifespan, Vector2 position, Vector2 velocity, - double angle) { +void Particle::reset(uint32_t lifespan, const Vector2 & position, + const Vector2 & velocity, double angle) { // Initialize the particle state this->time_in_life = 0; this->lifespan = lifespan; diff --git a/src/crepe/Particle.h b/src/crepe/Particle.h index 06431bb..3eaebc3 100644 --- a/src/crepe/Particle.h +++ b/src/crepe/Particle.h @@ -30,9 +30,8 @@ public: //! The time the particle has been alive, in milliseconds. uint32_t time_in_life = 0; //! The angle at which the particle is oriented or moving. - double angle; + double angle = 0; - Particle() = default; /** * \brief Resets the particle with new properties. * @@ -44,8 +43,8 @@ public: * \param velocity The initial velocity of the particle. * \param angle The angle of the particle's trajectory or orientation. */ - void reset(uint32_t lifespan, Vector2 position, Vector2 velocity, - double angle); + void reset(uint32_t lifespan, const Vector2 & position, + const Vector2 & velocity, double angle); /** * \brief Updates the particle's state. * diff --git a/src/crepe/api/AssetManager.h b/src/crepe/api/AssetManager.h index dbfaef3..86a9902 100644 --- a/src/crepe/api/AssetManager.h +++ b/src/crepe/api/AssetManager.h @@ -56,7 +56,8 @@ public: * cache. */ template - std::shared_ptr cache(const std::string & file_path, bool reload = false); + std::shared_ptr cache(const std::string & file_path, + bool reload = false); }; } // namespace crepe diff --git a/src/crepe/api/ParticleEmitter.cpp b/src/crepe/api/ParticleEmitter.cpp index e7f298c..35f960d 100644 --- a/src/crepe/api/ParticleEmitter.cpp +++ b/src/crepe/api/ParticleEmitter.cpp @@ -1,18 +1,12 @@ #include "ParticleEmitter.h" -#include "Particle.h" using namespace crepe; -ParticleEmitter::ParticleEmitter(uint32_t game_object_id, const Data & data) - : Component(game_object_id), data(data) { +ParticleEmitter::ParticleEmitter(game_object_id_t game_object_id, + const Data & data) + : Component(game_object_id), + data(data) { for (size_t i = 0; i < this->data.max_particles; i++) { this->data.particles.emplace_back(); } } - -ParticleEmitter::~ParticleEmitter() { - std::vector::iterator it = this->data.particles.begin(); - while (it != this->data.particles.end()) { - it = this->data.particles.erase(it); - } -} diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h index 83a1588..a9e872f 100644 --- a/src/crepe/api/ParticleEmitter.h +++ b/src/crepe/api/ParticleEmitter.h @@ -1,24 +1,21 @@ #pragma once -#include #include #include "Component.h" #include "Particle.h" -#include "Sprite.h" #include "Vector2.h" -// class Sprite; - namespace crepe { +class Sprite; + /** * \brief Data holder for particle emission parameters. * * The ParticleEmitter class stores configuration data for particle properties, * defining the characteristics and boundaries of particle emissions. */ - class ParticleEmitter : public Component { public: /** @@ -48,7 +45,7 @@ public: //! position of the emitter Vector2 position; //! maximum number of particles - const uint32_t max_particles = 0; + const unsigned int max_particles = 0; //! rate of particle emission per update (Lowest value = 0.001 any lower is ignored) double emission_rate = 0; //! min speed of the particles @@ -75,13 +72,10 @@ public: public: /** - * \brief Constructs a ParticleEmitter data holder with specified settings. - * * \param game_object_id Identifier for the game object using this emitter. * \param data Configuration data defining particle properties. */ - ParticleEmitter(uint32_t game_object_id, const Data & data); - ~ParticleEmitter(); + ParticleEmitter(game_object_id_t game_object_id, const Data & data); public: //! Configuration data for particle emission settings. diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 4bc4cf8..c78a3ca 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -174,7 +174,7 @@ SDLContext::texture_from_path(const std::string & path) { SDL_Surface * tmp = IMG_Load(path.c_str()); if (tmp == nullptr) { - tmp = IMG_Load("../asset/texture/ERROR.png"); + tmp = IMG_Load("../asset/texture/ERROR.png"); } std::unique_ptr> diff --git a/src/crepe/system/ParticleSystem.cpp b/src/crepe/system/ParticleSystem.cpp index 4a25b47..e7a3bec 100644 --- a/src/crepe/system/ParticleSystem.cpp +++ b/src/crepe/system/ParticleSystem.cpp @@ -11,8 +11,6 @@ using namespace crepe; -ParticleSystem::ParticleSystem() {} - void ParticleSystem::update() { // Get all emitters ComponentManager & mgr = ComponentManager::get_instance(); diff --git a/src/crepe/system/ParticleSystem.h b/src/crepe/system/ParticleSystem.h index 3155df1..d7ca148 100644 --- a/src/crepe/system/ParticleSystem.h +++ b/src/crepe/system/ParticleSystem.h @@ -2,23 +2,20 @@ #include +#include "System.h" + namespace crepe { class ParticleEmitter; class Transform; /** * \brief ParticleSystem class responsible for managing particle emission, updates, and bounds checking. */ -class ParticleSystem { +class ParticleSystem : public System { public: - /** - * \brief Default constructor. - */ - ParticleSystem(); - /** * \brief Updates all particle emitters by emitting particles, updating particle states, and checking bounds. */ - void update(); + void update() override; private: /** @@ -66,9 +63,9 @@ private: private: //! Counter to count updates to determine how many times emit_particle is called. - uint32_t update_count = 0; + unsigned int update_count = 0; //! Determines the lowest amount of emission rate (1000 = 0.001 = 1 particle per 1000 updates). - static constexpr uint32_t MAX_UPDATE_COUNT = 100; + static constexpr unsigned int MAX_UPDATE_COUNT = 100; }; } // namespace crepe diff --git a/src/crepe/system/PhysicsSystem.h b/src/crepe/system/PhysicsSystem.h index cc13b70..038c120 100644 --- a/src/crepe/system/PhysicsSystem.h +++ b/src/crepe/system/PhysicsSystem.h @@ -1,5 +1,7 @@ #pragma once +#include "System.h" + namespace crepe { /** * \brief System that controls all physics @@ -7,18 +9,14 @@ namespace crepe { * This class is a physics system that uses a rigidbody and transform * to add physics to a game object. */ -class PhysicsSystem { +class PhysicsSystem : public System { public: - /** - * Constructor is default - */ - PhysicsSystem() = default; /** * \brief updates the physics system. * * It calculates new velocties and changes the postion in the transform. */ - void update(); + void update() override; }; } // namespace crepe diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index feefa09..6529d41 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -61,10 +61,8 @@ private: /** - * \todo Include color handling for sprites. * \todo Add text rendering using SDL_ttf for text components. * \todo Implement a text component and a button component. - * \todo Ensure each sprite is checked for active status before rendering. * \todo Sort all layers by order before rendering. * \todo Consider adding text input functionality. */ diff --git a/src/example/rendering.cpp b/src/example/rendering.cpp index f481f03..827ad07 100644 --- a/src/example/rendering.cpp +++ b/src/example/rendering.cpp @@ -33,9 +33,10 @@ int main() { obj.add_component(Color::get_red()); } { - Color color(255, 0, 0, 0); - obj1.add_component(make_shared("../asset/texture/second.png"), color, FlipSettings{true, true}); - obj1.add_component(make_shared("../asset/texture/second.png"), color, FlipSettings{true, true}); + Color color(0, 0, 0, 0); + obj1.add_component( + make_shared("../asset/texture/second.png"), color, + FlipSettings{true, true}); } /* -- cgit v1.2.3 From 60669b60e63532bc264ecd6d106bd15f0688a5b6 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 14 Nov 2024 20:03:28 +0100 Subject: adapted some files --- asset/texture/img.png | Bin 92742 -> 11476 bytes src/example/rendering_particle.cpp | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/asset/texture/img.png b/asset/texture/img.png index 43b1eca..649a3f1 100644 Binary files a/asset/texture/img.png and b/asset/texture/img.png differ diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index cb95ede..75be7ff 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -22,7 +22,7 @@ using namespace std; int main(int argc, char * argv[]) { GameObject game_object(0, "", "", Vector2{100, 100}, 0, 0.1); - Color color(255, 255, 255, 0); + Color color(255, 255, 255, 255); Sprite test_sprite = game_object.add_component( make_shared("../asset/texture/img.png"), Color::get_red(), FlipSettings{false, false}); -- cgit v1.2.3 From d1f379b8f8b157f0ba4c95940e221fc58463d942 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 18 Nov 2024 14:19:06 +0100 Subject: merged master --- src/crepe/system/RenderSystem.cpp | 18 +++++++----------- src/crepe/system/RenderSystem.h | 7 +++++-- 2 files changed, 12 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 52dd5fc..4abd9bd 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -6,11 +6,9 @@ #include "../api/Sprite.h" #include "../api/Transform.h" #include "../facade/SDLContext.h" -#include "../util/log.h" #include "../api/ParticleEmitter.h" #include "../api/Vector2.h" -#include "Particle.h" #include "RenderSystem.h" using namespace crepe; @@ -30,17 +28,15 @@ void RenderSystem::update_camera() { } bool RenderSystem::render_particle(const Sprite & sprite, - const Transform & tm) { + Transform tm) { - ComponentManager & mgr = ComponentManager::get_instance(); + ComponentManager & mgr = this->component_manager; SDLContext & render = SDLContext::get_instance(); auto emitters = mgr.get_components_by_id(sprite.game_object_id); bool rendering_particles = false; - Transform tmp(0, Vector2{0, 0}, 0, 0); - tmp.scale = tm.scale; for (const ParticleEmitter & em : emitters) { if (!em.active) continue; if (!(em.data.sprite.game_object_id == sprite.game_object_id)) continue; @@ -49,16 +45,16 @@ bool RenderSystem::render_particle(const Sprite & sprite, for (const Particle & p : em.data.particles) { if (!p.active) continue; - tmp.position = p.position; - tmp.rotation = p.angle; - render.draw(em.data.sprite, tmp, *curr_cam); + tm.position = p.position; + tm.rotation = p.angle; + render.draw(em.data.sprite, tm, *curr_cam); } } return rendering_particles; } void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { - ComponentManager & mgr = ComponentManager::get_instance(); + ComponentManager & mgr = this->component_manager; SDLContext & render = SDLContext::get_instance(); render.draw(sprite, tm, *curr_cam); @@ -66,7 +62,7 @@ void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { void RenderSystem::render() { - ComponentManager & mgr = ComponentManager::get_instance(); + ComponentManager & mgr = this->component_manager; auto sprites = mgr.get_components_by_type(); for (const Sprite & sprite : sprites) { diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index ebad05d..6126dfe 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -42,10 +42,13 @@ private: * \brief Renders all the particles on the screen from a given sprite. * * \param sprite renders the particles with given texture - * \param tm the Transform component for scale + * \param tm the Transform component for scale. This is not a const reference because each + * particle has a position and rotation that needs to overwrite the transform position and + * rotation without overwriting the current transform. and because the transform + * constructor is now protected i cannot make tmp inside * \return true if particles have been rendered */ - bool render_particle(const Sprite &, const Transform & tm); + bool render_particle(const Sprite &, Transform tm); void render_normal(const Sprite &, const Transform & tm); -- cgit v1.2.3 From 9288e4964526f1ce6b7d0aca0f075a04f56ede32 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 18 Nov 2024 17:50:17 +0100 Subject: first version world postions with camera --- src/crepe/api/Camera.h | 30 ++++++++++++++++++++------- src/crepe/api/Texture.cpp | 2 +- src/crepe/api/Vector2.cpp | 12 +++++++++++ src/crepe/api/Vector2.h | 7 +++++++ src/crepe/facade/SDLContext.cpp | 45 +++++++++++++++++++++++++++++++---------- src/example/rendering.cpp | 7 +++++-- 6 files changed, 82 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index e0cda34..73d4ef4 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -2,6 +2,7 @@ #include "Color.h" #include "Component.h" +#include "api/Vector2.h" namespace crepe { @@ -27,20 +28,35 @@ public: //! Background color of the camera view. Color bg_color; - //! Aspect ratio height for the camera. - double aspect_height = 480; + Vector2 pos = {0,0}; - //! Aspect ratio width for the camera. - double aspect_width = 640; + Vector2 screen = {640,480}; - //! X-coordinate of the camera position. + 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; + + //! X-coordinate of the camera position. in world space double x = 0.0; - //! Y-coordinate of the camera position. + //! Y-coordinate of the camera position. in world space double y = 0.0; + */ + //! Zoom level of the camera view. - double zoom = 1.0; + double zoom = 1.0f; public: /** diff --git a/src/crepe/api/Texture.cpp b/src/crepe/api/Texture.cpp index de0d0ea..734a5bb 100644 --- a/src/crepe/api/Texture.cpp +++ b/src/crepe/api/Texture.cpp @@ -35,5 +35,5 @@ int Texture::get_width() const { } int Texture::get_height() const { if (this->texture == nullptr) return 0; - return SDLContext::get_instance().get_width(*this); + return SDLContext::get_instance().get_height(*this); } diff --git a/src/crepe/api/Vector2.cpp b/src/crepe/api/Vector2.cpp index 30b968e..c3a49b7 100644 --- a/src/crepe/api/Vector2.cpp +++ b/src/crepe/api/Vector2.cpp @@ -8,11 +8,19 @@ Vector2 Vector2::operator+(const Vector2 & other) const { return {x + other.x, y Vector2 Vector2::operator*(double scalar) const { return {x * scalar, y * scalar}; } +Vector2 Vector2::operator*(const Vector2 & other) const{ + return {this->x * other.x, this->y * other.y}; +} Vector2 & Vector2::operator*=(const Vector2 & other) { x *= other.x; y *= other.y; return *this; } +Vector2 & Vector2::operator*=(const double & other) { + x *= other; + y *= other; + return *this; +} Vector2 & Vector2::operator+=(const Vector2 & other) { x += other.x; @@ -26,6 +34,10 @@ Vector2 & Vector2::operator+=(double other) { return *this; } +Vector2 Vector2::operator/(const Vector2 & other) const { + return {this->x / other.x, this->y / other.y}; +} + Vector2 Vector2::operator-() const { return {-x, -y}; } bool Vector2::operator==(const Vector2 & other) const { return x == other.x && y == other.y; } diff --git a/src/crepe/api/Vector2.h b/src/crepe/api/Vector2.h index 2fb6136..2a5db1d 100644 --- a/src/crepe/api/Vector2.h +++ b/src/crepe/api/Vector2.h @@ -18,9 +18,16 @@ struct Vector2 { //! Multiplies this vector by a scalar and returns the result. Vector2 operator*(double scalar) const; + Vector2 operator*(const Vector2 & other) const; + //! Multiplies this vector by another vector element-wise and updates this vector. Vector2 & operator*=(const Vector2 & other); + //! Multiplies a scalar value to both components of this vector and updates this vector. + Vector2 & operator*=(const double & other); + + Vector2 operator/(const Vector2 & other) const; + //! Adds another vector to this vector and updates this vector. Vector2 & operator+=(const Vector2 & other); diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 83e91f8..5185adc 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -15,6 +15,7 @@ #include "../api/Texture.h" #include "../api/Transform.h" #include "../util/Log.h" +#include "api/Vector2.h" #include "SDLContext.h" @@ -37,7 +38,7 @@ SDLContext::SDLContext() { } SDL_Window * tmp_window = SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - this->viewport.w, this->viewport.h, 0); + this->viewport.w, this->viewport.h, SDL_WINDOW_RESIZABLE); if (!tmp_window) { // FIXME: throw exception std::cerr << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl; @@ -103,17 +104,30 @@ void SDLContext::handle_events(bool & running) { void SDLContext::clear_screen() { SDL_RenderClear(this->game_renderer.get()); } void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()); } + void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Camera & cam) { SDL_RendererFlip render_flip = (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 adjusted_x = (transform.position.x - cam.x) * cam.zoom; - double adjusted_y = (transform.position.y - cam.y) * cam.zoom; - double adjusted_w = sprite.sprite_rect.w * transform.scale * cam.zoom; - double adjusted_h = sprite.sprite_rect.h * transform.scale * cam.zoom; + double pixel_w = sprite.sprite_rect.w * transform.scale * scale.x; + double pixel_h = sprite.sprite_rect.h * transform.scale * scale.y; + // decides which part of the sprite will be drawn SDL_Rect srcrect = { .x = sprite.sprite_rect.x, .y = sprite.sprite_rect.y, @@ -121,11 +135,12 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const .h = sprite.sprite_rect.h, }; + // decides where the clipped image is drawn SDL_Rect dstrect = { - .x = static_cast(adjusted_x), - .y = static_cast(adjusted_y), - .w = static_cast(adjusted_w), - .h = static_cast(adjusted_h), + .x = static_cast(pixel_coord.x), + .y = static_cast(pixel_coord.y), + .w = static_cast(pixel_w), + .h = static_cast(pixel_h), }; SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, @@ -133,11 +148,19 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const } void SDLContext::camera(const Camera & cam) { - this->viewport.w = static_cast(cam.aspect_width); - this->viewport.h = static_cast(cam.aspect_height); + + if (this->viewport.w != cam.screen.x && this->viewport.h != cam.screen.y) { + this->viewport.w = cam.screen.x; + this->viewport.h = cam.screen.y; + 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/example/rendering.cpp b/src/example/rendering.cpp index c9e62f1..3631c76 100644 --- a/src/example/rendering.cpp +++ b/src/example/rendering.cpp @@ -23,7 +23,7 @@ int main() { ComponentManager mgr{}; RenderSystem sys{mgr}; - GameObject obj = mgr.new_object("name", "tag", Vector2{0, 0}, 1, 1); + 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); GameObject obj2 = mgr.new_object("name", "tag", Vector2{800, 0}, 1, 0.1); @@ -32,13 +32,16 @@ int main() { Color color(0, 0, 0, 0); obj.add_component(make_shared("../asset/texture/img.png"), color, FlipSettings{false, false}); - obj.add_component(Color::get_red()); + Camera & cam = obj.add_component(Color::get_red()); + } + /* { Color color(0, 0, 0, 0); obj1.add_component(make_shared("../asset/texture/second.png"), color, FlipSettings{true, true}); } + */ /* { -- cgit v1.2.3 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 From f23eaa64df8b0ef27f58b1632c5e659fe3737153 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 18 Nov 2024 21:19:28 +0100 Subject: implemented PR#35 feedback --- src/crepe/facade/SDLContext.cpp | 3 --- src/crepe/system/RenderSystem.cpp | 9 ++++----- 2 files changed, 4 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index b56b5e7..4a0ac1a 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -118,8 +118,6 @@ 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)); - sprite.sprite_image->texture.get(); - this->set_rbg_texture(sprite.sprite_image, sprite.color.r, sprite.color.g, sprite.color.b); this->set_alpha_texture(sprite.sprite_image, sprite.color.a); @@ -135,7 +133,6 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const .h = sprite.sprite_rect.h, }; - SDL_Rect dstrect = { .x = static_cast(adjusted_x), .y = static_cast(adjusted_y), diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 4abd9bd..0a2b85e 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -3,11 +3,11 @@ #include #include "../ComponentManager.h" +#include "../api/ParticleEmitter.h" #include "../api/Sprite.h" #include "../api/Transform.h" -#include "../facade/SDLContext.h" -#include "../api/ParticleEmitter.h" #include "../api/Vector2.h" +#include "../facade/SDLContext.h" #include "RenderSystem.h" @@ -27,8 +27,7 @@ void RenderSystem::update_camera() { } } -bool RenderSystem::render_particle(const Sprite & sprite, - Transform tm) { +bool RenderSystem::render_particle(const Sprite & sprite, Transform tm) { ComponentManager & mgr = this->component_manager; SDLContext & render = SDLContext::get_instance(); @@ -56,7 +55,7 @@ void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { ComponentManager & mgr = this->component_manager; SDLContext & render = SDLContext::get_instance(); - + render.draw(sprite, tm, *curr_cam); } -- cgit v1.2.3 From bdc81e355e5bee5d2a3e29346ba08f7bc55196ca Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Wed, 20 Nov 2024 12:07:07 +0100 Subject: adjusted branch based on feedback --- mwe/events/include/event.h | 2 +- src/crepe/api/Animator.cpp | 2 +- src/crepe/api/Camera.h | 18 +++++------------- src/crepe/api/Vector2.cpp | 4 +++- src/crepe/api/Vector2.h | 2 ++ src/crepe/facade/SDLContext.cpp | 7 ++----- src/crepe/system/AnimatorSystem.cpp | 2 +- src/crepe/system/RenderSystem.cpp | 1 + src/example/rendering.cpp | 10 +++++----- 9 files changed, 21 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/mwe/events/include/event.h b/mwe/events/include/event.h index ee1bf52..e1b220b 100644 --- a/mwe/events/include/event.h +++ b/mwe/events/include/event.h @@ -148,7 +148,7 @@ private: }; class ShutDownEvent : public Event { public: - ShutDownEvent() : Event("ShutDownEvent") {}; + ShutDownEvent() : Event("ShutDownEvent"){}; REGISTER_EVENT_TYPE(ShutDownEvent) diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index f3d809c..d206428 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 - 1)* 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 dfccd24..d7292ef 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -28,25 +28,17 @@ public: //! Background color of the camera view. Color bg_color; - /** - * \pos The position of the camera in world units - */ + //! pos The position of the camera in world units Vector2 pos = {0, 0}; - /** - * \screen the display size in pixels ( output resolution ) - */ + //! screen the display size in pixels ( output resolution ) Vector2 screen = {640, 480}; - /** - * \viewport is the area of the world visible through the camera (in world units) - */ + //! 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}; + //! 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/api/Vector2.cpp b/src/crepe/api/Vector2.cpp index c3a49b7..8658c00 100644 --- a/src/crepe/api/Vector2.cpp +++ b/src/crepe/api/Vector2.cpp @@ -8,14 +8,16 @@ Vector2 Vector2::operator+(const Vector2 & other) const { return {x + other.x, y Vector2 Vector2::operator*(double scalar) const { return {x * scalar, y * scalar}; } -Vector2 Vector2::operator*(const Vector2 & other) const{ +Vector2 Vector2::operator*(const Vector2 & other) const { return {this->x * other.x, this->y * other.y}; } + Vector2 & Vector2::operator*=(const Vector2 & other) { x *= other.x; y *= other.y; return *this; } + Vector2 & Vector2::operator*=(const double & other) { x *= other; y *= other; diff --git a/src/crepe/api/Vector2.h b/src/crepe/api/Vector2.h index 2a5db1d..790160d 100644 --- a/src/crepe/api/Vector2.h +++ b/src/crepe/api/Vector2.h @@ -18,6 +18,7 @@ struct Vector2 { //! Multiplies this vector by a scalar and returns the result. Vector2 operator*(double scalar) const; + //! Multiplies this vector by another vector element-wise and updates this vector. Vector2 operator*(const Vector2 & other) const; //! Multiplies this vector by another vector element-wise and updates this vector. @@ -26,6 +27,7 @@ struct Vector2 { //! Multiplies a scalar value to both components of this vector and updates this vector. Vector2 & operator*=(const double & other); + //! Divides this vector by another vector element-wise and updates this vector. Vector2 operator/(const Vector2 & other) const; //! Adds another vector to this vector and updates this vector. diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 785b285..0cb7be9 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -38,7 +38,7 @@ SDLContext::SDLContext() { } SDL_Window * tmp_window = SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - this->viewport.w, this->viewport.h, SDL_WINDOW_RESIZABLE); + this->viewport.w, this->viewport.h, 0); if (!tmp_window) { // FIXME: throw exception std::cerr << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl; @@ -104,13 +104,11 @@ void SDLContext::handle_events(bool & running) { void SDLContext::clear_screen() { SDL_RenderClear(this->game_renderer.get()); } void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()); } - void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Camera & cam) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); - Vector2 pixel_coord = (transform.position - cam.pos) * cam.scale; double pixel_w = sprite.sprite_rect.w * transform.scale * cam.scale.x; @@ -148,11 +146,10 @@ void SDLContext::camera(Camera & cam) { 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; this->viewport.h = cam.screen.y; - SDL_SetWindowSize(this->game_window.get(), cam.screen.x , cam.screen.y); + SDL_SetWindowSize(this->game_window.get(), cam.screen.x, cam.screen.y); } SDL_SetRenderDrawColor(this->game_renderer.get(), cam.bg_color.r, cam.bg_color.g, diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp index ceb5bfd..efe0e48 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 "AnimatorSystem.h" #include "ComponentManager.h" diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 989a82f..7538e20 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -13,6 +13,7 @@ using namespace crepe; void RenderSystem::clear_screen() const { SDLContext::get_instance().clear_screen(); } void RenderSystem::present_screen() const { SDLContext::get_instance().present_screen(); } + void RenderSystem::update_camera() { ComponentManager & mgr = this->component_manager; diff --git a/src/example/rendering.cpp b/src/example/rendering.cpp index 1db57e5..418e03d 100644 --- a/src/example/rendering.cpp +++ b/src/example/rendering.cpp @@ -24,7 +24,7 @@ int main() { ComponentManager mgr{}; RenderSystem sys{mgr}; - AnimatorSystem anim_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); @@ -33,10 +33,11 @@ int main() { // Normal adding components { Color color(0, 0, 0, 0); - Sprite & sprite = obj.add_component(make_shared("../asset/spritesheet/spritesheet_test.png"), color, - FlipSettings{false, false}); + 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; + obj.add_component(sprite, 4, 1, 1).active = true; } /* { @@ -54,7 +55,6 @@ int main() { } */ - auto start = std::chrono::steady_clock::now(); while (std::chrono::steady_clock::now() - start < std::chrono::seconds(5)) { anim_sys.update(); -- cgit v1.2.3 From 385f19a8c896ec126c569f1e5337d6d370d20517 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Fri, 22 Nov 2024 13:54:13 +0100 Subject: working aspect ratio in world units. and add pillarboxing/letterboxing depending on ratio --- src/crepe/api/Camera.h | 4 +- src/crepe/api/Color.cpp | 2 +- src/crepe/facade/SDLContext.cpp | 98 ++++++++++++++++++++++++++++---------- src/crepe/facade/SDLContext.h | 4 +- src/example/rendering_particle.cpp | 12 +++-- 5 files changed, 87 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index d7292ef..c42ed0d 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -32,10 +32,10 @@ public: Vector2 pos = {0, 0}; //! screen the display size in pixels ( output resolution ) - Vector2 screen = {640, 480}; + Vector2 screen = {1080, 720}; //! viewport is the area of the world visible through the camera (in world units) - Vector2 viewport = {500, 500}; + Vector2 viewport = {2000, 1000}; //! scale scaling factor from world units to pixel coordinates Vector2 scale = {0, 0}; diff --git a/src/crepe/api/Color.cpp b/src/crepe/api/Color.cpp index 29bd77a..dc7c15f 100644 --- a/src/crepe/api/Color.cpp +++ b/src/crepe/api/Color.cpp @@ -2,7 +2,7 @@ using namespace crepe; -const Color Color::WHITE{0xff, 0xff, 0xff}; +const Color Color::WHITE{0xff, 0xff, 0xff, 0xff}; const Color Color::RED{0xff, 0x00, 0x00}; const Color Color::GREEN{0x00, 0xff, 0x00}; const Color Color::BLUE{0x00, 0x00, 0xff}; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 74af25f..e187d67 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -5,12 +5,12 @@ #include #include #include +#include #include #include #include #include #include -#include #include "../api/Camera.h" #include "../api/Sprite.h" @@ -94,7 +94,10 @@ void SDLContext::handle_events(bool & running) { */ } -void SDLContext::clear_screen() { SDL_RenderClear(this->game_renderer.get()); } +void SDLContext::clear_screen() { + SDL_SetRenderDrawColor(this->game_renderer.get(), 0, 0, 0, 255); + SDL_RenderClear(this->game_renderer.get()); +} void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()); } SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { @@ -108,20 +111,11 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, const double & scale, const Camera & cam) const { - 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; - - double adjusted_x = (pos.x - cam.x) * cam.zoom; - double adjusted_y = (pos.y - cam.y) * cam.zoom; - double adjusted_w = sprite.sprite_rect.w * scale * cam.zoom; - double adjusted_h = sprite.sprite_rect.h * scale * cam.zoom; - return SDL_Rect{ - .x = static_cast(adjusted_x), - .y = static_cast(adjusted_y), - .w = static_cast(adjusted_w), - .h = static_cast(adjusted_h), + .x = static_cast(sprite.sprite_rect.x - 400 / 2), + .y = static_cast(sprite.sprite_rect.y - 300 / 2), + .w = static_cast(400), + .h = static_cast(300), }; } @@ -153,27 +147,81 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const &dstrect, transform.rotation, NULL, render_flip); } -void SDLContext::set_camera(const Camera & cam) { +void SDLContext::set_camera(Camera & cam) { + 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; + this->viewport.w = cam.screen.x; + } 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; + + SDL_Rect view; if (screen_aspect > viewport_aspect) { - cam.scale.x = cam.scale.y = cam.screen.x / zoomed_viewport.x; + view.h = static_cast(cam.screen.y); + view.w = static_cast(cam.screen.y * viewport_aspect); + view.x = static_cast(cam.screen.x - view.w) / 2; + view.y = 0; } else { - cam.scale.y = cam.scale.x = cam.screen.y / zoomed_viewport.y; + view.w = static_cast(cam.screen.x); + view.h = static_cast(cam.screen.x / viewport_aspect); + view.x = 0; + view.y = static_cast(cam.screen.y - view.h) / 2; } + SDL_RenderSetViewport(this->game_renderer.get(), &view); - if (this->viewport.w != cam.screen.x && this->viewport.h != cam.screen.y) { - this->viewport.w = cam.screen.x; - this->viewport.h = cam.screen.y; - SDL_SetWindowSize(this->game_window.get(), cam.screen.x, cam.screen.y); + SDL_RenderSetLogicalSize(this->game_renderer.get(), cam.viewport.x, cam.viewport.y); + 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(cam.viewport.x), + .h = static_cast(cam.viewport.y), + }; + SDL_RenderFillRect(this->game_renderer.get(), &bg); + + /* + float offset_x = 0, offset_y = 0; + + + double scale_factor = min(cam.screen.x / cam.viewport.x, cam.screen.y / cam.viewport.y); + cam.scale.x = scale_factor * cam.viewport.x; + cam.scale.y = scale_factor * cam.viewport.y; + + offset_x = (cam.screen.x - cam.scale.x) / 2; + offset_y = (cam.screen.y - cam.scale.y) / 2; + + float bar_w = cam.screen.x - cam.scale.x; + float bar_h = cam.screen.y - cam.scale.y; + + SDL_SetRenderDrawColor(this->game_renderer.get(), 0, 0, 0, 255); + if (bar_w > 0) { + SDL_Rect left_bar = {0, 0, static_cast(offset_x), static_cast(cam.screen.y)}; + SDL_RenderDrawRect(this->game_renderer.get(), &left_bar); + + SDL_Rect right_bar = {static_cast(offset_x + cam.scale.x), 0, + static_cast(offset_x), static_cast(cam.screen.y)}; + SDL_RenderDrawRect(this->game_renderer.get(), &right_bar); } - SDL_SetRenderDrawColor(this->game_renderer.get(), cam.bg_color.r, cam.bg_color.g, - cam.bg_color.b, cam.bg_color.a); + if (screen_aspect > viewport_aspect) { + // pillarboxing + cam.scale.x = cam.scale.y = cam.screen.x / cam.viewport.x; + offset_y = (cam.screen.y - (cam.viewport.y * cam.scale.y)) / 2; + } else if (screen_aspect < viewport_aspect) { + // lettor boxing + cam.scale.y = cam.scale.x = cam.screen.y / zoomed_viewport.y; + offset_x = (cam.screen.x - (cam.viewport.x * cam.scale.x)) / 2; + } else { + // screen ration is even + offset_y = (cam.screen.y - (cam.viewport.y * cam.scale.y)) / 2; + offset_x = (cam.screen.x - (cam.viewport.x * cam.scale.x)) / 2; + } + */ } uint64_t SDLContext::get_ticks() const { return SDL_GetTicks64(); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 841ffc9..45bbda6 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -133,7 +133,7 @@ private: * \brief sets the background of the camera (will be adjusted in future PR) * \param camera Reference to the Camera object. */ - void set_camera(const Camera & camera); + void set_camera(Camera & camera); private: /** @@ -164,7 +164,7 @@ private: std::unique_ptr> game_renderer; //! viewport for the camera window - SDL_Rect viewport = {0, 0, 640, 480}; + SDL_Rect viewport = {0, 0, 1280, 720}; }; } // namespace crepe diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 4571afb..96ef3df 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -23,16 +23,18 @@ using namespace std; int main(int argc, char * argv[]) { ComponentManager mgr; - GameObject game_object = mgr.new_object("", "", Vector2{100, 100}, 0, 0.1); + GameObject game_object = mgr.new_object("", "", Vector2{400, 300}, 0, 0.1); RenderSystem sys{mgr}; ParticleSystem psys{mgr}; Color color(255, 255, 255, 255); Sprite & test_sprite = game_object.add_component( - make_shared("../asset/texture/img.png"), color, FlipSettings{false, false}); + make_shared("asset/texture/test_ap43.png"), color, FlipSettings{false, false}); test_sprite.order_in_layer = 5; + + /* auto & test = game_object.add_component(ParticleEmitter::Data{ .position = {0, 0}, .max_particles = 10, @@ -52,13 +54,17 @@ int main(int argc, char * argv[]) { }, .sprite = test_sprite, }); + */ + game_object.add_component(Color::WHITE); + /* game_object - .add_component(make_shared("../asset/texture/img.png"), color, + .add_component(make_shared("asset/texture/img.png"), color, FlipSettings{false, false}) .order_in_layer = 6; + */ auto start = std::chrono::steady_clock::now(); while (std::chrono::steady_clock::now() - start < std::chrono::seconds(5)) { -- cgit v1.2.3 From 4ce924b1b1322ee4da3ba50d6da856ad13a2190b Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Fri, 22 Nov 2024 16:16:27 +0100 Subject: working scaling image with scaling world to screen --- src/crepe/api/Camera.h | 4 +- src/crepe/api/Sprite.cpp | 4 +- src/crepe/api/Sprite.h | 8 ++++ src/crepe/api/Vector2.cpp | 4 ++ src/crepe/api/Vector2.h | 3 ++ src/crepe/facade/SDLContext.cpp | 86 ++++++++++++++------------------------ src/crepe/facade/SDLContext.h | 10 ++--- src/crepe/system/RenderSystem.cpp | 7 ++-- src/crepe/system/RenderSystem.h | 5 +++ src/example/rendering_particle.cpp | 4 +- 10 files changed, 65 insertions(+), 70 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index c42ed0d..083dc19 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -38,10 +38,8 @@ public: Vector2 viewport = {2000, 1000}; //! scale scaling factor from world units to pixel coordinates - Vector2 scale = {0, 0}; - //! Zoom level of the camera view. - double zoom = 1.0f; + double zoom = 1.5f; public: /** diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index bd2d5cf..3853aab 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -15,7 +15,9 @@ Sprite::Sprite(game_object_id_t id, const shared_ptr image, const Color : Component(id), color(color), flip(flip), - sprite_image(image) { + sprite_image(image), + aspect_ratio(sprite_image->get_width() / sprite_image->get_height()) +{ dbg_trace(); this->sprite_rect.w = sprite_image->get_width(); diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 74a55d4..66599c9 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "../Component.h" @@ -62,6 +63,13 @@ public: //! Order within the sorting layer uint8_t order_in_layer = 0; + //! width in world units + int width = 0; + //! height in world units + int height = 0; + + const double aspect_ratio; + public: /** * \brief Gets the maximum number of instances allowed for this sprite. diff --git a/src/crepe/api/Vector2.cpp b/src/crepe/api/Vector2.cpp index 8658c00..c8253d7 100644 --- a/src/crepe/api/Vector2.cpp +++ b/src/crepe/api/Vector2.cpp @@ -40,6 +40,10 @@ Vector2 Vector2::operator/(const Vector2 & other) const { return {this->x / other.x, this->y / other.y}; } +Vector2 Vector2::operator/(const double & other) const { + return {this->x / other, this->y / other}; +} + Vector2 Vector2::operator-() const { return {-x, -y}; } bool Vector2::operator==(const Vector2 & other) const { return x == other.x && y == other.y; } diff --git a/src/crepe/api/Vector2.h b/src/crepe/api/Vector2.h index 790160d..5a23699 100644 --- a/src/crepe/api/Vector2.h +++ b/src/crepe/api/Vector2.h @@ -30,6 +30,9 @@ struct Vector2 { //! Divides this vector by another vector element-wise and updates this vector. Vector2 operator/(const Vector2 & other) const; + //! Divides a scalar value to both components of this vector and updates this vector. + Vector2 operator/(const double & other) const; + //! Adds another vector to this vector and updates this vector. Vector2 & operator+=(const Vector2 & other); diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index e187d67..f49539c 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -109,48 +110,60 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { }; } SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, - const double & scale, const Camera & cam) const { + const Vector2 & scale) const { + + int pixel_width, pixel_height; + + if (sprite.sprite_rect.w > sprite.sprite_rect.h) { + pixel_width = static_cast(sprite.width * scale.x); + pixel_height = static_cast(pixel_width / sprite.aspect_ratio); + } else { + pixel_height = static_cast(sprite.height * scale.y); + pixel_width = static_cast(pixel_height * sprite.aspect_ratio); + } + + int pixel_x = static_cast((pos.x - pixel_width / 2)); + int pixel_y = static_cast((pos.y - pixel_height / 2)); return SDL_Rect{ - .x = static_cast(sprite.sprite_rect.x - 400 / 2), - .y = static_cast(sprite.sprite_rect.y - 300 / 2), - .w = static_cast(400), - .h = static_cast(300), + .x = pixel_x, + .y = pixel_y, + .w = pixel_width, + .h = pixel_height, }; } void SDLContext::draw_particle(const Sprite & sprite, const Vector2 & pos, - const double & angle, const double & scale, - const Camera & camera) { + const double & angle, const Vector2 & scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, pos, scale, camera); + SDL_Rect dstrect = this->get_dst_rect(sprite, pos, scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, &dstrect, angle, NULL, render_flip); } -void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Camera & cam) { +void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Vector2 & scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, transform.position, transform.scale, cam); + SDL_Rect dstrect = this->get_dst_rect(sprite, transform.position, scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, &dstrect, transform.rotation, NULL, render_flip); } -void SDLContext::set_camera(Camera & cam) { +void SDLContext::set_camera(const Camera & cam, Vector2 & scale) { - 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); + 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; this->viewport.w = cam.screen.x; } @@ -158,16 +171,18 @@ void SDLContext::set_camera(Camera & cam) { double screen_aspect = cam.screen.x / cam.screen.y; double viewport_aspect = cam.viewport.x / cam.viewport.y; + scale = cam.screen / cam.viewport * cam.zoom; + SDL_Rect view; if (screen_aspect > viewport_aspect) { - view.h = static_cast(cam.screen.y); + view.h = static_cast(cam.screen.y / cam.zoom); view.w = static_cast(cam.screen.y * viewport_aspect); view.x = static_cast(cam.screen.x - view.w) / 2; view.y = 0; } else { - view.w = static_cast(cam.screen.x); view.h = static_cast(cam.screen.x / viewport_aspect); + view.w = static_cast(cam.screen.x / cam.zoom); view.x = 0; view.y = static_cast(cam.screen.y - view.h) / 2; } @@ -175,7 +190,7 @@ void SDLContext::set_camera(Camera & cam) { SDL_RenderSetLogicalSize(this->game_renderer.get(), cam.viewport.x, cam.viewport.y); SDL_SetRenderDrawColor(this->game_renderer.get(), cam.bg_color.r, cam.bg_color.g, - cam.bg_color.b, cam.bg_color.a); + cam.bg_color.b, cam.bg_color.a); SDL_Rect bg = { .x = 0, .y = 0, @@ -183,45 +198,6 @@ void SDLContext::set_camera(Camera & cam) { .h = static_cast(cam.viewport.y), }; SDL_RenderFillRect(this->game_renderer.get(), &bg); - - /* - float offset_x = 0, offset_y = 0; - - - double scale_factor = min(cam.screen.x / cam.viewport.x, cam.screen.y / cam.viewport.y); - cam.scale.x = scale_factor * cam.viewport.x; - cam.scale.y = scale_factor * cam.viewport.y; - - offset_x = (cam.screen.x - cam.scale.x) / 2; - offset_y = (cam.screen.y - cam.scale.y) / 2; - - float bar_w = cam.screen.x - cam.scale.x; - float bar_h = cam.screen.y - cam.scale.y; - - SDL_SetRenderDrawColor(this->game_renderer.get(), 0, 0, 0, 255); - if (bar_w > 0) { - SDL_Rect left_bar = {0, 0, static_cast(offset_x), static_cast(cam.screen.y)}; - SDL_RenderDrawRect(this->game_renderer.get(), &left_bar); - - SDL_Rect right_bar = {static_cast(offset_x + cam.scale.x), 0, - static_cast(offset_x), static_cast(cam.screen.y)}; - SDL_RenderDrawRect(this->game_renderer.get(), &right_bar); - } - - if (screen_aspect > viewport_aspect) { - // pillarboxing - cam.scale.x = cam.scale.y = cam.screen.x / cam.viewport.x; - offset_y = (cam.screen.y - (cam.viewport.y * cam.scale.y)) / 2; - } else if (screen_aspect < viewport_aspect) { - // lettor boxing - cam.scale.y = cam.scale.x = cam.screen.y / zoomed_viewport.y; - offset_x = (cam.screen.x - (cam.viewport.x * cam.scale.x)) / 2; - } else { - // screen ration is even - offset_y = (cam.screen.y - (cam.viewport.y * cam.scale.y)) / 2; - offset_x = (cam.screen.x - (cam.viewport.x * cam.scale.x)) / 2; - } - */ } uint64_t SDLContext::get_ticks() const { return SDL_GetTicks64(); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 45bbda6..68d1630 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -118,10 +118,9 @@ private: * \param transform Reference to the Transform for positioning. * \param camera Reference to the Camera for view adjustments. */ - void draw(const Sprite & sprite, const Transform & transform, const Camera & camera); + void draw(const Sprite & sprite, const Transform & transform, const Vector2 & scale); - void draw_particle(const Sprite & sprite, const Vector2 & pos, const double & angle, - const double & scale, const Camera & camera); + void draw_particle(const Sprite & sprite, const Vector2 & pos, const double & angle, const Vector2 & scale); //! Clears the screen, preparing for a new frame. void clear_screen(); @@ -133,7 +132,7 @@ private: * \brief sets the background of the camera (will be adjusted in future PR) * \param camera Reference to the Camera object. */ - void set_camera(Camera & camera); + void set_camera(const Camera & camera, Vector2 & scale); private: /** @@ -153,8 +152,7 @@ private: * on the camera * \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 double & scale, - const Camera & cam) const; + SDL_Rect get_dst_rect(const Sprite & sprite, const Vector2 & pos, const Vector2 & scale) const; private: //! sdl Window diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index ad510f5..a16fbb5 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -30,7 +30,7 @@ void RenderSystem::update_camera() { for (Camera & cam : cameras) { if (!cam.active) continue; - this->context.set_camera(cam); + this->context.set_camera(cam, this->scale); this->curr_cam_ref = &cam; } } @@ -72,14 +72,13 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) for (const Particle & p : em.data.particles) { if (!p.active) continue; - this->context.draw_particle(sprite, p.position, p.angle, scale, - *this->curr_cam_ref); + this->context.draw_particle(sprite, p.position, p.angle, this->scale * scale); } } return rendering_particles; } void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { - this->context.draw(sprite, tm, *this->curr_cam_ref); + this->context.draw(sprite, tm, this->scale * tm.scale); } void RenderSystem::render() { diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 30b41cf..19edc02 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -3,6 +3,7 @@ #include #include +#include "api/Vector2.h" #include "facade/SDLContext.h" #include "System.h" @@ -80,8 +81,12 @@ private: //! Pointer to the current active camera for rendering Camera * curr_cam_ref = nullptr; // TODO: needs a better solution + + Vector2 scale; SDLContext & context = SDLContext::get_instance(); + + }; } // namespace crepe diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 96ef3df..741c985 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -23,7 +23,7 @@ using namespace std; int main(int argc, char * argv[]) { ComponentManager mgr; - GameObject game_object = mgr.new_object("", "", Vector2{400, 300}, 0, 0.1); + GameObject game_object = mgr.new_object("", "", Vector2{1000, 500}, 0, 2); RenderSystem sys{mgr}; ParticleSystem psys{mgr}; @@ -32,6 +32,8 @@ int main(int argc, char * argv[]) { Sprite & test_sprite = game_object.add_component( make_shared("asset/texture/test_ap43.png"), color, FlipSettings{false, false}); test_sprite.order_in_layer = 5; + test_sprite.width = 1000; + test_sprite.height = 500; /* -- cgit v1.2.3 From 8513b2dad0ec43678f17cca0510db4d1a938279a Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Fri, 22 Nov 2024 17:08:55 +0100 Subject: working moving camera, flip animations, resizing with animations, and black bars --- src/crepe/api/Animator.cpp | 5 ++++- src/crepe/api/Sprite.h | 10 ++++++++-- src/crepe/facade/SDLContext.cpp | 25 +++++++++++++------------ src/crepe/facade/SDLContext.h | 6 +++--- src/crepe/system/RenderSystem.cpp | 4 ++-- src/example/rendering_particle.cpp | 11 ++++++++--- 6 files changed, 38 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index d206428..178b165 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -18,7 +18,10 @@ 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 - 1) * animator_rect.h; + animator_rect.y = col_animator * animator_rect.h; this->active = false; + + // need to do this for to get the aspect ratio for a single clipping in the spritesheet + this->spritesheet.aspect_ratio = (double)animator_rect.w / (double)animator_rect.h; } Animator::~Animator() { dbg_trace(); } diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 66599c9..89f9121 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -68,7 +68,13 @@ public: //! height in world units int height = 0; - const double aspect_ratio; + /** + * \aspect_ratio ratio of the img so that scaling will not become weird + * + * cannot be const because if Animator component is addded then ratio becomes scuffed and + * does it need to be calculated again in the Animator + */ + double aspect_ratio; public: /** @@ -90,7 +96,7 @@ private: friend class AnimatorSystem; //! Render area of the sprite this will also be adjusted by the AnimatorSystem if an Animator - // object is present in GameObject + // object is present in GameObject. this is in sprite pixels Rect sprite_rect; }; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index f49539c..29a8195 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -5,11 +5,9 @@ #include #include #include -#include #include #include #include -#include #include #include @@ -109,21 +107,24 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { .h = sprite.sprite_rect.h, }; } -SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, - const Vector2 & scale) const { +SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, const Vector2 & cam_pos, + const double & img_scale, const Vector2 & cam_scale) const { int pixel_width, pixel_height; if (sprite.sprite_rect.w > sprite.sprite_rect.h) { - pixel_width = static_cast(sprite.width * scale.x); + pixel_width = static_cast(sprite.width * cam_scale.x); pixel_height = static_cast(pixel_width / sprite.aspect_ratio); } else { - pixel_height = static_cast(sprite.height * scale.y); + pixel_height = static_cast(sprite.height * cam_scale.y); pixel_width = static_cast(pixel_height * sprite.aspect_ratio); } - int pixel_x = static_cast((pos.x - pixel_width / 2)); - int pixel_y = static_cast((pos.y - pixel_height / 2)); + pixel_width *= img_scale; + pixel_height *= img_scale; + + int pixel_x = static_cast((pos.x - cam_pos.x - pixel_width / 2)); + int pixel_y = static_cast((pos.y - cam_pos.y - pixel_height / 2)); return SDL_Rect{ .x = pixel_x, @@ -134,27 +135,27 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, } void SDLContext::draw_particle(const Sprite & sprite, const Vector2 & pos, - const double & angle, const Vector2 & scale) { + const double & angle, const Vector2 & cam_pos, const double & img_scale, const Vector2 & cam_scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, pos, scale); + SDL_Rect dstrect = this->get_dst_rect(sprite, pos, cam_pos, img_scale, cam_scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, &dstrect, angle, NULL, render_flip); } -void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Vector2 & scale) { +void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Vector2 & cam_pos, const Vector2 & cam_scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, transform.position, scale); + SDL_Rect dstrect = this->get_dst_rect(sprite, transform.position, cam_pos, transform.scale, cam_scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, &dstrect, transform.rotation, NULL, render_flip); diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 68d1630..04c60cc 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -118,9 +118,9 @@ private: * \param transform Reference to the Transform for positioning. * \param camera Reference to the Camera for view adjustments. */ - void draw(const Sprite & sprite, const Transform & transform, const Vector2 & scale); + void draw(const Sprite & sprite, const Transform & transform, const Vector2 & cam_pos, const Vector2 & cam_scale); - void draw_particle(const Sprite & sprite, const Vector2 & pos, const double & angle, const Vector2 & scale); + void draw_particle(const Sprite & sprite, const Vector2 & pos, const double & angle, const Vector2 & cam_pos, const double & img_scale, const Vector2 & cam_scale); //! Clears the screen, preparing for a new frame. void clear_screen(); @@ -152,7 +152,7 @@ private: * on the camera * \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 & scale) const; + SDL_Rect get_dst_rect(const Sprite & sprite, const Vector2 & pos, const Vector2 & cam_pos, const double & img_scale , const Vector2 & scale) const; private: //! sdl Window diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index a16fbb5..676ded6 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -72,13 +72,13 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) for (const Particle & p : em.data.particles) { if (!p.active) continue; - this->context.draw_particle(sprite, p.position, p.angle, this->scale * scale); + this->context.draw_particle(sprite, p.position ,p.angle, this->curr_cam_ref->pos ,scale, this->scale); } } return rendering_particles; } void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { - this->context.draw(sprite, tm, this->scale * tm.scale); + this->context.draw(sprite, tm , this->curr_cam_ref->pos,this->scale); } void RenderSystem::render() { diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 741c985..6a91c19 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -1,4 +1,6 @@ +#include "api/Animator.h" #include "api/Camera.h" +#include "system/AnimatorSystem.h" #include "system/ParticleSystem.h" #include #include @@ -15,7 +17,6 @@ #include #include -#include #include using namespace crepe; @@ -23,18 +24,21 @@ using namespace std; int main(int argc, char * argv[]) { ComponentManager mgr; - GameObject game_object = mgr.new_object("", "", Vector2{1000, 500}, 0, 2); + GameObject game_object = mgr.new_object("", "", Vector2{1000, 500}, 0, 1); RenderSystem sys{mgr}; ParticleSystem psys{mgr}; + AnimatorSystem asys{mgr}; Color color(255, 255, 255, 255); Sprite & test_sprite = game_object.add_component( - make_shared("asset/texture/test_ap43.png"), color, FlipSettings{false, false}); + make_shared("asset/spritesheet/spritesheet_test.png"), color, FlipSettings{true, true}); test_sprite.order_in_layer = 5; test_sprite.width = 1000; test_sprite.height = 500; + game_object.add_component(test_sprite, 4,1,0).active = true; + /* auto & test = game_object.add_component(ParticleEmitter::Data{ @@ -71,6 +75,7 @@ int main(int argc, char * argv[]) { auto start = std::chrono::steady_clock::now(); while (std::chrono::steady_clock::now() - start < std::chrono::seconds(5)) { psys.update(); + asys.update(); sys.update(); SDL_Delay(10); } -- cgit v1.2.3 From aed904bdc2ddaf669940d922611229a171a1f220 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Fri, 22 Nov 2024 17:09:40 +0100 Subject: make format --- asset/texture/test_ap43.png | Bin 0 -> 2394 bytes src/crepe/api/Animator.cpp | 4 ++-- src/crepe/api/Sprite.cpp | 3 +-- src/crepe/facade/SDLContext.cpp | 14 +++++++++----- src/crepe/facade/SDLContext.h | 10 +++++++--- src/crepe/system/RenderSystem.cpp | 5 +++-- src/crepe/system/RenderSystem.h | 6 ++---- src/example/rendering_particle.cpp | 6 +++--- 8 files changed, 27 insertions(+), 21 deletions(-) create mode 100644 asset/texture/test_ap43.png (limited to 'src') diff --git a/asset/texture/test_ap43.png b/asset/texture/test_ap43.png new file mode 100644 index 0000000..e758ed7 Binary files /dev/null and b/asset/texture/test_ap43.png differ diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index 178b165..0043896 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -18,10 +18,10 @@ 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 * animator_rect.h; this->active = false; // need to do this for to get the aspect ratio for a single clipping in the spritesheet - this->spritesheet.aspect_ratio = (double)animator_rect.w / (double)animator_rect.h; + this->spritesheet.aspect_ratio = (double) animator_rect.w / (double) animator_rect.h; } Animator::~Animator() { dbg_trace(); } diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index 3853aab..c219dd0 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -16,8 +16,7 @@ Sprite::Sprite(game_object_id_t id, const shared_ptr image, const Color color(color), flip(flip), sprite_image(image), - aspect_ratio(sprite_image->get_width() / sprite_image->get_height()) -{ + aspect_ratio(sprite_image->get_width() / sprite_image->get_height()) { dbg_trace(); this->sprite_rect.w = sprite_image->get_width(); diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 29a8195..4619c46 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -107,8 +107,9 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { .h = sprite.sprite_rect.h, }; } -SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, const Vector2 & cam_pos, - const double & img_scale, const Vector2 & cam_scale) const { +SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, + const Vector2 & cam_pos, const double & img_scale, + const Vector2 & cam_scale) const { int pixel_width, pixel_height; @@ -135,7 +136,8 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, co } void SDLContext::draw_particle(const Sprite & sprite, const Vector2 & pos, - const double & angle, const Vector2 & cam_pos, const double & img_scale, const Vector2 & cam_scale) { + const double & angle, const Vector2 & cam_pos, + const double & img_scale, const Vector2 & cam_scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) @@ -148,14 +150,16 @@ void SDLContext::draw_particle(const Sprite & sprite, const Vector2 & pos, &dstrect, angle, NULL, render_flip); } -void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Vector2 & cam_pos, const Vector2 & cam_scale) { +void SDLContext::draw(const Sprite & sprite, const Transform & transform, + const Vector2 & cam_pos, const Vector2 & cam_scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, transform.position, cam_pos, transform.scale, cam_scale); + SDL_Rect dstrect + = this->get_dst_rect(sprite, transform.position, cam_pos, transform.scale, cam_scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, &dstrect, transform.rotation, NULL, render_flip); diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 04c60cc..4d97699 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -118,9 +118,12 @@ private: * \param transform Reference to the Transform for positioning. * \param camera Reference to the Camera for view adjustments. */ - void draw(const Sprite & sprite, const Transform & transform, const Vector2 & cam_pos, const Vector2 & cam_scale); + void draw(const Sprite & sprite, const Transform & transform, const Vector2 & cam_pos, + const Vector2 & cam_scale); - void draw_particle(const Sprite & sprite, const Vector2 & pos, const double & angle, const Vector2 & cam_pos, const double & img_scale, const Vector2 & cam_scale); + void draw_particle(const Sprite & sprite, const Vector2 & pos, const double & angle, + const Vector2 & cam_pos, const double & img_scale, + const Vector2 & cam_scale); //! Clears the screen, preparing for a new frame. void clear_screen(); @@ -152,7 +155,8 @@ private: * on the camera * \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, const double & img_scale , const Vector2 & scale) const; + SDL_Rect get_dst_rect(const Sprite & sprite, const Vector2 & pos, const Vector2 & cam_pos, + const double & img_scale, const Vector2 & scale) const; private: //! sdl Window diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 676ded6..1dd1699 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -72,13 +72,14 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) for (const Particle & p : em.data.particles) { if (!p.active) continue; - this->context.draw_particle(sprite, p.position ,p.angle, this->curr_cam_ref->pos ,scale, this->scale); + this->context.draw_particle(sprite, p.position, p.angle, this->curr_cam_ref->pos, + scale, this->scale); } } return rendering_particles; } void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { - this->context.draw(sprite, tm , this->curr_cam_ref->pos,this->scale); + this->context.draw(sprite, tm, this->curr_cam_ref->pos, this->scale); } void RenderSystem::render() { diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 19edc02..f010a83 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -81,12 +81,10 @@ private: //! Pointer to the current active camera for rendering Camera * curr_cam_ref = nullptr; // TODO: needs a better solution - - Vector2 scale; - - SDLContext & context = SDLContext::get_instance(); + Vector2 scale; + SDLContext & context = SDLContext::get_instance(); }; } // namespace crepe diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 6a91c19..fad174e 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -32,13 +32,13 @@ int main(int argc, char * argv[]) { Color color(255, 255, 255, 255); Sprite & test_sprite = game_object.add_component( - make_shared("asset/spritesheet/spritesheet_test.png"), color, FlipSettings{true, true}); + make_shared("asset/spritesheet/spritesheet_test.png"), color, + FlipSettings{true, true}); test_sprite.order_in_layer = 5; test_sprite.width = 1000; test_sprite.height = 500; - game_object.add_component(test_sprite, 4,1,0).active = true; - + game_object.add_component(test_sprite, 4, 1, 0).active = true; /* auto & test = game_object.add_component(ParticleEmitter::Data{ -- cgit v1.2.3 From b570225f5166b18fdd881fc53cd7013669067ca1 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Fri, 22 Nov 2024 17:23:33 +0100 Subject: added doxygen comments --- src/crepe/facade/SDLContext.cpp | 15 +++++++++++++-- src/crepe/facade/SDLContext.h | 27 ++++++++++++++++++++------- 2 files changed, 33 insertions(+), 9 deletions(-) (limited to 'src') 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(cam.screen.y / cam.zoom); view.w = static_cast(cam.screen.y * viewport_aspect); view.x = static_cast(cam.screen.x - view.w) / 2; view.y = 0; } else { + // pillarboxing view.h = static_cast(cam.screen.x / viewport_aspect); view.w = static_cast(cam.screen.x / cam.zoom); view.x = 0; view.y = static_cast(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(cam.viewport.x), .h = static_cast(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> 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}; }; -- cgit v1.2.3 From 9aca3626e31a7549f8c436672d4f479bd64c0057 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 25 Nov 2024 19:39:11 +0100 Subject: fixed a rezing and camera origin is now middlepoint --- src/crepe/api/Camera.h | 4 +++- src/crepe/api/Config.h | 2 +- src/crepe/facade/SDLContext.cpp | 13 ++++++------- src/crepe/facade/SDLContext.h | 2 +- src/example/rendering_particle.cpp | 5 +++-- 5 files changed, 14 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index 083dc19..137c8ed 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -32,14 +32,16 @@ public: Vector2 pos = {0, 0}; //! screen the display size in pixels ( output resolution ) + //Vector2 screen = {720, 480}; Vector2 screen = {1080, 720}; //! viewport is the area of the world visible through the camera (in world units) + //Vector2 viewport = {720, 480}; Vector2 viewport = {2000, 1000}; //! scale scaling factor from world units to pixel coordinates //! Zoom level of the camera view. - double zoom = 1.5f; + double zoom = 1.0f; public: /** diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 13eabd1..b6c2ccf 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -33,7 +33,7 @@ public: * * Only messages with equal or higher priority than this value will be logged. */ - Log::Level level = Log::Level::INFO; + Log::Level level = Log::Level::DEBUG; /** * \brief Colored log output * diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 778e746..de7d08f 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -124,8 +125,8 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, pixel_width *= img_scale; pixel_height *= img_scale; - int pixel_x = static_cast((pos.x - cam_pos.x - pixel_width / 2)); - int pixel_y = static_cast((pos.y - cam_pos.y - pixel_height / 2)); + int pixel_x = static_cast((pos.x - cam_pos.x + this->viewport.w / 2 - pixel_width / 2)); + int pixel_y = static_cast((pos.y - cam_pos.y + this->viewport.h / 2 - pixel_height / 2)); return SDL_Rect{ .x = pixel_x, @@ -168,10 +169,10 @@ 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) { + 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; - this->viewport.w = cam.screen.x; + this->viewport.h = (int)cam.screen.y; + this->viewport.w = (int)cam.screen.x; } double screen_aspect = cam.screen.x / cam.screen.y; @@ -185,7 +186,6 @@ void SDLContext::set_camera(const Camera & cam, Vector2 & scale) { // calculate black bars if (screen_aspect > viewport_aspect) { // lettorboxing - view.h = static_cast(cam.screen.y / cam.zoom); view.w = static_cast(cam.screen.y * viewport_aspect); view.x = static_cast(cam.screen.x - view.w) / 2; view.y = 0; @@ -196,7 +196,6 @@ void SDLContext::set_camera(const Camera & cam, Vector2 & scale) { view.x = 0; view.y = static_cast(cam.screen.y - view.h) / 2; } - // set drawing area SDL_RenderSetViewport(this->game_renderer.get(), &view); diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 03f9ec9..3e9b8db 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -179,7 +179,7 @@ private: //! 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}; + SDL_Rect viewport = {0, 0, 1200, 1200}; }; } // namespace crepe diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index fad174e..36997be 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -24,7 +24,7 @@ using namespace std; int main(int argc, char * argv[]) { ComponentManager mgr; - GameObject game_object = mgr.new_object("", "", Vector2{1000, 500}, 0, 1); + GameObject game_object = mgr.new_object("", "", Vector2{0, 0}, 0, 1); RenderSystem sys{mgr}; ParticleSystem psys{mgr}; AnimatorSystem asys{mgr}; @@ -62,7 +62,8 @@ int main(int argc, char * argv[]) { }); */ - game_object.add_component(Color::WHITE); + auto & cam = game_object.add_component(Color::WHITE); + cam.pos = {500, 200}; /* game_object -- cgit v1.2.3 From 8cfb59093ce7b18c2b81cc8429a7568a3ba21a73 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Tue, 26 Nov 2024 10:03:06 +0100 Subject: adjusted vector2 to vec2 --- src/crepe/api/Camera.h | 13 +++++++------ src/crepe/api/Vector2.h | 11 ++--------- src/crepe/facade/SDLContext.cpp | 20 +++++++++----------- src/crepe/facade/SDLContext.h | 16 ++++++++-------- src/crepe/system/RenderSystem.h | 8 +++----- src/example/rendering_particle.cpp | 5 ++--- 6 files changed, 31 insertions(+), 42 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index 137c8ed..eea1b28 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -2,7 +2,8 @@ #include "Color.h" #include "Component.h" -#include "api/Vector2.h" + +#include "types.h" namespace crepe { @@ -29,15 +30,15 @@ public: Color bg_color; //! pos The position of the camera in world units - Vector2 pos = {0, 0}; + vec2 pos = {0, 0}; //! screen the display size in pixels ( output resolution ) - //Vector2 screen = {720, 480}; - Vector2 screen = {1080, 720}; + //vec2 screen = {720, 480}; + vec2 screen = {1080, 720}; //! viewport is the area of the world visible through the camera (in world units) - //Vector2 viewport = {720, 480}; - Vector2 viewport = {2000, 1000}; + //vec2 viewport = {720, 480}; + vec2 viewport = {2000, 1000}; //! scale scaling factor from world units to pixel coordinates //! Zoom level of the camera view. diff --git a/src/crepe/api/Vector2.h b/src/crepe/api/Vector2.h index 019d849..0688fac 100644 --- a/src/crepe/api/Vector2.h +++ b/src/crepe/api/Vector2.h @@ -34,15 +34,11 @@ struct Vector2 { //! Multiplies this vector by another vector element-wise and updates this vector. Vector2 & operator*=(const Vector2 & other); - //! Multiplies a scalar value to both components of this vector and updates this vector. - Vector2 & operator*=(const Vector2 & other); - - //! Divides this vector by another vector element-wise and updates this vector. - Vector2 operator/(const Vector2 & other) const; - //! Divides a scalar value to both components of this vector and updates this vector. Vector2 operator/(const T & other) const; + Vector2 operator/(T other) const; + //! Adds another vector to this vector and updates this vector. Vector2 & operator+=(const Vector2 & other); @@ -55,9 +51,6 @@ struct Vector2 { //! Subtracts a scalar value from both components of this vector and updates this vector. Vector2 & operator-=(T other); - //! Multiplies this vector by another vector element-wise and updates this vector. - Vector2 & operator*=(const Vector2 & other); - //! Multiplies this vector by a scalar and updates this vector. Vector2 & operator*=(T other); diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index de7d08f..fc59d84 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -16,10 +15,9 @@ #include "../api/Sprite.h" #include "../api/Texture.h" #include "../api/Transform.h" -#include "../api/Vector2.h" #include "../util/Log.h" -#include "api/Vector2.h" +#include "types.h" #include "SDLContext.h" using namespace crepe; @@ -108,9 +106,9 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { .h = sprite.sprite_rect.h, }; } -SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, - const Vector2 & cam_pos, const double & img_scale, - const Vector2 & cam_scale) const { +SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, + const vec2 & cam_pos, const double & img_scale, + const vec2 & cam_scale) const { int pixel_width, pixel_height; @@ -136,9 +134,9 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const Vector2 & pos, }; } -void SDLContext::draw_particle(const Sprite & sprite, const Vector2 & pos, - const double & angle, const Vector2 & cam_pos, - const double & img_scale, const Vector2 & cam_scale) { +void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, + const double & angle, const vec2 & cam_pos, + const double & img_scale, const vec2 & cam_scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) @@ -152,7 +150,7 @@ void SDLContext::draw_particle(const Sprite & sprite, const Vector2 & pos, } void SDLContext::draw(const Sprite & sprite, const Transform & transform, - const Vector2 & cam_pos, const Vector2 & cam_scale) { + const vec2 & cam_pos, const vec2 & cam_scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) @@ -166,7 +164,7 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, &dstrect, transform.rotation, NULL, render_flip); } -void SDLContext::set_camera(const Camera & cam, Vector2 & scale) { +void SDLContext::set_camera(const Camera & cam, vec2 & scale) { // resize window if (this->viewport.w != (int) cam.screen.x || this->viewport.h != (int) cam.screen.y) { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index aed5797..c9f3299 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -120,8 +120,8 @@ private: * \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); + void draw(const Sprite & sprite, const Transform & transform, const vec2 & cam_pos, + const vec2 & cam_scale); /** * \brief Draws a particle to the screen using the specified parameters @@ -133,9 +133,9 @@ private: * \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); + void draw_particle(const Sprite & sprite, const vec2 & pos, const double & angle, + const vec2 & cam_pos, const double & img_scale, + const vec2 & cam_scale); //! Clears the screen, preparing for a new frame. void clear_screen(); @@ -147,7 +147,7 @@ private: * \brief sets the background of the camera (will be adjusted in future PR) * \param camera Reference to the Camera object. */ - void set_camera(const Camera & camera, Vector2 & scale); + void set_camera(const Camera & camera, vec2 & scale); private: /** @@ -168,8 +168,8 @@ private: * \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, - const double & img_scale, const Vector2 & scale) const; + SDL_Rect get_dst_rect(const Sprite & sprite, const vec2 & pos, const vec2 & cam_pos, + const double & img_scale, const vec2 & scale) const; private: //! sdl Window diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index f010a83..97222f3 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -1,13 +1,11 @@ #pragma once -#include -#include +#include -#include "api/Vector2.h" #include "facade/SDLContext.h" #include "System.h" -#include +#include "types.h" namespace crepe { @@ -82,7 +80,7 @@ private: Camera * curr_cam_ref = nullptr; // TODO: needs a better solution - Vector2 scale; + vec2 scale; SDLContext & context = SDLContext::get_instance(); }; diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 49e8e9d..80726bc 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -2,7 +2,6 @@ #include "api/Camera.h" #include "system/AnimatorSystem.h" #include "system/ParticleSystem.h" -#include "types.h" #include #include @@ -14,7 +13,7 @@ #include #include #include -#include +#include #include #include @@ -25,7 +24,7 @@ using namespace std; int main(int argc, char * argv[]) { ComponentManager mgr; - GameObject game_object = mgr.new_object("", "", Vector2{0, 0}, 0, 1); + GameObject game_object = mgr.new_object("", "", vec2{0, 0}, 0, 1); RenderSystem sys{mgr}; ParticleSystem psys{mgr}; AnimatorSystem asys{mgr}; -- cgit v1.2.3 From 60a9879f268977d57b460eec830a3f8b5b24e1a2 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Tue, 26 Nov 2024 10:26:42 +0100 Subject: added window default config settings --- src/crepe/api/Camera.h | 11 +++++------ src/crepe/api/Config.h | 9 +++++++++ src/crepe/facade/SDLContext.cpp | 12 +++++------- src/crepe/facade/SDLContext.h | 4 ++-- src/example/rendering_particle.cpp | 1 + 5 files changed, 22 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index eea1b28..ec94c44 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -3,6 +3,7 @@ #include "Color.h" #include "Component.h" +#include "api/Config.h" #include "types.h" namespace crepe { @@ -30,19 +31,17 @@ public: Color bg_color; //! pos The position of the camera in world units - vec2 pos = {0, 0}; + vec2 pos = Config::get_instance().win_set.pos; //! screen the display size in pixels ( output resolution ) - //vec2 screen = {720, 480}; - vec2 screen = {1080, 720}; + vec2 screen = Config::get_instance().win_set.def_size; //! viewport is the area of the world visible through the camera (in world units) - //vec2 viewport = {720, 480}; - vec2 viewport = {2000, 1000}; + vec2 viewport = Config::get_instance().win_set.def_size; //! scale scaling factor from world units to pixel coordinates //! Zoom level of the camera view. - double zoom = 1.0f; + double zoom = Config::get_instance().win_set.zoom; public: /** diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 671fd02..e1aef7d 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -1,6 +1,7 @@ #pragma once #include "../util/Log.h" +#include "types.h" namespace crepe { @@ -62,6 +63,14 @@ public: double gravity = 1; } physics; + //! default window settings + struct { + //TODO make this constexpr because this will never change + vec2 def_size = {1080,720}; + vec2 pos = {0,0}; + float zoom = 1.0f; + } win_set; + //! Asset loading options struct { /** diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index fc59d84..8b29f8a 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -30,14 +30,13 @@ SDLContext & SDLContext::get_instance() { SDLContext::SDLContext() { dbg_trace(); - // FIXME: read window defaults from config manager if (SDL_Init(SDL_INIT_VIDEO) != 0) { throw runtime_error(format("SDLContext: SDL_Init error: {}", SDL_GetError())); } SDL_Window * tmp_window = SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - this->viewport.w, this->viewport.h, 0); + this->window.x, this->window.y, 0); if (!tmp_window) { throw runtime_error(format("SDLContext: SDL_Window error: {}", SDL_GetError())); } @@ -123,8 +122,8 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, pixel_width *= img_scale; pixel_height *= img_scale; - int pixel_x = static_cast((pos.x - cam_pos.x + this->viewport.w / 2 - pixel_width / 2)); - int pixel_y = static_cast((pos.y - cam_pos.y + this->viewport.h / 2 - pixel_height / 2)); + int pixel_x = static_cast((pos.x - cam_pos.x + this->window.x / 2 - pixel_width / 2)); + int pixel_y = static_cast((pos.y - cam_pos.y + this->window.y / 2 - pixel_height / 2)); return SDL_Rect{ .x = pixel_x, @@ -167,10 +166,9 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, void SDLContext::set_camera(const Camera & cam, vec2 & scale) { // resize window - if (this->viewport.w != (int) cam.screen.x || this->viewport.h != (int) cam.screen.y) { + if ((int)this->window.x != (int) cam.screen.x || (int)this->window.y != (int) cam.screen.y) { SDL_SetWindowSize(this->game_window.get(), (int) cam.screen.x, (int) cam.screen.y); - this->viewport.h = (int)cam.screen.y; - this->viewport.w = (int)cam.screen.x; + this->window = cam.screen; } double screen_aspect = cam.screen.x / cam.screen.y; diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index c9f3299..f72eecb 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -13,6 +13,7 @@ #include "../api/Transform.h" #include "api/Camera.h" +#include "api/Config.h" #include "types.h" namespace crepe { @@ -179,8 +180,7 @@ private: std::unique_ptr> 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, 1200, 1200}; + vec2 window = Config::get_instance().win_set.def_size; }; } // namespace crepe diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 80726bc..54a90b5 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -64,6 +64,7 @@ int main(int argc, char * argv[]) { auto & cam = game_object.add_component(Color::WHITE); cam.pos = {500, 200}; + cam.viewport = {2000,1000}; /* game_object -- cgit v1.2.3 From b4c07db977ab18302a0d953ef22a32a171e688f8 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Tue, 26 Nov 2024 10:27:14 +0100 Subject: make format --- src/crepe/api/Config.h | 6 +++--- src/crepe/facade/SDLContext.cpp | 24 +++++++++++++----------- src/crepe/facade/SDLContext.h | 3 +-- src/example/rendering_particle.cpp | 4 ++-- 4 files changed, 19 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index e1aef7d..6de93f0 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -65,9 +65,9 @@ public: //! default window settings struct { - //TODO make this constexpr because this will never change - vec2 def_size = {1080,720}; - vec2 pos = {0,0}; + //TODO make this constexpr because this will never change + vec2 def_size = {1080, 720}; + vec2 pos = {0, 0}; float zoom = 1.0f; } win_set; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 8b29f8a..ac6b089 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -17,8 +17,8 @@ #include "../api/Transform.h" #include "../util/Log.h" -#include "types.h" #include "SDLContext.h" +#include "types.h" using namespace crepe; using namespace std; @@ -123,7 +123,8 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, pixel_height *= img_scale; int pixel_x = static_cast((pos.x - cam_pos.x + this->window.x / 2 - pixel_width / 2)); - int pixel_y = static_cast((pos.y - cam_pos.y + this->window.y / 2 - pixel_height / 2)); + int pixel_y + = static_cast((pos.y - cam_pos.y + this->window.y / 2 - pixel_height / 2)); return SDL_Rect{ .x = pixel_x, @@ -133,9 +134,9 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, }; } -void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, - const double & angle, const vec2 & cam_pos, - const double & img_scale, const vec2 & cam_scale) { +void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, const double & angle, + const vec2 & cam_pos, const double & img_scale, + const vec2 & cam_scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) @@ -148,8 +149,8 @@ void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, &dstrect, angle, NULL, render_flip); } -void SDLContext::draw(const Sprite & sprite, const Transform & transform, - const vec2 & cam_pos, const vec2 & cam_scale) { +void SDLContext::draw(const Sprite & sprite, const Transform & transform, const vec2 & cam_pos, + const vec2 & cam_scale) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) @@ -166,19 +167,20 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, void SDLContext::set_camera(const Camera & cam, vec2 & scale) { // resize window - if ((int)this->window.x != (int) cam.screen.x || (int)this->window.y != (int) cam.screen.y) { + if ((int) this->window.x != (int) cam.screen.x + || (int) this->window.y != (int) cam.screen.y) { SDL_SetWindowSize(this->game_window.get(), (int) cam.screen.x, (int) cam.screen.y); this->window = cam.screen; } 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 @@ -192,7 +194,7 @@ void SDLContext::set_camera(const Camera & cam, vec2 & scale) { view.x = 0; view.y = static_cast(cam.screen.y - view.h) / 2; } - // set drawing area + // set drawing area SDL_RenderSetViewport(this->game_renderer.get(), &view); SDL_RenderSetLogicalSize(this->game_renderer.get(), cam.viewport.x, cam.viewport.y); diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index f72eecb..542a8bf 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -135,8 +135,7 @@ private: * \param cam_scale camera scalar for world to screen */ void draw_particle(const Sprite & sprite, const vec2 & pos, const double & angle, - const vec2 & cam_pos, const double & img_scale, - const vec2 & cam_scale); + const vec2 & cam_pos, const double & img_scale, const vec2 & cam_scale); //! Clears the screen, preparing for a new frame. void clear_screen(); diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 54a90b5..c70e1af 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -13,8 +13,8 @@ #include #include #include -#include #include +#include #include #include @@ -64,7 +64,7 @@ int main(int argc, char * argv[]) { auto & cam = game_object.add_component(Color::WHITE); cam.pos = {500, 200}; - cam.viewport = {2000,1000}; + cam.viewport = {2000, 1000}; /* game_object -- cgit v1.2.3 From c5d1b46ba804eaabdb4fc2f4f4295292032def65 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Tue, 26 Nov 2024 19:19:21 +0100 Subject: implemented all the feedback --- src/crepe/api/Texture.cpp | 2 -- src/crepe/facade/SDLContext.cpp | 39 +++++++++++++++++--------------------- src/crepe/facade/SDLContext.h | 8 ++++---- src/crepe/system/RenderSystem.cpp | 6 +++--- src/example/rendering_particle.cpp | 3 +-- 5 files changed, 25 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Texture.cpp b/src/crepe/api/Texture.cpp index 264d7b1..eeb86e9 100644 --- a/src/crepe/api/Texture.cpp +++ b/src/crepe/api/Texture.cpp @@ -1,5 +1,3 @@ -#include - #include "../facade/SDLContext.h" #include "../util/Log.h" diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index ac6b089..55b0082 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -105,37 +105,32 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { .h = sprite.sprite_rect.h, }; } -SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, - const vec2 & cam_pos, const double & img_scale, - const vec2 & cam_scale) const { +SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, + const double & img_scale, const vec2 & cam_scale) const { - int pixel_width, pixel_height; + int width, height; if (sprite.sprite_rect.w > sprite.sprite_rect.h) { - pixel_width = static_cast(sprite.width * cam_scale.x); - pixel_height = static_cast(pixel_width / sprite.aspect_ratio); + width = static_cast(sprite.width * cam_scale.x); + height = static_cast(width / sprite.aspect_ratio); } else { - pixel_height = static_cast(sprite.height * cam_scale.y); - pixel_width = static_cast(pixel_height * sprite.aspect_ratio); + height = static_cast(sprite.height * cam_scale.y); + width = static_cast(height * sprite.aspect_ratio); } - pixel_width *= img_scale; - pixel_height *= img_scale; - - int pixel_x = static_cast((pos.x - cam_pos.x + this->window.x / 2 - pixel_width / 2)); - int pixel_y - = static_cast((pos.y - cam_pos.y + this->window.y / 2 - pixel_height / 2)); + width *= img_scale; + height *= img_scale; return SDL_Rect{ - .x = pixel_x, - .y = pixel_y, - .w = pixel_width, - .h = pixel_height, + .x = static_cast((pos.x - cam.pos.x + (cam.viewport.x / 2) - width / 2)), + .y = static_cast((pos.y - cam.pos.y + (cam.viewport.y / 2) - height / 2)), + .w = width, + .h = height, }; } void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, const double & angle, - const vec2 & cam_pos, const double & img_scale, + const double & img_scale, const Camera & cam, const vec2 & cam_scale) { SDL_RendererFlip render_flip @@ -143,13 +138,13 @@ void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, const do | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, pos, cam_pos, img_scale, cam_scale); + SDL_Rect dstrect = this->get_dst_rect(sprite, pos, cam , img_scale, cam_scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, &dstrect, angle, NULL, render_flip); } -void SDLContext::draw(const Sprite & sprite, const Transform & transform, const vec2 & cam_pos, +void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Camera & cam, const vec2 & cam_scale) { SDL_RendererFlip render_flip @@ -158,7 +153,7 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const SDL_Rect srcrect = this->get_src_rect(sprite); SDL_Rect dstrect - = this->get_dst_rect(sprite, transform.position, cam_pos, transform.scale, cam_scale); + = this->get_dst_rect(sprite, transform.position, cam, transform.scale, cam_scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, &dstrect, transform.rotation, NULL, render_flip); diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 542a8bf..1a9316e 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -121,7 +121,7 @@ private: * \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 vec2 & cam_pos, + void draw(const Sprite & sprite, const Transform & transform, const Camera & cam, const vec2 & cam_scale); /** @@ -135,7 +135,7 @@ private: * \param cam_scale camera scalar for world to screen */ void draw_particle(const Sprite & sprite, const vec2 & pos, const double & angle, - const vec2 & cam_pos, const double & img_scale, const vec2 & cam_scale); + const double & img_scale, const Camera & cam, const vec2 & cam_scale); //! Clears the screen, preparing for a new frame. void clear_screen(); @@ -168,8 +168,8 @@ private: * \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 vec2 & pos, const vec2 & cam_pos, - const double & img_scale, const vec2 & scale) const; + SDL_Rect get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, + const double & img_scale, const vec2 & cam_scale) const; private: //! sdl Window diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 1dd1699..564fc79 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -72,14 +72,14 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) for (const Particle & p : em.data.particles) { if (!p.active) continue; - this->context.draw_particle(sprite, p.position, p.angle, this->curr_cam_ref->pos, - scale, this->scale); + this->context.draw_particle(sprite, p.position, p.angle, scale, + *this->curr_cam_ref, this->scale); } } return rendering_particles; } void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { - this->context.draw(sprite, tm, this->curr_cam_ref->pos, this->scale); + this->context.draw(sprite, tm, *this->curr_cam_ref, this->scale); } void RenderSystem::render() { diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index c70e1af..eec2769 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -63,8 +63,7 @@ int main(int argc, char * argv[]) { */ auto & cam = game_object.add_component(Color::WHITE); - cam.pos = {500, 200}; - cam.viewport = {2000, 1000}; + cam.pos = {0, 0}; /* game_object -- cgit v1.2.3 From 368aeba5bcfafe445b3af5748f3798aa75003bf2 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Wed, 27 Nov 2024 10:35:06 +0100 Subject: implemented feedback on PR40 and made camera sizes ivec2 --- src/crepe/api/Camera.h | 11 ++++----- src/crepe/api/Config.h | 2 +- src/crepe/api/Sprite.cpp | 3 ++- src/crepe/facade/SDLContext.cpp | 49 +++++++++++++++++++------------------- src/crepe/facade/SDLContext.h | 27 ++++++++------------- src/crepe/system/RenderSystem.cpp | 8 +++---- src/crepe/system/RenderSystem.h | 4 +--- src/example/rendering_particle.cpp | 8 +++---- 8 files changed, 51 insertions(+), 61 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index ec94c44..151e5d9 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -2,8 +2,6 @@ #include "Color.h" #include "Component.h" - -#include "api/Config.h" #include "types.h" namespace crepe { @@ -31,17 +29,18 @@ public: Color bg_color; //! pos The position of the camera in world units - vec2 pos = Config::get_instance().win_set.pos; + vec2 pos = {0,0}; //! screen the display size in pixels ( output resolution ) - vec2 screen = Config::get_instance().win_set.def_size; + ivec2 screen = {1080,720}; //! viewport is the area of the world visible through the camera (in world units) - vec2 viewport = Config::get_instance().win_set.def_size; + //vec2 viewport = {1000, 2000}; + ivec2 viewport = {500, 1000}; //! scale scaling factor from world units to pixel coordinates //! Zoom level of the camera view. - double zoom = Config::get_instance().win_set.zoom; + double zoom = 1.0f; public: /** diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 6de93f0..2723461 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -66,7 +66,7 @@ public: //! default window settings struct { //TODO make this constexpr because this will never change - vec2 def_size = {1080, 720}; + ivec2 def_size = {1080, 720}; vec2 pos = {0, 0}; float zoom = 1.0f; } win_set; diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index c219dd0..27f219c 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -1,3 +1,4 @@ +#include #include #include "../util/Log.h" @@ -16,7 +17,7 @@ Sprite::Sprite(game_object_id_t id, const shared_ptr image, const Color color(color), flip(flip), sprite_image(image), - aspect_ratio(sprite_image->get_width() / sprite_image->get_height()) { + aspect_ratio(static_cast(sprite_image->get_width()) / sprite_image->get_height()) { dbg_trace(); this->sprite_rect.w = sprite_image->get_width(); diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 55b0082..fca3de4 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -18,6 +19,7 @@ #include "../util/Log.h" #include "SDLContext.h" +#include "api/Config.h" #include "types.h" using namespace crepe; @@ -34,9 +36,11 @@ SDLContext::SDLContext() { if (SDL_Init(SDL_INIT_VIDEO) != 0) { throw runtime_error(format("SDLContext: SDL_Init error: {}", SDL_GetError())); } + + auto & cfg = Config::get_instance().win_set; SDL_Window * tmp_window = SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - this->window.x, this->window.y, 0); + cfg.def_size.x,cfg.def_size.y, 0); if (!tmp_window) { throw runtime_error(format("SDLContext: SDL_Window error: {}", SDL_GetError())); } @@ -106,20 +110,22 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { }; } SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, - const double & img_scale, const vec2 & cam_scale) const { + const double & img_scale) const { int width, height; - if (sprite.sprite_rect.w > sprite.sprite_rect.h) { - width = static_cast(sprite.width * cam_scale.x); - height = static_cast(width / sprite.aspect_ratio); + if (sprite.width > sprite.height) { + width = sprite.width; + height = static_cast(sprite.width / sprite.aspect_ratio); } else { - height = static_cast(sprite.height * cam_scale.y); - width = static_cast(height * sprite.aspect_ratio); + height = sprite.height; + width = static_cast(sprite.height * sprite.aspect_ratio); } - width *= img_scale; - height *= img_scale; + cout << width << " " << height << " " << " " << sprite.aspect_ratio << endl; + + width *= img_scale * cam.zoom; + height *= img_scale * cam.zoom; return SDL_Rect{ .x = static_cast((pos.x - cam.pos.x + (cam.viewport.x / 2) - width / 2)), @@ -130,22 +136,20 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, const } void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, const double & angle, - const double & img_scale, const Camera & cam, - const vec2 & cam_scale) { + const double & img_scale, const Camera & cam) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, pos, cam , img_scale, cam_scale); + SDL_Rect dstrect = this->get_dst_rect(sprite, pos, cam , img_scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, &dstrect, angle, NULL, render_flip); } -void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Camera & cam, - const vec2 & cam_scale) { +void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Camera & cam) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) @@ -153,32 +157,29 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const SDL_Rect srcrect = this->get_src_rect(sprite); SDL_Rect dstrect - = this->get_dst_rect(sprite, transform.position, cam, transform.scale, cam_scale); + = this->get_dst_rect(sprite, transform.position, cam, transform.scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, &dstrect, transform.rotation, NULL, render_flip); } -void SDLContext::set_camera(const Camera & cam, vec2 & scale) { +void SDLContext::set_camera(const Camera & cam) { // resize window - if ((int) this->window.x != (int) cam.screen.x - || (int) this->window.y != (int) cam.screen.y) { - SDL_SetWindowSize(this->game_window.get(), (int) cam.screen.x, (int) cam.screen.y); - this->window = cam.screen; + int w,h; + SDL_GetWindowSize(this->game_window.get(), &w, &h); + if ( w != cam.screen.x || h != cam.screen.y) { + SDL_SetWindowSize(this->game_window.get(), cam.screen.x, cam.screen.y); } 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(cam.screen.y / cam.zoom); view.w = static_cast(cam.screen.y * viewport_aspect); view.x = static_cast(cam.screen.x - view.w) / 2; view.y = 0; diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 1a9316e..2e40b6f 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -11,9 +11,8 @@ #include "../api/Sprite.h" #include "../api/Transform.h" -#include "api/Camera.h" +#include "../api/Camera.h" -#include "api/Config.h" #include "types.h" namespace crepe { @@ -101,14 +100,14 @@ private: * \param texture Reference to the Texture object. * \return Width of the texture as an integer. */ - int get_width(const Texture &) const; + int get_width(const Texture & texture) const; /** * \brief Gets the height of a texture. * \param texture Reference to the Texture object. * \return Height of the texture as an integer. */ - int get_height(const Texture &) const; + int get_height(const Texture & texture) const; private: //! Will use draw,clear_screen, present_screen, camera. @@ -118,11 +117,9 @@ 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 cam_pos position of the current camera in the scene - * \param cam_scale multiplier for the world to screen + * \param cam camera of the current scene */ - void draw(const Sprite & sprite, const Transform & transform, const Camera & cam, - const vec2 & cam_scale); + void draw(const Sprite & sprite, const Transform & transform, const Camera & cam); /** * \brief Draws a particle to the screen using the specified parameters @@ -130,12 +127,11 @@ private: * \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 + * \param cam camera of the current scene */ void draw_particle(const Sprite & sprite, const vec2 & pos, const double & angle, - const double & img_scale, const Camera & cam, const vec2 & cam_scale); + const double & img_scale, const Camera & cam); //! Clears the screen, preparing for a new frame. void clear_screen(); @@ -147,7 +143,7 @@ private: * \brief sets the background of the camera (will be adjusted in future PR) * \param camera Reference to the Camera object. */ - void set_camera(const Camera & camera, vec2 & scale); + void set_camera(const Camera & camera); private: /** @@ -163,13 +159,12 @@ private: * * \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 cam the camera of the current scene * \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 vec2 & pos, const Camera & cam, - const double & img_scale, const vec2 & cam_scale) const; + const double & img_scale) const; private: //! sdl Window @@ -178,8 +173,6 @@ private: //! renderer for the crepe engine std::unique_ptr> game_renderer; - //! viewport for the camera window - vec2 window = Config::get_instance().win_set.def_size; }; } // namespace crepe diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 564fc79..beed9ce 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include @@ -10,7 +9,6 @@ #include "../api/ParticleEmitter.h" #include "../api/Sprite.h" #include "../api/Transform.h" -#include "../api/Vector2.h" #include "../facade/SDLContext.h" #include "RenderSystem.h" @@ -30,7 +28,7 @@ void RenderSystem::update_camera() { for (Camera & cam : cameras) { if (!cam.active) continue; - this->context.set_camera(cam, this->scale); + this->context.set_camera(cam); this->curr_cam_ref = &cam; } } @@ -73,13 +71,13 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) for (const Particle & p : em.data.particles) { if (!p.active) continue; this->context.draw_particle(sprite, p.position, p.angle, scale, - *this->curr_cam_ref, this->scale); + *this->curr_cam_ref); } } return rendering_particles; } void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { - this->context.draw(sprite, tm, *this->curr_cam_ref, this->scale); + this->context.draw(sprite, tm, *this->curr_cam_ref); } void RenderSystem::render() { diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 97222f3..08930b0 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -77,10 +77,8 @@ private: private: //! Pointer to the current active camera for rendering - Camera * curr_cam_ref = nullptr; // TODO: needs a better solution - - vec2 scale; + Camera * curr_cam_ref = nullptr; SDLContext & context = SDLContext::get_instance(); }; diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index eec2769..680c0ac 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -32,13 +32,13 @@ int main(int argc, char * argv[]) { Color color(255, 255, 255, 255); Sprite & test_sprite = game_object.add_component( - make_shared("asset/spritesheet/spritesheet_test.png"), color, + make_shared("asset/texture/test_ap43.png"), color, FlipSettings{true, true}); test_sprite.order_in_layer = 5; - test_sprite.width = 1000; - test_sprite.height = 500; + test_sprite.width = 259; + test_sprite.height = 195; - game_object.add_component(test_sprite, 4, 1, 0).active = true; + //game_object.add_component(test_sprite, 4, 1, 0).active = true; /* auto & test = game_object.add_component(ParticleEmitter::Data{ -- cgit v1.2.3 From 3b433353a83c2436b69f73ca1048842d906b1147 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Wed, 27 Nov 2024 10:38:47 +0100 Subject: removed most static cast because of camera sizes vec2 -> ivec2 --- src/crepe/facade/SDLContext.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index fca3de4..6e22316 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -116,10 +116,10 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, const if (sprite.width > sprite.height) { width = sprite.width; - height = static_cast(sprite.width / sprite.aspect_ratio); + height = sprite.width / sprite.aspect_ratio; } else { height = sprite.height; - width = static_cast(sprite.height * sprite.aspect_ratio); + width = sprite.height * sprite.aspect_ratio; } cout << width << " " << height << " " << " " << sprite.aspect_ratio << endl; @@ -179,16 +179,16 @@ void SDLContext::set_camera(const Camera & cam) { // calculate black bars if (screen_aspect > viewport_aspect) { // lettorboxing - view.h = static_cast(cam.screen.y / cam.zoom); - view.w = static_cast(cam.screen.y * viewport_aspect); - view.x = static_cast(cam.screen.x - view.w) / 2; + view.h = cam.screen.y / cam.zoom; + view.w = cam.screen.y * viewport_aspect; + view.x = (cam.screen.x - view.w) / 2; view.y = 0; } else { // pillarboxing - view.h = static_cast(cam.screen.x / viewport_aspect); - view.w = static_cast(cam.screen.x / cam.zoom); + view.h = cam.screen.x / viewport_aspect; + view.w = cam.screen.x / cam.zoom; view.x = 0; - view.y = static_cast(cam.screen.y - view.h) / 2; + view.y = (cam.screen.y - view.h) / 2; } // set drawing area SDL_RenderSetViewport(this->game_renderer.get(), &view); @@ -202,8 +202,8 @@ void SDLContext::set_camera(const Camera & cam) { SDL_Rect bg = { .x = 0, .y = 0, - .w = static_cast(cam.viewport.x), - .h = static_cast(cam.viewport.y), + .w = cam.viewport.x, + .h = cam.viewport.y, }; // fill bg color SDL_RenderFillRect(this->game_renderer.get(), &bg); -- cgit v1.2.3 From 72e605528ebe8347e1457358fe9025c215afe163 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Wed, 27 Nov 2024 11:08:50 +0100 Subject: implemented feedback, removed width so that user only can set height. --- src/crepe/api/Animator.cpp | 2 +- src/crepe/api/Sprite.cpp | 1 - src/crepe/api/Sprite.h | 2 -- src/crepe/facade/SDLContext.cpp | 13 ++----------- src/example/rendering_particle.cpp | 2 +- 5 files changed, 4 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index 0043896..b6540cf 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -22,6 +22,6 @@ Animator::Animator(game_object_id_t id, Sprite & ss, int row, int col, int col_a this->active = false; // need to do this for to get the aspect ratio for a single clipping in the spritesheet - this->spritesheet.aspect_ratio = (double) animator_rect.w / (double) animator_rect.h; + this->spritesheet.aspect_ratio = static_cast(animator_rect.w) / animator_rect.h; } Animator::~Animator() { dbg_trace(); } diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index 27f219c..58e0884 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -2,7 +2,6 @@ #include #include "../util/Log.h" -#include "facade/SDLContext.h" #include "Component.h" #include "Sprite.h" diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 89f9121..7d5f4c3 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -63,8 +63,6 @@ public: //! Order within the sorting layer uint8_t order_in_layer = 0; - //! width in world units - int width = 0; //! height in world units int height = 0; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 6e22316..abb3cb7 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -112,17 +112,8 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, const double & img_scale) const { - int width, height; - - if (sprite.width > sprite.height) { - width = sprite.width; - height = sprite.width / sprite.aspect_ratio; - } else { - height = sprite.height; - width = sprite.height * sprite.aspect_ratio; - } - - cout << width << " " << height << " " << " " << sprite.aspect_ratio << endl; + int width = sprite.height * sprite.aspect_ratio; + int height = sprite.height; width *= img_scale * cam.zoom; height *= img_scale * cam.zoom; diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 680c0ac..afa064d 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -35,10 +35,10 @@ int main(int argc, char * argv[]) { make_shared("asset/texture/test_ap43.png"), color, FlipSettings{true, true}); test_sprite.order_in_layer = 5; - test_sprite.width = 259; test_sprite.height = 195; //game_object.add_component(test_sprite, 4, 1, 0).active = true; + game_object.add_component(test_sprite, 1, 1, 0).active = true; /* auto & test = game_object.add_component(ParticleEmitter::Data{ -- cgit v1.2.3 From 7f66cd4a9b609f6bf36d005f5e38ef2a57d1c0d3 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Wed, 27 Nov 2024 11:15:02 +0100 Subject: removed shared_ptr from sprite --- src/crepe/api/Sprite.cpp | 9 ++++----- src/crepe/api/Sprite.h | 4 ++-- src/crepe/facade/SDLContext.cpp | 4 ++-- src/example/rendering_particle.cpp | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index 58e0884..2c2ca65 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -1,5 +1,4 @@ #include -#include #include "../util/Log.h" @@ -10,17 +9,17 @@ using namespace std; using namespace crepe; -Sprite::Sprite(game_object_id_t id, const shared_ptr image, const Color & color, +Sprite::Sprite(game_object_id_t id, const Texture & image, const Color & color, const FlipSettings & flip) : Component(id), color(color), flip(flip), sprite_image(image), - aspect_ratio(static_cast(sprite_image->get_width()) / sprite_image->get_height()) { + aspect_ratio(static_cast(sprite_image.get_width()) / sprite_image.get_height()) { dbg_trace(); - this->sprite_rect.w = sprite_image->get_width(); - this->sprite_rect.h = sprite_image->get_height(); + this->sprite_rect.w = sprite_image.get_width(); + this->sprite_rect.h = sprite_image.get_height(); } Sprite::~Sprite() { dbg_trace(); } diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 7d5f4c3..82dc4a7 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -44,7 +44,7 @@ public: * \param color Color tint applied to the sprite. * \param flip Flip settings for horizontal and vertical orientation. */ - Sprite(game_object_id_t id, const std::shared_ptr image, const Color & color, + Sprite(game_object_id_t id, const Texture & image, const Color & color, const FlipSettings & flip); /** @@ -53,7 +53,7 @@ public: ~Sprite(); //! Texture used for the sprite - const std::shared_ptr sprite_image; + const Texture & sprite_image; //! Color tint of the sprite Color color; //! Flip settings for the sprite diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index abb3cb7..72542e8 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -136,7 +136,7 @@ void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, const do SDL_Rect srcrect = this->get_src_rect(sprite); SDL_Rect dstrect = this->get_dst_rect(sprite, pos, cam , img_scale); - SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, + SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image.texture.get(), &srcrect, &dstrect, angle, NULL, render_flip); } @@ -150,7 +150,7 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const SDL_Rect dstrect = this->get_dst_rect(sprite, transform.position, cam, transform.scale); - SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image->texture.get(), &srcrect, + SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image.texture.get(), &srcrect, &dstrect, transform.rotation, NULL, render_flip); } diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index afa064d..3589cad 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -31,8 +31,8 @@ int main(int argc, char * argv[]) { Color color(255, 255, 255, 255); - Sprite & test_sprite = game_object.add_component( - make_shared("asset/texture/test_ap43.png"), color, + auto img = Texture("asset/texture/test_ap43.png"); + Sprite & test_sprite = game_object.add_component(img, color, FlipSettings{true, true}); test_sprite.order_in_layer = 5; test_sprite.height = 195; -- cgit v1.2.3 From 2b35e8f51a3536b62ea21dc82deec1e3b65568f6 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Wed, 27 Nov 2024 11:56:48 +0100 Subject: make format and offset for the cameara relative from the transform gameobject --- src/crepe/api/Camera.h | 12 +++++++----- src/crepe/facade/SDLContext.cpp | 11 +++++------ src/crepe/facade/SDLContext.h | 3 +-- src/crepe/system/RenderSystem.cpp | 3 +++ src/example/rendering_particle.cpp | 4 ++-- 5 files changed, 18 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index 151e5d9..1505107 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -28,17 +28,19 @@ public: //! Background color of the camera view. Color bg_color; - //! pos The position of the camera in world units - vec2 pos = {0,0}; + //! offset postion from the game object transform component + vec2 offset = {0, 0}; + + //! pos the postion of the camera in world space this will be filled with + //pos = transform + offset + vec2 pos = {0, 0}; //! screen the display size in pixels ( output resolution ) - ivec2 screen = {1080,720}; + ivec2 screen = {1080, 720}; //! viewport is the area of the world visible through the camera (in world units) - //vec2 viewport = {1000, 2000}; ivec2 viewport = {500, 1000}; - //! scale scaling factor from world units to pixel coordinates //! 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 72542e8..4887d35 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -40,7 +40,7 @@ SDLContext::SDLContext() { auto & cfg = Config::get_instance().win_set; SDL_Window * tmp_window = SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - cfg.def_size.x,cfg.def_size.y, 0); + cfg.def_size.x, cfg.def_size.y, 0); if (!tmp_window) { throw runtime_error(format("SDLContext: SDL_Window error: {}", SDL_GetError())); } @@ -134,7 +134,7 @@ void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, const do | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, pos, cam , img_scale); + SDL_Rect dstrect = this->get_dst_rect(sprite, pos, cam, img_scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image.texture.get(), &srcrect, &dstrect, angle, NULL, render_flip); @@ -147,8 +147,7 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect - = this->get_dst_rect(sprite, transform.position, cam, transform.scale); + SDL_Rect dstrect = this->get_dst_rect(sprite, transform.position, cam, transform.scale); SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image.texture.get(), &srcrect, &dstrect, transform.rotation, NULL, render_flip); @@ -157,9 +156,9 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const void SDLContext::set_camera(const Camera & cam) { // resize window - int w,h; + int w, h; SDL_GetWindowSize(this->game_window.get(), &w, &h); - if ( w != cam.screen.x || h != cam.screen.y) { + if (w != cam.screen.x || h != cam.screen.y) { SDL_SetWindowSize(this->game_window.get(), cam.screen.x, cam.screen.y); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 2e40b6f..35d667d 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -9,9 +9,9 @@ #include #include +#include "../api/Camera.h" #include "../api/Sprite.h" #include "../api/Transform.h" -#include "../api/Camera.h" #include "types.h" @@ -172,7 +172,6 @@ private: //! renderer for the crepe engine std::unique_ptr> game_renderer; - }; } // namespace crepe diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index beed9ce..9a8c1ba 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -28,8 +28,11 @@ void RenderSystem::update_camera() { for (Camera & cam : cameras) { if (!cam.active) continue; + const Transform & transform + = mgr.get_components_by_id(cam.game_object_id).front().get(); this->context.set_camera(cam); this->curr_cam_ref = &cam; + this->curr_cam_ref->pos = transform.position + this->curr_cam_ref->offset; } } diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 3589cad..ec71260 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -32,8 +32,8 @@ int main(int argc, char * argv[]) { Color color(255, 255, 255, 255); auto img = Texture("asset/texture/test_ap43.png"); - Sprite & test_sprite = game_object.add_component(img, color, - FlipSettings{true, true}); + Sprite & test_sprite + = game_object.add_component(img, color, FlipSettings{true, true}); test_sprite.order_in_layer = 5; test_sprite.height = 195; -- cgit v1.2.3 From ddb5bde6e5dd4d89faf419630086ece66690d6b5 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Wed, 27 Nov 2024 19:57:16 +0100 Subject: implemented feedback. biggest changes are teh camera_ref removed --- src/crepe/api/Animator.h | 5 ----- src/crepe/api/Camera.cpp | 8 ++++++-- src/crepe/api/Camera.h | 12 ++++++------ src/crepe/api/Config.h | 4 +--- src/crepe/api/Sprite.cpp | 8 ++++++-- src/crepe/api/Sprite.h | 18 +++++++++++------- src/crepe/api/Vector2.h | 1 + src/crepe/facade/SDLContext.cpp | 3 +-- src/crepe/system/RenderSystem.cpp | 28 ++++++++++++++++------------ src/crepe/system/RenderSystem.h | 13 ++++--------- src/example/rendering_particle.cpp | 8 +++----- 11 files changed, 55 insertions(+), 53 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Animator.h b/src/crepe/api/Animator.h index 53f4b91..7a5ef03 100644 --- a/src/crepe/api/Animator.h +++ b/src/crepe/api/Animator.h @@ -40,11 +40,6 @@ public: Animator(uint32_t id, Sprite & spritesheet, int row, int col, int col_animate); ~Animator(); // dbg_trace - Animator(const Animator &) = delete; - Animator(Animator &&) = delete; - Animator & operator=(const Animator &) = delete; - Animator & operator=(Animator &&) = delete; - private: //! A reference to the Sprite sheet containing the animation frames. Sprite & spritesheet; diff --git a/src/crepe/api/Camera.cpp b/src/crepe/api/Camera.cpp index 5835bdd..4397ac7 100644 --- a/src/crepe/api/Camera.cpp +++ b/src/crepe/api/Camera.cpp @@ -6,9 +6,13 @@ using namespace crepe; -Camera::Camera(game_object_id_t id, const Color & bg_color) +Camera::Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, + const ivec2 & viewport, const double & zoom) : Component(id), - bg_color(bg_color) { + bg_color(bg_color), + screen(screen), + viewport(viewport), + zoom(zoom) { dbg_trace(); } diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index 1505107..2ba37fc 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -21,12 +21,12 @@ public: * \param id Unique identifier for the camera component. * \param bg_color Background color for the camera view. */ - Camera(game_object_id_t id, const Color & bg_color); + Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, const ivec2 & viewport, const double & zoom); ~Camera(); // dbg_trace only public: //! Background color of the camera view. - Color bg_color; + const Color bg_color; //! offset postion from the game object transform component vec2 offset = {0, 0}; @@ -36,19 +36,19 @@ public: vec2 pos = {0, 0}; //! screen the display size in pixels ( output resolution ) - ivec2 screen = {1080, 720}; + const ivec2 screen = {1080, 720}; //! viewport is the area of the world visible through the camera (in world units) - ivec2 viewport = {500, 1000}; + const ivec2 viewport = {500, 1000}; //! Zoom level of the camera view. - double zoom = 1.0f; + const double zoom = 1.0f; public: /** * \brief Gets the maximum number of camera instances allowed. * \return Maximum instance count as an integer. */ - virtual int get_instances_max() const { return 10; } + virtual int get_instances_max() const { return 1; } }; } // namespace crepe diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 2723461..9b43cdf 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -66,9 +66,7 @@ public: //! default window settings struct { //TODO make this constexpr because this will never change - ivec2 def_size = {1080, 720}; - vec2 pos = {0, 0}; - float zoom = 1.0f; + const ivec2 def_size = {1080, 720}; } win_set; //! Asset loading options diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index 2c2ca65..21c8377 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -10,16 +10,20 @@ using namespace std; using namespace crepe; Sprite::Sprite(game_object_id_t id, const Texture & image, const Color & color, - const FlipSettings & flip) + const FlipSettings & flip, uint8_t sort_layer, uint8_t order_layer, int height) : Component(id), color(color), flip(flip), sprite_image(image), - aspect_ratio(static_cast(sprite_image.get_width()) / sprite_image.get_height()) { + sorting_in_layer(sort_layer), + order_in_layer(order_layer), + height(height) { + dbg_trace(); this->sprite_rect.w = sprite_image.get_width(); this->sprite_rect.h = sprite_image.get_height(); + this->aspect_ratio = static_cast(this->sprite_rect.w) / this->sprite_rect.h; } Sprite::~Sprite() { dbg_trace(); } diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 82dc4a7..1c40501 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -1,12 +1,10 @@ #pragma once -#include -#include - #include "../Component.h" #include "Color.h" #include "Texture.h" +#include namespace crepe { @@ -43,9 +41,12 @@ public: * \param image Shared pointer to the texture for this sprite. * \param color Color tint applied to the sprite. * \param flip Flip settings for horizontal and vertical orientation. + * \param order_layer decides the sorting in layer of the sprite. + * \param sort_layer decides the order in layer of the sprite. + * \param height the height of the image in game units */ Sprite(game_object_id_t id, const Texture & image, const Color & color, - const FlipSettings & flip); + const FlipSettings & flip, uint8_t sort_layer, uint8_t order_layer, int height); /** * \brief Destroys the Sprite instance. @@ -54,17 +55,20 @@ public: //! Texture used for the sprite const Texture & sprite_image; + //! Color tint of the sprite Color color; + //! Flip settings for the sprite FlipSettings flip; + //! Layer sorting level of the sprite - uint8_t sorting_in_layer = 0; + const uint8_t sorting_in_layer; //! Order within the sorting layer - uint8_t order_in_layer = 0; + const uint8_t order_in_layer; //! height in world units - int height = 0; + const int height; /** * \aspect_ratio ratio of the img so that scaling will not become weird diff --git a/src/crepe/api/Vector2.h b/src/crepe/api/Vector2.h index 0688fac..2b31d90 100644 --- a/src/crepe/api/Vector2.h +++ b/src/crepe/api/Vector2.h @@ -37,6 +37,7 @@ struct Vector2 { //! Divides a scalar value to both components of this vector and updates this vector. Vector2 operator/(const T & other) const; + //! Divides a scalar value to both components of this vector and updates this vector. Vector2 operator/(T other) const; //! Adds another vector to this vector and updates this vector. diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 4887d35..6c6af55 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -16,10 +15,10 @@ #include "../api/Sprite.h" #include "../api/Texture.h" #include "../api/Transform.h" +#include "../api/Config.h" #include "../util/Log.h" #include "SDLContext.h" -#include "api/Config.h" #include "types.h" using namespace crepe; diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 9a8c1ba..a1443cd 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -10,6 +10,7 @@ #include "../api/Sprite.h" #include "../api/Transform.h" #include "../facade/SDLContext.h" +#include "api/Camera.h" #include "RenderSystem.h" @@ -19,7 +20,8 @@ using namespace std; void RenderSystem::clear_screen() { this->context.clear_screen(); } void RenderSystem::present_screen() { this->context.present_screen(); } -void RenderSystem::update_camera() { + +const Camera & RenderSystem::update_camera() { ComponentManager & mgr = this->component_manager; RefVector cameras = mgr.get_components_by_type(); @@ -31,9 +33,10 @@ void RenderSystem::update_camera() { const Transform & transform = mgr.get_components_by_id(cam.game_object_id).front().get(); this->context.set_camera(cam); - this->curr_cam_ref = &cam; - this->curr_cam_ref->pos = transform.position + this->curr_cam_ref->offset; + cam.pos = transform.position + cam.offset; + return cam; } + throw std::runtime_error("No active cameras in current scene"); } bool sorting_comparison(const Sprite & a, const Sprite & b) { @@ -52,12 +55,12 @@ RefVector RenderSystem::sort(RefVector & objs) const { void RenderSystem::update() { this->clear_screen(); - this->update_camera(); this->render(); this->present_screen(); } -bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) { +bool RenderSystem::render_particle(const Sprite & sprite, const Camera & cam, + const double & scale) { ComponentManager & mgr = this->component_manager; @@ -73,19 +76,20 @@ bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) for (const Particle & p : em.data.particles) { if (!p.active) continue; - this->context.draw_particle(sprite, p.position, p.angle, scale, - *this->curr_cam_ref); + this->context.draw_particle(sprite, p.position, p.angle, scale, cam); } } return rendering_particles; } -void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { - this->context.draw(sprite, tm, *this->curr_cam_ref); +void RenderSystem::render_normal(const Sprite & sprite, const Camera & cam, + const Transform & tm) { + this->context.draw(sprite, tm, cam); } void RenderSystem::render() { - ComponentManager & mgr = this->component_manager; + const Camera & cam = this->update_camera(); + RefVector sprites = mgr.get_components_by_type(); RefVector sorted_sprites = this->sort(sprites); @@ -94,10 +98,10 @@ void RenderSystem::render() { const Transform & transform = mgr.get_components_by_id(sprite.game_object_id).front().get(); - bool rendered_particles = this->render_particle(sprite, transform.scale); + bool rendered_particles = this->render_particle(sprite, cam, transform.scale); if (rendered_particles) continue; - this->render_normal(sprite, transform); + this->render_normal(sprite, cam, transform); } } diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 08930b0..264dc4c 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -36,7 +36,7 @@ private: void present_screen(); //! Updates the active camera used for rendering. - void update_camera(); + const Camera & update_camera(); //! Renders the whole screen void render(); @@ -48,7 +48,7 @@ private: * \param tm the Transform component for scale * \return true if particles have been rendered */ - bool render_particle(const Sprite & sprite, const double & scale); + bool render_particle(const Sprite & sprite, const Camera & cam, const double & scale); /** * \brief renders a sprite with a Transform component on the screen @@ -56,7 +56,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 Transform & tm); + void render_normal(const Sprite & sprite, const Camera & cam, const Transform & tm); /** * \brief sort a vector sprite objects with @@ -70,17 +70,12 @@ private: * \todo Include color handling for sprites. * \todo Add text rendering using SDL_ttf for text components. * \todo Implement a text component and a button component. - * \todo Ensure each sprite is checked for active status before rendering. - * \todo Sort all layers by order before rendering. * \todo Consider adding text input functionality. */ private: - //! Pointer to the current active camera for rendering - // TODO: needs a better solution - Camera * curr_cam_ref = nullptr; - SDLContext & context = SDLContext::get_instance(); + }; } // namespace crepe diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index ec71260..6e426cf 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -33,9 +33,7 @@ int main(int argc, char * argv[]) { auto img = Texture("asset/texture/test_ap43.png"); Sprite & test_sprite - = game_object.add_component(img, color, FlipSettings{true, true}); - test_sprite.order_in_layer = 5; - test_sprite.height = 195; + = game_object.add_component(img, color, FlipSettings{true, true}, 1, 1, 500); //game_object.add_component(test_sprite, 4, 1, 0).active = true; game_object.add_component(test_sprite, 1, 1, 0).active = true; @@ -62,8 +60,8 @@ int main(int argc, char * argv[]) { }); */ - auto & cam = game_object.add_component(Color::WHITE); - cam.pos = {0, 0}; + auto & cam = game_object.add_component(Color::WHITE, ivec2{1080, 720}, + ivec2{2000, 2000}, 1.0f); /* game_object -- cgit v1.2.3 From 14cbc9061ecd7ab1c9e58e5f9ba75a5216e1de2b Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 07:53:24 +0100 Subject: feedback implemented --- src/crepe/api/Camera.cpp | 4 +++- src/crepe/api/Camera.h | 4 ++-- src/crepe/api/Sprite.h | 10 ---------- 3 files changed, 5 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.cpp b/src/crepe/api/Camera.cpp index 4397ac7..99a0831 100644 --- a/src/crepe/api/Camera.cpp +++ b/src/crepe/api/Camera.cpp @@ -1,3 +1,4 @@ +#include "types.h" #include "util/Log.h" #include "Camera.h" @@ -7,9 +8,10 @@ using namespace crepe; Camera::Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, - const ivec2 & viewport, const double & zoom) + const ivec2 & viewport, const double & zoom, const vec2& offset) : Component(id), bg_color(bg_color), + offset(offset), screen(screen), viewport(viewport), zoom(zoom) { diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index 2ba37fc..8908caa 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -21,7 +21,7 @@ public: * \param id Unique identifier for the camera component. * \param bg_color Background color for the camera view. */ - Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, const ivec2 & viewport, const double & zoom); + Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, const ivec2 & viewport, const double & zoom, const vec2 & offset = {0,0}); ~Camera(); // dbg_trace only public: @@ -29,7 +29,7 @@ public: const Color bg_color; //! offset postion from the game object transform component - vec2 offset = {0, 0}; + vec2 offset; //! pos the postion of the camera in world space this will be filled with //pos = transform + offset diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 1c40501..9644e72 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -77,16 +77,6 @@ public: * does it need to be calculated again in the Animator */ double aspect_ratio; - -public: - /** - * \brief Gets the maximum number of instances allowed for this sprite. - * \return Maximum instance count as an integer. - * - * For now is this number randomly picked. I think it will eventually be 1. - */ - virtual int get_instances_max() const { return 10; } - private: //! Reads the sprite_rect of sprite friend class SDLContext; -- cgit v1.2.3 From 43695ecee65d63ba89bdab3eb49b5ada0eef399f Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 07:54:04 +0100 Subject: make format --- src/crepe/api/Animator.h | 1 + src/crepe/api/Camera.cpp | 2 +- src/crepe/api/Camera.h | 3 ++- src/crepe/api/Sprite.h | 1 + src/crepe/facade/SDLContext.cpp | 2 +- src/crepe/system/RenderSystem.h | 1 - 6 files changed, 6 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Animator.h b/src/crepe/api/Animator.h index 7a5ef03..19c9ebd 100644 --- a/src/crepe/api/Animator.h +++ b/src/crepe/api/Animator.h @@ -40,6 +40,7 @@ public: Animator(uint32_t id, Sprite & spritesheet, int row, int col, int col_animate); ~Animator(); // dbg_trace + private: //! A reference to the Sprite sheet containing the animation frames. Sprite & spritesheet; diff --git a/src/crepe/api/Camera.cpp b/src/crepe/api/Camera.cpp index 99a0831..0831f45 100644 --- a/src/crepe/api/Camera.cpp +++ b/src/crepe/api/Camera.cpp @@ -8,7 +8,7 @@ using namespace crepe; Camera::Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, - const ivec2 & viewport, const double & zoom, const vec2& offset) + const ivec2 & viewport, const double & zoom, const vec2 & offset) : Component(id), bg_color(bg_color), offset(offset), diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index 8908caa..c7b2d08 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -21,7 +21,8 @@ public: * \param id Unique identifier for the camera component. * \param bg_color Background color for the camera view. */ - Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, const ivec2 & viewport, const double & zoom, const vec2 & offset = {0,0}); + Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, + const ivec2 & viewport, const double & zoom, const vec2 & offset = {0, 0}); ~Camera(); // dbg_trace only public: diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 9644e72..c406b91 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -77,6 +77,7 @@ public: * does it need to be calculated again in the Animator */ double aspect_ratio; + private: //! Reads the sprite_rect of sprite friend class SDLContext; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 6c6af55..0d42a4c 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -12,10 +12,10 @@ #include #include "../api/Camera.h" +#include "../api/Config.h" #include "../api/Sprite.h" #include "../api/Texture.h" #include "../api/Transform.h" -#include "../api/Config.h" #include "../util/Log.h" #include "SDLContext.h" diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 264dc4c..46ebb92 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -75,7 +75,6 @@ private: private: SDLContext & context = SDLContext::get_instance(); - }; } // namespace crepe -- cgit v1.2.3 From 80836bce1294898f3d115ed363edd6d921aa15d5 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 08:21:24 +0100 Subject: adjusted texture and sprite to hold a texture, instead of reference --- src/crepe/api/Config.h | 2 +- src/crepe/api/Sprite.cpp | 5 +++-- src/crepe/api/Sprite.h | 4 ++-- src/crepe/api/Texture.cpp | 11 +++++++++++ src/crepe/api/Texture.h | 5 +++++ 5 files changed, 22 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 9b43cdf..2525120 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -33,7 +33,7 @@ public: * * Only messages with equal or higher priority than this value will be logged. */ - Log::Level level = Log::Level::DEBUG; + Log::Level level = Log::Level::INFO; /** * \brief Colored log output * diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index 21c8377..65c6cc3 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -1,4 +1,5 @@ #include +#include #include "../util/Log.h" @@ -9,12 +10,12 @@ using namespace std; using namespace crepe; -Sprite::Sprite(game_object_id_t id, const Texture & image, const Color & color, +Sprite::Sprite(game_object_id_t id, Texture & image, const Color & color, const FlipSettings & flip, uint8_t sort_layer, uint8_t order_layer, int height) : Component(id), color(color), flip(flip), - sprite_image(image), + sprite_image(std::move(image)), sorting_in_layer(sort_layer), order_in_layer(order_layer), height(height) { diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index c406b91..9d75ab6 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -45,7 +45,7 @@ public: * \param sort_layer decides the order in layer of the sprite. * \param height the height of the image in game units */ - Sprite(game_object_id_t id, const Texture & image, const Color & color, + Sprite(game_object_id_t id, Texture & image, const Color & color, const FlipSettings & flip, uint8_t sort_layer, uint8_t order_layer, int height); /** @@ -54,7 +54,7 @@ public: ~Sprite(); //! Texture used for the sprite - const Texture & sprite_image; + const Texture sprite_image; //! Color tint of the sprite Color color; diff --git a/src/crepe/api/Texture.cpp b/src/crepe/api/Texture.cpp index eeb86e9..576bdc3 100644 --- a/src/crepe/api/Texture.cpp +++ b/src/crepe/api/Texture.cpp @@ -17,6 +17,17 @@ Texture::~Texture() { this->texture.reset(); } +Texture::Texture(Texture&& other) noexcept + : texture(std::move(other.texture)){ +} + +Texture& Texture::operator=(Texture&& other) noexcept { + if (this != &other) { + texture = std::move(other.texture); + } + return *this; +} + void Texture::load(const Asset & res) { SDLContext & ctx = SDLContext::get_instance(); this->texture = ctx.texture_from_path(res.get_path()); diff --git a/src/crepe/api/Texture.h b/src/crepe/api/Texture.h index b4f7d07..dc4a6d7 100644 --- a/src/crepe/api/Texture.h +++ b/src/crepe/api/Texture.h @@ -35,6 +35,11 @@ public: */ ~Texture(); // FIXME: this constructor shouldn't be necessary because this class doesn't manage memory + + Texture(Texture&& other) noexcept; + Texture& operator=(Texture&& other) noexcept; + Texture(const Texture&) = delete; + Texture& operator=(const Texture&) = delete; /** * \brief Gets the width of the texture. -- cgit v1.2.3 From 5fa57ab2d8f809b8cb6bd72f54567a01f3e63b95 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 08:51:20 +0100 Subject: making test work again --- src/crepe/api/Config.h | 2 +- src/crepe/api/Vector2.h | 13 ++++------ src/test/ParticleTest.cpp | 7 +++--- src/test/RenderSystemTest.cpp | 58 +++++++++++++++++++------------------------ 4 files changed, 35 insertions(+), 45 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 2525120..d73e488 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -66,7 +66,7 @@ public: //! default window settings struct { //TODO make this constexpr because this will never change - const ivec2 def_size = {1080, 720}; + ivec2 def_size = {1080, 720}; } win_set; //! Asset loading options diff --git a/src/crepe/api/Vector2.h b/src/crepe/api/Vector2.h index 2b31d90..c278c87 100644 --- a/src/crepe/api/Vector2.h +++ b/src/crepe/api/Vector2.h @@ -31,14 +31,8 @@ struct Vector2 { //! Divides this vector by another vector element-wise and returns the result. Vector2 operator/(const Vector2 & other) const; - //! Multiplies this vector by another vector element-wise and updates this vector. - Vector2 & operator*=(const Vector2 & other); - - //! Divides a scalar value to both components of this vector and updates this vector. - Vector2 operator/(const T & other) const; - - //! Divides a scalar value to both components of this vector and updates this vector. - Vector2 operator/(T other) const; + //! Divides this vector by a scalar and returns the result. + Vector2 operator/(T scalar) const; //! Adds another vector to this vector and updates this vector. Vector2 & operator+=(const Vector2 & other); @@ -52,6 +46,9 @@ struct Vector2 { //! Subtracts a scalar value from both components of this vector and updates this vector. Vector2 & operator-=(T other); + //! Multiplies this vector by another vector element-wise and updates this vector. + Vector2 & operator*=(const Vector2 & other); + //! Multiplies this vector by a scalar and updates this vector. Vector2 & operator*=(T other); diff --git a/src/test/ParticleTest.cpp b/src/test/ParticleTest.cpp index 8b81e74..ea3652a 100644 --- a/src/test/ParticleTest.cpp +++ b/src/test/ParticleTest.cpp @@ -1,4 +1,4 @@ -#include "api/Vector2.h" +#include "api/Texture.h" #include #include #include @@ -28,9 +28,10 @@ public: GameObject game_object = mgr.new_object("", "", vec2{0, 0}, 0, 0); Color color(0, 0, 0, 0); + auto s1 = Texture("asset/texture/img.png"); Sprite & test_sprite = game_object.add_component( - make_shared("asset/texture/img.png"), color, - FlipSettings{true, true}); + s1, color, + FlipSettings{true, true}, 1,1,100); game_object.add_component(ParticleEmitter::Data{ .position = {0, 0}, diff --git a/src/test/RenderSystemTest.cpp b/src/test/RenderSystemTest.cpp index f37fb56..2c4f21c 100644 --- a/src/test/RenderSystemTest.cpp +++ b/src/test/RenderSystemTest.cpp @@ -1,4 +1,4 @@ -#include "api/Camera.h" +#include "types.h" #include #include #include @@ -12,6 +12,7 @@ #include #include #include +#include "crepe/api/Camera.h" #include @@ -29,40 +30,30 @@ public: GameObject entity4 = this->mgr.new_object("name"); void SetUp() override { - auto & sprite1 - = entity1.add_component(make_shared("asset/texture/img.png"), - Color(0, 0, 0, 0), FlipSettings{false, false}); - ASSERT_NE(sprite1.sprite_image.get(), nullptr); - sprite1.order_in_layer = 5; - sprite1.sorting_in_layer = 5; + auto s1 = Texture("asset/texture/img.png"); + auto s2 = Texture("asset/texture/img.png"); + auto s3 = Texture("asset/texture/img.png"); + auto s4 = Texture("asset/texture/img.png"); + auto & sprite1 = entity1.add_component(s1, Color(0, 0, 0, 0), + FlipSettings{false, false}, 5, 5, 100); + ASSERT_NE(sprite1.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite1.order_in_layer, 5); EXPECT_EQ(sprite1.sorting_in_layer, 5); - auto & sprite2 - = entity2.add_component(make_shared("asset/texture/img.png"), - Color(0, 0, 0, 0), FlipSettings{false, false}); - ASSERT_NE(sprite2.sprite_image.get(), nullptr); - sprite2.sorting_in_layer = 2; - sprite2.order_in_layer = 1; - + auto & sprite2 = entity2.add_component(s2, Color(0, 0, 0, 0), + FlipSettings{false, false}, 2, 1, 100); + ASSERT_NE(sprite2.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite2.sorting_in_layer, 2); EXPECT_EQ(sprite2.order_in_layer, 1); - auto & sprite3 - = entity3.add_component(make_shared("asset/texture/img.png"), - Color(0, 0, 0, 0), FlipSettings{false, false}); - ASSERT_NE(sprite3.sprite_image.get(), nullptr); - sprite3.sorting_in_layer = 1; - sprite3.order_in_layer = 2; - + auto & sprite3 = entity3.add_component(s3, Color(0, 0, 0, 0), + FlipSettings{false, false}, 1, 2, 100); + ASSERT_NE(sprite3.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite3.sorting_in_layer, 1); EXPECT_EQ(sprite3.order_in_layer, 2); - auto & sprite4 - = entity4.add_component(make_shared("asset/texture/img.png"), - Color(0, 0, 0, 0), FlipSettings{false, false}); - ASSERT_NE(sprite4.sprite_image.get(), nullptr); - sprite4.sorting_in_layer = 1; - sprite4.order_in_layer = 1; + auto & sprite4 = entity4.add_component(s4, Color(0, 0, 0, 0), + FlipSettings{false, false}, 1, 1, 100); + ASSERT_NE(sprite4.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite4.sorting_in_layer, 1); EXPECT_EQ(sprite4.order_in_layer, 1); } @@ -73,8 +64,9 @@ TEST_F(RenderSystemTest, expected_throws) { // no texture img EXPECT_ANY_THROW({ - entity1.add_component(make_shared("NO_IMAGE"), Color(0, 0, 0, 0), - FlipSettings{false, false}); + auto test = Texture(""); + entity1.add_component(test, Color(0, 0, 0, 0), + FlipSettings{false, false},1,1,100); }); // No camera @@ -121,7 +113,7 @@ TEST_F(RenderSystemTest, sorting_sprites) { } TEST_F(RenderSystemTest, Update) { - entity1.add_component(Color::WHITE); + entity1.add_component(Color::WHITE, ivec2{1080, 720}, ivec2{2000, 2000}, 1.0f); { vector> sprites = this->mgr.get_components_by_type(); ASSERT_EQ(sprites.size(), 4); @@ -149,7 +141,7 @@ TEST_F(RenderSystemTest, Camera) { EXPECT_NE(cameras.size(), 1); } { - entity1.add_component(Color::WHITE); + entity1.add_component(Color::WHITE, ivec2{1080, 720}, ivec2{2000, 2000}, 1.0f); auto cameras = this->mgr.get_components_by_type(); EXPECT_EQ(cameras.size(), 1); } @@ -157,9 +149,9 @@ TEST_F(RenderSystemTest, Camera) { //TODO improve with newer version } TEST_F(RenderSystemTest, Color) { - entity1.add_component(Color::WHITE); + entity1.add_component(Color::WHITE, ivec2{1080, 720}, ivec2{2000, 2000}, 1.0f); auto & sprite = this->mgr.get_components_by_id(entity1.id).front().get(); - ASSERT_NE(sprite.sprite_image.get(), nullptr); + ASSERT_NE(sprite.sprite_image.texture.get(), nullptr); sprite.color = Color::GREEN; EXPECT_EQ(sprite.color.r, Color::GREEN.r); -- cgit v1.2.3 From 71be3e36dbb402c3e84d87ea0255c08cb2a1b7ca Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 09:18:13 +0100 Subject: implemented feedback to have draw struct --- src/crepe/api/Camera.h | 4 ---- src/crepe/facade/SDLContext.cpp | 35 +++++++++++------------------------ src/crepe/facade/SDLContext.h | 22 ++++------------------ src/crepe/system/RenderSystem.cpp | 25 ++++++++++++++++++++++--- src/crepe/system/RenderSystem.h | 6 ++++++ src/crepe/types.h | 13 +++++++++++++ 6 files changed, 56 insertions(+), 49 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index c7b2d08..ac56495 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -32,10 +32,6 @@ public: //! offset postion from the game object transform component vec2 offset; - //! pos the postion of the camera in world space this will be filled with - //pos = transform + offset - vec2 pos = {0, 0}; - //! screen the display size in pixels ( output resolution ) const ivec2 screen = {1080, 720}; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 0d42a4c..7317a77 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -109,7 +109,7 @@ SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { }; } SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, - const double & img_scale) const { + const vec2 & cam_pos, const double & img_scale) const { int width = sprite.height * sprite.aspect_ratio; int height = sprite.height; @@ -118,38 +118,25 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, const height *= img_scale * cam.zoom; return SDL_Rect{ - .x = static_cast((pos.x - cam.pos.x + (cam.viewport.x / 2) - width / 2)), - .y = static_cast((pos.y - cam.pos.y + (cam.viewport.y / 2) - height / 2)), + .x = static_cast((pos.x - cam_pos.x + (cam.viewport.x / 2) - width / 2)), + .y = static_cast((pos.y - cam_pos.y + (cam.viewport.y / 2) - height / 2)), .w = width, .h = height, }; } -void SDLContext::draw_particle(const Sprite & sprite, const vec2 & pos, const double & angle, - const double & img_scale, const Camera & cam) { +void SDLContext::draw(const RenderCtx & ctx) { SDL_RendererFlip render_flip - = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) - | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); + = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * ctx.sprite.flip.flip_x) + | (SDL_FLIP_VERTICAL * ctx.sprite.flip.flip_y)); - SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, pos, cam, img_scale); + SDL_Rect srcrect = this->get_src_rect(ctx.sprite); + SDL_Rect dstrect + = this->get_dst_rect(ctx.sprite, ctx.pos, ctx.cam, ctx.cam_pos, ctx.scale); - SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image.texture.get(), &srcrect, - &dstrect, angle, NULL, render_flip); -} - -void SDLContext::draw(const Sprite & sprite, const Transform & transform, const Camera & cam) { - - SDL_RendererFlip render_flip - = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flip_x) - | (SDL_FLIP_VERTICAL * sprite.flip.flip_y)); - - SDL_Rect srcrect = this->get_src_rect(sprite); - SDL_Rect dstrect = this->get_dst_rect(sprite, transform.position, cam, transform.scale); - - SDL_RenderCopyEx(this->game_renderer.get(), sprite.sprite_image.texture.get(), &srcrect, - &dstrect, transform.rotation, NULL, render_flip); + SDL_RenderCopyEx(this->game_renderer.get(), ctx.sprite.sprite_image.texture.get(), + &srcrect, &dstrect, ctx.angle, NULL, render_flip); } void SDLContext::set_camera(const Camera & cam) { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 35d667d..7907a0f 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -11,7 +11,6 @@ #include "../api/Camera.h" #include "../api/Sprite.h" -#include "../api/Transform.h" #include "types.h" @@ -115,23 +114,9 @@ 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 cam camera of the current scene + * \param RenderCtx Reference to rendering data to draw */ - void draw(const Sprite & sprite, const Transform & transform, const Camera & cam); - - /** - * \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 img_scale scalar multiplier to increase image size - * \param cam camera of the current scene - */ - void draw_particle(const Sprite & sprite, const vec2 & pos, const double & angle, - const double & img_scale, const Camera & cam); + void draw(const RenderCtx & ctx); //! Clears the screen, preparing for a new frame. void clear_screen(); @@ -160,10 +145,11 @@ private: * \param sprite Reference to the sprite to calculate rectangle * \param pos the pos in world units * \param cam the camera of the current scene + * \param cam_pos the current postion of the camera * \param img_scale the image multiplier for increasing img size * \return sdl rectangle to draw a dst image to draw on the screen */ - SDL_Rect get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, + SDL_Rect get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, const vec2 & cam_pos, const double & img_scale) const; private: diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index a1443cd..bfee658 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -11,6 +11,7 @@ #include "../api/Transform.h" #include "../facade/SDLContext.h" #include "api/Camera.h" +#include "types.h" #include "RenderSystem.h" @@ -33,7 +34,7 @@ const Camera & RenderSystem::update_camera() { const Transform & transform = mgr.get_components_by_id(cam.game_object_id).front().get(); this->context.set_camera(cam); - cam.pos = transform.position + cam.offset; + this->cam_pos = transform.position + cam.offset; return cam; } throw std::runtime_error("No active cameras in current scene"); @@ -76,14 +77,32 @@ bool RenderSystem::render_particle(const Sprite & sprite, const Camera & cam, for (const Particle & p : em.data.particles) { if (!p.active) continue; - this->context.draw_particle(sprite, p.position, p.angle, scale, cam); + + RenderCtx ctx{ + .sprite = sprite, + .cam = cam, + .cam_pos = this->cam_pos, + .pos = p.position, + .angle = p.angle, + .scale = scale, + }; + this->context.draw(ctx); } } return rendering_particles; } void RenderSystem::render_normal(const Sprite & sprite, const Camera & cam, const Transform & tm) { - this->context.draw(sprite, tm, cam); + + RenderCtx ctx{ + .sprite = sprite, + .cam = cam, + .cam_pos = this->cam_pos, + .pos = tm.position, + .angle = tm.rotation, + .scale = tm.scale, + }; + this->context.draw(ctx); } void RenderSystem::render() { diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 46ebb92..4667424 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -11,6 +11,8 @@ namespace crepe { class Camera; class Sprite; +class Transform; + /** * \class RenderSystem @@ -75,6 +77,10 @@ private: private: SDLContext & context = SDLContext::get_instance(); + + //! camera postion in the current scene + vec2 cam_pos = {0,0}; + }; } // namespace crepe diff --git a/src/crepe/types.h b/src/crepe/types.h index 17f1619..aa03f53 100644 --- a/src/crepe/types.h +++ b/src/crepe/types.h @@ -27,4 +27,17 @@ typedef Vector2 vec2; //! Default Vector2 type typedef Vector2 dvec2; +class Sprite; +class Camera; + +struct RenderCtx{ + const Sprite & sprite; + const Camera & cam; + const vec2 & cam_pos; + const vec2 & pos; + const double & angle; + const double & scale; + +} ; + } // namespace crepe -- cgit v1.2.3 From 2d623522db0677ca5e88a53e3705a10ce59ba8b6 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 10:04:14 +0100 Subject: removed animator rectangle --- src/crepe/api/Animator.cpp | 11 +++++------ src/crepe/api/Animator.h | 2 -- src/crepe/api/Camera.h | 6 +++--- src/crepe/system/AnimatorSystem.cpp | 11 +++++------ src/crepe/system/RenderSystem.h | 2 +- 5 files changed, 14 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index b6540cf..31b9632 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -14,14 +14,13 @@ Animator::Animator(game_object_id_t id, Sprite & ss, int row, int col, int col_a col(col) { dbg_trace(); - animator_rect = spritesheet.sprite_rect; - animator_rect.h /= col; - animator_rect.w /= row; - animator_rect.x = 0; - animator_rect.y = col_animator * animator_rect.h; + this->spritesheet.sprite_rect.h /= col; + this->spritesheet.sprite_rect.w /= row; + this->spritesheet.sprite_rect.x = 0; + this->spritesheet.sprite_rect.y = col_animator * this->spritesheet.sprite_rect.h; this->active = false; // need to do this for to get the aspect ratio for a single clipping in the spritesheet - this->spritesheet.aspect_ratio = static_cast(animator_rect.w) / animator_rect.h; + this->spritesheet.aspect_ratio = static_cast(this->spritesheet.sprite_rect.w) / this->spritesheet.sprite_rect.h; } Animator::~Animator() { dbg_trace(); } diff --git a/src/crepe/api/Animator.h b/src/crepe/api/Animator.h index 19c9ebd..6c506aa 100644 --- a/src/crepe/api/Animator.h +++ b/src/crepe/api/Animator.h @@ -57,8 +57,6 @@ private: //! The current row being animated. int curr_row = 0; - Rect animator_rect; - //TODO: Is this necessary? //int fps; diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index ac56495..3682222 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -33,13 +33,13 @@ public: vec2 offset; //! screen the display size in pixels ( output resolution ) - const ivec2 screen = {1080, 720}; + const ivec2 screen; //! viewport is the area of the world visible through the camera (in world units) - const ivec2 viewport = {500, 1000}; + const ivec2 viewport; //! Zoom level of the camera view. - const double zoom = 1.0f; + const double zoom; public: /** diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp index bc94253..e5b277f 100644 --- a/src/crepe/system/AnimatorSystem.cpp +++ b/src/crepe/system/AnimatorSystem.cpp @@ -15,11 +15,10 @@ 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; - } + if (!a.active) continue; + // (10 frames per second) + a.curr_row = (tick / 100) % a.row; + a.spritesheet.sprite_rect.x = (a.curr_row * a.spritesheet.sprite_rect.w) + a.curr_col; + a.spritesheet.sprite_rect = a.spritesheet.sprite_rect; } } diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 4667424..7279b5c 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -79,7 +79,7 @@ private: SDLContext & context = SDLContext::get_instance(); //! camera postion in the current scene - vec2 cam_pos = {0,0}; + vec2 cam_pos; }; -- cgit v1.2.3 From 7508f7b26e73df24e2fcb4296b31d26470fddf76 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 10:20:23 +0100 Subject: adjusted more it should now be finsished --- src/crepe/api/Sprite.h | 24 ++++++++++++------------ src/crepe/facade/SDLContext.h | 12 ++++++++++++ src/crepe/system/RenderSystem.cpp | 3 +-- src/crepe/types.h | 15 +-------------- src/example/rendering_particle.cpp | 3 +-- src/test/ParticleTest.cpp | 2 +- src/test/RenderSystemTest.cpp | 10 +++++----- 7 files changed, 33 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 9d75ab6..2d73879 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -8,18 +8,6 @@ namespace crepe { -struct Rect { - int w = 0; - int h = 0; - int x = 0; - int y = 0; -}; - -struct FlipSettings { - bool flip_x = false; - bool flip_y = false; -}; - class SDLContext; class Animator; class AnimatorSystem; @@ -32,6 +20,12 @@ class AnimatorSystem; */ class Sprite : public Component { +public: + struct FlipSettings { + bool flip_x = false; + bool flip_y = false; + }; + public: // TODO: Loek comment in github #27 will be looked another time // about shared_ptr Texture @@ -88,6 +82,12 @@ private: //! Reads the all the variables plus the sprite_rect friend class AnimatorSystem; + struct Rect { + int w = 0; + int h = 0; + int x = 0; + int y = 0; + }; //! Render area of the sprite this will also be adjusted by the AnimatorSystem if an Animator // object is present in GameObject. this is in sprite pixels Rect sprite_rect; diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 7907a0f..25f2818 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -16,6 +16,16 @@ namespace crepe { +struct RenderCtx{ + const Sprite & sprite; + const Camera & cam; + const vec2 & cam_pos; + const vec2 & pos; + const double & angle; + const double & scale; + +}; + // TODO: SDL_Keycode is defined in a header not distributed with crepe, which means this // typedef is unusable when crepe is packaged. Wouter will fix this later. typedef SDL_Keycode CREPE_KEYCODES; @@ -29,6 +39,8 @@ typedef SDL_Keycode CREPE_KEYCODES; */ class SDLContext { + + public: /** * \brief Gets the singleton instance of SDLContext. diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index bfee658..0bef69b 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -9,9 +9,8 @@ #include "../api/ParticleEmitter.h" #include "../api/Sprite.h" #include "../api/Transform.h" +#include "../api/Camera.h" #include "../facade/SDLContext.h" -#include "api/Camera.h" -#include "types.h" #include "RenderSystem.h" diff --git a/src/crepe/types.h b/src/crepe/types.h index aa03f53..69cc526 100644 --- a/src/crepe/types.h +++ b/src/crepe/types.h @@ -27,17 +27,4 @@ typedef Vector2 vec2; //! Default Vector2 type typedef Vector2 dvec2; -class Sprite; -class Camera; - -struct RenderCtx{ - const Sprite & sprite; - const Camera & cam; - const vec2 & cam_pos; - const vec2 & pos; - const double & angle; - const double & scale; - -} ; - -} // namespace crepe +}; // namespace crepe diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 6e426cf..68dadd7 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -17,7 +17,6 @@ #include #include -#include using namespace crepe; using namespace std; @@ -33,7 +32,7 @@ int main(int argc, char * argv[]) { auto img = Texture("asset/texture/test_ap43.png"); Sprite & test_sprite - = game_object.add_component(img, color, FlipSettings{true, true}, 1, 1, 500); + = game_object.add_component(img, color, Sprite::FlipSettings{true, true}, 1, 1, 500); //game_object.add_component(test_sprite, 4, 1, 0).active = true; game_object.add_component(test_sprite, 1, 1, 0).active = true; diff --git a/src/test/ParticleTest.cpp b/src/test/ParticleTest.cpp index ea3652a..1ac058f 100644 --- a/src/test/ParticleTest.cpp +++ b/src/test/ParticleTest.cpp @@ -31,7 +31,7 @@ public: auto s1 = Texture("asset/texture/img.png"); Sprite & test_sprite = game_object.add_component( s1, color, - FlipSettings{true, true}, 1,1,100); + Sprite::FlipSettings{true, true}, 1,1,100); game_object.add_component(ParticleEmitter::Data{ .position = {0, 0}, diff --git a/src/test/RenderSystemTest.cpp b/src/test/RenderSystemTest.cpp index 2c4f21c..138aa36 100644 --- a/src/test/RenderSystemTest.cpp +++ b/src/test/RenderSystemTest.cpp @@ -35,24 +35,24 @@ public: auto s3 = Texture("asset/texture/img.png"); auto s4 = Texture("asset/texture/img.png"); auto & sprite1 = entity1.add_component(s1, Color(0, 0, 0, 0), - FlipSettings{false, false}, 5, 5, 100); + Sprite::FlipSettings{false, false}, 5, 5, 100); ASSERT_NE(sprite1.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite1.order_in_layer, 5); EXPECT_EQ(sprite1.sorting_in_layer, 5); auto & sprite2 = entity2.add_component(s2, Color(0, 0, 0, 0), - FlipSettings{false, false}, 2, 1, 100); + Sprite::FlipSettings{false, false}, 2, 1, 100); ASSERT_NE(sprite2.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite2.sorting_in_layer, 2); EXPECT_EQ(sprite2.order_in_layer, 1); auto & sprite3 = entity3.add_component(s3, Color(0, 0, 0, 0), - FlipSettings{false, false}, 1, 2, 100); + Sprite::FlipSettings{false, false}, 1, 2, 100); ASSERT_NE(sprite3.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite3.sorting_in_layer, 1); EXPECT_EQ(sprite3.order_in_layer, 2); auto & sprite4 = entity4.add_component(s4, Color(0, 0, 0, 0), - FlipSettings{false, false}, 1, 1, 100); + Sprite::FlipSettings{false, false}, 1, 1, 100); ASSERT_NE(sprite4.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite4.sorting_in_layer, 1); EXPECT_EQ(sprite4.order_in_layer, 1); @@ -66,7 +66,7 @@ TEST_F(RenderSystemTest, expected_throws) { EXPECT_ANY_THROW({ auto test = Texture(""); entity1.add_component(test, Color(0, 0, 0, 0), - FlipSettings{false, false},1,1,100); + Sprite::FlipSettings{false, false},1,1,100); }); // No camera -- cgit v1.2.3 From ca81cf4cdb99cfe42359526ff3840f58f4cf214a Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 10:21:22 +0100 Subject: make format --- src/crepe/api/Animator.cpp | 3 ++- src/crepe/api/Texture.cpp | 16 +++++++--------- src/crepe/api/Texture.h | 10 +++++----- src/crepe/facade/SDLContext.h | 9 +++------ src/crepe/system/RenderSystem.cpp | 2 +- src/crepe/system/RenderSystem.h | 2 -- src/example/rendering_particle.cpp | 4 ++-- src/test/ParticleTest.cpp | 3 +-- src/test/RenderSystemTest.cpp | 20 ++++++++++---------- 9 files changed, 31 insertions(+), 38 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index 31b9632..2b21c6c 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -21,6 +21,7 @@ Animator::Animator(game_object_id_t id, Sprite & ss, int row, int col, int col_a this->active = false; // need to do this for to get the aspect ratio for a single clipping in the spritesheet - this->spritesheet.aspect_ratio = static_cast(this->spritesheet.sprite_rect.w) / this->spritesheet.sprite_rect.h; + this->spritesheet.aspect_ratio = static_cast(this->spritesheet.sprite_rect.w) + / this->spritesheet.sprite_rect.h; } Animator::~Animator() { dbg_trace(); } diff --git a/src/crepe/api/Texture.cpp b/src/crepe/api/Texture.cpp index 576bdc3..e43bdaa 100644 --- a/src/crepe/api/Texture.cpp +++ b/src/crepe/api/Texture.cpp @@ -17,15 +17,13 @@ Texture::~Texture() { this->texture.reset(); } -Texture::Texture(Texture&& other) noexcept - : texture(std::move(other.texture)){ -} - -Texture& Texture::operator=(Texture&& other) noexcept { - if (this != &other) { - texture = std::move(other.texture); - } - return *this; +Texture::Texture(Texture && other) noexcept : texture(std::move(other.texture)) {} + +Texture & Texture::operator=(Texture && other) noexcept { + if (this != &other) { + texture = std::move(other.texture); + } + return *this; } void Texture::load(const Asset & res) { diff --git a/src/crepe/api/Texture.h b/src/crepe/api/Texture.h index dc4a6d7..7206a66 100644 --- a/src/crepe/api/Texture.h +++ b/src/crepe/api/Texture.h @@ -35,11 +35,11 @@ public: */ ~Texture(); // FIXME: this constructor shouldn't be necessary because this class doesn't manage memory - - Texture(Texture&& other) noexcept; - Texture& operator=(Texture&& other) noexcept; - Texture(const Texture&) = delete; - Texture& operator=(const Texture&) = delete; + + Texture(Texture && other) noexcept; + Texture & operator=(Texture && other) noexcept; + Texture(const Texture &) = delete; + Texture & operator=(const Texture &) = delete; /** * \brief Gets the width of the texture. diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 25f2818..5f141be 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -16,14 +16,13 @@ namespace crepe { -struct RenderCtx{ +struct RenderCtx { const Sprite & sprite; const Camera & cam; const vec2 & cam_pos; const vec2 & pos; const double & angle; const double & scale; - }; // TODO: SDL_Keycode is defined in a header not distributed with crepe, which means this @@ -39,8 +38,6 @@ typedef SDL_Keycode CREPE_KEYCODES; */ class SDLContext { - - public: /** * \brief Gets the singleton instance of SDLContext. @@ -161,8 +158,8 @@ private: * \param img_scale the image multiplier for increasing img size * \return sdl rectangle to draw a dst image to draw on the screen */ - SDL_Rect get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, const vec2 & cam_pos, - const double & img_scale) const; + SDL_Rect get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, + const vec2 & cam_pos, const double & img_scale) const; private: //! sdl Window diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 0bef69b..8895f02 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -6,10 +6,10 @@ #include #include "../ComponentManager.h" +#include "../api/Camera.h" #include "../api/ParticleEmitter.h" #include "../api/Sprite.h" #include "../api/Transform.h" -#include "../api/Camera.h" #include "../facade/SDLContext.h" #include "RenderSystem.h" diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 7279b5c..e70831e 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -13,7 +13,6 @@ class Camera; class Sprite; class Transform; - /** * \class RenderSystem * \brief Manages rendering operations for all game objects. @@ -80,7 +79,6 @@ private: //! camera postion in the current scene vec2 cam_pos; - }; } // namespace crepe diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 68dadd7..8fdbb58 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -31,8 +31,8 @@ int main(int argc, char * argv[]) { Color color(255, 255, 255, 255); auto img = Texture("asset/texture/test_ap43.png"); - Sprite & test_sprite - = game_object.add_component(img, color, Sprite::FlipSettings{true, true}, 1, 1, 500); + Sprite & test_sprite = game_object.add_component( + img, color, Sprite::FlipSettings{true, true}, 1, 1, 500); //game_object.add_component(test_sprite, 4, 1, 0).active = true; game_object.add_component(test_sprite, 1, 1, 0).active = true; diff --git a/src/test/ParticleTest.cpp b/src/test/ParticleTest.cpp index 1ac058f..976f9a1 100644 --- a/src/test/ParticleTest.cpp +++ b/src/test/ParticleTest.cpp @@ -30,8 +30,7 @@ public: Color color(0, 0, 0, 0); auto s1 = Texture("asset/texture/img.png"); Sprite & test_sprite = game_object.add_component( - s1, color, - Sprite::FlipSettings{true, true}, 1,1,100); + s1, color, Sprite::FlipSettings{true, true}, 1, 1, 100); game_object.add_component(ParticleEmitter::Data{ .position = {0, 0}, diff --git a/src/test/RenderSystemTest.cpp b/src/test/RenderSystemTest.cpp index 138aa36..e0bd953 100644 --- a/src/test/RenderSystemTest.cpp +++ b/src/test/RenderSystemTest.cpp @@ -7,12 +7,12 @@ #define private public #define protected public +#include "crepe/api/Camera.h" #include #include #include #include #include -#include "crepe/api/Camera.h" #include @@ -34,25 +34,25 @@ public: auto s2 = Texture("asset/texture/img.png"); auto s3 = Texture("asset/texture/img.png"); auto s4 = Texture("asset/texture/img.png"); - auto & sprite1 = entity1.add_component(s1, Color(0, 0, 0, 0), - Sprite::FlipSettings{false, false}, 5, 5, 100); + auto & sprite1 = entity1.add_component( + s1, Color(0, 0, 0, 0), Sprite::FlipSettings{false, false}, 5, 5, 100); ASSERT_NE(sprite1.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite1.order_in_layer, 5); EXPECT_EQ(sprite1.sorting_in_layer, 5); - auto & sprite2 = entity2.add_component(s2, Color(0, 0, 0, 0), - Sprite::FlipSettings{false, false}, 2, 1, 100); + auto & sprite2 = entity2.add_component( + s2, Color(0, 0, 0, 0), Sprite::FlipSettings{false, false}, 2, 1, 100); ASSERT_NE(sprite2.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite2.sorting_in_layer, 2); EXPECT_EQ(sprite2.order_in_layer, 1); - auto & sprite3 = entity3.add_component(s3, Color(0, 0, 0, 0), - Sprite::FlipSettings{false, false}, 1, 2, 100); + auto & sprite3 = entity3.add_component( + s3, Color(0, 0, 0, 0), Sprite::FlipSettings{false, false}, 1, 2, 100); ASSERT_NE(sprite3.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite3.sorting_in_layer, 1); EXPECT_EQ(sprite3.order_in_layer, 2); - auto & sprite4 = entity4.add_component(s4, Color(0, 0, 0, 0), - Sprite::FlipSettings{false, false}, 1, 1, 100); + auto & sprite4 = entity4.add_component( + s4, Color(0, 0, 0, 0), Sprite::FlipSettings{false, false}, 1, 1, 100); ASSERT_NE(sprite4.sprite_image.texture.get(), nullptr); EXPECT_EQ(sprite4.sorting_in_layer, 1); EXPECT_EQ(sprite4.order_in_layer, 1); @@ -66,7 +66,7 @@ TEST_F(RenderSystemTest, expected_throws) { EXPECT_ANY_THROW({ auto test = Texture(""); entity1.add_component(test, Color(0, 0, 0, 0), - Sprite::FlipSettings{false, false},1,1,100); + Sprite::FlipSettings{false, false}, 1, 1, 100); }); // No camera -- cgit v1.2.3 From 1cdaa2aaeb1b6bc71876b462fcc464800ec75732 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 10:23:41 +0100 Subject: sprite had include wrong order --- src/crepe/api/Sprite.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 2d73879..e40ce24 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -1,10 +1,11 @@ #pragma once +#include + #include "../Component.h" #include "Color.h" #include "Texture.h" -#include namespace crepe { -- cgit v1.2.3 From 9d9c4fc4565f0ef0fc81c8baeef804389f07afc2 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Thu, 28 Nov 2024 12:53:15 +0100 Subject: implemented loek feedback --- src/crepe/api/Animator.cpp | 12 ++++++------ src/crepe/api/Camera.cpp | 4 ++-- src/crepe/api/Camera.h | 4 ++-- src/crepe/api/Color.cpp | 2 +- src/crepe/api/Config.h | 7 +++++-- src/crepe/api/Sprite.cpp | 8 ++++---- src/crepe/api/Sprite.h | 14 +++++++------- src/crepe/facade/SDLContext.cpp | 32 ++++++++++++++++---------------- src/crepe/facade/SDLContext.h | 19 ++++++++++--------- src/crepe/system/AnimatorSystem.cpp | 4 ++-- src/crepe/system/RenderSystem.cpp | 11 ++++------- src/example/rendering_particle.cpp | 2 +- src/test/RenderSystemTest.cpp | 6 +++--- 13 files changed, 63 insertions(+), 62 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index 2b21c6c..0fdab0e 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -14,14 +14,14 @@ Animator::Animator(game_object_id_t id, Sprite & ss, int row, int col, int col_a col(col) { dbg_trace(); - this->spritesheet.sprite_rect.h /= col; - this->spritesheet.sprite_rect.w /= row; - this->spritesheet.sprite_rect.x = 0; - this->spritesheet.sprite_rect.y = col_animator * this->spritesheet.sprite_rect.h; + this->spritesheet.mask.h /= col; + this->spritesheet.mask.w /= row; + this->spritesheet.mask.x = 0; + this->spritesheet.mask.y = col_animator * this->spritesheet.mask.h; this->active = false; // need to do this for to get the aspect ratio for a single clipping in the spritesheet - this->spritesheet.aspect_ratio = static_cast(this->spritesheet.sprite_rect.w) - / this->spritesheet.sprite_rect.h; + this->spritesheet.aspect_ratio = static_cast(this->spritesheet.mask.w) + / this->spritesheet.mask.h; } Animator::~Animator() { dbg_trace(); } diff --git a/src/crepe/api/Camera.cpp b/src/crepe/api/Camera.cpp index 0831f45..39d8ab0 100644 --- a/src/crepe/api/Camera.cpp +++ b/src/crepe/api/Camera.cpp @@ -8,12 +8,12 @@ using namespace crepe; Camera::Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, - const ivec2 & viewport, const double & zoom, const vec2 & offset) + const vec2 & viewport_size, const double & zoom, const vec2 & offset) : Component(id), bg_color(bg_color), offset(offset), screen(screen), - viewport(viewport), + viewport_size(viewport_size), zoom(zoom) { dbg_trace(); } diff --git a/src/crepe/api/Camera.h b/src/crepe/api/Camera.h index 3682222..2d8fa48 100644 --- a/src/crepe/api/Camera.h +++ b/src/crepe/api/Camera.h @@ -22,7 +22,7 @@ public: * \param bg_color Background color for the camera view. */ Camera(game_object_id_t id, const Color & bg_color, const ivec2 & screen, - const ivec2 & viewport, const double & zoom, const vec2 & offset = {0, 0}); + const vec2 & viewport_size, const double & zoom, const vec2 & offset = {0, 0}); ~Camera(); // dbg_trace only public: @@ -36,7 +36,7 @@ public: const ivec2 screen; //! viewport is the area of the world visible through the camera (in world units) - const ivec2 viewport; + const vec2 viewport_size; //! Zoom level of the camera view. const double zoom; diff --git a/src/crepe/api/Color.cpp b/src/crepe/api/Color.cpp index dc7c15f..29bd77a 100644 --- a/src/crepe/api/Color.cpp +++ b/src/crepe/api/Color.cpp @@ -2,7 +2,7 @@ using namespace crepe; -const Color Color::WHITE{0xff, 0xff, 0xff, 0xff}; +const Color Color::WHITE{0xff, 0xff, 0xff}; const Color Color::RED{0xff, 0x00, 0x00}; const Color Color::GREEN{0x00, 0xff, 0x00}; const Color Color::BLUE{0x00, 0x00, 0xff}; diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index d73e488..225e9b9 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -2,6 +2,7 @@ #include "../util/Log.h" #include "types.h" +#include namespace crepe { @@ -66,8 +67,10 @@ public: //! default window settings struct { //TODO make this constexpr because this will never change - ivec2 def_size = {1080, 720}; - } win_set; + ivec2 default_size = {1080, 720}; + std::string window_title = "Jetpack joyride clone"; + + } window_settings; //! Asset loading options struct { diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index 65c6cc3..8647794 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -11,7 +11,7 @@ using namespace std; using namespace crepe; Sprite::Sprite(game_object_id_t id, Texture & image, const Color & color, - const FlipSettings & flip, uint8_t sort_layer, uint8_t order_layer, int height) + const FlipSettings & flip, int sort_layer, int order_layer, int height) : Component(id), color(color), flip(flip), @@ -22,9 +22,9 @@ Sprite::Sprite(game_object_id_t id, Texture & image, const Color & color, dbg_trace(); - this->sprite_rect.w = sprite_image.get_width(); - this->sprite_rect.h = sprite_image.get_height(); - this->aspect_ratio = static_cast(this->sprite_rect.w) / this->sprite_rect.h; + this->mask.w = sprite_image.get_width(); + this->mask.h = sprite_image.get_height(); + this->aspect_ratio = static_cast(this->mask.w) / this->mask.h; } Sprite::~Sprite() { dbg_trace(); } diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index e40ce24..a0e90a0 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -41,7 +41,7 @@ public: * \param height the height of the image in game units */ Sprite(game_object_id_t id, Texture & image, const Color & color, - const FlipSettings & flip, uint8_t sort_layer, uint8_t order_layer, int height); + const FlipSettings & flip, int sort_layer, int order_layer, int height); /** * \brief Destroys the Sprite instance. @@ -58,9 +58,9 @@ public: FlipSettings flip; //! Layer sorting level of the sprite - const uint8_t sorting_in_layer; + const int sorting_in_layer; //! Order within the sorting layer - const uint8_t order_in_layer; + const int order_in_layer; //! height in world units const int height; @@ -74,13 +74,13 @@ public: double aspect_ratio; private: - //! Reads the sprite_rect of sprite + //! Reads the mask of sprite friend class SDLContext; - //! Reads the all the variables plus the sprite_rect + //! Reads the all the variables plus the mask friend class Animator; - //! Reads the all the variables plus the sprite_rect + //! Reads the all the variables plus the mask friend class AnimatorSystem; struct Rect { @@ -91,7 +91,7 @@ private: }; //! Render area of the sprite this will also be adjusted by the AnimatorSystem if an Animator // object is present in GameObject. this is in sprite pixels - Rect sprite_rect; + Rect mask; }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 7317a77..9f60285 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -15,7 +15,6 @@ #include "../api/Config.h" #include "../api/Sprite.h" #include "../api/Texture.h" -#include "../api/Transform.h" #include "../util/Log.h" #include "SDLContext.h" @@ -36,10 +35,10 @@ SDLContext::SDLContext() { throw runtime_error(format("SDLContext: SDL_Init error: {}", SDL_GetError())); } - auto & cfg = Config::get_instance().win_set; + auto & cfg = Config::get_instance().window_settings; SDL_Window * tmp_window - = SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - cfg.def_size.x, cfg.def_size.y, 0); + = SDL_CreateWindow(cfg.window_title.c_str(), SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, cfg.default_size.x, cfg.default_size.y, 0); if (!tmp_window) { throw runtime_error(format("SDLContext: SDL_Window error: {}", SDL_GetError())); } @@ -102,10 +101,10 @@ void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()) SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { return SDL_Rect{ - .x = sprite.sprite_rect.x, - .y = sprite.sprite_rect.y, - .w = sprite.sprite_rect.w, - .h = sprite.sprite_rect.h, + .x = sprite.mask.x, + .y = sprite.mask.y, + .w = sprite.mask.w, + .h = sprite.mask.h, }; } SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, @@ -118,14 +117,14 @@ SDL_Rect SDLContext::get_dst_rect(const Sprite & sprite, const vec2 & pos, const height *= img_scale * cam.zoom; return SDL_Rect{ - .x = static_cast((pos.x - cam_pos.x + (cam.viewport.x / 2) - width / 2)), - .y = static_cast((pos.y - cam_pos.y + (cam.viewport.y / 2) - height / 2)), + .x = static_cast((pos.x - cam_pos.x + (cam.viewport_size.x / 2) - width / 2)), + .y = static_cast((pos.y - cam_pos.y + (cam.viewport_size.y / 2) - height / 2)), .w = width, .h = height, }; } -void SDLContext::draw(const RenderCtx & ctx) { +void SDLContext::draw(const RenderContext & ctx) { SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * ctx.sprite.flip.flip_x) @@ -149,12 +148,12 @@ void SDLContext::set_camera(const Camera & cam) { } double screen_aspect = cam.screen.x / cam.screen.y; - double viewport_aspect = cam.viewport.x / cam.viewport.y; + double viewport_aspect = cam.viewport_size.x / cam.viewport_size.y; SDL_Rect view; // calculate black bars if (screen_aspect > viewport_aspect) { - // lettorboxing + // letterboxing view.h = cam.screen.y / cam.zoom; view.w = cam.screen.y * viewport_aspect; view.x = (cam.screen.x - view.w) / 2; @@ -169,7 +168,8 @@ void SDLContext::set_camera(const Camera & cam) { // set drawing area SDL_RenderSetViewport(this->game_renderer.get(), &view); - SDL_RenderSetLogicalSize(this->game_renderer.get(), cam.viewport.x, cam.viewport.y); + SDL_RenderSetLogicalSize(this->game_renderer.get(), static_cast(cam.viewport_size.x), + static_cast(cam.viewport_size.y)); // set bg color SDL_SetRenderDrawColor(this->game_renderer.get(), cam.bg_color.r, cam.bg_color.g, @@ -178,8 +178,8 @@ void SDLContext::set_camera(const Camera & cam) { SDL_Rect bg = { .x = 0, .y = 0, - .w = cam.viewport.x, - .h = cam.viewport.y, + .w = static_cast(cam.viewport_size.x), + .h = static_cast(cam.viewport_size.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 5f141be..8b38111 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -16,14 +16,6 @@ namespace crepe { -struct RenderCtx { - const Sprite & sprite; - const Camera & cam; - const vec2 & cam_pos; - const vec2 & pos; - const double & angle; - const double & scale; -}; // TODO: SDL_Keycode is defined in a header not distributed with crepe, which means this // typedef is unusable when crepe is packaged. Wouter will fix this later. @@ -37,6 +29,15 @@ typedef SDL_Keycode CREPE_KEYCODES; * event handling, and rendering to the screen. It is never used directly by the user */ class SDLContext { +public: + struct RenderContext { + const Sprite & sprite; + const Camera & cam; + const vec2 & cam_pos; + const vec2 & pos; + const double & angle; + const double & scale; + }; public: /** @@ -125,7 +126,7 @@ private: * \brief Draws a sprite to the screen using the specified transform and camera. * \param RenderCtx Reference to rendering data to draw */ - void draw(const RenderCtx & ctx); + void draw(const RenderContext & ctx); //! Clears the screen, preparing for a new frame. void clear_screen(); diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp index e5b277f..4c40940 100644 --- a/src/crepe/system/AnimatorSystem.cpp +++ b/src/crepe/system/AnimatorSystem.cpp @@ -18,7 +18,7 @@ void AnimatorSystem::update() { if (!a.active) continue; // (10 frames per second) a.curr_row = (tick / 100) % a.row; - a.spritesheet.sprite_rect.x = (a.curr_row * a.spritesheet.sprite_rect.w) + a.curr_col; - a.spritesheet.sprite_rect = a.spritesheet.sprite_rect; + a.spritesheet.mask.x = (a.curr_row * a.spritesheet.mask.w) + a.curr_col; + a.spritesheet.mask = a.spritesheet.mask; } } diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 8895f02..c196bb1 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -77,31 +77,28 @@ bool RenderSystem::render_particle(const Sprite & sprite, const Camera & cam, for (const Particle & p : em.data.particles) { if (!p.active) continue; - RenderCtx ctx{ + this->context.draw(SDLContext::RenderContext{ .sprite = sprite, .cam = cam, .cam_pos = this->cam_pos, .pos = p.position, .angle = p.angle, .scale = scale, - }; - this->context.draw(ctx); + }); } } return rendering_particles; } void RenderSystem::render_normal(const Sprite & sprite, const Camera & cam, const Transform & tm) { - - RenderCtx ctx{ + this->context.draw(SDLContext::RenderContext{ .sprite = sprite, .cam = cam, .cam_pos = this->cam_pos, .pos = tm.position, .angle = tm.rotation, .scale = tm.scale, - }; - this->context.draw(ctx); + }); } void RenderSystem::render() { diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 8fdbb58..3a12144 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -60,7 +60,7 @@ int main(int argc, char * argv[]) { */ auto & cam = game_object.add_component(Color::WHITE, ivec2{1080, 720}, - ivec2{2000, 2000}, 1.0f); + vec2{2000, 2000}, 1.0f); /* game_object diff --git a/src/test/RenderSystemTest.cpp b/src/test/RenderSystemTest.cpp index e0bd953..bb5b81a 100644 --- a/src/test/RenderSystemTest.cpp +++ b/src/test/RenderSystemTest.cpp @@ -113,7 +113,7 @@ TEST_F(RenderSystemTest, sorting_sprites) { } TEST_F(RenderSystemTest, Update) { - entity1.add_component(Color::WHITE, ivec2{1080, 720}, ivec2{2000, 2000}, 1.0f); + entity1.add_component(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f); { vector> sprites = this->mgr.get_components_by_type(); ASSERT_EQ(sprites.size(), 4); @@ -141,7 +141,7 @@ TEST_F(RenderSystemTest, Camera) { EXPECT_NE(cameras.size(), 1); } { - entity1.add_component(Color::WHITE, ivec2{1080, 720}, ivec2{2000, 2000}, 1.0f); + entity1.add_component(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f); auto cameras = this->mgr.get_components_by_type(); EXPECT_EQ(cameras.size(), 1); } @@ -149,7 +149,7 @@ TEST_F(RenderSystemTest, Camera) { //TODO improve with newer version } TEST_F(RenderSystemTest, Color) { - entity1.add_component(Color::WHITE, ivec2{1080, 720}, ivec2{2000, 2000}, 1.0f); + entity1.add_component(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f); auto & sprite = this->mgr.get_components_by_id(entity1.id).front().get(); ASSERT_NE(sprite.sprite_image.texture.get(), nullptr); -- cgit v1.2.3 From 85aa57e33d493502b05984ce44db6c68f627a6f2 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Thu, 28 Nov 2024 12:54:27 +0100 Subject: `make format` --- mwe/events/include/event.h | 2 +- src/crepe/api/Animator.cpp | 4 ++-- src/crepe/facade/SDLContext.h | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/mwe/events/include/event.h b/mwe/events/include/event.h index e1b220b..ee1bf52 100644 --- a/mwe/events/include/event.h +++ b/mwe/events/include/event.h @@ -148,7 +148,7 @@ private: }; class ShutDownEvent : public Event { public: - ShutDownEvent() : Event("ShutDownEvent"){}; + ShutDownEvent() : Event("ShutDownEvent") {}; REGISTER_EVENT_TYPE(ShutDownEvent) diff --git a/src/crepe/api/Animator.cpp b/src/crepe/api/Animator.cpp index 0fdab0e..45f67f6 100644 --- a/src/crepe/api/Animator.cpp +++ b/src/crepe/api/Animator.cpp @@ -21,7 +21,7 @@ Animator::Animator(game_object_id_t id, Sprite & ss, int row, int col, int col_a this->active = false; // need to do this for to get the aspect ratio for a single clipping in the spritesheet - this->spritesheet.aspect_ratio = static_cast(this->spritesheet.mask.w) - / this->spritesheet.mask.h; + this->spritesheet.aspect_ratio + = static_cast(this->spritesheet.mask.w) / this->spritesheet.mask.h; } Animator::~Animator() { dbg_trace(); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 8b38111..6030a6e 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -16,7 +16,6 @@ namespace crepe { - // TODO: SDL_Keycode is defined in a header not distributed with crepe, which means this // typedef is unusable when crepe is packaged. Wouter will fix this later. typedef SDL_Keycode CREPE_KEYCODES; -- cgit v1.2.3 From 9e1d1f0952ed09ee4b0c241fad3d0d66b380b1a3 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 2 Dec 2024 18:59:43 +0100 Subject: fixed the color functionality --- src/crepe/facade/SDLContext.cpp | 20 +++++++++++++++----- src/crepe/facade/SDLContext.h | 10 ++++++---- 2 files changed, 21 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index c01d118..cfe79d2 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -19,6 +19,7 @@ #include "../util/Log.h" #include "SDLContext.h" +#include "api/Color.h" #include "types.h" using namespace crepe; @@ -131,10 +132,16 @@ void SDLContext::draw(const RenderContext & ctx) { = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * ctx.sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * ctx.sprite.flip.flip_y)); + const Color & color = ctx.sprite.color; + SDL_Rect srcrect = this->get_src_rect(ctx.sprite); SDL_Rect dstrect = this->get_dst_rect(ctx.sprite, ctx.pos, ctx.cam, ctx.cam_pos, ctx.scale); + this->set_rbg_texture(ctx.sprite.sprite_image, color.r, color.g, color.b); + this->set_alpha_texture(ctx.sprite.sprite_image, color.a); + + SDL_RenderCopyEx(this->game_renderer.get(), ctx.sprite.sprite_image.texture.get(), &srcrect, &dstrect, ctx.angle, NULL, render_flip); } @@ -221,9 +228,12 @@ int SDLContext::get_height(const Texture & ctx) const { return h; } void SDLContext::delay(int ms) const { SDL_Delay(ms); } -void SDLContext::set_rbg_texture(const std::shared_ptr& texture, const uint8_t& r, const uint8_t& g, const uint8_t& b){ - SDL_SetTextureColorMod(texture->texture.get(), r, g, b); + +void SDLContext::set_rbg_texture(const Texture & texture, const uint8_t & r, + const uint8_t & g, const uint8_t & b) { + SDL_SetTextureColorMod(texture.texture.get(), r, g, b); +} +void SDLContext::set_alpha_texture(const Texture & texture, + const uint8_t & alpha) { + SDL_SetTextureAlphaMod(texture.texture.get(), alpha); } -void SDLContext::set_alpha_texture(const std::shared_ptr& texture, const uint8_t& alpha){ - SDL_SetTextureAlphaMod(texture->texture.get(), alpha ); -} \ No newline at end of file diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 6284a9c..8d63c43 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -12,6 +12,7 @@ #include "../api/Camera.h" #include "../api/Sprite.h" +#include "api/Texture.h" #include "types.h" namespace crepe { @@ -160,7 +161,7 @@ private: */ SDL_Rect get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, const vec2 & cam_pos, const double & img_scale) const; -/** + /** * \brief changes the texture rbg values with the given parameters * it sets the allowed color inside a image. So if all the colors are 255 (MAXIMUM) * it will show the given texture. however if the one of the colors is reduced it will reduce the @@ -171,8 +172,8 @@ private: * \param g Green color * \param b Blue color */ - void set_rbg_texture(const std::shared_ptr& texture, const uint8_t& r, const uint8_t& g, const uint8_t& b); - + void set_rbg_texture(const Texture & texture, const uint8_t & r, + const uint8_t & g, const uint8_t & b); /** * \brief Modifies the transparency of the given texture @@ -180,7 +181,8 @@ private: * \param texture modify the given texture alpha channel * \param alpha alpha channel */ - void set_alpha_texture(const std::shared_ptr& texture, const uint8_t& alpha); + void set_alpha_texture(const Texture & texture, const uint8_t & alpha); + private: //! sdl Window std::unique_ptr> game_window; -- cgit v1.2.3 From cffa9f014c67133dc48569beb53a5bd6cb166faa Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 2 Dec 2024 19:18:41 +0100 Subject: rendering color working --- src/crepe/facade/SDLContext.cpp | 4 ++++ src/crepe/facade/SDLContext.h | 8 +++----- src/example/rendering_particle.cpp | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index cfe79d2..aaaec6b 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -9,6 +10,7 @@ #include #include #include +#include #include #include @@ -215,6 +217,7 @@ SDLContext::texture_from_path(const std::string & path) { std::unique_ptr> img_texture; img_texture = {tmp_texture, [](SDL_Texture * texture) { SDL_DestroyTexture(texture); }}; + SDL_SetTextureBlendMode(img_texture.get(), SDL_BLENDMODE_BLEND); return img_texture; } int SDLContext::get_width(const Texture & ctx) const { @@ -235,5 +238,6 @@ void SDLContext::set_rbg_texture(const Texture & texture, const uint8_t & r, } void SDLContext::set_alpha_texture(const Texture & texture, const uint8_t & alpha) { + SDL_SetTextureAlphaMod(texture.texture.get(), alpha); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 8d63c43..1c67301 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -162,10 +162,7 @@ private: SDL_Rect get_dst_rect(const Sprite & sprite, const vec2 & pos, const Camera & cam, const vec2 & cam_pos, const double & img_scale) const; /** - * \brief changes the texture rbg values with the given parameters - * it sets the allowed color inside a image. So if all the colors are 255 (MAXIMUM) - * it will show the given texture. however if the one of the colors is reduced it will reduce the - * + * \brief Set an additional color value multiplied into render copy operations. * * \param texture the given texture to adjust * \param r Red color @@ -175,8 +172,9 @@ private: void set_rbg_texture(const Texture & texture, const uint8_t & r, const uint8_t & g, const uint8_t & b); + /** - * \brief Modifies the transparency of the given texture + * \brief Set an additional alpha value multiplied into render copy operations. * * \param texture modify the given texture alpha channel * \param alpha alpha channel diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 3a12144..349d11e 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -28,7 +28,7 @@ int main(int argc, char * argv[]) { ParticleSystem psys{mgr}; AnimatorSystem asys{mgr}; - Color color(255, 255, 255, 255); + Color color(255, 255, 255, 100); auto img = Texture("asset/texture/test_ap43.png"); Sprite & test_sprite = game_object.add_component( @@ -59,7 +59,7 @@ int main(int argc, char * argv[]) { }); */ - auto & cam = game_object.add_component(Color::WHITE, ivec2{1080, 720}, + auto & cam = game_object.add_component(Color::RED, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f); /* -- cgit v1.2.3 From e1a6c367a7d4233ed5f38a68ee4d69c3cef1c4f5 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 2 Dec 2024 19:19:12 +0100 Subject: make format --- src/crepe/facade/SDLContext.cpp | 8 +++----- src/crepe/facade/SDLContext.h | 5 ++--- 2 files changed, 5 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index aaaec6b..fe6aa45 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -143,7 +143,6 @@ void SDLContext::draw(const RenderContext & ctx) { this->set_rbg_texture(ctx.sprite.sprite_image, color.r, color.g, color.b); this->set_alpha_texture(ctx.sprite.sprite_image, color.a); - SDL_RenderCopyEx(this->game_renderer.get(), ctx.sprite.sprite_image.texture.get(), &srcrect, &dstrect, ctx.angle, NULL, render_flip); } @@ -232,12 +231,11 @@ int SDLContext::get_height(const Texture & ctx) const { } void SDLContext::delay(int ms) const { SDL_Delay(ms); } -void SDLContext::set_rbg_texture(const Texture & texture, const uint8_t & r, - const uint8_t & g, const uint8_t & b) { +void SDLContext::set_rbg_texture(const Texture & texture, const uint8_t & r, const uint8_t & g, + const uint8_t & b) { SDL_SetTextureColorMod(texture.texture.get(), r, g, b); } -void SDLContext::set_alpha_texture(const Texture & texture, - const uint8_t & alpha) { +void SDLContext::set_alpha_texture(const Texture & texture, const uint8_t & alpha) { SDL_SetTextureAlphaMod(texture.texture.get(), alpha); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 1c67301..e128bfd 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -169,9 +169,8 @@ private: * \param g Green color * \param b Blue color */ - void set_rbg_texture(const Texture & texture, const uint8_t & r, - const uint8_t & g, const uint8_t & b); - + void set_rbg_texture(const Texture & texture, const uint8_t & r, const uint8_t & g, + const uint8_t & b); /** * \brief Set an additional alpha value multiplied into render copy operations. -- cgit v1.2.3 From b6609b0fbc263f4fd93791f3897c5f2840b962f2 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Tue, 3 Dec 2024 09:28:12 +0100 Subject: implemented feedback removed get_width and height --> get_size for both texture and sdlcontext --- src/crepe/api/Sprite.cpp | 4 ++-- src/crepe/api/Texture.cpp | 11 ++++------- src/crepe/api/Texture.h | 13 ++++--------- src/crepe/facade/SDLContext.cpp | 32 +++++++++++--------------------- src/crepe/facade/SDLContext.h | 29 ++++++----------------------- src/crepe/system/RenderSystem.cpp | 3 +-- src/crepe/system/RenderSystem.h | 1 + 7 files changed, 29 insertions(+), 64 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Sprite.cpp b/src/crepe/api/Sprite.cpp index 8647794..0a2ad4c 100644 --- a/src/crepe/api/Sprite.cpp +++ b/src/crepe/api/Sprite.cpp @@ -22,8 +22,8 @@ Sprite::Sprite(game_object_id_t id, Texture & image, const Color & color, dbg_trace(); - this->mask.w = sprite_image.get_width(); - this->mask.h = sprite_image.get_height(); + this->mask.w = sprite_image.get_size().x; + this->mask.h = sprite_image.get_size().y; this->aspect_ratio = static_cast(this->mask.w) / this->mask.h; } diff --git a/src/crepe/api/Texture.cpp b/src/crepe/api/Texture.cpp index e43bdaa..c23b91e 100644 --- a/src/crepe/api/Texture.cpp +++ b/src/crepe/api/Texture.cpp @@ -2,6 +2,7 @@ #include "../util/Log.h" #include "Asset.h" +#include "types.h" #include "Texture.h" using namespace crepe; @@ -31,11 +32,7 @@ void Texture::load(const Asset & res) { this->texture = ctx.texture_from_path(res.get_path()); } -int Texture::get_width() const { - if (this->texture == nullptr) return 0; - return SDLContext::get_instance().get_width(*this); -} -int Texture::get_height() const { - if (this->texture == nullptr) return 0; - return SDLContext::get_instance().get_height(*this); +ivec2 Texture::get_size() const { + if (this->texture == nullptr) return {}; + return SDLContext::get_instance().get_size(*this); } diff --git a/src/crepe/api/Texture.h b/src/crepe/api/Texture.h index 7206a66..1817910 100644 --- a/src/crepe/api/Texture.h +++ b/src/crepe/api/Texture.h @@ -8,6 +8,7 @@ #include #include "Asset.h" +#include "types.h" namespace crepe { @@ -42,16 +43,10 @@ public: Texture & operator=(const Texture &) = delete; /** - * \brief Gets the width of the texture. - * \return Width of the texture in pixels. + * \brief Gets the width and height of the texture. + * \return Width and height of the texture in pixels. */ - int get_width() const; - - /** - * \brief Gets the height of the texture. - * \return Height of the texture in pixels. - */ - int get_height() const; + ivec2 get_size() const; private: /** diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index fe6aa45..8d8a87d 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -134,15 +134,11 @@ void SDLContext::draw(const RenderContext & ctx) { = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * ctx.sprite.flip.flip_x) | (SDL_FLIP_VERTICAL * ctx.sprite.flip.flip_y)); - const Color & color = ctx.sprite.color; - SDL_Rect srcrect = this->get_src_rect(ctx.sprite); SDL_Rect dstrect = this->get_dst_rect(ctx.sprite, ctx.pos, ctx.cam, ctx.cam_pos, ctx.scale); - this->set_rbg_texture(ctx.sprite.sprite_image, color.r, color.g, color.b); - this->set_alpha_texture(ctx.sprite.sprite_image, color.a); - + this->set_color_texture(ctx.sprite.sprite_image, ctx.sprite.color); SDL_RenderCopyEx(this->game_renderer.get(), ctx.sprite.sprite_image.texture.get(), &srcrect, &dstrect, ctx.angle, NULL, render_flip); } @@ -219,23 +215,17 @@ SDLContext::texture_from_path(const std::string & path) { SDL_SetTextureBlendMode(img_texture.get(), SDL_BLENDMODE_BLEND); return img_texture; } -int SDLContext::get_width(const Texture & ctx) const { - int w; - SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &w, NULL); - return w; -} -int SDLContext::get_height(const Texture & ctx) const { - int h; - SDL_QueryTexture(ctx.texture.get(), NULL, NULL, NULL, &h); - return h; -} -void SDLContext::delay(int ms) const { SDL_Delay(ms); } -void SDLContext::set_rbg_texture(const Texture & texture, const uint8_t & r, const uint8_t & g, - const uint8_t & b) { - SDL_SetTextureColorMod(texture.texture.get(), r, g, b); + +ivec2 SDLContext::get_size(const Texture & ctx){ + ivec2 size; + SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &size.x, &size.y); + return size; } -void SDLContext::set_alpha_texture(const Texture & texture, const uint8_t & alpha) { - SDL_SetTextureAlphaMod(texture.texture.get(), alpha); +void SDLContext::delay(int ms) const { SDL_Delay(ms); } + +void SDLContext::set_color_texture(const Texture & texture, const Color & color) { + SDL_SetTextureColorMod(texture.texture.get(), color.r, color.g, color.b); + SDL_SetTextureAlphaMod(texture.texture.get(), color.a); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index e128bfd..e49ca78 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -12,6 +12,7 @@ #include "../api/Camera.h" #include "../api/Sprite.h" +#include "api/Color.h" #include "api/Texture.h" #include "types.h" @@ -105,18 +106,11 @@ private: std::unique_ptr> texture_from_path(const std::string & path); /** - * \brief Gets the width of a texture. + * \brief Gets the size of a texture. * \param texture Reference to the Texture object. - * \return Width of the texture as an integer. + * \return Width and height of the texture as an integer. */ - int get_width(const Texture & texture) const; - - /** - * \brief Gets the height of a texture. - * \param texture Reference to the Texture object. - * \return Height of the texture as an integer. - */ - int get_height(const Texture & texture) const; + ivec2 get_size(const Texture & ctx); private: //! Will use draw,clear_screen, present_screen, camera. @@ -165,20 +159,9 @@ private: * \brief Set an additional color value multiplied into render copy operations. * * \param texture the given texture to adjust - * \param r Red color - * \param g Green color - * \param b Blue color - */ - void set_rbg_texture(const Texture & texture, const uint8_t & r, const uint8_t & g, - const uint8_t & b); - - /** - * \brief Set an additional alpha value multiplied into render copy operations. - * - * \param texture modify the given texture alpha channel - * \param alpha alpha channel + * \param color the color data for the texture */ - void set_alpha_texture(const Texture & texture, const uint8_t & alpha); + void set_color_texture(const Texture & texture, const Color & color); private: //! sdl Window diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 1883f8f..11c9669 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -10,7 +10,6 @@ #include "../api/ParticleEmitter.h" #include "../api/Sprite.h" #include "../api/Transform.h" -#include "../api/Vector2.h" #include "../facade/SDLContext.h" #include "RenderSystem.h" @@ -71,7 +70,7 @@ bool RenderSystem::render_particle(const Sprite & sprite, const Camera & cam, bool rendering_particles = false; for (const ParticleEmitter & em : emitters) { - if (!(&em.data.sprite == &sprite)) continue; + if (&em.data.sprite != &sprite) continue; rendering_particles = true; if (!em.active) continue; diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 4d542ec..096d058 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -77,6 +77,7 @@ private: */ private: + // FIXME: retrieve sdlcontext via mediator after #PR57 SDLContext & context = SDLContext::get_instance(); //! camera postion in the current scene -- cgit v1.2.3 From cc821016c8ddce45a1e3f192415f58be237b8a1e Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Tue, 3 Dec 2024 11:24:12 +0100 Subject: `make format` --- src/crepe/api/Texture.cpp | 2 +- src/crepe/facade/SDLContext.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/crepe/api/Texture.cpp b/src/crepe/api/Texture.cpp index c23b91e..2b56271 100644 --- a/src/crepe/api/Texture.cpp +++ b/src/crepe/api/Texture.cpp @@ -2,8 +2,8 @@ #include "../util/Log.h" #include "Asset.h" -#include "types.h" #include "Texture.h" +#include "types.h" using namespace crepe; using namespace std; diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 8d8a87d..e8be7ca 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -216,8 +216,7 @@ SDLContext::texture_from_path(const std::string & path) { return img_texture; } - -ivec2 SDLContext::get_size(const Texture & ctx){ +ivec2 SDLContext::get_size(const Texture & ctx) { ivec2 size; SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &size.x, &size.y); return size; -- cgit v1.2.3