Removed shadow/world padding

This commit is contained in:
Anuken
2018-11-05 13:49:31 -05:00
parent 7cd842df19
commit ffa1aae27c
4 changed files with 22 additions and 99 deletions

View File

@@ -38,7 +38,7 @@ void main() {
else if(m > 0.35) gl_FragColor.rgb = p4; else if(m > 0.35) gl_FragColor.rgb = p4;
else gl_FragColor.rgb = vec3(0.0); else gl_FragColor.rgb = vec3(0.0);
gl_FragColor.rgb *= 0.8; gl_FragColor.rgb *= 0.75;
gl_FragColor.a = mod(abs(float(coords.x)) + abs(float(coords.y)), 110.0) < 35.0 ? 1.0 : 0.0; gl_FragColor.a = mod(abs(float(coords.x)) + abs(float(coords.y)), 110.0) < 35.0 ? 1.0 : 0.0;
} }

View File

@@ -10,7 +10,6 @@ import com.badlogic.gdx.utils.IntSet.IntSetIterator;
import com.badlogic.gdx.utils.ObjectSet; import com.badlogic.gdx.utils.ObjectSet;
import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent; import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
import io.anuke.mindustry.maps.Sector; import io.anuke.mindustry.maps.Sector;
import io.anuke.mindustry.maps.generation.WorldGenerator.GenResult;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Core;
@@ -20,23 +19,18 @@ import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.CacheBatch; import io.anuke.ucore.graphics.CacheBatch;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.util.Structs;
import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Log; import io.anuke.ucore.util.Log;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Structs;
import java.util.Arrays; import java.util.Arrays;
import static io.anuke.mindustry.Vars.mapPadding;
import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.tilesize;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
public class FloorRenderer{ public class FloorRenderer{
private final static int chunksize = 64; private final static int chunksize = 64;
private int gutter;
private Tile gutterTile;
private Tile gutterNearTile = new Tile(0, 0);
private Chunk[][] cache; private Chunk[][] cache;
private CacheBatch cbatch; private CacheBatch cbatch;
private IntSet drawnLayerSet = new IntSet(); private IntSet drawnLayerSet = new IntSet();
@@ -44,26 +38,6 @@ public class FloorRenderer{
public FloorRenderer(){ public FloorRenderer(){
Events.on(WorldLoadGraphicsEvent.class, event -> clearTiles()); Events.on(WorldLoadGraphicsEvent.class, event -> clearTiles());
gutterTile = new Tile(0, 0){
@Override
public Tile getNearby(int dx, int dy){
Sector sec = world.getSector();
GenResult result = world.generator.generateTile(sec.x, sec.y, x + dx, y + dy);
gutterNearTile.x = (short)(x + dx);
gutterNearTile.y = (short)(y + dy);
gutterNearTile.setElevation(result.elevation);
gutterNearTile.setFloor((Floor)result.floor);
return gutterNearTile;
}
@Override
public Tile getNearby(int rotation){
int dx = Geometry.d4[rotation].x;
int dy = Geometry.d4[rotation].y;
return getNearby(dx, dy);
}
};
} }
public void drawFloor(){ public void drawFloor(){
@@ -188,18 +162,10 @@ public class FloorRenderer{
for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){
for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){
Tile tile = world.tile(tilex - gutter, tiley - gutter); Tile tile = world.tile(tilex, tiley);
Floor floor = null;
if(tile == null && sector != null && tilex < world.width() + gutter*2 && tiley < world.height() + gutter*2){ if(tile != null){
GenResult result = world.generator.generateTile(sector.x, sector.y, tilex - gutter, tiley - gutter); used.add(tile.floor().cacheLayer);
floor = (Floor) result.floor;
}else if(tile != null){
floor = tile.floor();
}
if(floor != null){
used.add(floor.cacheLayer);
} }
} }
} }
@@ -218,22 +184,11 @@ public class FloorRenderer{
for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){
for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){
Tile tile = world.tile(tilex - gutter, tiley - gutter); Tile tile = world.tile(tilex , tiley);
Floor floor; Floor floor;
if(tile == null){ if(tile == null){
if(sector != null && tilex < world.width() + gutter*2 && tiley < world.height() + gutter*2){ continue;
GenResult result = world.generator.generateTile(sector.x, sector.y, tilex - gutter, tiley - gutter);
floor = (Floor)result.floor;
gutterTile.setFloor(floor);
gutterTile.x = (short)(tilex - gutter);
gutterTile.y = (short)(tiley - gutter);
gutterTile.setElevation(result.elevation);
gutterTile.updateOcclusion();
tile = gutterTile;
}else{
continue;
}
}else{ }else{
floor = tile.floor(); floor = tile.floor();
} }
@@ -254,14 +209,8 @@ public class FloorRenderer{
public void clearTiles(){ public void clearTiles(){
if(cbatch != null) cbatch.dispose(); if(cbatch != null) cbatch.dispose();
if(world.getSector() != null){ int chunksx = Mathf.ceil((float) (world.width()) / chunksize),
gutter = mapPadding; chunksy = Mathf.ceil((float) (world.height()) / chunksize) ;
}else{
gutter = 0;
}
int chunksx = Mathf.ceil((float) (world.width() + gutter) / chunksize),
chunksy = Mathf.ceil((float) (world.height() + gutter) / chunksize) ;
cache = new Chunk[chunksx][chunksy]; cache = new Chunk[chunksx][chunksy];
cbatch = new CacheBatch(world.width() * world.height() * 4 * 4); cbatch = new CacheBatch(world.width() * world.height() * 4 * 4);

View File

@@ -7,7 +7,6 @@ import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.FrameBuffer; import com.badlogic.gdx.graphics.glutils.FrameBuffer;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.Disposable;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
@@ -27,52 +26,27 @@ import static io.anuke.mindustry.Vars.*;
/**Used for rendering fog of war. A framebuffer is used for this.*/ /**Used for rendering fog of war. A framebuffer is used for this.*/
public class FogRenderer implements Disposable{ public class FogRenderer implements Disposable{
private static final int extraPadding = 3;
private static final int fshadowPadding = 1;
private TextureRegion region = new TextureRegion(); private TextureRegion region = new TextureRegion();
private FrameBuffer buffer; private FrameBuffer buffer;
private ByteBuffer pixelBuffer; private ByteBuffer pixelBuffer;
private Array<Tile> changeQueue = new Array<>(); private Array<Tile> changeQueue = new Array<>();
private int padding;
private int shadowPadding; private int shadowPadding;
private Rectangle rect = new Rectangle();
private boolean dirty; private boolean dirty;
private boolean isOffseted;
private int offsettedX, offsettedY;
public FogRenderer(){ public FogRenderer(){
Events.on(WorldLoadGraphicsEvent.class, event -> { Events.on(WorldLoadGraphicsEvent.class, event -> {
if(!isOffseted){ dispose();
dispose();
}
padding = world.getSector() != null ? mapPadding + extraPadding : 0; shadowPadding = -1;
shadowPadding = world.getSector() != null ? fshadowPadding : -1;
FrameBuffer lastBuffer = buffer; buffer = new FrameBuffer(Format.RGBA8888, world.width(), world.height(), false);
buffer = new FrameBuffer(Format.RGBA8888, world.width() + padding*2, world.height() + padding*2, false);
changeQueue.clear(); changeQueue.clear();
//clear buffer to black //clear buffer to black
buffer.begin(); buffer.begin();
Graphics.clear(0, 0, 0, 1f); Graphics.clear(0, 0, 0, 1f);
if(isOffseted){
Core.batch.getProjectionMatrix().setToOrtho2D(-padding, -padding, buffer.getWidth(), buffer.getHeight());
Core.batch.begin();
Core.batch.draw(lastBuffer.getColorBufferTexture(), offsettedX, offsettedY + lastBuffer.getColorBufferTexture().getHeight(),
lastBuffer.getColorBufferTexture().getWidth(), -lastBuffer.getColorBufferTexture().getHeight());
Core.batch.end();
}
buffer.end(); buffer.end();
if(isOffseted){
lastBuffer.dispose();
}
for(int x = 0; x < world.width(); x++){ for(int x = 0; x < world.width(); x++){
for(int y = 0; y < world.height(); y++){ for(int y = 0; y < world.height(); y++){
Tile tile = world.tile(x, y); Tile tile = world.tile(x, y);
@@ -84,8 +58,6 @@ public class FogRenderer implements Disposable{
pixelBuffer = ByteBuffer.allocateDirect(world.width() * world.height() * 4); pixelBuffer = ByteBuffer.allocateDirect(world.width() * world.height() * 4);
dirty = true; dirty = true;
isOffseted = false;
}); });
Events.on(TileChangeEvent.class, event -> threads.runGraphics(() -> { Events.on(TileChangeEvent.class, event -> threads.runGraphics(() -> {
@@ -101,7 +73,7 @@ public class FogRenderer implements Disposable{
buffer.begin(); buffer.begin();
pixelBuffer.position(0); pixelBuffer.position(0);
Gdx.gl.glPixelStorei(GL20.GL_PACK_ALIGNMENT, 1); Gdx.gl.glPixelStorei(GL20.GL_PACK_ALIGNMENT, 1);
Gdx.gl.glReadPixels(padding, padding, world.width(), world.height(), GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixelBuffer); Gdx.gl.glReadPixels(0, 0, world.width(), world.height(), GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixelBuffer);
pixelBuffer.position(0); pixelBuffer.position(0);
for(int i = 0; i < world.width() * world.height(); i++){ for(int i = 0; i < world.width() * world.height(); i++){
@@ -115,7 +87,7 @@ public class FogRenderer implements Disposable{
} }
public int getPadding(){ public int getPadding(){
return padding; return -shadowPadding;
} }
public void draw(){ public void draw(){
@@ -127,19 +99,19 @@ public class FogRenderer implements Disposable{
float px = Core.camera.position.x - vw / 2f; float px = Core.camera.position.x - vw / 2f;
float py = Core.camera.position.y - vh / 2f; float py = Core.camera.position.y - vh / 2f;
float u = (px / tilesize + padding) / buffer.getWidth(); float u = (px / tilesize) / buffer.getWidth();
float v = (py / tilesize + padding) / buffer.getHeight(); float v = (py / tilesize) / buffer.getHeight();
float u2 = ((px + vw) / tilesize + padding) / buffer.getWidth(); float u2 = ((px + vw) / tilesize) / buffer.getWidth();
float v2 = ((py + vh) / tilesize + padding) / buffer.getHeight(); float v2 = ((py + vh) / tilesize) / buffer.getHeight();
Core.batch.getProjectionMatrix().setToOrtho2D(-padding * tilesize, -padding * tilesize, buffer.getWidth() * tilesize, buffer.getHeight() * tilesize); Core.batch.getProjectionMatrix().setToOrtho2D(0, 0, buffer.getWidth() * tilesize, buffer.getHeight() * tilesize);
Draw.color(Color.WHITE); Draw.color(Color.WHITE);
buffer.begin(); buffer.begin();
Graphics.beginClip((padding-shadowPadding), (padding-shadowPadding), (world.width() + shadowPadding*2), (world.height() + shadowPadding*2)); Graphics.beginClip((-shadowPadding), (-shadowPadding), (world.width() + shadowPadding*2), (world.height() + shadowPadding*2));
Graphics.begin(); Graphics.begin();
EntityDraw.setClip(false); EntityDraw.setClip(false);

View File

@@ -230,6 +230,8 @@ public class Sectors{
return; return;
} }
//TODO check for core on impassable block.
//50% chance to get a wave mission //50% chance to get a wave mission
if(Mathf.randomSeed(sector.getSeed() + 6) < 0.5){ if(Mathf.randomSeed(sector.getSeed() + 6) < 0.5){
//recipe mission (maybe) //recipe mission (maybe)