diff options
Diffstat (limited to 'src/crepe')
| -rw-r--r-- | src/crepe/api/Texture.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.cpp | 19 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.h | 30 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.cpp | 59 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.h | 21 | 
5 files changed, 114 insertions, 17 deletions
| 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/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 83e91f8..b56b5e7 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -6,10 +6,12 @@  #include <SDL2/SDL_video.h>  #include <cmath>  #include <cstddef> +#include <cstdint>  #include <functional>  #include <iostream>  #include <memory>  #include <string> +#include <sys/types.h>  #include "../api/Sprite.h"  #include "../api/Texture.h" @@ -103,12 +105,24 @@ 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::set_rbg_texture(const std::shared_ptr<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 std::shared_ptr<Texture>& texture, const uint8_t& alpha){ +	SDL_SetTextureAlphaMod(texture->texture.get(), alpha	); +} +  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)); +	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; @@ -121,6 +135,7 @@ void SDLContext::draw(const Sprite & sprite, const Transform & transform, const  		.h = sprite.sprite_rect.h,  	}; +  	SDL_Rect dstrect = {  		.x = static_cast<int>(adjusted_x),  		.y = static_cast<int>(adjusted_y), @@ -167,12 +182,12 @@ SDLContext::texture_from_path(const std::string & path) {  	return img_texture;  } -int SDLContext::get_width(const Texture & ctx) const { +int SDLContext::get_width(const Texture & ctx) {  	int w;  	SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &w, NULL);  	return w;  } -int SDLContext::get_height(const Texture & ctx) const { +int SDLContext::get_height(const Texture & ctx) {  	int h;  	SDL_QueryTexture(ctx.texture.get(), NULL, NULL, NULL, &h);  	return h; diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 007092b..8cbd5fa 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -3,6 +3,7 @@  #include <SDL2/SDL_keycode.h>  #include <SDL2/SDL_render.h>  #include <SDL2/SDL_video.h> +#include <cstdint>  #include <functional>  #include <memory>  #include <string> @@ -10,6 +11,7 @@  #include "../api/Sprite.h"  #include "../api/Transform.h"  #include "api/Camera.h" +#include "api/Vector2.h"  // FIXME: this needs to be removed  const int SCREEN_WIDTH = 640; @@ -106,14 +108,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 &) ;  	/**  	 * \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 &) ;  private:  	//! Will use draw,clear_screen, present_screen, camera. @@ -127,6 +129,8 @@ private:  	 */  	void draw(const Sprite & sprite, const Transform & transform, const Camera & camera); +	void draw_particle(const Vector2 & pos, const Camera & camera); +  	//! Clears the screen, preparing for a new frame.  	void clear_screen(); @@ -139,6 +143,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>& 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>& texture, const uint8_t& alpha); +  private:  	//! sdl Window  	std::unique_ptr<SDL_Window, std::function<void(SDL_Window *)>> game_window; diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index fa3d0de..52dd5fc 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -1,3 +1,4 @@ +#include <cmath>  #include <functional>  #include <vector> @@ -5,8 +6,11 @@  #include "../api/Sprite.h"  #include "../api/Transform.h"  #include "../facade/SDLContext.h" -#include "../util/Log.h" +#include "../util/log.h" +#include "../api/ParticleEmitter.h" +#include "../api/Vector2.h" +#include "Particle.h"  #include "RenderSystem.h"  using namespace crepe; @@ -24,21 +28,62 @@ void RenderSystem::update_camera() {  		this->curr_cam = &cam;  	}  } -void RenderSystem::render_sprites() const { -	ComponentManager & mgr = this->component_manager; -	std::vector<std::reference_wrapper<Sprite>> sprites = mgr.get_components_by_type<Sprite>(); +bool RenderSystem::render_particle(const Sprite & sprite, +								   const Transform & tm) { +	ComponentManager & mgr = ComponentManager::get_instance();  	SDLContext & render = SDLContext::get_instance(); + +	auto emitters = mgr.get_components_by_id<ParticleEmitter>(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; + +		rendering_particles = true; + +		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); +		} +	} +	return rendering_particles; +} +void RenderSystem::render_normal(const Sprite & sprite, const Transform & tm) { + +	ComponentManager & mgr = ComponentManager::get_instance(); +	SDLContext & render = SDLContext::get_instance(); +	 +	render.draw(sprite, tm, *curr_cam); +} + +void RenderSystem::render() { + +	ComponentManager & mgr = ComponentManager::get_instance(); + +	auto sprites = mgr.get_components_by_type<Sprite>();  	for (const Sprite & sprite : sprites) { -		auto transforms = mgr.get_components_by_id<Transform>(sprite.game_object_id); -		render.draw(sprite, transforms[0], *curr_cam); +		if (!sprite.active) continue; +		auto transform = mgr.get_components_by_id<Transform>(sprite.game_object_id); + +		bool rendered_particles = this->render_particle(sprite, transform[0].get()); + +		if (rendered_particles) continue; + +		this->render_normal(sprite, transform[0].get());  	}  }  void RenderSystem::update() {  	this->clear_screen();  	this->update_camera(); -	this->render_sprites(); +	this->render();  	this->present_screen();  } diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 87ec494..ebad05d 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -1,6 +1,8 @@  #pragma once  #include "api/Camera.h" +#include "api/Sprite.h" +#include "api/Transform.h"  #include "System.h" @@ -33,15 +35,24 @@ private:  	//! Updates the active camera used for rendering.  	void update_camera(); -	//! Renders all active sprites to the screen. -	void render_sprites() const; +	//! Renders the whole screen +	void render(); + +	/** +	 * \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 +	 * \return true if particles have been rendered +	 */ +	bool render_particle(const Sprite &, const Transform & tm); + +	void render_normal(const Sprite &, const Transform & tm); +  	/** -	 * \todo Include color handling for sprites. -	 * \todo Implement particle emitter rendering with 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.  	 */ |