diff --git a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkit.java b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkit.java index b6a9e0bf4..0a88f4aed 100644 --- a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkit.java +++ b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkit.java @@ -29,9 +29,6 @@ public class IrisBukkit extends JavaPlugin implements IrisPlatform { getServer().getScheduler().scheduleSyncDelayedTask(this, () -> { World world = Bukkit.createWorld(new WorldCreator("iristests/" + UUID.randomUUID()).generator(new IrisBukkitChunkGenerator(this, EngineConfiguration.builder() - .threads(4) - .mutable(true) - .timings(true) .build()))); }, 10); } diff --git a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkitChunkGenerator.java b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkitChunkGenerator.java index 29f973af1..6bc862824 100644 --- a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkitChunkGenerator.java +++ b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkitChunkGenerator.java @@ -7,16 +7,16 @@ import com.volmit.iris.engine.EngineConfiguration; import com.volmit.iris.engine.IrisEngine; import com.volmit.iris.engine.feature.IrisFeatureSizedTarget; import com.volmit.iris.engine.feature.IrisFeatureTarget; -import com.volmit.iris.engine.feature.standard.FeatureTerrain; +import com.volmit.iris.engine.feature.features.FeatureTerrain; +import com.volmit.iris.engine.pipeline.PipedHunkStack; import com.volmit.iris.platform.IrisPlatform; import com.volmit.iris.platform.PlatformBlock; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.World; import org.bukkit.generator.ChunkGenerator; import com.volmit.iris.platform.bukkit.util.ChunkDataHunkView; -import org.bukkit.generator.WorldInfo; +import java.nio.channels.Pipe; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -46,6 +46,8 @@ public class IrisBukkitChunkGenerator extends ChunkGenerator { initEngine(world); ChunkData data = Bukkit.createChunkData(world); Hunk chunk = new ChunkDataHunkView(data); + PipedHunkStack stack = new PipedHunkStack(); + stack.register(PlatformBlock.class, chunk); IrisFeatureSizedTarget targetSize = IrisFeatureSizedTarget.builder() .width(chunk.getWidth()) .height(chunk.getHeight()) @@ -54,8 +56,7 @@ public class IrisBukkitChunkGenerator extends ChunkGenerator { .offsetZ(z << 4) .offsetY(0) .build(); - FeatureTerrain.TerrainFeatureState state = engine.get().getTerrainFeature().prepare(engine.get(), targetSize); - engine.get().getTerrainFeature().generate(engine.get(), state, new IrisFeatureTarget<>(chunk, targetSize)); + engine.get().getPlumbing().generate(engine.get(), targetSize, stack); perSecond.incrementAndGet(); a.put(pp.getMilliseconds()); diff --git a/engine/src/main/java/com/volmit/iris/engine/EngineConfiguration.java b/engine/src/main/java/com/volmit/iris/engine/EngineConfiguration.java index 17808ed7e..eeb6b0c1c 100644 --- a/engine/src/main/java/com/volmit/iris/engine/EngineConfiguration.java +++ b/engine/src/main/java/com/volmit/iris/engine/EngineConfiguration.java @@ -18,5 +18,8 @@ public class EngineConfiguration { private boolean timings = false; @Builder.Default - private int threads = 4; + private int threads = Runtime.getRuntime().availableProcessors(); + + @Builder.Default + private int threadPriority = 3; } diff --git a/engine/src/main/java/com/volmit/iris/engine/EngineExecutor.java b/engine/src/main/java/com/volmit/iris/engine/EngineExecutor.java new file mode 100644 index 000000000..f1cec4a01 --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/EngineExecutor.java @@ -0,0 +1,37 @@ +package com.volmit.iris.engine; + +import lombok.Data; + +import java.io.Closeable; +import java.io.IOException; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinWorkerThread; + +@Data +public class EngineExecutor implements ForkJoinPool.ForkJoinWorkerThreadFactory, Thread.UncaughtExceptionHandler, Closeable { + private final IrisEngine engine; + private final ForkJoinPool forks; + + public EngineExecutor(IrisEngine engine) + { + this.engine = engine; + forks = new ForkJoinPool(engine.getConfiguration().getThreads(), this, this, false); + } + + @Override + public void uncaughtException(Thread t, Throwable e) { + e.printStackTrace(); + } + + @Override + public ForkJoinWorkerThread newThread(ForkJoinPool pool) { + final ForkJoinWorkerThread worker = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool); + worker.setName("Iris " + engine.getWorld().getName() + " Executor " + worker.getPoolIndex()); + return worker; + } + + @Override + public void close() throws IOException { + forks.shutdownNow().forEach(Runnable::run); + } +} diff --git a/engine/src/main/java/com/volmit/iris/engine/IrisEngine.java b/engine/src/main/java/com/volmit/iris/engine/IrisEngine.java index 9fcee2958..884884edd 100644 --- a/engine/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/engine/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -1,7 +1,10 @@ package com.volmit.iris.engine; -import com.volmit.iris.engine.feature.IrisFeature; -import com.volmit.iris.engine.feature.standard.FeatureTerrain; +import com.volmit.iris.engine.feature.features.FeatureTerrain; +import com.volmit.iris.engine.pipeline.EnginePipeline; +import com.volmit.iris.engine.pipeline.EnginePlumbing; +import com.volmit.iris.engine.pipeline.PipelinePhase; +import com.volmit.iris.engine.pipeline.PipelineTask; import com.volmit.iris.platform.IrisPlatform; import com.volmit.iris.platform.PlatformBlock; import com.volmit.iris.platform.PlatformNamespaceKey; @@ -10,35 +13,40 @@ import com.volmit.iris.platform.PlatformWorld; import lombok.Data; import manifold.util.concurrent.ConcurrentWeakHashMap; +import java.io.Closeable; +import java.io.IOException; import java.lang.ref.WeakReference; import java.util.Map; import java.util.Optional; -import java.util.concurrent.ForkJoinPool; @Data -public class IrisEngine { +public class IrisEngine implements Closeable { private static final Map> engineContext = new ConcurrentWeakHashMap<>(); private final IrisPlatform platform; private final EngineRegistry registry; private final EngineConfiguration configuration; private final PlatformWorld world; private final EngineBlockCache blockCache; - private final ForkJoinPool forks; - - private final FeatureTerrain terrainFeature; + private final EngineExecutor executor; + private final EnginePlumbing plumbing; public IrisEngine(IrisPlatform platform, PlatformWorld world, EngineConfiguration configuration) { this.configuration = configuration; - this.forks = new ForkJoinPool(configuration.getThreads()); this.platform = platform; this.world = world; - this.blockCache = new EngineBlockCache(this); this.registry = EngineRegistry.builder() .blockRegistry(new PlatformRegistry<>(platform.getBlocks())) .biomeRegistry(new PlatformRegistry<>(platform.getBiomes())) .build(); - - terrainFeature = new FeatureTerrain(this); + this.blockCache = new EngineBlockCache(this); + this.executor = new EngineExecutor(this); + this.plumbing = EnginePlumbing.builder().engine(this) + .pipeline(EnginePipeline.builder() + .phase(PipelinePhase.builder() + .task(PipelineTask.builder().target(PlatformBlock.class).feature(new FeatureTerrain(this)).build()) + .build()) + .build()) + .build(); } public PlatformBlock block(String block) @@ -62,4 +70,9 @@ public class IrisEngine { return Optional.empty(); } + + @Override + public void close() throws IOException { + getExecutor().close(); + } } diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeature.java b/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeature.java index c618b6f9b..d2f5eb238 100644 --- a/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeature.java +++ b/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeature.java @@ -7,25 +7,27 @@ import lombok.Data; @Data public abstract class IrisFeature { private final String name; + private final IrisEngine engine; private boolean heightAgnostic; public IrisFeature(String name, IrisEngine engine) { + this.engine = engine; this.name = name; this.heightAgnostic = true; } - public S prepare(IrisEngine engine, IrisFeatureSizedTarget target) + public IrisFeatureTask task(IrisFeatureSizedTarget target, int verticalExecutionSize, int horizontalExecutionSize) { - return onPrepare(engine, target); + return new IrisFeatureTask<>(engine, this, target, verticalExecutionSize, horizontalExecutionSize, heightAgnostic); } - public void generate(IrisEngine engine, S state, IrisFeatureTarget target) + public IrisFeatureTask task(IrisFeatureSizedTarget target, int horizontalExecutionSize) { - onGenerate(engine, state, target); + return new IrisFeatureTask<>(engine, this, target, Integer.MAX_VALUE, horizontalExecutionSize, heightAgnostic); } - public abstract S onPrepare(IrisEngine engine, IrisFeatureSizedTarget target); + public abstract S prepare(IrisEngine engine, IrisFeatureSizedTarget target); - public abstract void onGenerate(IrisEngine engine, S state, IrisFeatureTarget target); + public abstract void generate(IrisEngine engine, S state, IrisFeatureTarget target); } diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureSizedTarget.java b/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureSizedTarget.java index 9a61303e0..b3953fdea 100644 --- a/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureSizedTarget.java +++ b/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureSizedTarget.java @@ -1,6 +1,7 @@ package com.volmit.iris.engine.feature; import art.arcane.amulet.collections.hunk.Hunk; +import art.arcane.amulet.collections.hunk.storage.ArrayHunk; import art.arcane.amulet.geometry.Vec; import art.arcane.amulet.range.IntegerRange; import com.volmit.iris.platform.PlatformNamespaced; @@ -10,6 +11,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.Stream; @Builder @@ -30,8 +32,12 @@ public class IrisFeatureSizedTarget { @Builder.Default private final int offsetZ = 0; - Stream splitX() + public IrisFeatureTarget hunked() { + return new IrisFeatureTarget<>(new ArrayHunk<>(width, height, depth), this); + } + + Stream splitX() { if(width <= 1) { return Stream.of(this); } @@ -44,8 +50,7 @@ public class IrisFeatureSizedTarget { .offsetX(offsetX + (width/2)).offsetY(offsetY).offsetZ(offsetZ).build()); } - Stream splitY() - { + Stream splitY() { if(height <= 1) { return Stream.of(this); } @@ -58,8 +63,7 @@ public class IrisFeatureSizedTarget { .offsetX(offsetX).offsetY(offsetY + (height/2)).offsetZ(offsetZ).build()); } - Stream splitZ() - { + Stream splitZ() { if(depth <= 1) { return Stream.of(this); } @@ -116,4 +120,16 @@ public class IrisFeatureSizedTarget { { return new IntegerRange(0, getDepth() - 1); } + + public static IrisFeatureSizedTarget mergedSize(Stream targets) { + List t = targets.toList(); + return IrisFeatureSizedTarget.builder() + .width(t.stream().mapToInt(IrisFeatureSizedTarget::getWidth).sum()) + .height(t.stream().mapToInt(IrisFeatureSizedTarget::getHeight).sum()) + .depth(t.stream().mapToInt(IrisFeatureSizedTarget::getDepth).sum()) + .offsetX(t.stream().mapToInt(IrisFeatureSizedTarget::getOffsetX).min().orElse(0)) + .offsetY(t.stream().mapToInt(IrisFeatureSizedTarget::getOffsetY).min().orElse(0)) + .offsetZ(t.stream().mapToInt(IrisFeatureSizedTarget::getOffsetZ).min().orElse(0)) + .build(); + } } diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureTarget.java b/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureTarget.java index ff6564fd9..25417e5bc 100644 --- a/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureTarget.java +++ b/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureTarget.java @@ -7,6 +7,11 @@ import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Stream; + @Data @EqualsAndHashCode(callSuper = true) public class IrisFeatureTarget extends IrisFeatureSizedTarget { @@ -22,4 +27,16 @@ public class IrisFeatureTarget extends IrisFeature { this(hunk, target.getOffsetX(), target.getOffsetY(), target.getOffsetZ()); } + + public static IrisFeatureTarget mergedTarget(Stream> targets) + { + List> t = targets.toList(); + IrisFeatureSizedTarget mergedSize = IrisFeatureSizedTarget.mergedSize(t.stream().map(i -> i)); + Hunk hunk = Hunk.newArrayHunk(mergedSize.getWidth(), mergedSize.getHeight(), mergedSize.getDepth()); + t.forEach(i -> hunk.insert( + i.getOffsetX() - mergedSize.getOffsetX(), + i.getOffsetY() - mergedSize.getOffsetY(), + i.getOffsetZ() - mergedSize.getOffsetZ(), i.getHunk())); + return new IrisFeatureTarget<>(hunk, mergedSize); + } } diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureTask.java b/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureTask.java index ef32118d6..e76cadc44 100644 --- a/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureTask.java +++ b/engine/src/main/java/com/volmit/iris/engine/feature/IrisFeatureTask.java @@ -1,10 +1,12 @@ package com.volmit.iris.engine.feature; +import art.arcane.amulet.collections.hunk.Hunk; import com.volmit.iris.engine.IrisEngine; import com.volmit.iris.platform.PlatformNamespaced; import lombok.AllArgsConstructor; import lombok.Builder; +import java.util.concurrent.Callable; import java.util.concurrent.RecursiveTask; import java.util.stream.Collectors; @@ -16,7 +18,7 @@ import java.util.stream.Collectors; */ @Builder @AllArgsConstructor -public class IrisFeatureTask extends RecursiveTask> { +public class IrisFeatureTask extends RecursiveTask> implements Callable> { private final IrisEngine engine; private final IrisFeature feature; private final IrisFeatureSizedTarget size; @@ -25,28 +27,30 @@ public class IrisFeatureTask compute() { + protected IrisFeatureTarget compute() { if(!heightAgnostic && size.getHeight() > verticalPrepareSize * 2) { - invokeAll(size.splitY().map(this::with).collect(Collectors.toList())); + return IrisFeatureTarget.mergedTarget(size.splitY().map(i -> engine.getExecutor().getForks().invoke(with(i)))); } else if(size.getWidth() > horizontalPrepareSize * 2) { - invokeAll(size.splitX().map(this::with).collect(Collectors.toList())); + return IrisFeatureTarget.mergedTarget(size.splitX().map(i -> engine.getExecutor().getForks().invoke(with(i)))); } else if(size.getDepth() > horizontalPrepareSize * 2) { - invokeAll(size.splitZ().map(this::with).collect(Collectors.toList())); + return IrisFeatureTarget.mergedTarget(size.splitZ().map(i -> engine.getExecutor().getForks().invoke(with(i)))); } - else { - return new IrisPreparedFeature<>(feature, size, feature.prepare(engine, size)); - } - - return null; + IrisPreparedFeature preparedFeature = new IrisPreparedFeature<>(engine, feature, size, feature.prepare(engine, size)); + return preparedFeature.generate(); } private IrisFeatureTask with(IrisFeatureSizedTarget size) { return new IrisFeatureTask<>(engine, feature, size, verticalPrepareSize, horizontalPrepareSize, heightAgnostic); } + + @Override + public IrisFeatureTarget call() throws Exception { + return compute(); + } } diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/IrisPreparedFeature.java b/engine/src/main/java/com/volmit/iris/engine/feature/IrisPreparedFeature.java index 8a374ab1a..ee2665b9d 100644 --- a/engine/src/main/java/com/volmit/iris/engine/feature/IrisPreparedFeature.java +++ b/engine/src/main/java/com/volmit/iris/engine/feature/IrisPreparedFeature.java @@ -1,5 +1,6 @@ package com.volmit.iris.engine.feature; +import com.volmit.iris.engine.IrisEngine; import com.volmit.iris.platform.PlatformNamespaced; import lombok.Builder; import lombok.Data; @@ -7,7 +8,20 @@ import lombok.Data; @Builder @Data public class IrisPreparedFeature { + private final IrisEngine engine; private final IrisFeature feature; private final IrisFeatureSizedTarget size; private final S state; + + public IrisFeatureTarget generate() + { + IrisFeatureTarget target = size.hunked(); + + if(Math.r(0.25)) + { + feature.generate(engine, state, target); + } + + return target; + } } diff --git a/engine/src/main/java/com/volmit/iris/engine/feature/standard/FeatureTerrain.java b/engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureTerrain.java similarity index 88% rename from engine/src/main/java/com/volmit/iris/engine/feature/standard/FeatureTerrain.java rename to engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureTerrain.java index fb01ca529..732fea9fa 100644 --- a/engine/src/main/java/com/volmit/iris/engine/feature/standard/FeatureTerrain.java +++ b/engine/src/main/java/com/volmit/iris/engine/feature/features/FeatureTerrain.java @@ -1,4 +1,4 @@ -package com.volmit.iris.engine.feature.standard; +package com.volmit.iris.engine.feature.features; import art.arcane.amulet.range.IntegerRange; import art.arcane.source.api.noise.Generator; @@ -29,7 +29,7 @@ public class FeatureTerrain extends IrisFeature target) { + public void generate(IrisEngine engine, TerrainFeatureState state, IrisFeatureTarget target) { for(int x : target.localX()) { for(int z : target.localZ()) { int h = state.getNoise().get(x, z); diff --git a/engine/src/main/java/com/volmit/iris/engine/pipeline/EnginePipeline.java b/engine/src/main/java/com/volmit/iris/engine/pipeline/EnginePipeline.java new file mode 100644 index 000000000..a473e821a --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/pipeline/EnginePipeline.java @@ -0,0 +1,29 @@ +package com.volmit.iris.engine.pipeline; + +import com.volmit.iris.engine.EngineExecutor; +import com.volmit.iris.engine.IrisEngine; +import com.volmit.iris.engine.feature.IrisFeatureSizedTarget; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Singular; + +import java.util.ArrayList; +import java.util.List; + +@Data +@AllArgsConstructor +@Builder +public class EnginePipeline +{ + @Singular + private final List phases; + + public void generate(IrisEngine engine,IrisFeatureSizedTarget target, PipedHunkStack stack) + { + for(PipelinePhase i : phases) + { + i.generate(engine, target, stack); + } + } +} diff --git a/engine/src/main/java/com/volmit/iris/engine/pipeline/EnginePlumbing.java b/engine/src/main/java/com/volmit/iris/engine/pipeline/EnginePlumbing.java new file mode 100644 index 000000000..239ae296f --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/pipeline/EnginePlumbing.java @@ -0,0 +1,29 @@ +package com.volmit.iris.engine.pipeline; + +import com.volmit.iris.engine.IrisEngine; +import com.volmit.iris.engine.feature.IrisFeatureSizedTarget; +import com.volmit.iris.engine.pipeline.EnginePipeline; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Singular; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +public class EnginePlumbing { + private final IrisEngine engine; + @Singular + private final List pipelines; + + public void generate(IrisEngine engine, IrisFeatureSizedTarget target, PipedHunkStack stack) + { + for(EnginePipeline i : pipelines) + { + i.generate(engine, target, stack); + } + } +} diff --git a/engine/src/main/java/com/volmit/iris/engine/pipeline/PipedHunkStack.java b/engine/src/main/java/com/volmit/iris/engine/pipeline/PipedHunkStack.java new file mode 100644 index 000000000..dcd9a945c --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/pipeline/PipedHunkStack.java @@ -0,0 +1,27 @@ +package com.volmit.iris.engine.pipeline; + +import art.arcane.amulet.collections.hunk.Hunk; +import com.volmit.iris.platform.PlatformNamespaced; + +import java.util.HashMap; +import java.util.Map; + +public class PipedHunkStack { + private final Map, Hunk> hunks; + + public PipedHunkStack() + { + this.hunks = new HashMap<>(); + } + + public void register(Class clazz, Hunk hunk) + { + hunks.put(clazz, hunk); + } + + @SuppressWarnings("unchecked") + public Hunk hunk(Class hunk) + { + return (Hunk) hunks.get(hunk); + } +} diff --git a/engine/src/main/java/com/volmit/iris/engine/pipeline/PipelinePhase.java b/engine/src/main/java/com/volmit/iris/engine/pipeline/PipelinePhase.java new file mode 100644 index 000000000..bcb338901 --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/pipeline/PipelinePhase.java @@ -0,0 +1,46 @@ +package com.volmit.iris.engine.pipeline; + +import art.arcane.amulet.collections.ObjectBiset; +import art.arcane.amulet.collections.hunk.Hunk; +import com.volmit.iris.engine.IrisEngine; +import com.volmit.iris.engine.feature.IrisFeature; +import com.volmit.iris.engine.feature.IrisFeatureSizedTarget; +import com.volmit.iris.engine.feature.IrisFeatureTarget; +import com.volmit.iris.engine.feature.IrisFeatureTask; +import com.volmit.iris.platform.PlatformNamespaced; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Singular; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; +import static art.arcane.amulet.MagicalSugar.*; + +@Data +@Builder +@AllArgsConstructor +public class PipelinePhase +{ + @Singular + private final List> tasks; + + @SuppressWarnings({"unchecked"}) + public void generate(IrisEngine engine, IrisFeatureSizedTarget target, PipedHunkStack stack) { + List> targets = engine.getExecutor().getForks().invokeAll(tasks.stream().map(i -> i.task(target)).collect(Collectors.toList())).stream().map(i -> { + try { + return i.get(); + } catch(InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + }).collect(Collectors.toList()); + + for(int i : index targets) + { + IrisFeatureTarget targetResult = targets[i]; + stack.hunk(tasks[i].getTarget()).insert((Hunk) targetResult.getHunk()); + } + } +} diff --git a/engine/src/main/java/com/volmit/iris/engine/pipeline/PipelineTask.java b/engine/src/main/java/com/volmit/iris/engine/pipeline/PipelineTask.java new file mode 100644 index 000000000..d159aa1de --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/pipeline/PipelineTask.java @@ -0,0 +1,22 @@ +package com.volmit.iris.engine.pipeline; + +import com.volmit.iris.engine.feature.IrisFeature; +import com.volmit.iris.engine.feature.IrisFeatureSizedTarget; +import com.volmit.iris.engine.feature.IrisFeatureTask; +import com.volmit.iris.platform.PlatformNamespaced; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@AllArgsConstructor +@Builder +@Data +public class PipelineTask +{ + private final IrisFeature feature; + private final Class target; + + public IrisFeatureTask task(IrisFeatureSizedTarget target){ + return feature.task(target, 1000, 4); + } +}