From 36637b1f8a1a196b233cdb02ddcdb8f711f4ce48 Mon Sep 17 00:00:00 2001 From: Sara Date: Thu, 9 Jan 2025 21:54:33 +0100 Subject: [PATCH] feat: improved sprite rendering --- src/core/sprite.cpp | 31 +++++++++++++++++++++++++------ src/core/sprite.hpp | 7 ++++++- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/core/sprite.cpp b/src/core/sprite.cpp index 838505f..9156e94 100644 --- a/src/core/sprite.cpp +++ b/src/core/sprite.cpp @@ -1,12 +1,13 @@ #include "sprite.hpp" #include "core/canvas_engine.hpp" #include "core/math/transform.hpp" +#include "core/math/vector.hpp" #include #include #include namespace ce { -Sprite::Sprite(std::string name, std::string texture) +Sprite::Sprite(std::string const &name, std::string texture) : Node2D(name) { std::optional> asset{CanvasEngine::get_singleton()->get_assets().get_asset(texture)}; if(asset.has_value()) @@ -23,15 +24,33 @@ void Sprite::_draw(SDL_Renderer *render, ce::Transform const &view_transform) { SDL_QueryTexture(this->texture->get(), NULL, NULL, &w, &h); Transform transform{this->get_global_transform() * view_transform}; assert(transform.scale.x != 0 && transform.scale.y != 0); // !!! - float fw{transform.scale.x * (w > h ? float(w) / float(h) : 1.f)}; - float fh{transform.scale.y * (w < h ? float(h) / float(w) : 1.f)}; - assert(fw != 0.f && fh != 0.f); + ce::Vecf size{this->get_size()}; + size.scale(view_transform.scale); + assert(size.x != 0.f && size.y != 0.f); //float fw(w), fh(h); - SDL_Rect src{0, 0, w, h}; - SDL_FRect dst{transform.position.x - fw/2.f, transform.position.y - fh/2.f, fw, fh}; + SDL_Rect src{.x=0, .y=0, .w=w, .h=h}; + SDL_FRect dst{.x=transform.position.x - size.x/2.f, .y=transform.position.y - size.y/2.f, .w=size.x, .h=size.y}; SDL_RenderCopyExF(render, this->texture->get(), &src, &dst, transform.rotation * 57.2958f,NULL, SDL_FLIP_NONE); } + +void Sprite::set_texture(std::shared_ptr texture) { + this->texture = texture; +} + +std::shared_ptr Sprite::get_texture() const { + return this->texture; +} + +ce::Vecf Sprite::get_size() const { + int w, h; + SDL_QueryTexture(this->texture->get(), NULL, NULL, &w, &h); + ce::Transform const &transform{this->get_global_transform()}; + return { + transform.scale.x * (w < h ? float(w) / float(h) : 1.f), + transform.scale.y * (w > h ? float(h) / float(w) : 1.f) + }; +} } diff --git a/src/core/sprite.hpp b/src/core/sprite.hpp index 8b294e0..58c7648 100644 --- a/src/core/sprite.hpp +++ b/src/core/sprite.hpp @@ -8,8 +8,13 @@ namespace ce { class Sprite : public Node2D { std::shared_ptr texture{nullptr}; public: - Sprite(std::string name, std::string texture); + Sprite(std::string const &name, std::string texture); virtual void _draw(SDL_Renderer *render, ce::Transform const &view_transform) override; + + void set_texture(std::shared_ptr texture); + std::shared_ptr get_texture() const; + + ce::Vecf get_size() const; }; }