diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ApplyTask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ApplyTask.java index b4a4b4dfb5..a0a9f9edcf 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ApplyTask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ApplyTask.java @@ -23,6 +23,7 @@ class ApplyTask extends RecursiveAction implements Runnable { private static final int SHIFT_REDUCTION = 1; private final CommonState commonState; + private final Region region; private final ApplyTask before; private final int minChunkX; private final int minChunkZ; @@ -39,7 +40,6 @@ public void run() { private record CommonState( F originalFilter, - Region region, ParallelQueueExtent parallelQueueExtent, ConcurrentMap> stateCache, boolean full, @@ -69,12 +69,12 @@ private ThreadState(SingleThreadQueueExtent queue, F filter) { ) { this.commonState = new CommonState<>( filter, - region.clone(), // clone only once, assuming the filter doesn't modify that clone parallelQueueExtent, new ConcurrentHashMap<>(), full, faweExceptionReasonsUsed ); + this.region = region.clone(); this.before = null; final BlockVector3 minimumPoint = region.getMinimumPoint(); this.minChunkX = minimumPoint.x() >> 4; @@ -88,6 +88,7 @@ private ThreadState(SingleThreadQueueExtent queue, F filter) { private ApplyTask( final CommonState commonState, + final Region region, final ApplyTask before, final int minChunkX, final int maxChunkX, @@ -96,6 +97,7 @@ private ApplyTask( final int higherShift ) { this.commonState = commonState; + this.region = region.clone(); this.minChunkX = minChunkX; this.maxChunkX = maxChunkX; this.minChunkZ = minChunkZ; @@ -120,7 +122,7 @@ protected void compute() { processRegion(regionX, regionZ, this.shift); continue; } - if (this.shift == 0 && !this.commonState.region.containsChunk(regionX, regionZ)) { + if (this.shift == 0 && !this.region.containsChunk(regionX, regionZ)) { // if shift == 0, region coords are chunk coords continue; // chunks not intersecting with the region don't need a task } @@ -128,6 +130,7 @@ protected void compute() { // creating more tasks will likely help parallelism as other threads aren't *that* busy subtask = new ApplyTask<>( this.commonState, + this.region, subtask, regionX << this.shift, ((regionX + 1) << this.shift) - 1, @@ -166,7 +169,7 @@ private void processRegion(int regionX, int regionZ, int shift) { try { for (int chunkX = regionX << shift; chunkX <= ((regionX + 1) << shift) - 1; chunkX++) { for (int chunkZ = regionZ << shift; chunkZ <= ((regionZ + 1) << shift) - 1; chunkZ++) { - if (!this.commonState.region.containsChunk(chunkX, chunkZ)) { + if (!this.region.containsChunk(chunkX, chunkZ)) { continue; // chunks not intersecting with the region must not be processed } applyChunk(chunkX, chunkZ, state); @@ -204,7 +207,7 @@ private void applyChunk(int chunkX, int chunkZ, ThreadState state) { state.block = state.queue.apply( state.block, state.filter, - this.commonState.region, + this.region, chunkX, chunkZ, this.commonState.full diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegion.java index c49d57a5a0..4aaa0d8c8a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegion.java @@ -89,13 +89,13 @@ public ConvexPolyhedralRegion(@Nullable World world) { public ConvexPolyhedralRegion(ConvexPolyhedralRegion region) { this(region.world); vertices.addAll(region.vertices); - triangles.addAll(region.triangles); + region.triangles.forEach(triangle -> triangles.add(triangle.clone())); vertexBacklog.addAll(region.vertexBacklog); minimumPoint = region.minimumPoint; maximumPoint = region.maximumPoint; centerAccum = region.centerAccum; - lastTriangle = region.lastTriangle; + lastTriangle = lastTriangle == null ? null : region.lastTriangle.clone(); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/polyhedron/Triangle.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/polyhedron/Triangle.java index bab9fe931a..326c3788cb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/polyhedron/Triangle.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/polyhedron/Triangle.java @@ -105,6 +105,11 @@ public Triangle tag(String tag) { return this; } + @Override + public Triangle clone() { + return new Triangle(vertices[0], vertices[1], vertices[2]); + } + @Override public String toString() { return tag + "(" + this.vertices[0] + "," + this.vertices[1] + "," + this.vertices[2] + ")";