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:
parent
d9b66fc0ef
commit
f448898531
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user