Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/shaders/src/orxonox/graphics/LensFlare.h @ 9678

Last change on this file since 9678 was 9500, checked in by davidsa, 12 years ago

Added nested Class Lens to LensFlare, to simplify lens flare configuration and some of the methods. Might also be used to define presets in the future.

File size: 8.0 KB
Line 
1 /*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *      Reto Grieder (physics)
25 *   Co-authors:
26 *      ...
27 *
28 */
29
30/**
31  @file LensFlare.h
32  @brief Definition of the LensFlare class.
33*/
34
35#ifndef _LensFlare_H__
36#define _LensFlare_H__
37
38#include "OrxonoxPrereqs.h"
39
40#include "OgreBillboardSet.h"
41
42#include "core/GraphicsManager.h"
43#include "util/Math.h"
44#include "worldentities/StaticEntity.h"
45#include "graphics/Billboard.h"
46
47namespace orxonox
48{   
49      /**
50    @brief
51        This class adds a configurable LensFlare effect by adding multiple billboards for the several components of lens flare.
52        It uses orxonox::Billboard to render this effect, the used images can be changed in lensflare.material
53
54    @author
55        David 'davidsa' Salvisberg
56    */
57    //TODO: The Hardware Occlusion only works properly for a single Flare on the screen,
58    // if we have multiple strong lights it'll become way more complicated to determine how much of every object is occluded individually
59    // there's below a 100 render queue groups, so maybe we should take turns for each object to be tested, so we only have one of the objects rendered at a time
60    // obviously we shouldn't use too many of these effects anyways, since they use a lot of processing power, so not sure whether it's worth implementing a solution that works for multiple lens flares on screen
61    class _OrxonoxExport LensFlare : public StaticEntity, public Tickable
62    {
63          /**
64          @brief
65              This is a nested Class used to easily set properties of the different sublenses of a LensFlare effect
66          */
67          class Lens
68          {
69              public:
70                  std::string* material_;//!< Which material should the Lens use, current choices include burst, bursthalo, halo1, halo2, halo3
71                  float alpha_;//!< Which base alpha value should the Lens use
72                  float scale_;//!< Which base scale should the Lens Flare have
73                  float position_;//!< This defines how far along the view direction the flare should be positioned, e.g. 0.5 would position the flare halfway between the viewer and the base burst, 0 at the camera, 1 at the burst
74                  Lens(std::string* material, float alpha, float scale, float position)
75                  {
76                      this->material_=material;
77                      this->alpha_=alpha;
78                      this->scale_=scale;
79                      this->position_=position;
80                  }
81          };
82         
83        public:
84            LensFlare(BaseObject* creator);
85            virtual ~LensFlare();
86           
87            inline void setScale(float scale)
88                { this->scale_=scale; }
89            inline float getScale() const
90                { return this->scale_; }
91               
92            /**
93            @brief
94                This sets the base colour of the billboards
95            @param colour
96                Vector3 containing r,g,b values
97            */
98            inline void setColour(const ColourValue& colour)
99            {
100                this->colour_->r=colour.r;
101                this->colour_->g=colour.g;
102                this->colour_->b=colour.b;
103            }
104            /**
105            @brief
106                This returns the current base colour of the billboards
107            @return a Vector3 containing r,g,b values
108            */
109            inline const ColourValue& getColour() const
110                { return *(new ColourValue(this->colour_->r,this->colour_->g,this->colour_->b)); }
111               
112            /**
113            @brief
114                This sets the resolution of the out-of-screen-fade-effect
115               
116                the higher the resolution, the smoother the transition, but it will also have a greater impact on the performance
117                this happens with O(n^2) since it's a two dimensional operation.
118            @param fadeResolution
119                how many point samples should be used per axis
120               
121                note: this will always be an odd number, so the center point is included in the samples
122            */
123            inline void setFadeResolution(unsigned int fadeResolution)
124                { this->fadeResolution_=fadeResolution>0?fadeResolution:1; }
125            /**
126            @brief
127                This returns the resolution of the out-of-screen-fade-effect
128            @return how many point samples are being used per axis
129            */
130            inline unsigned int getFadeResolution() const
131                { return this->fadeResolution_; }
132               
133            /**
134            @brief
135                This sets the exponent of the fade-out function
136            @param exponent
137                how strong should the fade-out effect be
138            */
139            inline void setFadeExponent(float exponent)
140                { this->fadeExponent_=exponent; }
141            /**
142            @brief
143                This returns the exponent of the fade-out function
144            @return the exponent of the fade-out function
145            */
146            inline float getFadeExponent() const
147                { return this->fadeExponent_; }
148               
149            /**
150            @brief
151               Turn the out-of-screen-fade-effect on or off
152            @param fadeOnViewBorder
153                true to turn the effect on, false to turn it off
154            */
155            inline void setFadeOnViewBorder(bool fadeOnViewBorder)
156                { this->fadeOnViewBorder_=fadeOnViewBorder; }
157            /**
158            @brief
159               Determine whether the out-of-screen-fade-effect is on or off
160            @return
161                true if the effect is on, false if it is off
162            */
163            inline bool isFadeOnViewBorder() const
164                { return this->fadeOnViewBorder_; }
165
166            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
167
168            virtual void tick(float dt);
169
170            virtual void changedVisibility();
171
172        private:
173            void registerVariables();
174           
175            void createBillboards();
176           
177            void updateBillboardStates(Vector3& viewDirection, float dimension, bool isLightVisible);
178           
179            void updateBillboardAlphas(float alpha);
180           
181            unsigned int getPointCount(float dimension) const;
182           
183            std::vector<Lens*>* lensConfiguration_;//!< this stores the lensConfiguration
184            Billboard* occlusionBillboard_;//!< this is a transparent billboard used solely for the Hardware Occlusion Query
185            float cameraDistance_;//!< current distance of the lensflare center from the camera
186            float scale_;//!< this factor is used to scale the billboard to the desired size
187            bool fadeOnViewBorder_;//!< should the effect fade out on the border of the view?
188            unsigned int fadeResolution_;//!< how many points should be sampled per axis for the screen border fade. High number => smooth fade, but uses more processing power
189            float fadeExponent_;//!< this determines how fast the flare fades away as it gets obstructed
190            ColourValue* colour_;//!< this stores the base colour of the light
191    };
192}
193
194#endif /* _LensFlare_H__ */
Note: See TracBrowser for help on using the repository browser.