fixed bugs in the resource manager and removed the hardcoded textures
[laserbrain_demo] / src / dataset.inl
1 #include <stdio.h>
2 #include <string.h>
3
4 template <typename T>
5 DataSet<T>::DataSet(T (*create_func)(), bool (*load_func)(T, const char*), bool (*done_func)(T), void (*destr_func)(T))
6 {
7         create = create_func;
8         load = load_func;
9         done = done_func;
10         destroy = destr_func;
11
12         rman = resman_create();
13         resman_set_load_func(rman, dataset_load_func, this);
14         resman_set_done_func(rman, dataset_done_func, this);
15         resman_set_destroy_func(rman, dataset_destroy_func, this);
16 }
17
18 template <typename T>
19 DataSet<T>::~DataSet()
20 {
21         resman_free(rman);
22 }
23
24 template <typename T>
25 void DataSet<T>::clear()
26 {
27         resman_free(rman);
28         data.clear();
29
30         rman = resman_create();
31 }
32
33 template <typename T>
34 void DataSet<T>::update()
35 {
36         resman_poll(rman);
37 }
38
39 template <typename T>
40 T DataSet<T>::get(const char *name) const
41 {
42         typename std::map<std::string, T>::const_iterator iter = data.find(name);
43         if(iter != data.end()) {
44                 return iter->second;
45         }
46
47         T res = create();
48         data[name] = res;
49         resman_lookup(rman, name, res);
50         return res;
51 }
52
53
54 // --- static functions to pass as callback to resman ---
55
56 template <typename T>
57 int DataSet<T>::dataset_load_func(const char *fname, int id, void *cls)
58 {
59         DataSet<T> *dset = (DataSet<T>*)cls;
60         T data = (T)resman_get_res_data(dset->rman, id);
61
62         if(!dset->load(data, fname)) {
63                 return -1;
64         }
65         return 0;
66 }
67
68 template <typename T>
69 int DataSet<T>::dataset_done_func(int id, void *cls)
70 {
71         DataSet<T> *dset = (DataSet<T>*)cls;
72
73         T data = (T)resman_get_res_data(dset->rman, id);
74         int load_res = resman_get_res_result(dset->rman, id);
75
76         if(load_res != 0) {
77                 fprintf(stderr, "failed to load resource %d (%s)\n", id, resman_get_res_name(dset->rman, id));
78         } else {
79                 printf("done loading resource %d (%s)\n", id, resman_get_res_name(dset->rman, id));
80         }
81
82         if(dset->done) {
83                 dset->done(data);
84         }
85         return 0;
86 }
87
88 template <typename T>
89 void DataSet<T>::dataset_destroy_func(int id, void *cls)
90 {
91         DataSet<T> *dset = (DataSet<T>*)cls;
92         T data = (T)resman_get_res_data(dset->rman, id);
93
94         if(dset->destroy) {
95                 dset->destroy(data);
96         }
97 }