From 257307d93d7473d51421a7a026f154afb1f30dcc Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 29 Sep 2020 01:38:56 +0300 Subject: [PATCH] SDF materials --- src/main/java/ru/betterend/util/sdf/ISDF.java | 12 +++++---- .../util/sdf/operator/SDFBinary.java | 16 +++++++++++ .../util/sdf/operator/SDFIntersection.java | 1 + .../sdf/operator/SDFSmoothIntersection.java | 1 + .../sdf/operator/SDFSmoothSubtraction.java | 1 + .../util/sdf/operator/SDFSmoothUnion.java | 1 + .../util/sdf/operator/SDFSubtraction.java | 1 + .../betterend/util/sdf/operator/SDFUnary.java | 7 +++++ .../betterend/util/sdf/operator/SDFUnion.java | 1 + .../util/sdf/primitive/SDFCapsule.java | 15 +++++++++-- .../betterend/util/sdf/primitive/SDFLine.java | 15 +++++++++-- .../util/sdf/primitive/SDFPrimitive.java | 27 +++++++++++++++++++ .../util/sdf/primitive/SDFSphere.java | 17 +++++++++--- .../features/MossyGlowshroomFeature.java | 7 ++--- 14 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java diff --git a/src/main/java/ru/betterend/util/sdf/ISDF.java b/src/main/java/ru/betterend/util/sdf/ISDF.java index 0ffc78ee..8d4d9997 100644 --- a/src/main/java/ru/betterend/util/sdf/ISDF.java +++ b/src/main/java/ru/betterend/util/sdf/ISDF.java @@ -6,15 +6,15 @@ import java.util.function.Function; import com.google.common.collect.Sets; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.ServerWorldAccess; -import ru.betterend.util.BlocksHelper; public interface ISDF { public float getDistance(float x, float y, float z); + public void setBlock(ServerWorldAccess world, BlockPos pos); + default void fillRecursive(ServerWorldAccess world, BlockPos start, Function canReplace, int dx, int dy, int dz) { Set blocks = Sets.newHashSet(); Set ends = Sets.newHashSet(); @@ -34,8 +34,10 @@ public interface ISDF { if (!blocks.contains(pos) && canReplace.apply(world.getBlockState(wpos))) { if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) < 0) { - BlocksHelper.setWithoutUpdate(world, wpos, Blocks.STONE); - add.add(pos); + setBlock(world, wpos); + if (Math.abs(pos.getX()) < dx && Math.abs(pos.getY()) < dy && Math.abs(pos.getZ()) < dz) { + add.add(pos); + } } } } @@ -65,7 +67,7 @@ public interface ISDF { if (!blocks.contains(pos) && canReplace.apply(world.getBlockState(wpos))) { if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) <= 0) { - BlocksHelper.setWithoutUpdate(world, wpos, Blocks.STONE); + setBlock(world, wpos); add.add(pos); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java b/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java index c7ae602c..90831a8a 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFBinary.java @@ -1,10 +1,13 @@ package ru.betterend.util.sdf.operator; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ServerWorldAccess; import ru.betterend.util.sdf.ISDF; public abstract class SDFBinary implements ISDF { protected ISDF sourceA; protected ISDF sourceB; + protected boolean firstValue; public SDFBinary setSourceA(ISDF sourceA) { this.sourceA = sourceA; @@ -15,4 +18,17 @@ public abstract class SDFBinary implements ISDF { this.sourceB = sourceB; return this; } + + protected void selectValue(float a, float b) { + firstValue = a < b; + } + + @Override + public void setBlock(ServerWorldAccess world, BlockPos pos) { + if (firstValue) { + sourceA.setBlock(world, pos); + } else { + sourceB.setBlock(world, pos); + } + } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFIntersection.java b/src/main/java/ru/betterend/util/sdf/operator/SDFIntersection.java index c436921f..6df4b0e8 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFIntersection.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFIntersection.java @@ -7,6 +7,7 @@ public class SDFIntersection extends SDFBinary { public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); + this.selectValue(a, b); return MHelper.max(a, b); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java index 7ef2f4a6..d8643d64 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothIntersection.java @@ -14,6 +14,7 @@ public class SDFSmoothIntersection extends SDFBinary { public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); + this.selectValue(a, b); float h = MathHelper.clamp(0.5F - 0.5F * (b - a) / radius, 0F, 1F); return MathHelper.lerp(h, b, a) + radius * h * (1F - h); } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java index b9f9c1ae..2f24c1b6 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothSubtraction.java @@ -14,6 +14,7 @@ public class SDFSmoothSubtraction extends SDFBinary { public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); + this.selectValue(a, b); float h = MathHelper.clamp(0.5F - 0.5F * (b + a) / radius, 0F, 1F); return MathHelper.lerp(h, b, -a) + radius * h * (1F - h); } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java index 4c553889..417edc0a 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSmoothUnion.java @@ -14,6 +14,7 @@ public class SDFSmoothUnion extends SDFBinary { public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); + this.selectValue(a, b); float h = MathHelper.clamp(0.5F + 0.5F * (b - a) / radius, 0F, 1F); return MathHelper.lerp(h, b, a) - radius * h * (1F - h); } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFSubtraction.java b/src/main/java/ru/betterend/util/sdf/operator/SDFSubtraction.java index 0a5c2b20..f7f1b7dc 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFSubtraction.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFSubtraction.java @@ -7,6 +7,7 @@ public class SDFSubtraction extends SDFBinary { public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); + this.selectValue(a, b); return MHelper.max(a, -b); } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java b/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java index 30f50b41..16910da1 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFUnary.java @@ -1,5 +1,7 @@ package ru.betterend.util.sdf.operator; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ServerWorldAccess; import ru.betterend.util.sdf.ISDF; public abstract class SDFUnary implements ISDF { @@ -9,4 +11,9 @@ public abstract class SDFUnary implements ISDF { this.source = source; return this; } + + @Override + public void setBlock(ServerWorldAccess world, BlockPos pos) { + source.setBlock(world, pos); + } } diff --git a/src/main/java/ru/betterend/util/sdf/operator/SDFUnion.java b/src/main/java/ru/betterend/util/sdf/operator/SDFUnion.java index 021c055e..1e9aaa34 100644 --- a/src/main/java/ru/betterend/util/sdf/operator/SDFUnion.java +++ b/src/main/java/ru/betterend/util/sdf/operator/SDFUnion.java @@ -7,6 +7,7 @@ public class SDFUnion extends SDFBinary { public float getDistance(float x, float y, float z) { float a = this.sourceA.getDistance(x, y, z); float b = this.sourceB.getDistance(x, y, z); + this.selectValue(a, b); return MHelper.min(a, b); } } diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java index 4ddd60e8..4bfeba6a 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFCapsule.java @@ -1,13 +1,24 @@ package ru.betterend.util.sdf.primitive; +import java.util.function.Function; + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.ISDF; -public class SDFCapsule implements ISDF { +public class SDFCapsule extends SDFPrimitive { private float radius; private float height; + public SDFCapsule(Function placerFunction) { + super(placerFunction); + } + + public SDFCapsule(BlockState state) { + super(state); + } + public SDFCapsule setRadius(float radius) { this.radius = radius; return this; diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java index 48680297..9b2eb6f3 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFLine.java @@ -1,10 +1,13 @@ package ru.betterend.util.sdf.primitive; +import java.util.function.Function; + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.ISDF; -public class SDFLine implements ISDF { +public class SDFLine extends SDFPrimitive { private float radius; private float x1; private float y1; @@ -13,6 +16,14 @@ public class SDFLine implements ISDF { private float y2; private float z2; + public SDFLine(Function placerFunction) { + super(placerFunction); + } + + public SDFLine(BlockState state) { + super(state); + } + public SDFLine setRadius(float radius) { this.radius = radius; return this; diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java new file mode 100644 index 00000000..44c8e39e --- /dev/null +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFPrimitive.java @@ -0,0 +1,27 @@ +package ru.betterend.util.sdf.primitive; + +import java.util.function.Function; + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ServerWorldAccess; +import ru.betterend.util.BlocksHelper; +import ru.betterend.util.sdf.ISDF; + +public abstract class SDFPrimitive implements ISDF { + protected final Function placerFunction; + + public SDFPrimitive(Function placerFunction) { + this.placerFunction = placerFunction; + } + + public SDFPrimitive(BlockState state) { + this.placerFunction = (pos) -> { + return state; + }; + } + + public void setBlock(ServerWorldAccess world, BlockPos pos) { + BlocksHelper.setWithoutUpdate(world, pos, placerFunction.apply(pos)); + } +} diff --git a/src/main/java/ru/betterend/util/sdf/primitive/SDFSphere.java b/src/main/java/ru/betterend/util/sdf/primitive/SDFSphere.java index 3b69a443..a544ff49 100644 --- a/src/main/java/ru/betterend/util/sdf/primitive/SDFSphere.java +++ b/src/main/java/ru/betterend/util/sdf/primitive/SDFSphere.java @@ -1,11 +1,22 @@ package ru.betterend.util.sdf.primitive; -import ru.betterend.util.MHelper; -import ru.betterend.util.sdf.ISDF; +import java.util.function.Function; -public class SDFSphere implements ISDF { +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import ru.betterend.util.MHelper; + +public class SDFSphere extends SDFPrimitive { private float radius; + public SDFSphere(Function placerFunction) { + super(placerFunction); + } + + public SDFSphere(BlockState state) { + super(state); + } + public SDFSphere setRadius(float radius) { this.radius = radius; return this; diff --git a/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java index ce53247b..21266268 100644 --- a/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java @@ -4,6 +4,7 @@ import java.util.Random; import java.util.function.Function; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -36,10 +37,10 @@ public class MossyGlowshroomFeature extends DefaultFeature { } static { - SDFLine stem = new SDFLine().setRadius(2F).setEnd(0, 15, 0); + SDFLine stem = new SDFLine(Blocks.GOLD_BLOCK.getDefaultState()).setRadius(2F).setEnd(0, 15, 0); - SDFSphere outerSphere = new SDFSphere().setRadius(10); - SDFSphere innerSphere = new SDFSphere().setRadius(10); + SDFSphere outerSphere = new SDFSphere(Blocks.REDSTONE_BLOCK.getDefaultState()).setRadius(10); + SDFSphere innerSphere = new SDFSphere(Blocks.DIAMOND_BLOCK.getDefaultState()).setRadius(10); SDFTranslate sphereOffset = new SDFTranslate().setTranslate(0, -10F, 0);