Editor generation cleanup

This commit is contained in:
Anuken
2020-10-22 19:26:55 -04:00
parent 4f21ea7799
commit 514e2503fa
5 changed files with 47 additions and 89 deletions

View File

@@ -45,9 +45,8 @@ public class MapGenerateDialog extends BaseDialog{
private AsyncExecutor executor = new AsyncExecutor(1);
private AsyncResult<Void> result;
boolean generating;
private GenTile returnTile = new GenTile();
private GenTile[][] buffer1, buffer2;
private long[] buffer1, buffer2;
private Cons<Seq<GenerateFilter>> applier;
CachedTile ctile = new CachedTile(){
//nothing.
@@ -108,42 +107,36 @@ public class MapGenerateDialog extends BaseDialog{
/** Applies the specified filters to the editor. */
public void applyToEditor(Seq<GenerateFilter> filters){
//writeback buffer
GenTile[][] writeTiles = new GenTile[editor.width()][editor.height()];
for(int x = 0; x < editor.width(); x++){
for(int y = 0; y < editor.height(); y++){
writeTiles[x][y] = new GenTile();
}
}
long[] writeTiles = new long[editor.width() * editor.height()];
for(GenerateFilter filter : filters){
input.begin(filter, editor.width(), editor.height(), editor::tile);
//write to buffer
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());
filter.apply(input);
writeTiles[x][y].set(input.floor, input.block, input.overlay, tile.team());
writeTiles[x + y*world.width()] = PackTile.get(input.block.id, input.floor.id, input.overlay.id);
}
}
editor.load(() -> {
//read from buffer back into tiles
for(int x = 0; x < editor.width(); x++){
for(int y = 0; y < editor.height(); y++){
Tile tile = editor.tile(x, y);
GenTile write = writeTiles[x][y];
for(int i = 0; i < editor.width() * editor.height(); i++){
Tile tile = world.tiles.geti(i);
long write = writeTiles[i];
//don't mess up synthetic stuff.
if(!tile.synthetic() && !content.block(write.block).synthetic()){
tile.setBlock(content.block(write.block));
}
Block block = content.block(PackTile.block(write)), floor = content.block(PackTile.floor(write)), overlay = content.block(PackTile.overlay(write));
tile.setFloor((Floor)content.block(write.floor));
tile.setTeam(Team.get(write.team));
tile.setOverlay(content.block(write.ore));
//don't mess up synthetic stuff.
if(!tile.synthetic() && !block.synthetic()){
tile.setBlock(block);
}
tile.setFloor((Floor)floor);
tile.setOverlay(overlay);
}
});
}
@@ -206,15 +199,8 @@ public class MapGenerateDialog extends BaseDialog{
rebuildFilters();
}
GenTile[][] create(){
GenTile[][] out = new GenTile[editor.width() / scaling][editor.height() / scaling];
for(int x = 0; x < out.length; x++){
for(int y = 0; y < out[0].length; y++){
out[x][y] = new GenTile();
}
}
return out;
long[] create(){
return new long[(editor.width() / scaling) * (editor.height() / scaling)];
}
void rebuildFilters(){
@@ -322,9 +308,15 @@ public class MapGenerateDialog extends BaseDialog{
selection.show();
}
GenTile dset(Tile tile){
returnTile.set(tile);
return returnTile;
long pack(Tile tile){
return PackTile.get(tile.blockID(), tile.floorID(), tile.overlayID());
}
Tile unpack(long tile){
ctile.setFloor((Floor)content.block(PackTile.floor(tile)));
ctile.setBlock(content.block(PackTile.block(tile)));
ctile.setOverlay(content.block(PackTile.overlay(tile)));
return ctile;
}
void apply(){
@@ -355,6 +347,7 @@ public class MapGenerateDialog extends BaseDialog{
result = executor.submit(() -> {
try{
int w = pixmap.getWidth();
world.setGenerating(true);
generating = true;
@@ -362,24 +355,24 @@ public class MapGenerateDialog extends BaseDialog{
//write to buffer1 for reading
for(int px = 0; px < pixmap.getWidth(); px++){
for(int py = 0; py < pixmap.getHeight(); py++){
buffer1[px][py].set(editor.tile(px * scaling, py * scaling));
buffer1[px + py*w] = pack(editor.tile(px * scaling, py * scaling));
}
}
}
for(GenerateFilter filter : copy){
input.begin(filter, editor.width(), editor.height(), (x, y) -> buffer1[Mathf.clamp(x / scaling, 0, pixmap.getWidth()-1)][Mathf.clamp(y / scaling, 0, pixmap.getHeight()-1)].tile());
input.begin(filter, editor.width(), editor.height(), (x, y) -> unpack(buffer1[Mathf.clamp(x / scaling, 0, pixmap.getWidth()-1) + w* Mathf.clamp(y / scaling, 0, pixmap.getHeight()-1)]));
//read from buffer1 and write to buffer2
pixmap.each((px, py) -> {
int x = px * scaling, y = py * scaling;
GenTile tile = buffer1[px][py];
input.apply(x, y, content.block(tile.block), content.block(tile.floor), content.block(tile.ore));
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)));
filter.apply(input);
buffer2[px][py].set(input.floor, input.block, input.overlay, Team.get(tile.team));
buffer2[px + py * w] = PackTile.get(input.block.id, input.floor.id, input.overlay.id);
});
pixmap.each((px, py) -> buffer1[px][py].set(buffer2[px][py]));
pixmap.each((px, py) -> buffer1[px + py*w] = buffer2[px + py*w]);
}
for(int px = 0; px < pixmap.getWidth(); px++){
@@ -388,10 +381,10 @@ public class MapGenerateDialog extends BaseDialog{
//get result from buffer1 if there's filters left, otherwise get from editor directly
if(filters.isEmpty()){
Tile tile = editor.tile(px * scaling, py * scaling);
color = MapIO.colorFor(tile.floor(), tile.block(), tile.overlay(), Team.derelict);
color = MapIO.colorFor(tile.block(), tile.floor(), tile.overlay(), Team.derelict);
}else{
GenTile tile = buffer1[px][py];
color = MapIO.colorFor(content.block(tile.floor), content.block(tile.block), content.block(tile.ore), Team.derelict);
long tile = buffer1[px + py*w];
color = MapIO.colorFor(content.block(PackTile.block(tile)), content.block(PackTile.floor(tile)), content.block(PackTile.overlay(tile)), Team.derelict);
}
pixmap.draw(px, pixmap.getHeight() - 1 - py, color);
}
@@ -411,39 +404,4 @@ public class MapGenerateDialog extends BaseDialog{
world.setGenerating(false);
});
}
private class GenTile{
public byte team;
public short block, floor, ore;
GenTile(){
}
public void set(Block floor, Block wall, Block ore, Team team){
this.floor = floor.id;
this.block = wall.id;
this.ore = (!floor.asFloor().hasSurface() && ore.asFloor().needsSurface) ? 0 : ore.id;
this.team = (byte)team.id;
}
public void set(GenTile other){
this.floor = other.floor;
this.block = other.block;
this.ore = other.ore;
this.team = other.team;
}
public GenTile set(Tile other){
set(other.floor(), other.block(), other.overlay(), other.team());
return this;
}
Tile tile(){
ctile.setFloor((Floor)content.block(floor));
ctile.setBlock(content.block(block));
ctile.setOverlay(content.block(ore));
ctile.setTeam(Team.get(team));
return ctile;
}
}
}