From f02c4a677825f9b5805834f730d55f2ca22603f7 Mon Sep 17 00:00:00 2001 From: Sebastien Benard Date: Thu, 11 Jan 2024 09:55:00 +0100 Subject: [PATCH] Fixed IntGrid counts cache when resizing levels (#1042) --- src/electron.renderer/data/Level.hx | 2 ++ .../data/inst/LayerInstance.hx | 23 ++++++++++++++----- .../ui/modal/panel/EditLayerDefs.hx | 5 ++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/electron.renderer/data/Level.hx b/src/electron.renderer/data/Level.hx index 092976f13..69f53fa5a 100644 --- a/src/electron.renderer/data/Level.hx +++ b/src/electron.renderer/data/Level.hx @@ -668,6 +668,8 @@ class Level { li.applyNewBounds(newPxLeft, newPxTop, newPxWid, newPxHei); pxWid = newPxWid; pxHei = newPxHei; + for(li in layerInstances) + li.recountAllIntGridValues(); // Remove entities out of bounds var n = 0; diff --git a/src/electron.renderer/data/inst/LayerInstance.hx b/src/electron.renderer/data/inst/LayerInstance.hx index 12812f0b3..940daf3f5 100644 --- a/src/electron.renderer/data/inst/LayerInstance.hx +++ b/src/electron.renderer/data/inst/LayerInstance.hx @@ -82,6 +82,20 @@ class LayerInstance { return areaIntGridUseCount.exists(iv) && areaIntGridUseCount.get(iv).get(areaCoordId(cx,cy)) > 0; } + public function recountAllIntGridValues() { + if( def.type!=IntGrid ) + return; + + areaIntGridUseCount = new Map(); + layerIntGridUseCount = new Map(); + + for(cy in 0...cHei) + for(cx in 0...cWid) { + if( hasIntGrid(cx,cy) ) + increaseAreaIntGridValueCount(getIntGrid(cx,cy), cx, cy); + } + } + inline function increaseAreaIntGridValueCount(iv:Int, cx:Int, cy:Int) { if( iv==0 || iv==null ) return; @@ -353,19 +367,16 @@ class LayerInstance { if( json.intGridCsv==null ) { // Read old pre-CSV format - for( intGridJson in json.intGrid ) { + for( intGridJson in json.intGrid ) li.intGrid.set( intGridJson.coordId, intGridJson.v+1 ); - li.increaseAreaIntGridValueCount( intGridJson.v+1, li.getCx(intGridJson.coordId), li.getCy(intGridJson.coordId) ); - } } else { // Read CSV format for(coordId in 0...json.intGridCsv.length) - if( json.intGridCsv[coordId]>=0 ) { + if( json.intGridCsv[coordId]>=0 ) li.intGrid.set(coordId, json.intGridCsv[coordId]); - li.increaseAreaIntGridValueCount( json.intGridCsv[coordId], li.getCx(coordId), li.getCy(coordId) ); - } } + li.recountAllIntGridValues(); for( gridTilesJson in json.gridTiles ) { if( dn.Version.lower(p.jsonVersion, "0.4", true) || gridTilesJson.d==null ) diff --git a/src/electron.renderer/ui/modal/panel/EditLayerDefs.hx b/src/electron.renderer/ui/modal/panel/EditLayerDefs.hx index b9c27ceb0..65d457704 100644 --- a/src/electron.renderer/ui/modal/panel/EditLayerDefs.hx +++ b/src/electron.renderer/ui/modal/panel/EditLayerDefs.hx @@ -308,6 +308,11 @@ class EditLayerDefs extends ui.modal.Panel { } } i.onChange = ()->{ + for(w in project.worlds) + for(l in w.levels) + for(li in l.layerInstances) + li.recountAllIntGridValues(); + editor.ge.emit( LayerDefChanged(cur.uid, false) ); for(ld in project.defs.layers)