mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-07-15 02:07:53 +07:00
Increased fog view range, added tile fog discovery
This commit is contained in:
@ -15,5 +15,8 @@ void main() {
|
|||||||
color.a = 1.0 - color.r;
|
color.a = 1.0 - color.r;
|
||||||
color.rgb = vec3(0.0);
|
color.rgb = vec3(0.0);
|
||||||
color.a = float(int(color.a / round)) * round;
|
color.a = float(int(color.a / round)) * round;
|
||||||
|
if(color.a >= 1.0 - round){
|
||||||
|
color.a = 1.0;
|
||||||
|
}
|
||||||
gl_FragColor = color * v_color;
|
gl_FragColor = color * v_color;
|
||||||
}
|
}
|
||||||
|
@ -298,7 +298,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
|
|||||||
}
|
}
|
||||||
|
|
||||||
public float getViewDistance(){
|
public float getViewDistance(){
|
||||||
return 60f;
|
return 130f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract TextureRegion getIconRegion();
|
public abstract TextureRegion getIconRegion();
|
||||||
|
@ -5,15 +5,21 @@ 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.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;
|
||||||
|
import io.anuke.mindustry.game.EventType.TileChangeEvent;
|
||||||
import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
|
import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent;
|
||||||
|
import io.anuke.mindustry.world.Tile;
|
||||||
import io.anuke.ucore.core.Core;
|
import io.anuke.ucore.core.Core;
|
||||||
import io.anuke.ucore.core.Events;
|
import io.anuke.ucore.core.Events;
|
||||||
import io.anuke.ucore.core.Graphics;
|
import io.anuke.ucore.core.Graphics;
|
||||||
import io.anuke.ucore.entities.EntityDraw;
|
import io.anuke.ucore.entities.EntityDraw;
|
||||||
import io.anuke.ucore.graphics.ClipSpriteBatch;
|
import io.anuke.ucore.graphics.ClipSpriteBatch;
|
||||||
import io.anuke.ucore.graphics.Draw;
|
import io.anuke.ucore.graphics.Draw;
|
||||||
|
import io.anuke.ucore.graphics.Fill;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@ -21,6 +27,8 @@ import static io.anuke.mindustry.Vars.*;
|
|||||||
public class FogRenderer implements Disposable{
|
public class FogRenderer implements Disposable{
|
||||||
private TextureRegion region = new TextureRegion();
|
private TextureRegion region = new TextureRegion();
|
||||||
private FrameBuffer buffer;
|
private FrameBuffer buffer;
|
||||||
|
private ByteBuffer pixelBuffer = ByteBuffer.allocateDirect(4);
|
||||||
|
private Array<Tile> changeQueue = new Array<>();
|
||||||
|
|
||||||
public FogRenderer(){
|
public FogRenderer(){
|
||||||
Events.on(WorldLoadGraphicsEvent.class, () -> {
|
Events.on(WorldLoadGraphicsEvent.class, () -> {
|
||||||
@ -29,9 +37,25 @@ public class FogRenderer implements Disposable{
|
|||||||
|
|
||||||
//clear buffer to black
|
//clear buffer to black
|
||||||
buffer.begin();
|
buffer.begin();
|
||||||
Graphics.clear(Color.BLACK);
|
Graphics.clear(0, 0, 0, 1f);
|
||||||
buffer.end();
|
buffer.end();
|
||||||
|
|
||||||
|
for (int x = 0; x < world.width(); x++) {
|
||||||
|
for (int y = 0; y < world.height(); y++) {
|
||||||
|
Tile tile = world.tile(x, y);
|
||||||
|
|
||||||
|
if(tile.getTeam() == players[0].getTeam() && tile.block().viewRange > 0){
|
||||||
|
changeQueue.add(tile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Events.on(TileChangeEvent.class, tile -> threads.runGraphics(() -> {
|
||||||
|
if(tile.getTeam() == players[0].getTeam() && tile.block().viewRange > 0){
|
||||||
|
changeQueue.add(tile);
|
||||||
|
}
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void draw(){
|
public void draw(){
|
||||||
@ -58,12 +82,25 @@ public class FogRenderer implements Disposable{
|
|||||||
Draw.color(Color.WHITE);
|
Draw.color(Color.WHITE);
|
||||||
|
|
||||||
buffer.begin();
|
buffer.begin();
|
||||||
|
|
||||||
|
//TODO use this for per-tile visibility to show/hide units
|
||||||
|
//pixelBuffer.position(0);
|
||||||
|
//Gdx.gl.glPixelStorei(GL20.GL_PACK_ALIGNMENT, 1);
|
||||||
|
//Gdx.gl.glReadPixels(world.width()/2, world.height()/2 + 20, 1, 1, GL20.GL_RGB, GL20.GL_UNSIGNED_BYTE, pixelBuffer);
|
||||||
|
//Log.info(pixelBuffer.get(0));
|
||||||
|
|
||||||
Graphics.begin();
|
Graphics.begin();
|
||||||
EntityDraw.setClip(false);
|
EntityDraw.setClip(false);
|
||||||
|
|
||||||
renderer.drawAndInterpolate(playerGroup, player -> player.getTeam() == players[0].getTeam(), Unit::drawView);
|
renderer.drawAndInterpolate(playerGroup, player -> player.getTeam() == players[0].getTeam(), Unit::drawView);
|
||||||
renderer.drawAndInterpolate(unitGroups[players[0].getTeam().ordinal()], unit -> true, Unit::drawView);
|
renderer.drawAndInterpolate(unitGroups[players[0].getTeam().ordinal()], unit -> true, Unit::drawView);
|
||||||
|
|
||||||
|
for(Tile tile : changeQueue){
|
||||||
|
float viewRange = tile.block().viewRange;
|
||||||
|
if(viewRange < 0) continue;
|
||||||
|
Fill.circle(tile.drawx(), tile.drawy(), tile.block().viewRange);
|
||||||
|
}
|
||||||
|
|
||||||
EntityDraw.setClip(true);
|
EntityDraw.setClip(true);
|
||||||
Graphics.end();
|
Graphics.end();
|
||||||
buffer.end();
|
buffer.end();
|
||||||
|
@ -61,14 +61,12 @@ public class MapTileData {
|
|||||||
|
|
||||||
/**Write a byte to a specific position.*/
|
/**Write a byte to a specific position.*/
|
||||||
public void write(int x, int y, DataPosition position, byte data){
|
public void write(int x, int y, DataPosition position, byte data){
|
||||||
buffer.position((x + width * y) * TILE_SIZE + position.ordinal());
|
buffer.put((x + width * y) * TILE_SIZE + position.ordinal(), data);
|
||||||
buffer.put(data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Gets a byte at a specific position.*/
|
/**Gets a byte at a specific position.*/
|
||||||
public byte read(int x, int y, DataPosition position){
|
public byte read(int x, int y, DataPosition position){
|
||||||
buffer.position((x + width * y) * TILE_SIZE + position.ordinal());
|
return buffer.get((x + width * y) * TILE_SIZE + position.ordinal());
|
||||||
return buffer.get();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Reads and returns the next tile data.*/
|
/**Reads and returns the next tile data.*/
|
||||||
|
@ -33,8 +33,6 @@ public class Minimap extends Table {
|
|||||||
renderer.minimap().drawEntities(x, y, width, height);
|
renderer.minimap().drawEntities(x, y, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
renderer.fog().getTexture().setFilter(TextureFilter.Nearest, TextureFilter.Nearest);
|
renderer.fog().getTexture().setFilter(TextureFilter.Nearest, TextureFilter.Nearest);
|
||||||
|
|
||||||
//draw.getRegion().setV(draw.getRegion().getV2());
|
//draw.getRegion().setV(draw.getRegion().getV2());
|
||||||
|
@ -11,7 +11,6 @@ import io.anuke.mindustry.entities.Player;
|
|||||||
import io.anuke.mindustry.entities.TileEntity;
|
import io.anuke.mindustry.entities.TileEntity;
|
||||||
import io.anuke.mindustry.entities.Unit;
|
import io.anuke.mindustry.entities.Unit;
|
||||||
import io.anuke.mindustry.entities.bullet.Bullet;
|
import io.anuke.mindustry.entities.bullet.Bullet;
|
||||||
import io.anuke.mindustry.entities.effect.Decal;
|
|
||||||
import io.anuke.mindustry.entities.effect.Puddle;
|
import io.anuke.mindustry.entities.effect.Puddle;
|
||||||
import io.anuke.mindustry.entities.effect.RubbleDecal;
|
import io.anuke.mindustry.entities.effect.RubbleDecal;
|
||||||
import io.anuke.mindustry.game.Content;
|
import io.anuke.mindustry.game.Content;
|
||||||
@ -121,6 +120,8 @@ public class Block extends BaseBlock implements UnlockableContent{
|
|||||||
public boolean consumesTap;
|
public boolean consumesTap;
|
||||||
/**The color of this block when displayed on the minimap or map preview.*/
|
/**The color of this block when displayed on the minimap or map preview.*/
|
||||||
public Color minimapColor = Color.CLEAR;
|
public Color minimapColor = Color.CLEAR;
|
||||||
|
/**View range of this block type. Use a value < 0 to disable.*/
|
||||||
|
public float viewRange = -1;
|
||||||
|
|
||||||
public Block(String name) {
|
public Block(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
@ -75,6 +75,11 @@ public abstract class Turret extends Block{
|
|||||||
group = BlockGroup.turrets;
|
group = BlockGroup.turrets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init() {
|
||||||
|
viewRange = range;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setStats(){
|
public void setStats(){
|
||||||
super.setStats();
|
super.setStats();
|
||||||
|
@ -57,6 +57,7 @@ public class CoreBlock extends StorageBlock {
|
|||||||
size = 3;
|
size = 3;
|
||||||
hasItems = true;
|
hasItems = true;
|
||||||
itemCapacity = 1000;
|
itemCapacity = 1000;
|
||||||
|
viewRange = 200f;
|
||||||
flags = EnumSet.of(BlockFlag.resupplyPoint, BlockFlag.target);
|
flags = EnumSet.of(BlockFlag.resupplyPoint, BlockFlag.target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user