From b75c54b446d2b6152b1051bd6c6c2ccd1ab8f2b6 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 11 Feb 2003 20:14:23 +0000 Subject: [PATCH] fix search path weirdnesses --- dtool/src/dtoolutil/dSearchPath.cxx | 22 +++++- dtool/src/dtoolutil/filename.cxx | 33 +++++++++ dtool/src/dtoolutil/filename.h | 1 + panda/src/egg/eggData.I | 26 ++++++++ panda/src/egg/eggData.cxx | 35 +++------- panda/src/egg/eggData.h | 6 +- panda/src/egg/eggGroupNode.cxx | 15 ++--- panda/src/egg/eggGroupNode.h | 14 ++-- panda/src/egg/test_egg.cxx | 4 +- panda/src/egg2pg/load_egg_file.cxx | 3 +- panda/src/express/tokenBoard.h | 8 +-- panda/src/express/virtualFileSystem.cxx | 21 +++++- panda/src/framework/windowFramework.cxx | 12 ++-- panda/src/pgraph/loader.I | 11 ++- panda/src/pgraph/loader.cxx | 89 +++++++++++++++++-------- panda/src/pgraph/loader.h | 10 +-- 16 files changed, 218 insertions(+), 92 deletions(-) diff --git a/dtool/src/dtoolutil/dSearchPath.cxx b/dtool/src/dtoolutil/dSearchPath.cxx index 9765585610..025d67ba23 100644 --- a/dtool/src/dtoolutil/dSearchPath.cxx +++ b/dtool/src/dtoolutil/dSearchPath.cxx @@ -277,7 +277,16 @@ find_file(const Filename &filename) const { for (di = _directories.begin(); di != _directories.end(); ++di) { Filename match((*di), filename); if (match.exists()) { - return match; + if ((*di) == "." && filename.is_fully_qualified()) { + // A special case for the "." directory: to avoid prefixing + // an endless stream of ./ in front of files, if the + // filename already has a ./ prefixed + // (i.e. is_fully_fully_qualified() is true), we don't + // prefix another one. + return filename; + } else { + return match; + } } } } @@ -307,7 +316,16 @@ find_all_files(const Filename &filename, for (di = _directories.begin(); di != _directories.end(); ++di) { Filename match((*di), filename); if (match.exists()) { - results.add_file(match); + if ((*di) == "." && filename.is_fully_qualified()) { + // A special case for the "." directory: to avoid prefixing + // an endless stream of ./ in front of files, if the + // filename already has a ./ prefixed + // (i.e. is_fully_fully_qualified() is true), we don't + // prefix another one. + results.add_file(filename); + } else { + results.add_file(match); + } num_added++; } } diff --git a/dtool/src/dtoolutil/filename.cxx b/dtool/src/dtoolutil/filename.cxx index 194507498a..9aa9b0231c 100644 --- a/dtool/src/dtoolutil/filename.cxx +++ b/dtool/src/dtoolutil/filename.cxx @@ -518,6 +518,39 @@ set_extension(const string &s) { } } +//////////////////////////////////////////////////////////////////// +// Function: Filename::extract_components +// Access: Public +// Description: Extracts out the individual directory components of +// the path into a series of strings. get_basename() +// will be the last component stored in the vector. +// Note that no distinction is made by this method +// between a leading slash and no leading slash, but you +// can call is_local() to differentiate the two cases. +//////////////////////////////////////////////////////////////////// +void Filename:: +extract_components(vector_string &components) const { + components.clear(); + + size_t p = 0; + if (!_filename.empty() && _filename[0] == '/') { + // Skip the leading slash. + p = 1; + } + while (p < _filename.length()) { + size_t q = _filename.find('/', p); + if (q == string::npos) { + components.push_back(_filename.substr(p)); + return; + } + components.push_back(_filename.substr(p, q - p)); + p = q + 1; + } + + // A trailing slash means we have an empty get_basename(). + components.push_back(string()); +} + //////////////////////////////////////////////////////////////////// // Function: Filename::standardize // Access: Public diff --git a/dtool/src/dtoolutil/filename.h b/dtool/src/dtoolutil/filename.h index 5e1e2e8bd3..01bd3e8aec 100644 --- a/dtool/src/dtoolutil/filename.h +++ b/dtool/src/dtoolutil/filename.h @@ -122,6 +122,7 @@ PUBLISHED: INLINE void set_type(Type type); INLINE Type get_type() const; + void extract_components(vector_string &components) const; void standardize(); // The following functions deal with the outside world. diff --git a/panda/src/egg/eggData.I b/panda/src/egg/eggData.I index 818bcb1bc8..28396fc4bb 100644 --- a/panda/src/egg/eggData.I +++ b/panda/src/egg/eggData.I @@ -24,6 +24,7 @@ //////////////////////////////////////////////////////////////////// INLINE EggData:: EggData() { + _auto_resolve_externals = false; _coordsys = CS_default; } @@ -36,6 +37,7 @@ EggData() { INLINE EggData:: EggData(const EggData ©) : EggGroupNode(copy), + _auto_resolve_externals(copy._auto_resolve_externals), _coordsys(copy._coordsys), _egg_filename(copy._egg_filename) { } @@ -48,11 +50,35 @@ EggData(const EggData ©) : INLINE EggData &EggData:: operator = (const EggData ©) { EggGroupNode::operator = (copy); + _auto_resolve_externals = copy._auto_resolve_externals; _coordsys = copy._coordsys; _egg_filename = copy._egg_filename; return *this; } +//////////////////////////////////////////////////////////////////// +// Function: EggData::set_auto_resolve_externals +// Access: Public +// Description: Indicates whether the EggData object will +// automatically resolve any external references when +// read() is called. The default is false. +//////////////////////////////////////////////////////////////////// +INLINE void EggData:: +set_auto_resolve_externals(bool resolve) { + _auto_resolve_externals = resolve; +} + +//////////////////////////////////////////////////////////////////// +// Function: EggData::get_auto_resolve_externals +// Access: Public +// Description: Indicates whether the EggData object will +// automatically resolve any external references when +// read() is called. The default is false. +//////////////////////////////////////////////////////////////////// +INLINE bool EggData:: +get_auto_resolve_externals() const { + return _auto_resolve_externals; +} //////////////////////////////////////////////////////////////////// // Function: EggData::get_coordinate_system diff --git a/panda/src/egg/eggData.cxx b/panda/src/egg/eggData.cxx index 5b6f5104c9..cedc199160 100644 --- a/panda/src/egg/eggData.cxx +++ b/panda/src/egg/eggData.cxx @@ -87,18 +87,12 @@ resolve_egg_filename(Filename &egg_filename, const DSearchPath &searchpath) { //////////////////////////////////////////////////////////////////// bool EggData:: read(Filename filename) { - if (!resolve_egg_filename(filename)) { - egg_cat.error() - << "Could not find " << filename << "\n"; - return false; - } + filename.set_text(); + set_egg_filename(filename); if (use_vfs) { VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr(); - filename.set_text(); - set_egg_filename(filename); - istream *file = vfs->open_read_file(filename); if (file == (istream *)NULL) { egg_cat.error() << "Unable to open " << filename << "\n"; @@ -113,15 +107,6 @@ read(Filename filename) { return read_ok; } else { - if (!resolve_egg_filename(filename)) { - egg_cat.error() - << "Could not find " << filename << "\n"; - return false; - } - - filename.set_text(); - set_egg_filename(filename); - ifstream file; if (!filename.open_read(file)) { egg_cat.error() << "Unable to open " << filename << "\n"; @@ -174,7 +159,7 @@ read(istream &in) { //////////////////////////////////////////////////////////////////// -// Function: EggData::resolve_externals +// Function: EggData::load_externals // Access: Public // Description: Loads up all the egg files referenced by // entries within the egg structure, and inserts their @@ -185,9 +170,9 @@ read(istream &in) { // successfully, false otherwise. //////////////////////////////////////////////////////////////////// bool EggData:: -resolve_externals(const DSearchPath &searchpath) { +load_externals(const DSearchPath &searchpath) { return - r_resolve_externals(searchpath, get_coordinate_system()); + r_load_externals(searchpath, get_coordinate_system()); } //////////////////////////////////////////////////////////////////// @@ -330,10 +315,12 @@ post_read() { set_coordinate_system(old_coordsys); } - // Resolve filenames that are relative to the egg file. - DSearchPath dir; - dir.append_directory(get_egg_filename().get_dirname()); - resolve_filenames(dir); + if (get_auto_resolve_externals()) { + // Resolve filenames that are relative to the egg file. + DSearchPath dir; + dir.append_directory(get_egg_filename().get_dirname()); + resolve_filenames(dir); + } } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/egg/eggData.h b/panda/src/egg/eggData.h index b8587028cd..94077f831a 100644 --- a/panda/src/egg/eggData.h +++ b/panda/src/egg/eggData.h @@ -55,13 +55,16 @@ public: bool read(Filename filename); bool read(istream &in); - bool resolve_externals(const DSearchPath &searchpath = DSearchPath()); + bool load_externals(const DSearchPath &searchpath = DSearchPath()); int collapse_equivalent_textures(); int collapse_equivalent_materials(); bool write_egg(Filename filename); bool write_egg(ostream &out); + INLINE void set_auto_resolve_externals(bool resolve); + INLINE bool get_auto_resolve_externals() const; + void set_coordinate_system(CoordinateSystem coordsys); INLINE CoordinateSystem get_coordinate_system() const; @@ -79,6 +82,7 @@ private: void post_read(); void pre_write(); + bool _auto_resolve_externals; CoordinateSystem _coordsys; Filename _egg_filename; diff --git a/panda/src/egg/eggGroupNode.cxx b/panda/src/egg/eggGroupNode.cxx index 1bc27ad59b..612936d573 100644 --- a/panda/src/egg/eggGroupNode.cxx +++ b/panda/src/egg/eggGroupNode.cxx @@ -31,8 +31,8 @@ #include "pt_EggMaterial.h" #include "config_egg.h" -#include -#include +#include "dSearchPath.h" +#include "deg_2_rad.h" #include @@ -903,17 +903,16 @@ find_materials(EggMaterialCollection *collection) { } //////////////////////////////////////////////////////////////////// -// Function: EggGroupNode::r_resolve_externals +// Function: EggGroupNode::r_load_externals // Access: Protected // Description: Walks the tree and locates unloaded external // reference nodes, which it attempts to locate and load // in. The reference node is replaced with the entire // subtree loaded. This is intended to be called from -// EggData::resolve_externals(). +// EggData::load_externals(). //////////////////////////////////////////////////////////////////// bool EggGroupNode:: -r_resolve_externals(const DSearchPath &searchpath, - CoordinateSystem coordsys) { +r_load_externals(const DSearchPath &searchpath, CoordinateSystem coordsys) { bool success = true; Children::iterator ci; @@ -944,7 +943,7 @@ r_resolve_externals(const DSearchPath &searchpath, // The external file was read correctly. Add its contents // into the tree at this point. success = - ext_data.resolve_externals(searchpath) + ext_data.load_externals(searchpath) && success; new_node->steal_children(ext_data); } @@ -953,7 +952,7 @@ r_resolve_externals(const DSearchPath &searchpath, } else if (child->is_of_type(EggGroupNode::get_class_type())) { EggGroupNode *group_child = DCAST(EggGroupNode, child); success = - group_child->r_resolve_externals(searchpath, coordsys) + group_child->r_load_externals(searchpath, coordsys) && success; } } diff --git a/panda/src/egg/eggGroupNode.h b/panda/src/egg/eggGroupNode.h index f372df5b52..053e9ab311 100644 --- a/panda/src/egg/eggGroupNode.h +++ b/panda/src/egg/eggGroupNode.h @@ -19,14 +19,14 @@ #ifndef EGGGROUPNODE_H #define EGGGROUPNODE_H -#include +#include "pandabase.h" #include "eggNode.h" -#include -#include -#include -#include +#include "coordinateSystem.h" +#include "typedObject.h" +#include "pointerTo.h" +#include "luse.h" #include "plist.h" @@ -135,8 +135,8 @@ protected: CoordinateSystem find_coordsys_entry(); int find_textures(EggTextureCollection *collection); int find_materials(EggMaterialCollection *collection); - bool r_resolve_externals(const DSearchPath &searchpath, - CoordinateSystem coordsys); + bool r_load_externals(const DSearchPath &searchpath, + CoordinateSystem coordsys); private: Children _children; diff --git a/panda/src/egg/test_egg.cxx b/panda/src/egg/test_egg.cxx index 24bc107421..f951641d7a 100644 --- a/panda/src/egg/test_egg.cxx +++ b/panda/src/egg/test_egg.cxx @@ -17,7 +17,7 @@ //////////////////////////////////////////////////////////////////// #include "eggData.h" -#include +#include "notify.h" int @@ -32,7 +32,7 @@ main(int argc, char *argv[]) { data.set_coordinate_system(CS_default); if (data.read(egg_filename)) { - data.resolve_externals(""); + data.load_externals(""); data.write_egg(cout); } else { nout << "Errors.\n"; diff --git a/panda/src/egg2pg/load_egg_file.cxx b/panda/src/egg2pg/load_egg_file.cxx index 1ddbb14996..3209c195a6 100644 --- a/panda/src/egg2pg/load_egg_file.cxx +++ b/panda/src/egg2pg/load_egg_file.cxx @@ -26,7 +26,7 @@ static PT(PandaNode) load_from_loader(EggLoader &loader) { - loader._data.resolve_externals(); + loader._data.load_externals(); loader.build_graph(); @@ -79,6 +79,7 @@ load_egg_file(const string &filename, CoordinateSystem cs) { EggLoader loader; loader._data.set_egg_filename(egg_filename); + loader._data.set_auto_resolve_externals(true); if (cs != CS_default) { loader._data.set_coordinate_system(cs); } diff --git a/panda/src/express/tokenBoard.h b/panda/src/express/tokenBoard.h index 1eec766155..29020e4c97 100644 --- a/panda/src/express/tokenBoard.h +++ b/panda/src/express/tokenBoard.h @@ -15,13 +15,11 @@ // panda3d@yahoogroups.com . // //////////////////////////////////////////////////////////////////// + #ifndef TOKENBOARD_H #define TOKENBOARD_H -// -//////////////////////////////////////////////////////////////////// -// Includes -//////////////////////////////////////////////////////////////////// -#include + +#include "pandabase.h" #include "plist.h" #include "circBuffer.h" #include "pointerTo.h" diff --git a/panda/src/express/virtualFileSystem.cxx b/panda/src/express/virtualFileSystem.cxx index f10ad6253e..84246f3d87 100644 --- a/panda/src/express/virtualFileSystem.cxx +++ b/panda/src/express/virtualFileSystem.cxx @@ -347,6 +347,15 @@ find_file(const Filename &filename, const DSearchPath &searchpath) const { int num_directories = searchpath.get_num_directories(); for (int i = 0; i < num_directories; i++) { Filename match(searchpath.get_directory(i), filename); + if (searchpath.get_directory(i) == "." && + filename.is_fully_qualified()) { + // A special case for the "." directory: to avoid prefixing + // an endless stream of ./ in front of files, if the + // filename already has a ./ prefixed + // (i.e. is_fully_fully_qualified() is true), we don't + // prefix another one. + match = filename; + } PT(VirtualFile) found_file = get_file(match); if (found_file != (VirtualFile *)NULL) { return found_file; @@ -430,7 +439,17 @@ find_all_files(const Filename &filename, const DSearchPath &searchpath, for (int i = 0; i < num_directories; i++) { Filename match(searchpath.get_directory(i), filename); if (exists(match)) { - results.add_file(match); + if (searchpath.get_directory(i) == "." && + filename.is_fully_qualified()) { + // A special case for the "." directory: to avoid prefixing + // an endless stream of ./ in front of files, if the + // filename already has a ./ prefixed + // (i.e. is_fully_fully_qualified() is true), we don't + // prefix another one. + results.add_file(filename); + } else { + results.add_file(match); + } num_added++; } } diff --git a/panda/src/framework/windowFramework.cxx b/panda/src/framework/windowFramework.cxx index fde02d5090..47450ec8a8 100644 --- a/panda/src/framework/windowFramework.cxx +++ b/panda/src/framework/windowFramework.cxx @@ -373,15 +373,13 @@ load_models(const NodePath &parent, const pvector &files) { NodePath WindowFramework:: load_model(const NodePath &parent, Filename filename) { nout << "Loading " << filename << "\n"; - - // First, we always try to resolve a filename from the current - // directory. This means a local filename will always be found - // before the model path is searched. - DSearchPath local_path("."); - filename.resolve_filename(local_path); + + // If the filename already exists where it is, or if it is fully + // qualified, don't search along the model path for it. + bool search = !(filename.is_fully_qualified() || filename.exists()); Loader loader; - PT(PandaNode) node = loader.load_sync(filename); + PT(PandaNode) node = loader.load_sync(filename, search); if (node == (PandaNode *)NULL) { nout << "Unable to load " << filename << "\n"; return NodePath::not_found(); diff --git a/panda/src/pgraph/loader.I b/panda/src/pgraph/loader.I index e861befd93..f5273d9608 100644 --- a/panda/src/pgraph/loader.I +++ b/panda/src/pgraph/loader.I @@ -115,12 +115,17 @@ add_file(const Filename &file, LoaderFileType *type) { //////////////////////////////////////////////////////////////////// // Function: Loader::load_sync // Access: Published -// Description: Loads the file immediately, waiting for it to complete. +// Description: Loads the file immediately, waiting for it to +// complete. +// +// If search is true, the file is searched for along the +// model path; otherwise, only the exact filename is +// loaded. //////////////////////////////////////////////////////////////////// INLINE PT(PandaNode) Loader:: -load_sync(const Filename &filename) const { +load_sync(const Filename &filename, bool search) const { if (!_file_types_loaded) { load_file_types(); } - return load_file(filename); + return load_file(filename, search); } diff --git a/panda/src/pgraph/loader.cxx b/panda/src/pgraph/loader.cxx index 653a264ffe..82e119504f 100644 --- a/panda/src/pgraph/loader.cxx +++ b/panda/src/pgraph/loader.cxx @@ -47,14 +47,18 @@ bool Loader::_file_types_loaded = false; //////////////////////////////////////////////////////////////////// class LoaderToken : public ReferenceCount { public: - INLINE LoaderToken(uint id, Filename path, const string &event_name, - PandaNode *node=NULL) : _id(id), _node(node) { - _path = path; - _event_name = event_name; - } + INLINE LoaderToken(uint id, const string &event_name, const Filename &path, + bool search, PandaNode *node=NULL) : + _id(id), + _event_name(event_name), + _path(path), + _search(search), + _node(node) + { } uint _id; - Filename _path; string _event_name; + Filename _path; + bool _search; PT(PandaNode) _node; }; @@ -82,12 +86,14 @@ Loader:: //////////////////////////////////////////////////////////////////// // Function: Loader::find_all_files // Access: Published -// Description: Searches along the model path for the given file -// name, and fills up the results list with all possible -// matches and their associated types, in order. +// Description: Searches along the given search path for the given +// file name, and fills up the results list with all +// possible matches and their associated types, in +// order. //////////////////////////////////////////////////////////////////// int Loader:: -find_all_files(const Filename &filename, Loader::Results &results) const { +find_all_files(const Filename &filename, const DSearchPath &search_path, + Loader::Results &results) const { if (!_file_types_loaded) { load_file_types(); } @@ -109,13 +115,12 @@ find_all_files(const Filename &filename, Loader::Results &results) const { } else { // Local filename, search along the path. - const DSearchPath &model_path = get_model_path(); DSearchPath::Results files; if (use_vfs) { VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr(); - num_added = vfs->find_all_files(filename, model_path, files); + num_added = vfs->find_all_files(filename, search_path, files); } else { - num_added = model_path.find_all_files(filename, files); + num_added = search_path.find_all_files(filename, files); } for (int i = 0; i < num_added; i++) { @@ -153,10 +158,9 @@ find_all_files(const Filename &filename, Loader::Results &results) const { } else { // Local filename, look it up on the model path. - const DSearchPath &model_path = get_model_path(); - int num_dirs = model_path.get_num_directories(); + int num_dirs = search_path.get_num_directories(); for (int i = 0; i < num_dirs; i++) { - const Filename &directory = model_path.get_directory(i); + const Filename &directory = search_path.get_directory(i); for (int t = 0; t < num_types; t++) { LoaderFileType *type = reg->get_type(t); @@ -195,9 +199,13 @@ find_all_files(const Filename &filename, Loader::Results &results) const { // The return value is an integer which can be used to // identify this particular request later to // fetch_load(), or 0 if there has been an error. +// +// If search is true, the file is searched for along the +// model path; otherwise, only the exact filename is +// loaded. //////////////////////////////////////////////////////////////////// uint Loader:: -request_load(const Filename &filename, const string &event_name) { +request_load(const string &event_name, const Filename &filename, bool search) { if (!_file_types_loaded) { load_file_types(); } @@ -229,7 +237,7 @@ request_load(const Filename &filename, const string &event_name) { << "Load requested for file: " << filename << "\n"; } - tok = new LoaderToken(_next_token++, filename, event_name); + tok = new LoaderToken(_next_token++, event_name, filename, search); _token_board->_waiting.push_back(tok); #ifdef OLD_HAVE_IPC @@ -251,7 +259,7 @@ request_load(const Filename &filename, const string &event_name) { << "Load requested for file: " << filename << "\n"; } - tok = new LoaderToken(_next_token++, filename, event_name); + tok = new LoaderToken(_next_token++, event_name, filename, search); _token_board->_waiting.push_back(tok); process_request(); } @@ -336,7 +344,7 @@ process_request() { while (!_token_board->_waiting.empty()) { PT(LoaderToken) tok = _token_board->_waiting.front(); _token_board->_waiting.pop_front(); - tok->_node = load_file(tok->_path); + tok->_node = load_file(tok->_path, tok->_search); if (tok->_node == (PandaNode *)NULL) { loader_cat.error() << "Loader::callback() - couldn't find file: " @@ -367,12 +375,24 @@ process_request() { // Description: Loads a single scene graph file, if possible. // Returns the Node that is the root of the file, or // NULL if the file cannot be loaded. +// +// If search is true, the file is searched for along the +// model path; otherwise, only the exact filename is +// loaded. //////////////////////////////////////////////////////////////////// PT(PandaNode) Loader:: -load_file(const Filename &filename) const { - // First, look for the file along the search path. +load_file(const Filename &filename, bool search) const { Results results; - int num_files = find_all_files(filename, results); + int num_files; + + if (search) { + // Look for the file along the model path. + num_files = find_all_files(filename, get_model_path(), results); + } else { + // Look for the file only where it is. + num_files = find_all_files(filename, DSearchPath("."), results); + } + if (num_files == 0) { // Couldn't find the file. Either it doesn't exist, or it's an // unknown file type. Report a useful message either way. @@ -391,8 +411,15 @@ load_file(const Filename &filename) const { return NULL; } } - loader_cat.error() - << "Couldn't load file " << filename << ": not found on model path.\n"; + + if (search) { + loader_cat.error() + << "Couldn't load file " << filename << ": not found on model path.\n"; + + } else { + loader_cat.error() + << "Couldn't load file " << filename << ": does not exist.\n"; + } return NULL; } @@ -406,8 +433,16 @@ load_file(const Filename &filename) const { } // None of the matching files could be loaded. Oh well. - loader_cat.error() - << "Couldn't load file " << filename << ": all matching files on model path invalid.\n"; + if (search) { + loader_cat.error() + << "Couldn't load file " << filename + << ": all matching files on model path invalid.\n"; + + } else { + loader_cat.error() + << "Couldn't load file " << filename + << ": invalid.\n"; + } return NULL; } diff --git a/panda/src/pgraph/loader.h b/panda/src/pgraph/loader.h index d6de17f0ba..8ed7cd8314 100644 --- a/panda/src/pgraph/loader.h +++ b/panda/src/pgraph/loader.h @@ -15,6 +15,7 @@ // panda3d@yahoogroups.com . // //////////////////////////////////////////////////////////////////// + #ifndef LOADER_H #define LOADER_H @@ -67,11 +68,12 @@ PUBLISHED: Loader(); ~Loader(); - int find_all_files(const Filename &filename, Results &results) const; + int find_all_files(const Filename &filename, const DSearchPath &search_path, + Results &results) const; - INLINE PT(PandaNode) load_sync(const Filename &filename) const; + INLINE PT(PandaNode) load_sync(const Filename &filename, bool search = true) const; - uint request_load(const Filename &filename, const string &event_name); + uint request_load(const string &event_name, const Filename &filename, bool search = true); bool check_load(uint id); PT(PandaNode) fetch_load(uint id); @@ -80,7 +82,7 @@ private: static bool _file_types_loaded; virtual bool process_request(void); - PT(PandaNode) load_file(const Filename &filename) const; + PT(PandaNode) load_file(const Filename &filename, bool search) const; typedef TokenBoard LoaderTokenBoard; LoaderTokenBoard *_token_board;