- // Bottom
- (*vertices)[18] = axis*f;
- for (int i=0; i<16; ++i) {
- (*vertices)[19+i] = axis*f + p1*r2*cos( i * 2 * M_PI / 16 ) + p2*r2*sin( i * 2 * M_PI / 16 );
- }
- (*vertices)[35] = (*vertices)[19];
-
- osg::Vec4Array* colours = new osg::Vec4Array(1);
- (*colours)[0].set( getConfig()->getFloatValue("color/red"),
- getConfig()->getFloatValue("color/green"),
- getConfig()->getFloatValue("color/blue"),
- 1.0f);
- cone->setColorArray(colours);
- cone->setColorBinding(osg::Geometry::BIND_OVERALL);
-
- osg::Vec3Array* normals = new osg::Vec3Array(1);
- (*normals)[0] = axis;
- cone->setNormalArray(normals);
- cone->setNormalBinding(osg::Geometry::BIND_OVERALL);
-
- cone->setVertexArray(vertices);
- cone->addPrimitiveSet( new osg::DrawArrays( GL_TRIANGLE_FAN, 0, 18 ) );
- cone->addPrimitiveSet( new osg::DrawArrays( GL_TRIANGLE_FAN, 18, 18 ) );
-
- simgear::EffectGeode* geode = new simgear::EffectGeode;
- geode->addDrawable( cone );
-
- node.asGroup()->addChild( geode );
- simgear::Effect *effect = simgear::makeEffect("Effects/light-spot", true);
- if (effect) {
- effect->parametersProp->setFloatValue("inner-angle",getConfig()->getFloatValue("angle-inner-deg"));
- effect->parametersProp->setFloatValue("outer-angle",getConfig()->getFloatValue("angle-outer-deg"));
- geode->setEffect(effect);
+ std::string light_type = getConfig()->getStringValue("light-type");
+ if (light_type == "spot") {
+
+ SGVec3d p1( _direction.z(), _direction.x(), _direction.y() ),
+ p2 = cross( _direction, p1 );
+ p1 = cross( p2, _direction );
+
+ float r2 = _far * tan( _cutoff * SG_DEGREES_TO_RADIANS );
+
+ osg::Geometry* cone = new osg::Geometry;
+cone->setUseDisplayList(false);
+ osg::Vec3Array* vertices = new osg::Vec3Array(34);
+ (*vertices)[0] = osg::Vec3(0.0,0.0,0.0);
+ for (int i=0; i<16; ++i) {
+ (*vertices)[16-i] = toOsg(_direction)*_far + toOsg(p1)*r2*cos( i * 2 * M_PI / 16 ) + toOsg(p2)*r2*sin( i * 2 * M_PI / 16 );
+ }
+ (*vertices)[17] = (*vertices)[1];
+
+ // Bottom
+ for (int i=0; i<16; ++i) {
+ (*vertices)[18+i] = toOsg(_direction)*_far + toOsg(p1)*r2*cos( i * 2 * M_PI / 16 ) + toOsg(p2)*r2*sin( i * 2 * M_PI / 16 );
+ }
+
+ osg::Vec4Array* colours = new osg::Vec4Array(1);
+ (*colours)[0] = osg::Vec4d(toOsg(getConfig()->getValue<SGVec3d>("diffuse")), 1.0f);
+ cone->setColorArray(colours);
+ cone->setColorBinding(osg::Geometry::BIND_OVERALL);
+
+ osg::Vec3Array* normals = new osg::Vec3Array(1);
+ (*normals)[0] = toOsg(_direction);
+ cone->setNormalArray(normals);
+ cone->setNormalBinding(osg::Geometry::BIND_OVERALL);
+
+ cone->setVertexArray(vertices);
+ cone->addPrimitiveSet( new osg::DrawArrays( GL_TRIANGLE_FAN, 0, 18 ) );
+ cone->addPrimitiveSet( new osg::DrawArrays( GL_TRIANGLE_FAN, 18, 16 ) );
+
+ simgear::EffectGeode* geode = new simgear::EffectGeode;
+ geode->addDrawable( cone );
+
+ node.asGroup()->addChild( geode );
+
+ // TODO: build a cache - problem: what is the key ?
+ SGPropertyNode_ptr effectProp = new SGPropertyNode;
+ makeChild(effectProp, "inherits-from")->setStringValue("Effects/light-spot");
+ SGPropertyNode* params = makeChild(effectProp, "parameters");
+ params->getNode("light-spot/position",true)->setValue(SGVec4d(_position.x(),_position.y(),_position.z(),1.0));
+ params->getNode("light-spot/direction",true)->setValue(SGVec4d(_direction.x(),_direction.y(),_direction.z(),0.0));
+ params->getNode("light-spot/ambient",true)->setValue(_ambient);
+ params->getNode("light-spot/diffuse",true)->setValue(_diffuse);
+ params->getNode("light-spot/specular",true)->setValue(_specular);
+ params->getNode("light-spot/attenuation",true)->setValue(_attenuation);
+ params->getNode("light-spot/exponent",true)->setValue(_exponent);
+ params->getNode("light-spot/cutoff",true)->setValue(_cutoff);
+ params->getNode("light-spot/cosCutoff",true)->setValue( cos(_cutoff*SG_DEGREES_TO_RADIANS) );
+ params->getNode("light-spot/near",true)->setValue(_near);
+ params->getNode("light-spot/far",true)->setValue(_far);
+
+ simgear::Effect* effect = simgear::makeEffect(effectProp, true);
+ geode->setEffect(effect);