diff options
Diffstat (limited to 'examples/shader/Effect.hpp')
-rw-r--r-- | examples/shader/Effect.hpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/examples/shader/Effect.hpp b/examples/shader/Effect.hpp new file mode 100644 index 0000000..ce29c47 --- /dev/null +++ b/examples/shader/Effect.hpp @@ -0,0 +1,88 @@ +#ifndef EFFECT_HPP +#define EFFECT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include <SFML/Graphics.hpp> +#include <cassert> +#include <string> + + +//////////////////////////////////////////////////////////// +// Base class for effects +//////////////////////////////////////////////////////////// +class Effect : public sf::Drawable +{ +public : + + virtual ~Effect() + { + } + + static void setFont(const sf::Font& font) + { + s_font = &font; + } + + const std::string& getName() const + { + return m_name; + } + + void load() + { + m_isLoaded = sf::Shader::isAvailable() && onLoad(); + } + + void update(float time, float x, float y) + { + if (m_isLoaded) + onUpdate(time, x, y); + } + + void draw(sf::RenderTarget& target, sf::RenderStates states) const + { + if (m_isLoaded) + { + onDraw(target, states); + } + else + { + sf::Text error("Shader not\nsupported", getFont()); + error.setPosition(320.f, 200.f); + error.setCharacterSize(36); + target.draw(error, states); + } + } + +protected : + + Effect(const std::string& name) : + m_name(name), + m_isLoaded(false) + { + } + + static const sf::Font& getFont() + { + assert(s_font != NULL); + return *s_font; + } + +private : + + // Virtual functions to be implemented in derived effects + virtual bool onLoad() = 0; + virtual void onUpdate(float time, float x, float y) = 0; + virtual void onDraw(sf::RenderTarget& target, sf::RenderStates states) const = 0; + +private : + + std::string m_name; + bool m_isLoaded; + + static const sf::Font* s_font; +}; + +#endif // EFFECT_HPP |