00001
00002
00003 #include "TextureDatabase.h"
00004
00005 #include "Configuration.h"
00006 #include "Texture.h"
00007 #include "TextureFactory.h"
00008 #include "TextureResourceFile.h"
00009
00010
00011 namespace pge {
00012
00013
00014
00015
00016
00017
00018
00019 TextureDatabase::TextureDatabase(void) {
00020 m_textureList = std::vector<Texture*>();
00021
00022 m_resFile = new TextureResourceFile(TEXTURE_RESOURCE_FILE);
00023
00024 m_defaultTexture = TextureFactory::createTexture2D(TEXTURE_PREFIX.append(DEFAULT_TEXTURE_FILE), "default", true);
00025 if(m_defaultTexture == NULL) {
00026 printf("WARNING: [%s] Could not load default texture!\n", __FILE__);
00027 }
00028 }
00029
00030
00031
00032
00033
00034
00035
00036 TextureDatabase::~TextureDatabase(void) {
00037 destroy();
00038 }
00039
00040
00041
00042
00043
00044
00045
00046 TextureDatabase* TextureDatabase::getInstance(void) {
00047 static TextureDatabase instance;
00048 return &instance;
00049 }
00050
00051
00052
00053
00054
00055
00056
00057 void TextureDatabase::destroy(void) {
00058 std::vector<Texture*>::iterator it;
00059
00060
00061 for(it = m_textureList.begin(); it != m_textureList.end(); it++) {
00062 if(*it != NULL) {
00063 delete *it;
00064 }
00065 }
00066
00067 if(m_defaultTexture != NULL) {
00068 delete m_defaultTexture;
00069 m_defaultTexture = NULL;
00070 }
00071
00072 if(m_resFile != NULL) {
00073 delete m_resFile;
00074 m_resFile = NULL;
00075 }
00076 }
00077
00078
00079
00080
00081
00082
00083
00084 Texture* TextureDatabase::getDefaultTexture(void) {
00085 return m_defaultTexture;
00086 }
00087
00088
00089
00090
00091
00092
00093
00094 Texture* TextureDatabase::addTexture(const std::string &filename) {
00095 if(containsTexture(filename)) {
00096 return getTextureByName(filename);
00097 }
00098
00099 Texture *tex;
00100
00101
00102 if(m_resFile->hasResource(filename)) {
00103 TextureResourceFile::TextureResource res = m_resFile->getResource(filename);
00104
00105 tex = TextureFactory::createTexture2D(TEXTURE_PREFIX.append(filename), filename, res.m_doMipmap, res.m_alphaEnabled,
00106 res.m_alphaRed, res.m_alphaGreen, res.m_alphaBlue, res.m_minFilter,
00107 res.m_magFilter, res.m_wrapS, res.m_wrapT);
00108 } else {
00109 tex = TextureFactory::createTexture2D(TEXTURE_PREFIX.append(filename), filename, true);
00110 }
00111
00112 if(tex != NULL) {
00113 m_textureList.push_back(tex);
00114 return tex;
00115 } else {
00116 return m_defaultTexture;
00117 }
00118 }
00119
00120
00121
00122
00123
00124
00125
00126 Texture* TextureDatabase::addTexture(const std::string &filename, const std::string &name,
00127 bool mipmap, bool alpha) {
00128
00129 if(containsTexture(name)) {
00130 return getTextureByName(name);
00131 }
00132
00133 Texture *tex;
00134
00135
00136 if(m_resFile->hasResource(filename)) {
00137 TextureResourceFile::TextureResource res = m_resFile->getResource(filename);
00138
00139 tex = TextureFactory::createTexture2D(TEXTURE_PREFIX.append(filename), name, mipmap, alpha,
00140 res.m_alphaRed, res.m_alphaGreen, res.m_alphaBlue, res.m_minFilter,
00141 res.m_magFilter, res.m_wrapS, res.m_wrapT);
00142 } else {
00143
00144 if(mipmap) {
00145 tex = TextureFactory::createTexture2D(TEXTURE_PREFIX.append(filename), name, mipmap, alpha,
00146 ALPHA_COLOR_R, ALPHA_COLOR_G, ALPHA_COLOR_B, TEXTURE_MINFILTER_MIPMAP,
00147 TEXTURE_MAGFILTER, TEXTURE_WRAPS, TEXTURE_WRAPT);
00148 } else {
00149 tex = TextureFactory::createTexture2D(TEXTURE_PREFIX.append(filename), name, mipmap, alpha,
00150 ALPHA_COLOR_R, ALPHA_COLOR_G, ALPHA_COLOR_B, TEXTURE_MINFILTER,
00151 TEXTURE_MAGFILTER, TEXTURE_WRAPS, TEXTURE_WRAPT);
00152 }
00153 }
00154
00155 if(tex != NULL) {
00156 m_textureList.push_back(tex);
00157 return tex;
00158 } else {
00159 return m_defaultTexture;
00160 }
00161 }
00162
00163
00164
00165
00166
00167
00168
00169 Texture* TextureDatabase::addTexture(const std::string &filename, const std::string &name, bool mipmap,
00170 GLuint wrapS, GLuint wrapT, GLuint minFilter, GLuint magFilter, bool alpha,
00171 int alphaRed, int alphaGreen, int alphaBlue) {
00172
00173 if(containsTexture(name)) {
00174 return getTextureByName(name);
00175 }
00176
00177 Texture *tex;
00178
00179 tex = TextureFactory::createTexture2D(TEXTURE_PREFIX.append(filename), name, mipmap, alpha, alphaRed, alphaGreen,
00180 alphaBlue, minFilter, magFilter, wrapS, wrapT);
00181
00182 if(tex != NULL) {
00183 m_textureList.push_back(tex);
00184 return tex;
00185 } else {
00186 return m_defaultTexture;
00187 }
00188 }
00189
00190
00191
00192
00193
00194
00195
00196 bool TextureDatabase::containsTexture(const std::string &name) {
00197 std::vector<Texture*>::iterator it;
00198
00199
00200 for(it = m_textureList.begin(); it != m_textureList.end(); it++) {
00201 Texture *t = *it;
00202 if(t->getName().compare(name) == 0) {
00203 return true;
00204 }
00205 }
00206 return false;
00207 }
00208
00209
00210
00211
00212
00213
00214
00215 Texture* TextureDatabase::getTextureByName(const std::string &name) {
00216 std::vector<Texture*>::iterator it;
00217
00218
00219 for(it = m_textureList.begin(); it != m_textureList.end(); it++) {
00220 Texture *t = *it;
00221 if(t->getName().compare(name) == 0) {
00222 return t;
00223 }
00224 }
00225
00226 return NULL;
00227 }
00228 }