private final Integer radius;
private final boolean spawnsIronGolems;
private Set<BlockPos> doors;
+ private Double centerOffsetX;
+ private Double centerOffsetZ;
protected BoundingBoxVillage(BlockPos center, Integer radius, Color color, boolean spawnsIronGolems, Set<BlockPos> doors, BlockPos minBlockPos, BlockPos maxBlockPos) {
super(minBlockPos, maxBlockPos, color);
this.radius = radius;
this.spawnsIronGolems = spawnsIronGolems;
this.doors = doors;
+ calculateCenterOffsets(doors);
}
public static BoundingBoxVillage from(BlockPos center, Integer radius, int population, Set<BlockPos> doors) {
return new BoundingBoxVillage(center, radius, color, spawnsIronGolems, doors, minBlockPos, maxBlockPos);
}
+ private void calculateCenterOffsets(Set<BlockPos> doors)
+ {
+ boolean processedFirstDoor = false;
+ int minX = 0;
+ int maxX = 0;
+ int minZ = 0;
+ int maxZ = 0;
+ for (BlockPos door : doors) {
+ if (!processedFirstDoor ||
+ (minX > door.getX()))
+ minX = door.getX();
+ if (!processedFirstDoor ||
+ maxX < door.getX())
+ maxX = door.getX();
+ if (!processedFirstDoor ||
+ minZ > door.getZ())
+ minZ = door.getZ();
+ if (!processedFirstDoor ||
+ maxZ < door.getZ())
+ maxZ = door.getZ();
+
+ processedFirstDoor = true;
+ }
+ centerOffsetX = Math.abs(maxX-minX) % 2 == 0 ? 0.5 : (minX < 0 ? 0 : 1);
+ centerOffsetZ = Math.abs(maxZ-minZ) % 2 == 0 ? 0.5 : (minZ < 0 ? 0 : 1);
+ }
+
@Override
public String toString() {
return "(" + center.toString() + "; " + radius.toString() + ")";
return center;
}
+ public Double getCenterOffsetX() {
+ return centerOffsetX;
+ }
+
+ public Double getCenterOffsetZ() {
+ return centerOffsetZ;
+ }
+
@Override
public int hashCode()
{ final int prime = 31;
center.getZ() - 8),
new BlockPos(center.getX() + 8,
center.getY() + 3,
- center.getZ() + 8));
- renderCuboid(abb.addCoord(1, 1, 1), villageBB.getColor(), false);
+ center.getZ() + 8))
+ .offset(villageBB.getCenterOffsetX(), 0.0, villageBB.getCenterOffsetZ());
+
+ renderCuboid(abb, villageBB.getColor(), false);
}
private void renderVillageDoors(BoundingBoxVillage villageBB) {
- OffsetPoint center = new OffsetPoint(villageBB.getCenter());
+ OffsetPoint center = new OffsetPoint(villageBB.getCenter())
+ .add(villageBB.getCenterOffsetX(), 0.0, villageBB.getCenterOffsetZ());
Color color = villageBB.getColor();
GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
Tessellator tessellator = Tessellator.getInstance();
worldRenderer.begin(GL11.GL_LINES, worldRenderer.getVertexFormat());
for (BlockPos door : villageBB.getDoors()) {
- OffsetPoint point = new OffsetPoint(door);
+ OffsetPoint point = new OffsetPoint(door).add(0.5, 0, 0.5);
worldRenderer.pos(point.getX(), point.getY(), point.getZ()).color(colorR, colorG, colorB, 255).endVertex();
worldRenderer.pos(center.getX(), center.getY(), center.getZ()).color(colorR, colorG, colorB, 255).endVertex();
}
private void renderBoundingBoxVillageAsSphere(BoundingBoxVillage bb) {
- BlockPos center = bb.getCenter();
+ OffsetPoint center = new OffsetPoint(bb.getCenter())
+ .add(bb.getCenterOffsetX(), 0.0, bb.getCenterOffsetZ());;
int radius = bb.getRadius();
Color color = bb.getColor();
renderSphere(center, radius, color);
}
- private void renderSphere(BlockPos center, double radius, Color color) {
+ private void renderSphere(OffsetPoint center, double radius, Color color) {
GL11.glEnable(GL11.GL_POINT_SMOOTH);
GL11.glPointSize(2f);
}
}
- private Set<OffsetPoint> buildPoints(BlockPos center, double radius) {
+ private Set<OffsetPoint> buildPoints(OffsetPoint center, double radius) {
Set<OffsetPoint> points = new HashSet<OffsetPoint>(1200);
double tau = 6.283185307179586D;
double pi = tau / 2D;
double segment = tau / 48D;
- OffsetPoint centerPoint = new OffsetPoint(center);
for (double t = 0.0D; t < tau; t += segment)
for (double theta = 0.0D; theta < pi; theta += segment) {
double dz = radius * Math.sin(t) * Math.sin(theta);
double dy = radius * Math.cos(t);
- points.add(centerPoint.add(dx, dy, dz));
+ points.add(center.add(dx, dy, dz));
}
return points;
}