218 lines
5.1 KiB
Text
218 lines
5.1 KiB
Text
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file loader.I
|
||
|
* @author mike
|
||
|
* @date 1997-01-09
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE Loader::Results::
|
||
|
Results() {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE Loader::Results::
|
||
|
Results(const Loader::Results ©) :
|
||
|
_files(copy._files)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void Loader::Results::
|
||
|
operator = (const Loader::Results ©) {
|
||
|
_files = copy._files;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE Loader::Results::
|
||
|
~Results() {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes all the files from the list.
|
||
|
*/
|
||
|
INLINE void Loader::Results::
|
||
|
clear() {
|
||
|
_files.clear();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the number of files on the result list.
|
||
|
*/
|
||
|
INLINE int Loader::Results::
|
||
|
get_num_files() const {
|
||
|
return _files.size();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the nth file on the result list.
|
||
|
*/
|
||
|
INLINE const Filename &Loader::Results::
|
||
|
get_file(int n) const {
|
||
|
nassertr(n >= 0 && n < (int)_files.size(), _files[0]._path);
|
||
|
return _files[n]._path;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the file type of the nth file on the result list.
|
||
|
*/
|
||
|
INLINE LoaderFileType *Loader::Results::
|
||
|
get_file_type(int n) const {
|
||
|
nassertr(n >= 0 && n < (int)_files.size(), nullptr);
|
||
|
return _files[n]._type;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new file to the result list.
|
||
|
*/
|
||
|
INLINE void Loader::Results::
|
||
|
add_file(const Filename &file, LoaderFileType *type) {
|
||
|
ConsiderFile cf;
|
||
|
cf._path = file;
|
||
|
cf._type = type;
|
||
|
_files.push_back(cf);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Specifies the task manager that is used for asynchronous loads. The
|
||
|
* default is the global task manager.
|
||
|
*/
|
||
|
INLINE void Loader::
|
||
|
set_task_manager(AsyncTaskManager *task_manager) {
|
||
|
_task_manager = task_manager;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the task manager that is used for asynchronous loads.
|
||
|
*/
|
||
|
INLINE AsyncTaskManager *Loader::
|
||
|
get_task_manager() const {
|
||
|
return _task_manager;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Specifies the task chain that is used for asynchronous loads. The default
|
||
|
* is the initial name of the Loader object.
|
||
|
*/
|
||
|
INLINE void Loader::
|
||
|
set_task_chain(const std::string &task_chain) {
|
||
|
_task_chain = task_chain;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the task chain that is used for asynchronous loads.
|
||
|
*/
|
||
|
INLINE const std::string &Loader::
|
||
|
get_task_chain() const {
|
||
|
return _task_chain;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stop any threads used for asynchronous loads.
|
||
|
*/
|
||
|
INLINE void Loader::
|
||
|
stop_threads() {
|
||
|
PT(AsyncTaskChain) chain = _task_manager->find_task_chain(_task_chain);
|
||
|
if (chain != nullptr) {
|
||
|
chain->stop_threads();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes a pending asynchronous load request. Returns true if successful,
|
||
|
* false otherwise.
|
||
|
* @deprecated use task.cancel() to cancel the request instead.
|
||
|
*/
|
||
|
INLINE bool Loader::
|
||
|
remove(AsyncTask *task) {
|
||
|
return _task_manager->remove(task);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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 LoaderOptions &options) const {
|
||
|
if (!_file_types_loaded) {
|
||
|
load_file_types();
|
||
|
}
|
||
|
return load_file(filename, options);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Begins an asynchronous load request. To use this call, first call
|
||
|
* make_async_request() to create a new ModelLoadRequest object with the
|
||
|
* filename you wish to load, and then add that object to the Loader with
|
||
|
* load_async. This function will return immediately, and the model will be
|
||
|
* loaded in the background.
|
||
|
*
|
||
|
* To determine when the model has completely loaded, you may poll
|
||
|
* request->is_ready() from time to time, or set the done_event on the request
|
||
|
* object and listen for that event. When the model is ready, you may
|
||
|
* retrieve it via request->get_model().
|
||
|
*/
|
||
|
INLINE void Loader::
|
||
|
load_async(AsyncTask *request) {
|
||
|
request->set_task_chain(_task_chain);
|
||
|
_task_manager->add(request);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Saves the file immediately, waiting for it to complete.
|
||
|
*/
|
||
|
INLINE bool Loader::
|
||
|
save_sync(const Filename &filename, const LoaderOptions &options,
|
||
|
PandaNode *node) const {
|
||
|
if (!_file_types_loaded) {
|
||
|
load_file_types();
|
||
|
}
|
||
|
return save_file(filename, options, node);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Begins an asynchronous save request. To use this call, first call
|
||
|
* make_async_save_request() to create a new ModelSaveRequest object with the
|
||
|
* filename you wish to load, and then add that object to the Loader with
|
||
|
* save_async. This function will return immediately, and the model will be
|
||
|
* loaded in the background.
|
||
|
*
|
||
|
* To determine when the model has completely loaded, you may poll
|
||
|
* request->is_ready() from time to time, or set the done_event on the request
|
||
|
* object and listen for that event. When the request is ready, you may
|
||
|
* retrieve the success or failure via request->get_success().
|
||
|
*/
|
||
|
INLINE void Loader::
|
||
|
save_async(AsyncTask *request) {
|
||
|
request->set_task_chain(_task_chain);
|
||
|
_task_manager->add(request);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a pointer to the global Loader. This is the Loader that most code
|
||
|
* should use for loading models.
|
||
|
*/
|
||
|
INLINE Loader *Loader::
|
||
|
get_global_ptr() {
|
||
|
if (_global_ptr == nullptr) {
|
||
|
make_global_ptr();
|
||
|
}
|
||
|
return _global_ptr;
|
||
|
}
|