mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
Fix parallax noise feature artifact holes / spikes
It was a really weird caching issue
This commit is contained in:
parent
1edf567ea7
commit
03a1b51bd7
@ -33,11 +33,13 @@ import com.volmit.iris.engine.stream.interpolation.Interpolated;
|
|||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.math.M;
|
import com.volmit.iris.util.math.M;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
|
import com.volmit.iris.util.scheduling.J;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -61,8 +63,10 @@ public class IrisComplex implements DataProvider {
|
|||||||
private ProceduralStream<IrisBiome> shoreBiomeStream;
|
private ProceduralStream<IrisBiome> shoreBiomeStream;
|
||||||
private ProceduralStream<IrisBiome> baseBiomeStream;
|
private ProceduralStream<IrisBiome> baseBiomeStream;
|
||||||
private ProceduralStream<IrisBiome> trueBiomeStream;
|
private ProceduralStream<IrisBiome> trueBiomeStream;
|
||||||
|
private ProceduralStream<IrisBiome> trueBiomeStreamNoFeatures;
|
||||||
private ProceduralStream<Biome> trueBiomeDerivativeStream;
|
private ProceduralStream<Biome> trueBiomeDerivativeStream;
|
||||||
private ProceduralStream<Double> heightStream;
|
private ProceduralStream<Double> heightStream;
|
||||||
|
private ProceduralStream<Double> heightStreamNoFeatures;
|
||||||
private ProceduralStream<Double> objectChanceStream;
|
private ProceduralStream<Double> objectChanceStream;
|
||||||
private ProceduralStream<Double> maxHeightStream;
|
private ProceduralStream<Double> maxHeightStream;
|
||||||
private ProceduralStream<Double> overlayStream;
|
private ProceduralStream<Double> overlayStream;
|
||||||
@ -199,7 +203,11 @@ public class IrisComplex implements DataProvider {
|
|||||||
.convertAware2D(this::implode).cache2D(cacheSize);
|
.convertAware2D(this::implode).cache2D(cacheSize);
|
||||||
heightStream = ProceduralStream.of((x, z) -> {
|
heightStream = ProceduralStream.of((x, z) -> {
|
||||||
IrisBiome b = focus != null ? focus : baseBiomeStream.get(x, z);
|
IrisBiome b = focus != null ? focus : baseBiomeStream.get(x, z);
|
||||||
return getHeight(engine, b, x, z, engine.getWorld().seed());
|
return getHeight(engine, b, x, z, engine.getWorld().seed(), true);
|
||||||
|
}, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D(cacheSize);
|
||||||
|
heightStreamNoFeatures = ProceduralStream.of((x, z) -> {
|
||||||
|
IrisBiome b = focus != null ? focus : baseBiomeStream.get(x, z);
|
||||||
|
return getHeight(engine, b, x, z, engine.getWorld().seed(), false);
|
||||||
}, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D(cacheSize);
|
}, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D(cacheSize);
|
||||||
slopeStream = heightStream.slope(3).cache2D(cacheSize);
|
slopeStream = heightStream.slope(3).cache2D(cacheSize);
|
||||||
objectChanceStream = ProceduralStream.ofDouble((x, z) -> {
|
objectChanceStream = ProceduralStream.ofDouble((x, z) -> {
|
||||||
@ -246,6 +254,45 @@ public class IrisComplex implements DataProvider {
|
|||||||
return b;
|
return b;
|
||||||
})
|
})
|
||||||
.cache2D(cacheSize);
|
.cache2D(cacheSize);
|
||||||
|
|
||||||
|
trueBiomeStream = focus != null ? ProceduralStream.of((x, y) -> focus, Interpolated.of(a -> 0D,
|
||||||
|
b -> focus)).convertAware2D((b, x, z) -> {
|
||||||
|
for (IrisFeaturePositional i : engine.getFramework().getEngineParallax().forEachFeature(x, z)) {
|
||||||
|
IrisBiome bx = i.filter(x, z, b, rng);
|
||||||
|
|
||||||
|
if (bx != null) {
|
||||||
|
bx.setInferredType(b.getInferredType());
|
||||||
|
return bx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
})
|
||||||
|
.cache2D(cacheSize) : heightStream
|
||||||
|
.convertAware2D((h, x, z) ->
|
||||||
|
fixBiomeType(h, baseBiomeStream.get(x, z),
|
||||||
|
regionStream.get(x, z), x, z, fluidHeight))
|
||||||
|
.convertAware2D((b, x, z) -> {
|
||||||
|
for (IrisFeaturePositional i : engine.getFramework().getEngineParallax().forEachFeature(x, z)) {
|
||||||
|
IrisBiome bx = i.filter(x, z, b, rng);
|
||||||
|
|
||||||
|
if (bx != null) {
|
||||||
|
bx.setInferredType(b.getInferredType());
|
||||||
|
return bx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return b;
|
||||||
|
})
|
||||||
|
.cache2D(cacheSize);
|
||||||
|
|
||||||
|
trueBiomeStreamNoFeatures = focus != null ? ProceduralStream.of((x, y) -> focus, Interpolated.of(a -> 0D,
|
||||||
|
b -> focus))
|
||||||
|
: heightStreamNoFeatures
|
||||||
|
.convertAware2D((h, x, z) ->
|
||||||
|
fixBiomeType(h, baseBiomeStream.get(x, z),
|
||||||
|
regionStream.get(x, z), x, z, fluidHeight))
|
||||||
|
.cache2D(cacheSize);
|
||||||
trueBiomeDerivativeStream = trueBiomeStream.convert(IrisBiome::getDerivative).cache2D(cacheSize);
|
trueBiomeDerivativeStream = trueBiomeStream.convert(IrisBiome::getDerivative).cache2D(cacheSize);
|
||||||
heightFluidStream = heightStream.max(fluidHeight).cache2D(cacheSize);
|
heightFluidStream = heightStream.max(fluidHeight).cache2D(cacheSize);
|
||||||
maxHeightStream = ProceduralStream.ofDouble((x, z) -> height);
|
maxHeightStream = ProceduralStream.ofDouble((x, z) -> height);
|
||||||
@ -374,7 +421,7 @@ public class IrisComplex implements DataProvider {
|
|||||||
return biome;
|
return biome;
|
||||||
}
|
}
|
||||||
|
|
||||||
private double getHeight(Engine engine, IrisBiome b, double x, double z, long seed) {
|
private double getHeight(Engine engine, IrisBiome b, double x, double z, long seed, boolean features) {
|
||||||
double h = 0;
|
double h = 0;
|
||||||
|
|
||||||
for (IrisGenerator gen : generators) {
|
for (IrisGenerator gen : generators) {
|
||||||
@ -413,9 +460,14 @@ public class IrisComplex implements DataProvider {
|
|||||||
|
|
||||||
AtomicDouble noise = new AtomicDouble(h + fluidHeight + overlayStream.get(x, z));
|
AtomicDouble noise = new AtomicDouble(h + fluidHeight + overlayStream.get(x, z));
|
||||||
|
|
||||||
for(IrisFeaturePositional i : engine.getFramework().getEngineParallax().forEachFeature(x, z))
|
if(features)
|
||||||
{
|
{
|
||||||
noise.set(i.filter(x, z, noise.get(), rng));
|
List<IrisFeaturePositional> p = engine.getFramework().getEngineParallax().forEachFeature(x, z);
|
||||||
|
|
||||||
|
for(IrisFeaturePositional i : p)
|
||||||
|
{
|
||||||
|
noise.set(i.filter(x, z, noise.get(), rng));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(engine.getHeight(), Math.max(noise.get(), 0));
|
return Math.min(engine.getHeight(), Math.max(noise.get(), 0));
|
||||||
|
@ -265,7 +265,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
burst.queue(() -> {
|
burst.queue(() -> {
|
||||||
RNG rng = new RNG(Cache.key(xx, zz) + getEngine().getTarget().getWorld().seed());
|
RNG rng = new RNG(Cache.key(xx, zz) + getEngine().getTarget().getWorld().seed());
|
||||||
IrisRegion region = getComplex().getRegionStream().get(xxx, zzz);
|
IrisRegion region = getComplex().getRegionStream().get(xxx, zzz);
|
||||||
IrisBiome biome = getComplex().getTrueBiomeStream().get(xxx, zzz);
|
IrisBiome biome = getComplex().getTrueBiomeStreamNoFeatures().get(xxx, zzz);
|
||||||
generateParallaxFeatures(rng, xx, zz, region, biome);
|
generateParallaxFeatures(rng, xx, zz, region, biome);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -327,7 +327,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
int zz = z << 4;
|
int zz = z << 4;
|
||||||
RNG rng = new RNG(Cache.key(x, z)).nextParallelRNG(getEngine().getTarget().getWorld().seed());
|
RNG rng = new RNG(Cache.key(x, z)).nextParallelRNG(getEngine().getTarget().getWorld().seed());
|
||||||
IrisRegion region = getComplex().getRegionStream().get(xx + 8, zz + 8);
|
IrisRegion region = getComplex().getRegionStream().get(xx + 8, zz + 8);
|
||||||
IrisBiome biome = getComplex().getTrueBiomeStream().get(xx + 8, zz + 8);
|
IrisBiome biome = getComplex().getTrueBiomeStreamNoFeatures().get(xx + 8, zz + 8);
|
||||||
after.addAll(generateParallaxJigsaw(rng, x, z, biome, region));
|
after.addAll(generateParallaxJigsaw(rng, x, z, biome, region));
|
||||||
generateParallaxSurface(rng, x, z, biome, region, true);
|
generateParallaxSurface(rng, x, z, biome, region, true);
|
||||||
generateParallaxMutations(rng, x, z, true);
|
generateParallaxMutations(rng, x, z, true);
|
||||||
@ -345,7 +345,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
int zz = z << 4;
|
int zz = z << 4;
|
||||||
getParallaxAccess().setParallaxGenerated(x, z);
|
getParallaxAccess().setParallaxGenerated(x, z);
|
||||||
RNG rng = new RNG(Cache.key(x, z)).nextParallelRNG(getEngine().getTarget().getWorld().seed());
|
RNG rng = new RNG(Cache.key(x, z)).nextParallelRNG(getEngine().getTarget().getWorld().seed());
|
||||||
IrisBiome biome = getComplex().getTrueBiomeStream().get(xx + 8, zz + 8);
|
IrisBiome biome = getComplex().getTrueBiomeStreamNoFeatures().get(xx + 8, zz + 8);
|
||||||
IrisRegion region = getComplex().getRegionStream().get(xx + 8, zz + 8);
|
IrisRegion region = getComplex().getRegionStream().get(xx + 8, zz + 8);
|
||||||
generateParallaxSurface(rng, x, z, biome, region, false);
|
generateParallaxSurface(rng, x, z, biome, region, false);
|
||||||
generateParallaxMutations(rng, x, z, false);
|
generateParallaxMutations(rng, x, z, false);
|
||||||
@ -504,8 +504,8 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
searching:
|
searching:
|
||||||
for (IrisBiomeMutation k : getEngine().getDimension().getMutations()) {
|
for (IrisBiomeMutation k : getEngine().getDimension().getMutations()) {
|
||||||
for (int l = 0; l < k.getChecks(); l++) {
|
for (int l = 0; l < k.getChecks(); l++) {
|
||||||
IrisBiome sa = getComplex().getTrueBiomeStream().get(((x * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()), ((z * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()));
|
IrisBiome sa = getComplex().getTrueBiomeStreamNoFeatures().get(((x * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()), ((z * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()));
|
||||||
IrisBiome sb = getComplex().getTrueBiomeStream().get(((x * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()), ((z * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()));
|
IrisBiome sb = getComplex().getTrueBiomeStreamNoFeatures().get(((x * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()), ((z * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()));
|
||||||
|
|
||||||
if (sa.getLoadKey().equals(sb.getLoadKey())) {
|
if (sa.getLoadKey().equals(sb.getLoadKey())) {
|
||||||
continue;
|
continue;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user