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);
	}
}
Exemple #10
0
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 );
        }
    }
}