OgreResourceBackgroundQueue.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 __ResourceBackgroundQueue_H__
00029 #define __ResourceBackgroundQueue_H__
00030 
00031 
00032 #include "OgrePrerequisites.h"
00033 #include "OgreCommon.h"
00034 #include "OgreSingleton.h"
00035 #include "OgreResource.h"
00036 #include "OgreWorkQueue.h"
00037 
00038 namespace Ogre {
00046 
00047     typedef WorkQueue::RequestID BackgroundProcessTicket;
00048 
00050     struct BackgroundProcessResult
00051     {
00053         bool error;
00055         String message;
00056 
00057         BackgroundProcessResult() : error(false) {}
00058     };
00059 
00060     
00080     class _OgreExport ResourceBackgroundQueue : public Singleton<ResourceBackgroundQueue>, public ResourceAlloc, 
00081         public WorkQueue::RequestHandler, public WorkQueue::ResponseHandler
00082     {
00083     public:
00092         class _OgreExport Listener
00093         {
00094         public:
00101             virtual void operationCompleted(BackgroundProcessTicket ticket, const BackgroundProcessResult& result) = 0;
00103             virtual ~Listener() {}
00104 
00105         };
00106 
00107     protected:
00108 
00109         uint16 mWorkQueueChannel;
00111         enum RequestType
00112         {
00113             RT_INITIALISE_GROUP = 0,
00114             RT_INITIALISE_ALL_GROUPS = 1,
00115             RT_PREPARE_GROUP = 2,
00116             RT_PREPARE_RESOURCE = 3,
00117             RT_LOAD_GROUP = 4,
00118             RT_LOAD_RESOURCE = 5,
00119             RT_UNLOAD_GROUP = 6,
00120             RT_UNLOAD_RESOURCE = 7
00121         };
00123         struct ResourceRequest
00124         {
00125             RequestType type;
00126             String resourceName;
00127             ResourceHandle resourceHandle;
00128             String resourceType;
00129             String groupName;
00130             bool isManual; 
00131             ManualResourceLoader* loader;
00132             NameValuePairList* loadParams;
00133             Listener* listener;
00134             BackgroundProcessResult result;
00135 
00136             _OgreExport friend std::ostream& operator<<(std::ostream& o, const ResourceRequest& r)
00137             { (void)r; return o; }
00138         };
00139 
00140         typedef set<BackgroundProcessTicket>::type OutstandingRequestSet;   
00141         OutstandingRequestSet mOutstandingRequestSet;
00142 
00144         struct ResourceResponse
00145         {
00146             ResourceResponse(ResourcePtr r, const ResourceRequest& req)
00147                 : resource(r), request(req)
00148             {}
00149 
00150             ResourcePtr resource;
00151             ResourceRequest request;
00152 
00153             _OgreExport friend std::ostream& operator<<(std::ostream& o, const ResourceResponse& r)
00154             { (void)r; return o; }
00155         };
00156 
00157         BackgroundProcessTicket addRequest(ResourceRequest& req);
00158 
00159     public:
00160         ResourceBackgroundQueue();
00161         virtual ~ResourceBackgroundQueue();
00162 
00166         virtual void initialise(void);
00167 
00171         virtual void shutdown(void);
00172 
00181         virtual BackgroundProcessTicket initialiseResourceGroup(
00182             const String& name, Listener* listener = 0);
00183 
00192         virtual BackgroundProcessTicket initialiseAllResourceGroups( 
00193             Listener* listener = 0);
00202         virtual BackgroundProcessTicket prepareResourceGroup(const String& name, 
00203             Listener* listener = 0);
00204 
00213         virtual BackgroundProcessTicket loadResourceGroup(const String& name, 
00214             Listener* listener = 0);
00215 
00216 
00223         virtual BackgroundProcessTicket unload(
00224             const String& resType, const String& name, 
00225             Listener* listener = 0);
00226 
00233         virtual BackgroundProcessTicket unload(
00234             const String& resType, ResourceHandle handle, 
00235             Listener* listener = 0);
00236 
00243         virtual BackgroundProcessTicket unloadResourceGroup(const String& name, 
00244             Listener* listener = 0);
00245 
00246 
00262         virtual BackgroundProcessTicket prepare(
00263             const String& resType, const String& name, 
00264             const String& group, bool isManual = false, 
00265             ManualResourceLoader* loader = 0, 
00266             const NameValuePairList* loadParams = 0, 
00267             Listener* listener = 0);
00268 
00284         virtual BackgroundProcessTicket load(
00285             const String& resType, const String& name, 
00286             const String& group, bool isManual = false, 
00287             ManualResourceLoader* loader = 0, 
00288             const NameValuePairList* loadParams = 0, 
00289             Listener* listener = 0);
00303         virtual bool isProcessComplete(BackgroundProcessTicket ticket);
00304 
00307         void abortRequest( BackgroundProcessTicket ticket );
00308 
00310         bool canHandleRequest(const WorkQueue::Request* req, const WorkQueue* srcQ);
00312         WorkQueue::Response* handleRequest(const WorkQueue::Request* req, const WorkQueue* srcQ);
00314         bool canHandleResponse(const WorkQueue::Response* res, const WorkQueue* srcQ);
00316         void handleResponse(const WorkQueue::Response* res, const WorkQueue* srcQ);
00317 
00333         static ResourceBackgroundQueue& getSingleton(void);
00349         static ResourceBackgroundQueue* getSingletonPtr(void);
00350 
00351     };
00352 
00356 }
00357 
00358 #endif
00359 

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