diff --git a/include/osg/Light b/include/osg/Light index 631303bf7..d7f2e733b 100644 --- a/include/osg/Light +++ b/include/osg/Light @@ -30,7 +30,6 @@ class SG_EXPORT Light : public StateAttribute // compare each paramter in turn against the rhs. COMPARE_StateAttribute_Parameter(_lightnum) - COMPARE_StateAttribute_Parameter(_on) COMPARE_StateAttribute_Parameter(_ambient) COMPARE_StateAttribute_Parameter(_diffuse) COMPARE_StateAttribute_Parameter(_specular) @@ -45,20 +44,16 @@ class SG_EXPORT Light : public StateAttribute return 0; // passed all the above comparison macro's, must be equal. } - /** - * Turn the light on. - * Calling this method doesn't directly affect OpenGL's lighting mode. - */ - inline void on() { _on = true; } + virtual void setStateSetModes(StateSet& ds,const GLModeValue value) const + { + ds.setMode(GL_LIGHT0+_lightnum,value); + } - /** - * Turn the light off. - * Calling this method doesn't directly affect OpenGL's lighting mode. - */ - inline void off() { _on = false; } - - /** Apply the light's state to the OpenGL state machine. */ - virtual void apply(State& state) const; + /** Set which OpenGL light to operate on.*/ + void setLightNum(const int num) { _lightnum = num; } + + /** Get which OpenGL light this osg::Light operates on.*/ + const int getLightNum() const { return _lightnum; } /** Set the ambient component of the light. */ inline void setAmbient( const Vec4& ambient ) { _ambient = ambient; } @@ -126,6 +121,9 @@ class SG_EXPORT Light : public StateAttribute */ void captureLightState(); + /** Apply the light's state to the OpenGL state machine. */ + virtual void apply(State& state) const; + protected : virtual ~Light(); @@ -134,7 +132,7 @@ class SG_EXPORT Light : public StateAttribute void init(); int _lightnum; // OpenGL light number - bool _on; // on/off state + Vec4 _ambient; // r, g, b, w Vec4 _diffuse; // r, g, b, w Vec4 _specular; // r, g, b, w @@ -145,8 +143,6 @@ class SG_EXPORT Light : public StateAttribute float _quadratic_attenuation; // quadratic float _spot_exponent; // exponent float _spot_cutoff; // spread - - static int _currentLightNum; // current max. OpenGL light number }; }; diff --git a/src/osg/Light.cpp b/src/osg/Light.cpp index b8293e318..18f63f077 100644 --- a/src/osg/Light.cpp +++ b/src/osg/Light.cpp @@ -3,13 +3,8 @@ using namespace osg; -int Light::_currentLightNum = -1; - Light::Light( void ) { - _lightnum = ++_currentLightNum; - _on = 1; - init(); // notify(DEBUG) << "_ambient "<<_ambient<setLightNum(_lightnum++); lt->setSpecular(colour*bright/2.0f); lt->setDiffuse(colour*bright/4.0f); lt->setAmbient(cdef); - lt->on(); if (atyp==NONE) ; else if (atyp==INVERSE_DIST) { lt->setLinearAttenuation(1.0f); @@ -174,6 +176,7 @@ private: float bright,halfIn,halfOut,falloff; // light brightness Image *ctx; Texture *tx; + int _lightnum; StateSet *dstate; // used to represent the dw material in OSG }; // structure to use as data for tesselation diff --git a/src/osgPlugins/osg/Light.cpp b/src/osgPlugins/osg/Light.cpp index 4d10c4fb5..d6af02c9f 100644 --- a/src/osgPlugins/osg/Light.cpp +++ b/src/osgPlugins/osg/Light.cpp @@ -32,6 +32,16 @@ bool Light_readLocalData(Object& obj, Input& fr) Light& light = static_cast(obj); + if (fr[0].matchWord("light_num")) + { + int lightnum=0; + if (fr[1].getInt(lightnum)) + { + light.setLightNum(lightnum); + fr += 2; + iteratorAdvanced = true; + } + } #define ReadVec4(A,B) { \ if (fr[0].matchWord(B) && \ @@ -96,6 +106,8 @@ bool Light_writeLocalData(const Object& obj,Output& fw) { const Light& light = static_cast(obj); + fw.indent() << "light_num " << light.getLightNum() << std::endl; + // Vec4's fw.indent() << "ambient " << light.getAmbient() << std::endl; fw.indent() << "diffuse " << light.getDiffuse() << std::endl; diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index 67fcc8b67..bc28e03a8 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -48,6 +48,7 @@ void SceneView::setDefaults() _lightingMode=HEADLIGHT; _light = new osg::Light; + _light->setLightNum(0); _light->setAmbient(Vec4(0.00f,0.0f,0.00f,1.0f)); _light->setDiffuse(Vec4(0.8f,0.8f,0.8f,1.0f)); _light->setSpecular(Vec4(1.0f,1.0f,1.0f,1.0f)); @@ -75,6 +76,7 @@ void SceneView::setDefaults() // enable lighting by default. _globalState->setMode(GL_LIGHTING, osg::StateAttribute::ON); + _light->setStateSetModes(*_globalState,osg::StateAttribute::ON); // enable depth testing by default. _globalState->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);