SDF post process

This commit is contained in:
paulevsGitch 2020-09-29 15:42:48 +03:00
parent 64614bc487
commit 8dab7c1179
8 changed files with 141 additions and 50 deletions

View file

@ -10,7 +10,7 @@ import net.minecraft.block.BlockState;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import ru.betterend.util.sdf.ISDF;
import ru.betterend.util.sdf.SDF;
import ru.betterend.util.sdf.operator.SDFUnion;
import ru.betterend.util.sdf.primitive.SDFLine;
@ -41,10 +41,10 @@ public class SplineHelper {
}
}
public static ISDF 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;
ISDF result = null;
SDF result = null;
Vector3f start = spline.get(0);
for (int i = 1; i < count; i++) {
Vector3f pos = spline.get(i);

View file

@ -0,0 +1,59 @@
package ru.betterend.util.sdf;
import java.util.Map;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.util.math.BlockPos;
public class PosInfo {
private static final BlockState AIR = Blocks.AIR.getDefaultState();
private final Map<BlockPos, PosInfo> blocks;
private final BlockPos pos;
private BlockState state;
public static PosInfo create(Map<BlockPos, PosInfo> blocks, BlockPos pos) {
return new PosInfo(blocks, pos);
}
private PosInfo(Map<BlockPos, PosInfo> blocks, BlockPos pos) {
this.blocks = blocks;
this.pos = pos;
blocks.put(pos, this);
}
public BlockState getState() {
return state;
}
public void setState(BlockState state) {
this.state = state;
}
public BlockState getStateUp() {
PosInfo info = blocks.get(pos.up());
if (info == null) {
return AIR;
}
return info.getState();
}
public BlockState getStateDown() {
PosInfo info = blocks.get(pos.down());
if (info == null) {
return AIR;
}
return info.getState();
}
public int hashCode() {
return pos.hashCode();
}
public boolean equals(Object obj) {
if (!(obj instanceof PosInfo)) {
return false;
}
return pos.equals(((PosInfo) obj).pos);
}
}

View file

@ -1,25 +1,39 @@
package ru.betterend.util.sdf;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import net.minecraft.block.BlockState;
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 abstract class SDF {
private Function<PosInfo, BlockState> postProcess = (info) -> {
return info.getState();
};
public abstract float getDistance(float x, float y, float z);
public void setBlock(ServerWorldAccess world, BlockPos pos);
public abstract BlockState getBlockState(BlockPos pos);
default void fillRecursive(ServerWorldAccess world, BlockPos start, Function<BlockState, Boolean> canReplace, int dx, int dy, int dz) {
public SDF setPostProcess(Function<PosInfo, BlockState> postProcess) {
this.postProcess = postProcess;
return this;
}
public void fillRecursive(ServerWorldAccess world, BlockPos start, Function<BlockState, Boolean> canReplace, int dx, int dy, int dz) {
Map<BlockPos, PosInfo> mapWorld = Maps.newHashMap();
Set<BlockPos> blocks = Sets.newHashSet();
Set<BlockPos> ends = Sets.newHashSet();
Set<BlockPos> add = Sets.newHashSet();
ends.add(new BlockPos(0, 0, 0));
boolean process = postProcess != null;
boolean run = true;
while (run) {
@ -34,7 +48,8 @@ public interface ISDF {
if (!blocks.contains(pos) && canReplace.apply(world.getBlockState(wpos))) {
if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) < 0) {
setBlock(world, wpos);
BlockState state = getBlockState(wpos);
PosInfo.create(mapWorld, wpos).setState(state);
if (Math.abs(pos.getX()) < dx && Math.abs(pos.getY()) < dy && Math.abs(pos.getZ()) < dz) {
add.add(pos);
}
@ -50,9 +65,15 @@ public interface ISDF {
run &= !ends.isEmpty();
}
mapWorld.forEach((pos, info) -> {
BlockState state = postProcess.apply(info);
BlocksHelper.setWithoutUpdate(world, pos, state);
});
}
default void fillRecursive(ServerWorldAccess world, BlockPos start, Function<BlockState, Boolean> canReplace) {
public void fillRecursive(ServerWorldAccess world, BlockPos start, Function<BlockState, Boolean> canReplace) {
Map<BlockPos, PosInfo> mapWorld = Maps.newHashMap();
Set<BlockPos> blocks = Sets.newHashSet();
Set<BlockPos> ends = Sets.newHashSet();
Set<BlockPos> add = Sets.newHashSet();
@ -67,7 +88,8 @@ public interface ISDF {
if (!blocks.contains(pos) && canReplace.apply(world.getBlockState(wpos))) {
if (this.getDistance(pos.getX(), pos.getY(), pos.getZ()) <= 0) {
setBlock(world, wpos);
BlockState state = getBlockState(wpos);
PosInfo.create(mapWorld, wpos).setState(state);
add.add(pos);
}
}
@ -81,5 +103,10 @@ public interface ISDF {
run &= !ends.isEmpty();
}
mapWorld.forEach((pos, info) -> {
BlockState state = postProcess.apply(info);
BlocksHelper.setWithoutUpdate(world, pos, state);
});
}
}

View file

@ -1,20 +1,20 @@
package ru.betterend.util.sdf.operator;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ServerWorldAccess;
import ru.betterend.util.sdf.ISDF;
import ru.betterend.util.sdf.SDF;
public abstract class SDFBinary implements ISDF {
protected ISDF sourceA;
protected ISDF sourceB;
public abstract class SDFBinary extends SDF {
protected SDF sourceA;
protected SDF sourceB;
protected boolean firstValue;
public SDFBinary setSourceA(ISDF sourceA) {
public SDFBinary setSourceA(SDF sourceA) {
this.sourceA = sourceA;
return this;
}
public SDFBinary setSourceB(ISDF sourceB) {
public SDFBinary setSourceB(SDF sourceB) {
this.sourceB = sourceB;
return this;
}
@ -24,11 +24,11 @@ public abstract class SDFBinary implements ISDF {
}
@Override
public void setBlock(ServerWorldAccess world, BlockPos pos) {
public BlockState getBlockState(BlockPos pos) {
if (firstValue) {
sourceA.setBlock(world, pos);
return sourceA.getBlockState(pos);
} else {
sourceB.setBlock(world, pos);
return sourceB.getBlockState(pos);
}
}
}

View file

@ -1,19 +1,19 @@
package ru.betterend.util.sdf.operator;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.ServerWorldAccess;
import ru.betterend.util.sdf.ISDF;
import ru.betterend.util.sdf.SDF;
public abstract class SDFUnary implements ISDF {
protected ISDF source;
public abstract class SDFUnary extends SDF {
protected SDF source;
public SDFUnary setSource(ISDF source) {
public SDFUnary setSource(SDF source) {
this.source = source;
return this;
}
@Override
public void setBlock(ServerWorldAccess world, BlockPos pos) {
source.setBlock(world, pos);
public BlockState getBlockState(BlockPos pos) {
return source.getBlockState(pos);
}
}

View file

@ -4,11 +4,9 @@ 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;
import ru.betterend.util.sdf.SDF;
public abstract class SDFPrimitive implements ISDF {
public abstract class SDFPrimitive extends SDF {
protected final Function<BlockPos, BlockState> placerFunction;
public SDFPrimitive(Function<BlockPos, BlockState> placerFunction) {
@ -21,7 +19,7 @@ public abstract class SDFPrimitive implements ISDF {
};
}
public void setBlock(ServerWorldAccess world, BlockPos pos) {
BlocksHelper.setWithoutUpdate(world, pos, placerFunction.apply(pos));
public BlockState getBlockState(BlockPos pos) {
return placerFunction.apply(pos);
}
}