00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "stdopengl.h"
00027
00028 #include "3d/light.h"
00029
00030 namespace NL3D
00031 {
00032
00033
00034
00035 uint CDriverGL::getMaxLight () const
00036 {
00037
00038 return _MaxDriverLight;
00039 }
00040
00041
00042
00043 void CDriverGL::setLight (uint8 num, const CLight& light)
00044 {
00045
00046
00047
00048
00049 if (num<_MaxDriverLight)
00050 {
00051
00052 GLenum lightNum=(GLenum)(GL_LIGHT0+num);
00053
00054
00055 CLight::TLightMode mode=light.getMode ();
00056
00057
00058 _LightMode[num]=mode;
00059
00060
00061 GLfloat colorGL[4];
00062 CRGBA colorNeL=light.getAmbiant ();
00063 colorGL[0]=(float)colorNeL.R/255.f;
00064 colorGL[1]=(float)colorNeL.G/255.f;
00065 colorGL[2]=(float)colorNeL.B/255.f;
00066 colorGL[3]=1.f;
00067 glLightfv (lightNum, GL_AMBIENT, colorGL);
00068
00069
00070 colorNeL=light.getDiffuse ();
00071 colorGL[0]=(float)colorNeL.R/255.f;
00072 colorGL[1]=(float)colorNeL.G/255.f;
00073 colorGL[2]=(float)colorNeL.B/255.f;
00074 colorGL[3]=1.f;
00075 glLightfv (lightNum, GL_DIFFUSE, colorGL);
00076
00077
00078 colorNeL=light.getSpecular ();
00079 colorGL[0]=(float)colorNeL.R/255.f;
00080 colorGL[1]=(float)colorNeL.G/255.f;
00081 colorGL[2]=(float)colorNeL.B/255.f;
00082 colorGL[3]=1.f;
00083 glLightfv (lightNum, GL_SPECULAR, colorGL);
00084
00085
00086 glLightf (lightNum, GL_CONSTANT_ATTENUATION, light.getConstantAttenuation());
00087 glLightf (lightNum, GL_LINEAR_ATTENUATION, light.getLinearAttenuation());
00088 glLightf (lightNum, GL_QUADRATIC_ATTENUATION, light.getQuadraticAttenuation());
00089
00090
00091 if ((mode==CLight::DirectionalLight)||(mode==CLight::SpotLight))
00092 {
00093
00094 _WorldLightDirection[num]=light.getDirection ();
00095 }
00096
00097 if (mode!=CLight::DirectionalLight)
00098 {
00099
00100 _WorldLightPos[num]=light.getPosition ();
00101 }
00102
00103 if (mode==CLight::SpotLight)
00104 {
00105
00106 float exponent=light.getExponent ();
00107
00108
00109 glLightf (lightNum, GL_SPOT_EXPONENT, exponent);
00110
00111
00112 float cutoff=180.f*(light.getCutoff ()/(float)NLMISC::Pi);
00113
00114
00115 glLightf (lightNum, GL_SPOT_CUTOFF, cutoff);
00116 }
00117 else
00118 {
00119
00120 glLighti (lightNum, GL_SPOT_CUTOFF, 180);
00121 glLighti (lightNum, GL_SPOT_EXPONENT, 0);
00122 }
00123
00124 _ViewMatrixSetupDirty=true;
00125 }
00126 }
00127
00128
00129
00130 void CDriverGL::enableLight (uint8 num, bool enable)
00131 {
00132
00133
00134
00135
00136 if (num<_MaxDriverLight)
00137 {
00138
00139 _LightEnable[num]=enable;
00140
00141
00142 if (enable)
00143 glEnable ((GLenum)(GL_LIGHT0+num));
00144 else
00145 glDisable ((GLenum)(GL_LIGHT0+num));
00146 }
00147 }
00148
00149
00150
00151 void CDriverGL::setAmbientColor (CRGBA color)
00152 {
00153
00154 GLfloat array[4];
00155 array[0]=(float)color.R/255.f;
00156 array[1]=(float)color.G/255.f;
00157 array[2]=(float)color.B/255.f;
00158 array[3]=1.f;
00159
00160
00161 glLightModelfv (GL_LIGHT_MODEL_AMBIENT, array);
00162 }
00163
00164
00165
00166 }