StagedChunkGenerator class
Пакет: com.hypixel.hytale.builtin.hytalegenerator.engine.chunkgenerator
Файл: com/hypixel/hytale/builtin/hytalegenerator/engine/chunkgenerator/StagedChunkGenerator.java
implements: ChunkGenerator
Поля (180)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public final BufferType |
ENTITY_OUTPUT_BUFFER_TYPE |
|
public final ParametrizedBufferType |
ENVIRONMENT_OUTPUT_BUFFER_TYPE |
|
public final ParametrizedBufferType |
MATERIAL_OUTPUT_BUFFER_TYPE |
|
public final ParametrizedBufferType |
TINT_OUTPUT_BUFFER_TYPE |
final |
int |
WORLD_MIN_Y_BUFFER_GRID |
|
|
break |
|
private double |
bufferCapacityFactor |
|
private final Map<String, StagedChunkGenerator.ExecutorTier> |
concurrencyTiers |
|
private MaterialCache |
materialCache |
|
private String |
profiledExecutorKey |
|
private PositionProvider |
spawnPositions |
|
private final List<Stage> |
stages |
|
private IntSet |
statsCheckpoints |
|
private String |
statsHeader |
|
private double |
targetPlayerCount |
|
private double |
targetViewDistance |
|
StringBuilder |
var1 |
|
StagedChunkGenerator |
var1 |
|
Int2ObjectMap |
var1 |
|
Set |
var1 |
|
Bounds3i |
var1 |
|
WorkerIndexer |
var10 |
|
HierarchicalTimingProfiler.Probe |
var10 |
|
GeneratedBlockChunk |
var10 |
|
int |
var10 |
|
GeneratedBlockChunk |
var10 |
|
EnvironmentChunk.BulkWriter |
var10 |
|
HierarchicalTimingProfiler.Probe |
var10 |
|
double |
var10 |
|
ExecutorService |
var11 |
|
Holder[] |
var11 |
|
HierarchicalTimingProfiler.Probe |
var11 |
|
int |
var11 |
|
BufferType |
var12 |
|
ComponentType |
var12 |
|
int |
var12 |
|
Vector3i |
var12 |
|
EnvironmentChunk.BulkWriter.ColumnWriter |
var12 |
|
double |
var12 |
|
|
var12 |
|
|
var12 |
|
Bounds3i |
var12 |
|
HierarchicalTimingProfiler.Probe |
var13 |
|
Bounds3i |
var13 |
|
CompletableFuture[] |
var13 |
|
Vector3i |
var13 |
|
int |
var13 |
|
Bounds3i |
var13 |
|
HierarchicalTimingProfiler.Probe |
var14 |
|
BufferBundle.Access.View |
var14 |
|
int |
var14 |
|
List |
var14 |
|
int |
var14 |
|
double |
var14 |
|
Bounds3i |
var14 |
|
int |
var15 |
|
int |
var15 |
|
Bounds3i |
var15 |
|
Stage |
var16 |
|
Vector3i |
var16 |
|
FluidSection |
var16 |
|
int |
var16 |
|
double |
var16 |
|
List |
var17 |
|
HierarchicalTimingProfiler.Probe |
var17 |
|
Material |
var17 |
|
HierarchicalTimingProfiler.Probe |
var17 |
|
List |
var18 |
|
Bounds3i |
var18 |
|
CompletableFuture |
var18 |
|
SolidMaterial |
var18 |
|
int |
var18 |
|
double |
var18 |
|
BufferBundle.Access.View |
var19 |
|
FluidMaterial |
var19 |
|
int |
var19 |
|
Map |
var2 |
|
double |
var2 |
|
StringBuilder |
var2 |
|
Set |
var2 |
|
Stage |
var2 |
|
Bounds3i[] |
var2 |
|
int |
var20 |
|
double |
var20 |
|
BufferBundle.Grid |
var21 |
|
int |
var21 |
|
boolean |
var22 |
|
|
var22 |
|
CompletableFuture |
var22 |
|
HierarchicalTimingProfiler.Probe |
var23 |
|
BufferBundle.Access |
var25 |
|
List |
var26 |
|
WorkerIndexer.Id |
var27 |
|
List |
var28 |
|
boolean |
var3 |
|
BufferBundle.Tracker |
var3 |
|
BufferBundle.Tracker |
var3 |
|
Int2ObjectMap |
var3 |
|
IntList |
var3 |
|
IntList |
var3 |
|
int |
var3 |
|
Stage |
var3 |
|
Vector3i |
var30 |
|
Runnable |
var31 |
|
HierarchicalTimingProfiler.Probe |
var32 |
|
GeneratedChunk |
var33 |
|
List |
var34 |
|
BufferBundle.MemoryReport |
var35 |
|
StringBuilder |
var36 |
|
Bounds3i |
var37 |
|
List |
var38 |
|
Vector3i |
var39 |
|
HierarchicalTimingProfiler.Probe |
var4 |
|
Stage |
var4 |
|
Bounds3i |
var4 |
|
List |
var4 |
|
IntListIterator |
var4 |
|
Bounds3i |
var4 |
|
Bounds3i |
var4 |
|
List |
var40 |
|
WorkerIndexer.Session |
var41 |
|
List |
var42 |
|
HierarchicalTimingProfiler.Probe |
var44 |
|
HierarchicalTimingProfiler.Probe |
var45 |
|
List |
var46 |
|
CompletableFuture |
var49 |
|
HierarchicalTimingProfiler.Probe |
var5 |
|
List |
var5 |
|
Stage |
var5 |
|
Vector3i |
var5 |
|
Vector3i |
var5 |
|
Vector3i |
var5 |
|
int |
var5 |
|
Stage |
var5 |
|
HierarchicalTimingProfiler.Probe |
var6 |
|
Bounds3i |
var6 |
|
Map |
var6 |
|
Bounds3i |
var6 |
|
SolidMaterial |
var6 |
|
Bounds3i |
var6 |
|
Bounds3i |
var6 |
|
Bounds3i |
var6 |
|
Integer |
var6 |
|
Bounds3i |
var6 |
|
Vector3d |
var6 |
|
Holder[] |
var6 |
|
BufferType |
var6 |
|
List |
var6 |
|
Bounds3i |
var7 |
|
List |
var7 |
|
Bounds3i |
var7 |
|
Bounds3i |
var7 |
|
Bounds3i |
var7 |
|
Bounds3i |
var7 |
|
BufferBundle.Access |
var7 |
|
Holder |
var7 |
|
Vector3i |
var7 |
|
Map |
var8 |
|
int |
var8 |
|
BufferBundle.Access |
var8 |
|
BufferBundle.Access |
var8 |
|
BufferBundle.Access |
var8 |
|
Integer |
var8 |
|
BufferBundle.Access |
var8 |
|
EntityBufferView |
var8 |
|
BlockType |
var8 |
|
Stage |
var8 |
|
double |
var8 |
|
Stage |
var8 |
|
StagedChunkGenerator.ExecutorTier |
var9 |
|
BufferBundle.Access |
var9 |
|
Stage.Context |
var9 |
|
VoxelSpace |
var9 |
|
VoxelSpace |
var9 |
|
int |
var9 |
|
VoxelSpace |
var9 |
|
VoxelSpace |
var9 |
|
Vector3i |
var9 |
|
GeneratedEntityChunk |
var9 |
|
Map |
var9 |
Методы (75)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public |
Builderpublic Builder() |
public |
record |
ExecutorTierrecord ExecutorTier(@Nonnull ExecutorService executor, @Nonnull WorkerIndexer workerIndexer) |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Invalid concurrency key provided: " + var2) |
|
public StagedChunkGenerator.Builder |
addExecutorTierpublic StagedChunkGenerator.Builder addExecutorTier(@Nonnull String var1, @Nonnull StagedChunkGenerator.ExecutorTier var2) |
|
public StagedChunkGenerator.Builder |
appendStagepublic StagedChunkGenerator.Builder appendStage(@Nonnull Stage var1) |
|
public StagedChunkGenerator |
buildpublic StagedChunkGenerator build() |
|
private static int |
calculateCapacityFromBoundsprivate static int calculateCapacityFromBounds(@Nonnull Bounds3i var0, double var1, double var3, double var5) |
abstract |
return |
calculateCapacityFromBoundsreturn calculateCapacityFromBounds(var4, this.bufferCapacityFactor, this.targetViewDistance, this.targetPlayerCount) |
|
private Set<BufferType> |
createListOfAllBufferTypesprivate Set<BufferType> createListOfAllBufferTypes() |
|
private Int2ObjectMap<IntSet> |
createStageDependencyMapprivate Int2ObjectMap<IntSet> createStageDependencyMap() |
|
private IntList |
createStagesThatReadFromprivate IntList createStagesThatReadFrom(int var1) |
|
private Bounds3i[] |
createTotalOutputBoundsArrayprivate Bounds3i[] createTotalOutputBoundsArray(@Nonnull Int2ObjectMap<IntSet> var1) |
|
private void |
createTotalOutputBoundsForStageprivate void createTotalOutputBoundsForStage(int var1, @Nonnull Int2ObjectMap<IntSet> var2, @Nonnull Bounds3i[] var3) |
|
|
for for(int var12 = 0; var12 < this.stages.length; var12++) |
|
|
for for(BufferType var20 : var17) |
|
|
for for(var39.x = var37.min.x; var39.x < var37.max.x; var39.x++) |
|
|
for for(var39.z = var37.min.z; var39.z < var37.max.z; var39.z++) |
|
|
for for(BufferBundle.Grid var24 : var18) |
|
|
for for(List var48 : var42) |
|
|
for for(Runnable var2 : var48) |
|
|
for for(int var3 = 0; var3 < this.stages.length; var3++) |
|
|
for for(BufferType var8 : var5) |
|
|
for for(var5.x = var6.min.x; var5.x < var6.max.x; var5.x++) |
|
|
for for(var5.z = var6.min.z; var5.z < var6.max.z; var5.z++) |
|
|
for for(var5.y = var6.min.y; var5.y < var6.max.y; var5.y++) |
|
|
for for(int var14 = 0; var14 < 10; var14++) |
|
|
for for(int var11 = 0; var11 < 32; var11++) |
|
|
for for(int var13 = 0; var13 < 32; var13++) |
|
|
for for(int var15 = var9; var15 < var10; var15++) |
|
|
for for(int var6 = 0; var6 < 32; var6++) |
|
|
for for(int var7 = 0; var7 < 32; var7++) |
|
|
for for(int var15 = 0; var15 < var13.x; var15++) |
|
|
for for(int var16 = 0; var16 < var13.z; var16++) |
|
|
for for(int var10 = var18; var10 < var20; var10++) |
|
|
for for(int var11 = var19; var11 < var21; var11++) |
|
|
for for(int var3 = 0; var3 < this.stages.length; var3++) |
|
|
for for(var2.y = 0; var2.y < 40; var2.y++) |
|
|
for for(BufferType var5 : var2) |
|
|
for for(Bounds3i var3 : var0) |
abstract |
|
for for(int var43 = 0; var43 < var40.size() |
abstract |
|
for for(int var29 = 0; var29 < var26.size() |
abstract |
|
for for(int var5 = 0; var5 < var4.size() |
abstract |
|
for for(int var7 = 0; var7 < this.stages.size() |
abstract |
|
for for(int var2 = 0; var2 < this.stages.size() |
abstract |
|
for for(int var6 = 0; var6 < this.stages.size() |
abstract |
|
for for(int var16 = 1; var16 < var6.size() |
|
private static Bounds3i |
getEncompassingBoundsprivate static Bounds3i getEncompassingBounds(@Nonnull Collection<Bounds3i> var0) |
|
|
if if(var3) |
|
|
if if(var9 == null) |
|
|
if if(!var22) |
|
|
if if(var2x == null) |
|
|
if if(var6 != null && var6.holder != null) |
|
|
if if(var1x == null) |
|
|
if if(var17 != null && var17 != this.materialCache.EMPTY) |
|
|
if if(var1x == null) |
|
|
if if(var8 == null) |
|
|
if if(var1x == null) |
|
|
if if(var1x == null) |
|
|
if if(var1x == null) |
|
|
if if(var5 >= 0) |
|
|
if if(var3 >= var2.length) |
|
|
if if(var7.x == 1 && var7.z == 1) |
|
|
if if(var12 != null) |
static |
boolean |
isColumnCachedboolean isColumnCached(@Nonnull BufferBundle.Access var0, @Nonnull Vector3i var1, int var2) |
|
private boolean |
isGeneratorOutputBufferTypeprivate boolean isGeneratorOutputBufferType(@Nonnull BufferType var1) |
|
private int |
resolveBufferCapacityprivate int resolveBufferCapacity(@Nonnull BufferType var1, @Nonnull Bounds3i[] var2) |
static |
void |
setBoundsToWorldHeight_bufferGridvoid setBoundsToWorldHeight_bufferGrid(@Nonnull Bounds3i var0) |
|
public StagedChunkGenerator.Builder |
setProfiledExecutorKeypublic StagedChunkGenerator.Builder setProfiledExecutorKey(@Nonnull String var1) |
static |
void |
setSupportvoid setSupport(@Nonnull GeneratedChunk var0, int var1, int var2, int var3, int var4, int var5) |
abstract |
|
setSupport setSupport(var2, var11, var15, var13, var18.blockId, var18.support) |
static |
void |
updateTrackersForColumnvoid updateTrackersForColumn(int var0, @Nonnull BufferBundle.Access.View var1, @Nonnull Vector3i var2) |
|
public StagedChunkGenerator.Builder |
withBufferCapacitypublic StagedChunkGenerator.Builder withBufferCapacity(double var1, double var3, double var5) |
|
public StagedChunkGenerator.Builder |
withMaterialCachepublic StagedChunkGenerator.Builder withMaterialCache(@Nonnull MaterialCache var1) |
|
public StagedChunkGenerator.Builder |
withSpawnPositionspublic StagedChunkGenerator.Builder withSpawnPositions(@Nonnull PositionProvider var1) |
|
public StagedChunkGenerator.Builder |
withStatspublic StagedChunkGenerator.Builder withStats(@Nonnull String var1, @Nonnull IntSet var2) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.engine.chunkgenerator;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.ArrayUtil;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.FutureUtils;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.GridUtils;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.LoggerUtil;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.BufferBundle;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.EntityBuffer;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.SimplePixelBuffer;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.VoxelBuffer;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.type.BufferType;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.type.ParametrizedBufferType;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.performanceinstruments.HierarchicalTimingProfiler;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.stages.Stage;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.views.EntityBufferView;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.views.PixelBufferView;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.views.VoxelBufferView;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.FluidMaterial;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.Material;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.MaterialCache;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.SolidMaterial;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.positionproviders.PositionProvider;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.voxelspace.VoxelSpace;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.workerindexer.WorkerIndexer;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.blocktype.component.BlockPhysics;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.environment.EnvironmentChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.FluidSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.GeneratedBlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.GeneratedChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.GeneratedEntityChunk;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.ints.IntArrayList;
class="kw">import it.unimi.dsi.fastutil.ints.IntList;
class="kw">import it.unimi.dsi.fastutil.ints.IntListIterator;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Collection;
class="kw">import java.util.HashMap;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.ExecutorService;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;
class="kw">public class StagedChunkGenerator class="kw">implements ChunkGenerator {
class="kw">public class="kw">static class="kw">final int WORLD_MIN_Y_BUFFER_GRID = 0;
class="kw">public class="kw">static class="kw">final int WORLD_MAX_Y_BUFFER_GRID = 40;
class="kw">public class="kw">static class="kw">final int WORLD_HEIGHT_BUFFER_GRID = 40;
@Nonnull
class="kw">public class="kw">static class="kw">final Bounds3i CHUNK_BOUNDS_BUFFER_GRID = new Bounds3i(Vector3iUtil.ZERO, new Vector3i(4, 40, 4));
@Nonnull
class="kw">public class="kw">static class="kw">final Bounds3i SINGLE_BUFFER_TILE_BOUNDS_BUFFER_GRID = new Bounds3i(
new Vector3i(0, 0, 0), new Vector3i(VoxelBuffer.SIZE.x, 320, VoxelBuffer.SIZE.x)
);
class="kw">private BufferType materialOutput_bufferType;
class="kw">private BufferType tintOutput_bufferType;
class="kw">private BufferType environmentOutput_bufferType;
class="kw">private BufferType entityOutput_bufferType;
class="kw">private Stage[] stages;
class="kw">private Bounds3i[] stagesOutputBounds_bufferGrid;
class="kw">private BufferBundle bufferBundle;
class="kw">private MaterialCache materialCache;
class="kw">private PositionProvider spawnPositions;
class="kw">private Map<String, StagedChunkGenerator.ExecutorTier> executorTiers;
class="kw">private String profiledExecutorKey;
class="kw">private HierarchicalTimingProfiler hierarchicalTimingProfiler;
class="kw">private IntSet statsCheckpoints;
class="kw">private int generatedChunkCount;
class="kw">private long totalCacheBufferRequests;
class="kw">private long missedCacheBufferRequests;
class="kw">private StagedChunkGenerator() {
}
@Nullable
@Override
class="kw">public GeneratedChunk generate(@Nonnull ChunkRequest.Arguments var1, @Nonnull String var2) {
if (var1.stillNeeded() != null && !var1.stillNeeded().test(var1.index())) {
class="kw">return null;
}
boolean var3 = this.profiledExecutorKey.equals(var2);
if (var3) {
this.generatedChunkCount++;
}
HierarchicalTimingProfiler.Probe var4 = new HierarchicalTimingProfiler.Probe("Total").start(var3);
HierarchicalTimingProfiler.Probe var5 = var4.createProbe("Content Generation").start(var3);
HierarchicalTimingProfiler.Probe var6 = var5.createProbe("Access Initialization").start(var3);
Bounds3i var7 = GridUtils.createChunkBounds_bufferGrid(var1.x(), var1.z());
Map var8 = this.createAccesses(var7);
var6.stop(var3);
StagedChunkGenerator.ExecutorTier var9 = this.executorTiers.get(var2);
if (var9 == null) {
throw new IllegalArgumentException("Invalid concurrency key provided: " + var2);
}
WorkerIndexer var10 = var9.workerIndexer();
ExecutorService var11 = var9.executor();
for (int var12 = 0; var12 < this.stages.length; var12++) {
HierarchicalTimingProfiler.Probe var13 = var5.createProbe(this.stages[var12].getName() + " (Stage " + var12 + ")").start(var3);
HierarchicalTimingProfiler.Probe var14 = var13.createProbe("Preparation").start(var3);
int var15 = var12;
Stage var16 = this.stages[var12];
List var17 = var16.getOutputTypes();
List var18 = new ArrayList<>(var17.size());
for (BufferType var20 : var17) {
BufferBundle.Grid var21 = this.bufferBundle.getGrid(var20);
var18.add(var21);
}
Bounds3i var37 = this.stagesOutputBounds_bufferGrid[var15].clone();
var37.stack(CHUNK_BOUNDS_BUFFER_GRID);
var37.offset(var7.min);
List var38 = new ArrayList<>();
Vector3i var39 = new Vector3i(0, 0, 0);
for (var39.x = var37.min.x; var39.x < var37.max.x; var39.x++) {
for (var39.z = var37.min.z; var39.z < var37.max.z; var39.z++) {
this.totalCacheBufferRequests++;
boolean var22 = true;
for (BufferBundle.Grid var24 : var18) {
BufferBundle.Access var25 = var8.get(var24.getBufferType());
if (!isColumnCached(var25, var39, var12)) {
var22 = false;
break;
}
}
if (!var22) {
this.missedCacheBufferRequests++;
var38.add(new Vector3i(var39));
}
}
}
List var40 = ArrayUtil.split(var38, var10.getWorkerCount());
WorkerIndexer.Session var41 = var10.createSession();
List var42 = new ArrayList<>();
for (int var43 = 0; var43 < var40.size(); var43++) {
List var26 = var40.get(var43);
WorkerIndexer.Id var27 = var41.next();
List var28 = new ArrayList<>(var26.size());
for (int var29 = 0; var29 < var26.size(); var29++) {
Vector3i var30 = var26.get(var29);
Runnable var31 = this.createTileTask(var15, var30, var27, var8);
var28.add(var31);
}
var42.add(var28);
}
var14.stop(var3);
HierarchicalTimingProfiler.Probe var44 = var13.createProbe("Execution").start(var3);
HierarchicalTimingProfiler.Probe var45 = var44.createProbe("Async Processes Start").start(var3);
List var46 = new ArrayList<>();
for (List var48 : var42) {
CompletableFuture var49 = CompletableFuture.runAsync(() -> {
for (Runnable var2 : var48) {
var2.run();
}
}, var11).handle((var1x, var2x) -> {
if (var2x == null) {
class="kw">return null;
}
LoggerUtil.logException("during async execution of stage " + var16, var2x);
class="kw">return null;
});
var46.add(var49);
}
var45.stop(var3);
FutureUtils.allOf(var46).join();
var44.stop(var3);
var13.stop(var3);
}
var5.stop(var3);
HierarchicalTimingProfiler.Probe var32 = var4.createProbe("Data Transfer").start(var3);
GeneratedChunk var33 = new GeneratedChunk(
new GeneratedBlockChunk(var1.index(), var1.x(), var1.z()), new GeneratedEntityChunk(), GeneratedChunk.makeSections()
);
List var34 = new ArrayList<>();
var34.add(this.transferMaterials(var1, var33, var32, var9, var3));
var34.add(this.transferEnvironments(var1, var33, var32, var9, var3));
var34.add(this.transferTints(var1, var33, var32, var9, var3));
var34.add(this.transferEntities(var1, var33, var32, var9, var3));
var34.add(this.transferBlockStates(var1, var33, var32, var9, var3));
FutureUtils.allOf(var34).join();
var32.stop(var3);
var4.stop(var3);
this.hierarchicalTimingProfiler.takeSample(var4, var3);
if (var3 && this.statsCheckpoints.contains(this.generatedChunkCount)) {
BufferBundle.MemoryReport var35 = this.bufferBundle.createMemoryReport();
StringBuilder var36 = new StringBuilder();
var36.append(this.hierarchicalTimingProfiler.toString())
.append(var35.toString())
.append(this.createContextDependencyReport(0))
.append(this.createBufferRequestCacheReport());
LoggerUtil.getLogger().info(var36.toString());
}
this.bufferBundle.closeALlAccesses();
class="kw">return var33;
}
@Nonnull
@Override
class="kw">public PositionProvider getSpawnPositions() {
class="kw">return this.spawnPositions;
}
@Nonnull
class="kw">private Map<BufferType, BufferBundle.Access> createAccesses(@Nonnull Bounds3i var1) {
Map var2 = new HashMap<>();
for (int var3 = 0; var3 < this.stages.length; var3++) {
Stage var4 = this.stages[var3];
List var5 = var4.getOutputTypes();
Bounds3i var6 = this.stagesOutputBounds_bufferGrid[var3].clone();
var6.stack(CHUNK_BOUNDS_BUFFER_GRID);
var6.offset(var1.min);
for (BufferType var8 : var5) {
BufferBundle.Access var9 = this.bufferBundle.createBufferAccess(var8, var6);
var2.put(var8, var9);
}
}
class="kw">return var2;
}
@Nonnull
class="kw">private Runnable createTileTask(int var1, @Nonnull Vector3i var2, @Nonnull WorkerIndexer.Id var3, @Nonnull Map<BufferType, BufferBundle.Access> var4) {
Stage var5 = this.stages[var1];
Map var6 = var5.getInputTypesAndBounds_bufferGrid();
List var7 = var5.getOutputTypes();
int var8 = var6.size() + var7.size();
Stage.Context var9 = new Stage.Context(new HashMap<>(var8), var3);
for (Entry var11 : var6.entrySet()) {
BufferType var12 = var11.getKey();
Bounds3i var13 = var11.getValue().clone().offset(var2);
BufferBundle.Access.View var14 = var4.get(var12).createView(var13);
var9.bufferAccess.put(var12, var14);
}
for (BufferType var17 : var5.getOutputTypes()) {
assert !var9.bufferAccess.containsKey(var17);
Bounds3i var18 = GridUtils.createColumnBounds_bufferGrid(var2, 0, 40);
BufferBundle.Access.View var19 = var4.get(var17).createView(var18);
var9.bufferAccess.put(var17, var19);
}
Vector3i var16 = new Vector3i(var2);
class="kw">return () -> {
try {
var5.run(var9);
} class="kw">finally {
for (BufferType var9 : var5.getOutputTypes()) {
updateTrackersForColumn(var1, var4.get(var9).createView(), var16);
}
}
};
}
@Nonnull
class="kw">private CompletableFuture<Void> transferBlockStates(
@Nonnull ChunkRequest.Arguments var1,
@Nonnull GeneratedChunk var2,
@Nonnull HierarchicalTimingProfiler.Probe var3,
@Nonnull StagedChunkGenerator.ExecutorTier var4,
boolean var5
) {
Bounds3i var6 = GridUtils.createChunkBounds_voxelGrid(var1.x(), var1.z());
Bounds3i var7 = GridUtils.createChunkBounds_bufferGrid(var1.x(), var1.z());
BufferBundle.Access var8 = this.bufferBundle.createBufferAccess(this.materialOutput_bufferType, var7);
VoxelSpace var9 = new VoxelBufferView<>(var8.createView(), Material.class);
HierarchicalTimingProfiler.Probe var10 = var3.createProbe("Block States");
class="kw">return CompletableFuture.runAsync(() -> {
var10.start(var5);
Vector3i var5 = new Vector3i();
for (var5.x = var6.min.x; var5.x < var6.max.x; var5.x++) {
for (var5.z = var6.min.z; var5.z < var6.max.z; var5.z++) {
for (var5.y = var6.min.y; var5.y < var6.max.y; var5.y++) {
SolidMaterial var6 = var9.get(var5).solid();
if (var6 != null && var6.holder != null) {
var2.setState(var5.x, var5.y, var5.z, var6.holder);
}
}
}
}
var10.stop(var5);
}, var4.executor()).handle((var0, var1x) -> {
if (var1x == null) {
class="kw">return null;
}
LoggerUtil.logException("a HytaleGenerator async process", var1x, LoggerUtil.getLogger());
class="kw">return null;
});
}
@Nonnull
class="kw">private CompletableFuture<Void> transferMaterials(
@Nonnull ChunkRequest.Arguments var1,
@Nonnull GeneratedChunk var2,
@Nonnull HierarchicalTimingProfiler.Probe var3,
@Nonnull StagedChunkGenerator.ExecutorTier var4,
boolean var5
) {
Bounds3i var6 = GridUtils.createChunkBounds_voxelGrid(var1.x(), var1.z());
Bounds3i var7 = GridUtils.createChunkBounds_bufferGrid(var1.x(), var1.z());
BufferBundle.Access var8 = this.bufferBundle.createBufferAccess(this.materialOutput_bufferType, var7);
VoxelSpace var9 = new VoxelBufferView<>(var8.createView(), Material.class);
GeneratedBlockChunk var10 = var2.getBlockChunk();
Holder[] var11 = var2.getSections();
ComponentType var12 = FluidSection.getComponentType();
CompletableFuture[] var13 = new CompletableFuture[10];
for (int var14 = 0; var14 < 10; var14++) {
int var15 = var14;
FluidSection var16 = var11[var14].ensureAndGetComponent(var12);
HierarchicalTimingProfiler.Probe var17 = var3.createProbe("Materials Section " + var15);
CompletableFuture var18 = CompletableFuture.runAsync(() -> {
var17.start(var5);
int var9 = var15 * 32;
int var10 = var9 + 32;
for (int var11 = 0; var11 < 32; var11++) {
int var12 = var11 + var6.min.x;
for (int var13 = 0; var13 < 32; var13++) {
int var14 = var13 + var6.min.z;
for (int var15 = var9; var15 < var10; var15++) {
int var16 = var15 - var9;
Material var17 = var9.get(var12, var15 + var6.min.y, var14);
if (var17 != null && var17 != this.materialCache.EMPTY) {
SolidMaterial var18 = var17.solid();
FluidMaterial var19 = var17.fluid();
var10.setBlock(var11, var15, var13, var18.blockId, var18.rotation, var18.filler);
setSupport(var2, var11, var15, var13, var18.blockId, var18.support);
var16.setFluid(var11, var16, var13, var19.fluidId, var19.fluidLevel);
}
}
}
}
var17.stop(var5);
}, var4.executor).handle((var0, var1x) -> {
if (var1x == null) {
class="kw">return null;
}
LoggerUtil.logException("a HytaleGenerator async process", var1x, LoggerUtil.getLogger());
class="kw">return null;
});
var13[var14] = var18;
}
class="kw">return CompletableFuture.allOf(var13).thenRun(var10::generateHeight);
}
@Nonnull
class="kw">private CompletableFuture<Void> transferTints(
@Nonnull ChunkRequest.Arguments var1,
@Nonnull GeneratedChunk var2,
@Nonnull HierarchicalTimingProfiler.Probe var3,
@Nonnull StagedChunkGenerator.ExecutorTier var4,
boolean var5
) {
Bounds3i var6 = GridUtils.createChunkBounds_voxelGrid(var1.x(), var1.z());
Bounds3i var7 = GridUtils.createChunkBounds_bufferGrid(var1.x(), var1.z());
BufferBundle.Access var8 = this.bufferBundle.createBufferAccess(this.tintOutput_bufferType, var7);
VoxelSpace var9 = new PixelBufferView<>(var8.createView(), Integer.class);
GeneratedBlockChunk var10 = var2.getBlockChunk();
HierarchicalTimingProfiler.Probe var11 = var3.createProbe("Tints");
class="kw">return CompletableFuture.runAsync(() -> {
var11.start(var5);
Vector3i var5 = new Vector3i();
var5.y = 0;
for (int var6 = 0; var6 < 32; var6++) {
for (int var7 = 0; var7 < 32; var7++) {
var5.x = var6 + var6.min.x;
var5.z = var7 + var6.min.z;
Integer var8 = var9.get(var5);
if (var8 == null) {
var10.setTint(var6, var7, 0);
} else {
var10.setTint(var6, var7, var8);
}
}
}
var11.stop(var5);
}, var4.executor()).handle((var0, var1x) -> {
if (var1x == null) {
class="kw">return null;
}
LoggerUtil.logException("a HytaleGenerator async process", var1x, LoggerUtil.getLogger());
class="kw">return null;
});
}
@Nonnull
class="kw">private CompletableFuture<Void> transferEnvironments(
@Nonnull ChunkRequest.Arguments var1,
@Nonnull GeneratedChunk var2,
@Nonnull HierarchicalTimingProfiler.Probe var3,
@Nonnull StagedChunkGenerator.ExecutorTier var4,
boolean var5
) {
Bounds3i var6 = GridUtils.createChunkBounds_voxelGrid(var1.x(), var1.z());
Bounds3i var7 = GridUtils.createChunkBounds_bufferGrid(var1.x(), var1.z());
BufferBundle.Access var8 = this.bufferBundle.createBufferAccess(this.environmentOutput_bufferType, var7);
VoxelSpace var9 = new VoxelBufferView<>(var8.createView(), Integer.class);
EnvironmentChunk.BulkWriter var10 = new EnvironmentChunk.BulkWriter();
int var11 = 0;
Vector3i var12 = new Vector3i(8, 0, 8);
Vector3i var13 = new Vector3i(32 / var12.x, 0, 32 / var12.z);
List var14 = new ArrayList<>();
for (int var15 = 0; var15 < var13.x; var15++) {
for (int var16 = 0; var16 < var13.z; var16++) {
HierarchicalTimingProfiler.Probe var17 = var3.createProbe("Environment Section " + var11++);
int var18 = var15 * var12.x;
int var19 = var16 * var12.z;
int var20 = var18 + var12.x;
int var21 = var19 + var12.z;
CompletableFuture var22 = CompletableFuture.runAsync(() -> {
var17.start(var5);
Vector3i var9 = new Vector3i();
for (int var10 = var18; var10 < var20; var10++) {
for (int var11 = var19; var11 < var21; var11++) {
EnvironmentChunk.BulkWriter.ColumnWriter var12 = var10.getColumnWriter(var10, var11);
int var13 = var10;
int var14 = var11;
var12.intake(var5x -> {
var9.x = var13 + var6.min.x;
var9.y = var5x + var6.min.y;
var9.z = var14 + var6.min.z;
Integer var6 = var9.get(var9);
assert var6 != null;
class="kw">return var6;
});
}
}
var17.stop(var5);
}, var4.executor());
var14.add(var22);
}
}
HierarchicalTimingProfiler.Probe var23 = var3.createProbe("Environment Write");
class="kw">return FutureUtils.allOf(var14).thenRun(() -> {
var23.start(var5);
var10.write(var2.getBlockChunk().getEnvironmentChunk());
var23.stop(var5);
}).handle((var0, var1x) -> {
if (var1x == null) {
class="kw">return null;
}
LoggerUtil.logException("a HytaleGenerator async process", var1x, LoggerUtil.getLogger());
class="kw">return null;
});
}
@Nonnull
class="kw">private CompletableFuture<Void> transferEntities(
@Nonnull ChunkRequest.Arguments var1,
@Nonnull GeneratedChunk var2,
@Nonnull HierarchicalTimingProfiler.Probe var3,
@Nonnull StagedChunkGenerator.ExecutorTier var4,
boolean var5
) {
Bounds3i var6 = GridUtils.createChunkBounds_bufferGrid(var1.x(), var1.z());
BufferBundle.Access var7 = this.bufferBundle.createBufferAccess(this.entityOutput_bufferType, var6);
EntityBufferView var8 = new EntityBufferView(var7.createView());
GeneratedEntityChunk var9 = var2.getEntityChunk();
HierarchicalTimingProfiler.Probe var10 = var3.createProbe("Entities");
class="kw">return CompletableFuture.runAsync(
() -> {
var10.start(var5);
var8.forEach(
var2x -> var9.addEntities(
var2x.getOffset(), var2x.getRotation(), new Holder[]{var2x.getEntityHolder()}, var1.seed(), var2x.getPrefabInstanceId()
)
);
var10.stop(var5);
},
var4.executor()
)
.handle((var0, var1x) -> {
if (var1x == null) {
class="kw">return null;
}
LoggerUtil.logException("a HytaleGenerator async process", var1x, LoggerUtil.getLogger());
class="kw">return null;
});
}
@Nonnull
class="kw">private String createBufferRequestCacheReport() {
StringBuilder var1 = new StringBuilder();
var1.append("Buffer Cache Report\n");
var1.append("Total Cache Buffer Requests: ").append(this.totalCacheBufferRequests).append("\n");
var1.append("Missed Cache Buffer Requests: ").append(this.missedCacheBufferRequests).append("\n");
double var2 = (double)this.missedCacheBufferRequests / this.totalCacheBufferRequests * 100.0;
var1.append("Missed/Total Ratio: ").append(var2).append("%\n");
class="kw">return var1.toString();
}
@Nonnull
class="kw">private String createContextDependencyReport(int var1) {
StringBuilder var2 = new StringBuilder();
var2.append("Context Dependency Report\n");
for (int var3 = 0; var3 < this.stages.length; var3++) {
Bounds3i var4 = this.stagesOutputBounds_bufferGrid[var3];
Vector3i var5 = var4.getSize().add(3, 0, 3);
Vector3d var6 = new Vector3d(var5);
var6.mul(0.25);
var2.append("\t".repeat(var1)).append(this.stages[var3].getName()).append(" (Stage ").append(var3).append("):\n");
var2.append("\t".repeat(var1 + 1)).append("Output Size (Buffer Column): {x=").append(var5.x).append(", z=").append(var5.z).append("}\n");
var2.append("\t".repeat(var1 + 1)).append("Output Size (Chunk Column): {x=").append(var6.x).append(", z=").append(var6.z).append("}\n");
}
class="kw">return var2.toString();
}
class="kw">private class="kw">static void setSupport(@Nonnull GeneratedChunk var0, int var1, int var2, int var3, int var4, int var5) {
Holder[] var6 = var0.getSections();
Holder var7 = var6[ChunkUtil.chunkCoordinate(var2)];
if (var5 >= 0) {
BlockPhysics.setSupportValue(var7, var1, var2, var3, var5);
} else {
BlockType var8 = BlockType.getAssetMap().getAsset(var4);
if (var8 != null && var8.hasSupport()) {
BlockPhysics.reset(var7, var1, var2, var3);
} else {
BlockPhysics.clear(var7, var1, var2, var3);
}
}
}
class="kw">private class="kw">static void setBoundsToWorldHeight_bufferGrid(@Nonnull Bounds3i var0) {
var0.min.y = 0;
var0.max.y = 40;
}
class="kw">private class="kw">static boolean isColumnCached(@Nonnull BufferBundle.Access var0, @Nonnull Vector3i var1, int var2) {
assert var1.y == 0;
BufferBundle.Tracker var3 = var0.getBuffer(var1).tracker();
class="kw">return var3.stageIndex == var2;
}
class="kw">private class="kw">static void updateTrackersForColumn(int var0, @Nonnull BufferBundle.Access.View var1, @Nonnull Vector3i var2) {
for (var2.y = 0; var2.y < 40; var2.y++) {
BufferBundle.Tracker var3 = var1.getBuffer(var2).tracker();
var3.stageIndex = var0;
}
}
class="kw">public class="kw">static class Builder {
@Nonnull
class="kw">public class="kw">final ParametrizedBufferType MATERIAL_OUTPUT_BUFFER_TYPE = new ParametrizedBufferType(
"MaterialResult", -1, VoxelBuffer.class, Material.class, () -> new VoxelBuffer<>(Material.class)
);
@Nonnull
class="kw">public class="kw">final ParametrizedBufferType TINT_OUTPUT_BUFFER_TYPE = new ParametrizedBufferType(
"TintResult", -3, SimplePixelBuffer.class, Integer.class, () -> new SimplePixelBuffer<>(Integer.class)
);
@Nonnull
class="kw">public class="kw">final ParametrizedBufferType ENVIRONMENT_OUTPUT_BUFFER_TYPE = new ParametrizedBufferType(
"EnvironmentResult", -4, VoxelBuffer.class, Integer.class, () -> new VoxelBuffer<>(Integer.class)
);
@Nonnull
class="kw">public class="kw">final BufferType ENTITY_OUTPUT_BUFFER_TYPE = new BufferType("EntityResult", -5, EntityBuffer.class, EntityBuffer::new);
@Nonnull
class="kw">private class="kw">final List<Stage> stages = new ArrayList<>();
@Nullable
class="kw">private MaterialCache materialCache;
@Nullable
class="kw">private String statsHeader;
@Nullable
class="kw">private IntSet statsCheckpoints;
@Nullable
class="kw">private PositionProvider spawnPositions;
@Nonnull
class="kw">private class="kw">final Map<String, StagedChunkGenerator.ExecutorTier> concurrencyTiers = new HashMap<>();
@Nonnull
class="kw">private String profiledExecutorKey = "";
class="kw">private double bufferCapacityFactor;
class="kw">private double targetViewDistance;
class="kw">private double targetPlayerCount;
class="kw">public Builder() {
}
@Nonnull
class="kw">public StagedChunkGenerator build() {
assert !this.concurrencyTiers.isEmpty();
assert this.materialCache != null;
assert this.statsHeader != null;
assert this.statsCheckpoints != null;
assert this.spawnPositions != null;
StagedChunkGenerator var1 = new StagedChunkGenerator();
var1.materialOutput_bufferType = this.MATERIAL_OUTPUT_BUFFER_TYPE;
var1.tintOutput_bufferType = this.TINT_OUTPUT_BUFFER_TYPE;
var1.environmentOutput_bufferType = this.ENVIRONMENT_OUTPUT_BUFFER_TYPE;
var1.entityOutput_bufferType = this.ENTITY_OUTPUT_BUFFER_TYPE;
var1.stages = new Stage[this.stages.size()];
this.stages.toArray(var1.stages);
Set var2 = this.createListOfAllBufferTypes();
Int2ObjectMap var3 = this.createStageDependencyMap();
var1.stagesOutputBounds_bufferGrid = this.createTotalOutputBoundsArray(var3);
var1.bufferBundle = new BufferBundle();
var1.bufferBundle
.createGrid(this.MATERIAL_OUTPUT_BUFFER_TYPE, this.resolveBufferCapacity(this.MATERIAL_OUTPUT_BUFFER_TYPE, var1.stagesOutputBounds_bufferGrid));
var1.bufferBundle
.createGrid(this.TINT_OUTPUT_BUFFER_TYPE, this.resolveBufferCapacity(this.TINT_OUTPUT_BUFFER_TYPE, var1.stagesOutputBounds_bufferGrid));
var1.bufferBundle
.createGrid(
this.ENVIRONMENT_OUTPUT_BUFFER_TYPE, this.resolveBufferCapacity(this.ENVIRONMENT_OUTPUT_BUFFER_TYPE, var1.stagesOutputBounds_bufferGrid)
);
var1.bufferBundle
.createGrid(this.ENTITY_OUTPUT_BUFFER_TYPE, this.resolveBufferCapacity(this.ENTITY_OUTPUT_BUFFER_TYPE, var1.stagesOutputBounds_bufferGrid));
for (BufferType var5 : var2) {
if (!this.isGeneratorOutputBufferType(var5)) {
var1.bufferBundle.createGrid(var5, this.resolveBufferCapacity(var5, var1.stagesOutputBounds_bufferGrid));
}
}
var1.executorTiers = new HashMap<>(this.concurrencyTiers);
var1.profiledExecutorKey = this.profiledExecutorKey;
var1.materialCache = this.materialCache;
var1.hierarchicalTimingProfiler = new HierarchicalTimingProfiler(this.statsHeader);
var1.statsCheckpoints = new IntOpenHashSet(this.statsCheckpoints);
var1.generatedChunkCount = 0;
var1.spawnPositions = this.spawnPositions;
class="kw">return var1;
}
@Nonnull
class="kw">public StagedChunkGenerator.Builder withStats(@Nonnull String var1, @Nonnull IntSet var2) {
this.statsHeader = var1;
this.statsCheckpoints = new IntOpenHashSet(var2);
class="kw">return this;
}
@Nonnull
class="kw">public StagedChunkGenerator.Builder withSpawnPositions(@Nonnull PositionProvider var1) {
this.spawnPositions = var1;
class="kw">return this;
}
@Nonnull
class="kw">public StagedChunkGenerator.Builder addExecutorTier(@Nonnull String var1, @Nonnull StagedChunkGenerator.ExecutorTier var2) {
this.concurrencyTiers.put(var1, var2);
class="kw">return this;
}
@Nonnull
class="kw">public StagedChunkGenerator.Builder setProfiledExecutorKey(@Nonnull String var1) {
this.profiledExecutorKey = var1;
class="kw">return this;
}
@Nonnull
class="kw">public StagedChunkGenerator.Builder withMaterialCache(@Nonnull MaterialCache var1) {
this.materialCache = var1;
class="kw">return this;
}
@Nonnull
class="kw">public StagedChunkGenerator.Builder withBufferCapacity(double var1, double var3, double var5) {
assert var1 >= 0.0;
assert var3 >= 0.0;
assert var5 >= 0.0;
this.bufferCapacityFactor = var1;
this.targetViewDistance = var3;
this.targetPlayerCount = var5;
class="kw">return this;
}
@Nonnull
class="kw">public StagedChunkGenerator.Builder appendStage(@Nonnull Stage var1) {
this.stages.add(var1);
class="kw">return this;
}
@Nonnull
class="kw">private IntList createStagesThatReadFrom(int var1) {
Stage var2 = this.stages.get(var1);
IntList var3 = new IntArrayList();
List var4 = var2.getOutputTypes();
for (int var5 = 0; var5 < var4.size(); var5++) {
BufferType var6 = var4.get(var5);
for (int var7 = 0; var7 < this.stages.size(); var7++) {
Stage var8 = this.stages.get(var7);
if (var8.getInputTypesAndBounds_bufferGrid().containsKey(var6)) {
var3.add(var7);
}
}
}
class="kw">return var3;
}
@Nonnull
class="kw">private Int2ObjectMap<IntSet> createStageDependencyMap() {
Int2ObjectMap var1 = new Int2ObjectOpenHashMap();
for (int var2 = 0; var2 < this.stages.size(); var2++) {
var1.put(var2, new IntOpenHashSet(1));
}
for (int var6 = 0; var6 < this.stages.size(); var6++) {
IntList var3 = this.createStagesThatReadFrom(var6);
IntListIterator var4 = var3.iterator();
while (var4.hasNext()) {
int var5 = (Integer)var4.next();
((IntSet)var1.get(var5)).add(var6);
}
}
class="kw">return var1;
}
class="kw">private int resolveBufferCapacity(@Nonnull BufferType var1, @Nonnull Bounds3i[] var2) {
int var3 = 0;
while (var3 < var2.length && !this.stages.get(var3).getOutputTypes().contains(var1)) {
var3++;
}
if (var3 >= var2.length) {
class="kw">return 0;
}
Bounds3i var4 = var2[var3];
class="kw">return calculateCapacityFromBounds(var4, this.bufferCapacityFactor, this.targetViewDistance, this.targetPlayerCount);
}
class="kw">private class="kw">static int calculateCapacityFromBounds(@Nonnull Bounds3i var0, double var1, double var3, double var5) {
assert var1 >= 0.0;
assert var3 >= 0.0;
assert var5 >= 0.0;
Vector3i var7 = var0.getSize();
if (var7.x == 1 && var7.z == 1) {
class="kw">return 0;
}
double var8 = var3 / VoxelBuffer.SIZE.x;
double var10 = var7.x + var8 * 2.0;
var10 *= var7.z + var8 * 2.0;
double var12;
if (!(var7.x > var8) && !(var7.z > var8)) {
var12 = (var8 - var7.x / 2.0) * (var8 - var7.z / 2.0);
} else {
var12 = 0.0;
}
double var14 = var10 - var12;
double var16 = var14 * var5;
double var18 = var16 * var1;
double var20 = var18 * 40.0;
assert var20 >= 0.0;
class="kw">return Math.max(0, (int)var20);
}
class="kw">private void createTotalOutputBoundsForStage(int var1, @Nonnull Int2ObjectMap<IntSet> var2, @Nonnull Bounds3i[] var3) {
Bounds3i var4 = new Bounds3i(Vector3iUtil.ZERO, Vector3iUtil.ALL_ONES);
Stage var5 = this.stages.get(var1);
List var6 = new ArrayList<>();
for (int var7 = this.stages.size() - 1; var7 >= var1 + 1; var7--) {
if (((IntSet)var2.get(var7)).contains(var1)) {
Stage var8 = this.stages.get(var7);
Map var9 = var8.getInputTypesAndBounds_bufferGrid();
for (BufferType var11 : var5.getOutputTypes()) {
Bounds3i var12 = var9.get(var11);
if (var12 != null) {
Bounds3i var13 = var3[var7];
Bounds3i var14 = var13.clone().stack(var12);
var6.add(var14);
}
}
}
}
if (var6.isEmpty()) {
StagedChunkGenerator.setBoundsToWorldHeight_bufferGrid(var4);
var3[var1] = var4;
} else {
Bounds3i var15 = var6.getFirst().clone();
for (int var16 = 1; var16 < var6.size(); var16++) {
var15.encompass(var6.get(var16));
}
StagedChunkGenerator.setBoundsToWorldHeight_bufferGrid(var15);
var3[var1] = var15;
}
}
@Nonnull
class="kw">private Bounds3i[] createTotalOutputBoundsArray(@Nonnull Int2ObjectMap<IntSet> var1) {
Bounds3i[] var2 = new Bounds3i[this.stages.size()];
for (int var3 = this.stages.size() - 1; var3 >= 0; var3--) {
this.createTotalOutputBoundsForStage(var3, var1, var2);
}
class="kw">return var2;
}
@Nonnull
class="kw">private Set<BufferType> createListOfAllBufferTypes() {
Set var1 = new HashSet<>();
for (int var2 = 0; var2 < this.stages.size(); var2++) {
Stage var3 = this.stages.get(var2);
var1.addAll(var3.getInputTypesAndBounds_bufferGrid().keySet());
var1.addAll(var3.getOutputTypes());
}
class="kw">return var1;
}
@Nonnull
class="kw">private class="kw">static Bounds3i getEncompassingBounds(@Nonnull Collection<Bounds3i> var0) {
Bounds3i var1 = new Bounds3i();
for (Bounds3i var3 : var0) {
var1.encompass(var3);
}
class="kw">return var1;
}
class="kw">private boolean isGeneratorOutputBufferType(@Nonnull BufferType var1) {
class="kw">return var1.equals(this.MATERIAL_OUTPUT_BUFFER_TYPE)
|| var1.equals(this.TINT_OUTPUT_BUFFER_TYPE)
|| var1.equals(this.ENVIRONMENT_OUTPUT_BUFFER_TYPE)
|| var1.equals(this.ENTITY_OUTPUT_BUFFER_TYPE);
}
}
class="kw">public record ExecutorTier(@Nonnull ExecutorService executor, @Nonnull WorkerIndexer workerIndexer) {
class="kw">public ExecutorTier {
}
}
}