shadows, textures, resource managers... shaders...
[antikythera] / src / dataset.inl
diff --git a/src/dataset.inl b/src/dataset.inl
new file mode 100644 (file)
index 0000000..5f0fbf9
--- /dev/null
@@ -0,0 +1,96 @@
+#include <stdio.h>
+#include <string.h>
+
+template <typename T>
+DataSet<T>::DataSet(T (*create_func)(), bool (*load_func)(T, const char*), bool (*done_func)(T), void (*destr_func)(T))
+{
+       create = create_func;
+       load = load_func;
+       done = done_func;
+       destroy = destr_func;
+
+       rman = resman_create();
+       resman_set_load_func(rman, dataset_load_func, this);
+       resman_set_done_func(rman, dataset_done_func, this);
+       resman_set_destroy_func(rman, dataset_destroy_func, this);
+}
+
+template <typename T>
+DataSet<T>::~DataSet()
+{
+       resman_free(rman);
+}
+
+template <typename T>
+void DataSet<T>::clear()
+{
+       resman_free(rman);
+       data.clear();
+
+       rman = resman_create();
+}
+
+template <typename T>
+void DataSet<T>::update()
+{
+       resman_poll(rman);
+}
+
+template <typename T>
+T DataSet<T>::get(const char *name) const
+{
+       typename std::map<std::string, T>::const_iterator iter = data.find(name);
+       if(iter != data.end()) {
+               return iter->second;
+       }
+
+       T res = create();
+       resman_lookup(rman, name, res);
+       return res;
+}
+
+
+// --- static functions to pass as callback to resman ---
+
+template <typename T>
+int DataSet<T>::dataset_load_func(const char *fname, int id, void *cls)
+{
+       DataSet<T> *dset = (DataSet<T>*)cls;
+       T data = (T)resman_get_res_data(dset->rman, id);
+
+       if(!dset->load(data, fname)) {
+               return -1;
+       }
+       return 0;
+}
+
+template <typename T>
+int DataSet<T>::dataset_done_func(int id, void *cls)
+{
+       DataSet<T> *dset = (DataSet<T>*)cls;
+
+       T data = (T)resman_get_res_data(dset->rman, id);
+       int load_res = resman_get_res_result(dset->rman, id);
+
+       if(load_res != 0) {
+               fprintf(stderr, "failed to load resource %d (%s)\n", id, resman_get_res_name(dset->rman, id));
+       } else {
+               printf("done loading resource %d (%s)\n", id, resman_get_res_name(dset->rman, id));
+       }
+
+       if(dset->done) {
+               dset->done(data);
+       }
+       return 0;
+}
+
+template <typename T>
+void DataSet<T>::dataset_destroy_func(int id, void *cls)
+{
+       DataSet<T> *dset = (DataSet<T>*)cls;
+       T data = (T)resman_get_res_data(dset->rman, id);
+
+       if(dset->destroy) {
+               dset->destroy(data);
+       }
+}