OgreResource.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004     (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
00008 
00009 Permission is hereby granted, free of charge, to any person obtaining a copy
00010 of this software and associated documentation files (the "Software"), to deal
00011 in the Software without restriction, including without limitation the rights
00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00013 copies of the Software, and to permit persons to whom the Software is
00014 furnished to do so, subject to the following conditions:
00015 
00016 The above copyright notice and this permission notice shall be included in
00017 all copies or substantial portions of the Software.
00018 
00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00025 THE SOFTWARE.
00026 -----------------------------------------------------------------------------
00027 */
00028 #ifndef _Resource_H__
00029 #define _Resource_H__
00030 
00031 #include "OgrePrerequisites.h"
00032 #include "OgreString.h"
00033 #include "OgreSharedPtr.h"
00034 #include "OgreStringInterface.h"
00035 #include "OgreAtomicWrappers.h"
00036 
00037 namespace Ogre {
00038 
00039     typedef unsigned long long int ResourceHandle;
00040 
00041 
00042     // Forward declaration
00043     class ManualResourceLoader;
00044 
00077     class _OgreExport Resource : public StringInterface, public ResourceAlloc
00078     {
00079     public:
00080         OGRE_AUTO_MUTEX // public to allow external locking
00081         class Listener
00082         {
00083         public:
00084             Listener() {}
00085             virtual ~Listener() {}
00086 
00091             virtual void backgroundLoadingComplete(Resource*) {}
00092 
00097             virtual void backgroundPreparingComplete(Resource*) {}
00098 
00107             virtual void loadingComplete(Resource*) {}
00108 
00109 
00118             virtual void preparingComplete(Resource*) {}
00119 
00121             virtual void unloadingComplete(Resource*) {}
00122         };
00123         
00125         enum LoadingState
00126         {
00128             LOADSTATE_UNLOADED,
00130             LOADSTATE_LOADING,
00132             LOADSTATE_LOADED,
00134             LOADSTATE_UNLOADING,
00136             LOADSTATE_PREPARED,
00138             LOADSTATE_PREPARING
00139         };
00140     protected:
00142         ResourceManager* mCreator;
00144         String mName;
00146         String mGroup;
00148         ResourceHandle mHandle;
00150         AtomicScalar<LoadingState> mLoadingState;
00152         volatile bool mIsBackgroundLoaded;
00154         size_t mSize;
00156         bool mIsManual;
00158         String mOrigin;
00160         ManualResourceLoader* mLoader;
00162         size_t mStateCount;
00163 
00164         typedef set<Listener*>::type ListenerList;
00165         ListenerList mListenerList;
00166         OGRE_MUTEX(mListenerListMutex)
00167 
00168         
00170         Resource() 
00171             : mCreator(0), mHandle(0), mLoadingState(LOADSTATE_UNLOADED), 
00172             mIsBackgroundLoaded(false), mSize(0), mIsManual(0), mLoader(0)
00173         { 
00174         }
00175 
00182         virtual void preLoadImpl(void) {}
00189         virtual void postLoadImpl(void) {}
00190 
00194         virtual void preUnloadImpl(void) {}
00199         virtual void postUnloadImpl(void) {}
00200 
00203         virtual void prepareImpl(void) {}
00208         virtual void unprepareImpl(void) {}
00212         virtual void loadImpl(void) = 0;
00216         virtual void unloadImpl(void) = 0;
00218         virtual size_t calculateSize(void) const = 0;
00219 
00220     public:
00235         Resource(ResourceManager* creator, const String& name, ResourceHandle handle,
00236             const String& group, bool isManual = false, ManualResourceLoader* loader = 0);
00237 
00243         virtual ~Resource();
00244 
00259         virtual void prepare(bool backgroundThread = false);
00260 
00271         virtual void load(bool backgroundThread = false);
00272 
00278         virtual void reload(void);
00279 
00282         virtual bool isReloadable(void) const
00283         {
00284             return !mIsManual || mLoader;
00285         }
00286 
00289         virtual bool isManuallyLoaded(void) const
00290         {
00291             return mIsManual;
00292         }
00293 
00297         virtual void unload(void);
00298 
00301         virtual size_t getSize(void) const
00302         { 
00303             return mSize; 
00304         }
00305 
00308         virtual void touch(void);
00309 
00312         virtual const String& getName(void) const 
00313         { 
00314             return mName; 
00315         }
00316 
00317         virtual ResourceHandle getHandle(void) const
00318         {
00319             return mHandle;
00320         }
00321 
00324         virtual bool isPrepared(void) const 
00325         { 
00326             // No lock required to read this state since no modify
00327             return (mLoadingState.get() == LOADSTATE_PREPARED); 
00328         }
00329 
00332         virtual bool isLoaded(void) const 
00333         { 
00334             // No lock required to read this state since no modify
00335             return (mLoadingState.get() == LOADSTATE_LOADED); 
00336         }
00337 
00341         virtual bool isLoading() const
00342         {
00343             return (mLoadingState.get() == LOADSTATE_LOADING);
00344         }
00345 
00348         virtual LoadingState getLoadingState() const
00349         {
00350             return mLoadingState.get();
00351         }
00352 
00353 
00354 
00365         virtual bool isBackgroundLoaded(void) const { return mIsBackgroundLoaded; }
00366 
00375         virtual void setBackgroundLoaded(bool bl) { mIsBackgroundLoaded = bl; }
00376 
00386         virtual void escalateLoading();
00387 
00391         virtual void addListener(Listener* lis);
00392 
00396         virtual void removeListener(Listener* lis);
00397 
00399         virtual const String& getGroup(void) const { return mGroup; }
00400 
00408         virtual void changeGroupOwnership(const String& newGroup);
00409 
00411         virtual ResourceManager* getCreator(void) { return mCreator; }
00418         virtual const String& getOrigin(void) const { return mOrigin; }
00420         virtual void _notifyOrigin(const String& origin) { mOrigin = origin; }
00421 
00429         virtual size_t getStateCount() const { return mStateCount; }
00430 
00436         virtual void _dirtyState();
00437 
00438 
00447         virtual void _fireLoadingComplete(bool wasBackgroundLoaded);
00448 
00457         virtual void _firePreparingComplete(bool wasBackgroundLoaded);
00458 
00466         virtual void _fireUnloadingComplete(void);
00467 
00468 
00469     };
00470 
00489     typedef SharedPtr<Resource> ResourcePtr;
00490 
00512     class _OgreExport ManualResourceLoader
00513     {
00514     public:
00515         ManualResourceLoader() {}
00516         virtual ~ManualResourceLoader() {}
00517 
00524         virtual void prepareResource(Resource* resource)
00525                 { (void)resource; }
00526 
00530         virtual void loadResource(Resource* resource) = 0;
00531     };
00534 }
00535 
00536 #endif

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:26 2012