1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#pragma once
4
5#include "BsPrerequisites.h"
6#include "Utility/BsModule.h"
7#include "Resources/BsResources.h"
8
9namespace bs
10{
11 /** @addtogroup Resources-Engine-Internal
12 * @{
13 */
14
15 /**
16 * Provides a way to map one resource path to another path. Useful if the resources are being referenced using a path
17 * that is not the path to their physical location.
18 */
19 class BS_EXPORT ResourceMapping : public IReflectable
20 {
21 public:
22 /** Returns the resource path map. */
23 const UnorderedMap<Path, Path>& getMap() const { return mMapping; }
24
25 /** Adds a new entry to the resource map. Translated from path @p from to path @p to. */
26 void add(const Path& from, const Path& to);
27
28 /** Creates a new empty resource mapping. */
29 static SPtr<ResourceMapping> create();
30 private:
31 UnorderedMap<Path, Path> mMapping;
32
33 /************************************************************************/
34 /* RTTI */
35 /************************************************************************/
36 public:
37 friend class ResourceMappingRTTI;
38 static RTTITypeBase* getRTTIStatic();
39 RTTITypeBase* getRTTI() const override;
40 };
41
42 /** Interface that can be implemented by the resource loaders required by GameResourceManager. */
43 class BS_EXPORT IGameResourceLoader
44 {
45 public:
46 virtual ~IGameResourceLoader() = default;
47
48 /** Loads the resource at the specified path. */
49 virtual HResource load(const Path& path, ResourceLoadFlags flags, bool async) const = 0;
50
51 /** @copydoc GameResourceManager::setMapping */
52 virtual void setMapping(const SPtr<ResourceMapping>& mapping) { }
53 };
54
55 /** Handles loading of game resources when the standalone game is running. */
56 class BS_EXPORT StandaloneResourceLoader : public IGameResourceLoader
57 {
58 public:
59 /** @copydoc IGameResourceLoader::load */
60 HResource load(const Path& path, ResourceLoadFlags flags, bool async) const override;
61
62 /** @copydoc IGameResourceLoader::setMapping */
63 void setMapping(const SPtr<ResourceMapping>& mapping) override;
64
65 private:
66 UnorderedMap<Path, Path> mMapping;
67 };
68
69 /**
70 * Keeps track of resources that can be dynamically loaded during runtime. These resources will be packed with the game
71 * build so that they're available on demand.
72 *
73 * Internal resource handle can be overridden so that editor or other systems can handle resource loading more directly.
74 */
75 class BS_EXPORT GameResourceManager : public Module<GameResourceManager>
76 {
77 public:
78 GameResourceManager();
79
80 /**
81 * Loads the resource at the specified path.
82 *
83 * @see Resources::load
84 */
85 HResource load(const Path& path, ResourceLoadFlags flags, bool async) const;
86
87 /** @copydoc load */
88 template <class T>
89 ResourceHandle<T> load(const Path& filePath, ResourceLoadFlags flags, bool async)
90 {
91 return static_resource_cast<T>(load(filePath, flags, async));
92 }
93
94 /**
95 * Sets an optional mapping that be applied to any path provided to load(). This allows you to reference files
96 * using different names and/or folder structure than they are actually in.
97 *
98 * For example normally in script code you would reference resources based on their path relative to the project
99 * resoruces folder, but in standalone there is no such folder and we need to map the values.
100 *
101 * Provided paths should be relative to the working directory.
102 */
103 void setMapping(const SPtr<ResourceMapping>& mapping);
104
105 /** Sets the resource loader implementation that determines how are the paths provided to load() loaded. */
106 void setLoader(const SPtr<IGameResourceLoader>& loader);
107
108 private:
109 SPtr<IGameResourceLoader> mLoader;
110 };
111
112 /** @} */
113}
114