diff --git a/core/assets-raw/sprites/blocks/power/powerinfinite.png b/core/assets-raw/sprites/blocks/power/powerinfinite.png index d6af428dcd..ce78153ea0 100644 Binary files a/core/assets-raw/sprites/blocks/power/powerinfinite.png and b/core/assets-raw/sprites/blocks/power/powerinfinite.png differ diff --git a/core/assets-raw/sprites/blocks/power/powervoid.png b/core/assets-raw/sprites/blocks/power/powervoid.png index 13a69fc8f0..d91f656faf 100644 Binary files a/core/assets-raw/sprites/blocks/power/powervoid.png and b/core/assets-raw/sprites/blocks/power/powervoid.png differ diff --git a/core/assets-raw/sprites/blocks/production/flierfactory-top.png b/core/assets-raw/sprites/blocks/production/flierfactory-top.png index c0c0c82aa7..2e6562c82b 100644 Binary files a/core/assets-raw/sprites/blocks/production/flierfactory-top.png and b/core/assets-raw/sprites/blocks/production/flierfactory-top.png differ diff --git a/core/assets/shaders/build.fragment b/core/assets/shaders/build.fragment new file mode 100644 index 0000000000..47040c6a01 --- /dev/null +++ b/core/assets/shaders/build.fragment @@ -0,0 +1,53 @@ +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +uniform sampler2D u_texture; + +uniform float u_time; +uniform float u_progress; +uniform vec4 u_color; +uniform vec2 u_uv; +uniform vec2 u_uv2; +uniform vec2 u_texsize; + +varying vec4 v_color; +varying vec2 v_texCoord; + +float rand(vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + +bool id(vec4 v){ + return v.a > 0.1; +} + +void main() { + vec2 coords = (v_texCoord.xy - u_uv) / (u_uv2 - u_uv); + vec2 t = v_texCoord.xy; + + vec4 c = texture2D(u_texture, v_texCoord.xy); + + vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); + float step = 1.0; + + bool outline = texture2D(u_texture, t).a < 0.1 && + (id(texture2D(u_texture, t + vec2(0, step) * v)) || id(texture2D(u_texture, t + vec2(0, -step) * v)) || + id(texture2D(u_texture, t + vec2(step, 0) * v)) || id(texture2D(u_texture, t + vec2(-step, 0) * v))); + + if(1.0-abs(coords.x - 0.5)*2.0 < 1.0-u_progress){ + c = vec4(0.0); + } + + if(c.a > 0.01 || outline){ + float f = abs(sin(coords.x*2.0 + u_time)); + if(f > 0.9 || (f > 0.7 && rand(t) > 0.6)) + f = 1.0; + else + f = 0.0; + c = mix(c, u_color, f); + } + + gl_FragColor = c * v_color; +} diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index b011f8fa78..e6955a772f 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/version.properties b/core/assets/version.properties index b1812d3652..61aae7632e 100644 --- a/core/assets/version.properties +++ b/core/assets/version.properties @@ -1,7 +1,7 @@ #Autogenerated file. Do not modify. -#Sun Mar 25 15:04:04 EDT 2018 +#Sun Mar 25 16:45:50 EDT 2018 version=release -androidBuildCode=650 +androidBuildCode=653 name=Mindustry code=3.4 build=custom build diff --git a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java index 1aec4ebd4f..86c3b369ef 100644 --- a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java @@ -11,7 +11,7 @@ public class UnitBlocks { flierFactory = new UnitFactory("flierfactory"){{ type = UnitTypes.flier; - produceTime = 400; + produceTime = 200; size = 2; requirements = new ItemStack[]{ new ItemStack(Items.stone, 5) diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/io/anuke/mindustry/graphics/Shaders.java index 915d725100..f8993a5fe2 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/io/anuke/mindustry/graphics/Shaders.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.graphics; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.FloatArray; import io.anuke.ucore.core.Core; @@ -15,10 +16,31 @@ public class Shaders{ public static final SurfaceShader water = new SurfaceShader("water"); public static final SurfaceShader lava = new SurfaceShader("lava"); public static final SurfaceShader oil = new SurfaceShader("oil"); - public static final Shader hit = new Shader("hit", "default") { protected void apply() {}}; + public static final UnitBuild build = new UnitBuild(); + public static final Shader hit = new Shader("hit", "default"); private static final Vector2 vec = new Vector2(); + public static class UnitBuild extends Shader{ + public float progress, time; + public Color color = new Color(); + public TextureRegion region; + + public UnitBuild() { + super("build", "default"); + } + + @Override + public void apply(){ + shader.setUniformf("u_time", time); + shader.setUniformf("u_color", color); + shader.setUniformf("u_progress", progress); + shader.setUniformf("u_uv", region.getU(), region.getV()); + shader.setUniformf("u_uv2", region.getU2(), region.getV2()); + shader.setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); + } + } + public static class Outline extends Shader{ public Color color = new Color(); diff --git a/core/src/io/anuke/mindustry/world/BarType.java b/core/src/io/anuke/mindustry/world/BarType.java index b605412270..332ed5c7a1 100644 --- a/core/src/io/anuke/mindustry/world/BarType.java +++ b/core/src/io/anuke/mindustry/world/BarType.java @@ -3,12 +3,12 @@ package io.anuke.mindustry.world; import com.badlogic.gdx.graphics.Color; public enum BarType { - health(Color.RED), + health(Color.SCARLET), inventory(Color.GREEN), - power(Color.YELLOW), + power(Color.valueOf("fbeb67")), liquid(Color.ROYAL), heat(Color.CORAL), - production(Color.PURPLE); + production(Color.valueOf("f4ba6e")); public final Color color; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/types/production/UnitFactory.java index 5daba0fe80..13167b3f81 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/UnitFactory.java @@ -1,10 +1,12 @@ package io.anuke.mindustry.world.blocks.types.production; +import com.badlogic.gdx.graphics.Colors; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.UnitType; +import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.world.BarType; @@ -12,11 +14,11 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.BlockBar; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.types.modules.InventoryModule; +import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.util.Mathf; -import io.anuke.ucore.util.Tmp; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -49,21 +51,22 @@ public class UnitFactory extends Block { UnitFactoryEntity entity = tile.entity(); TextureRegion region = Draw.region(unitRegion == null ? type.name : unitRegion); - int w = (int)(entity.buildTime/produceTime * region.getRegionWidth()); - Draw.rect(name(), tile.drawx(), tile.drawy()); - Draw.alpha(0.2f); - //Draw.rect(region, tile.drawx(), tile.drawy()); - Draw.color(); + Shaders.build.region = region; + Shaders.build.progress = entity.buildTime/produceTime; + Shaders.build.color = Colors.get("accent"); + Shaders.build.time = -entity.time / 10f; - Tmp.tr1.setRegion(region, region.getRegionWidth() - w, 0, w, region.getRegionHeight()); - Draw.rect(Tmp.tr1, tile.drawx(), tile.drawy()); + Graphics.shader(Shaders.build, false); + Shaders.build.apply(); + Draw.rect(region, tile.drawx(), tile.drawy()); + Graphics.shader(); Draw.color("accent"); Lines.lineAngleCenter( - tile.drawx() + Mathf.sin(Timers.time(), 5f, Vars.tilesize/2f*size - 2f), + tile.drawx() + Mathf.sin(entity.time, 6f, Vars.tilesize/2f*size - 2f), tile.drawy(), 90, size * Vars.tilesize - 4f); @@ -83,17 +86,18 @@ public class UnitFactory extends Block { entity.power.amount >= used){ entity.buildTime += Timers.delta(); + entity.time += Timers.delta(); entity.power.amount -= used; + } - if(entity.buildTime >= produceTime){ - BaseUnit unit = new BaseUnit(type, tile.getTeam()); - unit.set(tile.drawx(), tile.drawy()).add(); - unit.velocity.y = 4f; - entity.buildTime = 0f; + if(entity.buildTime >= produceTime){ + BaseUnit unit = new BaseUnit(type, tile.getTeam()); + unit.set(tile.drawx(), tile.drawy()).add(); + unit.velocity.y = 4f; + entity.buildTime = 0f; - for(ItemStack stack : requirements){ - entity.inventory.removeItem(stack.item, stack.amount); - } + for(ItemStack stack : requirements){ + entity.inventory.removeItem(stack.item, stack.amount); } } } @@ -124,6 +128,7 @@ public class UnitFactory extends Block { public static class UnitFactoryEntity extends TileEntity{ public float buildTime; + public float time; @Override public void write(DataOutputStream stream) throws IOException {