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() {
      }
   }
}