FilterContext BuildGeometryFilter::push( FeatureList& input, const FilterContext& context ) { reset(); OE_DEBUG << LC << context.toString() << std::endl; bool ok = true; for( FeatureList::iterator i = input.begin(); i != input.end(); i++ ) if ( !push( i->get(), context ) ) ok = false; // In a feature class with one point-per-feature, you end up with one geometry per point, // which results is (a) very bad performance and (b) geometries with a zero bbox that therefore // don't draw. This is not a total solution (won't work for a single point, isn't friendly for // doing feature-selection, etc.) but is a workable temporary fix. In the future we're going // to replace this filter anyway with something more highly optimized (a la osgGIS). // // however...seems that MERGE_GEOMETRY destroys almost everything except for points!! if ( _mergeGeometry == true ) { osgUtil::Optimizer optimizer; optimizer.optimize( _geode.get(), osgUtil::Optimizer::MERGE_GEOMETRY ); } if ( ok ) { if ( !_style.empty() && _geode.valid() ) { // could optimize this to only happen is lines or points were created .. const LineSymbol* lineSymbol = _style.getSymbol<LineSymbol>(); float size = 1.0; if (lineSymbol) size = lineSymbol->stroke()->width().value(); _geode->getOrCreateStateSet()->setAttribute( new osg::Point(size), osg::StateAttribute::ON ); _geode->getOrCreateStateSet()->setAttribute( new osg::LineWidth(size), osg::StateAttribute::ON ); const PointSymbol* pointSymbol = _style.getSymbol<PointSymbol>(); if ( pointSymbol && pointSymbol->size().isSet() ) _geode->getOrCreateStateSet()->setAttribute( new osg::Point( *pointSymbol->size() ), osg::StateAttribute::ON ); } _result = _geode.release(); if ( context.hasReferenceFrame() ) { osg::MatrixTransform* delocalizer = new osg::MatrixTransform( context.inverseReferenceFrame() ); delocalizer->addChild( _result.get() ); _result = delocalizer; } } else { _result = 0L; } FilterContext outCx( context ); outCx.setReferenceFrame( osg::Matrixd::identity() ); // clear the ref frame. return outCx; }