1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-25 22:42:04 +02:00

Improve editor performance

This commit is contained in:
Opuszek
2025-10-06 20:33:09 +02:00
parent 076f7ba5b5
commit faad200aed
9 changed files with 831 additions and 580 deletions

View File

@@ -229,7 +229,7 @@ void MapController::setMap(std::unique_ptr<CMap> cmap)
_miniscenes[i].reset(new MinimapScene(i));
}
resetMapHandler();
sceneForceUpdate();
initializeMap();
connectScenes();
@@ -256,21 +256,24 @@ void MapController::initObstaclePainters(CMap * map)
}
}
void MapController::initializeMap()
{
for(int i = 0; i < _map->mapLevels; i++)
{
_scenes[i]->createMap();
_miniscenes[i]->createMap();
}
}
void MapController::sceneForceUpdate()
{
for(int i = 0; i < _map->mapLevels; i++)
{
_scenes[i]->updateViews();
_miniscenes[i]->updateViews();
_scenes[i]->updateMap();
_miniscenes[i]->updateMap();
}
}
void MapController::sceneForceUpdate(int level)
{
_scenes[level]->updateViews();
_miniscenes[level]->updateViews();
}
void MapController::resetMapHandler()
{
if(!_mapHandler)
@@ -293,16 +296,13 @@ void MapController::commitTerrainChange(int level, const TerrainId & terrain)
return;
_scenes[level]->selectionTerrainView.clear();
_scenes[level]->selectionTerrainView.draw();
_map->getEditManager()->getTerrainSelection().setSelection(v);
_map->getEditManager()->drawTerrain(terrain, terrainDecorationPercentageLevel, &CRandomGenerator::getDefault());
for(auto & t : v)
_scenes[level]->terrainView.setDirty(t);
_scenes[level]->terrainView.draw();
_scenes[level]->terrainView.redrawTerrain(v);
_miniscenes[level]->updateViews();
_miniscenes[level]->updateMap();
main->mapChanged();
}
@@ -314,19 +314,16 @@ void MapController::commitRoadOrRiverChange(int level, ui8 type, bool isRoad)
return;
_scenes[level]->selectionTerrainView.clear();
_scenes[level]->selectionTerrainView.draw();
_map->getEditManager()->getTerrainSelection().setSelection(v);
if(isRoad)
_map->getEditManager()->drawRoad(RoadId(type), &CRandomGenerator::getDefault());
else
_map->getEditManager()->drawRiver(RiverId(type), &CRandomGenerator::getDefault());
_scenes[level]->terrainView.redrawTerrain(v);
for(auto & t : v)
_scenes[level]->terrainView.setDirty(t);
_scenes[level]->terrainView.draw();
_miniscenes[level]->updateViews();
_miniscenes[level]->updateMap();
main->mapChanged();
}
@@ -351,15 +348,13 @@ void MapController::commitObjectErase(int level)
{
//invalidate tiles under objects
_mapHandler->removeObject(obj);
_scenes[level]->objectsView.setDirty(obj);
}
_scenes[level]->objectsView.redrawObjects(selectedObjects);
_scenes[level]->selectionObjectsView.clear();
_scenes[level]->objectsView.draw();
_scenes[level]->selectionObjectsView.draw();
_scenes[level]->passabilityView.update();
_scenes[level]->passabilityView.redraw();
_miniscenes[level]->updateViews();
_miniscenes[level]->updateMap();
main->mapChanged();
}
@@ -407,11 +402,11 @@ void MapController::pasteFromClipboard(int level)
if(!errors.isEmpty())
QMessageBox::warning(main, QObject::tr("Can't place object"), errors.join('\n'));
_scenes[level]->objectsView.draw();
_scenes[level]->passabilityView.update();
_scenes[level]->selectionObjectsView.draw();
_scenes[level]->objectsView.redraw();
_scenes[level]->passabilityView.redraw();
_scenes[level]->selectionObjectsView.redraw();
_miniscenes[level]->updateViews();
_miniscenes[level]->updateMap();
main->mapChanged();
}
@@ -421,9 +416,8 @@ bool MapController::discardObject(int level) const
if(_scenes[level]->selectionObjectsView.newObject)
{
_scenes[level]->selectionObjectsView.newObject.reset();
_scenes[level]->selectionObjectsView.shift = QPoint(0, 0);
_scenes[level]->selectionObjectsView.setShift(0, 0);
_scenes[level]->selectionObjectsView.selectionMode = SelectionObjectsLayer::NOTHING;
_scenes[level]->selectionObjectsView.draw();
return true;
}
return false;
@@ -433,7 +427,7 @@ void MapController::createObject(int level, std::shared_ptr<CGObjectInstance> ob
{
_scenes[level]->selectionObjectsView.newObject = obj;
_scenes[level]->selectionObjectsView.selectionMode = SelectionObjectsLayer::MOVEMENT;
_scenes[level]->selectionObjectsView.draw();
_scenes[level]->selectionObjectsView.redraw();
}
void MapController::commitObstacleFill(int level)
@@ -463,29 +457,26 @@ void MapController::commitObstacleFill(int level)
for(auto o : sel.second->placeObstacles(CRandomGenerator::getDefault()))
{
_mapHandler->invalidate(o.get());
_scenes[level]->objectsView.setDirty(o.get());
_scenes[level]->objectsView.redrawObjects({o.get()});
}
}
_scenes[level]->selectionTerrainView.clear();
_scenes[level]->selectionTerrainView.draw();
_scenes[level]->objectsView.draw();
_scenes[level]->objectsView.update();
_scenes[level]->passabilityView.update();
_miniscenes[level]->updateViews();
_miniscenes[level]->updateMap();
main->mapChanged();
}
void MapController::commitObjectChange(int level)
{
for( auto * o : _scenes[level]->selectionObjectsView.getSelection())
_scenes[level]->objectsView.setDirty(o);
_scenes[level]->objectsView.redrawObjects(_scenes[level]->selectionObjectsView.getSelection());
_scenes[level]->objectsView.draw();
_scenes[level]->selectionObjectsView.draw();
_scenes[level]->passabilityView.update();
_scenes[level]->selectionObjectsView.redraw();
_scenes[level]->passabilityView.redraw();
_miniscenes[level]->updateViews();
_miniscenes[level]->updateMap();
main->mapChanged();
}
@@ -502,29 +493,30 @@ void MapController::commitObjectShift(int level)
bool makeShift = !shift.isNull();
if(makeShift)
{
for(auto * obj : _scenes[level]->selectionObjectsView.getSelection())
std::set<CGObjectInstance*> movedObjects = _scenes[level]->selectionObjectsView.getSelection();
for(auto * obj : movedObjects)
{
int3 pos = obj->pos;
pos.z = level;
pos.x += shift.x(); pos.y += shift.y();
_scenes[level]->objectsView.setDirty(obj); //set dirty before movement
_map->getEditManager()->moveObject(obj, pos);
_mapHandler->invalidate(obj);
}
_scenes[level]->objectsView.redrawObjects(movedObjects);
}
_scenes[level]->selectionObjectsView.newObject = nullptr;
_scenes[level]->selectionObjectsView.shift = QPoint(0, 0);
_scenes[level]->selectionObjectsView.setShift(0, 0);
_scenes[level]->selectionObjectsView.selectionMode = SelectionObjectsLayer::NOTHING;
if(makeShift)
{
_scenes[level]->objectsView.draw();
_scenes[level]->selectionObjectsView.draw();
_scenes[level]->passabilityView.update();
_scenes[level]->objectsView.redraw();
_scenes[level]->passabilityView.redraw();
_scenes[level]->selectionObjectsView.redraw();
_miniscenes[level]->updateViews();
_miniscenes[level]->updateMap();
main->mapChanged();
}
}
@@ -547,16 +539,14 @@ void MapController::commitObjectCreate(int level)
_map->getEditManager()->insertObject(newObj);
_mapHandler->invalidate(newObj.get());
_scenes[level]->objectsView.setDirty(newObj.get());
_scenes[level]->objectsView.redrawObjects({newObj.get()});
_scenes[level]->selectionObjectsView.newObject = nullptr;
_scenes[level]->selectionObjectsView.shift = QPoint(0, 0);
_scenes[level]->selectionObjectsView.setShift(0, 0);
_scenes[level]->selectionObjectsView.selectionMode = SelectionObjectsLayer::NOTHING;
_scenes[level]->objectsView.draw();
_scenes[level]->selectionObjectsView.draw();
_scenes[level]->passabilityView.update();
_scenes[level]->passabilityView.redraw();
_miniscenes[level]->updateViews();
_miniscenes[level]->updateMap();
main->mapChanged();
}