From f448898531fe97fc9c653c1a921ff750106fcf9f Mon Sep 17 00:00:00 2001 From: Christian Schmitt Date: Sun, 3 Aug 2014 13:13:59 +0200 Subject: [PATCH] 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. --- simgear/scene/tgdb/pt_lights.cxx | 48 ++++++++++---------------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/simgear/scene/tgdb/pt_lights.cxx b/simgear/scene/tgdb/pt_lights.cxx index d6374b6f..3bf9d5bc 100644 --- a/simgear/scene/tgdb/pt_lights.cxx +++ b/simgear/scene/tgdb/pt_lights.cxx @@ -152,33 +152,23 @@ SGLightFactory::getLightDrawable(const SGDirectionalLightBin::Light& light) { osg::Vec3Array* vertices = new osg::Vec3Array; osg::Vec4Array* colors = new osg::Vec4Array; + osg::Vec3Array* normals = new osg::Vec3Array; - SGVec4f visibleColor(light.color); - SGVec4f invisibleColor(visibleColor[0], visibleColor[1], - visibleColor[2], 0); - 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)); + vertices->push_back(toOsg(light.position)); + colors->push_back(toOsg(light.color)); + normals->push_back(toOsg(normalize(light.normal))); osg::Geometry* geometry = new osg::Geometry; geometry->setDataVariance(osg::Object::STATIC); geometry->setVertexArray(vertices); - geometry->setNormalBinding(osg::Geometry::BIND_OFF); - geometry->setColorArray(colors); - geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); + geometry->setNormalArray(normals, osg::Array::BIND_PER_VERTEX); + geometry->setColorArray(colors, osg::Array::BIND_PER_VERTEX); // Enlarge the bounding box to avoid such light nodes being victim to // small feature culling. geometry->setComputeBoundingBoxCallback(new SGEnlargeBoundingBox(1)); osg::DrawArrays* drawArrays; - drawArrays = new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, + drawArrays = new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, vertices->size()); geometry->addPrimitiveSet(drawArrays); return geometry; @@ -240,32 +230,22 @@ SGLightFactory::getLights(const SGDirectionalLightBin& lights) osg::Vec3Array* vertices = new osg::Vec3Array; osg::Vec4Array* colors = new osg::Vec4Array; + osg::Vec3Array* normals = new osg::Vec3Array; for (unsigned i = 0; i < lights.getNumLights(); ++i) { - SGVec4f visibleColor(lights.getLight(i).color); - SGVec4f invisibleColor(visibleColor[0], visibleColor[1], - visibleColor[2], 0); - 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)); + vertices->push_back(toOsg(lights.getLight(i).position)); + colors->push_back(toOsg(lights.getLight(i).color)); + normals->push_back(toOsg(normalize(lights.getLight(i).normal))); } osg::Geometry* geometry = new osg::Geometry; geometry->setDataVariance(osg::Object::STATIC); geometry->setVertexArray(vertices); - geometry->setNormalBinding(osg::Geometry::BIND_OFF); - geometry->setColorArray(colors); - geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); + geometry->setNormalArray(normals, osg::Array::BIND_PER_VERTEX); + geometry->setColorArray(colors, osg::Array::BIND_PER_VERTEX); osg::DrawArrays* drawArrays; - drawArrays = new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, + drawArrays = new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, vertices->size()); geometry->addPrimitiveSet(drawArrays); return geometry; -- 2.39.5