X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fmoof%2Fresource.hh;h=9d991053c21b841be3ebc164e6b538244c80bb82;hp=a269a2d04d46b6b9aea405563a2be7a2e836a005;hb=151f60a78d5e45c8d46c3e793fdefee306c6dc4c;hpb=bc795376d093ee097040f029b891b5435eb3bd21 diff --git a/src/moof/resource.hh b/src/moof/resource.hh index a269a2d..9d99105 100644 --- a/src/moof/resource.hh +++ b/src/moof/resource.hh @@ -17,9 +17,8 @@ * Interface for textures, sounds, and other types of resources. */ -#include "../config.h" +#include "config.h" -#include #include #include #include @@ -46,7 +45,7 @@ class resource { public: - // FIXME: this won't be necessary once the existing code is modified to + // XXX: this won't be necessary once the existing code is modified to // use the resource handles resource() {} @@ -63,19 +62,10 @@ public: * return, this is changed to an absolute path to the resource. * \return True if a path to a resource was found, false otherwise. */ - static bool find(const std::string& file); - - /** - * Get the path to a resource of a given name and open it if a resource - * was found. - * \param path The name of the resource to find. Upon successful - * return, this is changed to an absolute path to the resource. - * \param mode The open mode. - * \return The FILE* if the resource was found, 0 otherwise. - */ - static FILE* open_file(const std::string& path, - const std::string& mode = "rb"); + static std::string find_file(const std::string& name); + static std::string find_file(const std::string& name, + const std::string& ext); /** * Register a type with the extension of files which this type can @@ -84,11 +74,11 @@ public: * \param extension The file extension. */ template - static void register_type(const std::string& extension) + static void register_type(const std::string& extension, + const std::string& prefix = "") { - if (!type_lookup_) type_lookup_ = type_lookup_ptr(new type_lookup); - loader_ptr loader(new specific_loader); - (*type_lookup_)[extension] = loader; + loader_ptr loader(new specific_loader(prefix)); + call_registry(extension, loader, set); } /** @@ -99,11 +89,14 @@ public: */ static void unregister_type(const std::string& extension) { - type_lookup_->erase(extension); + loader_ptr loader; + call_registry(extension, loader, set); } - static resource_ptr load(const std::string& path); + static resource_ptr load(const std::string& name); + static resource_ptr load(const std::string& name, + const std::string& ext); static resource_ptr reload(std::string& path); @@ -165,16 +158,32 @@ public: private: + static resource_ptr load_with_path(const std::string& path); + class loader { public: + //loader() {} + loader(const std::string& prefix) : + prefix_(prefix) {} + virtual ~loader() {} virtual resource* load(const std::string& path) { return 0; } + + const std::string& prefix() const + { + return prefix_; + } + + + private: + + std::string prefix_; }; typedef boost::shared_ptr loader_ptr; @@ -184,8 +193,13 @@ private: { public: + //specific_loader() {} + specific_loader(const std::string& prefix) : + loader(prefix) {} + virtual resource* load(const std::string& path) { + log_info("loading resource of type ", typeid(T).name()); return new resource(new T(path)); } }; @@ -210,7 +224,7 @@ private: virtual ~specific_unloader() { - log_warning("unloading resource of type ", typeid(T).name()); + log_info("unloading resource of type ", typeid(T).name()); delete object_; } @@ -236,8 +250,19 @@ private: loader_ptr loader_; typedef std::map type_lookup; - typedef boost::shared_ptr type_lookup_ptr; - static type_lookup_ptr type_lookup_; + //typedef boost::shared_ptr type_lookup_ptr; + //static type_lookup_ptr type_lookup_; + //static type_lookup type_lookup_; + + enum registry_action + { + lookup, + set + }; + + static bool call_registry(const std::string& extension, + loader_ptr& loader, + registry_action action); #ifdef USE_HOTLOADING int wd_; @@ -272,6 +297,13 @@ public: resource_handle(resource_ptr ptr) : resource_(ptr) {} + explicit resource_handle(const std::string& name) : + resource_(resource::load(name)) {} + + resource_handle(const std::string& name, const std::string& ext) : + resource_(resource::load(name, ext)) {} + + /** * Get whether or not the handle is dereferenceable to the type of this @@ -329,6 +361,15 @@ public: } + /** + * Unload the resource associated with this handle. + */ + void unload() + { + resource_ = resource_ptr(); + } + + private: resource_ptr resource_;