Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/pickups/src/orxonox/objects/worldentities/Light.h @ 3003

Last change on this file since 3003 was 2826, checked in by landauf, 16 years ago

merged miniprojects branch back to trunk

  • Property svn:eol-style set to native
File size: 6.1 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 *   Co-authors:
25 *      ...
26 *
27 */
28
29#ifndef _Light_H__
30#define _Light_H__
31
32#include "OrxonoxPrereqs.h"
33#include "StaticEntity.h"
34
35#include <string>
36#include <OgreLight.h>
37
38#include "util/Math.h"
39#include "objects/Teamcolourable.h"
40
41namespace orxonox
42{
43    class _OrxonoxExport Light : public StaticEntity, public Teamcolourable
44    {
45        public:
46            Light(BaseObject* creator);
47            virtual ~Light();
48
49            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
50            void registerVariables();
51
52            virtual void changedVisibility();
53
54            inline Ogre::Light* getLight()
55                { return this->light_; }
56
57            inline void setType(Ogre::Light::LightTypes type)
58                { this->type_ = type; this->updateType(); }
59            inline Ogre::Light::LightTypes getType() const
60                { return this->type_; }
61
62            inline void setDiffuseColour(const ColourValue& colour)
63                { this->diffuse_ = colour; this->updateDiffuseColour(); }
64            inline const ColourValue& getDiffuseColour() const
65                { return this->diffuse_; }
66
67            inline void setSpecularColour(const ColourValue& colour)
68                { this->specular_ = colour; this->updateSpecularColour(); }
69            inline const ColourValue& getSpecularColour() const
70                { return this->specular_; }
71
72            virtual void setTeamColour(const ColourValue& colour)
73                { this->setDiffuseColour(colour); this->setSpecularColour(colour); }
74
75            /**
76                @brief Sets the attenuation parameters of the light source i.e. how it diminishes with distance.
77
78                @param attenuation.x range (The absolute upper range of the light in world units)
79                @param attenuation.y constant (The constant factor in the attenuation formula: 1.0 means never attenuate, 0.0 is complete attenuation)
80                @param attenuation.z linear (The linear factor in the attenuation formula: 1 means attenuate evenly over the distance)
81                @param attenuation.w quadratic (The quadratic factor in the attenuation formula: adds a curvature to the attenuation formula)
82
83                Quote from the Ogre API:
84                Lights normally get fainter the further they are away. Also, each light is given a maximum range beyond which it cannot affect any objects.
85                Light attenuation is not applicable to directional lights since they have an infinite range and constant intensity.
86                This follows a standard attenuation approach - see any good 3D text for the details of what they mean since i don't have room here!
87
88                Quote from the Ogre wiki:
89                "Using these numbers, the light has 100% intensity at 0 distance, and
90                trails off to near black at a distance equal to the Range. Keep in mind
91                that most of the light falls in the first 20% of the range."
92
93                Range   Constant   Linear     Quadratic
94                3250,     1.0,     0.0014,    0.000007
95                600,      1.0,     0.007,     0.0002
96                325,      1.0,     0.014,     0.0007
97                200,      1.0,     0.022,     0.0019
98                160,      1.0,     0.027,     0.0028
99                100,      1.0,     0.045,     0.0075
100                65,       1.0,     0.07,      0.017
101                50,       1.0,     0.09,      0.032
102                32,       1.0,     0.14,      0.07
103                20,       1.0,     0.22,      0.20
104                13,       1.0,     0.35,      0.44
105                7,        1.0,     0.7,       1.8
106            */
107            inline void setAttenuation(const Vector4& attenuation)
108                { this->attenuation_ = attenuation; this->updateAttenuation(); }
109            inline const Vector4& getAttenuation() const
110                { return this->attenuation_; }
111
112            /**
113                @brief Sets the range of a spotlight, i.e. the angle of the inner and outer cones and the rate of falloff between them.
114
115                @param spotlightRange.x innerAngle (The angle covered by the bright inner cone)
116                @param spotlightRange.x outerAngle (The angle covered by the outer cone)
117                @param spotlightRange.x falloff (The rate of falloff between the inner and outer cones. 1.0 means a linear falloff, less means slower falloff, higher means faster falloff.)
118            */
119            inline void setSpotlightRange(const Vector3& spotlightRange)
120                { this->spotlightRange_ = spotlightRange; this->updateSpotlightRange(); }
121            inline const Vector3& getSpotlightRange() const
122                { return this->spotlightRange_; }
123
124        private:
125            void setTypeString(const std::string& type);
126            std::string getTypeString() const;
127
128            void updateType();
129            void updateDiffuseColour();
130            void updateSpecularColour();
131            void updateAttenuation();
132            void updateSpotlightRange();
133
134            Ogre::Light* light_;
135            Ogre::Light::LightTypes type_;
136            ColourValue diffuse_;
137            ColourValue specular_;
138            Vector4 attenuation_;
139            Vector3 spotlightRange_;
140    };
141}
142
143#endif /* _Light_H__ */
Note: See TracBrowser for help on using the repository browser.