ACE3/extensions/vd/model_collection.cpp
jaynus 91bd1e7c7b Added: Regex filtering for pbo index.
Changed: Logging cleanup, default files and paths.
Changed: initialization order of plugin (PRE-Init for vehicle registration).
2015-05-10 17:45:38 -07:00

101 lines
3.1 KiB
C++

#include "model_collection.hpp"
#include "membuf.hpp"
namespace ace {
model_collection::model_collection() : _ready(false), _initialized(false) { }
bool model_collection::init(void) {
if (_initialized) return true;
_pbo_searcher = std::make_shared<ace::pbo::search>(".*\.p3d");
_initialized = true;
_ready = true;
return true;
}
bool model_collection::reset(void) {
return true;
}
// Model loading implementation
bool model_collection::_load_model(const std::string &p3d_path, const std::string &pbo_file) {
std::ifstream _filestream;
_ready = false;
_filestream.open(pbo_file, std::ios::binary | std::ios::in);
if (!_filestream.good()) {
_ready = true;
throw - 1;
}
if (models.find(p3d_path) != models.end()) {
_ready = true;
return true;
}
// We know the model exists, and have the pbo and file path now.
ace::pbo::archive _archive(_filestream);
ace::pbo::file_p _file = std::make_shared<ace::pbo::file>();
std::string search_filename = p3d_path;
// Remove leading slash
if (search_filename[0] == '\\') {
search_filename.erase(0, 0);
}
search_filename.erase(search_filename.find(_archive.info->data), _archive.info->data.size()+1);
std::transform(search_filename.begin(), search_filename.end(), search_filename.begin(), ::tolower);
for(auto & entry : _archive.entries) {
if (entry->filename == search_filename) {
// Do shit here
if (_archive.get_file(_filestream, entry, _file)) {
ace::membuf _memory_buffer((char *)_file->data, _file->size);
std::istream _data_stream(&_memory_buffer);
ace::p3d::model_p _model = std::make_shared<ace::p3d::model>(_data_stream);
models[p3d_path] = model_entry(p3d_path, _model);
}
break;
}
}
_filestream.close();
_ready = true;
return true;
}
bool model_collection::load_model(const std::string & p3d_path) {
std::string working_path = p3d_path;
// Flag ourselves as unready, because we are loading a model
_ready = false;
// remove leading slash
if (working_path.c_str()[0] == '\\')
working_path.erase(working_path.begin());
// Find the model in the file index
std::transform(working_path.begin(), working_path.end(), working_path.begin(), ::tolower);
// Some model names don't end in .p3d
auto find_ext = working_path.find(".p3d");
if (find_ext == std::string::npos)
working_path = working_path + ".p3d";
auto iter = _pbo_searcher->file_index().find(working_path);
if (iter != _pbo_searcher->file_index().end()) {
return _load_model(iter->first, iter->second);
}
_ready = true;
return false;
}
}