From 4b607d6484973dab0316bdf8f2c9ede5cf1486d4 Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Wed, 18 Apr 2012 19:56:31 +0200 Subject: [PATCH] Revert "Remove ambient component of additional lights" because this was Yet Another Bad Idea Ambient light is attenuated so it is possible to achieve smooth edges with it This reverts commit fe8ba57c9412c18681429c4cea6f37a6ef5ec14d. --- simgear/scene/model/SGLightAnimation.cxx | 13 +++++++++++-- simgear/scene/model/animation.hxx | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/simgear/scene/model/SGLightAnimation.cxx b/simgear/scene/model/SGLightAnimation.cxx index 33de79fb..6215efd9 100644 --- a/simgear/scene/model/SGLightAnimation.cxx +++ b/simgear/scene/model/SGLightAnimation.cxx @@ -45,8 +45,9 @@ static EffectMap lightEffectMap; class SGLightAnimation::UpdateCallback : public osg::NodeCallback { public: - UpdateCallback(string k, const SGExpressiond* v, SGVec4d d, SGVec4d s) : + UpdateCallback(string k, const SGExpressiond* v, SGVec4d a, SGVec4d d, SGVec4d s) : _key(k), + _ambient(a), _diffuse(d), _specular(s), _animationValue(v) @@ -63,12 +64,16 @@ public: if (iter != lightEffectMap.end()) { simgear::Effect* effect = iter->second; SGPropertyNode* params = effect->parametersProp; + params->getNode("ambient")->setValue(_ambient * dim); params->getNode("diffuse")->setValue(_diffuse * dim); params->getNode("specular")->setValue(_specular * dim); BOOST_FOREACH(osg::ref_ptr& technique, effect->techniques) { BOOST_FOREACH(osg::ref_ptr& pass, technique->passes) { + osg::Uniform* amb = pass->getUniform("Ambient"); + if (amb) + amb->set(toOsg(_ambient) * dim); osg::Uniform* dif = pass->getUniform("Diffuse"); if (dif) dif->set(toOsg(_diffuse) * dim); @@ -83,6 +88,7 @@ public: } public: string _key; + SGVec4d _ambient; SGVec4d _diffuse; SGVec4d _specular; SGSharedPtr _animationValue; @@ -102,6 +108,7 @@ SGLightAnimation::SGLightAnimation(const SGPropertyNode* configNode, _direction = SGVec3d( getConfig()->getDoubleValue("direction/x"), getConfig()->getDoubleValue("direction/y"), getConfig()->getDoubleValue("direction/z") ); double l = length(_direction); if (l > 0.001) _direction /= l; + _ambient = GET_COLOR_VALUE("ambient"); _diffuse = GET_COLOR_VALUE("diffuse"); _specular = GET_COLOR_VALUE("specular"); _attenuation = SGVec3d( getConfig()->getDoubleValue("attenuation/c"), getConfig()->getDoubleValue("attenuation/l"), getConfig()->getDoubleValue("attenuation/q") ); @@ -123,7 +130,7 @@ SGLightAnimation::createAnimationGroup(osg::Group& parent) osg::Group* grp = new osg::Group; grp->setName("light animation node"); if (_animationValue.valid()) - grp->setUpdateCallback(new UpdateCallback(_key, _animationValue, _diffuse, _specular)); + grp->setUpdateCallback(new UpdateCallback(_key, _animationValue, _ambient, _diffuse, _specular)); parent.addChild(grp); grp->setNodeMask( simgear::MODELLIGHT_BIT ); return grp; @@ -149,6 +156,7 @@ SGLightAnimation::install(osg::Node& node) SGPropertyNode* params = makeChild(effectProp, "parameters"); params->getNode("position",true)->setValue(SGVec4d(_position.x(),_position.y(),_position.z(),1.0)); params->getNode("direction",true)->setValue(SGVec4d(_direction.x(),_direction.y(),_direction.z(),0.0)); + params->getNode("ambient",true)->setValue(_ambient * dim); params->getNode("diffuse",true)->setValue(_diffuse * dim); params->getNode("specular",true)->setValue(_specular * dim); params->getNode("attenuation",true)->setValue(_attenuation); @@ -191,6 +199,7 @@ SGLightAnimation::install(osg::Node& node) SGPropertyNode* params = makeChild(effectProp, "parameters"); params->getNode("position",true)->setValue(SGVec4d(_position.x(),_position.y(),_position.z(),1.0)); + params->getNode("ambient",true)->setValue(_ambient * dim); params->getNode("diffuse",true)->setValue(_diffuse * dim); params->getNode("specular",true)->setValue(_specular * dim); params->getNode("attenuation",true)->setValue(_attenuation); diff --git a/simgear/scene/model/animation.hxx b/simgear/scene/model/animation.hxx index 4a6b35d0..57641d30 100644 --- a/simgear/scene/model/animation.hxx +++ b/simgear/scene/model/animation.hxx @@ -360,6 +360,7 @@ private: string _light_type; SGVec3d _position; SGVec3d _direction; + SGVec4d _ambient; SGVec4d _diffuse; SGVec4d _specular; SGVec3d _attenuation; -- 2.39.5