Hello!
Recently i tried to implement cockpit night lightning system in FG and
came around a curious problem i can't solve: definition of
new/additional light sources is ignored by FG. I went the classical
OpenGL path and tried to incorporate additional "standard" light sources
(OGL supports from 8 to 10 of them depending on the hardware). The code
works so far, BUT only if the light source number is zero. Ergo none of
the lights from 1 to 9 configured with the same code would work. Other
light sources appear to be disabled somewhere in FG/SG, since OSG
demonstrates in the example projects multiple light sources operated.
Altering light 0 also affects the entire scene graph, but that's
expected behavior as noted in OSG docs. Not even rough cut through with
glEnable(...) helps.
Implementation details:
Markup extension:
<cockpit_light>
<source>0</source>
<name>cockpit_light</name>
<colors>
<ambient>
<R>0.0</R><G>0.7</G><B>0.0</B><A>1.0</A>
</ambient>
<diffuse>
<R>0.0</R><G>0.0</G><B>0.0</B><A>0.0</A>
</diffuse>
</colors>
<direction>
<X>0.3</X><Y>0.3</Y><Z>0.3</Z>
</direction>
<offsets>
<x-m>-0.309142</x-m>
<y-m>0.286432</y-m>
<z-m>0.275279</z-m>
<pitch-deg>0</pitch-deg>
<heading-deg>180</heading-deg>
<roll-deg>0</roll-deg>
</offsets>
<spot>
<cutoff>0.002</cutoff>
<exponent>0.002</exponent>
</spot>
<attenuation>
<constant>5.0</constant>
<linear>5.0</linear>
<quadratic>10.0</quadratic>
</attenuation>
</cockpit_light>
Method invocation in:
static osg::Node *
sgLoad3DModel_internal(const SGPath& path,
const osgDB::ReaderWriter::Options* options_,
SGPropertyNode *overlay)
...
// process cockpit lights
std::vector<SGPropertyNode_ptr> light_nodes;
light_nodes = props->getChildren("cockpit_light");
for(unsigned i = 0; i < light_nodes.size(); i++) {
group->addChild(Particles::appendLights(group, light_nodes[i],
prop_root, options.get()));
}
...
Method implemented:
osg::Group * Particles::appendLights(const osg::ref_ptr<osg::Group> parent,
const SGPropertyNode* configNode,
SGPropertyNode* modelRoot,
const
osgDB::ReaderWriter::Options* options)
{
int lightNum = configNode->getIntValue("source", 0);
// create and configure light source
osg::LightSource *interiorLightSource = new osg::LightSource();
interiorLightSource->setLocalStateSetModes(osg::StateAttribute::ON);
interiorLightSource->getLight()->setDataVariance(Object::DYNAMIC);
interiorLightSource->setLocalStateSetModes(osg::StateAttribute::ON);
// acquire the light itself and do setup
osg::Light *interiorLight = interiorLightSource->getLight();
interiorLight->setLightNum(lightNum);
interiorLight->setPosition(osg::Vec4(configNode->getFloatValue("offsets/x-m",
0.0),
configNode->getFloatValue("offsets/y-m", 0.0),
configNode->getFloatValue("offsets/z-m", 0.0), 1.0f));
interiorLight->setAmbient(osg::Vec4(configNode->getFloatValue("colors/ambient/R",
0.0),
configNode->getFloatValue("colors/ambient/G", 0.0),
configNode->getFloatValue("colors/ambient/B", 0.0),
configNode->getFloatValue("colors/ambient/A", 0.0)));
interiorLight->setDiffuse(osg::Vec4(configNode->getFloatValue("colors/diffuse/R",
0.0),
configNode->getFloatValue("colors/diffuse/G", 0.0),
configNode->getFloatValue("colors/diffuse/B", 0.0),
configNode->getFloatValue("colors/diffuse/A", 0.0)));
interiorLight->setDirection(osg::Vec3(configNode->getFloatValue("direction/X",
0.0),
configNode->getFloatValue("direction/Y", 0.0),
configNode->getFloatValue("direction/Z", 0.0)));
// exponent & cutoff
interiorLight->setSpotCutoff(configNode->getFloatValue("spot/cutoff",
0.0));
interiorLight->setSpotExponent(configNode->getFloatValue("spot/exponent",
0.0));
// light attenuation
interiorLight->setConstantAttenuation(configNode->getFloatValue("spot/attenuation",
0.0));
interiorLight->setLinearAttenuation(configNode->getFloatValue("spot/linear",
0.0));
interiorLight->setQuadraticAttenuation(configNode->getFloatValue("spot/quadratic",
0.0));
// state propagations
osg::StateSet *parentState = parent->getOrCreateStateSet();
parentState->setMode(GL_LIGHTING, osg::StateAttribute::ON);
parentState->setMode(GL_LIGHT0 + lightNum, osg::StateAttribute::ON);
interiorLightSource->setStateSetModes(*parentState,
osg::StateAttribute::ON);
return interiorLightSource;
}
P.S. Best result sofar:
http://www.flickr.com/photos/43342833@N04/6344963545/in/photostream
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure
contains a definitive record of customers, application performance,
security threats, fraudulent activity, and more. Splunk takes this
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Flightgear-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/flightgear-devel