CellVisitor interface
Пакет: com.hypixel.hytale.builtin.portals.utils.spatial
Файл: com/hypixel/hytale/builtin/portals/utils/spatial/SpatialHashGrid.java
Методы (1)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
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;
}
}
}