GraphSpace class

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

Файл: com/hypixel/hytale/builtin/hytalegenerator/graph/GraphSpace.java

implements: IndexedGraphSpace

Поля (40)

МодификаторыТипИмя
public static final GraphSpace.Content DEFAULT
public static final int DEFAULT_TAG
public static final Comparator<GraphSpace.Node> DETERMINISTIC_ORDER
public static final int VOID_ID
public static final int VOID_INDEX
private GraphSpace.Content content
private final List<GraphSpace.Edge> edges
private GraphSpace graphSpace
private final int hashCode
private final int hashCode
private int hashCode
public GraphSpace.Node highNode
private final long id
private final int id
public final int index
private boolean isHashCodeDirty
private final KDTree<GraphSpace.Node> kdTree
public GraphSpace.Node lowNode
private int nextId
private final GraphSpace.Node nodeA
private final GraphSpace.Node nodeB
private final Vector3d position
return
public final IntSet tagSet
var1
List var2
GraphSpace.Node var2
int var2
int var2
var2
var2
Control var2
long var3
GraphSpace.Edge var3
var3
long var3
GraphSpace.OrderedNodePair var3
int var3
GraphSpace.Edge var5
GraphSpace.Edge var5

Методы (62)

МодификаторыВозвратСигнатура
public Contentpublic Content(@Nonnull int[] var1, int var2)
private Edgeprivate Edge(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2)
private Nodeprivate Node(@Nonnull GraphSpace var1, int var2)
public OrderedNodePairpublic OrderedNodePair(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2)
private ReadOnlyprivate ReadOnly(@Nonnull KDTree<GraphSpace.Node> var1)
private static int compareDeterministicprivate static int compareDeterministic(@Nonnull GraphSpace.Node var0, @Nonnull GraphSpace.Node var1)
public GraphSpace.Content contentpublic GraphSpace.Content content()
public static long createIdpublic static long createId(@Nonnull GraphSpace.Node var0, @Nonnull GraphSpace.Node var1)
public void deleteEdgevoid deleteEdge(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2)
public void deleteEdgevoid deleteEdge(@Nonnull GraphSpace.Edge var1)
public void deleteNodevoid deleteNode(@Nonnull GraphSpace.Node var1)
private void discardprivate void discard()
public void disconnectAllpublic void disconnectAll()
public List<GraphSpace.Edge> edgespublic List<GraphSpace.Edge> edges()
public boolean equalspublic boolean equals(@Nullable Object var1)
for for(GraphSpace.Node var4 : this.nodes)
for for(Runnable var2 : this.taskQueue)
for for(GraphSpace.Node var2 : this.nodes)
for for(GraphSpace.Edge var4 : this.edges)
for for(GraphSpace.Edge var3 : this.edges)
for for(GraphSpace.Edge var2 : this.edges)
public int getEdgesCountpublic int getEdgesCount()
public void getNodespublic void getNodes(@Nonnull Bounds3d var1, @Nonnull List<GraphSpace.Node> var2)
public void getNodespublic void getNodes(@Nonnull Vector3dc var1, double var2, @Nonnull List<GraphSpace.Node> var4)
public int hashCodepublic int hashCode()
public int hashCodepublic int hashCode()
public int hashCodepublic int hashCode()
public long idpublic long id()
public int idpublic int id()
if if(var5 != null)
if if(var3 != null)
if if(var5 != null)
if if(var1 != null)
if if(this.dirty)
if if(var2 != 0)
if if(var2 != 0)
if if(this.isHashCodeDirty)
if if(var2.stop)
if if(var1.graphSpace != this.graphSpace)
if if(var1.id > var2.id)
public boolean isConnectedpublic boolean isConnected(@Nonnull GraphSpace.Node var1)
public boolean isDiscardedpublic boolean isDiscarded()
public boolean isParentSpacepublic boolean isParentSpace(@Nonnull GraphSpace var1)
public void movepublic void move(@Nonnull Vector3dc var1)
public void moveNodevoid moveNode(@Nonnull GraphSpace.Node var1, @Nonnull Vector3dc var2)
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)
public Vector3dc positionpublic Vector3dc position()
public void processTaskQueuevoid processTaskQueue()
private void rebuildIfDirtyvoid rebuildIfDirty()
public void schedulevoid schedule(@Nonnull Runnable var1)
public void scheduleEdgeCreationvoid scheduleEdgeCreation(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2)
public void scheduleEdgeDeletionvoid scheduleEdgeDeletion(@Nonnull GraphSpace.Node var1, @Nonnull GraphSpace.Node var2)
public void scheduleEdgeDeletionvoid scheduleEdgeDeletion(@Nonnull GraphSpace.Edge var1)
public void scheduleMoveNodevoid scheduleMoveNode(@Nonnull GraphSpace.Node var1, @Nonnull Vector3dc var2)
public void scheduleNodeCreationvoid scheduleNodeCreation(@Nonnull Vector3d var1)
public void scheduleNodeDeletionvoid scheduleNodeDeletion(@Nonnull GraphSpace.Node var1)
public void setContentpublic void setContent(@Nonnull GraphSpace.Content var1)
public static int toIntIdpublic static int toIntId(@Nonnull String var0)
public void trimvoid trim(@Nonnull Bounds3d var1)
public void viewConnectionspublic void viewConnections(@Nonnull Pipe.One<GraphSpace.Edge> 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);
      }
   }
}