added defering of pixel spawning
This commit is contained in:
		| @@ -17,6 +17,8 @@ import org.jetbrains.annotations.NotNull; | |||||||
| import javax.annotation.Nullable; | import javax.annotation.Nullable; | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.util.*; | import java.util.*; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import java.util.stream.IntStream; | ||||||
|  |  | ||||||
| public class PixelBlock { | public class PixelBlock { | ||||||
|     private final PixelBlockWorld pixelWorld; |     private final PixelBlockWorld pixelWorld; | ||||||
| @@ -122,34 +124,51 @@ public class PixelBlock { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void updateEntities() { |     public void updateEntities() { | ||||||
|         this.getBlockTaskChain() |         record PixelData(PixelBlock parent, Vector relativeLocation, BlockData block, double scale) { | ||||||
|             .sync(this::clearEntities) |             Pixel create() { | ||||||
|             .sync(() -> { |                 return Pixel.newPixel(this.parent, this.relativeLocation, this.block, this.scale); | ||||||
|                 for (int x = 0; x < pixelsPerBlock; x++) { |             } | ||||||
|                     for (int y = 0; y < pixelsPerBlock; y++) { |         } | ||||||
|                         for (int z = 0; z < pixelsPerBlock; z++) { |         List<PixelData> pixelData = new ArrayList<>(); | ||||||
|                             World world = pixelBlockLocation.getWorld(); |  | ||||||
|                             Location relativeLocation = new Location(world, x, y, z); |  | ||||||
|  |  | ||||||
|                             Location blockLocation = this.pixelWorld.getBuildOrigin(); |         this.clearEntities(); | ||||||
|                             switch (this.facingDirection) { |         for (int x = 0; x < pixelsPerBlock; x++) { | ||||||
|                                 case south -> blockLocation.add(relativeLocation.x(), relativeLocation.y(), relativeLocation.z()); |             for (int y = 0; y < pixelsPerBlock; y++) { | ||||||
|                                 case north -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.x(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.z()); |                 for (int z = 0; z < pixelsPerBlock; z++) { | ||||||
|                                 case east -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.z(), relativeLocation.y(), relativeLocation.x()); |                     World world = pixelBlockLocation.getWorld(); | ||||||
|                                 case west -> blockLocation.add(relativeLocation.z(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.x()); |                     Location relativeLocation = new Location(world, x, y, z); | ||||||
|                             } |  | ||||||
|                             BlockData block = blockLocation.getBlock().getBlockData(); |  | ||||||
|  |  | ||||||
|                             if(!block.getMaterial().isEmpty()) { |                     Location blockLocation = this.pixelWorld.getBuildOrigin(); | ||||||
|                                 this.getBlockTaskChain() |                     switch (this.facingDirection) { | ||||||
|                                     .delay(1) |                         case south -> blockLocation.add(relativeLocation.x(), relativeLocation.y(), relativeLocation.z()); | ||||||
|                                     .sync(() -> pixels.add(Pixel.newPixel(this, relativeLocation.toVector(), block, (double) 1 / pixelsPerBlock))) |                         case north -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.x(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.z()); | ||||||
|                                     .execute(); |                         case east -> blockLocation.add((pixelsPerBlock-1)-relativeLocation.z(), relativeLocation.y(), relativeLocation.x()); | ||||||
|                             } |                         case west -> blockLocation.add(relativeLocation.z(), relativeLocation.y(), (pixelsPerBlock-1)-relativeLocation.x()); | ||||||
|                         } |                     } | ||||||
|  |                     BlockData block = blockLocation.getBlock().getBlockData(); | ||||||
|  |  | ||||||
|  |                     if(!block.getMaterial().isEmpty()) { | ||||||
|  |                         pixelData.add(new PixelData(this, relativeLocation.toVector(), block, (double) 1 / pixelsPerBlock)); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }) |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         int spawnSpreadInTicks = 10; | ||||||
|  |         int chunkSize = (int) Math.ceil((double) pixelData.size() / spawnSpreadInTicks); | ||||||
|  |  | ||||||
|  |         IntStream.range(0, spawnSpreadInTicks) | ||||||
|  |             .mapToObj(i -> pixelData.stream() | ||||||
|  |                 .skip((long) i * chunkSize) | ||||||
|  |                 .limit(chunkSize) | ||||||
|  |                 .collect(Collectors.toList())) | ||||||
|  |             .forEach(pixels -> this.getBlockTaskChain() | ||||||
|  |                 .delay(1) | ||||||
|  |                 .sync(() -> pixels.forEach(pixel -> this.pixels.add(pixel.create()))) | ||||||
|  |                 .execute()); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         this.getBlockTaskChain() | ||||||
|             .sync(() -> { |             .sync(() -> { | ||||||
|                 if(this.pixels.size() < 5) { |                 if(this.pixels.size() < 5) { | ||||||
| //                    Location relativeLocation = new Location(pixelBlockLocation.getWorld(), 0, 0, 0); | //                    Location relativeLocation = new Location(pixelBlockLocation.getWorld(), 0, 0, 0); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user