Changeset 3660 in orxonox.OLD for orxonox/trunk/src/lib/util
- Timestamp:
- Mar 29, 2005, 11:50:51 AM (20 years ago)
- Location:
- orxonox/trunk/src/lib/util
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
orxonox/trunk/src/lib/util/resource_manager.cc
r3658 r3660 43 43 } 44 44 45 /** 46 \returns the Instance to this ResourceManager 47 */ 45 48 ResourceManager* ResourceManager::getInstance(void) 46 49 { … … 60 63 61 64 /** 62 \brief standard de constructor65 \brief standard destructor 63 66 */ 64 67 ResourceManager::~ResourceManager (void) 65 68 { 66 69 // deleting the Resources-List 70 unloadAllByPriority(RP_GAME); 67 71 delete resourceList; 68 72 resourceList = NULL; 73 // deleting the Directorie Lists 74 char* tmpDir = imageDirs->enumerate(); 75 while(tmpDir) 76 { 77 delete []tmpDir; 78 tmpDir = imageDirs->nextElement(); 79 } 80 81 delete imageDirs; 82 imageDirs = NULL; 69 83 ResourceManager::singletonRef = NULL; 70 84 } … … 87 101 } 88 102 103 /** 104 \brief adds a new Path for Images 105 \param imageDir The path to insert 106 \returns true, if the Path was well and injected (or already existent within the list) 107 false otherwise 108 */ 89 109 bool ResourceManager::addImageDir(char* imageDir) 90 110 { 111 // check if the param is a Directory 91 112 if (isDir(imageDir)) 92 113 { 93 char* tmpDir = new char[strlen(imageDir)+1]; 114 // check if the Directory has been added before 115 char* tmpDir = imageDirs->enumerate(); 116 while(tmpDir) 117 { 118 if (!strcmp(tmpDir, imageDir)) 119 { 120 PRINTF(4)("Path %s already loaded\n", imageDir); 121 return true; 122 } 123 tmpDir = imageDirs->nextElement(); 124 } 125 // adding the directory to the List 126 tmpDir = new char[strlen(imageDir)+1]; 94 127 strcpy(tmpDir, imageDir); 95 128 imageDirs->add(tmpDir); 129 return true; 96 130 } 97 131 else 98 132 { 99 133 PRINTF(1)("%s is not a Directory, and can not be added to the Paths of Images\n", dataDir); 134 return false; 100 135 } 101 136 } … … 104 139 \brief loads resources 105 140 \param fileName The fileName of the resource to load 141 \param prio The ResourcePriority of this resource (will only be increased) 106 142 \returns a pointer to a desired Resource. 107 143 */ 108 void* ResourceManager::load(const char* fileName )144 void* ResourceManager::load(const char* fileName, ResourcePriority prio) 109 145 { 110 146 ResourceType tmpType; … … 126 162 tmpType = IMAGE; 127 163 128 return ResourceManager::load(fileName, tmpType );164 return ResourceManager::load(fileName, tmpType, prio); 129 165 } 130 166 … … 133 169 \param fileName The fileName of the resource to load 134 170 \param type The Type of Resource to load (\see ResourceType) 171 \param prio The ResourcePriority of this resource (will only be increased) 135 172 \returns a pointer to a desired Resource. 136 173 */ 137 void* ResourceManager::load(const char* fileName, ResourceType type )174 void* ResourceManager::load(const char* fileName, ResourceType type, ResourcePriority prio) 138 175 { 139 176 // searching if the resource was loaded before. 140 177 Resource* tmpResource = ResourceManager::locateResourceByName(fileName); 141 char* tmpDir;142 178 if (!tmpResource) // if the resource was not loaded before. 143 179 { 180 char* tmpDir; 144 181 // Setting up the new Resource 145 182 tmpResource = new Resource; 146 183 tmpResource->count = 1; 147 184 tmpResource->type = type; 185 tmpResource->prio = prio; 148 186 tmpResource->name = new char[strlen(fileName)+1]; 149 187 strcpy(tmpResource->name, fileName); … … 212 250 resourceList->add(tmpResource); 213 251 delete []fullName; 214 215 252 } 216 253 else 217 254 { 218 255 tmpResource->count++; 256 if(tmpResource->prio < prio) 257 tmpResource->prio = prio; 219 258 } 220 259 … … 228 267 229 268 */ 230 bool ResourceManager::unload(void* pointer )269 bool ResourceManager::unload(void* pointer, ResourcePriority prio) 231 270 { 232 271 // if pointer is existent. and only one resource of this type exists. 233 Resource* tmpResource = 272 Resource* tmpResource =ResourceManager::locateResourceByPointer(pointer); 234 273 if (!tmpResource) 235 274 { … … 237 276 return false; 238 277 } 239 tmpResource->count--; 240 if (tmpResource->count <= 0) 241 { 242 // deleting the Resource 243 switch(tmpResource->type) 278 else 279 unload(tmpResource, prio); 280 } 281 282 bool ResourceManager::unload(Resource* resource, ResourcePriority prio) 283 { 284 resource->count--; 285 if (resource->prio <= prio) 286 { 287 if (resource->count <= 0) 244 288 { 245 case OBJ: 246 case PRIM: 247 delete (Model*)tmpResource->pointer; 248 break; 249 case IMAGE: 250 delete (Texture*)tmpResource->pointer; 251 break; 252 default: 253 PRINTF(1)("NOT YET IMPLEMENTED FIX FIX\n"); 254 return false; 255 break; 289 // deleting the Resource 290 switch(resource->type) 291 { 292 case OBJ: 293 case PRIM: 294 delete (Model*)resource->pointer; 295 break; 296 case IMAGE: 297 delete (Texture*)resource->pointer; 298 break; 299 default: 300 PRINTF(1)("NOT YET IMPLEMENTED !!FIX FIX!!\n"); 301 return false; 302 break; 303 } 304 // deleting the List Entry: 305 PRINTF(4)("Resource %s safely removed.\n", resource->name); 306 delete []resource->name; 307 resourceList->remove(resource); 256 308 } 257 // deleting the List Entry: 258 PRINTF(4)("Resource %s Safely removed.\n", tmpResource->name); 259 delete []tmpResource->name; 260 resourceList->remove(tmpResource); 261 } 262 else 263 PRINTF(4)("Resource not removed, because there are still %d References to it.\n", tmpResource->count); 309 else 310 PRINTF(4)("Resource %s not removed, because there are still %d References to it.\n", resource->name, resource->count); 311 } 312 else 313 PRINTF(4)("not deleting resource %s because DeleteLevel to high\n", resource->name); 264 314 return true; 315 } 316 317 318 /** 319 \brief unloads all alocated Memory of Resources with a pririty lower than prio 320 \param prio The priority to delete 321 */ 322 bool ResourceManager::unloadAllByPriority(ResourcePriority prio) 323 { 324 Resource* enumRes = resourceList->enumerate(); 325 while (enumRes) 326 { 327 if (enumRes->prio <= prio) 328 unload(enumRes, prio); 329 enumRes = resourceList->nextElement(); 330 } 265 331 } 266 332 -
orxonox/trunk/src/lib/util/resource_manager.h
r3658 r3660 17 17 //template<class T> class tList; 18 18 #include "list.h" //! \todo do this by forward definition (ask Patrick) 19 20 //! An eumerator for different fileTypes the resourceManager supports \todo WAV, MP3, OGG support 19 21 enum ResourceType {OBJ, PRIM, WAV, MP3, OGG, IMAGE}; 22 //! An enumerator for different UNLOAD-types. 23 /** 24 RP_NO: will be unloaded on request 25 RP_LEVEL: will be unloaded at the end of a Level 26 RP_CAMPAIGN: will be unloaded at the end of a Campaign 27 RP_GAME: will be unloaded at the end of the whole Game (when closing orxonox) 28 */ 29 enum ResourcePriority {RP_NO = 0, RP_LEVEL = 1, RP_CAMPAIGN = 2, RP_GAME = 3}; 20 30 31 //! A Struct that keeps track about A resource its name its Type, and so on 21 32 struct Resource 22 33 { … … 25 36 char* name; //!< Name of the Resource. 26 37 ResourceType type; //!< ResourceType of this Resource. 38 ResourcePriority prio; //!< The Priority of this resource. (This will only be increased) 27 39 int count; //!< How many times this Resource has been loaded. 28 40 }; … … 46 58 static bool setDataDir(char* dataDir); 47 59 static bool addImageDir(char* imageDir); 48 static void* load(const char* fileName); 49 static void* load(const char* fileName, ResourceType type); 50 static bool unload(void* pointer); 60 static void* load(const char* fileName, ResourcePriority prio = RP_NO); 61 static void* load(const char* fileName, ResourceType type, ResourcePriority prio = RP_NO); 62 static bool unload(void* pointer, ResourcePriority prio = RP_NO); 63 static bool unload(Resource* resource, ResourcePriority = RP_NO); 64 static bool unloadAllByPriority(ResourcePriority prio); 51 65 52 66 private: … … 61 75 static Resource* locateResourceByPointer(const void* pointer); 62 76 63 64 77 static bool isDir(const char* directory); 65 78 static bool isFile(const char* directory);
Note: See TracChangeset
for help on using the changeset viewer.