#include <simgear/debug/logstream.hxx>
#include <simgear/structure/exception.hxx>
+#include <simgear/timing/timestamp.hxx>
namespace flightgear
{
for (; it != end; ++it) {
FGPositioned* p = cache->loadById(it->second);
- 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;
return result;
}
-void findNearestN(const SGVec3d& aPos, unsigned int aN, double aCutoffM, FGPositioned::Filter* aFilter, FGPositioned::List& aResults)
+bool findNearestN(const SGVec3d& aPos, unsigned int aN, double aCutoffM, FGPositioned::Filter* aFilter, FGPositioned::List& aResults, int aCutoffMsec)
{
aResults.clear();
FindNearestPQueue pq;
pq.push(Ordered<Node*>(global_spatialOctree, 0));
double cut = aCutoffM;
- while (!pq.empty()) {
+ SGTimeStamp tm;
+ tm.stamp();
+
+ while (!pq.empty() && (tm.elapsedMSec() < aCutoffMsec)) {
if (!results.empty()) {
// terminate the search if we have sufficent results, and we are
// sure no node still on the queue contains a closer match
double furthestResultOrder = results.back().order();
- // std::cout << "furthest result:" << furthestResultOrder << ", top node order:" << pq.top().order() << std::endl;
if ((results.size() >= aN) && (furthestResultOrder < pq.top().order())) {
+ // clear the PQ to mark this has 'full results' instead of partial
+ pq = FindNearestPQueue();
break;
}
}
Node* nd = pq.top().get();
pq.pop();
-// std::cout << "visiting:" << std::oct << nd->guid() << "(" << std::dec << nd->guid() << ")" << std::endl;
nd->visit(aPos, cut, aFilter, results, pq);
} // of queue iteration
for (unsigned int r=0; r<numResults; ++r) {
aResults[r] = results[r].get();
}
+
+ return !pq.empty();
}
-void findAllWithinRange(const SGVec3d& aPos, double aRangeM, FGPositioned::Filter* aFilter, FGPositioned::List& aResults)
+bool findAllWithinRange(const SGVec3d& aPos, double aRangeM, FGPositioned::Filter* aFilter, FGPositioned::List& aResults, int aCutoffMsec)
{
aResults.clear();
FindNearestPQueue pq;
pq.push(Ordered<Node*>(global_spatialOctree, 0));
double rng = aRangeM;
- while (!pq.empty()) {
+ SGTimeStamp tm;
+ tm.stamp();
+
+ while (!pq.empty() && (tm.elapsedMSec() < aCutoffMsec)) {
Node* nd = pq.top().get();
pq.pop();
for (unsigned int r=0; r<numResults; ++r) {
aResults[r] = results[r].get();
}
+
+ return !pq.empty();
}
} // of namespace Octree