DensityContent class

Пакет: com.hypixel.hytale.builtin.hytalegenerator.density

Файл: com/hypixel/hytale/builtin/hytalegenerator/density/GraphDensity.java

Поля (4)

МодификаторыТипИмя
public static final GraphDensity.DensityContent EMPTY
public final Density density
public final double radius
public final double rangeSquared

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.density;

class="kw">import com.hypixel.hytale.builtin.hytalegenerator.GridCache;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.ReusableList;
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.math.Calculator;
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 GraphDensity class="kw">extends Density {
   class="kw">private class="kw">static class="kw">final int GRAPH_PROBE_ID = 0;
   class="kw">private class="kw">static class="kw">final int DENSITY_PROBE_ID = 1;
   @Nonnull
   class="kw">private class="kw">final GraphGenerator graphGenerator;
   @Nonnull
   class="kw">private class="kw">final StackedBoundedCache<GraphDensity.QueryResult> queryCache;
   @Nonnull
   class="kw">private class="kw">final GridCache<GraphSpace.ReadOnly> grid;
   class="kw">private class="kw">final double backgroundDensity;
   class="kw">private class="kw">final double transitionSlope;
   class="kw">private class="kw">final double transitionOffset;
   class="kw">private class="kw">final double transitionSmooth;
   @Nonnull
   class="kw">private class="kw">final List<GraphDensity.DensityContent> indexedContent;
   class="kw">private class="kw">final boolean isEmpty;
   @Nonnull
   class="kw">private class="kw">final Vector3i rCellIndex;
   @Nonnull
   class="kw">private class="kw">final Vector3d rAnchor;
   @Nonnull
   class="kw">private class="kw">final Vector3d rSegmentBoundsMaxInclusive;
   @Nonnull
   class="kw">private class="kw">final Bounds3d rIntersectingCellBounds;
   @Nonnull
   class="kw">private class="kw">final Bounds3i rCellIndexBounds;
   @Nonnull
   class="kw">private class="kw">final ReusableList<GraphDensity.DensityDistanceEntry> rDensityDistanceEntries;
   @Nonnull
   class="kw">private class="kw">final Density.Context rNodeContext;
   @Nonnull
   class="kw">private class="kw">final List<StackedBoundedCache.Segment<GraphDensity.QueryResult>> rQueryResults;

   class="kw">public GraphDensity(
      @Nonnull GraphGenerator var1,
      @Nonnull GridCache<GraphSpace.ReadOnly> var2,
      double var3,
      double var5,
      double var7,
      double var9,
      int var11,
      @Nonnull List<GraphDensity.DensityContent> var12
   ) {
      assert var9 >= 0.0;
      assert var11 >= 0;
      this.graphGenerator = var1;
      this.grid = var2;
      this.backgroundDensity = var3;
      this.transitionSlope = var5;
      this.transitionOffset = var7;
      this.transitionSmooth = var9;
      this.indexedContent = new ArrayList<>(var12);
      double var13 = 0.0;

      for (GraphDensity.DensityContent var16 : var12) {
         var13 = Math.max(var16.radius, var13);
      }

      double var18 = 30.0;
      Bounds3d var17 = new Bounds3d(
         new Vector3d(Math.nextUp(-var13), Math.min(-30.0, -var13), Math.nextUp(-var13)), new Vector3d(var13, Math.max(30.0, var13), var13)
      );
      this.queryCache = new StackedBoundedCache<>(var17, var11);
      this.isEmpty = var13 == 0.0;
      this.rCellIndex = new Vector3i();
      this.rAnchor = new Vector3d();
      this.rIntersectingCellBounds = new Bounds3d();
      this.rDensityDistanceEntries = new ReusableList<>();
      this.rNodeContext = new Density.Context();
      this.rQueryResults = new ArrayList<>();
      this.rSegmentBoundsMaxInclusive = new Vector3d();
      this.rCellIndexBounds = new Bounds3i();
   }

   @Override
   class="kw">public double process(@Nonnull Density.Context var1) {
      if (this.isEmpty) {
         class="kw">return 0.0;
      }

      this.clearDistanceEntries();
      this.rQueryResults.clear();
      this.queryCache.get(var1.position, this.rQueryResults);

      for (int var2 = 0; var2 < this.rQueryResults.size(); var2++) {
         StackedBoundedCache.Segment var3 = this.rQueryResults.get(var2);
         if (var3.data == null) {
            var3.data = new GraphDensity.QueryResult();
            this.rSegmentBoundsMaxInclusive.set(var3.bounds.max);
            VectorUtil.nextDown(this.rSegmentBoundsMaxInclusive);
            this.grid.toCellIndex(var3.bounds.min, this.rCellIndexBounds.min);
            this.grid.toCellIndex(this.rSegmentBoundsMaxInclusive, this.rCellIndexBounds.max);
            this.rCellIndexBounds.max.add(1, 1, 1);

            for (int var4 = this.rCellIndexBounds.min.x; var4 < this.rCellIndexBounds.max.x; var4++) {
               for (int var5 = this.rCellIndexBounds.min.y; var5 < this.rCellIndexBounds.max.y; var5++) {
                  for (int var6 = this.rCellIndexBounds.min.z; var6 < this.rCellIndexBounds.max.z; var6++) {
                     this.rCellIndex.set(var4, var5, var6);
                     this.grid.toCellBounds(this.rCellIndex, this.rIntersectingCellBounds);
                     this.rIntersectingCellBounds.intersect(var3.bounds);
                     VectorUtil.nextDown(this.rIntersectingCellBounds.max);
                     GraphSpace.ReadOnly var7 = this.grid.getCell(this.rCellIndex, this.graphGenerator);
                     assert var7 != null;
                     if (var7 != null) {
                        var7.getNodes(this.rIntersectingCellBounds, var3.data.nodes);
                     }
                  }
               }
            }
         }

         for (int var17 = 0; var17 < var3.data.nodes.size(); var17++) {
            GraphSpace.Node var19 = var3.data.nodes.get(var17);
            int var20 = var19.content().index;
            if (var20 != -1) {
               GraphDensity.DensityContent var22 = this.indexedContent.get(var20);
               if (var22 != null) {
                  double var8 = var19.position().distanceSquared(var1.position);
                  if (!(var8 > var22.rangeSquared)) {
                     double var10 = Math.sqrt(var8);
                     double var12 = var22.radius - var10;
                     var12 /= var22.radius;
                     var12 = factorFunction(var12, this.transitionSlope, this.transitionOffset, this.transitionSmooth);
                     if (!(var12 <= 0.0)) {
                        if (this.rDensityDistanceEntries.isAtHardCapacity()) {
                           this.rDensityDistanceEntries.expandAndSet(new GraphDensity.DensityDistanceEntry(var19, var12, var22));
                        } else {
                           GraphDensity.DensityDistanceEntry var14 = this.rDensityDistanceEntries.expandAndGet();
                           assert var14 != null;
                           var14.node = var19;
                           var14.factor = var12;
                           var14.densityContent = var22;
                        }
                     }
                  }
               }
            }
         }
      }

      if (this.rDensityDistanceEntries.getSoftSize() == 0) {
         this.rQueryResults.clear();
         class="kw">return this.backgroundDensity;
      }

      double var15 = 0.0;
      double var18 = 0.0;

      for (int var21 = 0; var21 < this.rDensityDistanceEntries.getSoftSize(); var21++) {
         GraphDensity.DensityDistanceEntry var23 = this.rDensityDistanceEntries.get(var21);
         assert var23 != null && var23.densityContent != null && var23.node != null;
         this.rNodeContext.assign(var1);
         this.rNodeContext.graphNode = var23.node;
         this.rAnchor.set(var23.node.position());
         this.rNodeContext.densityAnchor = this.rAnchor;
         double var24 = var23.densityContent.density.process(this.rNodeContext);
         var15 += var24 * var23.factor;
         var18 += var23.factor;
      }

      var15 /= var18;
      this.rQueryResults.clear();
      this.clearDistanceEntries();
      this.rNodeContext.clearReferences();
      class="kw">return var15;

      throw new AssertionError();
   }

   class="kw">private void clearDistanceEntries() {
      for (int var1 = 0; var1 < this.rDensityDistanceEntries.getSoftSize(); var1++) {
         GraphDensity.DensityDistanceEntry var2 = this.rDensityDistanceEntries.get(var1);
         if (var2 != null) {
            var2.clear();
         }
      }

      this.rDensityDistanceEntries.clear();
   }

   class="kw">public class="kw">static double factorFunction(double var0, double var2, double var4, double var6) {
      double var8 = 0.5 * (1.0 - 1.0 / var2);
      var0 -= var8 + var4;
      class="kw">return Math.max(Calculator.smoothMin(var6, var0 * var2, 1.0), 0.0);
   }

   class="kw">public class="kw">static class DensityContent {
      class="kw">public class="kw">static class="kw">final GraphDensity.DensityContent EMPTY = new GraphDensity.DensityContent(new ConstantValueDensity(0.0), 0.0);
      @Nonnull
      class="kw">public class="kw">final Density density;
      class="kw">public class="kw">final double radius;
      class="kw">public class="kw">final double rangeSquared;

      class="kw">public DensityContent(@Nonnull Density var1, double var2) {
         assert var2 >= 0.0;
         this.density = var1;
         this.radius = var2;
         this.rangeSquared = var2 * var2;
      }
   }

   class="kw">private class="kw">static class DensityDistanceEntry {
      @Nullable
      GraphSpace.Node node;
      double factor;
      @Nullable
      GraphDensity.DensityContent densityContent;

      DensityDistanceEntry(@Nonnull GraphSpace.Node var1, double var2, @Nonnull GraphDensity.DensityContent var4) {
         this.node = var1;
         this.factor = var2;
         this.densityContent = var4;
      }

      void clear() {
         this.node = null;
         this.factor = 0.0;
         this.densityContent = null;
      }
   }

   class="kw">private class="kw">static class QueryResult {
      @Nonnull
      List<GraphSpace.Node> nodes = new ArrayList<>();

      QueryResult() {
      }
   }
}