->get_group(SGSubsystemMgr::INIT)->get_subsystem("interpolator"))
->interpolate(node, nPoints, values, deltas);
+ delete[] values;
+ delete[] deltas;
return naNil();
}
return naNum(0);
}
+static naRef f_abort(naContext c, naRef me, int argc, naRef* args)
+{
+ abort();
+ return naNil();
+}
+
// Return an array listing of all files in a directory
static naRef f_directory(naContext c, naRef me, int argc, naRef* args)
{
if(rwy._id != id) break;
if(rwy._type[0] != 'r') continue;
+ naRef rwyid = naStr_fromdata(naNewString(c),
+ const_cast<char *>(rwy._rwy_no.c_str()),
+ rwy._rwy_no.length());
+
naRef rwydata = naNewHash(c);
#define HASHSET(s,l,n) naHash_set(rwydata, naStr_fromdata(naNewString(c),s,l),n)
+ HASHSET("id", 2, rwyid);
HASHSET("lat", 3, naNum(rwy._lat));
HASHSET("lon", 3, naNum(rwy._lon));
HASHSET("heading", 7, naNum(rwy._heading));
HASHSET("stopway1", 8, naNum(rwy._stopway1 * SG_FEET_TO_METER));
HASHSET("stopway2", 8, naNum(rwy._stopway2 * SG_FEET_TO_METER));
#undef HASHSET
-
- naRef no = naStr_fromdata(naNewString(c),
- const_cast<char *>(rwy._rwy_no.c_str()),
- rwy._rwy_no.length());
- naHash_set(rwys, no, rwydata);
+ naHash_set(rwys, rwyid, rwydata);
} while(rwylst->next(&rwy));
}
{ "_interpolate", f_interpolate },
{ "rand", f_rand },
{ "srand", f_srand },
+ { "abort", f_abort },
{ "directory", f_directory },
{ "parsexml", f_parsexml },
{ "systime", f_systime },
for(it = _dead_listener.begin(); it != end; ++it) delete *it;
_dead_listener.clear();
}
+
+ // The global context is a legacy thing. We use dynamically
+ // created contexts for naCall() now, so that we can call them
+ // recursively. But there are still spots that want to use it for
+ // naNew*() calls, which end up leaking memory because the context
+ // only clears out its temporary vector when it's *used*. So just
+ // junk it and fetch a new/reinitialized one every frame. This is
+ // clumsy: the right solution would use the dynamic context in all
+ // cases and eliminate _context entirely. But that's more work,
+ // and this works fine (yes, they say "New" and "Free", but
+ // they're very fast, just trust me). -Andy
+ naFreeContext(_context);
+ _context = naNewContext();
}
// Loads the scripts found under /nasal in the global tree
return naNil();
}
- int type = argc > 3 && naIsNum(args[3]) ? args[3].num : 1;
+ int type = argc > 3 && naIsNum(args[3]) ? (int)args[3].num : 1;
FGNasalListener *nl = new FGNasalListener(node, code, this,
gcSave(code), _listenerId, type);
void FGNasalModelData::modelLoaded(const string& path, SGPropertyNode *prop,
osg::Node *)
{
- SGPropertyNode *n = prop->getNode("nasal"), *load;
- if(!n)
+ if(!prop)
return;
- load = n->getNode("load");
- _unload = n->getNode("unload");
+ SGPropertyNode *load = prop->getNode("load");
+ _unload = prop->getNode("unload");
if(!load && !_unload)
return;