From ca068c92b292ac248e162c2de64757f53b02020b Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 19 Aug 2016 19:34:04 -0400 Subject: [PATCH] v0.4.2: added the ability for tilemaps to selectively not render certain tiles --- .../main/java/com/watabou/noosa/Tilemap.java | 109 +++++++++++------- .../shatteredpixeldungeon/DungeonTilemap.java | 6 + 2 files changed, 71 insertions(+), 44 deletions(-) diff --git a/SPD-classes/src/main/java/com/watabou/noosa/Tilemap.java b/SPD-classes/src/main/java/com/watabou/noosa/Tilemap.java index f271fcc7e..029b0bcff 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/Tilemap.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/Tilemap.java @@ -44,6 +44,8 @@ public class Tilemap extends Visual { private float cellH; protected float[] vertices; + protected short[] bufferPositions; + protected short bufferLength; protected FloatBuffer quads; public Rect updated; @@ -71,58 +73,71 @@ public class Tilemap extends Visual { mapWidth = cols; mapHeight = data.length / cols; size = mapWidth * mapHeight; - + bufferPositions = new short[size]; + for (int i = 0; i < bufferPositions.length; i++) + bufferPositions[i] = -1; + width = cellW * mapWidth; height = cellH * mapHeight; - + quads = Quad.createSet( size ); - + updated.set( 0, 0, mapWidth, mapHeight ); } - + protected void updateVertices() { - + float y1 = cellH * updated.top; float y2 = y1 + cellH; - + for (int i=updated.top; i < updated.bottom; i++) { - + float x1 = cellW * updated.left; float x2 = x1 + cellW; - + int pos = i * mapWidth + updated.left; quads.position( 16 * pos ); - + for (int j=updated.left; j < updated.right; j++) { - RectF uv = tileset.get( data[pos++] ); - - vertices[0] = x1; - vertices[1] = y1; - - vertices[2] = uv.left; - vertices[3] = uv.top; - - vertices[4] = x2; - vertices[5] = y1; - - vertices[6] = uv.right; - vertices[7] = uv.top; - - vertices[8] = x2; - vertices[9] = y2; - - vertices[10] = uv.right; - vertices[11] = uv.bottom; - - vertices[12] = x1; - vertices[13] = y2; - - vertices[14] = uv.left; - vertices[15] = uv.bottom; - - quads.put( vertices ); - + if (needsRender(pos)) { + int bufferPos = bufferPositions[pos]; + if (bufferPos == -1){ + bufferPos = bufferPositions[pos] = bufferLength; + bufferLength ++; + } + + quads.position(bufferPos*16); + RectF uv = tileset.get( data[pos] ); + + vertices[0] = x1; + vertices[1] = y1; + + vertices[2] = uv.left; + vertices[3] = uv.top; + + vertices[4] = x2; + vertices[5] = y1; + + vertices[6] = uv.right; + vertices[7] = uv.top; + + vertices[8] = x2; + vertices[9] = y2; + + vertices[10] = uv.right; + vertices[11] = uv.bottom; + + vertices[12] = x1; + vertices[13] = y2; + + vertices[14] = uv.left; + vertices[15] = uv.bottom; + + quads.put( vertices ); + } + + pos++; x1 = x2; x2 += cellW; @@ -137,24 +152,30 @@ public class Tilemap extends Visual { @Override public void draw() { - + super.draw(); - + NoosaScript script = NoosaScript.get(); - + texture.bind(); - + script.uModel.valueM4( matrix ); script.lighting( rm, gm, bm, am, ra, ga, ba, aa ); - + if (!updated.isEmpty()) { + quads.limit(quads.capacity()); updateVertices(); + quads.limit(bufferLength); } - + script.camera( camera ); - script.drawQuadSet( quads, size ); + script.drawQuadSet( quads, bufferLength ); } + + protected boolean needsRender(int pos){ + return true; + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/DungeonTilemap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/DungeonTilemap.java index 41349c0f9..4a1ebb84b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/DungeonTilemap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/DungeonTilemap.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.watabou.noosa.Image; import com.watabou.noosa.TextureFilm; import com.watabou.noosa.Tilemap; @@ -99,4 +100,9 @@ public class DungeonTilemap extends Tilemap { public boolean overlapsScreenPoint( int x, int y ) { return true; } + + @Override + protected boolean needsRender(int pos) { + return Level.discoverable[pos] && Dungeon.level.map[pos] != Terrain.WATER; + } }