Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/new_class_id/src/lib/util/loading/resource.cc @ 9854

Last change on this file since 9854 was 9854, checked in by bensch, 18 years ago

more nice comments, and also updated the KeepLevel loading (if you want to load a Resource to a KeepLevel just append it at loadtime:
eg.:
Texture tex = ResourceTexture(orxonox.png, GL_TEXTURE_2D, GameEnd);
where GameEnd is the KeepLevel as defined in orxonox.cc→initResources()

File size: 8.3 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_LOAD
17
18#include "resource.h"
19#include "resource_manager.h"
20
21#include "debug.h"
22
23
24namespace Resources
25{
26  //! Define an ObjectList for the Resources
27  ObjectListDefinition(Resource);
28
29
30  /**
31   * @brief standard constructor
32   * @param type the Type this resource belongs to.
33   */
34  Resource::Resource (Type* type)
35      : _pointer(NULL), _type(type)
36  {
37    this->registerObject(this, Resource::_objectList);
38  }
39
40  /**
41   * @brief standard deconstructor
42   */
43  Resource::~Resource ()
44  {
45    // delete what has to be deleted here
46  }
47
48  /**
49   * @brief Locates a File inside of the Resources Paths and returns the appended path.
50   *
51   * @param fileName the Name of the file to look for.
52   * @returns the Name of the File prepended with the PAth it is in, if found, empty String ("") otherwise.
53   *
54   * This Function searches in (ordered):
55   * 1. mainGlobalPath (from ResourceManger)
56   * 2. all of the global Paths (from ResourceManger)
57   * 3. all of the Resources Paths (from Resources::Type)
58   *
59   * in each of these directory, first "./" is searched, and afterwards all of the subDirs (from Resources::Type) are searched.
60   *
61   * @todo finish it!!
62   */
63  std::string Resource::locateFile(const std::string& fileName) const
64  {
65    if ((ResourceManager::getInstance()->mainGlobalPath() + File(fileName)).exists() )
66      return (ResourceManager::getInstance()->mainGlobalPath() + File(fileName)).name();
67
68    std::string locatedFile;
69    locatedFile = locateFileInSubDir(ResourceManager::getInstance()->mainGlobalPath(), fileName);
70    if (!locatedFile.empty())
71    {
72      return locatedFile;
73    }
74
75    if (File(fileName).exists())
76      return fileName;
77
78    return (ResourceManager::getInstance()->mainGlobalPath() + File(fileName)).name();
79  }
80
81  /**
82   * @brief tests in all the SubDirectories defined in Resource under Directory if the fileName exists.
83   * @param directory the directory to in what to search for all subdirectories for.
84   * @param fileName the Name of the File to query for
85   * @return true on success.
86   */
87  std::string Resource::locateFileInSubDir(const Directory& directory, const std::string& fileName) const
88  {
89    std::vector<Directory>::const_iterator it;
90    for (it = this->_type->resourceSubPaths().begin(); it != this->_type->resourceSubPaths().end(); ++it)
91    {
92      Directory dir = directory + (*it);
93      File file = dir + File(fileName);
94      if ((dir+ File(fileName)).exists())
95        return (dir+File(fileName)).name();
96    }
97    return "";
98  }
99
100
101  /**
102   * @param loadString the Identifier of the Resource.
103   * @returns a Store-Pointer to the Resource if found, NULL otherwise
104   */
105  StorePointer* Resource::acquireResource(const std::string& loadString)
106  {
107    //const Type* const type = _resourceTypes[this->_type->id()];
108
109    for (unsigned int i = 0; i < _type->storedResources().size(); ++i)
110    {
111      if (_type->storedResources()[i]->loadString() == loadString)
112        return _type->storedResources()[i];
113    }
114
115    return NULL;
116  }
117
118  /**
119   * @brief registers a StorePointer to a Resource's Type.
120   * @param pointer the StorePointer to register.
121   */
122  void Resource::addResource(StorePointer* pointer)
123  {
124    assert(pointer != NULL);
125    this->_type->addResource(pointer);
126  }
127
128
129
130
131
132
133  ///////////////////
134  //// KEEPLEVEL ////
135  ///////////////////
136
137  //! Constructs a default KeepLevel as Set in the ResourceManager via setDefaultKeepLevel.
138  KeepLevel::KeepLevel()
139  {
140    this->_keepLevel = ResourceManager::getInstance()->defaultKeepLevel().keepLevel();
141  }
142  /**
143   * @param keepLevel the level to set.
144   */
145  KeepLevel::KeepLevel(unsigned int keepLevel)
146  {
147    _keepLevel = keepLevel;
148  }
149
150  /**
151   * @brief constructor of a KeepLevel.
152   * @param keepLevelName the Name of the KeepLevel. Must be one Name of the defined Names in the ResourceManager.
153   *
154   * @note the Name is transformed into an Integer for fast interpretation.
155   */
156  KeepLevel::KeepLevel(const std::string& keepLevelName)
157  {
158    this->_keepLevel = ResourceManager::getInstance()->getKeepLevelID(keepLevelName);
159  }
160
161  /**
162   * @returns the name of the KeepLevel.
163   */
164  const std::string& KeepLevel::name() const
165  {
166    return ResourceManager::getInstance()->getKeepLevelName(this->_keepLevel);
167  }
168
169
170
171  ///////////////////////
172  //// STORE POINTER ////
173  ///////////////////////
174  /**
175   * @brief allocates a StorePointer.
176   * @param loadString An identifier String that is unique between all resources of this type.
177   * @param keepLevel the KeepLevel at wich to keep this resource.
178   */
179  StorePointer::StorePointer(const std::string& loadString, const KeepLevel& keeplevel)
180      : _loadString(loadString), _keepLevel(keeplevel)
181  {
182    PRINTF(4)("Acquired a Resource with LoadString '%s' and KeepLevel '%s'\n", _loadString.c_str(), _keepLevel.name().c_str());
183  }
184
185  StorePointer::~StorePointer()
186  {
187    PRINTF(4)("Deleting Stored Resource '%s' from KeepLevel '%s'\n", _loadString.c_str(), _keepLevel.name().c_str());
188  };
189
190
191
192  //////////////
193  //// TYPE ////
194  //////////////
195  /**
196   * @brief allocates a Type.
197   * @param typeName the Name of the Type to be stored in this Container.
198   */
199  Type::Type(const std::string& typeName)
200      : _typeName(typeName)
201  {
202    ResourceManager::getInstance()->registerType(this);
203    PRINTF(4)("Created ResourceType '%s'\n", typeName.c_str());
204  }
205
206  //! Destructs a Type.
207  Type::~Type()
208  {
209    ResourceManager::getInstance()->unregisterType(this);
210  }
211
212  /**
213   * @brief adds a Resource to this Resource's type.
214   * @param resource the Resource to add.
215   */
216  void Type::addResource(StorePointer* resource)
217  {
218    this->_storedResources.push_back(resource);
219  }
220
221  /**
222   * @brief adds a Path to the Type's resource-paths.
223   * @param path the path-name to add.
224   */
225  bool Type::addResourcePath(const std::string& path)
226  {
227    std::vector<Directory>::const_iterator it;
228    for (it = this->_resourcePaths.begin(); it != this->_resourcePaths.end(); ++it)
229      if ((*it) == path)
230        return false;
231    this->_resourcePaths.push_back(path);
232    return true;
233
234  }
235
236  /**
237   * @brief Adds a SubPath to the Type's resource-subpaths.
238   * @param subPath the subpath to add.
239   */
240  bool Type::addResourceSubPath(const std::string& subPath)
241  {
242    std::vector<Directory>::const_iterator it;
243    for (it = this->_resourceSubPaths.begin(); it != this->_resourceSubPaths.end(); ++it)
244      if ((*it) == subPath)
245        return false;
246    this->_resourceSubPaths.push_back(subPath);
247    return true;
248  }
249
250  /**
251   * @brief Unloads all Resources below a certain Level.
252   * @param keepLevel the KeepLevel at what to remove the Resources from.
253   */
254  void Type::unloadAllBelowKeepLevel(const Resources::KeepLevel& keepLevel)
255  {
256    std::vector<Resources::StorePointer*>::iterator it, it2;
257    bool finished = false;
258
259    while (!finished)
260    {
261      finished = true;
262      for (it = this->_storedResources.begin(); it != this->_storedResources.end();++it)
263        if((*it)->keepLevel() < keepLevel && (*it)->last())
264        {
265          delete (*it);
266          this->_storedResources.erase(it);
267          finished = false;
268          break;
269        }
270    }
271  }
272
273  /**
274   * @brief print out some nice Debug information in a beatifully designed style
275   */
276  void Type::debug() const
277  {
278    PRINT(0)(" ResourceType '%s' stores %d Resources\n", this->_typeName.c_str(), this->_storedResources.size());
279    PRINT(0)("  Paths:\n");
280    for (unsigned int i = 0; i < this->_resourcePaths.size(); ++i)
281      PRINT(0)("    %s\n", this->_resourcePaths[i].name().c_str());
282    PRINT(0)("  Sub-Paths:");
283    for (unsigned int i = 0; i < this->_resourceSubPaths.size(); ++i)
284      PRINT(0)(" '%s'", this->_resourceSubPaths[i].name().c_str());
285    PRINT(0)("\n");
286
287    PRINT(0)("  Loaded Resources:\n");
288    std::vector<Resources::StorePointer*>::const_iterator it;
289    for (it = this->_storedResources.begin(); it != this->_storedResources.end(); ++it)
290      PRINT(0)("    '%s' : KeepLevel '%s'\n", (*it)->loadString().c_str(), (*it)->keepLevel().name().c_str());
291  }
292}
Note: See TracBrowser for help on using the repository browser.