diff options
Diffstat (limited to 'src/crepe')
| -rw-r--r-- | src/crepe/api/Color.h | 4 | ||||
| -rw-r--r-- | src/crepe/api/Sprite.h | 3 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.h | 6 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.cpp | 43 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.h | 26 | 
5 files changed, 54 insertions, 28 deletions
| diff --git a/src/crepe/api/Color.h b/src/crepe/api/Color.h index aa47bf4..c207ba7 100644 --- a/src/crepe/api/Color.h +++ b/src/crepe/api/Color.h @@ -21,13 +21,13 @@ public:  	static const Color & get_yellow();  	static const Color & get_black(); -private: -	// TODO: why are these private!? +public:  	uint8_t r;  	uint8_t g;  	uint8_t b;  	uint8_t a; +private:  	static Color white;  	static Color red;  	static Color green; diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index 0192793..74a55d4 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -2,8 +2,9 @@  #include <memory> +#include "../Component.h" +  #include "Color.h" -#include "Component.h"  #include "Texture.h"  namespace crepe { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 007092b..652a83e 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -21,9 +21,6 @@ namespace crepe {  // typedef is unusable when crepe is packaged. Wouter will fix this later.  typedef SDL_Keycode CREPE_KEYCODES; -class Texture; -class LoopManager; -  /**   * \class SDLContext   * \brief Facade for the SDL library @@ -91,9 +88,6 @@ private:  	//! Will use the funtions: texture_from_path, get_width,get_height.  	friend class Texture; -	//! Will use the funtions: texture_from_path, get_width,get_height. -	friend class Animator; -  	/**  	 * \brief Loads a texture from a file path.  	 * \param path Path to the image file. diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index fa3d0de..96c5f27 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -1,38 +1,59 @@ +#include <algorithm> +#include <cassert>  #include <functional> +#include <stdexcept>  #include <vector>  #include "../ComponentManager.h"  #include "../api/Sprite.h"  #include "../api/Transform.h"  #include "../facade/SDLContext.h" -#include "../util/Log.h"  #include "RenderSystem.h"  using namespace crepe; +using namespace std; -void RenderSystem::clear_screen() const { SDLContext::get_instance().clear_screen(); } +void RenderSystem::clear_screen() { this->context.clear_screen(); } -void RenderSystem::present_screen() const { SDLContext::get_instance().present_screen(); } +void RenderSystem::present_screen() { this->context.present_screen(); }  void RenderSystem::update_camera() {  	ComponentManager & mgr = this->component_manager;  	std::vector<std::reference_wrapper<Camera>> cameras = mgr.get_components_by_type<Camera>(); +	if (cameras.size() == 0) throw std::runtime_error("No cameras in current scene"); +  	for (Camera & cam : cameras) { -		SDLContext::get_instance().camera(cam); -		this->curr_cam = &cam; +		this->context.camera(cam); +		this->curr_cam_ref = &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 sorting_comparison(const Sprite & a, const Sprite & b) { +	if (a.sorting_in_layer < b.sorting_in_layer) return true; +	if (a.sorting_in_layer == b.sorting_in_layer) return a.order_in_layer < b.order_in_layer; + +	return false; +} + +std::vector<std::reference_wrapper<Sprite>> +RenderSystem::sort(std::vector<std::reference_wrapper<Sprite>> & objs) { + +	std::vector<std::reference_wrapper<Sprite>> sorted_objs(objs); +	std::sort(sorted_objs.begin(), sorted_objs.end(), sorting_comparison); + +	return sorted_objs; +} + +void RenderSystem::render_sprites() { +	ComponentManager & mgr = this->component_manager; +	vector<reference_wrapper<Sprite>> sprites = mgr.get_components_by_type<Sprite>(); +	vector<reference_wrapper<Sprite>> sorted_sprites = this->sort(sprites); -	SDLContext & render = SDLContext::get_instance(); -	for (const Sprite & sprite : sprites) { +	for (const Sprite & sprite : sorted_sprites) {  		auto transforms = mgr.get_components_by_id<Transform>(sprite.game_object_id); -		render.draw(sprite, transforms[0], *curr_cam); +		this->context.draw(sprite, transforms[0], *this->curr_cam_ref);  	}  } diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 87ec494..8914b96 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -1,18 +1,23 @@  #pragma once -#include "api/Camera.h" +#include <functional> +#include <vector> + +#include "facade/SDLContext.h"  #include "System.h"  namespace crepe { +class Camera; +class Sprite; +  /**   * \class RenderSystem   * \brief Manages rendering operations for all game objects.   * - * RenderSystem is responsible for rendering sprites, clearing and presenting the screen, and - * managing the active camera. It functions as a singleton, providing centralized rendering - * services for the application. + * RenderSystem is responsible for rendering, clearing and presenting the screen, and + * managing the active camera.    */  class RenderSystem : public System {  public: @@ -25,16 +30,19 @@ public:  private:  	//! Clears the screen in preparation for rendering. -	void clear_screen() const; +	void clear_screen();  	//! Presents the rendered frame to the display. -	void present_screen() const; +	void present_screen();  	//! Updates the active camera used for rendering.  	void update_camera();  	//! Renders all active sprites to the screen. -	void render_sprites() const; +	void render_sprites(); + +	std::vector<std::reference_wrapper<Sprite>> +	sort(std::vector<std::reference_wrapper<Sprite>> & objs);  	/**  	 * \todo Include color handling for sprites. @@ -48,8 +56,10 @@ private:  private:  	//! Pointer to the current active camera for rendering -	Camera * curr_cam = nullptr; +	Camera * curr_cam_ref = nullptr;  	// TODO: needs a better solution + +	SDLContext & context = SDLContext::get_instance();  };  } // namespace crepe |