Edge class
Пакет: com.hypixel.hytale.builtin.hytalegenerator.graph
Файл: com/hypixel/hytale/builtin/hytalegenerator/graph/GraphSpace.java
Поля (7)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private final int |
hashCode |
|
private final long |
id |
|
private final GraphSpace.Node |
nodeA |
|
private final GraphSpace.Node |
nodeB |
|
int |
var2 |
|
GraphSpace.OrderedNodePair |
var3 |
|
int |
var3 |
Методы (7)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public static long |
createIdpublic static long createId(@Nonnull GraphSpace.Node var0, @Nonnull GraphSpace.Node var1) |
|
public boolean |
equalspublic boolean equals(@Nullable Object var1) |
|
public int |
hashCodepublic int hashCode() |
|
public long |
idpublic long id() |
|
public GraphSpace.Node |
nodeApublic GraphSpace.Node nodeA() |
|
public GraphSpace.Node |
nodeBpublic GraphSpace.Node nodeB() |
|
public GraphSpace.Node |
otherNodepublic GraphSpace.Node otherNode(@Nonnull GraphSpace.Node var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.graph;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3d;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.pipe.Control;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.pipe.Pipe;
class="kw">import com.hypixel.hytale.component.spatial.KDTree;
class="kw">import com.hypixel.hytale.component.spatial.SpatialData;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Collection;
class="kw">import java.util.Collections;
class="kw">import java.util.Comparator;
class="kw">import java.util.List;
class="kw">import java.util.Objects;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;
class="kw">public class GraphSpace class="kw">implements IndexedGraphSpace {
class="kw">private int nextId = 0;
@Nonnull
class="kw">private List<GraphSpace.Node> nodes = new ArrayList<>();
@Nonnull
class="kw">private List<GraphSpace.Node> unmodifiableNodes = Collections.unmodifiableList(this.nodes);
@Nonnull
class="kw">private class="kw">final Long2ObjectMap<GraphSpace.Edge> edges = new Long2ObjectOpenHashMap();
@Nonnull
class="kw">private class="kw">final List<Runnable> taskQueue = new ArrayList<>();
@Nonnull
class="kw">private class="kw">final KDTree<GraphSpace.Node> kdTree = new KDTree<>(var0 -> true);
@Nonnull
class="kw">private class="kw">final SpatialData<GraphSpace.Node> spacialData = new SpatialData<>();
class="kw">private class="kw">volatile boolean dirty = true;
class="kw">public GraphSpace() {
}
@Override
class="kw">public void getNodes(@Nonnull Bounds3d var1, @Nonnull List<GraphSpace.Node> var2) {
this.rebuildIfDirty();
this.kdTree.collectBox(var1.min, var1.max, var2);
}
@Override
class="kw">public void getNodes(@Nonnull Vector3dc var1, double var2, @Nonnull List<GraphSpace.Node> var4) {
this.rebuildIfDirty();
this.kdTree.collect(var1, Math.nextDown(var2), var4);
}
@Nonnull
class="kw">public List<GraphSpace.Node> getNodes() {
class="kw">return this.unmodifiableNodes;
}
@Nonnull
class="kw">public Collection<GraphSpace.Edge> getEdges() {
class="kw">return this.edges.values();
}
class="kw">public void trim(@Nonnull Bounds3d var1) {
List var2 = new ArrayList<>(this.nodes.size());
for (GraphSpace.Node var4 : this.nodes) {
if (var1.contains(var4.position)) {
var2.add(var4);
} else {
var4.discard();
this.dirty = true;
}
}
this.nodes = var2;
this.unmodifiableNodes = Collections.unmodifiableList(this.nodes);
}
class="kw">public void schedule(@Nonnull Runnable var1) {
this.taskQueue.add(var1);
}
class="kw">public void scheduleNodeCreation(@Nonnull Vector3d var1) {
this.taskQueue.add(() -> this.createNode(var1));
}
class="kw">public void scheduleEdgeCreation(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2) {
this.taskQueue.add(() -> this.getOrCreateEdge(var1, var2));
}
class="kw">public void scheduleMoveNode(@Nonnull GraphSpace.Node var1, @Nonnull Vector3dc var2) {
this.taskQueue.add(() -> this.moveNode(var1, var2));
}
class="kw">public void scheduleNodeDeletion(@Nonnull GraphSpace.Node var1) {
assert var1.graphSpace == this;
this.taskQueue.add(() -> this.deleteNode(var1));
}
class="kw">public void scheduleEdgeDeletion(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2) {
long var3 = GraphSpace.Edge.createId(var1, var2);
GraphSpace.Edge var5 = (GraphSpace.Edge)this.edges.get(var3);
if (var5 != null) {
this.scheduleEdgeDeletion(var5);
}
}
class="kw">public void scheduleEdgeDeletion(@Nonnull GraphSpace.Edge var1) {
this.taskQueue.add(() -> this.deleteEdge(var1));
}
@Nonnull
class="kw">public GraphSpace.Node createNode(@Nonnull Vector3d var1) {
GraphSpace.Node var2 = new GraphSpace.Node(this, this.nextId++);
var2.move(var1);
this.nodes.add(var2);
this.dirty = true;
class="kw">return var2;
}
@Nullable
class="kw">public GraphSpace.Edge getOrCreateEdge(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2) {
if (!var1.isDiscarded() && !var2.isDiscarded()) {
assert var1.graphSpace == this && var2.graphSpace == this;
assert var1.id != var2.id;
GraphSpace.Edge var3 = (GraphSpace.Edge)this.edges.get(GraphSpace.Edge.createId(var1, var2));
if (var3 != null) {
class="kw">return var3;
}
var3 = new GraphSpace.Edge(var1, var2);
this.edges.put(var3.id, var3);
var1.edges.add(var3);
var2.edges.add(var3);
class="kw">return var3;
} else {
class="kw">return null;
}
}
class="kw">public void moveNode(@Nonnull GraphSpace.Node var1, @Nonnull Vector3dc var2) {
var1.move(var2);
this.dirty = true;
}
@Nullable
class="kw">public GraphSpace.Edge getEdge(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2) {
assert var1.graphSpace == this && var2.graphSpace == this;
assert var1.id != var2.id;
class="kw">return (GraphSpace.Edge)this.edges.get(GraphSpace.Edge.createId(var1, var2));
}
class="kw">public void deleteNode(@Nonnull GraphSpace.Node var1) {
assert var1.isParentSpace(this);
this.nodes.remove(var1);
var1.discard();
this.dirty = true;
}
class="kw">public void deleteEdge(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2) {
long var3 = GraphSpace.Edge.createId(var1, var2);
GraphSpace.Edge var5 = (GraphSpace.Edge)this.edges.get(var3);
if (var5 != null) {
var5.nodeA.edges.remove(var5);
var5.nodeB.edges.remove(var5);
this.edges.remove(var5.id);
}
}
class="kw">public void deleteEdge(@Nonnull GraphSpace.Edge var1) {
var1 = (GraphSpace.Edge)this.edges.get(var1.id);
if (var1 != null) {
var1.nodeA.edges.remove(var1);
var1.nodeB.edges.remove(var1);
this.edges.remove(var1.id);
}
}
class="kw">public void processTaskQueue() {
for (Runnable var2 : this.taskQueue) {
var2.run();
}
this.taskQueue.clear();
this.dirty = true;
}
class="kw">private void rebuildIfDirty() {
if (this.dirty) {
this.dirty = false;
this.spacialData.clear();
this.spacialData.addCapacity(this.nodes.size());
for (GraphSpace.Node var2 : this.nodes) {
this.spacialData.append(var2.position, var2);
}
this.kdTree.rebuild(this.spacialData);
}
}
@Nonnull
class="kw">public GraphSpace.ReadOnly toReadOnly() {
this.rebuildIfDirty();
class="kw">return new GraphSpace.ReadOnly(this.kdTree);
}
class="kw">public class="kw">static class Content {
class="kw">public class="kw">static class="kw">final int DEFAULT_TAG = toIntId("");
class="kw">public class="kw">static class="kw">final int VOID_INDEX = -1;
@Nonnull
class="kw">public class="kw">static class="kw">final GraphSpace.Content DEFAULT = new GraphSpace.Content(new int[]{DEFAULT_TAG}, -1);
@Nonnull
class="kw">public class="kw">final IntSet tagSet;
class="kw">public class="kw">final int index;
class="kw">private class="kw">final int hashCode;
class="kw">public Content(@Nonnull int[] var1, int var2) {
this.tagSet = new IntOpenHashSet(var1);
this.index = var2;
this.hashCode = Objects.hash(this.tagSet, var2);
}
class="kw">public class="kw">static int toIntId(@Nonnull String var0) {
class="kw">return var0.hashCode();
}
@Override
class="kw">public int hashCode() {
class="kw">return this.hashCode;
}
}
class="kw">public class="kw">static class Edge {
class="kw">private class="kw">final long id;
class="kw">private class="kw">final int hashCode;
@Nonnull
class="kw">private class="kw">final GraphSpace.Node nodeA;
@Nonnull
class="kw">private class="kw">final GraphSpace.Node nodeB;
class="kw">private Edge(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2) {
assert var1.graphSpace == var2.graphSpace;
assert var1.id != var2.id;
GraphSpace.OrderedNodePair var3 = new GraphSpace.OrderedNodePair(var1, var2);
this.nodeA = var3.lowNode;
this.nodeB = var3.highNode;
this.id = createId(var1, var2);
this.hashCode = Objects.hash(this.id);
}
class="kw">public class="kw">static long createId(@Nonnull GraphSpace.Node var0, @Nonnull GraphSpace.Node var1) {
int var2 = Math.max(var0.id, var1.id);
int var3 = Math.min(var0.id, var1.id);
class="kw">return var3 & 4294967295L | (long)var2 << 32;
}
class="kw">public long id() {
class="kw">return this.id;
}
@Nonnull
class="kw">public GraphSpace.Node nodeA() {
class="kw">return this.nodeA;
}
@Nonnull
class="kw">public GraphSpace.Node nodeB() {
class="kw">return this.nodeB;
}
@Nonnull
class="kw">public GraphSpace.Node otherNode(@Nonnull GraphSpace.Node var1) {
assert this.nodeA == var1 || this.nodeB == var1;
class="kw">return this.nodeA == var1 ? this.nodeB : this.nodeA;
}
@Override
class="kw">public boolean equals(@Nullable Object var1) {
class="kw">return var1 class="kw">instanceof GraphSpace.Edge var2 ? this.id == var2.id : false;
}
@Override
class="kw">public int hashCode() {
class="kw">return this.hashCode;
}
}
class="kw">public class="kw">static class Node {
class="kw">public class="kw">static class="kw">final int VOID_ID = -1;
@Nonnull
class="kw">public class="kw">static class="kw">final Comparator<GraphSpace.Node> DETERMINISTIC_ORDER = GraphSpace.Node::compareDeterministic;
class="kw">private class="kw">final int id;
class="kw">private int hashCode;
class="kw">private boolean isHashCodeDirty;
@Nonnull
class="kw">private class="kw">final Vector3d position;
@Nullable
class="kw">private GraphSpace graphSpace;
@Nonnull
class="kw">private class="kw">final List<GraphSpace.Edge> edges;
@Nonnull
class="kw">private GraphSpace.Content content;
class="kw">private class="kw">static int compareDeterministic(@Nonnull GraphSpace.Node var0, @Nonnull GraphSpace.Node var1) {
int var2 = Double.compare(var0.position.x, var1.position.x);
if (var2 != 0) {
class="kw">return var2;
}
var2 = Double.compare(var0.position.y, var1.position.y);
if (var2 != 0) {
class="kw">return var2;
}
var2 = Double.compare(var0.position.z, var1.position.z);
class="kw">return var2 != 0 ? var2 : Integer.compare(var0.content.hashCode(), var1.content.hashCode());
}
class="kw">private Node(@Nonnull GraphSpace var1, int var2) {
this.id = var2;
this.hashCode = 0;
this.isHashCodeDirty = true;
this.graphSpace = var1;
this.position = new Vector3d();
this.edges = new ArrayList<>(2);
this.content = GraphSpace.Content.DEFAULT;
}
class="kw">public int id() {
class="kw">return this.id;
}
@Override
class="kw">public int hashCode() {
if (this.isHashCodeDirty) {
this.hashCode = Objects.hash(this.position, this.content);
this.isHashCodeDirty = false;
}
class="kw">return this.hashCode;
}
@Nonnull
class="kw">public GraphSpace.Content content() {
class="kw">return this.content;
}
@Nonnull
class="kw">public Vector3dc position() {
class="kw">return this.position;
}
@Nonnull
class="kw">public List<GraphSpace.Edge> edges() {
class="kw">return this.edges;
}
class="kw">public void viewConnections(@Nonnull Pipe.One<GraphSpace.Edge> var1) {
Control var2 = new Control();
for (GraphSpace.Edge var4 : this.edges) {
if (var2.stop) {
class="kw">return;
}
var1.accept(var4, var2);
}
}
class="kw">public boolean isConnected(@Nonnull GraphSpace.Node var1) {
if (var1.graphSpace != this.graphSpace) {
class="kw">return false;
}
for (GraphSpace.Edge var3 : this.edges) {
if (var3.otherNode(this).id == var1.id) {
class="kw">return true;
}
}
class="kw">return false;
}
class="kw">public boolean isDiscarded() {
class="kw">return this.graphSpace == null;
}
class="kw">public boolean isParentSpace(@Nonnull GraphSpace var1) {
class="kw">return this.graphSpace == var1;
}
class="kw">public int getEdgesCount() {
class="kw">return this.edges.size();
}
class="kw">public void setContent(@Nonnull GraphSpace.Content var1) {
this.content = var1;
this.isHashCodeDirty = true;
}
class="kw">public void move(@Nonnull Vector3dc var1) {
this.position.set(var1);
this.isHashCodeDirty = true;
}
class="kw">public void disconnectAll() {
assert this.graphSpace != null;
for (GraphSpace.Edge var2 : this.edges) {
this.graphSpace.edges.remove(var2.id);
var2.otherNode(this).edges.remove(var2);
}
this.edges.clear();
}
class="kw">private void discard() {
this.disconnectAll();
this.graphSpace = null;
}
}
class="kw">public class="kw">static class OrderedNodePair {
@Nonnull
class="kw">public GraphSpace.Node highNode;
@Nonnull
class="kw">public GraphSpace.Node lowNode;
class="kw">public OrderedNodePair(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2) {
assert var1 != var2 && var1.graphSpace == var2.graphSpace;
if (var1.id > var2.id) {
this.highNode = var1;
this.lowNode = var2;
} else {
this.highNode = var2;
this.lowNode = var1;
}
}
}
class="kw">public class="kw">static class ReadOnly class="kw">implements IndexedGraphSpace {
@Nonnull
class="kw">private class="kw">final KDTree<GraphSpace.Node> kdTree;
class="kw">private ReadOnly(@Nonnull KDTree<GraphSpace.Node> var1) {
this.kdTree = var1;
}
@Override
class="kw">public void getNodes(@Nonnull Bounds3d var1, @Nonnull List<GraphSpace.Node> var2) {
this.kdTree.collectBox(var1.min, var1.max, var2);
}
@Override
class="kw">public void getNodes(@Nonnull Vector3dc var1, double var2, @Nonnull List<GraphSpace.Node> var4) {
this.kdTree.collect(var1, Math.nextDown(var2), var4);
}
}
}