separate image geenration from blocks

master
Thomas Rudin 2018-04-17 09:32:16 +00:00
parent 36be7f7b4e
commit 247c42615a
5 changed files with 33 additions and 264 deletions

View File

@ -1,9 +1,13 @@
package io.rudin.minetest.tileserver;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Optional;
import java.util.zip.DataFormatException;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jooq.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -11,21 +15,27 @@ import org.slf4j.LoggerFactory;
import io.rudin.minetest.tileserver.ColorTable.Color;
import io.rudin.minetest.tileserver.blockdb.tables.records.BlocksRecord;
@Singleton
public class MapBlockRenderer {
private static final Logger logger = LoggerFactory.getLogger(MapBlockRenderer.class);
public MapBlockRenderer(Graphics graphics, ColorTable colorTable) {
this.graphics = graphics;
private static final int BLOCK_SIZE = 16;
@Inject
public MapBlockRenderer(ColorTable colorTable) {
this.colorTable = colorTable;
}
private final Graphics graphics;
private final ColorTable colorTable;
public void render(Result<BlocksRecord> mapblocks) throws IllegalArgumentException, DataFormatException {
public BufferedImage render(Result<BlocksRecord> mapblocks) throws IllegalArgumentException, DataFormatException {
BufferedImage image = new BufferedImage(BLOCK_SIZE, BLOCK_SIZE, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
graphics.setColor(java.awt.Color.WHITE);
graphics.fillRect(0, 0, BLOCK_SIZE, BLOCK_SIZE);
int foundBlocks = 0;
final int expectedBlocks = 16 * 16;
@ -73,7 +83,7 @@ public class MapBlockRenderer {
if (foundBlocks == expectedBlocks)
//All done
return;
return image;
} else {
logger.debug("Color for name '{}' @ {}/{}/{} not found!", name, x, y, z);
@ -91,6 +101,7 @@ public class MapBlockRenderer {
logger.debug("Only found {} blocks in {} layers!", foundBlocks, mapblocks.size());
}
return image;
}
}

View File

@ -3,7 +3,6 @@ package io.rudin.minetest.tileserver;
import static io.rudin.minetest.tileserver.blockdb.tables.Blocks.BLOCKS;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
@ -34,20 +33,17 @@ public class TileRenderer {
private static final Logger logger = LoggerFactory.getLogger(TileRenderer.class);
@Inject
public TileRenderer(DSLContext ctx, ColorTable colorTable, TileCache cache) {
public TileRenderer(DSLContext ctx, TileCache cache, MapBlockRenderer blockRenderer) {
this.ctx = ctx;
this.colorTable = colorTable;
this.cache = cache;
if (colorTable.getColorMap().isEmpty())
logger.warn("Color table empty!");
this.blockRenderer = blockRenderer;
}
private final TileCache cache;
private final DSLContext ctx;
private final ColorTable colorTable;
private final MapBlockRenderer blockRenderer;
public BufferedImage createTile() {
return new BufferedImage(CoordinateResolver.TILE_PIXEL_SIZE, CoordinateResolver.TILE_PIXEL_SIZE, BufferedImage.TYPE_INT_RGB);
@ -201,12 +197,6 @@ public class TileRenderer {
for (int mbx=0; mbx<16; mbx++) {
for (int mbz=0; mbz<16; mbz++) {
Graphics mapblockGraphics = graphics.create(
mbx * CoordinateResolver.MAPBLOCK_PIXEL_SIZE,
mbz * CoordinateResolver.MAPBLOCK_PIXEL_SIZE,
CoordinateResolver.MAPBLOCK_PIXEL_SIZE,
CoordinateResolver.MAPBLOCK_PIXEL_SIZE);
int mapblockX = coordinateInfo.x + mbx;
int mapblockZ = coordinateInfo.z + (mbz *-1);
@ -224,9 +214,17 @@ public class TileRenderer {
logger.debug("Got {} blocks", blocks.size());
MapBlockRenderer renderer = new MapBlockRenderer(mapblockGraphics, colorTable);
renderer.render(blocks);
BufferedImage mapBlockImage = blockRenderer.render(blocks);
graphics.drawImage(
mapBlockImage,
mbx * CoordinateResolver.MAPBLOCK_PIXEL_SIZE,
mbz * CoordinateResolver.MAPBLOCK_PIXEL_SIZE,
CoordinateResolver.MAPBLOCK_PIXEL_SIZE,
CoordinateResolver.MAPBLOCK_PIXEL_SIZE,
null
);
}
}

View File

@ -35,10 +35,7 @@
});
L.tileLayer('tiles/{z}/{x}/{y}').addTo(map);
L.marker([0,0]).bindPopup("0/0").addTo(map);
L.marker([1,1]).bindPopup("1/1").addTo(map);
L.marker([-207, 7]).bindPopup("Spawn").addTo(map);
//L.marker([410,114]).addTo(map);
//L.marker([-207, 7]).bindPopup("Spawn").addTo(map);
var playerMapper = player => {
L.marker([player.posz/10, player.posx/10]).bindPopup(player.name).addTo(map);

View File

@ -1,148 +0,0 @@
package io.rudin.minetest.tileserver;
import static io.rudin.minetest.tileserver.blockdb.tables.Blocks.BLOCKS;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import org.jooq.Condition;
import org.jooq.DSLContext;
import org.jooq.Record6;
import org.jooq.Result;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import io.rudin.minetest.tileserver.blockdb.tables.records.BlocksRecord;
public class FetchMap {
private static final Logger logger = LoggerFactory.getLogger(FetchMap.class);
public static void main(String[] args) throws Exception {
System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "DEBUG");
HikariConfig cfg = new HikariConfig();
cfg.setUsername("postgres");
cfg.setPassword("enter");
cfg.setJdbcUrl("jdbc:postgresql://10.0.0.131:5432/minetest");
cfg.setDriverClassName("org.postgresql.Driver");
HikariDataSource dataSource = new HikariDataSource(cfg);
DSLContext ctx = DSL.using(dataSource, SQLDialect.POSTGRES);
int restrict_min_y = -500;
int restrict_max_y = 1500;
Condition y_restriction = BLOCKS.POSY.ge(restrict_min_y).and(BLOCKS.POSY.le(restrict_max_y));
Record6<Integer, Integer, Integer, Integer, Integer, Integer> result = ctx
.select(DSL.min(BLOCKS.POSX), DSL.max(BLOCKS.POSX),
DSL.min(BLOCKS.POSY), DSL.max(BLOCKS.POSY),
DSL.min(BLOCKS.POSZ), DSL.max(BLOCKS.POSZ))
.from(BLOCKS)
.where(y_restriction)
.fetchOne();
Integer minx = result.get(DSL.min(BLOCKS.POSX));
Integer maxx = result.get(DSL.max(BLOCKS.POSX));
Integer miny = result.get(DSL.min(BLOCKS.POSY));
Integer maxy = result.get(DSL.max(BLOCKS.POSY));
Integer minz = result.get(DSL.min(BLOCKS.POSZ));
Integer maxz = result.get(DSL.max(BLOCKS.POSZ));
System.out.println("x= " + minx + " to " + maxx);
System.out.println("y= " + miny + " to " + maxy);
System.out.println("z= " + minz + " to " + maxz);
int x_extent = maxx - minx;
int z_extent = maxz - minz;
int x_blocks = x_extent * 16;
int z_blocks = z_extent * 16;
int flat_block_count = x_blocks * z_blocks;
int block_count = 0;
System.out.println("Flat blocks: " + flat_block_count);
BufferedImage image = new BufferedImage(x_blocks, z_blocks, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, x_blocks, z_blocks);
ColorTable colorTable = new ColorTable();
colorTable.load(FetchMap.class.getResourceAsStream("/colors.txt"));
long start = System.currentTimeMillis();
for (int blockx = minx; blockx < maxx; blockx++) {
int iter_minz = ctx
.select(DSL.min(BLOCKS.POSZ))
.from(BLOCKS)
.where(BLOCKS.POSX.eq(blockx).and(y_restriction))
.fetchOne(DSL.min(BLOCKS.POSZ));
int iter_maxz = ctx
.select(DSL.max(BLOCKS.POSZ))
.from(BLOCKS)
.where(BLOCKS.POSX.eq(blockx).and(y_restriction))
.fetchOne(DSL.max(BLOCKS.POSZ));
for (int blockz = iter_minz; blockz < iter_maxz; blockz++) {
System.out.println("x=" + blockx + " z=" + blockz);
Result<BlocksRecord> blocks = ctx
.selectFrom(BLOCKS)
.where(
BLOCKS.POSX.eq(blockx)
.and(BLOCKS.POSZ.eq(blockz))
.and(y_restriction)
)
.orderBy(BLOCKS.POSY.desc())
.fetch();
if (blocks.isEmpty())
continue;
int graphics_offset_x = (blockx - minx) * 16;
int graphics_offset_z = (z_extent * 16) - ((blockz - minz) * 16);
Graphics blockGraphics = graphics.create(graphics_offset_x, graphics_offset_z, 16, 16);
MapBlockRenderer renderer = new MapBlockRenderer(blockGraphics, colorTable);
renderer.render(blocks);
}
}
graphics.dispose();
ImageIO.write(image, "png", new File("target/output.png"));
long diff = System.currentTimeMillis() - start;
System.out.println("Fetching of " + block_count + " mapblocks took " + diff + " ms");
dataSource.close();
}
}

View File

@ -1,89 +0,0 @@
package io.rudin.minetest.tileserver;
import static io.rudin.minetest.tileserver.blockdb.tables.Blocks.BLOCKS;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import org.jooq.DSLContext;
import org.jooq.Result;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import io.rudin.minetest.tileserver.blockdb.tables.records.BlocksRecord;
public class FetchMapSingle {
private static final Logger logger = LoggerFactory.getLogger(FetchMapSingle.class);
public static void main(String[] args) throws Exception {
System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "DEBUG");
HikariConfig cfg = new HikariConfig();
cfg.setUsername("postgres");
cfg.setPassword("enter");
cfg.setJdbcUrl("jdbc:postgresql://10.0.0.131:5432/minetest");
cfg.setDriverClassName("org.postgresql.Driver");
HikariDataSource dataSource = new HikariDataSource(cfg);
DSLContext ctx = DSL.using(dataSource, SQLDialect.POSTGRES);
int blockx = -106;
int blockz = -11;
int absolute_x = blockx * 16;
int absolute_z = blockz * 16;
logger.info("Absolute address: x/z = {}/{} to {}/{}", absolute_x, absolute_z, absolute_x+16, absolute_z+16);
BufferedImage image = new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, 16, 16);
ColorTable colorTable = new ColorTable();
colorTable.load(FetchMapSingle.class.getResourceAsStream("/colors.txt"));
long start = System.currentTimeMillis();
Result<BlocksRecord> blocks = ctx
.selectFrom(BLOCKS)
.where(
BLOCKS.POSX.eq(blockx)
.and(BLOCKS.POSZ.eq(blockz))
)
.orderBy(BLOCKS.POSY.desc())
.fetch();
Graphics blockGraphics = graphics.create(0, 0, 16, 16);
MapBlockRenderer renderer = new MapBlockRenderer(blockGraphics, colorTable);
renderer.render(blocks);
graphics.dispose();
ImageIO.write(image, "png", new File("target/output.png"));
long diff = System.currentTimeMillis() - start;
System.out.println("Fetching took " + diff + " ms");
dataSource.close();
}
}