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.
This commit is contained in:
Robert Osfield
2005-11-18 14:46:38 +00:00
parent 7b117ada29
commit 65244321b4
3 changed files with 60 additions and 37 deletions

View File

@@ -3,6 +3,7 @@
#include "flt.h"
#include "Registry.h"
#include "LightPointRecord.h"
#include <osg/Notify>
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();
}

View File

@@ -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();

View File

@@ -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();