package com.hypixel.hytale.builtin.hytalegenerator.positionproviders;
import com.hypixel.hytale.builtin.hytalegenerator.VectorUtil;
import com.hypixel.hytale.math.vector.Vector3d;
import javax.annotation.Nonnull;
public class AnchorPositionProvider extends PositionProvider {
@Nonnull
private final PositionProvider positionProvider;
private final boolean isReversed;
public AnchorPositionProvider(@Nonnull PositionProvider positionProvider, boolean isReversed) {
this.positionProvider = positionProvider;
this.isReversed = isReversed;
}
public void positionsIn(@Nonnull PositionProvider.Context context) {
if (context != null) {
Vector3d anchor = context.anchor;
if (anchor != null) {
Vector3d offsetMin = this.isReversed ? context.minInclusive.clone().add(anchor) : context.minInclusive.clone().addScaled(anchor, -1.0);
Vector3d offsetMax = this.isReversed ? context.maxExclusive.clone().add(anchor) : context.maxExclusive.clone().addScaled(anchor, -1.0);
PositionProvider.Context childContext = new PositionProvider.Context(offsetMin, offsetMax, (p) -> {
Vector3d newPoint = p.clone();
if (this.isReversed) {
newPoint.addScaled(anchor, -1.0);
} else {
newPoint.add(anchor);
}
if (VectorUtil.isInside(newPoint, context.minInclusive, context.maxExclusive)) {
context.consumer.accept(newPoint);
}
}, context.anchor, context.workerId);
this.positionProvider.positionsIn(childContext);
}
}
}
}