00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 #include "LightSourceNode.hh"
00057
00058
00059
00060
00061 namespace ACG {
00062 namespace SceneGraph {
00063
00064
00065
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 )
00081 {
00082
00083 for(unsigned int i=0; i<lightsSave_.size(); i++)
00084 {
00085
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
00097 for(unsigned int i=0; i<lights_.size(); i++)
00098 {
00099 if(lights_[i].enabled)
00100 {
00101
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& , unsigned int )
00120 {
00121
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
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
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 }
00172 }
00173