diff --git a/BlueMapAPI b/BlueMapAPI index 7774935f..b8abf799 160000 --- a/BlueMapAPI +++ b/BlueMapAPI @@ -1 +1 @@ -Subproject commit 7774935fb3be51ea32b144261d1e5a02294f9d49 +Subproject commit b8abf79957681f908ab6834aae1e6144e274efb9 diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java index d17c36fd..00da738e 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java @@ -59,7 +59,7 @@ public class BlueMapAPIImpl extends BlueMapAPI { public BlueMapAPIImpl(Plugin plugin) { this.plugin = plugin; - this.renderer = new RenderAPIImpl(this, plugin.getRenderManager()); + this.renderer = new RenderAPIImpl(this, plugin); worlds = new HashMap<>(); for (World world : plugin.getWorlds()) { diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java index 2006e57c..dc244538 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java @@ -25,10 +25,13 @@ package de.bluecolored.bluemap.common.api; import com.flowpowered.math.vector.Vector2i; - import de.bluecolored.bluemap.api.BlueMapMap; +import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask; +import de.bluecolored.bluemap.common.rendermanager.WorldRegionRenderTask; import de.bluecolored.bluemap.core.map.BmMap; +import java.util.function.Predicate; + public class BlueMapMapImpl implements BlueMapMap { private BlueMapAPIImpl api; @@ -64,6 +67,47 @@ public Vector2i getTileOffset() { return delegate.getHiresModelManager().getTileGrid().getOffset(); } + @Override + public void setTileFilter(Predicate filter) { + delegate.setTileFilter(filter); + } + + @Override + public Predicate getTileFilter() { + return delegate.getTileFilter(); + } + + @Override + public boolean isFrozen() { + return !api.plugin.getPluginState().getMapState(delegate).isUpdateEnabled(); + } + + @Override + public synchronized void setFrozen(boolean frozen) { + if (isFrozen()) unfreeze(); + else freeze(); + } + + private synchronized void unfreeze() { + api.plugin.startWatchingMap(delegate); + api.plugin.getPluginState().getMapState(delegate).setUpdateEnabled(true); + api.plugin.getRenderManager().scheduleRenderTask(new MapUpdateTask(delegate)); + } + + private synchronized void freeze() { + api.plugin.stopWatchingMap(delegate); + api.plugin.getPluginState().getMapState(delegate).setUpdateEnabled(false); + api.plugin.getRenderManager().removeRenderTasksIf(task -> { + if (task instanceof MapUpdateTask) + return ((MapUpdateTask) task).getMap().equals(delegate); + + if (task instanceof WorldRegionRenderTask) + return ((WorldRegionRenderTask) task).getMap().equals(delegate); + + return false; + }); + } + public BmMap getMapType() { return delegate; } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/render/RenderAPIImpl.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/render/RenderAPIImpl.java index f3ecdef9..6693adb1 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/render/RenderAPIImpl.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/render/RenderAPIImpl.java @@ -30,20 +30,28 @@ import de.bluecolored.bluemap.api.renderer.RenderAPI; import de.bluecolored.bluemap.common.api.BlueMapAPIImpl; import de.bluecolored.bluemap.common.api.BlueMapMapImpl; +import de.bluecolored.bluemap.common.plugin.Plugin; +import de.bluecolored.bluemap.common.rendermanager.MapPurgeTask; +import de.bluecolored.bluemap.common.rendermanager.MapUpdateTask; import de.bluecolored.bluemap.common.rendermanager.RenderManager; import de.bluecolored.bluemap.common.rendermanager.WorldRegionRenderTask; +import de.bluecolored.bluemap.core.map.BmMap; import de.bluecolored.bluemap.core.world.Grid; +import java.io.IOException; +import java.util.Collection; import java.util.UUID; public class RenderAPIImpl implements RenderAPI { - private BlueMapAPIImpl api; - private RenderManager renderManager; + private final BlueMapAPIImpl api; + private final Plugin plugin; + private final RenderManager renderManager; - public RenderAPIImpl(BlueMapAPIImpl api, RenderManager renderManager) { + public RenderAPIImpl(BlueMapAPIImpl api, Plugin plugin) { this.api = api; - this.renderManager = renderManager; + this.plugin = plugin; + this.renderManager = plugin.getRenderManager(); } @Override @@ -63,12 +71,7 @@ public void render(String mapId, Vector2i tile) { @Override public void render(BlueMapMap map, Vector2i tile) { - BlueMapMapImpl cmap; - if (map instanceof BlueMapMapImpl) { - cmap = (BlueMapMapImpl) map; - } else { - cmap = api.getMapForId(map.getId()); - } + BlueMapMapImpl cmap = castMap(map); Grid regionGrid = cmap.getWorld().getWorld().getRegionGrid(); Grid tileGrid = cmap.getMapType().getHiresModelManager().getTileGrid(); @@ -78,6 +81,24 @@ public void render(BlueMapMap map, Vector2i tile) { } } + @Override + public boolean scheduleMapUpdateTask(BlueMapMap map, boolean force) { + BlueMapMapImpl cmap = castMap(map); + return renderManager.scheduleRenderTask(new MapUpdateTask(cmap.getMapType(), force)); + } + + @Override + public boolean scheduleMapUpdateTask(BlueMapMap map, Collection regions, boolean force) { + BlueMapMapImpl cmap = castMap(map); + return renderManager.scheduleRenderTask(new MapUpdateTask(cmap.getMapType(), regions, force)); + } + + @Override + public boolean scheduleMapPurgeTask(BlueMapMap map) throws IOException { + BlueMapMapImpl cmap = castMap(map); + return renderManager.scheduleRenderTask(new MapPurgeTask(cmap.getMapType())); + } + @Override public int renderQueueSize() { return renderManager.getScheduledRenderTasks().size(); @@ -95,12 +116,27 @@ public boolean isRunning() { @Override public void start() { - if (!isRunning()) renderManager.start(api.plugin.getCoreConfig().getRenderThreadCount()); + if (!isRunning()){ + renderManager.start(api.plugin.getCoreConfig().getRenderThreadCount()); + } + plugin.getPluginState().setRenderThreadsEnabled(true); } @Override public void pause() { renderManager.stop(); + plugin.getPluginState().setRenderThreadsEnabled(false); + } + + private BlueMapMapImpl castMap(BlueMapMap map) { + BlueMapMapImpl cmap; + if (map instanceof BlueMapMapImpl) { + cmap = (BlueMapMapImpl) map; + } else { + cmap = api.getMapForId(map.getId()); + } + + return cmap; } } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java index 2bd73178..3b277e87 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java @@ -37,6 +37,7 @@ import java.io.IOException; import java.nio.file.Path; import java.util.Objects; +import java.util.function.Predicate; public class BmMap { @@ -50,6 +51,8 @@ public class BmMap { private final HiresModelManager hiresModelManager; private final LowresModelManager lowresModelManager; + private Predicate tileFilter; + public BmMap(String id, String name, World world, Path fileRoot, ResourcePack resourcePack, MapSettings settings) throws IOException { this.id = Objects.requireNonNull(id); this.name = Objects.requireNonNull(name); @@ -79,9 +82,13 @@ public BmMap(String id, String name, World world, Path fileRoot, ResourcePack re new Vector2i(settings.getLowresPointsPerHiresTile(), settings.getLowresPointsPerHiresTile()), settings.useGzipCompression() ); + + this.tileFilter = t -> true; } public void renderTile(Vector2i tile) { + if (!tileFilter.test(tile)) return; + HiresModel hiresModel = hiresModelManager.render(world, tile); lowresModelManager.render(hiresModel); } @@ -127,7 +134,15 @@ public HiresModelManager getHiresModelManager() { public LowresModelManager getLowresModelManager() { return lowresModelManager; } - + + public Predicate getTileFilter() { + return tileFilter; + } + + public void setTileFilter(Predicate tileFilter) { + this.tileFilter = tileFilter; + } + @Override public int hashCode() { return id.hashCode();