From a1c3bc26c9c672347ee35a8c458bd0848892900a Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Thu, 19 Aug 2021 16:36:54 -0400 Subject: [PATCH] Worms --- .../engine/object/basic/IrisPosition.java | 4 +++ .../engine/object/cave/IrisWormGenerator.java | 36 +++++++++++++++++++ .../volmit/iris/util/noise/WormIterator2.java | 7 ++-- .../volmit/iris/util/noise/WormIterator3.java | 9 ++--- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/object/basic/IrisPosition.java b/src/main/java/com/volmit/iris/engine/object/basic/IrisPosition.java index fea93553f..e85f499b1 100644 --- a/src/main/java/com/volmit/iris/engine/object/basic/IrisPosition.java +++ b/src/main/java/com/volmit/iris/engine/object/basic/IrisPosition.java @@ -54,6 +54,10 @@ public class IrisPosition { public IrisPosition(Vector v) { this(v.getBlockX(), v.getBlockY(), v.getBlockZ()); } + public IrisPosition(double x, double y, double z) { + this((int)x,(int)y,(int)z); + } + public IrisPosition add(IrisPosition relativePosition) { return new IrisPosition(relativePosition.x + x, relativePosition.y + y, relativePosition.z + z); diff --git a/src/main/java/com/volmit/iris/engine/object/cave/IrisWormGenerator.java b/src/main/java/com/volmit/iris/engine/object/cave/IrisWormGenerator.java index 1717af527..c8f036dc4 100644 --- a/src/main/java/com/volmit/iris/engine/object/cave/IrisWormGenerator.java +++ b/src/main/java/com/volmit/iris/engine/object/cave/IrisWormGenerator.java @@ -18,6 +18,8 @@ package com.volmit.iris.engine.object.cave; +import com.volmit.iris.core.project.loader.IrisData; +import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.MinNumber; import com.volmit.iris.engine.object.annotations.Required; @@ -27,7 +29,11 @@ import com.volmit.iris.engine.object.noise.IrisGeneratorStyle; import com.volmit.iris.engine.object.noise.IrisNoiseGenerator; import com.volmit.iris.engine.object.noise.IrisStyledRange; import com.volmit.iris.engine.object.noise.NoiseStyle; +import com.volmit.iris.util.function.NoiseProvider; +import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.Worm; +import com.volmit.iris.util.noise.WormIterator2; +import com.volmit.iris.util.noise.WormIterator3; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -56,4 +62,34 @@ public class IrisWormGenerator implements IRare { @Desc("The thickness of the worm over distance") private IrisStyledRange girth = new IrisStyledRange().setMin(3).setMax(7) .setStyle(new IrisGeneratorStyle(NoiseStyle.SIMPLEX)); + + private transient final AtomicCache angleProviderCache = new AtomicCache<>(); + + public void test() + { + + } + + public NoiseProvider getAngleProvider(RNG rng, IrisData data) + { + return angleProviderCache.aquire(() -> (xx, zz) -> angleStyle.create(rng, data).noise(xx, zz)); + } + + public WormIterator2 iterate2D(RNG rng, IrisData data, int x, int z) + { + return WormIterator2.builder() + .maxDistance(maxDistance) + .maxIterations(maxSegments == -1 ? maxDistance : maxSegments) + .noise(getAngleProvider(rng, data)).x(x).z(z) + .build(); + } + + public WormIterator3 iterate3D(RNG rng, IrisData data, int x, int y, int z) + { + return WormIterator3.builder() + .maxDistance(maxDistance) + .maxIterations(maxSegments == -1 ? maxDistance : maxSegments) + .noise(getAngleProvider(rng, data)).x(x).z(z).y(y) + .build(); + } } diff --git a/src/main/java/com/volmit/iris/util/noise/WormIterator2.java b/src/main/java/com/volmit/iris/util/noise/WormIterator2.java index ccef8d12a..cd34fd776 100644 --- a/src/main/java/com/volmit/iris/util/noise/WormIterator2.java +++ b/src/main/java/com/volmit/iris/util/noise/WormIterator2.java @@ -26,6 +26,7 @@ import lombok.Data; @Data public class WormIterator2 { private transient Worm2 worm; + private transient NoiseProvider noise; private int x; private int z; private int maxDistance; @@ -39,15 +40,15 @@ public class WormIterator2 { + ((z * z) - (worm.getZ().getPosition() * worm.getZ().getPosition())) < dist * dist; } - public Worm2 next(NoiseProvider p) + public Worm2 next() { if(worm == null) { worm = new Worm2(x, z, 0, 0); } - worm.getX().setVelocity(p.noise(worm.getX().getPosition(), 0)); - worm.getZ().setVelocity(p.noise(worm.getZ().getPosition(), 0)); + worm.getX().setVelocity(noise.noise(worm.getX().getPosition(), 0)); + worm.getZ().setVelocity(noise.noise(worm.getZ().getPosition(), 0)); worm.step(); return worm; diff --git a/src/main/java/com/volmit/iris/util/noise/WormIterator3.java b/src/main/java/com/volmit/iris/util/noise/WormIterator3.java index b49396d5b..9ef523c0e 100644 --- a/src/main/java/com/volmit/iris/util/noise/WormIterator3.java +++ b/src/main/java/com/volmit/iris/util/noise/WormIterator3.java @@ -29,6 +29,7 @@ public class WormIterator3 { private int x; private int y; private int z; + private transient NoiseProvider noise; private int maxDistance; private int maxIterations; @@ -43,16 +44,16 @@ public class WormIterator3 { + ((z * z) - (worm.getZ().getPosition() * worm.getZ().getPosition())) < dist * dist; } - public Worm3 next(NoiseProvider p) + public Worm3 next() { if(worm == null) { worm = new Worm3(x, y, z, 0, 0, 0); } - worm.getX().setVelocity(p.noise(worm.getX().getPosition(), 0)); - worm.getY().setVelocity(p.noise(worm.getY().getPosition(), 0)); - worm.getZ().setVelocity(p.noise(worm.getZ().getPosition(), 0)); + worm.getX().setVelocity(noise.noise(worm.getX().getPosition(), 0)); + worm.getY().setVelocity(noise.noise(worm.getY().getPosition(), 0)); + worm.getZ().setVelocity(noise.noise(worm.getZ().getPosition(), 0)); worm.step(); return worm;