@Override public Set<Vector3> getInteriorPoints(IFieldInteraction projector) { Set<Vector3> fieldBlocks = new HashSet<Vector3>(); Vector3 posScale = projector.getPositiveScale(); Vector3 negScale = projector.getNegativeScale(); int xStretch = posScale.intX() + negScale.intX(); int yStretch = posScale.intY() + negScale.intY(); int zStretch = posScale.intZ() + negScale.intZ(); Vector3 translation = new Vector3(0, -0.4, 0); for (float x = -xStretch; x <= xStretch; x++) { for (float z = -zStretch; z <= zStretch; z++) { for (float y = 0; y <= yStretch; y++) { Vector3 position = new Vector3(x, y, z).add(translation); if (this.isInField( projector, Vector3.translate(position, new Vector3((TileEntity) projector)))) { fieldBlocks.add(position); } } } } return fieldBlocks; }
@Override public boolean isInField(IFieldInteraction projector, Vector3 position) { Vector3 posScale = projector.getPositiveScale().clone(); Vector3 negScale = projector.getNegativeScale().clone(); int xStretch = posScale.intX() + negScale.intX(); int yStretch = posScale.intY() + negScale.intY(); int zStretch = posScale.intZ() + negScale.intZ(); Vector3 projectorPos = new Vector3((TileEntity) projector); projectorPos.add(projector.getTranslation()); projectorPos.add(new Vector3(0, -negScale.intY() + 1, 0)); Vector3 relativePosition = position.clone().subtract(projectorPos); relativePosition.rotate(-projector.getRotationYaw(), -projector.getRotationPitch()); Cuboid region = new Cuboid(negScale.scale(-1), posScale); if (region.isIn(relativePosition) && relativePosition.y > 0) { if ((1 - (Math.abs(relativePosition.x) / xStretch) - (Math.abs(relativePosition.z) / zStretch) > relativePosition.y / yStretch)) { return true; } } return false; }
@Override public Set<Vector3> getExteriorPoints(IFieldInteraction projector) { final Set<Vector3> fieldBlocks = new HashSet<Vector3>(); final Vector3 posScale = projector.getPositiveScale(); final Vector3 negScale = projector.getNegativeScale(); final int xStretch = posScale.intX() + negScale.intX(); final int yStretch = posScale.intY() + negScale.intY(); final int zStretch = posScale.intZ() + negScale.intZ(); final Vector3 translation = new Vector3(0, -negScale.intY(), 0); final int inverseThickness = (int) Math.max((yStretch + zStretch) / 4f, 1); System.out.println(inverseThickness); for (float y = 0; y <= yStretch; y += 1f) { for (float x = -xStretch; x <= xStretch; x += 1f) { for (float z = -zStretch; z <= zStretch; z += 1f) { double yTest = (y / yStretch) * inverseThickness; double xzPositivePlane = (1 - (x / xStretch) - (z / zStretch)) * inverseThickness; double xzNegativePlane = (1 + (x / xStretch) - (z / zStretch)) * inverseThickness; // Positive Positive Plane if (x >= 0 && z >= 0 && Math.round(xzPositivePlane) == Math.round(yTest)) { fieldBlocks.add(new Vector3(x, y, z).add(translation)); fieldBlocks.add(new Vector3(x, y, -z).add(translation)); } // Negative Positive Plane if (x <= 0 && z >= 0 && Math.round(xzNegativePlane) == Math.round(yTest)) { fieldBlocks.add(new Vector3(x, y, -z).add(translation)); fieldBlocks.add(new Vector3(x, y, z).add(translation)); } // Ground Level Plane if (y == 0 && (Math.abs(x) + Math.abs(z)) < (xStretch + yStretch) / 2) { fieldBlocks.add(new Vector3(x, y, z).add(translation)); } } } } return fieldBlocks; }