diff --git a/src/osgPlugins/flt/GeoSetBuilder.h b/src/osgPlugins/flt/GeoSetBuilder.h index 072daca0a..8b30a3d53 100644 --- a/src/osgPlugins/flt/GeoSetBuilder.h +++ b/src/osgPlugins/flt/GeoSetBuilder.h @@ -125,6 +125,16 @@ class DynGeoSet : public osg::Referenced inline void addColor(const osg::Vec4& color) { _colorList.push_back(color); } inline void addTCoord(const osg::Vec2& tcoord) { _tcoordList.push_back(tcoord); } + typedef std::vector CoordList; + typedef std::vector NormalList; + typedef std::vector ColorList; + typedef std::vector TcoordList; + + const CoordList& getCoordList() { return _coordList; } + const NormalList& getNormalList() { return _normalList; } + const ColorList& getColorList() { return _colorList; } + const TcoordList& getTcoordList() { return _tcoordList; } + void append(DynGeoSet* source); void setBinding(); @@ -146,10 +156,6 @@ class DynGeoSet : public osg::Referenced private: typedef std::vector PrimLenList; - typedef std::vector CoordList; - typedef std::vector NormalList; - typedef std::vector ColorList; - typedef std::vector TcoordList; osg::ref_ptr _geom; diff --git a/src/osgPlugins/flt/flt2osg.cpp b/src/osgPlugins/flt/flt2osg.cpp index fbb1b7d6a..47dc61ebe 100644 --- a/src/osgPlugins/flt/flt2osg.cpp +++ b/src/osgPlugins/flt/flt2osg.cpp @@ -32,6 +32,8 @@ #include #include +#include + #include #include @@ -282,7 +284,11 @@ osg::Group* ConvertFromFLT::visitPrimaryNode(osg::Group& osgParent, PrimNodeReco } break; case LIGHT_POINT_OP: +#ifdef USE_DEPRECATED_LIGHTPOINT visitLightPoint(&geoSetBuilder, (LightPointRecord*)child); +#else + visitLightPoint(osgParent, (LightPointRecord*)child); +#endif break; case GROUP_OP: osgPrim = visitGroup(osgParent, (GroupRecord*)child); @@ -1987,6 +1993,69 @@ void ConvertFromFLT::visitLightPoint(GeoSetBuilder* pBuilder, LightPointRecord* } +void ConvertFromFLT::visitLightPoint(osg::Group& osgParent, LightPointRecord* rec) +{ + SLightPoint *pSLightPoint = (SLightPoint*)rec->getData(); + + GeoSetBuilder pBuilder; + DynGeoSet* dgset = pBuilder.getDynGeoSet(); + dgset->setPrimType(osg::PrimitiveSet::POINTS); + dgset->setColorBinding(osg::Geometry::BIND_PER_VERTEX); + dgset->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); + + osgSim::LightPointNode *lpNode = new osgSim::LightPointNode(); + lpNode->setMinPixelSize( pSLightPoint->sfMinPixelSize); + lpNode->setMaxPixelSize( pSLightPoint->sfMaxPixelSize); + + addVertices(&pBuilder, rec); + + const DynGeoSet::CoordList& coords = dgset->getCoordList(); + const DynGeoSet::ColorList& colors = dgset->getColorList(); + const DynGeoSet::NormalList& norms = dgset->getNormalList(); + + float lobeVert = osg::DegreesToRadians( pSLightPoint->sfLobeVert ); + float lobeHorz = osg::DegreesToRadians( pSLightPoint->sfLobeHoriz ); + float pointRadius = pSLightPoint->afActualPixelSize; + + for ( unsigned int nl = 0; nl < coords.size(); nl++) + { + osg::Vec4 color( 1.0f, 1.0f, 1.0f, 1.0f); + if( nl < colors.size()) color = colors[nl]; + + osgSim::LightPoint lp( true, coords[ nl], color, 1.0f, pointRadius); + + if( pSLightPoint->diDirection ) + { + // calc elevation angles + osg::Vec3 normal( 1.0f, 0.0f, 0.0f); + if( nl < norms.size()) normal = norms[nl]; + + float elevAngle = osg::PI_2 - acos( normal.z() ); + if( normal.z() < 0.0f) elevAngle = -elevAngle; + float minElevation = elevAngle - lobeVert/2.0f; + float maxElevation = elevAngle + lobeVert/2.0f; + + // calc azimuth angles + osg::Vec2 pNormal( normal.x(), normal.y() ); + float lng = pNormal.normalize(); + float azimAngle = acos( pNormal.y() ); + if( pNormal.y() > 0.0f ) azimAngle = - azimAngle; + + float minAzimuth = azimAngle - lobeHorz/2.0f; + float maxAzimuth = azimAngle + lobeHorz/2.0f; + + float fadeRange = 0.0f; + lp._sector = new osgSim::AzimElevationSector( minAzimuth, maxAzimuth, minElevation, maxElevation, fadeRange); + } + + lpNode->addLightPoint( lp); + } + + osgParent.addChild( lpNode); +} + + + void ConvertFromFLT::visitMesh ( osg::Group &parent, GeoSetBuilder *pBuilder, MeshRecord *rec ) { DynGeoSet* dgset = pBuilder->getDynGeoSet(); diff --git a/src/osgPlugins/flt/flt2osg.h b/src/osgPlugins/flt/flt2osg.h index 0a458266b..1854f3b5e 100644 --- a/src/osgPlugins/flt/flt2osg.h +++ b/src/osgPlugins/flt/flt2osg.h @@ -158,6 +158,7 @@ class ConvertFromFLT void visitMesh(osg::Group& osgParent,GeoSetBuilder* pParent, MeshRecord* rec); void visitMeshPrimitive(osg::Group& osgParent, MeshPrimitiveRecord* rec); void visitLightPoint(GeoSetBuilder* pBuilder, LightPointRecord* rec); + void visitLightPoint(osg::Group& osgParent, LightPointRecord* rec); int visitVertexList(GeoSetBuilder* pParent, VertexListRecord* rec); int visitLocalVertexPool(GeoSetBuilder* pBuilder, LocalVertexPoolRecord* rec);