diff options
| -rw-r--r-- | src/crepe/system/RenderSystem.cpp | 65 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.h | 22 | ||||
| -rw-r--r-- | src/example/rendering.cpp | 1 | 
3 files changed, 60 insertions, 28 deletions
| diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 8bbf441..17a2337 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -7,10 +7,10 @@  #include "../api/Transform.h"  #include "../facade/SDLContext.h"  #include "../util/log.h" -#include "Particle.h" -#include "api/ParticleEmitter.h" -#include "api/Vector2.h" +#include "../api/ParticleEmitter.h" +#include "../api/Vector2.h" +#include "Particle.h"  #include "RenderSystem.h"  using namespace crepe; @@ -43,38 +43,61 @@ void RenderSystem::update_camera() {  	}  } +bool RenderSystem::render_particle(const Sprite & sprite, +								   const Transform & tm) { -void RenderSystem::render_particle(const ParticleEmitter& em, Transform & tm){ -	if (!em.active) return; -	 +	ComponentManager & mgr = ComponentManager::get_instance();  	SDLContext & render = SDLContext::get_instance(); -	for (const Particle& p  : em.data.particles) { -		if (!p.active) continue; -		tm.position = p.position; -		tm.rotation = p.angle; -		render.draw(em.data.sprite, tm , *curr_cam); + +	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_sprites() { +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); +} -	auto emitter = mgr.get_components_by_type<ParticleEmitter>(); +void RenderSystem::render() { -	SDLContext & render = SDLContext::get_instance(); -	Transform test(1, Vector2{0,0},0,0); +	ComponentManager & mgr = ComponentManager::get_instance(); + +	auto sprites = mgr.get_components_by_type<Sprite>(); +	for (const Sprite & sprite : sprites) { +		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; -	for (const ParticleEmitter & em : emitter) { -		auto transforms -			= mgr.get_components_by_id<Transform>(em.game_object_id); -		test.scale = transforms[0].get().scale; -		this->render_particle(em, test); +		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 8dd8b7e..468f79b 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -1,10 +1,10 @@  #pragma once  #include "api/Camera.h" +#include "api/Sprite.h" +#include "api/Transform.h"  #include "System.h" -#include "api/ParticleEmitter.h" -#include "api/Transform.h"  namespace crepe { @@ -45,14 +45,22 @@ private:  	//! Updates the active camera used for rendering.  	void update_camera(); -	//! Renders all active sprites to the screen. -	void render_sprites() ; -	 -	void render_particle(const ParticleEmitter& em, Transform & tm); +	//! 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. diff --git a/src/example/rendering.cpp b/src/example/rendering.cpp index e02f6a3..a7cb5d6 100644 --- a/src/example/rendering.cpp +++ b/src/example/rendering.cpp @@ -35,6 +35,7 @@ int main() {  	{  		Color color(0, 0, 0, 0);  		obj1.add_component<Sprite>(make_shared<Texture>("../asset/texture/second.png"), color, FlipSettings{true, true}); +		obj1.add_component<Sprite>(make_shared<Texture>("../asset/texture/second.png"), color, FlipSettings{true, true});  	}  	/* |