2
* Copyright 2010 Inalogic Inc.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License version 3, as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranties of
10
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11
* PURPOSE. See the applicable version of the GNU Lesser General Public
12
* License for more details.
14
* You should have received a copy of both the GNU Lesser General Public
15
* License version 3 along with this program. If not, see
16
* <http://www.gnu.org/licenses/>
18
* Authored by: Jay Taoko <jay.taoko_AT_gmail_DOT_com>
23
#ifndef GLRESOURCEMANAGER_H
24
#define GLRESOURCEMANAGER_H
30
// class NRectangleTexture;
31
// class NTextureCube;
32
// class NTextureVolume;
33
// class NAnimatedTexture;
35
// class NVertexBuffer;
36
// class NIndexBuffer;
38
// class NGLTexture2D;
39
// class NGLRectangleTexture;
40
// class NGLTextureCube;
41
// class NGLTextureVolume;
42
// class NGLAnimatedTexture;
44
// NResource NGLResource
46
// NTexture NGLTexture
48
// NTexture2D NGLTexture2D
55
// TGLResourceFactory<class NTexture2D, class NGLTexture2D>
60
// TResourceCache<class IdType(int), class ResourceType(NGLResource)>
62
// NResourceCache: TResourceCache<int, NGLResource>
66
//! Device independent base resource.
67
class NResource: public NRefCount
69
DECLARE_ROOT_OBJECT_TYPE(NResource);
72
virtual NString GetResourceName() { return NString(TEXT("")); }
73
unsigned int GetResourceIndex() const;
75
unsigned int m_ResourceIndex;
84
virtual ~NResourceSet(){};
87
NGLResource* FirstResource;
90
virtual void Flush() {}
92
// FreeResource - Called when a potentially cached resource has been freed.
93
virtual void FreeResource(NResource* Resource) {}
95
// FlushResource - Removes a resource from the set.
96
virtual void FlushResource(NGLResource* Resource) {}
98
friend class NGLResource;
101
enum EResourceUpdateHint
103
RUH_Static, // The resource is updated once, at creation time.
104
RUH_CacheableDynamic, // The resource is updated occasionally, but not every frame.
105
RUH_Dynamic // The resource changes every frame.
108
class NGLResource: public NRefCount
110
DECLARE_ROOT_OBJECT_TYPE(NGLResource);
113
NGLResource(NResourceSet* InSet);
114
virtual ~NGLResource();
116
virtual NString GetSubTypeDescription() { return NString(TEXT("Resource")); }
117
virtual NString GetTypeDescription() { return NString(TEXT("Resource")); }
119
//! Returns the size in bytes of the resource.
120
/*! Returns the size in bytes of the resource.
121
@return Size of the resource in bytes.
123
virtual unsigned int GetSize() const { return Size; }
125
//! Returns the size of the max LOD of the resource.
127
Returns the size of the max LOD of the resource. For a texture, this is the size of mipmap 0.
128
Texture resource overwrite this function.
129
@return Size of the resource in bytes.
131
virtual unsigned int GetMaxLodSize() const { return Size; }
134
Updates the resource.
136
virtual bool UpdateResource(NResource* Resource) = 0;
141
unsigned int NumRefs;
143
NObjectType* ResourceType;
146
EResourceUpdateHint UpdateHint;
148
NGLResource* PrevResource;
149
NGLResource* NextResource;
151
template<class IdType, class ResourceType>
152
friend class TResourceCache;
153
friend class NResourceCache;
157
//! Device independent resource factory.
158
class NResourceFactory
161
NResourceFactory(NObjectType* Type)
162
: m_ResourceType(Type)
165
// Returns the resource type for this factory
166
const NObjectType& Type() const
168
return *m_ResourceType;
172
Returns true if the given NResource is created by this factory.
173
@param Resource - the resource in question.
175
bool BuildsThisResource(NResource* Resource)
177
return Resource->Type().IsObjectType(Type());
180
virtual NGLResource* BuildResource(NResourceSet* ResourceManager, NResource* Resource)
185
//! Type associated with this factory class.
186
NObjectType* m_ResourceType;
189
template <class T, class D>
190
class TGLResourceFactory : public NResourceFactory
195
@param type - resource class type to associate w/ this factory.
197
TGLResourceFactory(NObjectType* Type)
198
: NResourceFactory(Type)
201
virtual ~TGLResourceFactory(void)
204
//! Create a new resource.
205
/*! Create a new resource for the given NResource.
206
@param ResourceManager The resource manager.
207
@param Resource Resource to build and cache.
208
@return The built resource.
210
virtual NGLResource* BuildResource(NResourceSet* ResourceManager, NResource* Resource)
212
return new D(ResourceManager, (T*)Resource);
217
//! Device independent resource updater.
218
class NResourceUpdater
221
NResourceUpdater(NObjectType* Type)
222
: m_ResourceType(Type)
225
//! Returns the resource type for this factory.
226
const NObjectType& Type() const
228
return *m_ResourceType;
232
Returns true if the given NResource can be updated by this factory.
233
@param Resource The resource in question.
235
bool UpdatesThisResource(NResource* Resource)
237
return Resource->Type().IsObjectType(Type());
240
virtual bool UpdateResource(TRefGL< NGLResource > DeviceResource, NResource* Resource) const
242
return DeviceResource->UpdateResource(Resource);
246
//! Type associated with this factory class.
247
NObjectType* m_ResourceType;
250
template<typename IdType, typename ResourceType>
251
class TResourceCache: public NResourceSet
254
std::map< IdType, TRefGL< ResourceType > > ResourceMap;
256
// Resource factory instances for each NResource/NGLResource pair.
257
std::vector<NResourceFactory*> ResourceFactories;
259
// Resource updater instances for each NResource type.
260
std::vector<NResourceUpdater*> ResourceUpdaters;
269
// See the language FAQ 35.18 at http://www.parashift.com/c++-faq-lite/templates.html for why the "typename".
270
typename std::map< IdType, TRefGL< ResourceType > >::iterator It;
271
for(It = ResourceMap.begin(); It != ResourceMap.end(); It++)
273
TRefGL< ResourceType > CachedResource = (*It).second;
274
CachedResource->Cached = 0;
276
// Erases all elements from the map.
280
void AddCachedResource(const IdType& Id, TRefGL< ResourceType > Resource)
282
typedef std::map< IdType, TRefGL< ResourceType > > MapType;
283
ResourceMap.insert(typename MapType::value_type(Id, Resource));
284
Resource->Cached = 1;
287
TRefGL< ResourceType > FindCachedResourceById(const IdType& Id)
289
typedef std::map< IdType, TRefGL< ResourceType > > MapType;
290
typename MapType::iterator it = ResourceMap.find(Id);
291
if(it != ResourceMap.end())
296
void FlushResourceId(const IdType& Id)
298
TRefGL< ResourceType > CachedResource = 0;
300
typedef std::map< IdType, TRefGL< ResourceType > > MapType;
301
typename MapType::iterator it = ResourceMap.find(Id);
302
if(it != ResourceMap.end())
303
CachedResource = (*it).second;
304
if(CachedResource.IsValid())
306
ResourceMap.erase(it);
307
CachedResource->Cached = 0; // Make sure that if the following line deletes the resource, it doesn't try to remove itself from the TDynamicMap we're iterating over.
311
virtual void FlushResource(NGLResource* Resource)
313
typedef std::map< IdType, TRefGL< ResourceType > > MapType;
314
typename MapType::iterator it;
315
for(it = ResourceMap.begin(); it != ResourceMap.end(); it++)
317
TRefGL< ResourceType > CachedResource = (*it).second;
318
if(CachedResource == Resource)
320
ResourceMap.erase(it);
321
CachedResource->Cached = 0; // Make sure that if the following line deletes the resource, it doesn't try to remove itself from the TDynamicMap we're iterating over.
327
// Register NGLResource with the corresponding NResource
328
virtual void InitializeResourceFactories() = 0;
330
std::vector<NResourceFactory*>& GetResourceFactories(void) { return(ResourceFactories); }
331
std::vector<NResourceUpdater*>& GetResourceUpdaters(void) { return(ResourceUpdaters); }
334
class NResourceCache: public TResourceCache<int, NGLResource>
338
: TResourceCache<int, NGLResource>()
341
TRefGL< NGLResource > GetCachedResource(NResource* Source);
342
bool IsCachedResource(NResource* Source);
344
virtual void InitializeResourceFactories();
345
virtual void FreeResource(NResource* Resource)
347
FlushResourceId(Resource->GetResourceIndex());
352
////////////////////////////////////////////////////////////////////////////////////////////////////
356
#endif // GLRESOURCEMANAGER_H