SpatialHashGrid class

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

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

Поля (31)

МодификаторыТипИмя
private Vector3i cell
final double cellSize
Object closest
boolean hasWithin
private final Vector3d pos
return
private final T value
int var10
Vector3i var11
List var15
boolean var16
SpatialHashGrid.Entry var2
Set var2
Vector3i var3
List var3
SpatialHashGrid.Entry var3
SpatialHashGrid.Entry var4
Vector3i var4
Map var4
var var4
double var4
var var4
double var4
Vector3i var5
double var5
int var5
List var6
int var6
int var7
int var8
int var9

Методы (28)

МодификаторыВозвратСигнатура
private Entryprivate Entry(Vector3d var1, Vector3i var2, T var3)
public void addvoid add(Vector3d var1, T var2)
private Vector3i cellForVector3i cellFor(Vector3dc var1)
for for(Object var6 : var2)
for for(SpatialHashGrid.Entry var6 : var4x)
for for(SpatialHashGrid.Entry var3 : var1x)
for for(SpatialHashGrid.Entry var3 : var1x)
for for(int var12 = var5; var12 <= var8; var12++)
for for(int var13 = var6; var13 <= var9; var13++)
for for(int var14 = var7; var14 <= var10; var14++)
public boolean hasAnyWithinboolean hasAnyWithin(final Vector3d var1, final double var2)
if if(var2 == null)
if if(var3 != null)
if if(var3 != null)
if if(var4 <= this.closestDist)
if if(var4 <= this.radiusSq)
if if(var15 != null)
if if(!var16)
public boolean isEmptyboolean isEmpty()
public void movevoid move(T var1, Vector3d var2)
private void queryvoid query(Vector3d var1, double var2, SpatialHashGrid.CellVisitor<T> var4)
public Map<T, Vector3d> queryRangeMap<T, Vector3d> queryRange(Vector3d var1, double var2)
public boolean removeboolean remove(T var1)
public void removeIfvoid removeIf(Predicate<T> var1)
public int sizeint size()
public boolean visitpublic boolean visit(List<SpatialHashGrid.Entry<T>> var1x)
public boolean visitpublic boolean visit(List<SpatialHashGrid.Entry<T>> var1x)
abstract boolean visitboolean visit(List<SpatialHashGrid.Entry<T>> var1)

Исходный код

Показать/скрыть
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;
      }
   }
}