MaterialContent class
Пакет: com.hypixel.hytale.builtin.hytalegenerator.materialproviders
Файл: com/hypixel/hytale/builtin/hytalegenerator/materialproviders/GraphMaterialProvider.java
Поля (4)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public static final GraphMaterialProvider.MaterialContent |
EMPTY |
|
public final MaterialProvider<Material> |
materialProvider |
|
public final double |
radius |
|
public final double |
rangeSquared |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.materialproviders;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.GridCache;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.StackedBoundedCache;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.VectorUtil;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3d;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.graph.GraphGenerator;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.graph.GraphSpace;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.Material;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
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 GraphMaterialProvider class="kw">extends MaterialProvider<Material> {
@Nonnull
class="kw">private class="kw">final GraphGenerator graphGenerator;
@Nonnull
class="kw">private class="kw">final GridCache<GraphSpace.ReadOnly> grid;
@Nonnull
class="kw">private class="kw">final StackedBoundedCache<GraphMaterialProvider.QueryResult> queryCache;
@Nonnull
class="kw">private class="kw">final List<GraphMaterialProvider.MaterialContent> indexedContent;
class="kw">private class="kw">final boolean isEmpty;
@Nonnull
class="kw">private class="kw">final List<StackedBoundedCache.Segment<GraphMaterialProvider.QueryResult>> rQueryResults;
@Nonnull
class="kw">private class="kw">final Vector3d rSegmentBoundsMaxInclusive;
@Nonnull
class="kw">private class="kw">final Bounds3i rCellIndexBounds;
@Nonnull
class="kw">private class="kw">final Vector3i rCellIndex;
@Nonnull
class="kw">private class="kw">final Vector3d rContextPositionDouble;
@Nonnull
class="kw">private class="kw">final Bounds3d rIntersectingCellBounds;
@Nonnull
class="kw">private class="kw">final MaterialProvider.Context rChildContext;
@Nonnull
class="kw">private class="kw">final Vector3d rAnchor;
class="kw">public GraphMaterialProvider(
@Nonnull GraphGenerator var1, @Nonnull GridCache<GraphSpace.ReadOnly> var2, int var3, @Nonnull List<GraphMaterialProvider.MaterialContent> var4
) {
this.graphGenerator = var1;
this.grid = var2;
this.indexedContent = new ArrayList<>(var4);
double var5 = 0.0;
for (int var7 = 0; var7 < var4.size(); var7++) {
GraphMaterialProvider.MaterialContent var8 = var4.get(var7);
var5 = Math.max(var8.radius, var5);
}
double var10 = 30.0;
Bounds3d var9 = new Bounds3d(new Vector3d(Math.nextUp(-var5), Math.min(-30.0, -var5), Math.nextUp(-var5)), new Vector3d(var5, Math.max(30.0, var5), var5));
this.queryCache = new StackedBoundedCache<>(var9, var3);
this.isEmpty = var5 == 0.0;
this.rQueryResults = new ArrayList<>();
this.rSegmentBoundsMaxInclusive = new Vector3d();
this.rCellIndexBounds = new Bounds3i();
this.rCellIndex = new Vector3i();
this.rContextPositionDouble = new Vector3d();
this.rIntersectingCellBounds = new Bounds3d();
this.rChildContext = new MaterialProvider.Context();
this.rAnchor = new Vector3d();
}
@Nullable
class="kw">public Material getVoxelTypeAt(@Nonnull MaterialProvider.Context var1) {
if (this.isEmpty) {
class="kw">return null;
}
this.rQueryResults.clear();
this.rContextPositionDouble.set(var1.position);
this.queryCache.get(this.rContextPositionDouble, this.rQueryResults);
GraphSpace.Node var2 = null;
double var3 = Double.MAX_VALUE;
double var5 = Double.MAX_VALUE;
for (int var7 = 0; var7 < this.rQueryResults.size(); var7++) {
StackedBoundedCache.Segment var8 = this.rQueryResults.get(var7);
if (var8.data == null) {
var8.data = new GraphMaterialProvider.QueryResult();
this.rSegmentBoundsMaxInclusive.set(var8.bounds.max);
VectorUtil.nextDown(this.rSegmentBoundsMaxInclusive);
this.grid.toCellIndex(var8.bounds.min, this.rCellIndexBounds.min);
this.grid.toCellIndex(this.rSegmentBoundsMaxInclusive, this.rCellIndexBounds.max);
this.rCellIndexBounds.max.add(1, 1, 1);
for (int var9 = this.rCellIndexBounds.min.x; var9 < this.rCellIndexBounds.max.x; var9++) {
for (int var10 = this.rCellIndexBounds.min.y; var10 < this.rCellIndexBounds.max.y; var10++) {
for (int var11 = this.rCellIndexBounds.min.z; var11 < this.rCellIndexBounds.max.z; var11++) {
this.rCellIndex.set(var9, var10, var11);
this.grid.toCellBounds(this.rCellIndex, this.rIntersectingCellBounds);
this.rIntersectingCellBounds.intersect(var8.bounds);
VectorUtil.nextDown(this.rIntersectingCellBounds.max);
GraphSpace.ReadOnly var12 = this.grid.getCell(this.rCellIndex, this.graphGenerator);
assert var12 != null;
if (var12 != null) {
var12.getNodes(this.rIntersectingCellBounds, var8.data.nodes);
}
}
}
}
}
for (int var19 = 0; var19 < var8.data.nodes.size(); var19++) {
GraphSpace.Node var21 = var8.data.nodes.get(var19);
int var22 = var21.content().index;
if (var22 != -1) {
GraphMaterialProvider.MaterialContent var23 = this.indexedContent.get(var22);
if (var23 != null) {
double var13 = var21.position().distance(this.rContextPositionDouble);
if (!(var13 >= var23.radius) && !(var13 >= var3)) {
double var15 = var21.hashCode();
if (var13 != var3 || !(var15 >= var5)) {
var2 = var21;
var3 = var13;
var5 = var15;
}
}
}
}
}
}
if (var2 == null) {
class="kw">return null;
}
this.rChildContext.assign(var1);
this.rChildContext.graphNode = var2;
this.rAnchor.set(var2.position());
this.rChildContext.anchor = this.rAnchor;
int var17 = var2.content().index;
GraphMaterialProvider.MaterialContent var18 = this.indexedContent.get(var17);
assert var18 != null;
Material var20 = var18.materialProvider.getVoxelTypeAt(this.rChildContext);
this.rChildContext.clearReferences();
class="kw">return var20;
}
class="kw">public class="kw">static class MaterialContent {
class="kw">public class="kw">static class="kw">final GraphMaterialProvider.MaterialContent EMPTY = new GraphMaterialProvider.MaterialContent(TransparentMaterialProvider.instance(), 0.0);
@Nonnull
class="kw">public class="kw">final MaterialProvider<Material> materialProvider;
class="kw">public class="kw">final double radius;
class="kw">public class="kw">final double rangeSquared;
class="kw">public MaterialContent(@Nonnull MaterialProvider<Material> var1, double var2) {
assert var2 >= 9.0;
this.materialProvider = var1;
this.radius = var2;
this.rangeSquared = var2 * var2;
}
}
class="kw">private class="kw">static class QueryResult {
@Nonnull
List<GraphSpace.Node> nodes = new ArrayList<>();
QueryResult() {
}
}
}