diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index fc496f64a0..31af738182 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -164,7 +164,7 @@ public class MapGenerateDialog extends BaseDialog{ for(int x = 0; x < editor.width(); x++){ for(int y = 0; y < editor.height(); y++){ Tile tile = editor.tile(x, y); - input.apply(x, y, tile.block(), tile.floor(), tile.overlay()); + input.set(x, y, tile.block(), tile.floor(), tile.overlay()); filter.apply(input); writeTiles[x + y*world.width()] = PackTile.get(input.block.id, input.floor.id, input.overlay.id); } @@ -420,7 +420,7 @@ public class MapGenerateDialog extends BaseDialog{ pixmap.each((px, py) -> { int x = px * scaling, y = py * scaling; long tile = buffer1[px + py * w]; - input.apply(x, y, content.block(PackTile.block(tile)), content.block(PackTile.floor(tile)), content.block(PackTile.overlay(tile))); + input.set(x, y, content.block(PackTile.block(tile)), content.block(PackTile.floor(tile)), content.block(PackTile.overlay(tile))); filter.apply(input); buffer2[px + py * w] = PackTile.get(input.block.id, input.floor.id, input.overlay.id); }); diff --git a/core/src/mindustry/maps/filters/BlendFilter.java b/core/src/mindustry/maps/filters/BlendFilter.java index ab5171b00f..7f0d319df9 100644 --- a/core/src/mindustry/maps/filters/BlendFilter.java +++ b/core/src/mindustry/maps/filters/BlendFilter.java @@ -31,7 +31,7 @@ public class BlendFilter extends GenerateFilter{ } @Override - public void apply(){ + public void apply(GenerateInput in){ if(in.floor == block || block == Blocks.air || in.floor == ignore || (!floor.isFloor() && (in.block == block || in.block == ignore))) return; int rad = (int)radius; diff --git a/core/src/mindustry/maps/filters/ClearFilter.java b/core/src/mindustry/maps/filters/ClearFilter.java index 1ce2ca6a25..3b2684ef7e 100644 --- a/core/src/mindustry/maps/filters/ClearFilter.java +++ b/core/src/mindustry/maps/filters/ClearFilter.java @@ -22,7 +22,7 @@ public class ClearFilter extends GenerateFilter{ } @Override - public void apply(){ + public void apply(GenerateInput in){ if(in.block == block){ in.block = Blocks.air; diff --git a/core/src/mindustry/maps/filters/DistortFilter.java b/core/src/mindustry/maps/filters/DistortFilter.java index 23f7f42a91..8b6d80e8e1 100644 --- a/core/src/mindustry/maps/filters/DistortFilter.java +++ b/core/src/mindustry/maps/filters/DistortFilter.java @@ -26,8 +26,8 @@ public class DistortFilter extends GenerateFilter{ } @Override - public void apply(){ - Tile tile = in.tile(in.x + noise(in.x, in.y, scl, mag) - mag / 2f, in.y + noise(in.x, in.y, scl, mag) - mag / 2f); + public void apply(GenerateInput in){ + Tile tile = in.tile(in.x + noise(in, scl, mag) - mag / 2f, in.y + noise(in, scl, mag) - mag / 2f); in.floor = tile.floor(); if(!tile.block().synthetic() && !in.block.synthetic()) in.block = tile.block(); diff --git a/core/src/mindustry/maps/filters/GenerateFilter.java b/core/src/mindustry/maps/filters/GenerateFilter.java index 51db9bf07b..b4512c0699 100644 --- a/core/src/mindustry/maps/filters/GenerateFilter.java +++ b/core/src/mindustry/maps/filters/GenerateFilter.java @@ -14,10 +14,7 @@ import mindustry.world.*; public abstract class GenerateFilter{ public int seed = 0; - protected transient GenerateInput in; - public void apply(Tiles tiles, GenerateInput in){ - this.in = in; if(isBuffered()){ //buffer of tiles used, each tile packed into a long struct @@ -26,8 +23,8 @@ public abstract class GenerateFilter{ for(int i = 0; i < tiles.width * tiles.height; i++){ Tile tile = tiles.geti(i); - in.apply(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay()); - apply(); + in.set(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay()); + apply(in); buffer[i] = PackTile.get(in.block.id, in.floor.id, in.overlay.id); } @@ -48,8 +45,8 @@ public abstract class GenerateFilter{ } }else{ for(Tile tile : tiles){ - in.apply(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay()); - apply(); + in.set(tile.x, tile.y, tile.block(), tile.floor(), tile.overlay()); + apply(in); tile.setFloor(in.floor.asFloor()); tile.setOverlay(!in.floor.asFloor().hasSurface() && in.overlay.asFloor().needsSurface ? Blocks.air : in.overlay); @@ -61,16 +58,11 @@ public abstract class GenerateFilter{ } } - public final void apply(GenerateInput in){ - this.in = in; - apply(); - } - /** @return a new array of options for configuring this filter */ public abstract FilterOption[] options(); /** apply the actual filter on the input */ - protected void apply(){} + public void apply(GenerateInput in){} /** draw any additional guides */ public void draw(Image image){} @@ -108,12 +100,14 @@ public abstract class GenerateFilter{ //utility generation functions - protected float noise(float x, float y, float scl, float mag){ - return (float)in.noise.octaveNoise2D(1f, 0f, 1f / scl, x, y) * mag; + //TODO would be nice if these functions used the seed and ditched "in" completely; simplex should be stateless + + protected float noise(GenerateInput in, float scl, float mag){ + return (float)in.noise.octaveNoise2D(1f, 0f, 1f / scl, in.x, in.y) * mag; } - protected float noise(float x, float y, float scl, float mag, float octaves, float persistence){ - return (float)in.noise.octaveNoise2D(octaves, persistence, 1f / scl, x, y) * mag; + protected float noise(GenerateInput in, float scl, float mag, float octaves, float persistence){ + return (float)in.noise.octaveNoise2D(octaves, persistence, 1f / scl, in.x, in.y) * mag; } protected float rnoise(float x, float y, float scl, float mag){ @@ -124,8 +118,8 @@ public abstract class GenerateFilter{ return RidgedPerlin.noise2d(seed + 1, (int)(x), (int)(y), octaves, falloff, 1f / scl) * mag; } - protected float chance(){ - return Mathf.randomSeed(Pack.longInt(in.x, in.y + seed)); + protected float chance(int x, int y){ + return Mathf.randomSeed(Pack.longInt(x, y + seed)); } /** an input for generating at a certain coordinate. should only be instantiated once. */ @@ -140,7 +134,7 @@ public abstract class GenerateFilter{ Simplex noise = new Simplex(); TileProvider buffer; - public void apply(int x, int y, Block block, Block floor, Block overlay){ + public void set(int x, int y, Block block, Block floor, Block overlay){ this.floor = floor; this.block = block; this.overlay = overlay; diff --git a/core/src/mindustry/maps/filters/MedianFilter.java b/core/src/mindustry/maps/filters/MedianFilter.java index d97d469952..35d08f814d 100644 --- a/core/src/mindustry/maps/filters/MedianFilter.java +++ b/core/src/mindustry/maps/filters/MedianFilter.java @@ -33,7 +33,7 @@ public class MedianFilter extends GenerateFilter{ } @Override - public void apply(){ + public void apply(GenerateInput in){ int rad = (int)radius; blocks.clear(); floors.clear(); diff --git a/core/src/mindustry/maps/filters/MirrorFilter.java b/core/src/mindustry/maps/filters/MirrorFilter.java index 33bd6ace94..d96c3a6b5f 100644 --- a/core/src/mindustry/maps/filters/MirrorFilter.java +++ b/core/src/mindustry/maps/filters/MirrorFilter.java @@ -31,7 +31,7 @@ public class MirrorFilter extends GenerateFilter{ } @Override - protected void apply(){ + public void apply(GenerateInput in){ v1.trnsExact(angle - 90, 1f); v2.set(v1).scl(-1f); @@ -41,7 +41,7 @@ public class MirrorFilter extends GenerateFilter{ v3.set(in.x, in.y); if(!left(v1, v2, v3)){ - mirror(v3, v1.x, v1.y, v2.x, v2.y); + mirror(in.width, in.height, v3, v1.x, v1.y, v2.x, v2.y); Tile tile = in.tile(v3.x, v3.y); in.floor = tile.floor(); if(!tile.block().synthetic()){ @@ -73,11 +73,11 @@ public class MirrorFilter extends GenerateFilter{ Draw.reset(); } - void mirror(Vec2 p, float x0, float y0, float x1, float y1){ + void mirror(int width, int height, Vec2 p, float x0, float y0, float x1, float y1){ //special case: uneven map mirrored at 45 degree angle (or someone might just want rotational symmetry) - if((in.width != in.height && angle % 90 != 0) || rotate){ - p.x = in.width - p.x - 1; - p.y = in.height - p.y - 1; + if((width != height && angle % 90 != 0) || rotate){ + p.x = width - p.x - 1; + p.y = height - p.y - 1; }else{ float dx = x1 - x0; float dy = y1 - y0; diff --git a/core/src/mindustry/maps/filters/NoiseFilter.java b/core/src/mindustry/maps/filters/NoiseFilter.java index 986ee077ce..b4aad342d2 100644 --- a/core/src/mindustry/maps/filters/NoiseFilter.java +++ b/core/src/mindustry/maps/filters/NoiseFilter.java @@ -29,8 +29,8 @@ public class NoiseFilter extends GenerateFilter{ } @Override - public void apply(){ - float noise = noise(in.x, in.y, scl, 1f, octaves, falloff); + public void apply(GenerateInput in){ + float noise = noise(in, scl, 1f, octaves, falloff); if(noise > threshold && (target == Blocks.air || in.floor == target || in.block == target)){ if(floor != Blocks.air) in.floor = floor; diff --git a/core/src/mindustry/maps/filters/OreFilter.java b/core/src/mindustry/maps/filters/OreFilter.java index 67c79ab82c..e5fd5f1344 100644 --- a/core/src/mindustry/maps/filters/OreFilter.java +++ b/core/src/mindustry/maps/filters/OreFilter.java @@ -28,8 +28,8 @@ public class OreFilter extends GenerateFilter{ } @Override - public void apply(){ - float noise = noise(in.x, in.y, scl, 1f, octaves, falloff); + public void apply(GenerateInput in){ + float noise = noise(in, scl, 1f, octaves, falloff); if(noise > threshold && in.overlay != Blocks.spawn && (target == Blocks.air || in.floor == target || in.overlay == target) && in.floor.asFloor().hasSurface()){ in.overlay = ore; diff --git a/core/src/mindustry/maps/filters/OreMedianFilter.java b/core/src/mindustry/maps/filters/OreMedianFilter.java index 97f5557925..9409604c23 100644 --- a/core/src/mindustry/maps/filters/OreMedianFilter.java +++ b/core/src/mindustry/maps/filters/OreMedianFilter.java @@ -33,7 +33,7 @@ public class OreMedianFilter extends GenerateFilter{ } @Override - public void apply(){ + public void apply(GenerateInput in){ if(in.overlay == Blocks.spawn) return; int cx = (in.x / 2) * 2; diff --git a/core/src/mindustry/maps/filters/RiverNoiseFilter.java b/core/src/mindustry/maps/filters/RiverNoiseFilter.java index af82b91886..3fb6efab5e 100644 --- a/core/src/mindustry/maps/filters/RiverNoiseFilter.java +++ b/core/src/mindustry/maps/filters/RiverNoiseFilter.java @@ -30,7 +30,7 @@ public class RiverNoiseFilter extends GenerateFilter{ } @Override - public void apply(){ + public void apply(GenerateInput in){ float noise = rnoise(in.x, in.y, (int)octaves, scl, falloff, 1f); if(noise >= threshold){ diff --git a/core/src/mindustry/maps/filters/ScatterFilter.java b/core/src/mindustry/maps/filters/ScatterFilter.java index 5787648276..ca094891b4 100644 --- a/core/src/mindustry/maps/filters/ScatterFilter.java +++ b/core/src/mindustry/maps/filters/ScatterFilter.java @@ -26,9 +26,9 @@ public class ScatterFilter extends GenerateFilter{ } @Override - public void apply(){ + public void apply(GenerateInput in){ - if(block != Blocks.air && (in.floor == flooronto || flooronto == Blocks.air) && in.block == Blocks.air && chance() <= chance){ + if(block != Blocks.air && (in.floor == flooronto || flooronto == Blocks.air) && in.block == Blocks.air && chance(in.x, in.y) <= chance){ if(!block.isOverlay()){ in.block = block; }else{ @@ -36,7 +36,7 @@ public class ScatterFilter extends GenerateFilter{ } } - if(floor != Blocks.air && (in.floor == flooronto || flooronto == Blocks.air) && chance() <= chance){ + if(floor != Blocks.air && (in.floor == flooronto || flooronto == Blocks.air) && chance(in.x, in.y) <= chance){ in.floor = floor; } } diff --git a/core/src/mindustry/maps/filters/TerrainFilter.java b/core/src/mindustry/maps/filters/TerrainFilter.java index 2c4a9f48c3..98fdc53d9d 100644 --- a/core/src/mindustry/maps/filters/TerrainFilter.java +++ b/core/src/mindustry/maps/filters/TerrainFilter.java @@ -31,8 +31,8 @@ public class TerrainFilter extends GenerateFilter{ } @Override - public void apply(){ - float noise = noise(in.x, in.y, scl, magnitude, octaves, falloff) + Mathf.dst((float)in.x / in.width, (float)in.y / in.height, 0.5f, 0.5f) * circleScl; + public void apply(GenerateInput in){ + float noise = noise(in, scl, magnitude, octaves, falloff) + Mathf.dst((float)in.x / in.width, (float)in.y / in.height, 0.5f, 0.5f) * circleScl; if(floor != Blocks.air){ in.floor = floor;