mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 02:36:59 +00:00
Engine actuators
This commit is contained in:
parent
a319314d04
commit
f2b44d8f99
@ -0,0 +1,19 @@
|
||||
package com.volmit.iris.gen.v2.generator.actuator;
|
||||
|
||||
import com.volmit.iris.gen.v2.scaffold.engine.Engine;
|
||||
import com.volmit.iris.gen.v2.scaffold.engine.EngineAssignedActuator;
|
||||
import com.volmit.iris.gen.v2.scaffold.hunk.Hunk;
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
|
||||
public class IrisBiomeActuator extends EngineAssignedActuator<Biome>
|
||||
{
|
||||
public IrisBiomeActuator(Engine engine) {
|
||||
super(engine);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actuate(int x, int z, Hunk<Biome> output) {
|
||||
getComplex().getMaxHeightStream().fill2DYLocked(output, x, z, getComplex().getTrueBiomeDerivativeStream(), getParallelism());
|
||||
}
|
||||
}
|
@ -0,0 +1,96 @@
|
||||
package com.volmit.iris.gen.v2.generator.actuator;
|
||||
|
||||
import com.volmit.iris.gen.v2.scaffold.engine.Engine;
|
||||
import com.volmit.iris.gen.v2.scaffold.engine.EngineAssignedActuator;
|
||||
import com.volmit.iris.gen.v2.scaffold.hunk.Hunk;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
import com.volmit.iris.object.IrisDecorator;
|
||||
import com.volmit.iris.util.RNG;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public class IrisDecorantActuator extends EngineAssignedActuator<BlockData>
|
||||
{
|
||||
private static final Predicate<BlockData> PREDICATE_SOLID = (b) -> b != null && !b.getMaterial().isAir() && !b.getMaterial().equals(Material.WATER) && !b.getMaterial().equals(Material.LAVA);
|
||||
private final RNG rng;
|
||||
|
||||
public IrisDecorantActuator(Engine engine) {
|
||||
super(engine);
|
||||
this.rng = new RNG(engine.getTarget().getWorld().getSeed());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actuate(int x, int z, Hunk<BlockData> output) {
|
||||
output.iterateSurfaces2D(getParallelism(), PREDICATE_SOLID, (hunkRelativeX, hunkRelativeZ, hunkOffsetX, hunkOffsetZ, top, bottom, lastBottom, h) ->
|
||||
{
|
||||
int realX = x + hunkOffsetX + hunkRelativeX;
|
||||
int realZ = z + hunkOffsetZ + hunkRelativeZ;
|
||||
RNG g = rng.nextParallelRNG(realX).nextParallelRNG(realZ); //TODO: Technically incorrect! Use chunkX & chunkZ
|
||||
IrisBiome b = getComplex().getTrueBiomeStream().get(realX, realZ);
|
||||
boolean surface = lastBottom == -1;
|
||||
int floor = top + 1;
|
||||
int ceiling = lastBottom == -1 ? floor < getDimension().getFluidHeight() ? getDimension().getFluidHeight() : output.getHeight() : lastBottom - 1;
|
||||
int height = ceiling - floor;
|
||||
|
||||
if(height < 2)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
IrisDecorator deco = getComplex().getTerrainSurfaceDecoration().get(realX, realZ);
|
||||
|
||||
if(deco != null)
|
||||
{
|
||||
if(deco.isStacking())
|
||||
{
|
||||
int stack = Math.min(g.i(deco.getStackMin(), deco.getStackMax()), height);
|
||||
|
||||
for(int i = 0; i < stack; i++)
|
||||
{
|
||||
h.set(hunkRelativeX, i + floor, hunkRelativeZ, deco.getBlockData100(b, rng, realX - i, realZ + i, getData()));
|
||||
}
|
||||
|
||||
if(deco.getTopPalette().isNotEmpty())
|
||||
{
|
||||
h.set(hunkRelativeX, stack + floor - 1, hunkRelativeZ, deco.getBlockDataForTop(b, rng, realX - stack, realZ + stack, getData()));
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
h.set(hunkRelativeX, floor, hunkRelativeZ, deco.getBlockData100(b, rng, realX, realZ, getData()));
|
||||
}
|
||||
}
|
||||
|
||||
if(!surface)
|
||||
{
|
||||
IrisDecorator cdeco = getComplex().getTerrainCeilingDecoration().get(realX, realZ);
|
||||
|
||||
if(cdeco != null)
|
||||
{
|
||||
if(cdeco.isStacking())
|
||||
{
|
||||
int stack = Math.min(g.i(cdeco.getStackMin(), cdeco.getStackMax()), height);
|
||||
|
||||
for(int i = 0; i < stack; i++)
|
||||
{
|
||||
h.set(hunkRelativeX, -i + ceiling, hunkRelativeZ, cdeco.getBlockData100(b, rng, realX - i, realZ + i, getData()));
|
||||
}
|
||||
|
||||
if(cdeco.getTopPalette().isNotEmpty())
|
||||
{
|
||||
h.set(hunkRelativeX, -stack + ceiling - 1, hunkRelativeZ, cdeco.getBlockDataForTop(b, rng, realX - stack, realZ + stack, getData()));
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
h.set(hunkRelativeX, ceiling, hunkRelativeZ, cdeco.getBlockData100(b, rng, realX, realZ, getData()));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.volmit.iris.gen.v2.generator.actuator;
|
||||
|
||||
import com.volmit.iris.gen.v2.scaffold.engine.Engine;
|
||||
import com.volmit.iris.gen.v2.scaffold.engine.EngineAssignedActuator;
|
||||
import com.volmit.iris.gen.v2.scaffold.hunk.Hunk;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
|
||||
public class IrisTerrainActuator extends EngineAssignedActuator<BlockData>
|
||||
{
|
||||
public IrisTerrainActuator(Engine engine) {
|
||||
super(engine);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actuate(int x, int z, Hunk<BlockData> output) {
|
||||
getComplex().getHeightFluidStream().fill2D(output, x, z, getComplex().getTerrainStream(), getParallelism());
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user