double elevationEnd = -100;
if (local_scenery->get_elevation_m( center2, elevationEnd, NULL )) {
- mPosition.setElevationM(elevationEnd);
- NavDataCache::instance()->updatePosition(guid(), mPosition);
+ SGGeod newPos = mPosition;
+ newPos.setElevationM(elevationEnd);
+ // this will call modifyPosition to update mPosition
+ NavDataCache::instance()->updatePosition(guid(), newPos);
}
}
void NavDataCache::updatePosition(PositionedID item, const SGGeod &pos)
{
+ if (d->cache.find(item) != d->cache.end()) {
+ SG_LOG(SG_GENERAL, SG_DEBUG, "updating position of an item in the cache");
+ d->cache[item]->modifyPosition(pos);
+ }
+
SGVec3d cartPos(SGVec3d::fromGeod(pos));
d->reset(d->setAirportPos);
#include <boost/foreach.hpp>
#include <simgear/debug/logstream.hxx>
+#include <simgear/structure/exception.hxx>
namespace flightgear
{
for (; it != end; ++it) {
FGPositioned* p = cache->loadById(it->second);
- assert(intersects(_box, p->cart()));
+ if (!intersects(_box, p->cart())) {
+ // see http://code.google.com/p/flightgear-bugs/issues/detail?id=905
+
+ SG_LOG(SG_GENERAL, SG_WARN, "XXXXXXXXX bad spatial index for " << it->second
+ << "; " << p->ident() << " of type " <<
+ FGPositioned::nameForType(p->type()));
+ SG_LOG(SG_GENERAL, SG_WARN, "\tgeodetic location:" << p->geod());
+ SG_LOG(SG_GENERAL, SG_WARN, "\tcartesian location:" << p->cart());
+
+ SG_LOG(SG_GENERAL, SG_WARN, "leaf box:" <<
+ _box.getMin() << " x " << _box.getMax());
+
+ throw sg_exception("Bad spatial index data");
+ }
+
+
double d = dist(aPos, p->cart());
if (d > aCutoff) {
continue;
void modifyPosition(const SGGeod& newPos);
const PositionedID mGuid;
- SGGeod mPosition;
+ const SGGeod mPosition;
const SGVec3d mCart;
const Type mType;
const std::string mIdent;