added delayed init call after scenegraph/meshes are done loading
[laserbrain_demo] / src / dataset.inl
index 5f0fbf9..41277a1 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <string.h>
+#include "logger.h"
 
 template <typename T>
 DataSet<T>::DataSet(T (*create_func)(), bool (*load_func)(T, const char*), bool (*done_func)(T), void (*destr_func)(T))
@@ -45,10 +46,45 @@ T DataSet<T>::get(const char *name) const
        }
 
        T res = create();
-       resman_lookup(rman, name, res);
+       data[name] = res;
+       resman_add(rman, name, res);
        return res;
 }
 
+template <typename T>
+int DataSet<T>::pending() const
+{
+       return resman_pending(rman);
+}
+
+template <typename T>
+void DataSet<T>::wait() const
+{
+       resman_waitall(rman);
+}
+
+template <typename T>
+void DataSet<T>::add_loaded_callback(LoadedCallbackFunc func, void *cls)
+{
+       std::pair<LoadedCallbackFunc, void*> cb;
+       cb.first = func;
+       cb.second = cls;
+       loaded_cb.push_back(cb);
+}
+
+template <typename T>
+bool DataSet<T>::remove_loaded_callback(LoadedCallbackFunc func)
+{
+       int numcb = (int)loaded_cb.size();
+       for(int i=0; i<numcb; i++) {
+               if(loaded_cb[i].first == func) {
+                       loaded_cb.erase(loaded_cb.begin() + i);
+                       return true;
+               }
+       }
+       return false;
+}
+
 
 // --- static functions to pass as callback to resman ---
 
@@ -57,6 +93,7 @@ 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(!data) return -1;
 
        if(!dset->load(data, fname)) {
                return -1;
@@ -73,14 +110,19 @@ int DataSet<T>::dataset_done_func(int id, void *cls)
        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));
+               error_log("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));
+               info_log("done loading resource %d (%s)\n", id, resman_get_res_name(dset->rman, id));
        }
 
        if(dset->done) {
                dset->done(data);
        }
+
+       int numcb = (int)dset->loaded_cb.size();
+       for(int i=0; i<numcb; i++) {
+               dset->loaded_cb[i].first(data, dset->loaded_cb[i].second);
+       }
        return 0;
 }