diff --git a/doc/snippets/Magnum.cpp b/doc/snippets/Magnum.cpp index aa116d68f..9def1837a 100644 --- a/doc/snippets/Magnum.cpp +++ b/doc/snippets/Magnum.cpp @@ -26,6 +26,9 @@ #include "Magnum/Image.h" #include "Magnum/PixelFormat.h" #ifdef MAGNUM_TARGET_GL +#include "Magnum/ResourceManager.h" +#include "Magnum/GL/AbstractShaderProgram.h" +#include "Magnum/GL/Mesh.h" #include "Magnum/GL/PixelFormat.h" #include "Magnum/GL/Texture.h" #endif @@ -33,6 +36,28 @@ using namespace Magnum; using namespace Magnum::Math::Literals; +#ifdef MAGNUM_TARGET_GL +Containers::Pointer mesh; +bool found = false; + +/* [AbstractResourceLoader-implementation] */ +class MeshResourceLoader: public AbstractResourceLoader { + void doLoad(ResourceKey key) override { + // Load the mesh... + + // Not found + if(!found) { + setNotFound(key); + return; + } + + // Found, pass it to resource manager + set(key, std::move(mesh)); + } +}; +/* [AbstractResourceLoader-implementation] */ +#endif + int main() { { @@ -176,4 +201,63 @@ CompressedImage2D image = texture.compressedImage(0, {}); } #endif +#ifdef MAGNUM_TARGET_GL +{ +/* [ResourceManager-typedef] */ +typedef ResourceManager + MyResourceManager; +MyResourceManager manager; +/* [ResourceManager-typedef] */ +} + +{ +typedef ResourceManager + MyResourceManager; +struct MyShader: GL::AbstractShaderProgram { + void bindTexture(GL::Texture2D&) {} +}; +/* [ResourceManager-fill] */ +MyResourceManager& manager = MyResourceManager::instance(); +Resource texture{manager.get("texture")}; +Resource shader = + manager.get("shader"); +Resource cube = manager.get("cube"); + +// The manager doesn't have data for the cube yet, add them +if(!cube) { + GL::Mesh mesh; + // ... + manager.set(cube.key(), std::move(mesh)); +} +/* [ResourceManager-fill] */ + +/* [ResourceManager-use] */ +shader->bindTexture(*texture); +cube->draw(*shader); +/* [ResourceManager-use] */ +} + +{ +ResourceManager manager; +struct MyShader: GL::AbstractShaderProgram {}; +/* [ResourceManager-get-derived] */ +Resource shader = + manager.get("shader"); +/* [ResourceManager-get-derived] */ +} + +{ +typedef ResourceManager MyResourceManager; +/* [AbstractResourceLoader-use] */ +MyResourceManager manager; +Containers::Pointer loader; + +manager.setLoader(std::move(loader)); + +// This will now automatically request the mesh from loader by calling load() +Resource myMesh = manager.get("my-mesh"); +/* [AbstractResourceLoader-use] */ +} +#endif + } diff --git a/src/Magnum/AbstractResourceLoader.h b/src/Magnum/AbstractResourceLoader.h index a5699eb8c..d33961160 100644 --- a/src/Magnum/AbstractResourceLoader.h +++ b/src/Magnum/AbstractResourceLoader.h @@ -65,22 +65,7 @@ keys. Example implementation for synchronous mesh loader: -@code{.cpp} -class MeshResourceLoader: public AbstractResourceLoader { - void doLoad(ResourceKey key) override { - // Load the mesh... - - // Not found - if(!found) { - setNotFound(key); - return; - } - - // Found, pass it to resource manager - set(key, mesh, state, policy); - } -}; -@endcode +@snippet Magnum.cpp AbstractResourceLoader-implementation You can then add it to resource manager instance like this. Note that the manager automatically deletes the all loaders on destruction before unloading @@ -89,18 +74,7 @@ having to delete the loader explicitly to ensure proper resource unloading. In the following code, however, the loader destroys itself (and removes itself from the manager) before the manager is destroyed. -@code{.cpp} -MyResourceManager manager; -MeshResourceLoader loader; - -manager->setLoader(&loader); - -// This will now automatically request the mesh from loader by calling load() -Resource myMesh = manager->get("my-mesh"); -@endcode - -@todoc How about working with resources of different data types (i.e. mesh - buffers), should that be allowed? +@snippet Magnum.cpp AbstractResourceLoader-use */ template class AbstractResourceLoader { public: diff --git a/src/Magnum/ResourceManager.h b/src/Magnum/ResourceManager.h index 29036bb09..88cfe0b1d 100644 --- a/src/Magnum/ResourceManager.h +++ b/src/Magnum/ResourceManager.h @@ -218,10 +218,7 @@ Basic usage is:
  • Typedef'ing manager of desired types, creating its instance. - @code{.cpp} - typedef ResourceManager MyResourceManager; - MyResourceManager manager; - @endcode + @snippet Magnum.cpp ResourceManager-typedef
  • Filling the manager with resource data and acquiring the resources. Note @@ -229,27 +226,12 @@ Basic usage is: contains the data for it, as long as the resource data are not accessed (or fallback is provided). - @code{.cpp} - MyResourceManager& manager = MyResourceManager::instance(); - Resource texture{manager.get("texture")}; - Resource shader{manager.get("shader")}; - Resource cube{manager.get("cube")}; - - // The manager doesn't have data for the cube yet, add them - if(!cube) { - Mesh* mesh = new Mesh; - // ... - manager.set(cube.key(), mesh, ResourceDataState::Final, ResourcePolicy::Resident); - } - @endcode + @snippet Magnum.cpp ResourceManager-fill
  • Using the resource data. - @code{.cpp} - shader->setTexture(*texture); - cube->draw(*shader); - @endcode + @snippet Magnum.cpp ResourceManager-use
  • Destroying resource references and deleting manager instance when nothing @@ -303,9 +285,7 @@ template class ResourceManager: private Implementation::Resource * can be defined to cast the type automatically when accessing the * data. This is commonly used for shaders, e.g.: * - * @code{.cpp} - * Resource shader = manager->get("shader"); - * @endcode + * @snippet Magnum.cpp ResourceManager-get-derived */ template Resource get(ResourceKey key) { return this->Implementation::ResourceManagerData::template get(key);