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:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user