From 06b6445f38519ca6f0b6d97cf3795f41cb970632 Mon Sep 17 00:00:00 2001 From: Sebastien Benard Date: Thu, 11 Jan 2024 16:35:12 +0100 Subject: [PATCH] Unified invalidated rules rebuild --- src/electron.renderer/page/Editor.hx | 70 ++++++++++++++++++- src/electron.renderer/ui/modal/DebugMenu.hx | 14 ++-- .../ui/modal/panel/EditAllAutoLayerRules.hx | 70 +------------------ 3 files changed, 75 insertions(+), 79 deletions(-) diff --git a/src/electron.renderer/page/Editor.hx b/src/electron.renderer/page/Editor.hx index 5731ff963..24b50a8f2 100644 --- a/src/electron.renderer/page/Editor.hx +++ b/src/electron.renderer/page/Editor.hx @@ -1609,7 +1609,73 @@ class Editor extends Page { removePendingAction("rebuildAutoLayers"); }); }); -} + } + + + + public function applyInvalidatedRulesInAllLevels() { + var ops = []; + var affectedLayers : Map = new Map(); + + for(ld in project.defs.layers) + for(rg in ld.autoRuleGroups) + for(r in rg.rules) { + if( !r.invalidated ) + continue; + + for( w in project.worlds ) + for( l in w.levels ) { + var li = l.getLayerInstance(ld); + + r.invalidated = false; + + if( li.autoTilesCache==null ) { + // Run all rules + ops.push({ + label: 'Initializing autoTiles cache in ${l.identifier}.${li.def.identifier}', + cb: ()->{ li.applyAllRules(); } + }); + affectedLayers.set(li,l); + } + else { + // Apply rule + if( !r.isEmpty() ) { + ops.push({ + label: 'Applying rule #${r.uid} in ${l.identifier}.${li.def.identifier}', + cb: ()->{ li.applyRuleToFullLayer(r, false); }, + }); + affectedLayers.set(li,l); + } + } + } + } + + // Apply "break on match" cascading effect in changed layers + var affectedLevels : Map = new Map(); + for(li in affectedLayers.keys()) { + affectedLevels.set( affectedLayers.get(li), true ); + ops.push({ + label: 'Applying break on matches on ${affectedLayers.get(li).identifier}.${li.def.identifier}', + cb: li.applyBreakOnMatchesEverywhere.bind(), + }); + } + + // Refresh world renders & break caches + for(l in affectedLevels.keys()) + ops.push({ + label: 'Refreshing world render for ${l.identifier}...', + cb: ()->{ + worldRender.invalidateLevelRender(l); + invalidateLevelCache(l); + }, + }); + + if( ops.length>0 ) { + App.LOG.general("Applying invalidated rules..."); + new ui.modal.Progress(L.t._("Updating auto layers..."), ops, levelRender.renderAll); + } + } + // public function invalidateLayerRules(layerDefUid:Int) { // // if( active ) @@ -2298,6 +2364,8 @@ class Editor extends Page { case LayerRuleGroupCollapseChanged(rg): case BeforeProjectSaving: + applyInvalidatedRulesInAllLevels(); + case ProjectSaved: case ProjectSelected: diff --git a/src/electron.renderer/ui/modal/DebugMenu.hx b/src/electron.renderer/ui/modal/DebugMenu.hx index 12b063276..258b68b86 100644 --- a/src/electron.renderer/ui/modal/DebugMenu.hx +++ b/src/electron.renderer/ui/modal/DebugMenu.hx @@ -67,15 +67,11 @@ class DebugMenu extends ui.modal.ContextMenu { label: L.untranslated("Rebuild all auto-layers"), show: Editor.exists, cb: ()->{ - for(w in project.worlds) - for(l in w.levels) - for(li in l.layerInstances) - li.autoTilesCache = null; - editor.checkAutoLayersCache( (_)->{ - N.success("Done"); - editor.levelRender.invalidateAll(); - editor.worldRender.invalidateAll(); - }); + for(ld in project.defs.layers) + for(rg in ld.autoRuleGroups) + for(r in rg.rules) + r.invalidated = true; + editor.applyInvalidatedRulesInAllLevels(); } }); diff --git a/src/electron.renderer/ui/modal/panel/EditAllAutoLayerRules.hx b/src/electron.renderer/ui/modal/panel/EditAllAutoLayerRules.hx index 2e6b64da6..911cd23d4 100644 --- a/src/electron.renderer/ui/modal/panel/EditAllAutoLayerRules.hx +++ b/src/electron.renderer/ui/modal/panel/EditAllAutoLayerRules.hx @@ -45,9 +45,6 @@ class EditAllAutoLayerRules extends ui.modal.Panel { this.li = li; updateFullPanel(); - case BeforeProjectSaving: - applyInvalidatedRulesInAllLevels(); - case LayerRuleChanged(r): invalidateRuleAndOnesBelow(r); updateRule(r); @@ -98,8 +95,8 @@ class EditAllAutoLayerRules extends ui.modal.Panel { override function onClose() { super.onClose(); - applyInvalidatedRulesInAllLevels(); editor.levelRender.clearTemp(); + editor.applyInvalidatedRulesInAllLevels(); } inline function invalidateRule(r:data.def.AutoLayerRuleDef) { @@ -124,71 +121,6 @@ class EditAllAutoLayerRules extends ui.modal.Panel { } - function applyInvalidatedRulesInAllLevels() { - var ops = []; - var affectedLayers : Map = new Map(); - - // Apply edited rules to all other levels - for(rg in ld.autoRuleGroups) - for(r in rg.rules) { - if( !r.invalidated ) - continue; - - for( w in project.worlds ) - for( l in w.levels ) { - var li = l.getLayerInstance(ld); - - r.invalidated = false; - - if( li.autoTilesCache==null ) { - // Run all rules - ops.push({ - label: 'Initializing autoTiles cache in ${l.identifier}.${li.def.identifier}', - cb: ()->{ li.applyAllRules(); } - }); - affectedLayers.set(li,l); - } - else { - // Apply rule - if( !r.isEmpty() ) { - var r = r; - ops.push({ - label: 'Applying rule #${r.uid} in ${l.identifier}.${li.def.identifier}', - cb: ()->{ li.applyRuleToFullLayer(r, false); }, - }); - affectedLayers.set(li,l); - } - } - } - } - - // Apply "break on match" cascading effect in changed layers - var affectedLevels : Map = new Map(); - for(li in affectedLayers.keys()) { - affectedLevels.set( affectedLayers.get(li), true ); - ops.push({ - label: 'Applying break on matches on ${affectedLayers.get(li).identifier}.${li.def.identifier}', - cb: li.applyBreakOnMatchesEverywhere.bind(), - }); - } - - // Refresh world renders & break caches - for(l in affectedLevels.keys()) - ops.push({ - label: 'Refreshing world render for ${l.identifier}...', - cb: ()->{ - editor.worldRender.invalidateLevelRender(l); - editor.invalidateLevelCache(l); - }, - }); - - if( ops.length>0 ) { - App.LOG.general("Applying invalidated rules..."); - new Progress(L.t._("Updating auto layers..."), ops, editor.levelRender.renderAll); - } - } - - function showAffectedCells(r:data.def.AutoLayerRuleDef) { if( App.ME.isCtrlCmdDown() ) return;