LightSourceNode.cc

00001 /*===========================================================================*\
00002  *                                                                           *
00003  *                              OpenFlipper                                  *
00004  *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
00005  *                           www.openflipper.org                             *
00006  *                                                                           *
00007  *---------------------------------------------------------------------------*
00008  *  This file is part of OpenFlipper.                                        *
00009  *                                                                           *
00010  *  OpenFlipper is free software: you can redistribute it and/or modify      *
00011  *  it under the terms of the GNU Lesser General Public License as           *
00012  *  published by the Free Software Foundation, either version 3 of           *
00013  *  the License, or (at your option) any later version with the              *
00014  *  following exceptions:                                                    *
00015  *                                                                           *
00016  *  If other files instantiate templates or use macros                       *
00017  *  or inline functions from this file, or you compile this file and         *
00018  *  link it with other files to produce an executable, this file does        *
00019  *  not by itself cause the resulting executable to be covered by the        *
00020  *  GNU Lesser General Public License. This exception does not however       *
00021  *  invalidate any other reasons why the executable file might be            *
00022  *  covered by the GNU Lesser General Public License.                        *
00023  *                                                                           *
00024  *  OpenFlipper is distributed in the hope that it will be useful,           *
00025  *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
00026  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
00027  *  GNU Lesser General Public License for more details.                      *
00028  *                                                                           *
00029  *  You should have received a copy of the GNU LesserGeneral Public          *
00030  *  License along with OpenFlipper. If not,                                  *
00031  *  see <http://www.gnu.org/licenses/>.                                      *
00032  *                                                                           *
00033 \*===========================================================================*/
00034 
00035 /*===========================================================================*\
00036  *                                                                           *
00037  *   $Revision: 6743 $                                                       *
00038  *   $Author: moebius $                                                      *
00039  *   $Date: 2009-08-05 11:03:10 +0200 (Mi, 05. Aug 2009) $                   *
00040  *                                                                           *
00041 \*===========================================================================*/
00042 
00043 
00044 
00045 
00046 //=============================================================================
00047 //
00048 //  CLASS LightSourceNode - IMPLEMENTATION
00049 //
00050 //=============================================================================
00051 
00052 
00053 //== INCLUDES =================================================================
00054 
00055 
00056 #include "LightSourceNode.hh"
00057 
00058 
00059 //== NAMESPACES ===============================================================
00060 
00061 namespace ACG {
00062 namespace SceneGraph {
00063 
00064   
00065 //== IMPLEMENTATION ========================================================== 
00066 
00067 
00068 LightSourceNode::LightSourceNode( BaseNode*            _parent, 
00069                                   const std::string&   _name) 
00070   : BaseNode(_parent, _name)
00071 {
00072   lights_.resize(8);
00073   lightsSave_.resize(8);
00074   enable(GL_LIGHT0);;
00075 }
00076 
00077     
00078 //----------------------------------------------------------------------------
00079 
00080 void LightSourceNode::enter(GLState& _state, unsigned int /* _drawmode */ ) 
00081 {
00082   // save old lights
00083   for(unsigned int i=0; i<lightsSave_.size(); i++)
00084   {
00085     // save only if enabled
00086     if(glIsEnabled(index2gl(i)))
00087     {
00088       lightsSave_[i].enabled = true;
00089 
00091       get_parameters(index2gl(i), lightsSave_[i]);
00092     }
00093     else lightsSave_[i].enabled = false;
00094   }
00095 
00096   // set new lights
00097   for(unsigned int i=0; i<lights_.size(); i++)
00098   {
00099     if(lights_[i].enabled)
00100     {
00101       // correct Position for fixed Lights
00102       if(lights_[i].fixedPosition)
00103         lights_[i].realPosition = 
00104           _state.inverse_modelview()*lights_[i].position;
00105       else lights_[i].realPosition = lights_[i].position;
00106 
00107       glEnable(index2gl(i));
00108       set_parameters(index2gl(i), lights_[i]);
00109     }
00110     else glDisable(index2gl(i));
00111 
00112   }
00113 }
00114 
00115 
00116 //----------------------------------------------------------------------------
00117 
00118 
00119 void LightSourceNode::leave(GLState& /* _state */ , unsigned int /* _drawmode*/ )
00120 {
00121   // restore old enabled lights
00122   for(unsigned int i=0; i<lights_.size(); i++)
00123   {
00124     if(lightsSave_[i].enabled)
00125     {
00126       glEnable(index2gl(i));
00127       set_parameters(index2gl(i), lightsSave_[i]);
00128     }
00129     else glDisable(index2gl(i));
00130   }
00131 }
00132 
00133 //----------------------------------------------------------------------------
00134 
00135 void LightSourceNode::set_parameters(GLenum _index, LightSource& _light)
00136 {
00137 
00138   // set preferences of _light for GL_LIGHT#_index
00139   glLightfv(_index, GL_AMBIENT,  (GLfloat *)_light.ambientColor.data());
00140   glLightfv(_index, GL_DIFFUSE,  (GLfloat *)_light.diffuseColor.data());
00141   glLightfv(_index, GL_SPECULAR,  (GLfloat *)_light.specularColor.data());
00142 
00143   glLightfv(_index, GL_POSITION,  (GLfloat *)_light.realPosition.data());
00144   glLightfv(_index, GL_SPOT_DIRECTION,  (GLfloat *)_light.spotDirection.data());
00145 
00146   glLightf(_index, GL_SPOT_EXPONENT,  _light.spotExponent);
00147   glLightf(_index, GL_SPOT_CUTOFF,  _light.spotCutoff);
00148   glLightf(_index, GL_CONSTANT_ATTENUATION,  _light.constantAttenuation);
00149   glLightf(_index, GL_LINEAR_ATTENUATION,  _light.linearAttenuation);
00150   glLightf(_index, GL_QUADRATIC_ATTENUATION,  _light.quadraticAttenuation);
00151 }
00152 
00153 //----------------------------------------------------------------------------
00154 
00155 void LightSourceNode::get_parameters(GLenum _index, LightSource& _light)
00156 {
00157   // get preferences of GL_LIGHT#_index and store them in _light
00158   glGetLightfv(_index, GL_AMBIENT,  (GLfloat *)_light.ambientColor.data());
00159   glGetLightfv(_index, GL_DIFFUSE,  (GLfloat *)_light.diffuseColor.data());
00160   glGetLightfv(_index, GL_SPECULAR,  (GLfloat *)_light.specularColor.data());
00161   glGetLightfv(_index, GL_POSITION,  (GLfloat *)_light.position.data());
00162   glGetLightfv(_index, GL_SPOT_DIRECTION,  (GLfloat *)_light.spotDirection.data());
00163 
00164   glGetLightfv(_index, GL_SPOT_EXPONENT,  &_light.spotExponent);
00165   glGetLightfv(_index, GL_SPOT_CUTOFF,  &_light.spotCutoff);
00166   glGetLightfv(_index, GL_CONSTANT_ATTENUATION,  &_light.constantAttenuation);
00167   glGetLightfv(_index, GL_LINEAR_ATTENUATION,  &_light.linearAttenuation);
00168   glGetLightfv(_index, GL_QUADRATIC_ATTENUATION,  &_light.quadraticAttenuation);
00169 }
00170 //=============================================================================
00171 } // namespace SceneGraph
00172 } // namespace ACG
00173 //=============================================================================

acg pic Project OpenFlipper, ©  Computer Graphics Group, RWTH Aachen. Documentation generated using doxygen .