Rewrote portions of our maze generation code to use RoomData. This provides an object that unifies all room data instead of having it spread across various data structures and linked loosely by hash maps. We'll need this to implement the remaining generation features.
137 lines
3.2 KiB
Java
137 lines
3.2 KiB
Java
package StevenDimDoors.experimental;
|
|
|
|
import StevenDimDoors.mod_pocketDim.Point3D;
|
|
|
|
public class PartitionNode<T> extends BoundingBox
|
|
{
|
|
private PartitionNode parent;
|
|
private PartitionNode leftChild = null;
|
|
private PartitionNode rightChild = null;
|
|
private T data = null;
|
|
|
|
public PartitionNode(int width, int height, int length)
|
|
{
|
|
super(new Point3D(0, 0, 0), new Point3D(width - 1, height - 1, length - 1));
|
|
parent = null;
|
|
}
|
|
|
|
private PartitionNode(PartitionNode parent, Point3D minCorner, Point3D maxCorner)
|
|
{
|
|
super(minCorner, maxCorner);
|
|
this.parent = parent;
|
|
}
|
|
|
|
public boolean isLeaf()
|
|
{
|
|
return (leftChild == null && rightChild == null);
|
|
}
|
|
|
|
public PartitionNode leftChild()
|
|
{
|
|
return leftChild;
|
|
}
|
|
|
|
public PartitionNode rightChild()
|
|
{
|
|
return rightChild;
|
|
}
|
|
|
|
public PartitionNode parent()
|
|
{
|
|
return parent;
|
|
}
|
|
|
|
public void splitByX(int rightStart)
|
|
{
|
|
if (!this.isLeaf())
|
|
{
|
|
throw new IllegalStateException("This node has already been split.");
|
|
}
|
|
if (rightStart <= minCorner.getX() || rightStart > maxCorner.getX())
|
|
{
|
|
throw new IllegalArgumentException("The specified cutting plane is invalid.");
|
|
}
|
|
leftChild = new PartitionNode(this, minCorner, new Point3D(rightStart - 1, maxCorner.getY(), maxCorner.getZ()));
|
|
rightChild = new PartitionNode(this, new Point3D(rightStart, minCorner.getY(), minCorner.getZ()), maxCorner);
|
|
}
|
|
|
|
public void splitByY(int rightStart)
|
|
{
|
|
if (!this.isLeaf())
|
|
{
|
|
throw new IllegalStateException("This node has already been split.");
|
|
}
|
|
if (rightStart <= minCorner.getY() || rightStart > maxCorner.getY())
|
|
{
|
|
throw new IllegalArgumentException("The specified cutting plane is invalid.");
|
|
}
|
|
leftChild = new PartitionNode(this, minCorner, new Point3D(maxCorner.getX(), rightStart - 1, maxCorner.getZ()));
|
|
rightChild = new PartitionNode(this, new Point3D(minCorner.getX(), rightStart, minCorner.getZ()), maxCorner);
|
|
}
|
|
|
|
public void splitByZ(int rightStart)
|
|
{
|
|
if (!this.isLeaf())
|
|
{
|
|
throw new IllegalStateException("This node has already been split.");
|
|
}
|
|
if (rightStart <= minCorner.getZ() || rightStart > maxCorner.getZ())
|
|
{
|
|
throw new IllegalArgumentException("The specified cutting plane is invalid.");
|
|
}
|
|
leftChild = new PartitionNode(this, minCorner, new Point3D(maxCorner.getX(), maxCorner.getY(), rightStart - 1));
|
|
rightChild = new PartitionNode(this, new Point3D(minCorner.getX(), minCorner.getY(), rightStart), maxCorner);
|
|
}
|
|
|
|
public void remove()
|
|
{
|
|
if (parent != null)
|
|
{
|
|
if (parent.leftChild == this)
|
|
parent.leftChild = null;
|
|
else
|
|
parent.rightChild = null;
|
|
parent = null;
|
|
}
|
|
}
|
|
|
|
public PartitionNode findPoint(int x, int y, int z)
|
|
{
|
|
// Find the lowest node that contains the specified point or return null
|
|
if (this.contains(x, y, z))
|
|
{
|
|
return this.findPointInternal(x, y, z);
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private PartitionNode findPointInternal(int x, int y, int z)
|
|
{
|
|
if (leftChild != null && leftChild.contains(x, y, z))
|
|
{
|
|
return leftChild.findPointInternal(x, y, z);
|
|
}
|
|
else if (rightChild != null && rightChild.contains(x, y, z))
|
|
{
|
|
return rightChild.findPointInternal(x, y, z);
|
|
}
|
|
else
|
|
{
|
|
return this;
|
|
}
|
|
}
|
|
|
|
public void setData(T value)
|
|
{
|
|
this.data = value;
|
|
}
|
|
|
|
public T getData()
|
|
{
|
|
return data;
|
|
}
|
|
}
|