nuclear@0: #include nuclear@0: #include nuclear@0: #include "datapath.h" nuclear@0: nuclear@15: namespace goatgfx { nuclear@15: nuclear@0: template nuclear@24: DataSet::DataSet(T (*create_func)(), bool (*load_func)(T, const char*), bool (*done_func)(T), void (*destr_func)(T)) nuclear@0: { nuclear@24: create = create_func; nuclear@0: load = load_func; nuclear@24: done = done_func; nuclear@0: destroy = destr_func; nuclear@24: nuclear@24: rman = resman_create(); nuclear@24: resman_set_load_func(rman, dataset_load_func, this); nuclear@24: resman_set_done_func(rman, dataset_done_func, this); nuclear@24: resman_set_destroy_func(rman, dataset_destroy_func, this); nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: DataSet::~DataSet() nuclear@0: { nuclear@24: resman_free(rman); nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: void DataSet::clear() nuclear@0: { nuclear@24: resman_free(rman); nuclear@0: data.clear(); nuclear@24: nuclear@24: rman = resman_create(); nuclear@24: } nuclear@24: nuclear@24: template nuclear@24: void DataSet::update() nuclear@24: { nuclear@24: resman_poll(rman); nuclear@0: } nuclear@0: nuclear@0: template nuclear@0: T DataSet::get(const char *name) const nuclear@0: { nuclear@0: typename std::map::const_iterator iter = data.find(name); nuclear@0: if(iter != data.end()) { nuclear@0: return iter->second; nuclear@0: } nuclear@0: nuclear@24: const char *fname, *slash; nuclear@24: if((slash = strrchr(name, '/'))) { nuclear@24: fname = slash + 1; nuclear@24: } else { nuclear@24: fname = name; nuclear@24: } nuclear@24: nuclear@24: std::string path = datafile_path(fname); nuclear@0: if(path.empty()) { nuclear@0: fprintf(stderr, "can't find data file: %s\n", name); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@24: T res = create(); nuclear@24: resman_lookup(rman, path.c_str(), res); nuclear@0: return res; nuclear@0: } nuclear@15: nuclear@24: nuclear@24: // --- static functions to pass as callback to resman --- nuclear@24: nuclear@24: template nuclear@24: int DataSet::dataset_load_func(const char *fname, int id, void *cls) nuclear@24: { nuclear@24: DataSet *dset = (DataSet*)cls; nuclear@24: T data = (T)resman_get_res_data(dset->rman, id); nuclear@24: nuclear@24: if(!dset->load(data, fname)) { nuclear@24: return -1; nuclear@24: } nuclear@24: return 0; nuclear@24: } nuclear@24: nuclear@24: template nuclear@24: int DataSet::dataset_done_func(int id, void *cls) nuclear@24: { nuclear@24: DataSet *dset = (DataSet*)cls; nuclear@24: nuclear@24: T data = (T)resman_get_res_data(dset->rman, id); nuclear@24: int load_res = resman_get_res_result(dset->rman, id); nuclear@24: nuclear@24: if(load_res != 0) { nuclear@24: fprintf(stderr, "failed to load resource %d (%s)\n", id, resman_get_res_name(dset->rman, id)); nuclear@24: } else { nuclear@24: printf("done loading resource %d (%s)\n", id, resman_get_res_name(dset->rman, id)); nuclear@24: } nuclear@24: nuclear@24: if(dset->done) { nuclear@24: dset->done(data); nuclear@24: } nuclear@24: return 0; nuclear@24: } nuclear@24: nuclear@24: template nuclear@24: void DataSet::dataset_destroy_func(int id, void *cls) nuclear@24: { nuclear@24: DataSet *dset = (DataSet*)cls; nuclear@24: T data = (T)resman_get_res_data(dset->rman, id); nuclear@24: nuclear@24: if(dset->destroy) { nuclear@24: dset->destroy(data); nuclear@24: } nuclear@24: } nuclear@24: nuclear@15: } // namespace goatgfx