From 41e611d7db4b889da6fe6a564498858f54008ccc Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 24 Jun 2018 14:42:45 -0400 Subject: [PATCH] Improved fog of war, added minimap display --- core/assets/shaders/fog.fragment | 3 + .../src/io/anuke/mindustry/core/Renderer.java | 4 + .../src/io/anuke/mindustry/entities/Unit.java | 9 +++ .../anuke/mindustry/graphics/FogRenderer.java | 35 +++++++-- core/src/io/anuke/mindustry/ui/Minimap.java | 73 +++++++++++++++++++ .../mindustry/ui/fragments/HudFragment.java | 46 +----------- 6 files changed, 122 insertions(+), 48 deletions(-) create mode 100644 core/src/io/anuke/mindustry/ui/Minimap.java diff --git a/core/assets/shaders/fog.fragment b/core/assets/shaders/fog.fragment index 3f83ec4519..8e0b8942bc 100644 --- a/core/assets/shaders/fog.fragment +++ b/core/assets/shaders/fog.fragment @@ -5,6 +5,8 @@ precision mediump int; uniform sampler2D u_texture; +const float round = 0.23; + varying vec4 v_color; varying vec2 v_texCoord; @@ -12,5 +14,6 @@ void main() { vec4 color = texture2D(u_texture, v_texCoord.xy); color.a = 1.0 - color.r; color.rgb = vec3(0.0); + color.a = float(int(color.a / round)) * round; gl_FragColor = color * v_color; } diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index e0bbc0d207..ecbfc5d94f 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -346,6 +346,10 @@ public class Renderer extends RendererModule{ return avgPosition; } + public FogRenderer fog() { + return fog; + } + public MinimapRenderer minimap() { return minimap; } diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index 8dae8000ee..ddf69ba6c0 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -19,6 +19,7 @@ import io.anuke.ucore.entities.impl.DestructibleEntity; import io.anuke.ucore.entities.trait.DamageTrait; import io.anuke.ucore.entities.trait.DrawTrait; import io.anuke.ucore.entities.trait.SolidTrait; +import io.anuke.ucore.graphics.Fill; import io.anuke.ucore.util.Geometry; import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Translator; @@ -288,10 +289,18 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ public void drawUnder(){} public void drawOver(){} + public void drawView(){ + Fill.circle(x, y, getViewDistance()); + } + public boolean isInfiniteAmmo(){ return false; } + public float getViewDistance(){ + return 60f; + } + public abstract TextureRegion getIconRegion(); public abstract int getItemCapacity(); public abstract int getAmmoCapacity(); diff --git a/core/src/io/anuke/mindustry/graphics/FogRenderer.java b/core/src/io/anuke/mindustry/graphics/FogRenderer.java index 5d8df4ed4e..147377080b 100644 --- a/core/src/io/anuke/mindustry/graphics/FogRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/FogRenderer.java @@ -2,16 +2,18 @@ package io.anuke.mindustry.graphics; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap.Format; +import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.FrameBuffer; import com.badlogic.gdx.utils.Disposable; -import io.anuke.mindustry.entities.Player; +import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.game.EventType.WorldLoadGraphicsEvent; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Graphics; +import io.anuke.ucore.entities.EntityDraw; +import io.anuke.ucore.graphics.ClipSpriteBatch; import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.graphics.Fill; import static io.anuke.mindustry.Vars.*; @@ -47,15 +49,22 @@ public class FogRenderer implements Disposable{ float u2 = (px + vw)/ tilesize / world.width(); float v2 = (py + vh)/ tilesize / world.height(); + if(Core.batch instanceof ClipSpriteBatch){ + ((ClipSpriteBatch) Core.batch).enableClip(false); + } + Core.batch.getProjectionMatrix().setToOrtho2D(0, 0, world.width() * tilesize, world.height() * tilesize); Draw.color(Color.WHITE); buffer.begin(); Graphics.begin(); - for(Player player : playerGroup.all()){ - Fill.circle(player.x, player.y, 60f); - } + EntityDraw.setClip(false); + + renderer.drawAndInterpolate(playerGroup, player -> player.getTeam() == players[0].getTeam(), Unit::drawView); + renderer.drawAndInterpolate(unitGroups[players[0].getTeam().ordinal()], unit -> true, Unit::drawView); + + EntityDraw.setClip(true); Graphics.end(); buffer.end(); @@ -65,13 +74,29 @@ public class FogRenderer implements Disposable{ Core.batch.setProjectionMatrix(Core.camera.combined); Graphics.shader(Shaders.fog); + renderer.pixelSurface.getBuffer().begin(); Graphics.begin(); // Core.batch.draw(buffer.getColorBufferTexture(), px + 50, py, 200, 200 * world.height()/(float)world.width()); Core.batch.draw(region, px, py, vw, vh); Graphics.end(); + renderer.pixelSurface.getBuffer().end(); Graphics.shader(); + + Graphics.begin(); + + Core.batch.draw(renderer.pixelSurface.texture(), px, py + vh, vw, -vh); + Graphics.end(); + + if(Core.batch instanceof ClipSpriteBatch){ + ((ClipSpriteBatch) Core.batch).enableClip(true); + } + + } + + public Texture getTexture(){ + return buffer.getColorBufferTexture(); } @Override diff --git a/core/src/io/anuke/mindustry/ui/Minimap.java b/core/src/io/anuke/mindustry/ui/Minimap.java new file mode 100644 index 0000000000..ec1e0b194b --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/Minimap.java @@ -0,0 +1,73 @@ +package io.anuke.mindustry.ui; + +import com.badlogic.gdx.graphics.Texture.TextureFilter; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import io.anuke.mindustry.graphics.Shaders; +import io.anuke.ucore.core.Core; +import io.anuke.ucore.core.Graphics; +import io.anuke.ucore.scene.Element; +import io.anuke.ucore.scene.event.InputEvent; +import io.anuke.ucore.scene.event.InputListener; +import io.anuke.ucore.scene.style.TextureRegionDrawable; +import io.anuke.ucore.scene.ui.Image; +import io.anuke.ucore.scene.ui.layout.Table; + +import static io.anuke.mindustry.Vars.renderer; + +public class Minimap extends Table { + + public Minimap(){ + super("button"); + + margin(5); + marginBottom(10); + + Image image = new Image(new TextureRegionDrawable(new TextureRegion())){ + @Override + public void draw(Batch batch, float parentAlpha) { + TextureRegionDrawable draw = (TextureRegionDrawable)getDrawable(); + draw.getRegion().setRegion(renderer.minimap().getRegion()); + super.draw(batch, parentAlpha); + if(renderer.minimap().getTexture() != null){ + renderer.minimap().drawEntities(x, y, width, height); + } + + + + renderer.fog().getTexture().setFilter(TextureFilter.Nearest, TextureFilter.Nearest); + + //draw.getRegion().setV(draw.getRegion().getV2()); + //draw.getRegion().setV2(v); + draw.getRegion().setTexture(renderer.fog().getTexture()); + draw.getRegion().setV(1f - draw.getRegion().getV()); + draw.getRegion().setV2(1f - draw.getRegion().getV2()); + + + Graphics.shader(Shaders.fog); + super.draw(batch, parentAlpha); + Graphics.shader(); + + renderer.fog().getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear); + } + }; + + addListener(new InputListener(){ + public boolean scrolled (InputEvent event, float x, float y, int amount) { + renderer.minimap().zoomBy(amount); + return true; + } + }); + + image.update(() -> { + + Element e = Core.scene.hit(Graphics.mouse().x, Graphics.mouse().y, true); + if(e != null && e.isDescendantOf(this)){ + Core.scene.setScrollFocus(this); + }else if(Core.scene.getScrollFocus() == this){ + Core.scene.setScrollFocus(null); + } + }); + add(image).size(140f, 140f); + } +} diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 3b6390478b..d62290a314 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.ui.fragments; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.utils.Array; @@ -10,21 +9,17 @@ import com.badlogic.gdx.utils.Scaling; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.Recipe; +import io.anuke.mindustry.ui.Minimap; import io.anuke.ucore.core.Core; -import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Inputs; import io.anuke.ucore.core.Settings; -import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.Element; import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.actions.Actions; import io.anuke.ucore.scene.builders.imagebutton; import io.anuke.ucore.scene.builders.label; import io.anuke.ucore.scene.builders.table; -import io.anuke.ucore.scene.event.InputEvent; -import io.anuke.ucore.scene.event.InputListener; import io.anuke.ucore.scene.event.Touchable; -import io.anuke.ucore.scene.style.TextureRegionDrawable; import io.anuke.ucore.scene.ui.Image; import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.Label; @@ -132,44 +127,9 @@ public class HudFragment implements Fragment{ atop(); aright(); - new table("button"){{ - Table table = get(); - margin(5); - marginBottom(10); - TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion()); - Image image = new Image(){ - @Override - public void draw(Batch batch, float parentAlpha) { - super.draw(batch, parentAlpha); - if(renderer.minimap().getTexture() != null){ - renderer.minimap().drawEntities(x, y, width, height); - } - } - }; - image.setDrawable(draw); - table.addListener(new InputListener(){ - public boolean scrolled (InputEvent event, float x, float y, int amount) { - renderer.minimap().zoomBy(amount); - return true; - } - }); - image.update(() -> { + Minimap minimap = new Minimap(); - Element e = Core.scene.hit(Graphics.mouse().x, Graphics.mouse().y, true); - if(e != null && e.isDescendantOf(table)){ - Core.scene.setScrollFocus(table); - }else if(Core.scene.getScrollFocus() == table){ - Core.scene.setScrollFocus(null); - } - - if (renderer.minimap().getTexture() == null) { - draw.getRegion().setRegion(Draw.region("white")); - } else { - draw.getRegion().setRegion(renderer.minimap().getRegion()); - } - }); - add(image).size(140f, 140f); - }}.end(); + add(minimap); }}.end(); //paused table