From 307d8d2b101fe0251c41efd0cab2a462c1811172 Mon Sep 17 00:00:00 2001 From: ondra Date: Sat, 26 Apr 2014 23:19:16 +0200 Subject: [PATCH] ufog, green hat, map zoom, Sides, remade tile renderers --- res/img/dudes-b.png | Bin 0 -> 875 bytes res/img/dudes.xcf | Bin 8401 -> 8601 bytes res/img/tiles16.png | Bin 4791 -> 4917 bytes res/img/tiles16.xcf | Bin 13470 -> 11533 bytes src/mightypork/rogue/Res.java | 25 ++-- .../screens/gamescreen/world/MapView.java | 29 ++++- src/mightypork/rogue/world/Sides.java | 45 +++++++ src/mightypork/rogue/world/WorldRenderer.java | 41 +++--- .../rogue/world/gen/ScratchMap.java | 53 +++----- .../rogue/world/gen/rooms/SimpleRectRoom.java | 3 +- .../world/level/render/TileRenderContext.java | 8 +- src/mightypork/rogue/world/tile/Tile.java | 6 + .../rogue/world/tile/TileModel.java | 3 + .../rogue/world/tile/TileRenderer.java | 117 +++++++++++++++++- src/mightypork/rogue/world/tile/Tiles.java | 8 +- .../rogue/world/tile/models/AbstractTile.java | 6 + .../tile/renderers/BasicTileRenderer.java | 2 +- .../world/tile/renderers/DoorRenderer.java | 2 +- .../world/tile/renderers/FloorRenderer.java | 81 ------------ .../tile/renderers/NullTileRenderer.java | 3 +- .../world/tile/renderers/WallRenderer.java | 11 -- 21 files changed, 266 insertions(+), 177 deletions(-) create mode 100644 res/img/dudes-b.png create mode 100644 src/mightypork/rogue/world/Sides.java delete mode 100644 src/mightypork/rogue/world/tile/renderers/FloorRenderer.java delete mode 100644 src/mightypork/rogue/world/tile/renderers/WallRenderer.java diff --git a/res/img/dudes-b.png b/res/img/dudes-b.png new file mode 100644 index 0000000000000000000000000000000000000000..bba1327bfb4b07a0fa35d7ff5118fff02ce90605 GIT binary patch literal 875 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqitVW|ZuZHtFM& z?QwQ5za)BSL3fUxknjx7=ETAh1>Yz70h3=RDD2uM;56|{0(Zvj6ORM>WBOnBZ=RsM z^Sk!WnA@*E*XZ4U@BBVPw{`RGJ#j(x-~R52S*<#=FmsFET;DD7`TM6EKd>o$u72!B zsK|w^t=}JqzC6FAQ-`H}p&Jux$@0s=QCcZe z=SPQaz8SLl=9TvIsh*dD6s<2TxhGTS-MVHOP=4mw9kH_n%IlOO53*JGXYF>c+V|_J z6QgQo-CChN({8oSd3?`XzRV}?w(YBoF7=c@r6>Hq_%4V&VY#m4#@F>H;t#}S+1F=V znF?ARtJk^lXU6B9EI+!R=eeZ+Eu+epZW0_|1V4uiyD?* z^}Rl6$*aWgYHRa$of9?v5cFyC9tOR&4U3f*Kkxs}Ussy*|Jeqob^E8!lArc^_Tfjr z?mzEdkZ{q7>&E2zKd*b=pW7Wi`R(l8z5mpon0~PT?EP;~y1xHhasTu?ai2FbFtOGI zuPGG?n51O#!HHQ#)415`#m|<${!I-{m4V_4^BEL*yDuEL@O^*mwSdQqpRs>l)aU<) zi9^gFi@Evzee2Bk^Y2WIzVq_G^O+4l5AIp*BY8|@c4(OvTom`JG&9#sA2_L-8Sm?n2%3CL_uS3j3^P6YAB zC^8I}+KS=+e0skE({oeArs}fZ@4h@K#ccnxA!nc_(5nx-$#E8BH6Yx!#Wu8wDInZ7 z;qo33t_lLgA{0lFg1{=qEe^=%r&vYVXdz10o^ryOp0a#AdC0%#Ti1o=#*jZNRl_y? c3Uj^?i|1@oHPW726JlYC{2KL9QuS-oKYEhT>;M1& delta 393 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 E4_+pGsQ>@~ delta 5216 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 W%*2)dXpun^FvvCh&&eCgp#BT(bE&NW diff --git a/src/mightypork/rogue/Res.java b/src/mightypork/rogue/Res.java index 6b4d6c5..93078f4 100644 --- a/src/mightypork/rogue/Res.java +++ b/src/mightypork/rogue/Res.java @@ -80,7 +80,7 @@ public final class Res { textures.addQuad("panel", gui.makeQuad(0, 3.75, 4, .25)); // sprites - texture = textures.loadTexture("mob", "/res/img/dudes.png", FilterMode.NEAREST, WrapMode.CLAMP); + texture = textures.loadTexture("mob", "/res/img/dudes-b.png", FilterMode.NEAREST, WrapMode.CLAMP); tiles = texture.grid(8, 8); textures.addSheet("player", tiles.makeSheet(0, 0, 4, 1)); @@ -96,13 +96,24 @@ public final class Res { textures.addQuad("tile.shadow.n", tiles.makeQuad(0, 7)); textures.addQuad("tile.shadow.s", tiles.makeQuad(0, 7).flipY()); - textures.addQuad("tile.shadow.w", tiles.makeQuad(2, 7)); - textures.addQuad("tile.shadow.e", tiles.makeQuad(2, 7).flipX()); + textures.addQuad("tile.shadow.w", tiles.makeQuad(1, 7)); + textures.addQuad("tile.shadow.e", tiles.makeQuad(1, 7).flipX()); - textures.addQuad("tile.shadow.nw", tiles.makeQuad(1, 7)); - textures.addQuad("tile.shadow.ne", tiles.makeQuad(1, 7).flipX()); - textures.addQuad("tile.shadow.sw", tiles.makeQuad(1, 7).flipY()); - textures.addQuad("tile.shadow.se", tiles.makeQuad(1, 7).flipY().flipX()); + textures.addQuad("tile.shadow.nw", tiles.makeQuad(2, 7)); + textures.addQuad("tile.shadow.ne", tiles.makeQuad(2, 7).flipX()); + textures.addQuad("tile.shadow.sw", tiles.makeQuad(2, 7).flipY()); + textures.addQuad("tile.shadow.se", tiles.makeQuad(2, 7).flipY().flipX()); + + // unexplored fog + textures.addQuad("tile.ufog.n", tiles.makeQuad(3, 7)); + textures.addQuad("tile.ufog.s", tiles.makeQuad(3, 7).flipY()); + textures.addQuad("tile.ufog.w", tiles.makeQuad(4, 7)); + textures.addQuad("tile.ufog.e", tiles.makeQuad(4, 7).flipX()); + + textures.addQuad("tile.ufog.nw", tiles.makeQuad(5, 7)); + textures.addQuad("tile.ufog.ne", tiles.makeQuad(5, 7).flipX()); + textures.addQuad("tile.ufog.sw", tiles.makeQuad(5, 7).flipY()); + textures.addQuad("tile.ufog.se", tiles.makeQuad(5, 7).flipY().flipX()); } diff --git a/src/mightypork/rogue/screens/gamescreen/world/MapView.java b/src/mightypork/rogue/screens/gamescreen/world/MapView.java index 467b2b6..112abff 100644 --- a/src/mightypork/rogue/screens/gamescreen/world/MapView.java +++ b/src/mightypork/rogue/screens/gamescreen/world/MapView.java @@ -9,28 +9,36 @@ import mightypork.gamecore.control.events.input.KeyListener; import mightypork.gamecore.control.events.input.MouseButtonEvent; import mightypork.gamecore.control.events.input.MouseButtonListener; import mightypork.gamecore.gui.components.InputComponent; +import mightypork.gamecore.input.Keys; import mightypork.rogue.world.Coord; import mightypork.rogue.world.PlayerControl; import mightypork.rogue.world.World; import mightypork.rogue.world.WorldRenderer; import mightypork.rogue.world.entity.Entity; import mightypork.rogue.world.entity.models.EntityMoveListener; +import mightypork.util.math.Easing; +import mightypork.util.math.constraints.num.Num; +import mightypork.util.math.constraints.num.mutable.NumAnimated; import mightypork.util.math.constraints.vect.Vect; +import mightypork.util.timing.Updateable; -public class MapView extends InputComponent implements KeyListener, MouseButtonListener, EntityMoveListener { +public class MapView extends InputComponent implements KeyListener, MouseButtonListener, EntityMoveListener, Updateable { protected final WorldRenderer worldRenderer; protected final World world; private final PlayerControl pc; private final Set plugins = new HashSet<>(); + private Num tileSize; + private final NumAnimated zoom = new NumAnimated(0, Easing.SINE_BOTH); public MapView(World world) { this.world = world; - this.worldRenderer = new WorldRenderer(world, this, 12, 8, 32);//8, 8, 64 + this.tileSize = height().min(width()).div(8).max(32).mul(Num.make(1).sub(zoom.mul(0.66))); + this.worldRenderer = new WorldRenderer(world, this, tileSize); pc = world.getPlayerControl(); pc.addMoveListener(this); } @@ -109,6 +117,16 @@ public class MapView extends InputComponent implements KeyListener, MouseButtonL p.onKey(this, pc, event.getKey(), event.isDown()); } + if(event.getKey() == Keys.Z) { + if(event.isDown()) { + zoom.fadeIn(1); + } else { + zoom.fadeOut(1); + } + + + } + // don't consume key events, can be useful for others. } @@ -117,4 +135,11 @@ public class MapView extends InputComponent implements KeyListener, MouseButtonL { plugins.add(plugin); } + + + @Override + public void update(double delta) + { + zoom.update(delta); + } } diff --git a/src/mightypork/rogue/world/Sides.java b/src/mightypork/rogue/world/Sides.java new file mode 100644 index 0000000..78e018a --- /dev/null +++ b/src/mightypork/rogue/world/Sides.java @@ -0,0 +1,45 @@ +package mightypork.rogue.world; + + +public class Sides { + + //@formatter:off + public static final byte NW = (byte) 0b10000000; + public static final byte N = 0b01000000; + public static final byte NE = 0b00100000; + public static final byte E = 0b00010000; + public static final byte SE = 0b00001000; + public static final byte S = 0b00000100; + public static final byte SW = 0b00000010; + public static final byte W = 0b00000001; + + public static final byte CARDINAL = N|S|E|W; + public static final byte DIAGONAL = NE|NW|SE|SW; + + public static final byte NW_CORNER = W|NW|N; + public static final byte NE_CORNER = E|NE|N; + public static final byte SW_CORNER = W|SW|S; + public static final byte SE_CORNER = E|SE|S; + + private final static Coord[] side = { + Coord.make(-1, -1), + Coord.make(0, -1), + Coord.make(1, -1), + Coord.make(1, 0), + Coord.make(1, 1), + Coord.make(0, 1), + Coord.make(-1, 1), + Coord.make(-1, 0) + }; + //@formatter:on + + public static Coord get(int i) + { + return side[i]; // FIXME Coord is mutable + } + + public static byte bit(int i) + { + return (byte) (1 << (7 - i)); + } +} diff --git a/src/mightypork/rogue/world/WorldRenderer.java b/src/mightypork/rogue/world/WorldRenderer.java index 350956a..016ddb3 100644 --- a/src/mightypork/rogue/world/WorldRenderer.java +++ b/src/mightypork/rogue/world/WorldRenderer.java @@ -10,12 +10,11 @@ import mightypork.rogue.world.level.render.TileRenderContext; import mightypork.util.math.color.RGB; import mightypork.util.math.constraints.Pollable; import mightypork.util.math.constraints.num.Num; -import mightypork.util.math.constraints.num.caching.NumCache; import mightypork.util.math.constraints.rect.Rect; -import mightypork.util.math.constraints.rect.caching.RectCache; +import mightypork.util.math.constraints.rect.RectConst; import mightypork.util.math.constraints.rect.proxy.RectProxy; import mightypork.util.math.constraints.vect.Vect; -import mightypork.util.math.constraints.vect.caching.VectCache; +import mightypork.util.math.constraints.vect.VectConst; /** @@ -27,14 +26,13 @@ public class WorldRenderer extends RectProxy implements Pollable { private static final boolean USE_BATCH_RENDERING = true; - private final VectCache vpCenter; - private final NumCache tileSize; + private final Num tileSize; private final World world; private final Entity player; // can be changed - private RectCache mapRect; + private RectConst mapRect; private Level activeLevel; private final Rect rightShadow; @@ -45,17 +43,13 @@ public class WorldRenderer extends RectProxy implements Pollable { private TileRenderContext trc; - public WorldRenderer(World world, Rect viewport, int xTiles, int yTiles, int minTileSize) - { + public WorldRenderer(World world, Rect viewport, Num tileSize) { super(viewport); this.world = world; this.player = world.getPlayerEntity(); - tileSize = width().div(xTiles).min(height().div(yTiles)).max(minTileSize).cached(); - - final Num th = tileSize.half(); - vpCenter = center().sub(th, th).cached(); + this.tileSize = tileSize; final Num grX = width().perc(30); leftShadow = leftEdge().growRight(grX); @@ -76,21 +70,18 @@ public class WorldRenderer extends RectProxy implements Pollable { if (activeLevel == level) return; activeLevel = level; - mapRect = Rect.make(vpCenter, tileSize.mul(level.getWidth()), tileSize.mul(level.getHeight())).cached(); + mapRect = Rect.make(0, 0, level.getWidth(), level.getHeight()); trc = new TileRenderContext(activeLevel, mapRect); } - private Vect getOffset() + private VectConst getOffset() { final EntityPos pos = player.getPosition(); final double playerX = pos.visualX(); - final double playerY = pos.visualY(); - - final double ts = tileSize.value(); - - return Vect.make((-ts * playerX), (-ts * playerY)); + final double playerY = pos.visualY(); + return Vect.make(-playerX-0.5, -playerY-0.5); } @@ -98,12 +89,16 @@ public class WorldRenderer extends RectProxy implements Pollable { { Render.pushMatrix(); Render.setColor(RGB.WHITE); + Render.translate(center()); + Render.scaleXY(tileSize.value()); Render.translate(getOffset()); + // tiles to render final EntityPos pos = player.getPosition(); final double w = width().value(); final double h = height().value(); + final double ts = tileSize.value(); final int xtilesh = (int) (w / (ts * 2)) + 1; @@ -167,8 +162,8 @@ public class WorldRenderer extends RectProxy implements Pollable { public Coord getClickedTile(Vect clickPos) { - final Vect v = clickPos.sub(mapRect.origin().add(getOffset())); final int ts = (int) tileSize.value(); + final Vect v = clickPos.sub(center().add(getOffset().mul(ts))); return new Coord(v.xi() / ts, v.yi() / ts); } @@ -176,12 +171,6 @@ public class WorldRenderer extends RectProxy implements Pollable { @Override public void poll() { - // in order of dependency - vpCenter.poll(); - tileSize.poll(); - - mapRect.poll(); - rebuildTiles(); } diff --git a/src/mightypork/rogue/world/gen/ScratchMap.java b/src/mightypork/rogue/world/gen/ScratchMap.java index 802206f..e7233a2 100644 --- a/src/mightypork/rogue/world/gen/ScratchMap.java +++ b/src/mightypork/rogue/world/gen/ScratchMap.java @@ -8,6 +8,7 @@ import java.util.Random; import java.util.Set; import mightypork.rogue.world.Coord; +import mightypork.rogue.world.Sides; import mightypork.rogue.world.level.Level; import mightypork.rogue.world.pathfinding.Heuristic; import mightypork.rogue.world.pathfinding.PathFinder; @@ -21,19 +22,6 @@ import mightypork.util.math.Calc; public class ScratchMap { - //@formatter:off - public static final Coord[] MOVES = { - Coord.make(-1, 0), - Coord.make(-1, -1), - Coord.make(0, -1), - Coord.make(1, -1), - Coord.make(1, 0), - Coord.make(1, 1), - Coord.make(0, 1), - Coord.make(-1, 1) - }; - //@formatter:on - private Tile[][] map; private final int width; private final int height; @@ -88,9 +76,6 @@ public class ScratchMap { private final Random rand; private Coord enterPoint; - public static final byte CARDINAL = (byte) 0b10101010; - public static final byte DIAGONAL = (byte) 0b01010101; - private static final boolean FIX_GLITCHES = true; @@ -341,12 +326,12 @@ public class ScratchMap { public byte findWalls(Coord pos) { byte walls = 0; - for (int i = 0; i <= 7; i++) { - final Coord cc = pos.add(MOVES[i]); + for (int i = 0; i < 8; i++) { + final Coord cc = pos.add(Sides.get(i)); if (!isIn(cc)) continue; if (get(cc).isWall()) { - walls |= 1 << (7 - i); + walls |= Sides.bit(i); } } return walls; @@ -357,11 +342,11 @@ public class ScratchMap { { byte floors = 0; for (int i = 0; i <= 7; i++) { - final Coord cc = pos.add(MOVES[i]); + final Coord cc = pos.add(Sides.get(i)); if (!isIn(cc)) continue; if (get(cc).isFloor()) { - floors |= 1 << (7 - i); + floors |= Sides.bit(i); } } return floors; @@ -372,11 +357,11 @@ public class ScratchMap { { byte doors = 0; for (int i = 0; i <= 7; i++) { - final Coord cc = pos.add(MOVES[i]); + final Coord cc = pos.add(Sides.get(i)); if (!isIn(cc)) continue; if (get(cc).isDoor()) { - doors |= 1 << (7 - i); + doors |= Sides.bit(i); } } return doors; @@ -387,10 +372,10 @@ public class ScratchMap { { byte nils = 0; for (int i = 0; i <= 7; i++) { - final Coord cc = pos.add(MOVES[i]); + final Coord cc = pos.add(Sides.get(i)); if (!isIn(cc) || get(cc).isNull()) { - nils |= 1 << (7 - i); + nils |= Sides.bit(i); } } return nils; @@ -432,12 +417,12 @@ public class ScratchMap { break; } - if (isFloor && (nils & CARDINAL) != 0) { + if (isFloor && (nils & Sides.CARDINAL) != 0) { toWall = true; // floor with adjacent cardinal null break; } - if (isNull && (floors & DIAGONAL) != 0) { + if (isNull && (floors & Sides.DIAGONAL) != 0) { System.out.println(c); toWall = true; // null with adjacent diagonal floor break; @@ -445,25 +430,25 @@ public class ScratchMap { if (isDoor) { - if (countBits((byte) (floors & CARDINAL)) < 2) { + if (countBits((byte) (floors & Sides.CARDINAL)) < 2) { toWall = true; break; } - if (countBits((byte) (walls & CARDINAL)) > 2) { + if (countBits((byte) (walls & Sides.CARDINAL)) > 2) { toWall = true; break; } - if (countBits((byte) (floors & CARDINAL)) > 2) { + if (countBits((byte) (floors & Sides.CARDINAL)) > 2) { toFloor = true; break; } - if ((floors & 0b11100000) == 0b11100000) toWall = true; - if ((floors & 0b00111000) == 0b00111000) toWall = true; - if ((floors & 0b00001110) == 0b00001110) toWall = true; - if ((floors & 0b10000011) == 0b10000011) toWall = true; + if ((floors & Sides.NW_CORNER) == Sides.NW_CORNER) toWall = true; + if ((floors & Sides.NE_CORNER) == Sides.NE_CORNER) toWall = true; + if ((floors & Sides.SW_CORNER) == Sides.SW_CORNER) toWall = true; + if ((floors & Sides.SE_CORNER) == Sides.SE_CORNER) toWall = true; } } while (false); diff --git a/src/mightypork/rogue/world/gen/rooms/SimpleRectRoom.java b/src/mightypork/rogue/world/gen/rooms/SimpleRectRoom.java index f2dea0f..43b0fe5 100644 --- a/src/mightypork/rogue/world/gen/rooms/SimpleRectRoom.java +++ b/src/mightypork/rogue/world/gen/rooms/SimpleRectRoom.java @@ -4,6 +4,7 @@ package mightypork.rogue.world.gen.rooms; import java.util.Random; import mightypork.rogue.world.Coord; +import mightypork.rogue.world.Sides; import mightypork.rogue.world.gen.RoomBuilder; import mightypork.rogue.world.gen.RoomDesc; import mightypork.rogue.world.gen.ScratchMap; @@ -49,7 +50,7 @@ public class SimpleRectRoom implements RoomBuilder { break; } - if ((map.findDoors(door) & map.CARDINAL) == 0) { + if ((map.findDoors(door) & Sides.CARDINAL) == 0) { map.set(door, theme.door()); } } diff --git a/src/mightypork/rogue/world/level/render/TileRenderContext.java b/src/mightypork/rogue/world/level/render/TileRenderContext.java index 6a81cbf..7cdbe1c 100644 --- a/src/mightypork/rogue/world/level/render/TileRenderContext.java +++ b/src/mightypork/rogue/world/level/render/TileRenderContext.java @@ -42,13 +42,12 @@ public final class TileRenderContext extends MapRenderContext implements RectBou /** * Get a neighbor tile * - * @param offsetX x offset (left-right) - * @param offsetY y offset (up-down) + * @param offset offsets * @return the tile at that position */ - public Tile getAdjacentTile(int offsetX, int offsetY) + public Tile getAdjacentTile(Coord offset) { - return map.getTile(pos.add(offsetX, offsetY)); + return map.getTile(pos.add(offset)); } @@ -63,6 +62,7 @@ public final class TileRenderContext extends MapRenderContext implements RectBou public void renderTile() { + if(!map.getTile(pos).isExplored()) return; map.getTile(pos).renderTile(this); } diff --git a/src/mightypork/rogue/world/tile/Tile.java b/src/mightypork/rogue/world/tile/Tile.java index bfe0126..b7b495c 100644 --- a/src/mightypork/rogue/world/tile/Tile.java +++ b/src/mightypork/rogue/world/tile/Tile.java @@ -219,4 +219,10 @@ public final class Tile implements IonBinary { { data.explored = true; } + + + public boolean doesReceiveShadow() + { + return model.doesReceiveShadow(); + } } diff --git a/src/mightypork/rogue/world/tile/TileModel.java b/src/mightypork/rogue/world/tile/TileModel.java index 56931ee..18adb30 100644 --- a/src/mightypork/rogue/world/tile/TileModel.java +++ b/src/mightypork/rogue/world/tile/TileModel.java @@ -53,6 +53,9 @@ public abstract class TileModel { public abstract boolean doesCastShadow(); + + + public abstract boolean doesReceiveShadow(); public boolean isNullTile() diff --git a/src/mightypork/rogue/world/tile/TileRenderer.java b/src/mightypork/rogue/world/tile/TileRenderer.java index 71a48c0..8359994 100644 --- a/src/mightypork/rogue/world/tile/TileRenderer.java +++ b/src/mightypork/rogue/world/tile/TileRenderer.java @@ -1,9 +1,13 @@ package mightypork.rogue.world.tile; - +import mightypork.gamecore.render.Render; +import mightypork.gamecore.render.textures.TxQuad; +import mightypork.rogue.Res; +import mightypork.rogue.world.Sides; import mightypork.rogue.world.item.Item; import mightypork.rogue.world.level.render.TileRenderContext; import mightypork.rogue.world.tile.renderers.NullTileRenderer; +import mightypork.util.math.constraints.rect.Rect; /** @@ -15,9 +19,38 @@ public abstract class TileRenderer { public static final TileRenderer NONE = new NullTileRenderer(); + private static TxQuad SH_N, SH_S, SH_E, SH_W, SH_NW, SH_NE, SH_SW, SH_SE; + private static TxQuad UFOG_N, UFOG_S, UFOG_E, UFOG_W, UFOG_NW, UFOG_NE, UFOG_SW, UFOG_SE; + + + private static boolean inited; + private DroppedItemRenderer itemRenderer; + public TileRenderer() { + if (!inited) { + SH_N = Res.getTxQuad("tile.shadow.n"); + SH_S = Res.getTxQuad("tile.shadow.s"); + SH_E = Res.getTxQuad("tile.shadow.e"); + SH_W = Res.getTxQuad("tile.shadow.w"); + SH_NW = Res.getTxQuad("tile.shadow.nw"); + SH_NE = Res.getTxQuad("tile.shadow.ne"); + SH_SW = Res.getTxQuad("tile.shadow.sw"); + SH_SE = Res.getTxQuad("tile.shadow.se"); + + UFOG_N = Res.getTxQuad("tile.ufog.n"); + UFOG_S = Res.getTxQuad("tile.ufog.s"); + UFOG_E = Res.getTxQuad("tile.ufog.e"); + UFOG_W = Res.getTxQuad("tile.ufog.w"); + UFOG_NW = Res.getTxQuad("tile.ufog.nw"); + UFOG_NE = Res.getTxQuad("tile.ufog.ne"); + UFOG_SW = Res.getTxQuad("tile.ufog.sw"); + UFOG_SE = Res.getTxQuad("tile.ufog.se"); + } + } + + /** * Update tile renderer * @@ -36,7 +69,87 @@ public abstract class TileRenderer { * * @param context */ - public abstract void render(TileRenderContext context); + public final void render(TileRenderContext context) + { + Tile t = context.getTile(); + if (t.isNull() || !t.isExplored()) return; + + renderTile(context); + + if (t.doesReceiveShadow()) renderShadows(context); + + renderUFog(context); + } + + + protected abstract void renderTile(TileRenderContext context); + + + protected void renderShadows(TileRenderContext context) + { + final TileRenderData trd = context.getTile().renderData; + + if (!trd.shadowsComputed) { + // no shadows computed yet + + trd.shadows = 0; // reset the mask + + for (int i = 0; i < 8; i++) { + final Tile t2 = context.getAdjacentTile(Sides.get(i)); + if (t2.doesCastShadow()) { + trd.shadows |= Sides.bit(i); + } + } + + trd.shadowsComputed = true; + } + + if (trd.shadows == 0) return; + final Rect rect = context.getRect(); + + if ((trd.shadows & Sides.NW) != 0) Render.quadTextured(rect, SH_NW); + if ((trd.shadows & Sides.N) != 0) Render.quadTextured(rect, SH_N); + if ((trd.shadows & Sides.NE) != 0) Render.quadTextured(rect, SH_NE); + + if ((trd.shadows & Sides.W) != 0) Render.quadTextured(rect, SH_W); + if ((trd.shadows & Sides.E) != 0) Render.quadTextured(rect, SH_E); + + if ((trd.shadows & Sides.SW) != 0) Render.quadTextured(rect, SH_SW); + if ((trd.shadows & Sides.S) != 0) Render.quadTextured(rect, SH_S); + if ((trd.shadows & Sides.SE) != 0) Render.quadTextured(rect, SH_SE); + } + + + protected void renderUFog(TileRenderContext context) + { + + // TODO cache in tile, update neighbouring tiles upon "explored" flag changed. + + byte ufog = 0; + + ufog = 0; // reset the mask + + for (int i = 0; i < 8; i++) { + final Tile t2 = context.getAdjacentTile(Sides.get(i)); + if (t2.isNull() || !t2.isExplored()) { + ufog |= Sides.bit(i); + } + } + + if (ufog == 0) return; + + final Rect rect = context.getRect(); + if ((ufog & Sides.NW_CORNER) == Sides.NW) Render.quadTextured(rect, UFOG_NW); + if ((ufog & Sides.N) != 0) Render.quadTextured(rect, UFOG_N); + if ((ufog & Sides.NE_CORNER) == Sides.NE) Render.quadTextured(rect, UFOG_NE); + + if ((ufog & Sides.W) != 0) Render.quadTextured(rect, UFOG_W); + if ((ufog & Sides.E) != 0) Render.quadTextured(rect, UFOG_E); + + if ((ufog & Sides.SW_CORNER) == Sides.SW) Render.quadTextured(rect, UFOG_SW); + if ((ufog & Sides.S) != 0) Render.quadTextured(rect, UFOG_S); + if ((ufog & Sides.SE_CORNER) == Sides.SE) Render.quadTextured(rect, UFOG_SE); + } public void renderItemOnTile(Item item, TileRenderContext context) diff --git a/src/mightypork/rogue/world/tile/Tiles.java b/src/mightypork/rogue/world/tile/Tiles.java index d8eab77..39b95d0 100644 --- a/src/mightypork/rogue/world/tile/Tiles.java +++ b/src/mightypork/rogue/world/tile/Tiles.java @@ -5,9 +5,7 @@ import mightypork.rogue.world.tile.models.Floor; import mightypork.rogue.world.tile.models.NullTile; import mightypork.rogue.world.tile.models.SimpleDoor; import mightypork.rogue.world.tile.models.Wall; -import mightypork.rogue.world.tile.renderers.FloorRenderer; -import mightypork.rogue.world.tile.renderers.WallRenderer; - +import mightypork.rogue.world.tile.renderers.BasicTileRenderer; /** * Tile registry @@ -20,8 +18,8 @@ public final class Tiles { public static final TileModel NULL = new NullTile(0); - public static final TileModel FLOOR_DARK = new Floor(10).setRenderer(new FloorRenderer("tile.floor.dark")); - public static final TileModel WALL_BRICK = new Wall(11).setRenderer(new WallRenderer("tile.wall.brick")); + public static final TileModel FLOOR_DARK = new Floor(10).setRenderer(new BasicTileRenderer("tile.floor.dark")); + public static final TileModel WALL_BRICK = new Wall(11).setRenderer(new BasicTileRenderer("tile.wall.brick")); public static final TileModel DOOR = new SimpleDoor(12); diff --git a/src/mightypork/rogue/world/tile/models/AbstractTile.java b/src/mightypork/rogue/world/tile/models/AbstractTile.java index cdbf74b..37d09df 100644 --- a/src/mightypork/rogue/world/tile/models/AbstractTile.java +++ b/src/mightypork/rogue/world/tile/models/AbstractTile.java @@ -47,6 +47,12 @@ public abstract class AbstractTile extends TileModel { return false; } + @Override + public boolean doesReceiveShadow() + { + return isFloor(); + } + @Override @DefaultImpl diff --git a/src/mightypork/rogue/world/tile/renderers/BasicTileRenderer.java b/src/mightypork/rogue/world/tile/renderers/BasicTileRenderer.java index 31e3193..ef99a73 100644 --- a/src/mightypork/rogue/world/tile/renderers/BasicTileRenderer.java +++ b/src/mightypork/rogue/world/tile/renderers/BasicTileRenderer.java @@ -21,7 +21,7 @@ public class BasicTileRenderer extends TileRenderer { @Override - public void render(TileRenderContext context) + public void renderTile(TileRenderContext context) { final Rect rect = context.getRect(); Render.quadTextured(rect, sheet.getRandomQuad(context.getTileNoise())); diff --git a/src/mightypork/rogue/world/tile/renderers/DoorRenderer.java b/src/mightypork/rogue/world/tile/renderers/DoorRenderer.java index 8bbadd7..09b483a 100644 --- a/src/mightypork/rogue/world/tile/renderers/DoorRenderer.java +++ b/src/mightypork/rogue/world/tile/renderers/DoorRenderer.java @@ -24,7 +24,7 @@ public class DoorRenderer extends TileRenderer { @Override - public void render(TileRenderContext context) + public void renderTile(TileRenderContext context) { final Tile t = context.getTile(); final Rect rect = context.getRect(); diff --git a/src/mightypork/rogue/world/tile/renderers/FloorRenderer.java b/src/mightypork/rogue/world/tile/renderers/FloorRenderer.java deleted file mode 100644 index fe23492..0000000 --- a/src/mightypork/rogue/world/tile/renderers/FloorRenderer.java +++ /dev/null @@ -1,81 +0,0 @@ -package mightypork.rogue.world.tile.renderers; - - -import mightypork.gamecore.render.Render; -import mightypork.gamecore.render.textures.TxQuad; -import mightypork.rogue.Res; -import mightypork.rogue.world.level.render.TileRenderContext; -import mightypork.rogue.world.tile.Tile; -import mightypork.rogue.world.tile.TileRenderData; -import mightypork.util.math.constraints.rect.Rect; - - -public class FloorRenderer extends BasicTileRenderer { - - private static boolean inited; - private static TxQuad SH_N, SH_S, SH_E, SH_W, SH_NW, SH_NE, SH_SW, SH_SE; - - - public FloorRenderer(String sheetKey) - { - super(sheetKey); - - if (!inited) { - SH_N = Res.getTxQuad("tile.shadow.n"); - SH_S = Res.getTxQuad("tile.shadow.s"); - SH_E = Res.getTxQuad("tile.shadow.e"); - SH_W = Res.getTxQuad("tile.shadow.w"); - SH_NW = Res.getTxQuad("tile.shadow.nw"); - SH_NE = Res.getTxQuad("tile.shadow.ne"); - SH_SW = Res.getTxQuad("tile.shadow.sw"); - SH_SE = Res.getTxQuad("tile.shadow.se"); - } - } - - - @Override - public void render(TileRenderContext context) - { - super.render(context); - - final Rect rect = context.getRect(); - - final TileRenderData trd = context.getTile().renderData; - - if (!trd.shadowsComputed) { - // no shadows computed yet - - trd.shadows = 0; // reset the mask - - int move = 0; - for (int y = -1; y <= 1; y++) { - for (int x = -1; x <= 1; x++) { - if (x == 0 && y == 0) continue; - - final Tile t2 = context.getAdjacentTile(x, y); - - if (t2.doesCastShadow()) { - trd.shadows |= 1 << move; - } - - move++; - } - } - - trd.shadowsComputed = true; - } - - if (trd.shadows == 0) return; - - if ((trd.shadows & (1 << 0)) != 0) Render.quadTextured(rect, SH_NW); - if ((trd.shadows & (1 << 1)) != 0) Render.quadTextured(rect, SH_N); - if ((trd.shadows & (1 << 2)) != 0) Render.quadTextured(rect, SH_NE); - - if ((trd.shadows & (1 << 3)) != 0) Render.quadTextured(rect, SH_W); - if ((trd.shadows & (1 << 4)) != 0) Render.quadTextured(rect, SH_E); - - if ((trd.shadows & (1 << 5)) != 0) Render.quadTextured(rect, SH_SW); - if ((trd.shadows & (1 << 6)) != 0) Render.quadTextured(rect, SH_S); - if ((trd.shadows & (1 << 7)) != 0) Render.quadTextured(rect, SH_SE); - } -} diff --git a/src/mightypork/rogue/world/tile/renderers/NullTileRenderer.java b/src/mightypork/rogue/world/tile/renderers/NullTileRenderer.java index d19a424..71a1a39 100644 --- a/src/mightypork/rogue/world/tile/renderers/NullTileRenderer.java +++ b/src/mightypork/rogue/world/tile/renderers/NullTileRenderer.java @@ -8,9 +8,8 @@ import mightypork.rogue.world.tile.TileRenderer; public class NullTileRenderer extends TileRenderer { @Override - public void render(TileRenderContext context) + protected void renderTile(TileRenderContext context) { - // nope } } diff --git a/src/mightypork/rogue/world/tile/renderers/WallRenderer.java b/src/mightypork/rogue/world/tile/renderers/WallRenderer.java deleted file mode 100644 index 3a440f4..0000000 --- a/src/mightypork/rogue/world/tile/renderers/WallRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -package mightypork.rogue.world.tile.renderers; - - -public class WallRenderer extends BasicTileRenderer { - - public WallRenderer(String sheetKey) - { - super(sheetKey); - } - -}