diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/font/Font.java b/src/main/java/ru/windcorp/progressia/client/graphics/font/Font.java index efbc3cc..744a997 100755 --- a/src/main/java/ru/windcorp/progressia/client/graphics/font/Font.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/font/Font.java @@ -108,6 +108,10 @@ public class Font { return withStyle(getStyle() | Typeface.Style.SHADOW); } + public Font deriveOutlined() { + return withStyle(getStyle() | Typeface.Style.OUTLINED); + } + public Font deriveNotBold() { return withStyle(getStyle() & ~Typeface.Style.BOLD); } @@ -128,6 +132,10 @@ public class Font { return withStyle(getStyle() & ~Typeface.Style.SHADOW); } + public Font deriveNotOutlined() { + return withStyle(getStyle() & ~Typeface.Style.OUTLINED); + } + public Font withAlign(float align) { return new Font(getTypeface(), getStyle(), align, getColor()); } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/font/SpriteTypeface.java b/src/main/java/ru/windcorp/progressia/client/graphics/font/SpriteTypeface.java index fbdee47..ab552ab 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/font/SpriteTypeface.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/font/SpriteTypeface.java @@ -430,6 +430,10 @@ public abstract class SpriteTypeface extends Typeface { return w.align * (w.totalSize.x - w.currentWidth); } + private static final float[][] OUTLINE_DIRECTIONS = new float[][] { + {0, 1}, {1, 0}, {-1, 0}, {0, -1} + }; + private void drawLine(Drawer drawer, Workspace workspace) { int style = workspace.styles.peek(); @@ -440,6 +444,29 @@ public abstract class SpriteTypeface extends Typeface { drawPlainLine(drawer, workspace); + } else if (Style.isOutlined(style)) { + + workspace.pushStyle(~Style.OUTLINED); + + drawLine(drawer, workspace); // TODO figure out why placing this line after drawing outline reverses order of display (should be the opposite) + workspace.pos.x = xToRestore; + + Colors.multiplyRGB(workspace.pushColor(), getShadowColorMultiplier()); + + for (int i = 0; i < OUTLINE_DIRECTIONS.length; ++i) { + float[] direction = OUTLINE_DIRECTIONS[i]; + + workspace.pushTransform().translate(direction[0] * getThickness(), direction[1] * getThickness(), 0); + drawLine(drawer, workspace); + workspace.transforms.pop(); + + if (i != OUTLINE_DIRECTIONS.length - 1) workspace.pos.x = xToRestore; + } + + workspace.colors.pop(); + + workspace.styles.pop(); + } else if (Style.hasShadow(style)) { workspace.pushStyle(~Style.SHADOW); diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/font/Typeface.java b/src/main/java/ru/windcorp/progressia/client/graphics/font/Typeface.java index 6620377..2bb7379 100755 --- a/src/main/java/ru/windcorp/progressia/client/graphics/font/Typeface.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/font/Typeface.java @@ -16,7 +16,8 @@ public abstract class Typeface extends Named { ITALIC = 1 << 1, UNDERLINED = 1 << 2, STRIKETHRU = 1 << 3, - SHADOW = 1 << 4; + SHADOW = 1 << 4, + OUTLINED = 1 << 5; public static final int PLAIN = 0; @@ -39,6 +40,10 @@ public abstract class Typeface extends Named { public static boolean hasShadow(int style) { return (style & SHADOW) != 0; } + + public static boolean isOutlined(int style) { + return (style & OUTLINED) != 0; + } } public static final float ALIGN_LEFT = 0; diff --git a/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java index 4921c7d..4012087 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java +++ b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java @@ -47,7 +47,7 @@ public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer { public boolean isBlockOpaque(); } - public static interface OpaqueTile { + public static interface OpaqueSurface { public Texture getTexture(BlockFace face); public boolean isOpaque(BlockFace face); } @@ -67,7 +67,7 @@ public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer { static final int NO_OPAQUE_TILES = -1; int topOpaqueTile = NO_OPAQUE_TILES; - final OpaqueTile[] tiles = new OpaqueTile[TILES_PER_FACE]; + final OpaqueSurface[] tiles = new OpaqueSurface[TILES_PER_FACE]; int tileCount = 0; } @@ -100,8 +100,8 @@ public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer { @Override public void processTile(TileRender tile, Vec3i pos, BlockFace face) { - if (!(tile instanceof OpaqueTile)) return; - OpaqueTile opaqueTile = (OpaqueTile) tile; + if (!(tile instanceof OpaqueSurface)) return; + OpaqueSurface opaqueTile = (OpaqueSurface) tile; addTile(pos, face, opaqueTile); } @@ -109,7 +109,7 @@ public class ChunkRenderOptimizerCube extends ChunkRenderOptimizer { getBlock(pos).block = cube; } - private void addTile(Vec3i pos, BlockFace face, OpaqueTile opaqueTile) { + private void addTile(Vec3i pos, BlockFace face, OpaqueSurface opaqueTile) { FaceInfo faceInfo = getFace(pos, face); int index = faceInfo.tileCount; diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderGrass.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderGrass.java index e5bf8fa..ed71936 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderGrass.java +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderGrass.java @@ -9,10 +9,10 @@ import ru.windcorp.progressia.client.graphics.model.ShapeRenderProgram; import ru.windcorp.progressia.client.graphics.model.Renderable; import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram; -import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerCube.OpaqueTile; +import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerCube.OpaqueSurface; import ru.windcorp.progressia.common.world.block.BlockFace; -public class TileRenderGrass extends TileRender implements OpaqueTile { +public class TileRenderGrass extends TileRender implements OpaqueSurface { private final Texture topTexture; private final Texture sideTexture; diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderOpaqueSurface.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderOpaqueSurface.java new file mode 100644 index 0000000..05f1900 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderOpaqueSurface.java @@ -0,0 +1,17 @@ +package ru.windcorp.progressia.client.world.tile; + +import ru.windcorp.progressia.client.graphics.texture.Texture; +import ru.windcorp.progressia.common.world.block.BlockFace; + +public class TileRenderOpaqueSurface extends TileRenderSurface { + + public TileRenderOpaqueSurface(String id, Texture texture) { + super(id, texture); + } + + @Override + public boolean isOpaque(BlockFace face) { + return true; + } + +} diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSimple.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSurface.java similarity index 74% rename from src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSimple.java rename to src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSurface.java index 8d62740..43719ee 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSimple.java +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderSurface.java @@ -9,22 +9,16 @@ import ru.windcorp.progressia.client.graphics.model.ShapeRenderProgram; import ru.windcorp.progressia.client.graphics.model.Renderable; import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram; -import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerCube.OpaqueTile; +import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerCube.OpaqueSurface; import ru.windcorp.progressia.common.world.block.BlockFace; -public class TileRenderSimple extends TileRender implements OpaqueTile { +public abstract class TileRenderSurface extends TileRender implements OpaqueSurface { private final Texture texture; - private final boolean opaque; - public TileRenderSimple(String id, Texture texture, boolean opaque) { + public TileRenderSurface(String id, Texture texture) { super(id); this.texture = texture; - this.opaque = opaque; - } - - public TileRenderSimple(String id, Texture texture) { - this(id, texture, false); } @Override @@ -32,11 +26,6 @@ public class TileRenderSimple extends TileRender implements OpaqueTile { return texture; } - @Override - public boolean isOpaque(BlockFace face) { - return opaque; - } - @Override public Renderable createRenderable(BlockFace face) { ShapeRenderProgram program = WorldRenderProgram.getDefault(); diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderTransparentSurface.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderTransparentSurface.java new file mode 100644 index 0000000..6239d47 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderTransparentSurface.java @@ -0,0 +1,17 @@ +package ru.windcorp.progressia.client.world.tile; + +import ru.windcorp.progressia.client.graphics.texture.Texture; +import ru.windcorp.progressia.common.world.block.BlockFace; + +public class TileRenderTransparentSurface extends TileRenderSurface { + + public TileRenderTransparentSurface(String id, Texture texture) { + super(id, texture); + } + + @Override + public boolean isOpaque(BlockFace face) { + return false; + } + +} diff --git a/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java b/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java index 924ed98..8974e46 100755 --- a/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java +++ b/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java @@ -48,7 +48,17 @@ public class LayerTestGUI extends GUILayer { Collection