bool TextureDefinitionList::insertRows(int row, int count, const QModelIndex & /*parent*/) { if(level && count > 0) { if(row >= 0 && row <= level->textureDefinitions.getNumTextureDefinitions()) { TextureDefinition temp; temp.setX(0); temp.setY(0); temp.setW(16); temp.setH(16); temp.setTexture(0); temp.setName(""); TextureDefinition* old = level->textureDefinitions.getTextureDefinition(row); if(old) temp.setTexture(old->getTexture()); emit beginInsertRows(index(0,0),row,row+count-1); level->textureDefinitions.insertTextureDefinitions(row,count,temp); emit endInsertRows(); return true; } } return false; };
void TextureManager::InvalidateAllTextures(bool cleanglallocs) { for( CPPListNode* pNode = m_LoadedTextures.GetHead(); pNode; ) { TextureDefinition* pTextureDef = (TextureDefinition*)pNode; pNode = pNode->GetNext(); pTextureDef->Invalidate(cleanglallocs); m_TexturesStillLoading.MoveTail( pTextureDef ); pTextureDef->m_FullyLoaded = false; } for( CPPListNode* pNode = m_InitializedFBOs.GetHead(); pNode; ) { FBODefinition* pFBODef = (FBODefinition*)pNode; pNode = pNode->GetNext(); pFBODef->Invalidate(cleanglallocs); m_UninitializedFBOs.MoveTail( pFBODef ); pFBODef->m_FullyLoaded = false; } }
QVariant TextureDefinitionList::data(const QModelIndex &index, int role) const { if(role == Qt::SizeHintRole) { return QSize(10,10); } else if((role == Qt::EditRole || role == Qt::DisplayRole) && level) { TextureDefinition* def = level->textureDefinitions.getTextureDefinition(index.row()); if(def) { switch(index.column()) { case 0: return QString(def->getName()); case 1: return QVariant(def->getTexture()); case 2: return QVariant(def->getX()); case 3: return QVariant(def->getY()); case 4: return QVariant(def->getW()); case 5: return QVariant(def->getH()); } } } return QVariant(); };
TextureDefinition* TextureManager::CreateTexture(const char* texturefilename, int minfilter, int magfilter, int wraps, int wrapt) { MyAssert( texturefilename ); LOGInfo( LOGTag, "CreateTexture - %s\n", texturefilename ); // find the texture if it already exists: TextureDefinition* pTextureDef = FindTexture( texturefilename ); if( pTextureDef != 0 ) { pTextureDef->AddRef(); return pTextureDef; } // Create a new texture and add it to m_TexturesStillLoading pTextureDef = MyNew TextureDefinition(); pTextureDef->m_ManagedByTextureManager = true; strcpy_s( pTextureDef->m_Filename, MAX_PATH, texturefilename ); pTextureDef->m_MinFilter = minfilter; pTextureDef->m_MagFilter = magfilter; pTextureDef->m_WrapS = wraps; pTextureDef->m_WrapT = wrapt; m_TexturesStillLoading.AddTail( pTextureDef ); // if the file load hasn't started... start the file load. MyAssert( pTextureDef->m_pFile == 0 ); #if 0 //MYFW_ANDROID //LOGInfo( LOGTag, "Loading Texture: pTextureDef->m_pFile %d\n", pTextureDef->m_pFile ); if( pTextureDef->m_pFile == 0 ) { pTextureDef->m_pFile = RequestTexture( pTextureDef->m_Filename, pTextureDef ); //textureloaded = true; } #else if( pTextureDef->m_pFile == 0 ) { //LOGInfo( LOGTag, "Loading Texture: RequestFile\n" ); pTextureDef->m_pFile = RequestFile( pTextureDef->m_Filename ); //LOGInfo( LOGTag, "Loading Texture: ~RequestFile\n" ); } #endif return pTextureDef; }
void TextureCache::init (IFrontend *frontend, TextureDefinition& textureDefinition) { const TextureDefinition::TextureDefMap& map = textureDefinition.getMap(); ExecutionTime e("Texture loading"); info(LOG_CLIENT, "load " + string::toString(map.size()) + " textures"); _frontend = frontend; for (TextureDefinition::TextureDefMapConstIter i = map.begin(); i != map.end(); ++i) { const TextureDef& t = i->second; create(t.textureName, t.id, t.texcoords, t.trim, t.mirror); } }
void TextureManager::FreeAllTextures(bool shuttingdown) { for( CPPListNode* pNode = m_LoadedTextures.GetHead(); pNode; ) { TextureDefinition* pTextureDef = (TextureDefinition*)pNode; pNode = pNode->GetNext(); MyAssert( pTextureDef->GetRefCount() == 1 ); pTextureDef->Release(); } for( CPPListNode* pNode = m_TexturesStillLoading.GetHead(); pNode; ) { TextureDefinition* pTextureDef = (TextureDefinition*)pNode; pNode = pNode->GetNext(); MyAssert( pTextureDef->GetRefCount() == 1 ); pTextureDef->Release(); } for( CPPListNode* pNode = m_InitializedFBOs.GetHead(); pNode; ) { FBODefinition* pFBODef = (FBODefinition*)pNode; pNode = pNode->GetNext(); if( pFBODef->m_OnlyFreeOnShutdown == false || shuttingdown ) { MyAssert( pFBODef->GetRefCount() == 1 ); pFBODef->Release(); } } for( CPPListNode* pNode = m_UninitializedFBOs.GetHead(); pNode; ) { FBODefinition* pFBODef = (FBODefinition*)pNode; pNode = pNode->GetNext(); if( pFBODef->m_OnlyFreeOnShutdown == false || shuttingdown ) { MyAssert( pFBODef->GetRefCount() == 1 ); pFBODef->Release(); } } }
bool TextureDefinitionList::setData(const QModelIndex & idx, const QVariant & value, int role) { if(role == Qt::EditRole) { if(level && idx.row() >= 0 && idx.row() < level->textureDefinitions.getNumTextureDefinitions()) { TextureDefinition temp; if(level->textureDefinitions.getTextureDefinition(idx.row(),&temp)) { if(enforceValidData) { QMessageBox msgbox; msgbox.setIcon(QMessageBox::Warning); int ret; switch(idx.column()) { case 0: ret = level->textureDefinitions.findTextureDefByName(value.toString().toLocal8Bit().data()); if(ret != -1 && ret != idx.row()) { msgbox.setText(tr("<b>Texture name already used by another entry!</b>")); msgbox.setInformativeText(tr("Please enter a unique texture name. Name was taken by entry: ")+QString::number(ret)); msgbox.exec(); return false; } break; case 1: if(value.toInt() < 0 || value.toInt() >= level->textures.getNumTextures()) { msgbox.setText(tr("<b>Texture idx is not valid!</b>")); msgbox.setInformativeText(tr("Index must be between 0 and ")+QString::number(level->textures.getNumTextures())+"."); msgbox.exec(); return false; } break; } } switch(idx.column()) { case 0: temp.setName(value.toString().toLocal8Bit().data()); break; case 1: temp.texture = value.toInt(); break; case 2: temp.x = value.toInt(); break; case 3: temp.y = value.toInt(); break; case 4: temp.w = value.toInt(); break; case 5: temp.h = value.toInt(); break; } if(enforceValidData) { if(temp.getX()+temp.getW() > 255) temp.setW(255-temp.getX()); if(temp.getY()+temp.getH() > 255) temp.setH(255-temp.getY()); } level->textureDefinitions.setTextureDefinition(idx.row(),temp); int position = idx.row(); if(resortOnChange) { position = level->textureDefinitions.getSortedPosition(idx.row()); if(position != idx.row()) { emit beginMoveRows(idx,idx.row(),idx.row(),idx,position); level->textureDefinitions.resortTextureDefinition(idx.row()); emit endMoveRows(); } } emit dataChanged(index(position,idx.column()),index(position,idx.column())); return true; } } } return false; };
void SpriteDefinition::init (const TextureDefinition& textureDefinition) { ExecutionTime e("Sprites loading"); LUA lua; if (!lua.load("sprites.lua")) { System.exit("could not load sprites", 1); return; } lua.getGlobalKeyValue("sprites"); while (lua.getNextKeyValue()) { const std::string id = lua.getKey(); if (id.empty()) { lua.pop(); continue; } SpriteDefMapConstIter findIter = _spriteDefs.find(id); if (findIter != _spriteDefs.end()) { error(LOG_GENERAL, "sprite def already defined: " + id); lua.pop(); continue; } const std::string typeStr = lua.getValueStringFromTable("type").str(); const SpriteType& type = SpriteType::getByName(typeStr); if (!type && !typeStr.empty()) { error(LOG_GENERAL, "invalid sprite type given: " + typeStr); } const ThemeType& theme = ThemeType::getByName(lua.getValueStringFromTable("theme").str()); SpriteDef *def = new SpriteDef(id, type, theme); def->fps = lua.getValueIntegerFromTable("fps", 20); def->redirect = lua.getValueStringFromTable("redirect").str(); def->width = lua.getValueFloatFromTable("width", 1.0f); def->height = lua.getValueFloatFromTable("height", 1.0f); def->angle = lua.getValueIntegerFromTable("angle", 0); def->rotateable = lua.getValueIntegerFromTable("rotateable", 0); def->friction = lua.getValueFloatFromTable("friction", 0.2f); def->restitution = lua.getValueFloatFromTable("restitution", 0.0f); // push the frames table const int layers = lua.getTable("frames"); for (Layer layer = LAYER_BACK; layer < layers; layer++) { lua_pushinteger(lua.getState(), layer + 1); lua_gettable(lua.getState(), -2); // push the frame table const int framesOnLayer = lua_rawlen(lua.getState(), -1); for (int i = 1; i <= framesOnLayer; ++i) { const std::string texture = lua.getTableString(i); const SpriteDefFrame frame(texture, 0, true); def->textures[layer].push_back(frame); } // pop the frame table lua.pop(); } // pop the frames table lua.pop(); // push the polygons table const int polygons = lua.getTable("polygons"); if (polygons > 0) { for (int j = 1; j <= polygons; j++) { lua_pushinteger(lua.getState(), j); lua_gettable(lua.getState(), -2); // push the polygon table const int vertices = lua_rawlen(lua.getState(), -1) - 1; const std::string userData = lua.getTableString(1); SpritePolygon p(userData); for (int i = 2; i <= vertices; i += 2) { const float x = lua.getTableInteger(i) / 100.0f; const float y = lua.getTableInteger(i + 1) / 100.0f; p.vertices.push_back(SpriteVertex(x, y)); } // pop the polygon table lua.pop(); def->polygons.push_back(p); } } // pop the polygons table lua.pop(); // push the circles table const int circles = lua.getTable("circles"); for (int j = 1; j <= circles; j++) { lua_pushinteger(lua.getState(), j); lua_gettable(lua.getState(), -2); // push the circle table const int entries = lua_rawlen(lua.getState(), -1); if (entries == 4) { const std::string userData = lua.getTableString(1); SpriteCircle p(userData); const float x = lua.getTableInteger(2) / 100.0f; const float y = lua.getTableInteger(3) / 100.0f; p.center = SpriteVertex(x, y); p.radius = lua.getTableInteger(4) / 100.0f; def->circles.push_back(p); } else { error(LOG_GENERAL, "invalid amount of entries for the circle shape"); } // pop the circle table lua.pop(); } // pop the circles table lua.pop(); for (Layer layer = LAYER_BACK; layer <= MAX_LAYERS; layer++) { if (layer == MAX_LAYERS || def->textures[layer].empty()) { int frame = 1; std::string spriteFrameName = def->id; switch (layer) { case LAYER_BACK: spriteFrameName += "-back-01"; break; case LAYER_FRONT: spriteFrameName += "-front-01"; break; case LAYER_MIDDLE: spriteFrameName += "-middle-01"; break; case MAX_LAYERS: // fallback spriteFrameName += "-01"; break; default: break; } const size_t length = spriteFrameName.size(); char frameNumbers[] = { '0', '1', '\0' }; Layer layerToUse = layer; if (layerToUse == MAX_LAYERS) layerToUse = LAYER_MIDDLE; for (;;) { if (!textureDefinition.exists(spriteFrameName)) break; def->textures[layerToUse].push_back(SpriteDefFrame(spriteFrameName, 0, true)); frame++; const char first = frame / 10 + '0'; const char second = frame % 10 + '0'; frameNumbers[0] = first; frameNumbers[1] = second; spriteFrameName.replace(length - 2, length, frameNumbers); } } } const int actives = lua.getTable("active"); for (int i = 1; i <= actives; ++i) { const bool active = lua.getTableBool(i); for (Layer layer = LAYER_BACK; layer < MAX_LAYERS; layer++) { const size_t textures = def->textures[layer].size(); if (textures < i) continue; SpriteDef::SpriteDefFrames& frames = def->textures[layer]; frames[i - 1].active = active; } } // pop the active table lua.pop(); const int delays = lua.getTable("delays"); for (int i = 1; i <= delays; ++i) { const int delay = lua.getTableInteger(i); for (Layer layer = LAYER_BACK; layer < MAX_LAYERS; layer++) { const size_t textures = def->textures[layer].size(); if (textures >= i) def->textures[layer][i - 1].delay = delay; } } // pop the delays table lua.pop(); lua.pop(); def->calcDelay(); _spriteDefs[id] = SpriteDefPtr(def); } }
void SpriteDefinition::init (const TextureDefinition& textureDefinition) { ExecutionTime e("Sprites loading"); Log::debug(LOG_COMMON, "Sprites loading"); LUA lua; if (!lua.load("sprites.lua")) { System.exit("could not load sprites", 1); return; } LUA_checkStack2(lua.getState()); if (!lua.getGlobalKeyValue("sprites")) { Log::error(LOG_COMMON, "spritedef: Could not find the global sprites map"); return; } while (lua.getNextKeyValue()) { LUA_checkStack2(lua.getState()); const std::string id = lua.getKey(); if (id.empty()) { Log::error(LOG_COMMON, "spritedef: no key found in definition: %s", lua.getStackDump().c_str()); lua.pop(); continue; } Log::debug(LOG_COMMON, "id: %s", id.c_str()); SpriteDefMapConstIter findIter = _spriteDefs.find(id); if (findIter != _spriteDefs.end()) { Log::error(LOG_COMMON, "sprite def already defined: %s", id.c_str()); lua.pop(); continue; } const std::string& typeStr = lua.getValueStringFromTable("type"); Log::debug(LOG_COMMON, "id: %s, type %s", id.c_str(), typeStr.c_str()); const SpriteType& type = SpriteType::getByName(typeStr); if (!type && !typeStr.empty()) { Log::error(LOG_COMMON, "invalid sprite type given: %s", typeStr.c_str()); } const ThemeType& theme = ThemeType::getByName(lua.getValueStringFromTable("theme")); SpriteDef *def = new SpriteDef(id, type, theme); def->fps = lua.getValueIntegerFromTable("fps", 20); def->redirect = lua.getValueStringFromTable("redirect"); def->width = lua.getValueFloatFromTable("width", 1.0f); def->height = lua.getValueFloatFromTable("height", 1.0f); def->angle = lua.getValueIntegerFromTable("angle", 0); def->rotateable = lua.getValueIntegerFromTable("rotateable", 0); def->friction = lua.getValueFloatFromTable("friction", 0.2f); def->restitution = lua.getValueFloatFromTable("restitution", 0.0f); // push the frames table const int layers = lua.getTable("frames"); Log::debug(LOG_COMMON, "id: %s => %i frames", id.c_str(), layers); if (layers > MAX_LAYERS) { Log::error(LOG_COMMON, "invalid sprite layer amount given for %s: %i", id.c_str(), layers); } if (layers > 0) { LUA_checkStack2(lua.getState()); lua_State* L = lua.getState(); lua_pushvalue(L, -1); lua_pushnil(L); Layer layer = LAYER_BACK; while (lua_next(L, -2)) { if (!lua_istable(lua.getState(), -1)) { Log::error(LOG_COMMON, "spritedef: expected frame table on the stack: %s", lua.getStackDump().c_str()); lua.pop(); continue; } // push the frame table const int framesOnLayer = lua_rawlen(lua.getState(), -1); Log::debug(LOG_COMMON, "id: %s => %i frames on layer %i", id.c_str(), framesOnLayer, layer); for (int i = 1; i <= framesOnLayer; ++i) { const std::string& texture = lua.getTableString(i); Log::debug(LOG_COMMON, "id: %s => texture %s on layer %i", id.c_str(), texture.c_str(), layer); const SpriteDefFrame frame(texture, 0, true); if (layer < MAX_LAYERS) def->textures[layer].push_back(frame); } lua.pop(); ++layer; } // pop the frame table lua.pop(); } // pop the frames table if (layers != -1) lua.pop(); // push the polygons table const int polygons = lua.getTable("polygons"); Log::debug(LOG_COMMON, "id: %s => %i polygons", id.c_str(), polygons); if (polygons > 0) { LUA_checkStack2(lua.getState()); lua_State* L = lua.getState(); lua_pushvalue(L, -1); lua_pushnil(L); while (lua_next(L, -2)) { if (!lua_istable(L, -1)) { Log::error(LOG_COMMON, "spritedef: expected polygon table on the stack: %s", lua.getStackDump().c_str()); lua.pop(); continue; } // push the polygon table const int vertices = lua_rawlen(L, -1) - 1; Log::debug(LOG_COMMON, "id: %s => %i vertices", id.c_str(), vertices); const std::string& userData = lua.getTableString(1); SpritePolygon p(userData); Log::debug(LOG_COMMON, "id: %s => %s userdata", id.c_str(), userData.c_str()); for (int i = 2; i <= vertices; i += 2) { const float x = lua.getTableFloat(i) / 100.0f; const float y = lua.getTableFloat(i + 1) / 100.0f; p.vertices.push_back(SpriteVertex(x, y)); } // pop the polygon table lua.pop(); def->polygons.push_back(p); } lua.pop(); } // pop the polygons table if (polygons != -1) lua.pop(); // push the circles table const int circles = lua.getTable("circles"); Log::debug(LOG_COMMON, "id: %s => %i circles", id.c_str(), circles); if (circles > 0) { LUA_checkStack2(lua.getState()); lua_State* L = lua.getState(); lua_pushvalue(L, -1); lua_pushnil(L); while (lua_next(L, -2)) { if (!lua_istable(L, -1)) { Log::error(LOG_COMMON, "spritedef: expected circle table on the stack: %s", lua.getStackDump().c_str()); lua.pop(); continue; } // push the circle table const int entries = lua_rawlen(lua.getState(), -1); if (entries == 4) { const std::string& userData = lua.getTableString(1); SpriteCircle p(userData); const float x = lua.getTableInteger(2) / 100.0f; const float y = lua.getTableInteger(3) / 100.0f; p.center = SpriteVertex(x, y); p.radius = lua.getTableInteger(4) / 100.0f; def->circles.push_back(p); } else { Log::error(LOG_COMMON, "invalid amount of entries for the circle shape"); } // pop the circle table lua.pop(); } lua.pop(); } // pop the circles table if (circles != -1) lua.pop(); for (Layer layer = LAYER_BACK; layer <= MAX_LAYERS; layer++) { if (layer == MAX_LAYERS || def->textures[layer].empty()) { int frame = 1; std::string spriteFrameName = def->id; switch (layer) { case LAYER_BACK: spriteFrameName += "-back-01"; break; case LAYER_FRONT: spriteFrameName += "-front-01"; break; case LAYER_MIDDLE: spriteFrameName += "-middle-01"; break; case MAX_LAYERS: // fallback spriteFrameName += "-01"; break; default: break; } const size_t length = spriteFrameName.size(); char frameNumbers[] = { '0', '1', '\0' }; Layer layerToUse = layer; if (layerToUse == MAX_LAYERS) layerToUse = LAYER_MIDDLE; for (;;) { if (!textureDefinition.exists(spriteFrameName)) break; def->textures[layerToUse].push_back(SpriteDefFrame(spriteFrameName, 0, true)); frame++; const char first = frame / 10 + '0'; const char second = frame % 10 + '0'; frameNumbers[0] = first; frameNumbers[1] = second; spriteFrameName.replace(length - 2, length, frameNumbers); } } } const int actives = lua.getTable("active"); for (int i = 1; i <= actives; ++i) { LUA_checkStack2(lua.getState()); const bool active = lua.getTableBool(i); for (Layer layer = LAYER_BACK; layer < MAX_LAYERS; layer++) { const int textures = def->textures[layer].size(); if (textures < i) continue; SpriteDef::SpriteDefFrames& frames = def->textures[layer]; frames[i - 1].active = active; } } // pop the active table if (actives != -1) lua.pop(); const int delays = lua.getTable("delays"); for (int i = 1; i <= delays; ++i) { LUA_checkStack2(lua.getState()); const int delay = lua.getTableInteger(i); for (Layer layer = LAYER_BACK; layer < MAX_LAYERS; layer++) { const int textures = def->textures[layer].size(); if (textures >= i) def->textures[layer][i - 1].delay = delay; } } // pop the delays table if (delays != -1) lua.pop(); lua.pop(); def->calcDelay(); _spriteDefs[id] = SpriteDefPtr(def); } }
void TextureManager::Tick() { // Initialize all FBOs { CPPListNode* pNextNode; for( CPPListNode* pNode = m_UninitializedFBOs.GetHead(); pNode != 0; pNode = pNextNode ) { pNextNode = pNode->GetNext(); FBODefinition* pFBODef = (FBODefinition*)pNode; if( pFBODef->m_FailedToInit ) continue; bool success = pFBODef->Create(); if( success ) { LOGInfo( LOGTag, "pFBODef->Create() succeeded\n" ); //g_pPanelMemory->AddTexture( pFBODef ); m_InitializedFBOs.MoveTail( pFBODef ); pFBODef->m_FullyLoaded = true; } else { pFBODef->m_FailedToInit = true; LOGError( LOGTag, "========================\n" ); LOGError( LOGTag, "pFBODef->Create() failed\n" ); LOGError( LOGTag, "========================\n" ); } } } //// debug: list all textures that need loading. //for( CPPListNode* pNode = m_TexturesStillLoading.GetHead(); pNode; pNode = pNode->GetNext() ) //{ // TextureDefinition* pTextureDef = (TextureDefinition*)pNode; // LOGInfo( LOGTag, "Still need to load: %s\n", pTextureDef->m_Filename ); //} int texturesloadedthistick = 0; CPPListNode* pNextNode; for( CPPListNode* pNode = m_TexturesStillLoading.GetHead(); pNode != 0; pNode = pNextNode ) { pNextNode = pNode->GetNext(); if( m_MaxTexturesToLoadInOneTick != -1 && texturesloadedthistick >= m_MaxTexturesToLoadInOneTick ) break; texturesloadedthistick++; TextureDefinition* pTextureDef = (TextureDefinition*)pNode; //LOGInfo( LOGTag, "Loading Texture: %s\n", pTextureDef->m_Filename ); // if we have an opengl texture, then nothing to do. this shouldn't happen, loaded textures should be in "m_LoadedTextures". MyAssert( pTextureDef->m_TextureID == 0 ); if( pTextureDef->m_TextureID != 0 ) { LOGInfo( LOGTag, "Loading Texture: Already had a texture id?!? pTextureDef->m_TextureID != 0\n" ); continue; } bool textureloaded = false; #if 0 //MYFW_ANDROID //LOGInfo( LOGTag, "Loading Texture: pTextureDef->m_pFile %d\n", pTextureDef->m_pFile ); if( pTextureDef->m_pFile == 0 ) { pTextureDef->m_pFile = RequestTexture( pTextureDef->m_Filename, pTextureDef ); textureloaded = true; } else { LOGInfo( LOGTag, "Loading Texture: calling Android_LoadTextureFromMemory\n" ); pTextureDef->m_TextureID = Android_LoadTextureFromMemory( pTextureDef ); textureloaded = true; } #else // if the file load hasn't started... start the file load. if( pTextureDef->m_pFile == 0 ) { //LOGInfo( LOGTag, "Loading Texture: RequestFile\n" ); pTextureDef->m_pFile = RequestFile( pTextureDef->m_Filename ); //LOGInfo( LOGTag, "Loading Texture: ~RequestFile\n" ); } else { // if the file is ready, create an opengl texture from it. if( pTextureDef->m_pFile->m_FileLoadStatus == FileLoadStatus_Success ) { //LOGInfo( LOGTag, "Loading Texture: pTextureDef->m_pFile->m_FileReady\n" ); pTextureDef->m_TextureID = CreateTextureFromBuffer( pTextureDef ); //LOGInfo( LOGTag, "Loading Texture: CreateTextureFromBuffer\n" ); if( pTextureDef->m_TextureID != 0 ) { //LOGInfo( LOGTag, "Loading Texture: textureloaded = true\n" ); textureloaded = true; } } if( pTextureDef->m_pFile->m_FileLoadStatus > FileLoadStatus_Success ) { LOGError( LOGTag, "File load failed %s\n", pTextureDef->m_Filename ); SAFE_RELEASE( pTextureDef ); } } #endif if( textureloaded ) { LOGInfo( LOGTag, "textureloaded %s\n", pTextureDef->m_Filename ); // by default, we don't free the texture from main ram, so if we free the opengl tex, we can "reload" quick. if( pTextureDef->QueryFreeWhenCreated() ) g_pFileManager->FreeFile( pTextureDef->m_pFile ); m_LoadedTextures.MoveTail( pTextureDef ); pTextureDef->m_FullyLoaded = true; #if MYFW_USING_WX g_pPanelMemory->AddTexture( pTextureDef, "Global", pTextureDef->m_Filename, TextureDefinition::StaticOnDrag ); #endif LOGInfo( LOGTag, "pTextureDef->m_FullyLoaded = true %s\n", pTextureDef->m_Filename ); } } }