Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/graphics/light.h @ 8255

Last change on this file since 8255 was 8255, checked in by bensch, 18 years ago

merged the atmos back with command: https://svn.orxonox.net/orxonox/branches/atmospheric_engine

File size: 4.2 KB
RevLine 
[4734]1/*!
[8255]2* @file light.h
3*  Handles Lights.
[3329]4
[8255]5A Light is one of the more important things in a 3D-environment,
6without it one sees nothing :)
7It is here for diffuse-, specular- and Bump-Mappings.
[3245]8*/
[1853]9
[3436]10#ifndef _LIGHT_H
11#define _LIGHT_H
[1853]12
[4338]13#include "p_node.h"
[3436]14#include "glincl.h"
[1853]15
[3598]16//! The maximum number of Lights this OpenGL-implementation supports.
[3437]17#define NUMBEROFLIGHTS GL_MAX_LIGHTS
18
[4469]19
[5405]20// FORWARD DECLARATIONS //
[3436]21class Vector;
[4734]22class TiXmlElement;
[2036]23
[3598]24//! A class that handles Lights. The LightManager operates on this.
[4338]25class Light : public PNode
[3597]26{
[8255]27        public:
28                Light(const TiXmlElement* root = NULL);
29                virtual ~Light();
30               
31                virtual void loadParams(const TiXmlElement* root);
32               
33                void setDiffuseColor(GLfloat r, GLfloat g, GLfloat b);
34                void setSpecularColor(GLfloat r, GLfloat g, GLfloat b);
35                void setAttenuation(float constantAttenuation, float linearAttenuation, float quadraticAttenuation);
36                void setSpotDirection(const Vector& direction);
37                void setSpotDirection(float x, float y, float z) { setSpotDirection(Vector(x,y,z)); };
38                void setSpotCutoff(GLfloat cutoff);
39               
40                /** @returns the lightNumber*/
41                int getLightNumber() const {return this->lightNumber;}
42               
43                virtual void draw() const;
44               
45                void debug() const;
46       
47        // attributes
48        private:
49                int              lightNumber;               //!< The number of this Light.
50                GLfloat          diffuseColor[4];           //!< The Diffuse Color this Light emmits.
51                GLfloat          specularColor[4];          //!< The specular Color of this Light.
52                float            constantAttenuation;       //!< The Factor of the the Constant Attenuation.
53                float            linearAttenuation;         //!< The Factor of the the Linear Attenuation.
54                float            quadraticAttenuation;      //!< The Factor of the the Quadratic Attenuation.
55                GLfloat          spotDirection[4];          //!< The direction of the Spot Light.
56                GLfloat          spotCutoff;                //!< The cutoff Angle of the Light Source
[3597]57};
[8255]58       
59       
60       
[3436]61//! A class that handles Lights
[3329]62/**
[8255]63A Light is a source that emits light rays (photons)
[3600]64
[8255]65<b>Usage:</b>\n
66First you have to get the Light Manager up and running by using LightManager::getInstance().
67This automatically initiates the GL_LIGHTING, and sets some default stuff about the light.\n
68Then you will create a new light using:
69\li new Light();
[3600]70
[8255]71if you want to operate on this Light just apply the following functions onto it.
72(You can also optain the Light-pointer with LightManager::getInstance()->getLight(lightNumber))
[4738]73
[8255]74now you can operate on the light as follows:
75\li void setDiffuseColor(GLfloat r, GLfloat g, GLfloat b);
76\li void setSpecularColor(GLfloat r, GLfloat g, GLfloat b);
77\li void setAttenuation(float constantAttenuation, float linearAttenuation, float quadraticAttenuation);
78\li void setSpotDirection(Vector direction);
79\li void setSpotCutoff(GLfloat cutoff);
80\li all PNode stuff also works
[3600]81
[8255]82To redraw the light use
83\li void draw() const; (this is automatically done by the LightManager)
[4734]84
[8255]85for some nice output just use:
86\li void debug() const; (either on LightManager for a resume or on any Light for single information.)
[3329]87*/
[3597]88class LightManager : public BaseObject
[8255]89        {
90        friend class Light;
[3440]91
[8255]92        public:
93                virtual ~LightManager();
94                /** @returns a Pointer to the only object of this Class */
95                inline static LightManager* getInstance() { if (!singletonRef) singletonRef = new LightManager();  return singletonRef; };
[1853]96
[8255]97                virtual void loadParams(const TiXmlElement* root);
98                void loadLights(const TiXmlElement* root);
[4734]99
[8255]100                void setAmbientColor(GLfloat r, GLfloat g, GLfloat b);
101                // HACK: Assuming r = g = b values
102                inline GLfloat getAmbientColor() {  return this->ambientColor[0]; }
[3597]103
[8255]104                Light* getLight(int lightNumber) const;
105                inline Light* getLight() const { return this->currentLight; };
[3598]106
[8255]107                void draw() const;
[3453]108
[8255]109                void debug() const;
[4469]110
[8255]111        private:
112                LightManager();
[4469]113
[8255]114                int  registerLight(Light* light);
115                void unregisterLight(Light* light);
[4734]116
[8255]117        private:
118                static LightManager*    singletonRef;       //!< This is the LightHandlers Reference.
119                GLfloat                 ambientColor[4];    //!< The ambient Color of the scene.
[4469]120
[8255]121                Light**                 lights;             //!< An array of Lenght NUMBEROFLIGHTS, that holds pointers to all LightValues.
122                Light*                  currentLight;       //!< The current Light, we are working with.
[4734]123
[1853]124};
125
[3436]126#endif /* _LIGHT_H */
Note: See TracBrowser for help on using the repository browser.