comparison 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
comparison
equal deleted inserted replaced
660:b0733d998d0f 661:e3140f01749d
1 /***************************************************************************
2 * Copyright (C) 2005-2008 by the FIFE team *
3 * http://www.fifengine.de *
4 * This file is part of FIFE. *
5 * *
6 * FIFE is free software; you can redistribute it and/or *
7 * modify it under the terms of the GNU Lesser General Public *
8 * License as published by the Free Software Foundation; either *
9 * version 2.1 of the License, or (at your option) any later version. *
10 * *
11 * This library is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
14 * Lesser General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU Lesser General Public *
17 * License along with this library; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
20 ***************************************************************************/
21
22 #ifndef FIFE_LIGHTRENDERER_H
23 #define FIFE_LIGHTRENDERER_H
24
25 // Standard C++ library includes
26 #include <vector>
27
28 // 3rd party library includes
29
30 // FIFE includes
31 // These includes are split up in two parts, separated by one empty line
32 // First block: files included from the FIFE root src directory
33 // Second block: files included from the same folder
34 #include "view/rendererbase.h"
35
36 namespace FIFE {
37 class RenderBackend;
38 class AbstractFont;
39 class ImagePool;
40 class AnimationPool;
41
42 class LightRendererNode {
43 public:
44 LightRendererNode(Instance* attached_instance, const Location &relative_location, Layer* relative_layer, const Point &relative_point = Point(0,0));
45 LightRendererNode(Instance* attached_instance, const Location &relative_location, const Point &relative_point = Point(0,0));
46 LightRendererNode(Instance* attached_instance, Layer* relative_layer, const Point &relative_point = Point(0,0));
47 LightRendererNode(Instance* attached_instance, const Point &relative_point = Point(0,0));
48 LightRendererNode(const Location &attached_location, Layer* relative_layer, const Point &relative_point = Point(0,0));
49 LightRendererNode(const Location &attached_location, const Point &relative_point = Point(0,0));
50 LightRendererNode(Layer* attached_layer, const Point &relative_point = Point(0,0));
51 LightRendererNode(const Point &attached_point);
52 ~LightRendererNode();
53
54 void setAttached(Instance* attached_instance, const Location &relative_location, const Point &relative_point);
55 void setAttached(Instance* attached_instance, const Location &relative_location);
56 void setAttached(Instance* attached_instance, const Point &relative_point);
57 void setAttached(Instance* attached_instance);
58 void setAttached(const Location &attached_location, const Point &relative_point);
59 void setAttached(const Location &attached_location);
60 void setAttached(Layer* attached_layer);
61 void setAttached(const Point &attached_point);
62
63 void setRelative(const Location &relative_location);
64 void setRelative(const Location &relative_location, Point relative_point);
65 void setRelative(const Point &relative_point);
66
67 Instance* getAttachedInstance();
68 Location getAttachedLocation();
69 Layer* getAttachedLayer();
70 Point getAttachedPoint();
71
72 Location getOffsetLocation();
73 Point getOffsetPoint();
74
75 Instance* getInstance();
76 Location getLocation();
77 Layer* getLayer();
78 Point getPoint();
79
80 Point getCalculatedPoint(Camera* cam, Layer* layer);
81 private:
82 Instance* m_instance;
83 Location m_location;
84 Layer* m_layer;
85 Point m_point;
86 };
87
88 class LightRendererElementInfo {
89 public:
90 virtual void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool) {};
91 virtual std::string getName() { return 0; };
92 virtual LightRendererNode* getNode() { return NULL; };
93 virtual int getId() { return -1; };
94 virtual int getSrcBlend() { return -1; };
95 virtual int getDstBlend() { return -1; };
96 virtual void setStencil(uint8_t stencil_ref, float alpha_ref) {};
97 virtual int getStencil() { return 0; };
98 virtual float getAlpha() { return 0; };
99 virtual void removeStencil() {};
100 virtual std::vector<uint8_t> getColor() {};
101 virtual float getRadius() { return 0; };
102 virtual int getSubdivisions() { return 0; };
103 virtual float getXStretch() { return 0; };
104 virtual float getYStretch() { return 0; };
105 virtual ~LightRendererElementInfo() {};
106 };
107
108 class LightRendererImageInfo : public LightRendererElementInfo {
109 public:
110 void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool);
111 std::string getName() { return "image"; };
112 LightRendererNode* getNode() { return &m_anchor; };
113 int getId() { return m_image; };
114 int getSrcBlend() { return m_src; };
115 int getDstBlend() { return m_dst; };
116 void setStencil(uint8_t stencil_ref, float alpha_ref);
117 int getStencil();
118 float getAlpha();
119 void removeStencil();
120 LightRendererImageInfo(LightRendererNode n, int image, int src, int dst);
121 virtual ~LightRendererImageInfo() {};
122 private:
123 LightRendererNode m_anchor;
124 int m_image;
125 int m_src;
126 int m_dst;
127 bool m_stencil;
128 uint8_t m_stencil_ref;
129 float m_alpha_ref;
130 };
131 class LightRendererAnimationInfo : public LightRendererElementInfo {
132 public:
133 void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool);
134 std::string getName() { return "animation"; };
135 LightRendererNode* getNode() { return &m_anchor; };
136 int getId() { return m_animation; };
137 int getSrcBlend() { return m_src; };
138 int getDstBlend() { return m_dst; };
139 void setStencil(uint8_t stencil_ref, float alpha_ref);
140 int getStencil();
141 float getAlpha();
142 void removeStencil();
143 LightRendererAnimationInfo(LightRendererNode n, int animation, int src, int dst);
144 virtual ~LightRendererAnimationInfo() {};
145 private:
146 LightRendererNode m_anchor;
147 int m_animation;
148 int m_src;
149 int m_dst;
150 unsigned int m_start_time;
151 float m_time_scale;
152 bool m_stencil;
153 uint8_t m_stencil_ref;
154 float m_alpha_ref;
155 };
156 class LightRendererSimpleLightInfo : public LightRendererElementInfo {
157 public:
158 void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool);
159 std::string getName() { return "simple"; };
160 LightRendererNode* getNode() { return &m_anchor; };
161 int getSrcBlend() { return m_src; };
162 int getDstBlend() { return m_dst; };
163 void setStencil(uint8_t stencil_ref, float alpha_ref);
164 int getStencil();
165 float getAlpha();
166 void removeStencil();
167 std::vector<uint8_t> getColor();
168 float getRadius() { return m_radius; };
169 int getSubdivisions() { return m_subdivisions; };
170 float getXStretch() { return m_xstretch; };
171 float getYStretch() { return m_ystretch; };
172 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);
173 virtual ~LightRendererSimpleLightInfo() {};
174 private:
175 LightRendererNode m_anchor;
176 uint8_t m_intensity;
177 float m_radius;
178 int m_subdivisions;
179 float m_xstretch;
180 float m_ystretch;
181 uint8_t m_red;
182 uint8_t m_green;
183 uint8_t m_blue;
184 int m_src;
185 int m_dst;
186 bool m_stencil;
187 uint8_t m_stencil_ref;
188 float m_alpha_ref;
189 };
190 class LightRendererResizeInfo : public LightRendererElementInfo {
191 public:
192 void render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool);
193 std::string getName() { return "resize"; };
194 LightRendererNode* getNode() { return &m_anchor; };
195 int getId() { return m_image; };
196 int getSrcBlend() { return m_src; };
197 int getDstBlend() { return m_dst; };
198 void setStencil(uint8_t stencil_ref, float alpha_ref);
199 int getStencil();
200 float getAlpha();
201 void removeStencil();
202 LightRendererResizeInfo(LightRendererNode n, int image, int width, int height, int src, int dst);
203 virtual ~LightRendererResizeInfo() {};
204 private:
205 LightRendererNode m_anchor;
206 int m_image;
207 int m_width;
208 int m_height;
209 int m_src;
210 int m_dst;
211 bool m_stencil;
212 uint8_t m_stencil_ref;
213 float m_alpha_ref;
214 };
215 class LightRenderer: public RendererBase {
216 public:
217 /** constructor.
218 * @param renderbackend to use
219 * @param position position for this renderer in rendering pipeline
220 */
221 LightRenderer(RenderBackend* renderbackend, int position, ImagePool* imagepool, AnimationPool* animpool);
222
223 LightRenderer(const LightRenderer& old);
224
225 RendererBase* clone();
226
227 /** Destructor.
228 */
229 virtual ~LightRenderer();
230 void render(Camera* cam, Layer* layer, RenderList& instances);
231 std::string getName() { return "LightRenderer"; }
232
233 /** Gets instance for interface access
234 */
235 static LightRenderer* getInstance(IRendererContainer* cnt);
236
237 void addImage(const std::string &group, LightRendererNode n, int image, int src=-1, int dst=-1);
238 void addAnimation(const std::string &group, LightRendererNode n, int animation, int src=-1, int dst=-1);
239 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);
240 void resizeImage(const std::string &group, LightRendererNode n, int image, int width, int height, int src=-1, int dst=-1);
241 void addStencilTest(const std::string &group, uint8_t stencil_ref=0, float alpha_ref=0.0);
242 void removeStencilTest(const std::string &group);
243 std::list<std::string> getGroups();
244 std::vector<LightRendererElementInfo*> getLightInfo(const std::string &group);
245 void removeAll(const std::string &group);
246
247 private:
248 ImagePool* m_imagepool;
249 AnimationPool* m_animationpool;
250 std::map<std::string, std::vector<LightRendererElementInfo*> > m_groups;
251 };
252
253 }
254
255 #endif