diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisBiome.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisBiome.java index 2fe261fb6..4b632beaf 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisBiome.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisBiome.java @@ -2,6 +2,7 @@ package com.volmit.iris.engine.dimension; import com.volmit.iris.engine.resolver.EngineResolvable; import com.volmit.iris.engine.resolver.Resolvable; +import com.volmit.iris.platform.PlatformBiome; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -24,4 +25,9 @@ public class IrisBiome extends EngineResolvable { @Builder.Default private IrisRange height = IrisRange.flat(1); + + public PlatformBiome toPlatformBiome() + { + return null; + } } diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/FeatureSizedTarget.java b/engine/src/main/java/com/volmit/iris/engine/feature/FeatureSizedTarget.java index bbf8bc37a..fc61ab694 100644 --- a/engine/src/main/java/com/volmit/iris/engine/feature/FeatureSizedTarget.java +++ b/engine/src/main/java/com/volmit/iris/engine/feature/FeatureSizedTarget.java @@ -3,6 +3,7 @@ package com.volmit.iris.engine.feature; import art.arcane.amulet.range.IntegerRange; import art.arcane.spatial.hunk.storage.ArrayHunk; import art.arcane.spatial.hunk.view.HunkView; +import art.arcane.spatial.util.Consume; import com.volmit.iris.platform.PlatformNamespaced; import lombok.AllArgsConstructor; import lombok.Builder; @@ -94,6 +95,24 @@ public class FeatureSizedTarget { return getOffsetZ() + getDepth() - 1; } + public IntegerRange yCap(int max) { + return new IntegerRange(y().getLeftEndpoint(), Math.min(y().getRightEndpoint(), max)); + } + + public void forYCap(Consume.One consumer, int max) { + for(int y : yCap(max)) { + consumer.accept(y); + } + } + + public void forXZ(Consume.Two consumer) { + for(int x : x()) { + for(int z : z()) { + consumer.accept(x, z); + } + } + } + public IntegerRange x() { return new IntegerRange(getOffsetX(), getAbsoluteMaxX()); diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/FeatureStorage.java b/engine/src/main/java/com/volmit/iris/engine/feature/FeatureStorage.java index d27bd00b6..2dba64698 100644 --- a/engine/src/main/java/com/volmit/iris/engine/feature/FeatureStorage.java +++ b/engine/src/main/java/com/volmit/iris/engine/feature/FeatureStorage.java @@ -7,16 +7,16 @@ import lombok.Data; @Data public class FeatureStorage { - private ShortNoiseCache heightmap; - private NoiseCache biomemap; - private final int width; - private final int height; + private ShortNoiseCache height; + private NoiseCache biome; + private final int w; + private final int h; - public FeatureStorage(int width, int height) + public FeatureStorage(int w, int h) { - this.width = width; - this.height = height; - this.heightmap = new ShortNoiseCache(width, height); - this.biomemap = new NoiseCache<>(width, height); + this.w = w; + this.h = h; + this.height = new ShortNoiseCache(w, h); + this.biome = new NoiseCache<>(w, h); } } diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/SyntheticFeature.java b/engine/src/main/java/com/volmit/iris/engine/feature/SyntheticFeature.java new file mode 100644 index 000000000..470b8a74d --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/feature/SyntheticFeature.java @@ -0,0 +1,12 @@ +package com.volmit.iris.engine.feature; + +import com.volmit.iris.engine.Engine; +import com.volmit.iris.engine.feature.FeatureStorage; +import com.volmit.iris.engine.feature.FeatureTarget; +import com.volmit.iris.engine.feature.features.FeatureTerrain; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.platform.PlatformNamespaced; + +public interface SyntheticFeature { + void generate(Engine engine, V component, FeatureTarget target, S state); +} diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureOriginBiome.java b/engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureOriginBiome.java new file mode 100644 index 000000000..2dd37204a --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureOriginBiome.java @@ -0,0 +1,44 @@ +package com.volmit.iris.engine.feature.features; + +import com.volmit.iris.engine.Engine; +import com.volmit.iris.engine.dimension.IrisBiome; +import com.volmit.iris.engine.feature.*; +import com.volmit.iris.platform.PlatformBiome; +import com.volmit.iris.util.NoiseCache; +import lombok.AllArgsConstructor; +import lombok.Data; + +public class FeatureOriginBiome extends Feature { + public FeatureOriginBiome(Engine engine) { + super("biome-origin", engine); + } + + @Override + public State prepare(Engine engine, FeatureSizedTarget target, FeatureStorage storage) { + final NoiseCache noise = storage.getBiome(); + + for(int x : target.x()) { + for(int z : target.z()) { + noise.set(x & storage.getW() - 1, z & storage.getH() - 1, null); + } + } + + return new State(noise); + } + + @Override + public void generate(Engine engine, State state, FeatureTarget target, FeatureStorage storage) { + for(int x : target.x()) { + for(int z : target.z()) { + IrisBiome b = state.getBiomes().get(x, z); + target.getHunk().set(x, 0, z, b.toPlatformBiome()); + } + } + } + + @Data + @AllArgsConstructor + public static class State implements FeatureState { + private final NoiseCache biomes; + } +} diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureTerrain.java b/engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureTerrain.java index 3e58c84db..08be53c6b 100644 --- a/engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureTerrain.java +++ b/engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureTerrain.java @@ -10,45 +10,32 @@ import com.volmit.iris.util.ShortNoiseCache; import lombok.AllArgsConstructor; import lombok.Data; -public class FeatureTerrain extends Feature { +public class FeatureTerrain extends Feature { private final PlatformBlock stone; private final NoisePlane generator; - public FeatureTerrain(Engine engine) - { + public FeatureTerrain(Engine engine) { super("terrain", engine); stone = engine.block("stone"); this.generator = NoisePreset.NATURAL.create(1234).fit(0, 64).scale(0.2); } @Override - public TerrainFeatureState prepare(Engine engine, FeatureSizedTarget target, FeatureStorage storage) { - final ShortNoiseCache noise = storage.getHeightmap(); - - for(int x : target.x()) { - for(int z : target.z()) { - noise.set(x & storage.getWidth() - 1, z & storage.getHeight() - 1, (short) generator.noise(x, z)); - } - } - - return new TerrainFeatureState(noise); + public State prepare(Engine engine, FeatureSizedTarget target, FeatureStorage storage) { + target.forXZ((x, z) -> storage.getHeight().set(x & storage.getW() - 1, z & storage.getH() - 1, (short) generator.noise(x, z))); + return new State(storage.getHeight()); } @Override - public void generate(Engine engine, TerrainFeatureState state, FeatureTarget target, FeatureStorage storage) { - for(int x : target.x()) { - for(int z : target.z()) { - int h = state.getNoise().get(x, z); - for(int y : new IntegerRange(target.y().getLeftEndpoint(), Math.min(target.y().getRightEndpoint(), h))) { - target.getHunk().set(x, y, z, stone); - } - } - } + public void generate(Engine engine, State state, FeatureTarget target, FeatureStorage storage) { + target.forXZ((x, z) -> target.forYCap((y -> { + target.getHunk().set(x, y, z, stone); + }), state.getNoise().get(x, z))); } @Data @AllArgsConstructor - public static class TerrainFeatureState implements FeatureState { + public static class State implements FeatureState { private final ShortNoiseCache noise; } } diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/features/synthetic/SyntheticBiomeTerrain.java b/engine/src/main/java/com/volmit/iris/engine/feature/features/synthetic/SyntheticBiomeTerrain.java new file mode 100644 index 000000000..a2da3f487 --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/feature/features/synthetic/SyntheticBiomeTerrain.java @@ -0,0 +1,17 @@ +package com.volmit.iris.engine.feature.features.synthetic; + +import com.volmit.iris.engine.Engine; +import com.volmit.iris.engine.dimension.IrisBiome; +import com.volmit.iris.engine.feature.FeatureStorage; +import com.volmit.iris.engine.feature.FeatureTarget; +import com.volmit.iris.engine.feature.SyntheticFeature; +import com.volmit.iris.engine.feature.features.FeatureTerrain; +import com.volmit.iris.platform.PlatformBlock; + +public class SyntheticBiomeTerrain implements SyntheticFeature +{ + @Override + public void generate(Engine engine, IrisBiome component, FeatureTarget target, FeatureTerrain.State state) { + + } +}