Report errors on TileDetails callback failures

This callback can do out of memory and other failures, so catch
those and report them.
This commit is contained in:
James Turner 2021-07-27 14:22:50 +01:00
parent 2478bee97f
commit 1d59135652

View File

@ -36,6 +36,7 @@
#include <simgear/scene/util/SGReaderWriterOptions.hxx> #include <simgear/scene/util/SGReaderWriterOptions.hxx>
#include <simgear/scene/util/OptionsReadFileCallback.hxx> #include <simgear/scene/util/OptionsReadFileCallback.hxx>
#include <simgear/scene/util/SGNodeMasks.hxx> #include <simgear/scene/util/SGNodeMasks.hxx>
#include <simgear/debug/ErrorReportingCallback.hxx>
#include "SGNodeTriangles.hxx" #include "SGNodeTriangles.hxx"
#include "GroundLightManager.hxx" #include "GroundLightManager.hxx"
@ -53,6 +54,8 @@ typedef std::list<SGDirectionalLightBin> SGDirectionalLightListBin;
using namespace simgear; using namespace simgear;
using ReadResult = osgDB::ReaderWriter::ReadResult;
// QuadTreeBuilder is used by Random Objects Generator // QuadTreeBuilder is used by Random Objects Generator
typedef std::pair<osg::Node*, int> ModelLOD; typedef std::pair<osg::Node*, int> ModelLOD;
struct MakeQuadLeaf { struct MakeQuadLeaf {
@ -92,13 +95,16 @@ public:
SG_LOG( SG_TERRAIN, SG_DEBUG, "SGTileDetailsCallback::~SGTileDetailsCallback() num cbs left " << num_tdcb ); SG_LOG( SG_TERRAIN, SG_DEBUG, "SGTileDetailsCallback::~SGTileDetailsCallback() num cbs left " << num_tdcb );
} }
virtual osgDB::ReaderWriter::ReadResult readNode( ReadResult readNode(const std::string&, const osgDB::Options*) override
const std::string&, const osgDB::Options*)
{ {
osg::ref_ptr<osg::Group> group;
simgear::ErrorReportContext ec{"btg", _path};
try {
group = new osg::Group;
SGMaterialLibPtr matlib; SGMaterialLibPtr matlib;
osg::ref_ptr<SGMaterialCache> matcache; osg::ref_ptr<SGMaterialCache> matcache;
osg::ref_ptr<osg::Group> group = new osg::Group;
group->setDataVariance(osg::Object::STATIC); group->setDataVariance(osg::Object::STATIC);
// generate textured triangle list // generate textured triangle list
@ -129,6 +135,16 @@ public:
if (objectLOD) { if (objectLOD) {
group->addChild(objectLOD); group->addChild(objectLOD);
} }
} catch (sg_exception& sge) {
simgear::reportFailure(simgear::LoadFailure::BadData, simgear::ErrorCode::BTGLoad,
"Failed to load BTG file:" + sge.getFormattedMessage(),
sge.getLocation());
return ReadResult::ERROR_IN_READING_FILE;
} catch (std::bad_alloc &e) {
simgear::reportFailure(simgear::LoadFailure::OutOfMemory, simgear::ErrorCode::BTGLoad,
"Out of memory loading tile details", sg_location{_path});
return ReadResult::INSUFFICIENT_MEMORY_TO_LOAD;
}
return group.release(); return group.release();
} }