OGRE  2.0
Object-Oriented Graphics Rendering Engine
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
OgreResourceGroupManager.h
Go to the documentation of this file.
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of OGRE
4 (Object-oriented Graphics Rendering Engine)
5 For the latest info, see http://www.ogre3d.org/
6 
7 Copyright (c) 2000-2014 Torus Knot Software Ltd
8 
9 Permission is hereby granted, free of charge, to any person obtaining a copy
10 of this software and associated documentation files (the "Software"), to deal
11 in the Software without restriction, including without limitation the rights
12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 copies of the Software, and to permit persons to whom the Software is
14 furnished to do so, subject to the following conditions:
15 
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 THE SOFTWARE.
26 -----------------------------------------------------------------------------
27 */
28 #ifndef _ResourceGroupManager_H__
29 #define _ResourceGroupManager_H__
30 
31 #include "OgrePrerequisites.h"
32 #include "OgreSingleton.h"
33 #include "OgreDataStream.h"
34 #include "OgreArchive.h"
35 #include "OgreIteratorWrappers.h"
36 #include "OgreCommon.h"
38 #include <ctime>
39 #include "OgreHeaderPrefix.h"
40 
41 // If X11/Xlib.h gets included before this header (for example it happens when
42 // including wxWidgets and FLTK), Status is defined as an int which we don't
43 // want as we have an enum named Status.
44 #ifdef Status
45 #undef Status
46 #endif
47 
48 namespace Ogre {
49 
87  {
88  public:
90 
100  virtual void resourceGroupScriptingStarted(const String& groupName, size_t scriptCount) = 0;
108  virtual void scriptParseStarted(const String& scriptName, bool& skipThisScript) = 0;
109 
112  virtual void scriptParseEnded(const String& scriptName, bool skipped) = 0;
114  virtual void resourceGroupScriptingEnded(const String& groupName) = 0;
115 
121  virtual void resourceGroupPrepareStarted(const String& groupName, size_t resourceCount)
122  { (void)groupName; (void)resourceCount; }
123 
127  virtual void resourcePrepareStarted(const ResourcePtr& resource)
128  { (void)resource; }
129 
132  virtual void resourcePrepareEnded(void) {}
138  virtual void worldGeometryPrepareStageStarted(const String& description)
139  { (void)description; }
140 
145  virtual void worldGeometryPrepareStageEnded(void) {}
147  virtual void resourceGroupPrepareEnded(const String& groupName)
148  { (void)groupName; }
149 
155  virtual void resourceGroupLoadStarted(const String& groupName, size_t resourceCount) = 0;
159  virtual void resourceLoadStarted(const ResourcePtr& resource) = 0;
162  virtual void resourceLoadEnded(void) = 0;
168  virtual void worldGeometryStageStarted(const String& description) = 0;
173  virtual void worldGeometryStageEnded(void) = 0;
175  virtual void resourceGroupLoadEnded(const String& groupName) = 0;
179  virtual void resourceCreated(const ResourcePtr& resource)
180  { (void)resource; }
184  virtual void resourceRemove(const ResourcePtr& resource)
185  { (void)resource; }
186  };
187 
194  {
195  public:
197 
199  virtual DataStreamPtr resourceLoading(const String &name, const String &group, Resource *resource) = 0;
200 
206  virtual void resourceStreamOpened(const String &name, const String &group, Resource *resource, DataStreamPtr& dataStream) = 0;
207 
210  virtual bool resourceCollision(Resource *resource, ResourceManager *resourceManager) = 0;
211  };
212 
261  class _OgreExport ResourceGroupManager : public Singleton<ResourceGroupManager>, public ResourceAlloc
262  {
263  public:
264  OGRE_AUTO_MUTEX; // public to allow external locking
275  {
280  };
287  {
291  bool recursive;
292  };
295 
296  protected:
299 
303 
306 
308 
311 
316  {
317  enum Status
318  {
319  UNINITIALSED = 0,
320  INITIALISING = 1,
321  INITIALISED = 2,
322  LOADING = 3,
323  LOADED = 4
324  };
328  OGRE_MUTEX(statusMutex);
342  // Group by loading order of the type (defined by ResourceManager)
343  // (e.g. skeletons and materials before meshes)
350  // in global pool flag - if true the resource will be loaded even a different group was requested in the load method as a parameter.
352 
353  void addToIndex(const String& filename, Archive* arch);
354  void removeFromIndex(const String& filename, Archive* arch);
355  void removeFromIndex(Archive* arch);
356 
357  };
361 
364 
370  void parseResourceGroupScripts(ResourceGroup* grp);
375  void createDeclaredResources(ResourceGroup* grp);
377  void addCreatedResource(ResourcePtr& res, ResourceGroup& group);
379  ResourceGroup* getResourceGroup(const String& name);
381  void dropGroupContents(ResourceGroup* grp);
383  void deleteGroup(ResourceGroup* grp);
385  ResourceGroup* findGroupContainingResourceImpl(const String& filename);
387  void fireResourceGroupScriptingStarted(const String& groupName, size_t scriptCount);
389  void fireScriptStarted(const String& scriptName, bool &skipScript);
391  void fireScriptEnded(const String& scriptName, bool skipped);
393  void fireResourceGroupScriptingEnded(const String& groupName);
395  void fireResourceGroupLoadStarted(const String& groupName, size_t resourceCount);
397  void fireResourceLoadStarted(const ResourcePtr& resource);
399  void fireResourceLoadEnded(void);
401  void fireResourceGroupLoadEnded(const String& groupName);
403  void fireResourceGroupPrepareStarted(const String& groupName, size_t resourceCount);
405  void fireResourcePrepareStarted(const ResourcePtr& resource);
407  void fireResourcePrepareEnded(void);
409  void fireResourceGroupPrepareEnded(const String& groupName);
411  void fireResourceCreated(const ResourcePtr& resource);
413  void fireResourceRemove(const ResourcePtr& resource);
415  time_t resourceModifiedTime(ResourceGroup* group, const String& filename);
416 
421  bool resourceExists(ResourceGroup* group, const String& filename);
422 
425  public:
427  virtual ~ResourceGroupManager();
428 
466  void createResourceGroup(const String& name, const bool inGlobalPool = true);
467 
468 
508  void initialiseResourceGroup(const String& name);
509 
513  void initialiseAllResourceGroups(void);
514 
532  void prepareResourceGroup(const String& name, bool prepareMainResources = true,
533  bool prepareWorldGeom = true);
534 
552  void loadResourceGroup(const String& name, bool loadMainResources = true,
553  bool loadWorldGeom = true);
554 
570  void unloadResourceGroup(const String& name, bool reloadableOnly = true);
571 
583  void unloadUnreferencedResourcesInGroup(const String& name,
584  bool reloadableOnly = true);
585 
595  void clearResourceGroup(const String& name);
596 
602  void destroyResourceGroup(const String& name);
603 
611  bool isResourceGroupInitialised(const String& name);
612 
620  bool isResourceGroupLoaded(const String& name);
621 
622  /*** Verify if a resource group exists
623  @param name The name of the resource group to look for
624  */
625  bool resourceGroupExists(const String& name);
626 
648  void addResourceLocation(const String& name, const String& locType,
649  const String& resGroup = DEFAULT_RESOURCE_GROUP_NAME, bool recursive = false, bool readOnly = true);
651  void removeResourceLocation(const String& name,
652  const String& resGroup = DEFAULT_RESOURCE_GROUP_NAME);
654  bool resourceLocationExists(const String& name,
655  const String& resGroup = DEFAULT_RESOURCE_GROUP_NAME);
656 
691  void declareResource(const String& name, const String& resourceType,
692  const String& groupName = DEFAULT_RESOURCE_GROUP_NAME,
693  const NameValuePairList& loadParameters = NameValuePairList());
733  void declareResource(const String& name, const String& resourceType,
734  const String& groupName, ManualResourceLoader* loader,
735  const NameValuePairList& loadParameters = NameValuePairList());
746  void undeclareResource(const String& name, const String& groupName);
747 
767  DataStreamPtr openResource(const String& resourceName,
768  const String& groupName = DEFAULT_RESOURCE_GROUP_NAME,
769  bool searchGroupsIfNotFound = true, Resource* resourceBeingLoaded = 0);
770 
782  DataStreamListPtr openResources(const String& pattern,
783  const String& groupName = DEFAULT_RESOURCE_GROUP_NAME);
784 
793  StringVectorPtr listResourceNames(const String& groupName, bool dirs = false);
794 
801  FileInfoListPtr listResourceFileInfo(const String& groupName, bool dirs = false);
802 
814  StringVectorPtr findResourceNames(const String& groupName, const String& pattern,
815  bool dirs = false);
816 
821  bool resourceExists(const String& group, const String& filename);
822 
826  bool resourceExistsInAnyGroup(const String& filename);
827 
834  const String& findGroupContainingResource(const String& filename);
835 
845  FileInfoListPtr findResourceFileInfo(const String& group, const String& pattern,
846  bool dirs = false);
847 
849  time_t resourceModifiedTime(const String& group, const String& filename);
854  StringVectorPtr listResourceLocations(const String& groupName);
855 
862  StringVectorPtr findResourceLocation(const String& groupName, const String& pattern);
863 
878  DataStreamPtr createResource(const String& filename, const String& groupName = DEFAULT_RESOURCE_GROUP_NAME,
879  bool overwrite = false, const String& locationPattern = BLANKSTRING);
880 
890  void deleteResource(const String& filename, const String& groupName = DEFAULT_RESOURCE_GROUP_NAME,
891  const String& locationPattern = BLANKSTRING);
892 
902  void deleteMatchingResources(const String& filePattern, const String& groupName = DEFAULT_RESOURCE_GROUP_NAME,
903  const String& locationPattern = BLANKSTRING);
904 
908  void addResourceGroupListener(ResourceGroupListener* l);
910  void removeResourceGroupListener(ResourceGroupListener* l);
911 
918  void setWorldResourceGroupName(const String& groupName) {mWorldGroupName = groupName;}
919 
921  const String& getWorldResourceGroupName(void) const { return mWorldGroupName; }
922 
936  void linkWorldGeometryToResourceGroup(const String& group,
937  const String& worldGeometry, SceneManager* sceneManager);
938 
943  void unlinkWorldGeometryFromResourceGroup(const String& group);
944 
952  bool isResourceGroupInGlobalPool(const String& name);
953 
955  void shutdownAll(void);
956 
957 
967  void _registerResourceManager(const String& resourceType, ResourceManager* rm);
968 
975  void _unregisterResourceManager(const String& resourceType);
976 
980  { return ResourceManagerIterator(
981  mResourceManagerMap.begin(), mResourceManagerMap.end()); }
982 
987  void _registerScriptLoader(ScriptLoader* su);
988 
992  void _unregisterScriptLoader(ScriptLoader* su);
993 
997  ScriptLoader *_findScriptLoader(const String &pattern);
998 
1002  ResourceManager* _getResourceManager(const String& resourceType);
1003 
1007  void _notifyResourceCreated(ResourcePtr& res);
1008 
1012  void _notifyResourceRemoved(ResourcePtr& res);
1013 
1016  void _notifyResourceGroupChanged(const String& oldGroup, Resource* res);
1017 
1022  void _notifyAllResourcesRemoved(ResourceManager* manager);
1023 
1031  void _notifyWorldGeometryStageStarted(const String& description);
1039  void _notifyWorldGeometryStageEnded(void);
1040 
1046  StringVector getResourceGroups(void);
1053  ResourceDeclarationList getResourceDeclarationList(const String& groupName);
1054 
1059  const LocationList& getResourceLocationList(const String& groupName);
1060 
1062  void setLoadingListener(ResourceLoadingListener *listener);
1064  ResourceLoadingListener *getLoadingListener();
1065 
1081  static ResourceGroupManager& getSingleton(void);
1097  static ResourceGroupManager* getSingletonPtr(void);
1098 
1099  };
1102 }
1103 
1104 #include "OgreHeaderSuffix.h"
1105 
1106 #endif
virtual void resourcePrepareEnded(void)
This event is fired when the resource has been prepared.
ResourceGroup * mCurrentGroup
Stored current group - optimisation for when bulk loading a group.
map< Real, LoadUnloadResourceList * >::type LoadResourceOrderMap
Created resources which are ready to be loaded / unloaded.
virtual void resourcePrepareStarted(const ResourcePtr &resource)
This event is fired when a declared resource is about to be prepared.
#define _OgreExport
Definition: OgrePlatform.h:255
virtual bool resourceCollision(Resource *resource, ResourceManager *resourceManager)=0
This event is called when a resource collides with another existing one in a resource manager...
virtual void worldGeometryPrepareStageEnded(void)
This event is fired when a stage of preparing linked world geometry has been completed.
map< String, String >::type NameValuePairList
Name / value parameter pair (first = name, second = value)
Definition: OgreCommon.h:580
void setWorldResourceGroupName(const String &groupName)
Sets the resource group that 'world' resources will use.
#define OGRE_MUTEX(name)
list< ResourceLocation * >::type LocationList
List of possible file locations.
Template class for creating single-instance global classes.
Definition: OgreSingleton.h:64
map< String, ResourceManager * >::type ResourceManagerMap
Manages the organisation and rendering of a 'scene' i.e.
static String AUTODETECT_RESOURCE_GROUP_NAME
Special resource group name which causes resource group to be automatically determined based on searc...
static String DEFAULT_RESOURCE_GROUP_NAME
Default resource group name.
MapIterator< ResourceManagerMap > ResourceManagerIterator
ResourceManagerMap mResourceManagerMap
Map of resource types (strings) to ResourceManagers, used to notify them to load / unload group conte...
ScriptLoaderOrderMap mScriptLoaderOrderMap
OGRE_AUTO_MUTEX
General mutex for dealing with group content.
map< String, ResourceGroup * >::type ResourceGroupMap
Map from resource group names to groups.
Interface describing a manual resource loader.
Definition: OgreResource.h:498
virtual void worldGeometryPrepareStageStarted(const String &description)
This event is fired when a stage of preparing linked world geometry is about to start.
ResourceGroupListenerList mResourceGroupListenerList
const String BLANKSTRING
Constant blank string, useful for returning by ref where local does not exist.
Definition: OgreCommon.h:574
ResourceLocationIndex resourceIndexCaseSensitive
Index of resource names to locations, built for speedy access (case sensitive archives) ...
virtual void resourceRemove(const ResourcePtr &resource)
This event is fired when a resource is about to be removed.
Concrete IteratorWrapper for nonconst access to the underlying key-value container.
static String INTERNAL_RESOURCE_GROUP_NAME
Internal resource group name (should be used by OGRE internal only)
ResourceDeclarationList resourceDeclarations
Pre-declared resources, ready to be created.
virtual void resourceGroupPrepareEnded(const String &groupName)
This event is fired when a resource group finished preparing.
virtual void resourceCreated(const ResourcePtr &resource)
This event is fired when a resource was just created.
virtual void resourceStreamOpened(const String &name, const String &group, Resource *resource, DataStreamPtr &dataStream)=0
This event is called when a resource stream has been opened, but not processed yet.
Abstract class defining the interface used by classes which wish to perform script loading to define ...
LocationList locationList
List of possible locations to search.
String mWorldGroupName
Group name for world resources.
Superclass for all objects that wish to use custom memory allocators when their new / delete operator...
list< ResourcePtr >::type LoadUnloadResourceList
List of resources which can be loaded / unloaded.
bool recursive
Whether this location was added recursively.
vector< ResourceGroupListener * >::type ResourceGroupListenerList
Archive * archive
Pointer to the archive which is the destination.
vector< String >::type StringVector
ResourceLocationIndex resourceIndexCaseInsensitive
Index of resource names to locations, built for speedy access (case insensitive archives) ...
list< ResourceDeclaration >::type ResourceDeclarationList
List of resource declarations.
ResourceManagerIterator getResourceManagerIterator()
Get an iterator over the registered resource managers.
map< String, Archive * >::type ResourceLocationIndex
Resource index entry, resourcename->location.
multimap< Real, ScriptLoader * >::type ScriptLoaderOrderMap
Map of loading order (Real) to ScriptLoader, used to order script parsing.
Abstract class representing a loadable resource (e.g.
Definition: OgreResource.h:77
virtual DataStreamPtr resourceLoading(const String &name, const String &group, Resource *resource)=0
This event is called when a resource beings loading.
SceneManager * worldGeometrySceneManager
Scene manager to use with linked world geometry.
Nested struct defining a resource declaration.
String worldGeometry
Linked world geometry, as passed to setWorldGeometry.
This singleton class manages the list of resource groups, and notifying the various resource managers...
Defines a generic resource handler.
static size_t RESOURCE_SYSTEM_NUM_REFERENCE_COUNTS
The number of reference counts held per resource by the resource system.
Archive-handling class.
Definition: OgreArchive.h:86
This abstract class defines an interface which is called back during resource group loading to indica...
ResourceLoadingListener * mLoadingListener
_StringBase String
Definition: OgreCommon.h:53
const String & getWorldResourceGroupName(void) const
Gets the resource group that 'world' resources will use.
virtual void resourceGroupPrepareStarted(const String &groupName, size_t resourceCount)
This event is fired when a resource group begins preparing.