mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-24 08:32:34 +02:00
fixed fadeAnims memory leak
This commit is contained in:
parent
f0b3a13ed5
commit
e2e5bc4920
@ -539,7 +539,7 @@ SDL_Surface * CMapHandler::CMapWorldViewBlitter::objectToIcon(Obj id, si32 subId
|
||||
{
|
||||
ownerIndex = PlayerColor::PLAYER_LIMIT.getNum() * 19;
|
||||
}
|
||||
|
||||
|
||||
switch(id)
|
||||
{
|
||||
case Obj::MONOLITH_ONE_WAY_ENTRANCE:
|
||||
@ -558,8 +558,8 @@ SDL_Surface * CMapHandler::CMapWorldViewBlitter::objectToIcon(Obj id, si32 subId
|
||||
return info->iconsDef->ourImages[(int)EWorldViewIcon::MINE_WOOD + subId + ownerIndex].bitmap;
|
||||
case Obj::RESOURCE:
|
||||
return info->iconsDef->ourImages[(int)EWorldViewIcon::RES_WOOD + subId + ownerIndex].bitmap;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void CMapHandler::CMapWorldViewBlitter::calculateWorldViewCameraPos()
|
||||
@ -660,7 +660,7 @@ void CMapHandler::CMapWorldViewBlitter::drawTileOverlay(SDL_Surface * targetSurf
|
||||
{
|
||||
const CGObjectInstance * obj = object.obj;
|
||||
|
||||
const bool sameLevel = obj->pos.z == pos.z;
|
||||
const bool sameLevel = obj->pos.z == pos.z;
|
||||
const bool isVisible = (*info->visibilityMap)[pos.x][pos.y][pos.z];
|
||||
const bool isVisitable = obj->visitableAt(pos.x, pos.y);
|
||||
|
||||
@ -673,31 +673,31 @@ void CMapHandler::CMapWorldViewBlitter::drawOverlayEx(SDL_Surface * targetSurf)
|
||||
{
|
||||
if(nullptr == info->additionalIcons)
|
||||
return;
|
||||
|
||||
|
||||
const int3 bottomRight = pos + tileCount;
|
||||
|
||||
|
||||
for(const ObjectPosInfo & iconInfo : *(info->additionalIcons))
|
||||
{
|
||||
if( iconInfo.pos.z != pos.z)
|
||||
continue;
|
||||
|
||||
|
||||
if((iconInfo.pos.x < topTile.x) || (iconInfo.pos.y < topTile.y))
|
||||
continue;
|
||||
|
||||
|
||||
if((iconInfo.pos.x > bottomRight.x) || (iconInfo.pos.y > bottomRight.y))
|
||||
continue;
|
||||
|
||||
continue;
|
||||
|
||||
realPos.x = initPos.x + (iconInfo.pos.x - topTile.x) * tileSize;
|
||||
realPos.y = initPos.x + (iconInfo.pos.y - topTile.y) * tileSize;
|
||||
|
||||
SDL_Surface * wvIcon = this->objectToIcon(iconInfo.id, iconInfo.subId, iconInfo.owner);
|
||||
|
||||
|
||||
SDL_Surface * wvIcon = this->objectToIcon(iconInfo.id, iconInfo.subId, iconInfo.owner);
|
||||
|
||||
if (nullptr != wvIcon)
|
||||
{
|
||||
// centering icon on the object
|
||||
Rect destRect(realPos.x + tileSize / 2 - wvIcon->w / 2, realPos.y + tileSize / 2 - wvIcon->h / 2, wvIcon->w, wvIcon->h);
|
||||
CSDL_Ext::blitSurface(wvIcon, nullptr, targetSurf, &destRect);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -837,7 +837,7 @@ void CMapHandler::CMapBlitter::drawObjects(SDL_Surface * targetSurf, const Terra
|
||||
for(auto & object : objects)
|
||||
{
|
||||
if (object.fadeAnimKey >= 0)
|
||||
{
|
||||
{
|
||||
auto fadeIter = parent->fadeAnims.find(object.fadeAnimKey);
|
||||
if (fadeIter != parent->fadeAnims.end())
|
||||
{
|
||||
@ -850,14 +850,14 @@ void CMapHandler::CMapBlitter::drawObjects(SDL_Surface * targetSurf, const Terra
|
||||
logGlobal->errorStream() << "Fading map object with missing fade anim : " << object.fadeAnimKey;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
const CGObjectInstance * obj = object.obj;
|
||||
if (!obj)
|
||||
{
|
||||
logGlobal->errorStream() << "Stray map object that isn't fading";
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (!graphics->getDef(obj))
|
||||
processDef(obj->appearance);
|
||||
if (!graphics->getDef(obj))
|
||||
@ -872,12 +872,12 @@ void CMapHandler::CMapBlitter::drawObjects(SDL_Surface * targetSurf, const Terra
|
||||
|
||||
if (!canDrawObject(obj))
|
||||
continue;
|
||||
|
||||
|
||||
auto objData = findObjectBitmap(obj, info->anim);
|
||||
if (objData.objBitmap)
|
||||
{
|
||||
{
|
||||
Rect srcRect(object.rect.x, object.rect.y, tileSize, tileSize);
|
||||
|
||||
|
||||
drawObject(targetSurf, objData.objBitmap, &srcRect, objData.isMoving);
|
||||
if (objData.flagBitmap)
|
||||
{
|
||||
@ -890,7 +890,7 @@ void CMapHandler::CMapBlitter::drawObjects(SDL_Surface * targetSurf, const Terra
|
||||
else if (obj->pos.x == pos.x && obj->pos.y == pos.y)
|
||||
{
|
||||
Rect dstRect(realPos.x - 2 * tileSize, realPos.y - tileSize, 3 * tileSize, 2 * tileSize);
|
||||
drawHeroFlag(targetSurf, objData.flagBitmap, nullptr, &dstRect, false);
|
||||
drawHeroFlag(targetSurf, objData.flagBitmap, nullptr, &dstRect, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -946,7 +946,7 @@ void CMapHandler::CMapBlitter::blit(SDL_Surface * targetSurf, const MapDrawingIn
|
||||
{
|
||||
if (pos.y < 0 || pos.y >= parent->sizes.y)
|
||||
continue;
|
||||
|
||||
|
||||
const bool isVisible = canDrawCurrentTile();
|
||||
|
||||
realTileRect.x = realPos.x;
|
||||
@ -955,13 +955,13 @@ void CMapHandler::CMapBlitter::blit(SDL_Surface * targetSurf, const MapDrawingIn
|
||||
const TerrainTile2 & tile = parent->ttiles[pos.x][pos.y][pos.z];
|
||||
const TerrainTile & tinfo = parent->map->getTile(pos);
|
||||
const TerrainTile * tinfoUpper = pos.y > 0 ? &parent->map->getTile(int3(pos.x, pos.y - 1, pos.z)) : nullptr;
|
||||
|
||||
|
||||
if(isVisible || info->showAllTerrain)
|
||||
{
|
||||
drawTileTerrain(targetSurf, tinfo, tile);
|
||||
if (tinfo.riverType)
|
||||
drawRiver(targetSurf, tinfo);
|
||||
drawRoad(targetSurf, tinfo, tinfoUpper);
|
||||
drawRoad(targetSurf, tinfo, tinfoUpper);
|
||||
}
|
||||
|
||||
if(isVisible)
|
||||
@ -1017,8 +1017,8 @@ void CMapHandler::CMapBlitter::blit(SDL_Surface * targetSurf, const MapDrawingIn
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
drawOverlayEx(targetSurf);
|
||||
|
||||
drawOverlayEx(targetSurf);
|
||||
|
||||
// drawDebugGrid()
|
||||
if (settings["session"]["showGrid"].Bool())
|
||||
@ -1091,10 +1091,10 @@ CMapHandler::AnimBitmapHolder CMapHandler::CMapBlitter::findBoatBitmap(const CGB
|
||||
}
|
||||
|
||||
SDL_Surface * CMapHandler::CMapBlitter::findFlagBitmap(const CGHeroInstance * hero, int anim, const PlayerColor * color, int indexOffset) const
|
||||
{
|
||||
{
|
||||
if (!hero)
|
||||
return nullptr;
|
||||
|
||||
|
||||
if (hero->boat)
|
||||
return findBoatFlagBitmap(hero->boat, anim, color, indexOffset, hero->moveDir);
|
||||
return findHeroFlagBitmap(hero, anim, color, indexOffset);
|
||||
@ -1121,8 +1121,8 @@ SDL_Surface * CMapHandler::CMapBlitter::findBoatFlagBitmap(const CGBoat * boat,
|
||||
SDL_Surface * CMapHandler::CMapBlitter::findFlagBitmapInternal(const CDefEssential * def, int anim, int indexOffset, ui8 dir, bool moving) const
|
||||
{
|
||||
if (moving)
|
||||
return def->ourImages[indexOffset + anim % FRAMES_PER_MOVE_ANIM_GROUP].bitmap;
|
||||
return def->ourImages[getHeroFrameNum(dir, false) * FRAMES_PER_MOVE_ANIM_GROUP + (anim / 4) % FRAMES_PER_MOVE_ANIM_GROUP].bitmap;
|
||||
return def->ourImages[indexOffset + anim % FRAMES_PER_MOVE_ANIM_GROUP].bitmap;
|
||||
return def->ourImages[getHeroFrameNum(dir, false) * FRAMES_PER_MOVE_ANIM_GROUP + (anim / 4) % FRAMES_PER_MOVE_ANIM_GROUP].bitmap;
|
||||
}
|
||||
|
||||
int CMapHandler::CMapBlitter::findAnimIndexByGroup(const CDefEssential * def, int groupNum) const
|
||||
@ -1141,9 +1141,9 @@ CMapHandler::AnimBitmapHolder CMapHandler::CMapBlitter::findObjectBitmap(const C
|
||||
return findHeroBitmap(static_cast<const CGHeroInstance*>(obj), anim);
|
||||
if (obj->ID == Obj::BOAT)
|
||||
return findBoatBitmap(static_cast<const CGBoat*>(obj), anim);
|
||||
|
||||
// normal object
|
||||
|
||||
|
||||
// normal object
|
||||
|
||||
const std::vector<Cimage> &ourImages = graphics->getDef(obj)->ourImages;
|
||||
SDL_Surface *bitmap = ourImages[(anim + getPhaseShift(obj)) % ourImages.size()].bitmap;
|
||||
|
||||
@ -1214,14 +1214,14 @@ std::pair<SDL_Surface *, bool> CMapHandler::CMapBlitter::getVisBitmap() const
|
||||
}
|
||||
|
||||
bool CMapHandler::updateObjectsFade()
|
||||
{
|
||||
{
|
||||
for (auto iter = fadeAnims.begin(); iter != fadeAnims.end(); )
|
||||
{
|
||||
int3 pos = (*iter).second.first;
|
||||
CFadeAnimation * anim = (*iter).second.second;
|
||||
|
||||
|
||||
anim->update();
|
||||
|
||||
|
||||
if (anim->isFading())
|
||||
++iter;
|
||||
else // fade finished
|
||||
@ -1230,7 +1230,7 @@ bool CMapHandler::updateObjectsFade()
|
||||
for (auto objIter = objs.begin(); objIter != objs.end(); ++objIter)
|
||||
{
|
||||
if ((*objIter).fadeAnimKey == (*iter).first)
|
||||
{
|
||||
{
|
||||
logAnim->traceStream() << "Fade anim finished for obj at " << pos << "; remaining: " << (fadeAnims.size() - 1);
|
||||
if (anim->fadingMode == CFadeAnimation::EMode::OUT)
|
||||
objs.erase(objIter); // if this was fadeout, remove the object from the map
|
||||
@ -1239,10 +1239,11 @@ bool CMapHandler::updateObjectsFade()
|
||||
break;
|
||||
}
|
||||
}
|
||||
delete (*iter).second.second;
|
||||
iter = fadeAnims.erase(iter);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return !fadeAnims.empty();
|
||||
}
|
||||
|
||||
@ -1250,7 +1251,7 @@ bool CMapHandler::startObjectFade(TerrainTileObject & obj, bool in, int3 pos)
|
||||
{
|
||||
SDL_Surface * fadeBitmap;
|
||||
assert(obj.obj);
|
||||
|
||||
|
||||
auto objData = normalBlitter->findObjectBitmap(obj.obj, 0);
|
||||
if (objData.objBitmap)
|
||||
{
|
||||
@ -1259,7 +1260,7 @@ bool CMapHandler::startObjectFade(TerrainTileObject & obj, bool in, int3 pos)
|
||||
logAnim->debugStream() << "Ignoring fade of moving object";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
fadeBitmap = CSDL_Ext::newSurface(32, 32); // TODO cache these bitmaps instead of creating new ones?
|
||||
Rect objSrcRect(obj.rect.x, obj.rect.y, 32, 32);
|
||||
CSDL_Ext::blit8bppAlphaTo24bpp(objData.objBitmap, &objSrcRect, fadeBitmap, nullptr);
|
||||
@ -1275,12 +1276,12 @@ bool CMapHandler::startObjectFade(TerrainTileObject & obj, bool in, int3 pos)
|
||||
anim->init(in ? CFadeAnimation::EMode::IN : CFadeAnimation::EMode::OUT, fadeBitmap, true);
|
||||
fadeAnims[++fadeAnimCounter] = std::pair<int3, CFadeAnimation*>(pos, anim);
|
||||
obj.fadeAnimKey = fadeAnimCounter;
|
||||
|
||||
logAnim->traceStream() << "Fade anim started for obj " << obj.obj->ID
|
||||
|
||||
logAnim->traceStream() << "Fade anim started for obj " << obj.obj->ID
|
||||
<< " at " << pos << "; anim count: " << fadeAnims.size();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1303,17 +1304,17 @@ bool CMapHandler::printObject(const CGObjectInstance *obj, bool fadein /* = fals
|
||||
cr.x = fx*32;
|
||||
cr.y = fy*32;
|
||||
TerrainTileObject toAdd(obj, cr);
|
||||
|
||||
|
||||
if((obj->pos.x + fx - tilesW+1)>=0 && (obj->pos.x + fx - tilesW+1)<ttiles.size()-frameW && (obj->pos.y + fy - tilesH+1)>=0 && (obj->pos.y + fy - tilesH+1)<ttiles[0].size()-frameH)
|
||||
{
|
||||
int3 pos(obj->pos.x + fx - tilesW + 1, obj->pos.y + fy - tilesH + 1, obj->pos.z);
|
||||
TerrainTile2 & curt = ttiles[pos.x][pos.y][pos.z];
|
||||
|
||||
TerrainTile2 & curt = ttiles[pos.x][pos.y][pos.z];
|
||||
|
||||
if (fadein && ADVOPT.objectFading)
|
||||
{
|
||||
startObjectFade(toAdd, true, pos);
|
||||
}
|
||||
|
||||
|
||||
auto i = curt.objects.begin();
|
||||
for(; i != curt.objects.end(); i++)
|
||||
{
|
||||
@ -1543,7 +1544,7 @@ CMapHandler::~CMapHandler()
|
||||
for(int j=0; j < elem.size(); ++j)
|
||||
SDL_FreeSurface(elem[j]);
|
||||
}
|
||||
|
||||
|
||||
for (auto & elem : fadeAnims)
|
||||
{
|
||||
delete elem.second.second;
|
||||
|
Loading…
Reference in New Issue
Block a user