Entry class

Пакет: com.hypixel.hytale.builtin.portals.utils.spatial

Файл: com/hypixel/hytale/builtin/portals/utils/spatial/SpatialHashGrid.java

Поля (3)

МодификаторыТипИмя
private Vector3i cell
private final Vector3d pos
private final T value

Исходный код

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

class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.util.Collection;
class="kw">import java.util.Collections;
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.function.Predicate;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;
class="kw">import org.joml.Vector3i;

class="kw">public class SpatialHashGrid<T> {
   class="kw">private class="kw">final double cellSize;
   class="kw">private class="kw">final Map<Vector3i, List<SpatialHashGrid.Entry<T>>> grid = new Object2ObjectOpenHashMap();
   class="kw">private class="kw">final Map<T, SpatialHashGrid.Entry<T>> index = new Object2ObjectOpenHashMap();

   class="kw">public SpatialHashGrid(double var1) {
      this.cellSize = var1;
   }

   class="kw">private Vector3i cellFor(Vector3dc var1) {
      class="kw">return new Vector3i(MathUtil.floor(var1.x() / this.cellSize), MathUtil.floor(var1.y() / this.cellSize), MathUtil.floor(var1.z() / this.cellSize));
   }

   class="kw">public Collection<? class="kw">extends T> getAll() {
      class="kw">return Collections.unmodifiableSet(this.index.keySet());
   }

   class="kw">public int size() {
      class="kw">return this.index.size();
   }

   class="kw">public boolean isEmpty() {
      class="kw">return this.index.isEmpty();
   }

   class="kw">public void add(Vector3d var1, T var2) {
      Vector3i var3 = this.cellFor(var1);
      SpatialHashGrid.Entry var4 = new SpatialHashGrid.Entry<>(new Vector3d(var1), var3, var2);
      this.index.put(var2, var4);
      this.grid.computeIfAbsent(var3, var0 -> new ObjectArrayList()).add(var4);
   }

   class="kw">public boolean remove(T var1) {
      SpatialHashGrid.Entry var2 = this.index.remove(var1);
      if (var2 == null) {
         class="kw">return false;
      }

      List var3 = this.grid.get(var2.cell);
      if (var3 != null) {
         var3.remove(var2);
         if (var3.isEmpty()) {
            this.grid.remove(var2.cell);
         }
      }

      class="kw">return true;
   }

   class="kw">public void removeIf(Predicate<T> var1) {
      Set var2 = new HashSet<>();

      for (Object var4 : this.index.keySet()) {
         if (var1.test(var4)) {
            var2.add(var4);
         }
      }

      for (Object var6 : var2) {
         this.remove(var6);
      }
   }

   class="kw">public void move(T var1, Vector3d var2) {
      SpatialHashGrid.Entry var3 = this.index.get(var1);
      if (var3 != null) {
         Vector3i var4 = var3.cell;
         Vector3i var5 = this.cellFor(var2);
         var3.pos.set(var2);
         if (!var4.equals(var5)) {
            List var6 = this.grid.get(var4);
            var6.remove(var3);
            if (var6.isEmpty()) {
               this.grid.remove(var4);
            }

            var3.cell = var5;
            this.grid.computeIfAbsent(var5, var0 -> new ObjectArrayList()).add(var3);
         }
      }
   }

   class="kw">public Map<T, Vector3d> queryRange(Vector3d var1, double var2) {
      Map var4 = new Object2ObjectOpenHashMap();
      double var5 = var2 * var2;
      this.query(var1, var2, var4x -> {
         for (SpatialHashGrid.Entry var6 : var4x) {
            if (var6.pos.distanceSquared(var1) <= var5) {
               var4.put(var6.value, var6.pos);
            }
         }

         class="kw">return true;
      });
      class="kw">return var4;
   }

   @Nullable
   class="kw">public T findClosest(class="kw">final Vector3d var1, double var2) {
      var var4 = new SpatialHashGrid.CellVisitor<T>() {
         double closestDist = Double.MAX_VALUE;
         Object closest = null;

         @Override
         class="kw">public boolean visit(List<SpatialHashGrid.Entry<T>> var1x) {
            for (SpatialHashGrid.Entry var3 : var1x) {
               double var4 = var3.pos.distanceSquared(var1);
               if (var4 <= this.closestDist) {
                  this.closestDist = var4;
                  this.closest = var3.value;
               }
            }

            class="kw">return true;
         }
      };
      this.query(var1, var2, var4);
      class="kw">return (T)var4.closest;
   }

   class="kw">public boolean hasAnyWithin(class="kw">final Vector3d var1, class="kw">final double var2) {
      var var4 = new SpatialHashGrid.CellVisitor<T>() {
         class="kw">final double radiusSq = var2 * var2;
         boolean hasWithin = false;

         @Override
         class="kw">public boolean visit(List<SpatialHashGrid.Entry<T>> var1x) {
            for (SpatialHashGrid.Entry var3 : var1x) {
               double var4 = var3.pos.distanceSquared(var1);
               if (var4 <= this.radiusSq) {
                  this.hasWithin = true;
                  class="kw">return false;
               }
            }

            class="kw">return true;
         }
      };
      this.query(var1, var2, var4);
      class="kw">return var4.hasWithin;
   }

   class="kw">private void query(Vector3d var1, double var2, SpatialHashGrid.CellVisitor<T> var4) {
      int var5 = MathUtil.floor((var1.x - var2) / this.cellSize);
      int var6 = MathUtil.floor((var1.y - var2) / this.cellSize);
      int var7 = MathUtil.floor((var1.z - var2) / this.cellSize);
      int var8 = MathUtil.floor((var1.x + var2) / this.cellSize);
      int var9 = MathUtil.floor((var1.y + var2) / this.cellSize);
      int var10 = MathUtil.floor((var1.z + var2) / this.cellSize);
      Vector3i var11 = new Vector3i();

      for (int var12 = var5; var12 <= var8; var12++) {
         for (int var13 = var6; var13 <= var9; var13++) {
            for (int var14 = var7; var14 <= var10; var14++) {
               var11.set(var12, var13, var14);
               List var15 = this.grid.get(var11);
               if (var15 != null) {
                  boolean var16 = var4.visit(var15);
                  if (!var16) {
                     class="kw">return;
                  }
               }
            }
         }
      }
   }

   class="kw">private class="kw">interface CellVisitor<T> {
      boolean visit(List<SpatialHashGrid.Entry<T>> var1);
   }

   class="kw">private class="kw">static class="kw">final class Entry<T> {
      class="kw">private class="kw">final Vector3d pos;
      class="kw">private Vector3i cell;
      class="kw">private class="kw">final T value;

      class="kw">private Entry(Vector3d var1, Vector3i var2, T var3) {
         this.pos = var1;
         this.cell = var2;
         this.value = var3;
      }
   }
}