Mercurial > fife-parpg
diff engine/core/view/renderers/lightrenderer.h @ 661:e3140f01749d
* Merged the light branch back into trunk.
* Modified the demos so they work with the new loaders and setting.
author | helios2000@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Fri, 05 Nov 2010 15:21:10 +0000 |
parents | |
children | 61a5f86a0db3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/core/view/renderers/lightrenderer.h Fri Nov 05 15:21:10 2010 +0000 @@ -0,0 +1,255 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by the FIFE team * + * http://www.fifengine.de * + * This file is part of FIFE. * + * * + * FIFE is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef FIFE_LIGHTRENDERER_H +#define FIFE_LIGHTRENDERER_H + +// Standard C++ library includes +#include <vector> + +// 3rd party library includes + +// FIFE includes +// These includes are split up in two parts, separated by one empty line +// First block: files included from the FIFE root src directory +// Second block: files included from the same folder +#include "view/rendererbase.h" + +namespace FIFE { + class RenderBackend; + class AbstractFont; + class ImagePool; + class AnimationPool; + + class LightRendererNode { + public: + LightRendererNode(Instance* attached_instance, const Location &relative_location, Layer* relative_layer, const Point &relative_point = Point(0,0)); + LightRendererNode(Instance* attached_instance, const Location &relative_location, const Point &relative_point = Point(0,0)); + LightRendererNode(Instance* attached_instance, Layer* relative_layer, const Point &relative_point = Point(0,0)); + LightRendererNode(Instance* attached_instance, const Point &relative_point = Point(0,0)); + LightRendererNode(const Location &attached_location, Layer* relative_layer, const Point &relative_point = Point(0,0)); + LightRendererNode(const Location &attached_location, const Point &relative_point = Point(0,0)); + LightRendererNode(Layer* attached_layer, const Point &relative_point = Point(0,0)); + LightRendererNode(const Point &attached_point); + ~LightRendererNode(); + + void setAttached(Instance* attached_instance, const Location &relative_location, const Point &relative_point); + void setAttached(Instance* attached_instance, const Location &relative_location); + void setAttached(Instance* attached_instance, const Point &relative_point); + void setAttached(Instance* attached_instance); + void setAttached(const Location &attached_location, const Point &relative_point); + void setAttached(const Location &attached_location); + void setAttached(Layer* attached_layer); + void setAttached(const Point &attached_point); + + void setRelative(const Location &relative_location); + void setRelative(const Location &relative_location, Point relative_point); + void setRelative(const Point &relative_point); + + Instance* getAttachedInstance(); + Location getAttachedLocation(); + Layer* getAttachedLayer(); + Point getAttachedPoint(); + + Location getOffsetLocation(); + Point getOffsetPoint(); + + Instance* getInstance(); + Location getLocation(); + Layer* getLayer(); + Point getPoint(); + + Point getCalculatedPoint(Camera* cam, Layer* layer); + private: + Instance* m_instance; + Location m_location; + Layer* m_layer; + Point m_point; + }; + + class LightRendererElementInfo { + public: + virtual void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool) {}; + virtual std::string getName() { return 0; }; + virtual LightRendererNode* getNode() { return NULL; }; + virtual int getId() { return -1; }; + virtual int getSrcBlend() { return -1; }; + virtual int getDstBlend() { return -1; }; + virtual void setStencil(uint8_t stencil_ref, float alpha_ref) {}; + virtual int getStencil() { return 0; }; + virtual float getAlpha() { return 0; }; + virtual void removeStencil() {}; + virtual std::vector<uint8_t> getColor() {}; + virtual float getRadius() { return 0; }; + virtual int getSubdivisions() { return 0; }; + virtual float getXStretch() { return 0; }; + virtual float getYStretch() { return 0; }; + virtual ~LightRendererElementInfo() {}; + }; + + class LightRendererImageInfo : public LightRendererElementInfo { + public: + void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool); + std::string getName() { return "image"; }; + LightRendererNode* getNode() { return &m_anchor; }; + int getId() { return m_image; }; + int getSrcBlend() { return m_src; }; + int getDstBlend() { return m_dst; }; + void setStencil(uint8_t stencil_ref, float alpha_ref); + int getStencil(); + float getAlpha(); + void removeStencil(); + LightRendererImageInfo(LightRendererNode n, int image, int src, int dst); + virtual ~LightRendererImageInfo() {}; + private: + LightRendererNode m_anchor; + int m_image; + int m_src; + int m_dst; + bool m_stencil; + uint8_t m_stencil_ref; + float m_alpha_ref; + }; + class LightRendererAnimationInfo : public LightRendererElementInfo { + public: + void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool); + std::string getName() { return "animation"; }; + LightRendererNode* getNode() { return &m_anchor; }; + int getId() { return m_animation; }; + int getSrcBlend() { return m_src; }; + int getDstBlend() { return m_dst; }; + void setStencil(uint8_t stencil_ref, float alpha_ref); + int getStencil(); + float getAlpha(); + void removeStencil(); + LightRendererAnimationInfo(LightRendererNode n, int animation, int src, int dst); + virtual ~LightRendererAnimationInfo() {}; + private: + LightRendererNode m_anchor; + int m_animation; + int m_src; + int m_dst; + unsigned int m_start_time; + float m_time_scale; + bool m_stencil; + uint8_t m_stencil_ref; + float m_alpha_ref; + }; + class LightRendererSimpleLightInfo : public LightRendererElementInfo { + public: + void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool); + std::string getName() { return "simple"; }; + LightRendererNode* getNode() { return &m_anchor; }; + int getSrcBlend() { return m_src; }; + int getDstBlend() { return m_dst; }; + void setStencil(uint8_t stencil_ref, float alpha_ref); + int getStencil(); + float getAlpha(); + void removeStencil(); + std::vector<uint8_t> getColor(); + float getRadius() { return m_radius; }; + int getSubdivisions() { return m_subdivisions; }; + float getXStretch() { return m_xstretch; }; + float getYStretch() { return m_ystretch; }; + LightRendererSimpleLightInfo(LightRendererNode n, uint8_t intensity, float radius, int subdivisions, float xstretch, float ystretch, uint8_t r, uint8_t g, uint8_t b, int src, int dst); + virtual ~LightRendererSimpleLightInfo() {}; + private: + LightRendererNode m_anchor; + uint8_t m_intensity; + float m_radius; + int m_subdivisions; + float m_xstretch; + float m_ystretch; + uint8_t m_red; + uint8_t m_green; + uint8_t m_blue; + int m_src; + int m_dst; + bool m_stencil; + uint8_t m_stencil_ref; + float m_alpha_ref; + }; + class LightRendererResizeInfo : public LightRendererElementInfo { + public: + void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool); + std::string getName() { return "resize"; }; + LightRendererNode* getNode() { return &m_anchor; }; + int getId() { return m_image; }; + int getSrcBlend() { return m_src; }; + int getDstBlend() { return m_dst; }; + void setStencil(uint8_t stencil_ref, float alpha_ref); + int getStencil(); + float getAlpha(); + void removeStencil(); + LightRendererResizeInfo(LightRendererNode n, int image, int width, int height, int src, int dst); + virtual ~LightRendererResizeInfo() {}; + private: + LightRendererNode m_anchor; + int m_image; + int m_width; + int m_height; + int m_src; + int m_dst; + bool m_stencil; + uint8_t m_stencil_ref; + float m_alpha_ref; + }; + class LightRenderer: public RendererBase { + public: + /** constructor. + * @param renderbackend to use + * @param position position for this renderer in rendering pipeline + */ + LightRenderer(RenderBackend* renderbackend, int position, ImagePool* imagepool, AnimationPool* animpool); + + LightRenderer(const LightRenderer& old); + + RendererBase* clone(); + + /** Destructor. + */ + virtual ~LightRenderer(); + void render(Camera* cam, Layer* layer, RenderList& instances); + std::string getName() { return "LightRenderer"; } + + /** Gets instance for interface access + */ + static LightRenderer* getInstance(IRendererContainer* cnt); + + void addImage(const std::string &group, LightRendererNode n, int image, int src=-1, int dst=-1); + void addAnimation(const std::string &group, LightRendererNode n, int animation, int src=-1, int dst=-1); + void addSimpleLight(const std::string &group, LightRendererNode n, uint8_t intensity, float radius, int subdivisions, float xstretch, float ystretch, uint8_t r, uint8_t g, uint8_t b, int src=-1, int dst=-1); + void resizeImage(const std::string &group, LightRendererNode n, int image, int width, int height, int src=-1, int dst=-1); + void addStencilTest(const std::string &group, uint8_t stencil_ref=0, float alpha_ref=0.0); + void removeStencilTest(const std::string &group); + std::list<std::string> getGroups(); + std::vector<LightRendererElementInfo*> getLightInfo(const std::string &group); + void removeAll(const std::string &group); + + private: + ImagePool* m_imagepool; + AnimationPool* m_animationpool; + std::map<std::string, std::vector<LightRendererElementInfo*> > m_groups; + }; + +} + +#endif