Fix lights appearing three times.

The 3 lights showing up are fixed by my patch. It's the old way of
calculating a normal (PLIB-style) that makes them show up.
This commit is contained in:
Christian Schmitt 2014-08-03 13:13:59 +02:00 committed by Thomas Geymayer
parent d9b66fc0ef
commit f448898531

View File

@ -152,33 +152,23 @@ SGLightFactory::getLightDrawable(const SGDirectionalLightBin::Light& light)
{ {
osg::Vec3Array* vertices = new osg::Vec3Array; osg::Vec3Array* vertices = new osg::Vec3Array;
osg::Vec4Array* colors = new osg::Vec4Array; osg::Vec4Array* colors = new osg::Vec4Array;
osg::Vec3Array* normals = new osg::Vec3Array;
SGVec4f visibleColor(light.color); vertices->push_back(toOsg(light.position));
SGVec4f invisibleColor(visibleColor[0], visibleColor[1], colors->push_back(toOsg(light.color));
visibleColor[2], 0); normals->push_back(toOsg(normalize(light.normal)));
SGVec3f normal = normalize(light.normal);
SGVec3f perp1 = perpendicular(normal);
SGVec3f perp2 = cross(normal, perp1);
SGVec3f position = light.position;
vertices->push_back(toOsg(position));
vertices->push_back(toOsg(position + perp1));
vertices->push_back(toOsg(position + perp2));
colors->push_back(toOsg(visibleColor));
colors->push_back(toOsg(invisibleColor));
colors->push_back(toOsg(invisibleColor));
osg::Geometry* geometry = new osg::Geometry; osg::Geometry* geometry = new osg::Geometry;
geometry->setDataVariance(osg::Object::STATIC); geometry->setDataVariance(osg::Object::STATIC);
geometry->setVertexArray(vertices); geometry->setVertexArray(vertices);
geometry->setNormalBinding(osg::Geometry::BIND_OFF); geometry->setNormalArray(normals, osg::Array::BIND_PER_VERTEX);
geometry->setColorArray(colors); geometry->setColorArray(colors, osg::Array::BIND_PER_VERTEX);
geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
// Enlarge the bounding box to avoid such light nodes being victim to // Enlarge the bounding box to avoid such light nodes being victim to
// small feature culling. // small feature culling.
geometry->setComputeBoundingBoxCallback(new SGEnlargeBoundingBox(1)); geometry->setComputeBoundingBoxCallback(new SGEnlargeBoundingBox(1));
osg::DrawArrays* drawArrays; osg::DrawArrays* drawArrays;
drawArrays = new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, drawArrays = new osg::DrawArrays(osg::PrimitiveSet::POINTS,
0, vertices->size()); 0, vertices->size());
geometry->addPrimitiveSet(drawArrays); geometry->addPrimitiveSet(drawArrays);
return geometry; return geometry;
@ -240,32 +230,22 @@ SGLightFactory::getLights(const SGDirectionalLightBin& lights)
osg::Vec3Array* vertices = new osg::Vec3Array; osg::Vec3Array* vertices = new osg::Vec3Array;
osg::Vec4Array* colors = new osg::Vec4Array; osg::Vec4Array* colors = new osg::Vec4Array;
osg::Vec3Array* normals = new osg::Vec3Array;
for (unsigned i = 0; i < lights.getNumLights(); ++i) { for (unsigned i = 0; i < lights.getNumLights(); ++i) {
SGVec4f visibleColor(lights.getLight(i).color); vertices->push_back(toOsg(lights.getLight(i).position));
SGVec4f invisibleColor(visibleColor[0], visibleColor[1], colors->push_back(toOsg(lights.getLight(i).color));
visibleColor[2], 0); normals->push_back(toOsg(normalize(lights.getLight(i).normal)));
SGVec3f normal = normalize(lights.getLight(i).normal);
SGVec3f perp1 = perpendicular(normal);
SGVec3f perp2 = cross(normal, perp1);
SGVec3f position = lights.getLight(i).position;
vertices->push_back(toOsg(position));
vertices->push_back(toOsg(position + perp1));
vertices->push_back(toOsg(position + perp2));
colors->push_back(toOsg(visibleColor));
colors->push_back(toOsg(invisibleColor));
colors->push_back(toOsg(invisibleColor));
} }
osg::Geometry* geometry = new osg::Geometry; osg::Geometry* geometry = new osg::Geometry;
geometry->setDataVariance(osg::Object::STATIC); geometry->setDataVariance(osg::Object::STATIC);
geometry->setVertexArray(vertices); geometry->setVertexArray(vertices);
geometry->setNormalBinding(osg::Geometry::BIND_OFF); geometry->setNormalArray(normals, osg::Array::BIND_PER_VERTEX);
geometry->setColorArray(colors); geometry->setColorArray(colors, osg::Array::BIND_PER_VERTEX);
geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
osg::DrawArrays* drawArrays; osg::DrawArrays* drawArrays;
drawArrays = new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, drawArrays = new osg::DrawArrays(osg::PrimitiveSet::POINTS,
0, vertices->size()); 0, vertices->size());
geometry->addPrimitiveSet(drawArrays); geometry->addPrimitiveSet(drawArrays);
return geometry; return geometry;