Start migration

This commit is contained in:
Aleksey 2021-04-08 21:55:07 +03:00
parent 6630ce0cab
commit 47ed597358
491 changed files with 12045 additions and 11953 deletions

View file

@ -7,11 +7,11 @@ import java.util.function.Function;
import com.google.common.collect.Lists;
import net.minecraft.block.BlockState;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockPos.Mutable;
import net.minecraft.util.math.MathHelper;
import net.minecraft.core.BlockPos;
import net.minecraft.core.BlockPos.MutableBlockPos;
import net.minecraft.util.Mth;
import net.minecraft.world.StructureWorldAccess;
import ru.betterend.util.sdf.SDF;
import ru.betterend.util.sdf.operator.SDFUnion;
@ -24,15 +24,15 @@ public class SplineHelper {
int count = points - 1;
for (int i = 1; i < count; i++) {
float delta = (float) i / (float) count;
float x = MathHelper.lerp(delta, x1, x2);
float y = MathHelper.lerp(delta, y1, y2);
float z = MathHelper.lerp(delta, z1, z2);
float x = Mth.lerp(delta, x1, x2);
float y = Mth.lerp(delta, y1, y2);
float z = Mth.lerp(delta, z1, z2);
spline.add(new Vector3f(x, y, z));
}
spline.add(new Vector3f(x2, y2, z2));
return spline;
}
public static List<Vector3f> smoothSpline(List<Vector3f> spline, int segmentPoints) {
List<Vector3f> result = Lists.newArrayList();
Vector3f start = spline.get(0);
@ -40,7 +40,7 @@ public class SplineHelper {
Vector3f end = spline.get(i);
for (int j = 0; j < segmentPoints; j++) {
float delta = (float) j / segmentPoints;
delta = 0.5F - 0.5F * MathHelper.cos(delta * 3.14159F);
delta = 0.5F - 0.5F * Mth.cos(delta * 3.14159F);
result.add(lerp(start, end, delta));
}
start = end;
@ -48,14 +48,14 @@ public class SplineHelper {
result.add(start);
return result;
}
private static Vector3f lerp(Vector3f start, Vector3f end, float delta) {
float x = MathHelper.lerp(delta, start.getX(), end.getX());
float y = MathHelper.lerp(delta, start.getY(), end.getY());
float z = MathHelper.lerp(delta, start.getZ(), end.getZ());
float x = Mth.lerp(delta, start.getX(), end.getX());
float y = Mth.lerp(delta, start.getY(), end.getY());
float z = Mth.lerp(delta, start.getZ(), end.getZ());
return new Vector3f(x, y, z);
}
public static void offsetParts(List<Vector3f> spline, Random random, float dx, float dy, float dz) {
int count = spline.size();
for (int i = 1; i < count; i++) {
@ -66,7 +66,7 @@ public class SplineHelper {
pos.set(x, y, z);
}
}
public static void powerOffset(List<Vector3f> spline, float distance, float power) {
int count = spline.size();
float max = count + 1;
@ -77,8 +77,9 @@ public class SplineHelper {
pos.set(pos.getX(), y, pos.getZ());
}
}
public static SDF buildSDF(List<Vector3f> spline, float radius1, float radius2, Function<BlockPos, BlockState> placerFunction) {
public static SDF buildSDF(List<Vector3f> spline, float radius1, float radius2,
Function<BlockPos, BlockState> placerFunction) {
int count = spline.size();
float max = count - 2;
SDF result = null;
@ -86,18 +87,17 @@ public class SplineHelper {
for (int i = 1; i < count; i++) {
Vector3f pos = spline.get(i);
float delta = (float) (i - 1) / max;
SDF line = new SDFLine()
.setRadius(MathHelper.lerp(delta, radius1, radius2))
.setStart(start.getX(), start.getY(), start.getZ())
.setEnd(pos.getX(), pos.getY(), pos.getZ())
SDF line = new SDFLine().setRadius(Mth.lerp(delta, radius1, radius2))
.setStart(start.getX(), start.getY(), start.getZ()).setEnd(pos.getX(), pos.getY(), pos.getZ())
.setBlock(placerFunction);
result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line);
start = pos;
}
return result;
}
public static SDF buildSDF(List<Vector3f> spline, Function<Float, Float> radiusFunction, Function<BlockPos, BlockState> placerFunction) {
public static SDF buildSDF(List<Vector3f> spline, Function<Float, Float> radiusFunction,
Function<BlockPos, BlockState> placerFunction) {
int count = spline.size();
float max = count - 2;
SDF result = null;
@ -105,18 +105,17 @@ public class SplineHelper {
for (int i = 1; i < count; i++) {
Vector3f pos = spline.get(i);
float delta = (float) (i - 1) / max;
SDF line = new SDFLine()
.setRadius(radiusFunction.apply(delta))
.setStart(start.getX(), start.getY(), start.getZ())
.setEnd(pos.getX(), pos.getY(), pos.getZ())
SDF line = new SDFLine().setRadius(radiusFunction.apply(delta))
.setStart(start.getX(), start.getY(), start.getZ()).setEnd(pos.getX(), pos.getY(), pos.getZ())
.setBlock(placerFunction);
result = result == null ? line : new SDFUnion().setSourceA(result).setSourceB(line);
start = pos;
}
return result;
}
public static boolean fillSpline(List<Vector3f> spline, StructureWorldAccess world, BlockState state, BlockPos pos, Function<BlockState, Boolean> replace) {
public static boolean fillSpline(List<Vector3f> spline, StructureWorldAccess world, BlockState state, BlockPos pos,
Function<BlockState, Boolean> replace) {
Vector3f startPos = spline.get(0);
for (int i = 1; i < spline.size(); i++) {
Vector3f endPos = spline.get(i);
@ -125,11 +124,12 @@ public class SplineHelper {
}
startPos = endPos;
}
return true;
}
public static void fillSplineForce(List<Vector3f> spline, StructureWorldAccess world, BlockState state, BlockPos pos, Function<BlockState, Boolean> replace) {
public static void fillSplineForce(List<Vector3f> spline, StructureWorldAccess world, BlockState state,
BlockPos pos, Function<BlockState, Boolean> replace) {
Vector3f startPos = spline.get(0);
for (int i = 1; i < spline.size(); i++) {
Vector3f endPos = spline.get(i);
@ -137,8 +137,9 @@ public class SplineHelper {
startPos = endPos;
}
}
public static boolean fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, Function<BlockState, Boolean> replace) {
public static boolean fillLine(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state,
BlockPos pos, Function<BlockState, Boolean> replace) {
float dx = end.getX() - start.getX();
float dy = end.getY() - start.getY();
float dz = end.getZ() - start.getZ();
@ -151,9 +152,9 @@ public class SplineHelper {
float y = start.getY();
float z = start.getZ();
boolean down = Math.abs(dy) > 0.2;
BlockState bState;
Mutable bPos = new Mutable();
MutableBlockPos bPos = new MutableBlockPos();
for (int i = 0; i < count; i++) {
bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ());
bState = world.getBlockState(bPos);
@ -164,8 +165,7 @@ public class SplineHelper {
if (down && bState.equals(state) || replace.apply(bState)) {
BlocksHelper.setWithoutUpdate(world, bPos, state);
}
}
else {
} else {
return false;
}
x += dx;
@ -182,13 +182,13 @@ public class SplineHelper {
BlocksHelper.setWithoutUpdate(world, bPos, state);
}
return true;
}
else {
} else {
return false;
}
}
public static void fillLineForce(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state, BlockPos pos, Function<BlockState, Boolean> replace) {
public static void fillLineForce(Vector3f start, Vector3f end, StructureWorldAccess world, BlockState state,
BlockPos pos, Function<BlockState, Boolean> replace) {
float dx = end.getX() - start.getX();
float dy = end.getY() - start.getY();
float dz = end.getZ() - start.getZ();
@ -201,9 +201,9 @@ public class SplineHelper {
float y = start.getY();
float z = start.getZ();
boolean down = Math.abs(dy) > 0.2;
BlockState bState;
Mutable bPos = new Mutable();
MutableBlockPos bPos = new MutableBlockPos();
for (int i = 0; i < count; i++) {
bPos.set(x + pos.getX(), y + pos.getY(), z + pos.getZ());
bState = world.getBlockState(bPos);
@ -230,11 +230,12 @@ public class SplineHelper {
}
}
}
public static boolean canGenerate(List<Vector3f> spline, float scale, BlockPos start, StructureWorldAccess world, Function<BlockState, Boolean> canReplace) {
public static boolean canGenerate(List<Vector3f> spline, float scale, BlockPos start, StructureWorldAccess world,
Function<BlockState, Boolean> canReplace) {
int count = spline.size();
Vector3f vec = spline.get(0);
Mutable mut = new Mutable();
MutableBlockPos mut = new MutableBlockPos();
float x1 = start.getX() + vec.getX() * scale;
float y1 = start.getY() + vec.getY() * scale;
float z1 = start.getZ() + vec.getZ() * scale;
@ -243,29 +244,31 @@ public class SplineHelper {
float x2 = start.getX() + vec.getX() * scale;
float y2 = start.getY() + vec.getY() * scale;
float z2 = start.getZ() + vec.getZ() * scale;
for (float py = y1; py < y2; py += 3) {
if (py - start.getY() < 10) continue;
if (py - start.getY() < 10)
continue;
float lerp = (py - y1) / (y2 - y1);
float x = MathHelper.lerp(lerp, x1, x2);
float z = MathHelper.lerp(lerp, z1, z2);
float x = Mth.lerp(lerp, x1, x2);
float z = Mth.lerp(lerp, z1, z2);
mut.set(x, py, z);
if (!canReplace.apply(world.getBlockState(mut))) {
return false;
}
}
x1 = x2;
y1 = y2;
z1 = z2;
}
return true;
}
public static boolean canGenerate(List<Vector3f> spline, BlockPos start, StructureWorldAccess world, Function<BlockState, Boolean> canReplace) {
public static boolean canGenerate(List<Vector3f> spline, BlockPos start, StructureWorldAccess world,
Function<BlockState, Boolean> canReplace) {
int count = spline.size();
Vector3f vec = spline.get(0);
Mutable mut = new Mutable();
MutableBlockPos mut = new MutableBlockPos();
float x1 = start.getX() + vec.getX();
float y1 = start.getY() + vec.getY();
float z1 = start.getZ() + vec.getZ();
@ -274,25 +277,26 @@ public class SplineHelper {
float x2 = start.getX() + vec.getX();
float y2 = start.getY() + vec.getY();
float z2 = start.getZ() + vec.getZ();
for (float py = y1; py < y2; py += 3) {
if (py - start.getY() < 10) continue;
if (py - start.getY() < 10)
continue;
float lerp = (py - y1) / (y2 - y1);
float x = MathHelper.lerp(lerp, x1, x2);
float z = MathHelper.lerp(lerp, z1, z2);
float x = Mth.lerp(lerp, x1, x2);
float z = Mth.lerp(lerp, z1, z2);
mut.set(x, py, z);
if (!canReplace.apply(world.getBlockState(mut))) {
return false;
}
}
x1 = x2;
y1 = y2;
z1 = z2;
}
return true;
}
public static Vector3f getPos(List<Vector3f> spline, float index) {
int i = (int) index;
int last = spline.size() - 1;
@ -302,14 +306,14 @@ public class SplineHelper {
float delta = index - i;
Vector3f p1 = spline.get(i);
Vector3f p2 = spline.get(i + 1);
float x = MathHelper.lerp(delta, p1.getX(), p2.getX());
float y = MathHelper.lerp(delta, p1.getY(), p2.getY());
float z = MathHelper.lerp(delta, p1.getZ(), p2.getZ());
float x = Mth.lerp(delta, p1.getX(), p2.getX());
float y = Mth.lerp(delta, p1.getY(), p2.getY());
float z = Mth.lerp(delta, p1.getZ(), p2.getZ());
return new Vector3f(x, y, z);
}
public static void rotateSpline(List<Vector3f> spline, float angle) {
for (Vector3f v: spline) {
for (Vector3f v : spline) {
float sin = (float) Math.sin(angle);
float cos = (float) Math.cos(angle);
float x = v.getX() * cos + v.getZ() * sin;
@ -317,27 +321,27 @@ public class SplineHelper {
v.set(x, v.getY(), z);
}
}
public static List<Vector3f> copySpline(List<Vector3f> spline) {
List<Vector3f> result = new ArrayList<Vector3f>(spline.size());
for (Vector3f v: spline) {
for (Vector3f v : spline) {
result.add(new Vector3f(v.getX(), v.getY(), v.getZ()));
}
return result;
}
public static void scale(List<Vector3f> spline, float scale) {
scale(spline, scale, scale, scale);
}
public static void scale(List<Vector3f> spline, float x, float y, float z) {
for (Vector3f v: spline) {
for (Vector3f v : spline) {
v.set(v.getX() * x, v.getY() * y, v.getZ() * z);
}
}
public static void offset(List<Vector3f> spline, Vector3f offset) {
for (Vector3f v: spline) {
for (Vector3f v : spline) {
v.set(offset.getX() + v.getX(), offset.getY() + v.getY(), offset.getZ() + v.getZ());
}
}