From 8b488d3fe8e45bb98135828f72d0614a72306a9f Mon Sep 17 00:00:00 2001 From: Raph Hennessy Date: Sun, 11 Aug 2019 16:22:31 +1000 Subject: [PATCH 1/8] Try to store highest tile per x --- .../rockbottom/render/WorldRenderer.java | 4 +++ .../rockbottom/world/AbstractWorld.java | 31 +++++++++++++++++++ .../de/ellpeck/rockbottom/world/Chunk.java | 13 ++++++++ 3 files changed, 48 insertions(+) diff --git a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java index f75dfd95..608e56bf 100644 --- a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java +++ b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java @@ -230,6 +230,10 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa this.random.setSeed(layer.getName().hashCode()); g.addFilledRect(worldX - this.transX + x, -worldY - this.transY + 1F - chunk.getHeightInner(layer, x), 1F, 0.1F, Colors.random(this.random)); } + int highest = world.getHighestTile(x, world.getChunkHeight(TileLayer.MAIN, worldX, worldY), false); + if (highest >= chunk.getY() && highest <= chunk.getY() + Constants.CHUNK_SIZE) { + g.addFilledRect(worldX - this.transX + x, -highest - this.transY + 1F, 1F, 0.1F, Colors.YELLOW); + } } if (biomeDebug) { diff --git a/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java b/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java index 4d9198f7..602bfb7d 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java +++ b/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java @@ -6,6 +6,8 @@ import de.ellpeck.rockbottom.api.assets.IAssetManager; import de.ellpeck.rockbottom.api.data.set.DataSet; import de.ellpeck.rockbottom.api.data.set.ModBasedDataSet; +import de.ellpeck.rockbottom.api.data.set.part.DataPart; +import de.ellpeck.rockbottom.api.data.set.part.num.PartInt; import de.ellpeck.rockbottom.api.entity.Entity; import de.ellpeck.rockbottom.api.entity.player.AbstractEntityPlayer; import de.ellpeck.rockbottom.api.event.EventResult; @@ -61,6 +63,9 @@ public abstract class AbstractWorld implements IWorld { private BiomeGen biomeGen; private HeightGen heightGen; + // Maps every x position to the y position of the highest tile in the chunk + private Map highestTileLookup = new HashMap<>(); + public AbstractWorld(File worldDirectory, long seed) { this.seed = seed; @@ -169,12 +174,22 @@ public void loadWorldData(DataSet set) { this.time = set.getInt("time"); this.totalTime = set.getInt("total_time"); this.timeFrozen = set.getBoolean("time_frozen"); + DataSet highestTileSet = set.getDataSet("highest_tiles"); + this.highestTileLookup = new HashMap<>(); + for (Map.Entry entry : highestTileSet.getData().entrySet()) { + this.highestTileLookup.put(Integer.parseInt(entry.getKey()), ((PartInt)entry.getValue()).get()); + } } public void saveWorldData(DataSet set) { set.addInt("time", this.time); set.addInt("total_time", this.totalTime); set.addBoolean("time_frozen", this.timeFrozen); + DataSet highestTileSet = new DataSet(); + for (Map.Entry entry : this.highestTileLookup.entrySet()) { + highestTileSet.addInt(entry.getKey().toString(), entry.getValue()); + } + set.addDataSet("highest_tiles", highestTileSet); } protected void updateChunksAndTime(IGameInstance game) { @@ -550,6 +565,22 @@ public void destroyTile(int x, int y, TileLayer layer, Entity destroyer, boolean this.setState(layer, x, y, GameContent.TILE_AIR.getDefState()); } + @Override + public int getHighestTile(int x, int fallback, boolean setFallback) { + if (this.highestTileLookup.containsKey(x)) { + int highest = this.highestTileLookup.get(x); + return highest; + } + if (setFallback) this.highestTileLookup.put(x, fallback); + return fallback; + } + + @Override + public void setHighestTile(int x, int y) { + System.out.println("Set highest tile at " + x + " to " + y); + this.highestTileLookup.put(x, y); + } + @Override public int getSpawnX() { return 0; diff --git a/src/main/java/de/ellpeck/rockbottom/world/Chunk.java b/src/main/java/de/ellpeck/rockbottom/world/Chunk.java index b579b7b8..12f61d85 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/Chunk.java +++ b/src/main/java/de/ellpeck/rockbottom/world/Chunk.java @@ -2,6 +2,7 @@ import com.google.common.base.Preconditions; import de.ellpeck.rockbottom.api.*; +import de.ellpeck.rockbottom.api.construction.compendium.construction.ConstructionRecipe; import de.ellpeck.rockbottom.api.data.set.DataSet; import de.ellpeck.rockbottom.api.data.set.ModBasedDataSet; import de.ellpeck.rockbottom.api.data.set.part.PartDataSet; @@ -376,6 +377,18 @@ public void setStateInner(TileLayer layer, int x, int y, TileState state) { int[] heights = this.heights.computeIfAbsent(layer, l -> new int[Constants.CHUNK_SIZE]); if (heights[x] < newHeight || heights[x] == y + 1) { + + int actualX = getX() + x; + int realOld = getY() + heights[x]; + int realNew = getY() + newHeight; + int curHighest = world.getHighestTile(actualX, realNew, true); + if (realNew > curHighest || realOld == curHighest) world.setHighestTile(actualX, realNew); + else if (world.isPosLoaded(actualX, curHighest)) { + TileState highestState = world.getState(TileLayer.MAIN, actualX, curHighest); + if (!highestState.getTile().isFullTile()) world.setHighestTile(actualX, realNew); + } + //System.out.println(getX() + ":" + getGridX() + ":" + x); + heights[x] = newHeight; Set uniqueHeights = new HashSet<>(); From 421d5394f121d78efb043e85553f16ec2afb81cc Mon Sep 17 00:00:00 2001 From: Raph Hennessy Date: Sun, 11 Aug 2019 19:03:00 +1000 Subject: [PATCH 2/8] Calculate heightmap before updating new tiles --- .../rockbottom/render/WorldRenderer.java | 4 +- .../rockbottom/world/AbstractWorld.java | 1 - .../de/ellpeck/rockbottom/world/Chunk.java | 100 +++++++++--------- 3 files changed, 52 insertions(+), 53 deletions(-) diff --git a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java index 608e56bf..85ebbbdb 100644 --- a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java +++ b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java @@ -230,9 +230,9 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa this.random.setSeed(layer.getName().hashCode()); g.addFilledRect(worldX - this.transX + x, -worldY - this.transY + 1F - chunk.getHeightInner(layer, x), 1F, 0.1F, Colors.random(this.random)); } - int highest = world.getHighestTile(x, world.getChunkHeight(TileLayer.MAIN, worldX, worldY), false); + int highest = world.getHighestTile(worldX + x, world.getChunkHeight(TileLayer.MAIN, worldX, worldY), false); if (highest >= chunk.getY() && highest <= chunk.getY() + Constants.CHUNK_SIZE) { - g.addFilledRect(worldX - this.transX + x, -highest - this.transY + 1F, 1F, 0.1F, Colors.YELLOW); + g.addFilledRect(worldX - this.transX + x, -highest - this.transY + 1.1F, 1F, 0.1F, Colors.YELLOW); } } diff --git a/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java b/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java index 602bfb7d..46e4706b 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java +++ b/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java @@ -577,7 +577,6 @@ public int getHighestTile(int x, int fallback, boolean setFallback) { @Override public void setHighestTile(int x, int y) { - System.out.println("Set highest tile at " + x + " to " + y); this.highestTileLookup.put(x, y); } diff --git a/src/main/java/de/ellpeck/rockbottom/world/Chunk.java b/src/main/java/de/ellpeck/rockbottom/world/Chunk.java index 12f61d85..0dc2eb39 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/Chunk.java +++ b/src/main/java/de/ellpeck/rockbottom/world/Chunk.java @@ -317,79 +317,68 @@ public void setStateInner(int x, int y, TileState tile) { } @Override - public void setStateInner(TileLayer layer, int x, int y, TileState state) { - SetStateEvent event = new SetStateEvent(this, state, layer, x, y); + public void setStateInner(TileLayer layer, int setStateX, int setStateY, TileState setState) { + SetStateEvent event = new SetStateEvent(this, setState, layer, setStateX, setStateY); if (RockBottomAPI.getEventHandler().fireEvent(event) != EventResult.CANCELLED) { - state = event.state; + setState = event.state; layer = event.layer; - x = event.x; - y = event.y; + setStateX = event.x; + setStateY = event.y; - Preconditions.checkNotNull(state, "Tried setting null tile in chunk at " + this.gridX + ", " + this.gridY + '!'); + Preconditions.checkNotNull(setState, "Tried setting null tile in chunk at " + this.gridX + ", " + this.gridY + '!'); Preconditions.checkNotNull(layer, "Tried setting tile to null layer in chunk at " + this.gridX + ", " + this.gridY + '!'); - TileState lastState = this.getStateInner(layer, x, y); - if (state != lastState) { - Tile tile = state.getTile(); - Preconditions.checkArgument(layer.canTileBeInLayer(this.world, this.x + x, this.y + y, tile), "Tried setting tile " + state + " at " + (this.x + x) + ", " + (this.y + y) + " on layer " + layer + " that doesn't allow it!"); + TileState lastState = this.getStateInner(layer, setStateX, setStateY); + if (setState != lastState) { + Tile setTile = setState.getTile(); + Preconditions.checkArgument(layer.canTileBeInLayer(this.world, this.x + setStateX, this.y + setStateY, setTile), "Tried setting tile " + setState + " at " + (this.x + setStateX) + ", " + (this.y + setStateY) + " on layer " + layer + " that doesn't allow it!"); Tile lastTile = lastState.getTile(); - boolean oldHeightMap = lastTile.factorsIntoHeightMap(this.world, this.x + x, this.y + y, layer); + boolean oldTileHadHeightmap = lastTile.factorsIntoHeightMap(this.world, this.x + setStateX, this.y + setStateY, layer); - if (tile != lastTile) { - lastTile.onRemoved(this.world, this.x + x, this.y + y, layer); + if (setTile != lastTile) { + lastTile.onRemoved(this.world, this.x + setStateX, this.y + setStateY, layer); if (layer.canHoldTileEntities() && lastTile.canProvideTileEntity()) { - this.removeTileEntity(layer, this.x + x, this.y + y); + this.removeTileEntity(layer, this.x + setStateX, this.y + setStateY); } } - TileState[][] grid = this.getGrid(layer, !tile.isAir()); + TileState[][] grid = this.getGrid(layer, !setTile.isAir()); if (grid != null) { - grid[x][y] = state; - } - - if (tile != lastTile) { - if (layer.canHoldTileEntities() && tile.canProvideTileEntity()) { - TileEntity tileEntity = tile.provideTileEntity(this.world, this.x + x, this.y + y, layer); - if (tileEntity != null) { - this.addTileEntity(tileEntity); - } - } - - tile.onAdded(this.world, this.x + x, this.y + y, layer); + grid[setStateX][setStateY] = setState; } - boolean newHeightMap = tile.factorsIntoHeightMap(this.world, this.x + x, this.y + y, layer); - if (newHeightMap != oldHeightMap) { + boolean newTileHasHeightmap = setTile.factorsIntoHeightMap(this.world, this.x + setStateX, this.y + setStateY, layer); + if (newTileHasHeightmap != oldTileHadHeightmap) { int newHeight = 0; - if (!newHeightMap) { - for (int checkY = y - 1; checkY >= 0; checkY--) { - if (this.getStateInner(layer, x, checkY).getTile().factorsIntoHeightMap(this.world, this.x + x, this.y + checkY, layer)) { + if (!newTileHasHeightmap) { + for (int checkY = setStateY - 1; checkY >= 0; checkY--) { + TileState checkState = this.getStateInner(layer, setStateX, checkY); + if (checkState.getTile().factorsIntoHeightMap(this.world, this.x + setStateX, this.y + checkY, layer)) { newHeight = checkY + 1; break; } } } else { - newHeight = y + 1; + newHeight = setStateY + 1; } int[] heights = this.heights.computeIfAbsent(layer, l -> new int[Constants.CHUNK_SIZE]); - if (heights[x] < newHeight || heights[x] == y + 1) { - - int actualX = getX() + x; - int realOld = getY() + heights[x]; - int realNew = getY() + newHeight; - int curHighest = world.getHighestTile(actualX, realNew, true); - if (realNew > curHighest || realOld == curHighest) world.setHighestTile(actualX, realNew); - else if (world.isPosLoaded(actualX, curHighest)) { - TileState highestState = world.getState(TileLayer.MAIN, actualX, curHighest); - if (!highestState.getTile().isFullTile()) world.setHighestTile(actualX, realNew); - } - //System.out.println(getX() + ":" + getGridX() + ":" + x); - heights[x] = newHeight; + int oldHeight = heights[setStateX]; + + if (oldHeight < newHeight || oldHeight == setStateY + 1) { + + if (layer == TileLayer.MAIN) { + int actualX = getX() + setStateX; + int realOld = getY() + heights[setStateX]; + int realNew = getY() + newHeight; + int curHighest = world.getHighestTile(actualX, realNew, true); + if (realNew > curHighest || realOld == curHighest) world.setHighestTile(actualX, realNew); + } + heights[setStateX] = newHeight; Set uniqueHeights = new HashSet<>(); int totalHeight = 0; @@ -405,15 +394,26 @@ else if (world.isPosLoaded(actualX, curHighest)) { } if (!this.isGenerating) { - this.world.causeLightUpdate(this.x + x, this.y + y); - this.world.notifyNeighborsOfChange(this.x + x, this.y + y, layer); + this.world.causeLightUpdate(this.x + setStateX, this.y + setStateY); + this.world.notifyNeighborsOfChange(this.x + setStateX, this.y + setStateY, layer); - if (this.world.isServer() && this.getStateInner(layer, x, y) == state) { - RockBottomAPI.getNet().sendToAllPlayersWithLoadedPos(this.world, new PacketTileChange(this.x + x, this.y + y, layer, this.world.getIdForState(state)), this.x + x, this.y + y); + if (this.world.isServer() && this.getStateInner(layer, setStateX, setStateY) == setState) { + RockBottomAPI.getNet().sendToAllPlayersWithLoadedPos(this.world, new PacketTileChange(this.x + setStateX, this.y + setStateY, layer, this.world.getIdForState(setState)), this.x + setStateX, this.y + setStateY); } this.setDirty(); } + + if (setTile != lastTile) { + if (layer.canHoldTileEntities() && setTile.canProvideTileEntity()) { + TileEntity tileEntity = setTile.provideTileEntity(this.world, this.x + setStateX, this.y + setStateY, layer); + if (tileEntity != null) { + this.addTileEntity(tileEntity); + } + } + + setTile.onAdded(this.world, this.x + setStateX, this.y + setStateY, layer); + } } } } From 9eeeb74fe9c748a82fa7f5a5712d70d1b977851c Mon Sep 17 00:00:00 2001 From: Raph Hennessy Date: Sun, 11 Aug 2019 21:25:34 +1000 Subject: [PATCH 3/8] Handle empty columns --- .../java/de/ellpeck/rockbottom/world/AbstractWorld.java | 6 ++++++ src/main/java/de/ellpeck/rockbottom/world/Chunk.java | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java b/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java index 46e4706b..dd5733dc 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java +++ b/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java @@ -911,6 +911,12 @@ protected Chunk loadChunk(int gridX, int gridY, boolean isPersistent, boolean en return chunk; } + // TODO: this + protected void findHighestTile(int x, int startY) { + loadChunk(Util.toGridPos(x), Util.toGridPos(startY), false, true); + + } + @Override public void unloadChunk(IChunk chunk) { this.saveChunk(chunk, true); diff --git a/src/main/java/de/ellpeck/rockbottom/world/Chunk.java b/src/main/java/de/ellpeck/rockbottom/world/Chunk.java index 0dc2eb39..42cc5dcc 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/Chunk.java +++ b/src/main/java/de/ellpeck/rockbottom/world/Chunk.java @@ -373,11 +373,16 @@ public void setStateInner(TileLayer layer, int setStateX, int setStateY, TileSta if (layer == TileLayer.MAIN) { int actualX = getX() + setStateX; - int realOld = getY() + heights[setStateX]; + boolean emptyCol = newHeight == 0 && !getStateInner(setStateX, 0).getTile().factorsIntoHeightMap(this.world, actualX, getY(), TileLayer.MAIN); + int realOld = getY() + oldHeight; int realNew = getY() + newHeight; + if (emptyCol) { + realNew = world.getChunkHeight(TileLayer.MAIN, actualX, getY() - Constants.CHUNK_SIZE + 1) + getY() - Constants.CHUNK_SIZE; + } int curHighest = world.getHighestTile(actualX, realNew, true); if (realNew > curHighest || realOld == curHighest) world.setHighestTile(actualX, realNew); } + heights[setStateX] = newHeight; Set uniqueHeights = new HashSet<>(); From f4f0a97aef6f318be1330040df41ecea4ec92def Mon Sep 17 00:00:00 2001 From: Raph Hennessy Date: Sun, 11 Aug 2019 23:04:15 +1000 Subject: [PATCH 4/8] make the world look a lot nicer --- .../rockbottom/world/AbstractWorld.java | 10 +++++++++ .../de/ellpeck/rockbottom/world/Chunk.java | 22 +++++++++---------- .../rockbottom/world/tile/TileFalling.java | 5 +++++ .../rockbottom/world/tile/TileLog.java | 7 ++++++ .../rockbottom/world/tile/TileSoil.java | 5 +++++ 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java b/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java index dd5733dc..b24827a2 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java +++ b/src/main/java/de/ellpeck/rockbottom/world/AbstractWorld.java @@ -565,6 +565,11 @@ public void destroyTile(int x, int y, TileLayer layer, Entity destroyer, boolean this.setState(layer, x, y, GameContent.TILE_AIR.getDefState()); } + @Override + public boolean hasHighestTile(int x) { + return highestTileLookup.containsKey(x); + } + @Override public int getHighestTile(int x, int fallback, boolean setFallback) { if (this.highestTileLookup.containsKey(x)) { @@ -659,6 +664,11 @@ private byte calcLight(int x, int y, boolean isSky, boolean checkGenerating) { } private byte getTileLight(int x, int y, boolean isSky) { + if (isSky && this.hasHighestTile(x)) { + int highestTile = this.getHighestTile(x, y - Constants.CHUNK_SIZE * 4, false); + //if (y > highestTile) return Constants.MAX_LIGHT; + } + int highestLight = 0; boolean nonAir = false; diff --git a/src/main/java/de/ellpeck/rockbottom/world/Chunk.java b/src/main/java/de/ellpeck/rockbottom/world/Chunk.java index 42cc5dcc..7da5ecb2 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/Chunk.java +++ b/src/main/java/de/ellpeck/rockbottom/world/Chunk.java @@ -398,17 +398,6 @@ public void setStateInner(TileLayer layer, int setStateX, int setStateY, TileSta } } - if (!this.isGenerating) { - this.world.causeLightUpdate(this.x + setStateX, this.y + setStateY); - this.world.notifyNeighborsOfChange(this.x + setStateX, this.y + setStateY, layer); - - if (this.world.isServer() && this.getStateInner(layer, setStateX, setStateY) == setState) { - RockBottomAPI.getNet().sendToAllPlayersWithLoadedPos(this.world, new PacketTileChange(this.x + setStateX, this.y + setStateY, layer, this.world.getIdForState(setState)), this.x + setStateX, this.y + setStateY); - } - - this.setDirty(); - } - if (setTile != lastTile) { if (layer.canHoldTileEntities() && setTile.canProvideTileEntity()) { TileEntity tileEntity = setTile.provideTileEntity(this.world, this.x + setStateX, this.y + setStateY, layer); @@ -419,6 +408,17 @@ public void setStateInner(TileLayer layer, int setStateX, int setStateY, TileSta setTile.onAdded(this.world, this.x + setStateX, this.y + setStateY, layer); } + + if (!this.isGenerating) { + this.world.causeLightUpdate(this.x + setStateX, this.y + setStateY); + this.world.notifyNeighborsOfChange(this.x + setStateX, this.y + setStateY, layer); + + if (this.world.isServer() && this.getStateInner(layer, setStateX, setStateY) == setState) { + RockBottomAPI.getNet().sendToAllPlayersWithLoadedPos(this.world, new PacketTileChange(this.x + setStateX, this.y + setStateY, layer, this.world.getIdForState(setState)), this.x + setStateX, this.y + setStateY); + } + + this.setDirty(); + } } } } diff --git a/src/main/java/de/ellpeck/rockbottom/world/tile/TileFalling.java b/src/main/java/de/ellpeck/rockbottom/world/tile/TileFalling.java index 835143c0..7e7222b1 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/tile/TileFalling.java +++ b/src/main/java/de/ellpeck/rockbottom/world/tile/TileFalling.java @@ -38,4 +38,9 @@ public void onChangeAround(IWorld world, int x, int y, TileLayer layer, int chan public void onAdded(IWorld world, int x, int y, TileLayer layer) { tryFall(world, x, y, layer); } + + @Override + public float getTranslucentModifier(IWorld world, int x, int y, TileLayer layer, boolean skylight) { + return layer == TileLayer.BACKGROUND ? 0.9F : 0.7F; + } } diff --git a/src/main/java/de/ellpeck/rockbottom/world/tile/TileLog.java b/src/main/java/de/ellpeck/rockbottom/world/tile/TileLog.java index ee57fb8f..c1cd0472 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/tile/TileLog.java +++ b/src/main/java/de/ellpeck/rockbottom/world/tile/TileLog.java @@ -48,6 +48,13 @@ public void onDestroyed(IWorld world, int x, int y, Entity destroyer, TileLayer } } + + public float getTranslucentModifier(IWorld world, int x, int y, TileLayer layer, boolean skylight) { + if (world.getState(layer, x, y).get(StaticTileProps.LOG_VARIANT).isNatural()) + return skylight ? 1F : layer == TileLayer.BACKGROUND ? 0.9f : 0.8f; + return super.getTranslucentModifier(world, x, y, layer, skylight); + } + private void recursiveTreeCheck(IWorld world, int x, int y, TileLayer layer, int originalY, List alreadyChecked) { for (Direction direction : Direction.ADJACENT) { if (direction != Direction.DOWN) { diff --git a/src/main/java/de/ellpeck/rockbottom/world/tile/TileSoil.java b/src/main/java/de/ellpeck/rockbottom/world/tile/TileSoil.java index 47932c70..c4f3925f 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/tile/TileSoil.java +++ b/src/main/java/de/ellpeck/rockbottom/world/tile/TileSoil.java @@ -26,6 +26,11 @@ public boolean canKeepPlants(IWorld world, int x, int y, TileLayer layer) { return true; } + @Override + public float getTranslucentModifier(IWorld world, int x, int y, TileLayer layer, boolean skylight) { + return layer == TileLayer.BACKGROUND ? 0.9F : 0.7F; + } + @Override public boolean onInteractWith(IWorld world, int x, int y, TileLayer layer, double mouseX, double mouseY, AbstractEntityPlayer player) { ItemInstance selected = player.getInv().get(player.getSelectedSlot()); From 526cfbb48c8eaf3ee56b502c2a0b02965be5a547 Mon Sep 17 00:00:00 2001 From: Raph Hennessy Date: Mon, 12 Aug 2019 12:00:24 +1000 Subject: [PATCH 5/8] Cave Mushrooms emit actual light --- .../rockbottom/render/tile/TileCaveMushroomRenderer.java | 2 +- .../de/ellpeck/rockbottom/world/tile/TileCaveMushroom.java | 4 ++++ .../java/de/ellpeck/rockbottom/world/tile/TileFalling.java | 5 ----- src/main/java/de/ellpeck/rockbottom/world/tile/TileLog.java | 1 - .../java/de/ellpeck/rockbottom/world/tile/TileSoil.java | 5 ----- .../java/de/ellpeck/rockbottom/world/tile/TileWoodDoor.java | 6 ++++++ 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/ellpeck/rockbottom/render/tile/TileCaveMushroomRenderer.java b/src/main/java/de/ellpeck/rockbottom/render/tile/TileCaveMushroomRenderer.java index 86fc31b6..0f6e42a7 100644 --- a/src/main/java/de/ellpeck/rockbottom/render/tile/TileCaveMushroomRenderer.java +++ b/src/main/java/de/ellpeck/rockbottom/render/tile/TileCaveMushroomRenderer.java @@ -16,7 +16,7 @@ public class TileCaveMushroomRenderer extends TileMetaRenderer @Override public void render(IGameInstance game, IAssetManager manager, IRenderer g, IWorld world, TileCaveMushroom tile, TileState state, int x, int y, TileLayer layer, float renderX, float renderY, float scale, int[] light) { for (int i = 0; i < light.length; i++) { - light[i] = Math.max(light[i], Colors.multiply(Colors.WHITE, 0.2F)); + //light[i] = Math.max(light[i], Colors.multiply(Colors.WHITE, 0.2F)); } this.getTexture(manager, tile, state.get(tile.metaProp)).getPositionalVariation(x, y).draw(renderX, renderY, scale, scale, light); } diff --git a/src/main/java/de/ellpeck/rockbottom/world/tile/TileCaveMushroom.java b/src/main/java/de/ellpeck/rockbottom/world/tile/TileCaveMushroom.java index 28916322..44dbe286 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/tile/TileCaveMushroom.java +++ b/src/main/java/de/ellpeck/rockbottom/world/tile/TileCaveMushroom.java @@ -34,6 +34,10 @@ public BoundBox getBoundBox(IWorld world, TileState state, int x, int y, TileLay return null; } + @Override + public int getLight(IWorld world, int x, int y, TileLayer layer) { + return 20; + } @Override public boolean canStay(IWorld world, int x, int y, TileLayer layer, int changedX, int changedY, TileLayer changedLayer) { diff --git a/src/main/java/de/ellpeck/rockbottom/world/tile/TileFalling.java b/src/main/java/de/ellpeck/rockbottom/world/tile/TileFalling.java index 7e7222b1..835143c0 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/tile/TileFalling.java +++ b/src/main/java/de/ellpeck/rockbottom/world/tile/TileFalling.java @@ -38,9 +38,4 @@ public void onChangeAround(IWorld world, int x, int y, TileLayer layer, int chan public void onAdded(IWorld world, int x, int y, TileLayer layer) { tryFall(world, x, y, layer); } - - @Override - public float getTranslucentModifier(IWorld world, int x, int y, TileLayer layer, boolean skylight) { - return layer == TileLayer.BACKGROUND ? 0.9F : 0.7F; - } } diff --git a/src/main/java/de/ellpeck/rockbottom/world/tile/TileLog.java b/src/main/java/de/ellpeck/rockbottom/world/tile/TileLog.java index c1cd0472..ca50fe01 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/tile/TileLog.java +++ b/src/main/java/de/ellpeck/rockbottom/world/tile/TileLog.java @@ -48,7 +48,6 @@ public void onDestroyed(IWorld world, int x, int y, Entity destroyer, TileLayer } } - public float getTranslucentModifier(IWorld world, int x, int y, TileLayer layer, boolean skylight) { if (world.getState(layer, x, y).get(StaticTileProps.LOG_VARIANT).isNatural()) return skylight ? 1F : layer == TileLayer.BACKGROUND ? 0.9f : 0.8f; diff --git a/src/main/java/de/ellpeck/rockbottom/world/tile/TileSoil.java b/src/main/java/de/ellpeck/rockbottom/world/tile/TileSoil.java index c4f3925f..47932c70 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/tile/TileSoil.java +++ b/src/main/java/de/ellpeck/rockbottom/world/tile/TileSoil.java @@ -26,11 +26,6 @@ public boolean canKeepPlants(IWorld world, int x, int y, TileLayer layer) { return true; } - @Override - public float getTranslucentModifier(IWorld world, int x, int y, TileLayer layer, boolean skylight) { - return layer == TileLayer.BACKGROUND ? 0.9F : 0.7F; - } - @Override public boolean onInteractWith(IWorld world, int x, int y, TileLayer layer, double mouseX, double mouseY, AbstractEntityPlayer player) { ItemInstance selected = player.getInv().get(player.getSelectedSlot()); diff --git a/src/main/java/de/ellpeck/rockbottom/world/tile/TileWoodDoor.java b/src/main/java/de/ellpeck/rockbottom/world/tile/TileWoodDoor.java index 554979d6..67c7aae9 100644 --- a/src/main/java/de/ellpeck/rockbottom/world/tile/TileWoodDoor.java +++ b/src/main/java/de/ellpeck/rockbottom/world/tile/TileWoodDoor.java @@ -75,6 +75,12 @@ public boolean onInteractWith(IWorld world, int x, int y, TileLayer layer, doubl } } + public float getTranslucentModifier(IWorld world, int x, int y, TileLayer layer, boolean skylight) { + if (!world.getState(layer, x, y).get(StaticTileProps.OPEN)) + return layer == TileLayer.BACKGROUND ? 0.9F : solidLightPropagation; + return super.getTranslucentModifier(world, x, y, layer, skylight); + } + @Override public void doBreak(IWorld world, int x, int y, TileLayer layer, AbstractEntityPlayer breaker, boolean isRightTool, boolean allowDrop) { if (!world.isClient()) { From 6644caa9ff8a7df9a322cbd3c3f96eab27a4b5c5 Mon Sep 17 00:00:00 2001 From: RAPH HENNESSY Date: Tue, 13 Aug 2019 10:51:43 +1000 Subject: [PATCH 6/8] Pass scale & camera position to shaders --- .../ellpeck/rockbottom/apiimpl/Renderer.java | 4 +- .../rockbottom/assets/tex/Texture.java | 2 +- .../ellpeck/rockbottom/init/RockBottom.java | 7 +++- .../rockbottom/particle/ParticleManager.java | 2 +- .../rockbottom/render/WorldRenderer.java | 39 ++++++++++++------- 5 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/ellpeck/rockbottom/apiimpl/Renderer.java b/src/main/java/de/ellpeck/rockbottom/apiimpl/Renderer.java index cc714787..ca92fd73 100644 --- a/src/main/java/de/ellpeck/rockbottom/apiimpl/Renderer.java +++ b/src/main/java/de/ellpeck/rockbottom/apiimpl/Renderer.java @@ -174,10 +174,10 @@ public void addVertex(float x, float y, int color, float u, float v) { } if (this.scaleX != 1F) { - theX *= this.scaleX; + //theX *= this.scaleX; } if (this.scaleY != 1F) { - theY *= this.scaleY; + //theY *= this.scaleY; } this.program.getProcessor().addVertex(this, theX, theY, color, u, v); diff --git a/src/main/java/de/ellpeck/rockbottom/assets/tex/Texture.java b/src/main/java/de/ellpeck/rockbottom/assets/tex/Texture.java index 5f39bb92..0e39c4ac 100644 --- a/src/main/java/de/ellpeck/rockbottom/assets/tex/Texture.java +++ b/src/main/java/de/ellpeck/rockbottom/assets/tex/Texture.java @@ -147,7 +147,7 @@ public void draw(float x, float y) { @Override public void draw(float x, float y, float scale) { - this.draw(x, y, this.renderWidth * scale, this.renderHeight * scale); + this.draw(x, y, this.renderWidth, this.renderHeight); } @Override diff --git a/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java b/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java index bf143ad6..5bc956eb 100644 --- a/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java +++ b/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java @@ -534,7 +534,6 @@ protected void updateTickless() { this.renderer.cameraY = 0D; } SoundHandler.setListenerPos(this.renderer.cameraX, this.renderer.cameraY); - this.worldRenderer.calcCameraValues(this.renderer); this.render(); @@ -547,6 +546,7 @@ protected void updateTickless() { protected void render() { this.renderer.setDefaultProgram(this.assetManager.getShaderProgram(IShaderProgram.WORLD_SHADER)); + this.worldRenderer.calcCameraValues(this.assetManager, this.renderer); this.renderer.begin(); if (this.player != null) { @@ -556,6 +556,11 @@ protected void render() { this.renderer.setDefaultProgram(this.assetManager.getShaderProgram(IShaderProgram.GUI_SHADER)); float scale = this.renderer.getGuiScale(); + + IShaderProgram guiShader = assetManager.getShaderProgram(IShaderProgram.GUI_SHADER); + guiShader.bind(); + guiShader.setUniform("scale", scale, scale); + this.renderer.setScale(scale, scale); this.guiManager.render(this, this.assetManager, this.renderer, this.player); diff --git a/src/main/java/de/ellpeck/rockbottom/particle/ParticleManager.java b/src/main/java/de/ellpeck/rockbottom/particle/ParticleManager.java index 18d401f1..24c48afa 100644 --- a/src/main/java/de/ellpeck/rockbottom/particle/ParticleManager.java +++ b/src/main/java/de/ellpeck/rockbottom/particle/ParticleManager.java @@ -40,7 +40,7 @@ public void render(IGameInstance game, IAssetManager manager, IRenderer g, IWorl double y = particle.getY(); int light = world.getCombinedVisualLight(Util.floor(x), Util.floor(y)); - particle.render(game, manager, g, (float) x - transX, (float) -y - transY + 1F, RockBottomAPI.getApiHandler().getColorByLight(light, TileLayer.MAIN)); + particle.render(game, manager, g, (float) x, (float) -y + 1F, RockBottomAPI.getApiHandler().getColorByLight(light, TileLayer.MAIN)); }); } diff --git a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java index 85ebbbdb..5aa936e5 100644 --- a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java +++ b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java @@ -77,7 +77,7 @@ public WorldRenderer() { this.addClouds(Util.RANDOM.nextInt(5) + 3, true); } - public void calcCameraValues(IRenderer g) { + public void calcCameraValues(IAssetManager m, IRenderer g) { double width = g.getWidthInWorld(); double height = g.getHeightInWorld(); @@ -99,10 +99,21 @@ public void calcCameraValues(IRenderer g) { this.minY = Util.floor(-this.transY - g.getHeightInWorld() + 1) + offset; this.maxX = Util.ceil(this.transX + g.getWidthInWorld()) - offset; this.maxY = Util.ceil(-this.transY + 1) - offset; + + + IShaderProgram breakShader = m.getShaderProgram(IShaderProgram.BREAK_SHADER); + breakShader.bind(); + breakShader.setUniform("camera", this.transX, this.transY, g.getWorldScale()); + breakShader.unbind(); + + IShaderProgram worldShader = m.getShaderProgram(IShaderProgram.WORLD_SHADER); + worldShader.bind(); + worldShader.setUniform("camera", this.transX, this.transY, g.getWorldScale()); + } public void render(IGameInstance game, IAssetManager manager, ParticleManager particles, IRenderer g, AbstractWorld world, EntityPlayer player, InteractionManager input) { - float scale = g.getWorldScale(); + float scale = 1; this.renderSky(game, manager, g, world, player, g.getWidthInWorld(), g.getHeightInWorld()); @@ -165,16 +176,16 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa } } - renderer.render(game, manager, g, world, entity, (float) x - this.transX, (float) -y - this.transY + 1F, color); + renderer.render(game, manager, g, world, entity, (float) x, (float) -y + 1F, color); if (g.isBoundBoxDebug()) { - g.addFilledRect((float) x - this.transX - 0.1F, (float) -y - this.transY + 0.9F, 0.2F, 0.2F, Colors.GREEN); + g.addFilledRect((float) x - 0.1F, (float) -y + 0.9F, 0.2F, 0.2F, Colors.GREEN); BoundBox box = entity.currentBounds; - g.addEmptyRect((float) box.getMinX() - this.transX, (float) -box.getMaxY() - this.transY + 1F, (float) box.getWidth(), (float) box.getHeight(), 0.1F, Colors.RED); + g.addEmptyRect((float) box.getMinX(), (float) -box.getMaxY() - this.transY + 1F, (float) box.getWidth(), (float) box.getHeight(), 0.1F, Colors.RED); BoundBox boxMotion = box.copy().add(entity.motionX, entity.motionY); - g.addEmptyRect((float) boxMotion.getMinX() - this.transX, (float) -boxMotion.getMaxY() - this.transY + 1F, (float) boxMotion.getWidth(), (float) boxMotion.getHeight(), 0.05F, Colors.YELLOW); + g.addEmptyRect((float) boxMotion.getMinX(), (float) -boxMotion.getMaxY() + 1F, (float) boxMotion.getWidth(), (float) boxMotion.getHeight(), 0.05F, Colors.YELLOW); } } } @@ -189,7 +200,7 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa players.forEach(entity -> { if (entity.shouldRender() && !entity.isLocalPlayer()) { - manager.getFont().drawCenteredString((float) entity.getLerpedX() - this.transX, (float) -entity.getLerpedY() - this.transY - 0.75F, entity.getChatColorFormat() + entity.getName(), 0.015F, false); + manager.getFont().drawCenteredString((float) entity.getLerpedX(), (float) -entity.getLerpedY() - 0.75F, entity.getChatColorFormat() + entity.getName(), 0.015F, false); } }); @@ -219,7 +230,7 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa int worldY = Util.toWorldPos(gridY); if (chunkDebug) { - g.addEmptyRect(worldX - this.transX, -worldY - this.transY + 1F - Constants.CHUNK_SIZE, Constants.CHUNK_SIZE, Constants.CHUNK_SIZE, 0.1F, Colors.GREEN); + g.addEmptyRect(worldX, -worldY + 1F - Constants.CHUNK_SIZE, Constants.CHUNK_SIZE, Constants.CHUNK_SIZE, 0.1F, Colors.GREEN); } if (heightDebug || biomeDebug) { @@ -228,11 +239,11 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa if (heightDebug) { for (TileLayer layer : TileLayer.getLayersByRenderPrio()) { this.random.setSeed(layer.getName().hashCode()); - g.addFilledRect(worldX - this.transX + x, -worldY - this.transY + 1F - chunk.getHeightInner(layer, x), 1F, 0.1F, Colors.random(this.random)); + g.addFilledRect(worldX + x, -worldY + 1F - chunk.getHeightInner(layer, x), 1F, 0.1F, Colors.random(this.random)); } int highest = world.getHighestTile(worldX + x, world.getChunkHeight(TileLayer.MAIN, worldX, worldY), false); if (highest >= chunk.getY() && highest <= chunk.getY() + Constants.CHUNK_SIZE) { - g.addFilledRect(worldX - this.transX + x, -highest - this.transY + 1.1F, 1F, 0.1F, Colors.YELLOW); + g.addFilledRect(worldX + x, -highest + 1.1F, 1F, 0.1F, Colors.YELLOW); } } @@ -240,10 +251,10 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa for (int y = 0; y < Constants.CHUNK_SIZE; y++) { if (!world.isClient()) { this.random.setSeed(chunk.getExpectedBiomeLevel(worldX + x, worldY + y).getName().hashCode()); - g.addFilledRect(worldX - this.transX + x + 0.35F, -worldY - this.transY - y + 0.35F, 0.3F, 0.3F, Colors.random(this.random)); + g.addFilledRect(worldX + x + 0.35F, -worldY - y + 0.35F, 0.3F, 0.3F, Colors.random(this.random)); } this.random.setSeed(chunk.getBiomeInner(x, y).getName().hashCode()); - g.addEmptyRect(worldX - this.transX + x + 0.25F, -worldY - this.transY - y + 0.25F, 0.5F, 0.5F, 0.1F, Colors.random(this.random)); + g.addEmptyRect(worldX + x + 0.25F, -worldY - y + 0.25F, 0.5F, 0.5F, 0.1F, Colors.random(this.random)); } } } @@ -325,11 +336,11 @@ private void renderTile(IGameInstance game, IAssetManager manager, IRenderer g, } if (renderNormal) { - renderer.render(game, manager, g, world, tile, state, x, y, layer, (x - this.transX) * scale, (-y - this.transY) * scale, scale, color); + renderer.render(game, manager, g, world, tile, state, x, y, layer, x, -y, scale, color); } if (renderForeground) { - renderer.renderInForeground(game, manager, g, world, tile, state, x, y, layer, (x - this.transX) * scale, (-y - this.transY) * scale, scale, color); + renderer.renderInForeground(game, manager, g, world, tile, state, x, y, layer, x, y, scale, color); } if (isBreakTile) { From 9bb4c83b8efe94754c7294f5e03d47acb6a58e0b Mon Sep 17 00:00:00 2001 From: RAPH HENNESSY Date: Tue, 13 Aug 2019 11:04:23 +1000 Subject: [PATCH 7/8] whoops I broke the clouds --- .../ellpeck/rockbottom/apiimpl/Renderer.java | 4 +- .../ellpeck/rockbottom/init/RockBottom.java | 2 +- .../rockbottom/particle/ParticleManager.java | 2 +- .../rockbottom/render/WorldRenderer.java | 44 +++++++------------ 4 files changed, 19 insertions(+), 33 deletions(-) diff --git a/src/main/java/de/ellpeck/rockbottom/apiimpl/Renderer.java b/src/main/java/de/ellpeck/rockbottom/apiimpl/Renderer.java index ca92fd73..cc714787 100644 --- a/src/main/java/de/ellpeck/rockbottom/apiimpl/Renderer.java +++ b/src/main/java/de/ellpeck/rockbottom/apiimpl/Renderer.java @@ -174,10 +174,10 @@ public void addVertex(float x, float y, int color, float u, float v) { } if (this.scaleX != 1F) { - //theX *= this.scaleX; + theX *= this.scaleX; } if (this.scaleY != 1F) { - //theY *= this.scaleY; + theY *= this.scaleY; } this.program.getProcessor().addVertex(this, theX, theY, color, u, v); diff --git a/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java b/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java index 5bc956eb..421d48b6 100644 --- a/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java +++ b/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java @@ -561,7 +561,7 @@ protected void render() { guiShader.bind(); guiShader.setUniform("scale", scale, scale); - this.renderer.setScale(scale, scale); + this.renderer.setScale(1, 1); this.guiManager.render(this, this.assetManager, this.renderer, this.player); this.toaster.render(this, this.assetManager, this.renderer); diff --git a/src/main/java/de/ellpeck/rockbottom/particle/ParticleManager.java b/src/main/java/de/ellpeck/rockbottom/particle/ParticleManager.java index 24c48afa..252013c1 100644 --- a/src/main/java/de/ellpeck/rockbottom/particle/ParticleManager.java +++ b/src/main/java/de/ellpeck/rockbottom/particle/ParticleManager.java @@ -31,7 +31,7 @@ public void update(IGameInstance game) { } } - public void render(IGameInstance game, IAssetManager manager, IRenderer g, IWorld world, float transX, float transY) { + public void render(IGameInstance game, IAssetManager manager, IRenderer g, IWorld world) { this.particles.forEach(particle -> { ResourceName program = particle.getRenderShader(game, manager, g); g.setProgram(program == null ? null : manager.getShaderProgram(program)); diff --git a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java index 5aa936e5..f25f99a4 100644 --- a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java +++ b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java @@ -113,7 +113,6 @@ public void calcCameraValues(IAssetManager m, IRenderer g) { } public void render(IGameInstance game, IAssetManager manager, ParticleManager particles, IRenderer g, AbstractWorld world, EntityPlayer player, InteractionManager input) { - float scale = 1; this.renderSky(game, manager, g, world, player, g.getWidthInWorld(), g.getHeightInWorld()); @@ -124,7 +123,7 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa for (int gridX = this.minChunkX; gridX <= this.maxChunkX; gridX++) { if (world.isChunkLoaded(gridX, gridY)) { IChunk chunk = world.getChunkFromGridCoords(gridX, gridY); - this.renderChunk(game, manager, g, input, world, chunk, scale, chunk.getLoadedLayers(), false); + this.renderChunk(game, manager, g, input, world, chunk, chunk.getLoadedLayers(), false); for (Entity entity : chunk.getAllEntities()) { entities.add(entity); @@ -138,8 +137,6 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa } g.setProgram(null); - g.setScale(scale, scale); - entities.stream().sorted(Comparator.comparingInt(Entity::getRenderPriority)).forEach(entity -> { if (entity.shouldRender()) { IEntityRenderer renderer = entity.getRenderer(); @@ -182,7 +179,7 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa g.addFilledRect((float) x - 0.1F, (float) -y + 0.9F, 0.2F, 0.2F, Colors.GREEN); BoundBox box = entity.currentBounds; - g.addEmptyRect((float) box.getMinX(), (float) -box.getMaxY() - this.transY + 1F, (float) box.getWidth(), (float) box.getHeight(), 0.1F, Colors.RED); + g.addEmptyRect((float) box.getMinX(), (float) -box.getMaxY() + 1F, (float) box.getWidth(), (float) box.getHeight(), 0.1F, Colors.RED); BoundBox boxMotion = box.copy().add(entity.motionX, entity.motionY); g.addEmptyRect((float) boxMotion.getMinX(), (float) -boxMotion.getMaxY() + 1F, (float) boxMotion.getWidth(), (float) boxMotion.getHeight(), 0.05F, Colors.YELLOW); @@ -193,10 +190,10 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa }); g.setProgram(null); - particles.render(game, manager, g, world, this.transX, this.transY); + particles.render(game, manager, g, world); g.setProgram(null); - RockBottomAPI.getEventHandler().fireEvent(new WorldRenderEvent(game, manager, g, world, player, this.transX, this.transY)); + RockBottomAPI.getEventHandler().fireEvent(new WorldRenderEvent(game, manager, g, world, player)); players.forEach(entity -> { if (entity.shouldRender() && !entity.isLocalPlayer()) { @@ -204,13 +201,11 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa } }); - g.setScale(1F, 1F); - for (int gridY = this.minChunkY; gridY <= this.maxChunkY; gridY++) { for (int gridX = this.minChunkX; gridX <= this.maxChunkX; gridX++) { if (world.isChunkLoaded(gridX, gridY)) { IChunk chunk = world.getChunkFromGridCoords(gridX, gridY); - this.renderChunk(game, manager, g, input, world, chunk, scale, chunk.getLoadedLayers(), true); + this.renderChunk(game, manager, g, input, world, chunk, chunk.getLoadedLayers(), true); } } } @@ -221,7 +216,6 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa boolean biomeDebug = g.isBiomeDebug(); if (chunkDebug || heightDebug || biomeDebug) { - g.setScale(scale, scale); for (int gridX = this.minChunkX; gridX <= this.maxChunkX; gridX++) { for (int gridY = this.minChunkY; gridY <= this.maxChunkY; gridY++) { @@ -262,12 +256,10 @@ public void render(IGameInstance game, IAssetManager manager, ParticleManager pa } } } - - g.setScale(1F, 1F); } } - private void renderChunk(IGameInstance game, IAssetManager manager, IRenderer g, InteractionManager input, IWorld world, IChunk chunk, float scale, List layers, boolean foreground) { + private void renderChunk(IGameInstance game, IAssetManager manager, IRenderer g, InteractionManager input, IWorld world, IChunk chunk, List layers, boolean foreground) { int chunkX = chunk.getX(); int chunkY = chunk.getY(); @@ -301,13 +293,13 @@ private void renderChunk(IGameInstance game, IAssetManager manager, IRenderer g, } } - this.renderLayer(game, manager, g, input, world, chunk, layer, x, y, scale, color, foreground); + this.renderLayer(game, manager, g, input, world, chunk, layer, x, y, color, foreground); } } } } - private void renderLayer(IGameInstance game, IAssetManager manager, IRenderer g, InteractionManager input, IWorld world, IChunk chunk, TileLayer layer, int x, int y, float scale, int[] color, boolean foreground) { + private void renderLayer(IGameInstance game, IAssetManager manager, IRenderer g, InteractionManager input, IWorld world, IChunk chunk, TileLayer layer, int x, int y, int[] color, boolean foreground) { if (layer.isVisible(game, game.getPlayer(), chunk, x, y, foreground)) { TileState state = chunk.getState(layer, x, y); Tile tile = state.getTile(); @@ -316,15 +308,15 @@ private void renderLayer(IGameInstance game, IAssetManager manager, IRenderer g, if (renderer != null) { if (foreground) { - this.renderTile(game, manager, g, input, world, layer, state, tile, renderer, x, y, scale, color, forcesForeground, true); + this.renderTile(game, manager, g, input, world, layer, state, tile, renderer, x, y, color, forcesForeground, true); } else if (!forcesForeground) { - this.renderTile(game, manager, g, input, world, layer, state, tile, renderer, x, y, scale, color, true, false); + this.renderTile(game, manager, g, input, world, layer, state, tile, renderer, x, y, color, true, false); } } } } - private void renderTile(IGameInstance game, IAssetManager manager, IRenderer g, InteractionManager input, IWorld world, TileLayer layer, TileState state, Tile tile, ITileRenderer renderer, int x, int y, float scale, int[] color, boolean renderNormal, boolean renderForeground) { + private void renderTile(IGameInstance game, IAssetManager manager, IRenderer g, InteractionManager input, IWorld world, TileLayer layer, TileState state, Tile tile, ITileRenderer renderer, int x, int y, int[] color, boolean renderNormal, boolean renderForeground) { boolean isBreakTile = input.breakingLayer == layer && input.breakProgress > 0 && x == input.breakTileX && y == input.breakTileY; if (isBreakTile) { @@ -336,11 +328,11 @@ private void renderTile(IGameInstance game, IAssetManager manager, IRenderer g, } if (renderNormal) { - renderer.render(game, manager, g, world, tile, state, x, y, layer, x, -y, scale, color); + renderer.render(game, manager, g, world, tile, state, x, y, layer, x, -y, 1, color); } if (renderForeground) { - renderer.renderInForeground(game, manager, g, world, tile, state, x, y, layer, x, y, scale, color); + renderer.renderInForeground(game, manager, g, world, tile, state, x, y, layer, x, y, 1, color); } if (isBreakTile) { @@ -360,11 +352,7 @@ private void renderSky(IGameInstance game, IAssetManager manager, IRenderer g, A int skyColor = SKY_COLORS[skyLight]; g.backgroundColor(skyColor); - float scale = g.getWorldScale(); - g.setScale(scale, scale); - int time = world.getCurrentTime(); - float worldScale = game.getSettings().renderScale; float starAlpha = 1F - Math.min(1F, skylightMod + 0.5F); if (starAlpha <= 0F) { @@ -387,8 +375,8 @@ private void renderSky(IGameInstance game, IAssetManager manager, IRenderer g, A } } - double radiusX = 10D / worldScale; - double radiusY = 7D / worldScale; + double radiusX = 10D; + double radiusY = 7D; double sunAngle = (time / (double) Constants.TIME_PER_DAY) * 360D + 180D; double sunRads = Math.toRadians(sunAngle); @@ -406,8 +394,6 @@ private void renderSky(IGameInstance game, IAssetManager manager, IRenderer g, A for (Cloud cloud : this.clouds) { cloud.render(manager, width, height, skylightMod, yOff); } - - g.setScale(1F, 1F); } public void update(IWorld world, IParticleManager manager) { From ab68c2005cec6717ee6ff46966f24898d74ac9c4 Mon Sep 17 00:00:00 2001 From: Raph Hennessy Date: Tue, 13 Aug 2019 15:39:10 +1000 Subject: [PATCH 8/8] Fix the sky --- .../assets/shader/ShaderProgram.java | 21 ++++++++++------ .../ellpeck/rockbottom/init/RockBottom.java | 12 +-------- .../rockbottom/render/WorldRenderer.java | 25 +++++++++++-------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/main/java/de/ellpeck/rockbottom/assets/shader/ShaderProgram.java b/src/main/java/de/ellpeck/rockbottom/assets/shader/ShaderProgram.java index 2d235426..069c280e 100644 --- a/src/main/java/de/ellpeck/rockbottom/assets/shader/ShaderProgram.java +++ b/src/main/java/de/ellpeck/rockbottom/assets/shader/ShaderProgram.java @@ -80,7 +80,7 @@ public void link() { } @Override - public void bind() { + public IShaderProgram bind() { if (boundProgram != this.id) { boundProgram = this.id; boundProgramRef = this; @@ -92,6 +92,7 @@ public void bind() { GL20.glEnableVertexAttribArray(i); } } + return this; } @Override @@ -116,35 +117,40 @@ public void pointVertexAttribute(String name, int size) { } @Override - public void setUniform(String name, Matrix4f matrix) { + public IShaderProgram setUniform(String name, Matrix4f matrix) { int location = this.getUniformLocation(name); MemoryStack stack = MemoryStack.stackPush(); GL20.glUniformMatrix4fv(location, false, matrix.get(stack.mallocFloat(4 * 4))); stack.pop(); + return this; } @Override - public void setUniform(String name, int value) { + public IShaderProgram setUniform(String name, int value) { GL20.glUniform1i(this.getUniformLocation(name), value); + return this; } @Override - public void setUniform(String name, float f) { + public IShaderProgram setUniform(String name, float f) { GL20.glUniform1f(this.getUniformLocation(name), f); + return this; } @Override - public void setUniform(String name, float x, float y) { + public IShaderProgram setUniform(String name, float x, float y) { GL20.glUniform2f(this.getUniformLocation(name), x, y); + return this; } @Override - public void setUniform(String name, float x, float y, float z) { + public IShaderProgram setUniform(String name, float x, float y, float z) { GL20.glUniform3f(this.getUniformLocation(name), x, y, z); + return this; } @Override - public void unbind() { + public IShaderProgram unbind() { if (boundProgram == this.id) { for (int i : this.attributeLocations.values()) { GL20.glDisableVertexAttribArray(i); @@ -156,6 +162,7 @@ public void unbind() { boundProgram = -1; boundProgramRef = null; } + return this; } @Override diff --git a/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java b/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java index 421d48b6..6e03c2f1 100644 --- a/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java +++ b/src/main/java/de/ellpeck/rockbottom/init/RockBottom.java @@ -546,7 +546,6 @@ protected void updateTickless() { protected void render() { this.renderer.setDefaultProgram(this.assetManager.getShaderProgram(IShaderProgram.WORLD_SHADER)); - this.worldRenderer.calcCameraValues(this.assetManager, this.renderer); this.renderer.begin(); if (this.player != null) { @@ -554,20 +553,11 @@ protected void render() { } this.renderer.setDefaultProgram(this.assetManager.getShaderProgram(IShaderProgram.GUI_SHADER)); - - float scale = this.renderer.getGuiScale(); - - IShaderProgram guiShader = assetManager.getShaderProgram(IShaderProgram.GUI_SHADER); - guiShader.bind(); - guiShader.setUniform("scale", scale, scale); - - this.renderer.setScale(1, 1); + this.assetManager.getShaderProgram(IShaderProgram.GUI_SHADER).bind().setUniform("scale", this.renderer.getGuiScale()); this.guiManager.render(this, this.assetManager, this.renderer, this.player); this.toaster.render(this, this.assetManager, this.renderer); - this.renderer.setScale(1F, 1F); - if (this.renderer.isDebug()) { DebugRenderer.render(this, this.assetManager, this.getPlayerWorld(), this.player, this.renderer); } diff --git a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java index f25f99a4..7cc96657 100644 --- a/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java +++ b/src/main/java/de/ellpeck/rockbottom/render/WorldRenderer.java @@ -99,23 +99,26 @@ public void calcCameraValues(IAssetManager m, IRenderer g) { this.minY = Util.floor(-this.transY - g.getHeightInWorld() + 1) + offset; this.maxX = Util.ceil(this.transX + g.getWidthInWorld()) - offset; this.maxY = Util.ceil(-this.transY + 1) - offset; + } - - IShaderProgram breakShader = m.getShaderProgram(IShaderProgram.BREAK_SHADER); - breakShader.bind(); - breakShader.setUniform("camera", this.transX, this.transY, g.getWorldScale()); - breakShader.unbind(); - - IShaderProgram worldShader = m.getShaderProgram(IShaderProgram.WORLD_SHADER); - worldShader.bind(); - worldShader.setUniform("camera", this.transX, this.transY, g.getWorldScale()); - + private IShaderProgram setCameraValues(IAssetManager manager, ResourceName shader, float transX, float transY, float scale) { + IShaderProgram program = manager.getShaderProgram(shader); + program.bind(); + program.setUniform("camera", transX, transY, scale); + return program; } public void render(IGameInstance game, IAssetManager manager, ParticleManager particles, IRenderer g, AbstractWorld world, EntityPlayer player, InteractionManager input) { + calcCameraValues(manager, g); + + this.setCameraValues(manager, IShaderProgram.BREAK_SHADER, this.transX, this.transY, g.getWorldScale()).unbind(); + this.setCameraValues(manager, IShaderProgram.WORLD_SHADER, 0, 0, g.getWorldScale()); this.renderSky(game, manager, g, world, player, g.getWidthInWorld(), g.getHeightInWorld()); + g.flush(); + this.setCameraValues(manager, IShaderProgram.WORLD_SHADER, this.transX, this.transY, g.getWorldScale()); + List entities = new ArrayList<>(); List players = new ArrayList<>(); @@ -332,7 +335,7 @@ private void renderTile(IGameInstance game, IAssetManager manager, IRenderer g, } if (renderForeground) { - renderer.renderInForeground(game, manager, g, world, tile, state, x, y, layer, x, y, 1, color); + renderer.renderInForeground(game, manager, g, world, tile, state, x, y, layer, x, -y, 1, color); } if (isBreakTile) {