mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
Decorator Updates and Fixes - Season 2
- Added SEA_FLOOR type to decorators which will only place bellow sea level/in water - Implemented CEILING type to decorators, which will allow stacked blocks to place from the top down - Fixed height variance not being implemented properly. The height of stacked blocks is now correct Dev notes: This WILL require updates to the overworld pack as fixing some of the bugs here made some workarounds in the overworld pack kinda break
This commit is contained in:
parent
f1dfb1c952
commit
7652aca406
@ -52,6 +52,7 @@ public class IrisComplex implements DataProvider
|
||||
private ProceduralStream<IrisDecorator> terrainCaveSurfaceDecoration;
|
||||
private ProceduralStream<IrisDecorator> terrainCaveCeilingDecoration;
|
||||
private ProceduralStream<IrisDecorator> seaSurfaceDecoration;
|
||||
private ProceduralStream<IrisDecorator> seaFloorDecoration;
|
||||
private ProceduralStream<IrisDecorator> shoreSurfaceDecoration;
|
||||
private ProceduralStream<BlockData> rockStream;
|
||||
private ProceduralStream<BlockData> fluidStream;
|
||||
@ -191,6 +192,8 @@ public class IrisComplex implements DataProvider
|
||||
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SHORE_LINE));
|
||||
seaSurfaceDecoration = trueBiomeStream
|
||||
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SEA_SURFACE));
|
||||
seaFloorDecoration = trueBiomeStream
|
||||
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SEA_FLOOR));
|
||||
trueHeightStream = ProceduralStream.of((x, z) -> {
|
||||
int rx = (int) Math.round(engine.modifyX(x));
|
||||
int rz = (int) Math.round(engine.modifyZ(z));
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.volmit.iris.generator.actuator;
|
||||
|
||||
import com.volmit.iris.generator.decorator.IrisSeaFloorDecorator;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
import com.volmit.iris.util.PrecisionStopwatch;
|
||||
import com.volmit.iris.util.RNG;
|
||||
@ -28,6 +29,8 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData>
|
||||
@Getter
|
||||
private final EngineDecorator seaSurfaceDecorator;
|
||||
@Getter
|
||||
private final EngineDecorator seaFloorDecorator;
|
||||
@Getter
|
||||
private final EngineDecorator shoreLineDecorator;
|
||||
private final boolean shouldRay;
|
||||
|
||||
@ -39,6 +42,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData>
|
||||
ceilingDecorator = new IrisCeilingDecorator(getEngine());
|
||||
seaSurfaceDecorator = new IrisSeaSurfaceDecorator(getEngine());
|
||||
shoreLineDecorator = new IrisShoreLineDecorator(getEngine());
|
||||
seaFloorDecorator = new IrisSeaFloorDecorator(getEngine());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -49,9 +53,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData>
|
||||
}
|
||||
|
||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||
boolean solid;
|
||||
int emptyFor = 0;
|
||||
int lastSolid = 0;
|
||||
|
||||
int j, realX, realZ, height;
|
||||
IrisBiome biome, cave;
|
||||
|
||||
@ -59,6 +61,9 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData>
|
||||
{
|
||||
for(j = 0; j < output.getDepth(); j++)
|
||||
{
|
||||
boolean solid;
|
||||
int emptyFor = 0;
|
||||
int lastSolid = 0;
|
||||
realX = (int) Math.round(modX(x + i));
|
||||
realZ = (int) Math.round(modZ(z + j));
|
||||
height = (int) Math.round(getComplex().getHeightStream().get(realX, realZ));
|
||||
@ -77,10 +82,16 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData>
|
||||
realZ, (int) Math.round(modZ(z + j+1)), (int) Math.round(modZ(z + j-1)),
|
||||
output, biome, height, getEngine().getHeight() - height);
|
||||
}
|
||||
|
||||
else if (height == getDimension().getFluidHeight() + 1)
|
||||
{
|
||||
getSeaSurfaceDecorator().decorate(i, j,
|
||||
realX, (int) Math.round(modX(x + i+1)), (int) Math.round(modX(x + i-1)),
|
||||
realZ, (int) Math.round(modZ(z + j+1)), (int) Math.round(modZ(z + j-1)),
|
||||
output, biome, height, getEngine().getHeight() - getDimension().getFluidHeight());
|
||||
}
|
||||
else if(height < getDimension().getFluidHeight())
|
||||
{
|
||||
getSeaSurfaceDecorator().decorate(i, j, realX, realZ, output, biome, getDimension().getFluidHeight(), getEngine().getHeight() - getDimension().getFluidHeight());
|
||||
getSeaFloorDecorator().decorate(i, j, realX, realZ, output, biome, height + 1, getDimension().getFluidHeight());
|
||||
}
|
||||
|
||||
getSurfaceDecorator().decorate(i, j, realX, realZ, output, biome, height, getEngine().getHeight() - height);
|
||||
@ -93,18 +104,16 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData>
|
||||
|
||||
if(solid)
|
||||
{
|
||||
if (emptyFor > 0) {
|
||||
getSurfaceDecorator().decorate(i, j, realX, realZ, output, cave, k, emptyFor);
|
||||
getCeilingDecorator().decorate(i, j, realX, realZ, output, cave, lastSolid, emptyFor);
|
||||
emptyFor = 0;
|
||||
}
|
||||
lastSolid = k;
|
||||
}
|
||||
|
||||
else {
|
||||
emptyFor++;
|
||||
}
|
||||
|
||||
if(solid && emptyFor > 0)
|
||||
else
|
||||
{
|
||||
getCeilingDecorator().decorate(i, j, realX, realZ, output, cave, lastSolid, emptyFor);
|
||||
getSurfaceDecorator().decorate(i, j, realX, realZ, output, cave, k, emptyFor);
|
||||
emptyFor = 0;
|
||||
emptyFor++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,16 +22,17 @@ public class IrisCeilingDecorator extends IrisEngineDecorator
|
||||
{
|
||||
if(!decorator.isStacking())
|
||||
{
|
||||
data.set(x, height-1, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData()));
|
||||
data.set(x, height, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData()));
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
int stack = Math.min(getRng().nextParallelRNG(Cache.key(realX, realZ)).i(decorator.getStackMin(), decorator.getStackMax()), max);
|
||||
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
|
||||
stack = Math.min(max + 1, stack);
|
||||
|
||||
for(int i = 0; i < stack; i++)
|
||||
{
|
||||
data.set(x, height-1-i, z, i == stack-1 ? decorator.getBlockDataForTop(biome, getRng(), realX+i, realZ-i, getData()) : decorator.getBlockData100(biome, getRng(), realX+i, realZ-i, getData()));
|
||||
data.set(x, height-i, z, i == 0 ? decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData()) : decorator.getBlockData100(biome, getRng(), realX, realZ, getData()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,45 @@
|
||||
package com.volmit.iris.generator.decorator;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.object.DecorationPart;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
import com.volmit.iris.object.IrisDecorator;
|
||||
import com.volmit.iris.scaffold.cache.Cache;
|
||||
import com.volmit.iris.scaffold.engine.Engine;
|
||||
import com.volmit.iris.scaffold.hunk.Hunk;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
|
||||
public class IrisSeaFloorDecorator extends IrisEngineDecorator
|
||||
{
|
||||
public IrisSeaFloorDecorator(Engine engine) {
|
||||
super(engine, "Sea Floor", DecorationPart.SEA_FLOOR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) {
|
||||
if(height <= getDimension().getFluidHeight()) {
|
||||
|
||||
IrisDecorator decorator = getDecorator(biome, realX, realZ);
|
||||
|
||||
if(decorator != null)
|
||||
{
|
||||
if(!decorator.isStacking())
|
||||
{
|
||||
data.set(x, height, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData()));
|
||||
}
|
||||
else
|
||||
{
|
||||
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
|
||||
stack = Math.min(stack, getDimension().getFluidHeight() - height + 2);
|
||||
//Iris.info("Stack at " + realX + "," + realZ + " is " + stack);
|
||||
BlockData top = decorator.getBlockDataForTop(biome, getRng(), realX, realZ, getData());
|
||||
BlockData fill = decorator.getBlockData100(biome, getRng(), realX, realZ, getData());
|
||||
for(int i = 0; i < stack; i++)
|
||||
{
|
||||
data.set(x, height+i, z, i == stack-1 ? top : fill);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -16,7 +16,7 @@ public class IrisSeaSurfaceDecorator extends IrisEngineDecorator
|
||||
|
||||
@Override
|
||||
public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) {
|
||||
if(height < getDimension().getFluidHeight()) {
|
||||
if(height > getDimension().getFluidHeight()) {
|
||||
{
|
||||
IrisDecorator decorator = getDecorator(biome, realX, realZ);
|
||||
|
||||
@ -26,10 +26,9 @@ public class IrisSeaSurfaceDecorator extends IrisEngineDecorator
|
||||
{
|
||||
data.set(x, getDimension().getFluidHeight()+1, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData()));
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
int stack = Math.min(getRng().nextParallelRNG(Cache.key(realX, realZ)).i(decorator.getStackMin(), decorator.getStackMax()), max);
|
||||
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
|
||||
|
||||
for(int i = 0; i < stack; i++)
|
||||
{
|
||||
|
@ -32,10 +32,9 @@ public class IrisShoreLineDecorator extends IrisEngineDecorator
|
||||
{
|
||||
data.set(x, height+1, z, decorator.getBlockData100(biome, getRng(), realX, realZ, getData()));
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
int stack = Math.min(getRng().nextParallelRNG(Cache.key(realX, realZ)).i(decorator.getStackMin(), decorator.getStackMax()), max);
|
||||
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
|
||||
|
||||
for(int i = 0; i < stack; i++)
|
||||
{
|
||||
|
@ -62,14 +62,14 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator
|
||||
data.set(x, height+1, z, bd);
|
||||
|
||||
}
|
||||
|
||||
else {
|
||||
else
|
||||
{
|
||||
if (height < getDimension().getFluidHeight())
|
||||
{
|
||||
max = getDimension().getFluidHeight() - height;
|
||||
}
|
||||
|
||||
int stack = Math.min(getRng().nextParallelRNG(Cache.key(realX, realZ)).i(decorator.getStackMin(), decorator.getStackMax()), max);
|
||||
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
|
||||
|
||||
for(int i = 0; i < stack; i++)
|
||||
{
|
||||
|
@ -85,7 +85,7 @@ public class IrisDecorator
|
||||
return stackMin;
|
||||
}
|
||||
|
||||
return getHeightGenerator(rng, data).fit(stackMin, stackMax, x / heightVariance.getZoom(), z / heightVariance.getZoom());
|
||||
return getHeightGenerator(rng, data).fit(stackMin, stackMax, x / heightVariance.getZoom(), z / heightVariance.getZoom()) + 1;
|
||||
}
|
||||
|
||||
public CNG getHeightGenerator(RNG rng, IrisDataManager data)
|
||||
@ -134,7 +134,7 @@ public class IrisDecorator
|
||||
return getBlockData(data).get(0);
|
||||
}
|
||||
|
||||
return getVarianceGenerator(rng, data).fit(getBlockData(data), zz, xx); //X and Z must be switched
|
||||
return getVarianceGenerator(rng, data).fit(getBlockData(data), z, x); //X and Z must be switched
|
||||
}
|
||||
|
||||
return null;
|
||||
@ -162,7 +162,7 @@ public class IrisDecorator
|
||||
return getBlockData(data).get(0);
|
||||
}
|
||||
|
||||
return getVarianceGenerator(rng, data).fit(getBlockData(data), zz, xx).clone(); //X and Z must be switched
|
||||
return getVarianceGenerator(rng, data).fit(getBlockData(data), z, x).clone(); //X and Z must be switched
|
||||
}
|
||||
|
||||
public BlockData getBlockDataForTop(IrisBiome b, RNG rng, double x, double z, IrisDataManager data)
|
||||
@ -182,7 +182,7 @@ public class IrisDecorator
|
||||
return getBlockDataTops(data).get(0);
|
||||
}
|
||||
|
||||
return getVarianceGenerator(rng, data).fit(getBlockDataTops(data), zz, xx); //X and Z must be switched
|
||||
return getVarianceGenerator(rng, data).fit(getBlockDataTops(data), z, x); //X and Z must be switched
|
||||
}
|
||||
|
||||
return null;
|
||||
|
Loading…
x
Reference in New Issue
Block a user