From 65244321b4635ed6eae433dc489ffd4d814fe3e4 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 18 Nov 2005 14:46:38 +0000 Subject: [PATCH] The OpenFlight plugin was crashing with pre 15.6 .flt files that contained light points. This was due to the mismatch is size and fiels in the LightPointRecord before 15.6 and after it, the OSG's flt plugin was assuming just 15.6 record structure. As a temporary solution I have disabled the processing of light point records on .flt file version before 15.6, this allows these files to be loaded safely, but without light points. --- src/osgPlugins/flt/LightPointRecord.cpp | 88 +++++++++++++++---------- src/osgPlugins/flt/LightPointRecord.h | 4 +- src/osgPlugins/flt/flt2osg.cpp | 5 +- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/src/osgPlugins/flt/LightPointRecord.cpp b/src/osgPlugins/flt/LightPointRecord.cpp index 0fdc5a894..c50b890a1 100644 --- a/src/osgPlugins/flt/LightPointRecord.cpp +++ b/src/osgPlugins/flt/LightPointRecord.cpp @@ -3,6 +3,7 @@ #include "flt.h" #include "Registry.h" #include "LightPointRecord.h" +#include using namespace flt; @@ -24,45 +25,64 @@ LightPointRecord::~LightPointRecord() { } +SLightPoint* LightPointRecord::getData() const +{ + if (LightPointRecord::getFlightVersion()>1551) + { + return (SLightPoint*)_pData; + } + else + { + // disable ligth point for older versions since they don't have + // the same format as SLightPoint, this needs fixing but this will have + // to wait till after OSG 1.0. + // Robert Osfield, 18th November 2005. + return 0; + } +} + void LightPointRecord::endian() { SLightPoint *pSLightPoint = (SLightPoint*)getData(); + if (pSLightPoint) + { + ENDIAN( pSLightPoint->iMaterial ); + ENDIAN( pSLightPoint->iFeature ); + ENDIAN( pSLightPoint->diMode ); + ENDIAN( pSLightPoint->sfIntensityFront ); + ENDIAN( pSLightPoint->sfIntensityBack ); + ENDIAN( pSLightPoint->sfMinDefocus ); + ENDIAN( pSLightPoint->sfMaxDefocus ); + ENDIAN( pSLightPoint->diFadeMode ); + ENDIAN( pSLightPoint->diFogPunchMode ); + ENDIAN( pSLightPoint->diDirectionalMode ); + ENDIAN( pSLightPoint->diRangeMode ); + ENDIAN( pSLightPoint->sfMinPixelSize ); + ENDIAN( pSLightPoint->sfMaxPixelSize ); + ENDIAN( pSLightPoint->afActualPixelSize ); + ENDIAN( pSLightPoint->sfTranspFalloff ); + ENDIAN( pSLightPoint->sfTranspFalloffExponent ); + ENDIAN( pSLightPoint->sfTranspFalloffScalar ); + ENDIAN( pSLightPoint->sfTranspFalloffClamp ); + ENDIAN( pSLightPoint->sfFog ); + ENDIAN( pSLightPoint->sfReserved ); + ENDIAN( pSLightPoint->sfSize ); + ENDIAN( pSLightPoint->diDirection ); + ENDIAN( pSLightPoint->sfLobeHoriz ); + ENDIAN( pSLightPoint->sfLobeVert ); + ENDIAN( pSLightPoint->sfLobeRoll ); + ENDIAN( pSLightPoint->sfFalloff ); + ENDIAN( pSLightPoint->sfAmbientIntensity ); + ENDIAN( pSLightPoint->sfAnimPeriod ); + ENDIAN( pSLightPoint->sfAnimPhaseDelay ); + ENDIAN( pSLightPoint->sfAnimPeriodEnable ); + ENDIAN( pSLightPoint->sfSignificance ); + ENDIAN( pSLightPoint->sfDrawOrder ); + ENDIAN( pSLightPoint->sfFlags ); + pSLightPoint->animRot.endian(); + } - ENDIAN( pSLightPoint->iMaterial ); - ENDIAN( pSLightPoint->iFeature ); - ENDIAN( pSLightPoint->diMode ); - ENDIAN( pSLightPoint->sfIntensityFront ); - ENDIAN( pSLightPoint->sfIntensityBack ); - ENDIAN( pSLightPoint->sfMinDefocus ); - ENDIAN( pSLightPoint->sfMaxDefocus ); - ENDIAN( pSLightPoint->diFadeMode ); - ENDIAN( pSLightPoint->diFogPunchMode ); - ENDIAN( pSLightPoint->diDirectionalMode ); - ENDIAN( pSLightPoint->diRangeMode ); - ENDIAN( pSLightPoint->sfMinPixelSize ); - ENDIAN( pSLightPoint->sfMaxPixelSize ); - ENDIAN( pSLightPoint->afActualPixelSize ); - ENDIAN( pSLightPoint->sfTranspFalloff ); - ENDIAN( pSLightPoint->sfTranspFalloffExponent ); - ENDIAN( pSLightPoint->sfTranspFalloffScalar ); - ENDIAN( pSLightPoint->sfTranspFalloffClamp ); - ENDIAN( pSLightPoint->sfFog ); - ENDIAN( pSLightPoint->sfReserved ); - ENDIAN( pSLightPoint->sfSize ); - ENDIAN( pSLightPoint->diDirection ); - ENDIAN( pSLightPoint->sfLobeHoriz ); - ENDIAN( pSLightPoint->sfLobeVert ); - ENDIAN( pSLightPoint->sfLobeRoll ); - ENDIAN( pSLightPoint->sfFalloff ); - ENDIAN( pSLightPoint->sfAmbientIntensity ); - ENDIAN( pSLightPoint->sfAnimPeriod ); - ENDIAN( pSLightPoint->sfAnimPhaseDelay ); - ENDIAN( pSLightPoint->sfAnimPeriodEnable ); - ENDIAN( pSLightPoint->sfSignificance ); - ENDIAN( pSLightPoint->sfDrawOrder ); - ENDIAN( pSLightPoint->sfFlags ); - pSLightPoint->animRot.endian(); } diff --git a/src/osgPlugins/flt/LightPointRecord.h b/src/osgPlugins/flt/LightPointRecord.h index c0db0bf42..4f5b42890 100644 --- a/src/osgPlugins/flt/LightPointRecord.h +++ b/src/osgPlugins/flt/LightPointRecord.h @@ -117,8 +117,8 @@ class LightPointRecord : public PrimNodeRecord virtual void accept(RecordVisitor& rv) { rv.apply(*this); } // virtual void traverse(RecordVisitor& rv); - virtual SLightPoint* getData() const { return (SLightPoint*)_pData; } - + virtual SLightPoint* getData() const; + protected: virtual ~LightPointRecord(); diff --git a/src/osgPlugins/flt/flt2osg.cpp b/src/osgPlugins/flt/flt2osg.cpp index 563e164fa..867d077b2 100644 --- a/src/osgPlugins/flt/flt2osg.cpp +++ b/src/osgPlugins/flt/flt2osg.cpp @@ -2716,9 +2716,11 @@ osg::Group* ConvertFromFLT::visitExternal(osg::Group& osgParent, ExternalRecord* void ConvertFromFLT::visitLightPoint(GeoSetBuilder* pBuilder,osg::Group& osgParent, LightPointRecord* rec) { + SLightPoint *pSLightPoint = (SLightPoint*)rec->getData(); + if (!pSLightPoint) return; + DynGeoSet* dgset = pBuilder->getDynGeoSet(); osg::StateSet* stateSet = dgset->getStateSet(); - SLightPoint *pSLightPoint = (SLightPoint*)rec->getData(); dgset->setPrimType(osg::PrimitiveSet::POINTS); stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF); @@ -2759,6 +2761,7 @@ void ConvertFromFLT::visitLightPoint(GeoSetBuilder* pBuilder,osg::Group& osgPare void ConvertFromFLT::visitLightPoint(osg::Group& osgParent, LightPointRecord* rec) { SLightPoint *pSLightPoint = (SLightPoint*)rec->getData(); + if (!pSLightPoint) return; GeoSetBuilder pBuilder; DynGeoSet* dgset = pBuilder.getDynGeoSet();