9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-23 09:09:15 +00:00

Engine stages

This commit is contained in:
cyberpwn
2021-09-08 05:49:40 -04:00
parent f41686fab4
commit 37c46042c3
6 changed files with 122 additions and 20 deletions

View File

@@ -25,7 +25,9 @@ import com.volmit.iris.core.link.MythicMobsLink;
import com.volmit.iris.core.link.OraxenLink;
import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.nms.INMS;
import com.volmit.iris.core.service.CommandSVC;
import com.volmit.iris.core.service.StudioSVC;
import com.volmit.iris.core.service.WandSVC;
import com.volmit.iris.engine.object.*;
import com.volmit.iris.engine.platform.BukkitChunkGenerator;
import com.volmit.iris.engine.platform.DummyChunkGenerator;

View File

@@ -37,6 +37,7 @@ import com.volmit.iris.engine.modifier.IrisPostModifier;
import com.volmit.iris.engine.object.*;
import com.volmit.iris.engine.scripting.EngineExecutionEnvironment;
import com.volmit.iris.util.atomics.AtomicRollingSequence;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.context.IrisContext;
import com.volmit.iris.util.documentation.BlockCoordinates;
@@ -85,6 +86,7 @@ public class IrisEngine implements Engine {
private boolean failing;
private boolean closed;
private int cacheId;
private final KList<EngineStage> stages;
private final AtomicRollingSequence wallClock;
private final int art;
private double maxBiomeObjectDensity;
@@ -105,6 +107,7 @@ public class IrisEngine implements Engine {
public IrisEngine(EngineTarget target, boolean studio) {
this.studio = studio;
this.target = target;
stages = new KList<>();
getEngineData();
verifySeed();
this.seedManager = new SeedManager(target.getWorld().getRawWorldSeed());
@@ -180,6 +183,7 @@ public class IrisEngine implements Engine {
postModifier = new IrisPostModifier(this);
caveModifier = new IrisCarveModifier(this);
effects = new IrisEngineEffects(this);
setupStages();
J.a(this::computeBiomeMaxes);
} catch (Throwable e) {
Iris.error("FAILED TO SETUP ENGINE!");
@@ -189,6 +193,17 @@ public class IrisEngine implements Engine {
Iris.debug("Engine Setup Complete " + getCacheID());
}
private void setupStages() {
registerStage((x, z, k, p, m) -> getMantle().generateMatter(x >> 4, z >> 4, m));
registerStage((x, z, k, p, m) -> getTerrainActuator().actuate(x, z, k, m));
registerStage((x, z, k, p, m) -> getBiomeActuator().actuate(x, z, p, m));
registerStage((x, z, k, p, m) -> getDecorantActuator().actuate(x, z, k, m));
registerStage((x, z, k, p, m) -> getCaveModifier().modify(x >> 4, z >> 4, k, m));
registerStage((x, z, k, p, m) -> getPostModifier().modify(x, z, k, m));
registerStage((x, z, k, p, m) -> getDepositModifier().modify(x, z, k, m));
registerStage((x, z, K, p, m) -> getMantle().insertMatter(x >> 4, z >> 4, BlockData.class, K, m));
}
@Override
public void hotload() {
hotloadSilently();
@@ -289,6 +304,11 @@ public class IrisEngine implements Engine {
}
}
@Override
public void registerStage(EngineStage stage) {
stages.add(stage);
}
@Override
public int getBlockUpdatesPerSecond() {
return buds.get();
@@ -434,15 +454,12 @@ public class IrisEngine implements Engine {
}
}
} else {
getMantle().generateMatter(x >> 4, z >> 4, multicore);
getTerrainActuator().actuate(x, z, blocks, multicore);
getBiomeActuator().actuate(x, z, vbiomes, multicore);
getDecorantActuator().actuate(x, z, blocks, multicore);
getCaveModifier().modify(x >> 4, z >> 4, blocks, multicore);
getPostModifier().modify(x, z, blocks, multicore);
getDepositModifier().modify(x, z, blocks, multicore);
getMantle().insertMatter(x >> 4, z >> 4, BlockData.class, blocks, multicore);
for(EngineStage i : stages)
{
i.generate(x, z, blocks, vbiomes, multicore);
}
}
getMetrics().getTotal().put(p.getMilliseconds());
generated.incrementAndGet();
recycle();

View File

@@ -73,6 +73,10 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdater, Renderer, Hotloadable {
KList<EngineStage> getStages();
public void registerStage(EngineStage stage);
IrisComplex getComplex();
int getBlockUpdatesPerSecond();

View File

@@ -0,0 +1,29 @@
/*
* Iris is a World Generator for Minecraft Bukkit Servers
* Copyright (c) 2021 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.volmit.iris.engine.framework;
import com.volmit.iris.util.documentation.BlockCoordinates;
import com.volmit.iris.util.hunk.Hunk;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
public interface EngineStage {
@BlockCoordinates
void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes, boolean multicore);
}

View File

@@ -49,18 +49,17 @@ public class IrisFluidBodies {
@BlockCoordinates
public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z) {
//TODO: Impl
// if (rivers.isNotEmpty()) {
// for (IrisRiver i : rivers) {
// i.generate(writer, rng, engine, x, y, z);
// }
// }
//
// if (lakes.isNotEmpty()) {
// for (IrisLake i : lakes) {
// i.generate(writer, rng, engine, x, y, z);
// }
// }
if (rivers.isNotEmpty()) {
for (IrisRiver i : rivers) {
i.generate(writer, rng, engine, x, y, z);
}
}
if (lakes.isNotEmpty()) {
for (IrisLake i : lakes) {
i.generate(writer, rng, engine, x, y, z);
}
}
}
public int getMaxRange(IrisData data) {

View File

@@ -22,7 +22,11 @@ import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.mantle.MantleWriter;
import com.volmit.iris.engine.object.annotations.*;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.matter.MatterFluidBody;
import com.volmit.iris.util.matter.slices.FluidBodyMatter;
import com.volmit.iris.util.noise.CNG;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -50,10 +54,57 @@ public class IrisRiver implements IRare {
@Desc("Force this river to only generate the specified custom biome")
private String customBiome = "";
@Desc("The width style of this lake")
private IrisShapedGeneratorStyle widthStyle = new IrisShapedGeneratorStyle(NoiseStyle.PERLIN.style(), 5, 9);
@Desc("The depth style of this lake")
private IrisShapedGeneratorStyle depthStyle = new IrisShapedGeneratorStyle(NoiseStyle.PERLIN.style(), 4, 7);
public int getSize(IrisData data) {
return worm.getMaxDistance();
}
public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z) {
KList<IrisPosition> pos = getWorm().generate(rng, engine.getData(), writer, null, x, y, z, (at) -> {
});
CNG dg = depthStyle.getGenerator().createNoCache(rng, engine.getData());
CNG bw = widthStyle.getGenerator().createNoCache(rng, engine.getData());
IrisPosition avg;
double ax = 0;
double ay = 0;
double az = 0;
double[] surfaces = new double[pos.size()];
int i = 0;
for (IrisPosition p : pos) {
surfaces[i] = engine.getComplex().getHeightStream().get(x, z);
ax += p.getX();
ay += surfaces[i];
az += p.getZ();
i++;
}
avg = new IrisPosition(ax / pos.size(), ay / pos.size(), az / pos.size());
MatterFluidBody body = FluidBodyMatter.get(customBiome, false);
i = 0;
for (IrisPosition p : pos) {
double surface = surfaces[i];
double depth = dg.fitDouble(depthStyle.getMin(), depthStyle.getMax(), p.getX(), p.getZ()) + (surface - avg.getY());
double width = bw.fitDouble(widthStyle.getMin(), widthStyle.getMax(), p.getX(), p.getZ());
if (depth > 1) {
writer.setElipsoidFunction(p.getX(), avg.getY(), p.getZ(), width, depth, width, true, (xx, yy, zz) -> {
if (yy > avg.getY()) {
return null;
}
return body;
});
}
i++;
}
}
}