Implemented block build animation and shaders

This commit is contained in:
Anuken
2018-05-15 20:03:03 -07:00
parent cf50f47459
commit 57bcea56b5
19 changed files with 674 additions and 37 deletions

View File

@@ -23,6 +23,18 @@ public class Blocks {
blockpart = new BlockPart(),
build1 = new BuildBlock("build1"),
build2 = new BuildBlock("build2"),
build3 = new BuildBlock("build3"),
build4 = new BuildBlock("build4"),
build5 = new BuildBlock("build5"),
build6 = new BuildBlock("build6"),
defaultFloor = new Floor("defaultfloor") {{
}},

View File

@@ -2,17 +2,14 @@ package io.anuke.mindustry.core;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Colors;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureWrap;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.FloatArray;
import com.badlogic.gdx.utils.Pools;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player;
@@ -22,21 +19,18 @@ import io.anuke.mindustry.entities.effect.GroundEffectEntity;
import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect;
import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.input.PlaceMode;
import io.anuke.mindustry.ui.fragments.ToolFragment;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.EffectEntity;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.Entity;
import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.function.Callable;
import io.anuke.ucore.graphics.*;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Hue;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.graphics.Surface;
import io.anuke.ucore.modules.RendererModule;
import io.anuke.ucore.scene.utils.Cursors;
import io.anuke.ucore.util.Mathf;
@@ -49,7 +43,7 @@ import static io.anuke.ucore.core.Core.camera;
public class Renderer extends RendererModule{
private final static float shieldHitDuration = 18f;
public Surface shadowSurface, shieldSurface, waterSurface;
public Surface effectSurface;
private int targetscale = baseCameraScale;
private Texture background = new Texture("sprites/background.png");
@@ -117,11 +111,9 @@ public class Renderer extends RendererModule{
public void init(){
pixelate = Settings.getBool("pixelate");
int scale = Settings.getBool("pixelate") ? Core.cameraScale : 1;
shadowSurface = Graphics.createSurface(scale);
shieldSurface = Graphics.createSurface(scale);
effectSurface = Graphics.createSurface(scale);
pixelSurface = Graphics.createSurface(scale);
waterSurface = Graphics.createSurface(scale);
}
public void setPixelate(boolean pixelate){
@@ -165,7 +157,6 @@ public class Renderer extends RendererModule{
float prex = camera.position.x, prey = camera.position.y;
updateShake(0.75f);
float prevx = camera.position.x, prevy = camera.position.y;
clampCamera(-tilesize / 2f, -tilesize / 2f + 1, world.width() * tilesize - tilesize / 2f, world.height() * tilesize - tilesize / 2f);
float deltax = camera.position.x - prex, deltay = camera.position.y - prey;
@@ -212,9 +203,17 @@ public class Renderer extends RendererModule{
Entities.draw(groundEffectGroup, e -> !(e instanceof BelowLiquidEffect));
blocks.processBlocks();
blocks.drawBlocks(Layer.overlay);
blocks.drawBlocks(Layer.block);
drawAllTeams(false);
Graphics.surface(effectSurface, true);
Graphics.shader(Shaders.inline, false);
blocks.drawBlocks(Layer.placement);
Graphics.shader();
Graphics.flushSurface();
blocks.drawBlocks(Layer.overlay);
drawAllTeams(false);
blocks.skipLayer(Layer.turret);
blocks.drawBlocks(Layer.laser);
@@ -361,7 +360,7 @@ public class Renderer extends RendererModule{
void drawShield(){
if(shieldGroup.size() == 0 && shieldDraws.size == 0) return;
Graphics.surface(renderer.shieldSurface, false);
Graphics.surface(renderer.effectSurface, false);
Draw.color(Color.ROYAL);
Entities.draw(shieldGroup);
for(Callable c : shieldDraws){
@@ -382,7 +381,7 @@ public class Renderer extends RendererModule{
}
}
Texture texture = shieldSurface.texture();
Texture texture = effectSurface.texture();
Shaders.shield.color.set(Color.SKY);
Tmp.tr2.setRegion(texture);

View File

@@ -132,7 +132,7 @@ public abstract class GroundUnitType extends UnitType{
}
public void update(BaseUnit unit) {
//TODO move toward resupply point?
//TODO move toward resupply point
if(unit.inventory.totalAmmo() + 10 >= unit.inventory.ammoCapacity()){
unit.state.set(unit, attack);
}
@@ -158,7 +158,7 @@ public abstract class GroundUnitType extends UnitType{
if(closest != null){
unit.target = closest;
}else {
Tile target = Geometry.findClosest(unit.x, unit.y, world.indexer().getEnemy(unit.team, BlockFlag.resupplyPoint));
Tile target = Geometry.findClosest(unit.x, unit.y, world.indexer().getEnemy(unit.team, BlockFlag.target));
if (target != null) unit.target = target.entity;
}
}

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.graphics;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.game.Team;
@@ -8,7 +7,6 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.StaticBlock;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
@@ -60,7 +58,7 @@ public class BlockRenderer{
int expandr = 4;
Graphics.surface(renderer.shadowSurface);
Graphics.surface(renderer.effectSurface);
for(int x = -rangex - expandr; x <= rangex + expandr; x++){
for(int y = -rangey - expandr; y <= rangey + expandr; y++){

View File

@@ -66,20 +66,20 @@ public enum CacheLayer {
protected void beginShader(){
//renderer.getBlocks().endFloor();
renderer.waterSurface.getBuffer().begin();
renderer.effectSurface.getBuffer().begin();
Graphics.clear(Color.CLEAR);
//renderer.getBlocks().beginFloor();
}
public void endShader(Shader shader){
renderer.getBlocks().endFloor();
renderer.waterSurface.getBuffer().end();
renderer.effectSurface.getBuffer().end();
renderer.pixelSurface.getBuffer().begin();
Graphics.shader(shader);
Graphics.begin();
Draw.rect(renderer.waterSurface.texture(), Core.camera.position.x, Core.camera.position.y,
Draw.rect(renderer.effectSurface.texture(), Core.camera.position.x, Core.camera.position.y,
Core.camera.viewportWidth * Core.camera.zoom, -Core.camera.viewportHeight * Core.camera.zoom);
Graphics.end();
Graphics.shader();

View File

@@ -3,6 +3,8 @@ package io.anuke.mindustry.graphics;
public enum Layer{
/**Base block layer.*/
block,
/**for placement*/
placement,
/**First overlay. Stuff like conveyor items.*/
overlay,
/**"High" blocks, like turrets.*/

View File

@@ -15,6 +15,7 @@ import static io.anuke.mindustry.Vars.world;
public class Shaders{
public static final Outline outline = new Outline();
public static final Inline inline = new Inline();
public static final Shield shield = new Shield();
public static final SurfaceShader water = new SurfaceShader("water");
public static final SurfaceShader lava = new SurfaceShader("lava");
@@ -71,6 +72,25 @@ public class Shaders{
shader.setUniformf("u_texsize", vec.set(region.getTexture().getWidth(), region.getTexture().getHeight()));
}
}
public static class Inline extends Shader{
public Color color = new Color();
public float progress;
public Inline(){
super("inline-lines", "default");
}
@Override
public void apply(){
shader.setUniformf("u_progress", progress);
shader.setUniformf("u_color", color);
shader.setUniformf("u_uv", region.getU(), region.getV());
shader.setUniformf("u_uv2", region.getU2(), region.getV2());
shader.setUniformf("u_time", Timers.time());
shader.setUniformf("u_texsize", vec.set(region.getTexture().getWidth(), region.getTexture().getHeight()));
}
}
public static class Shield extends Shader{
public static final int MAX_HITS = 3*64;

View File

@@ -203,9 +203,10 @@ public abstract class InputHandler extends InputAdapter{
NetEvents.handlePlace(player, x, y, result, rotation);
}
//todo fix this, call placed()
if(!Net.client()){
Tile tile = world.tile(x, y);
if(tile != null) threads.run(() -> result.placed(tile));
//Tile tile = world.tile(x, y);
//if(tile != null) threads.run(() -> result.placed(tile));
}
}

View File

@@ -166,13 +166,11 @@ public class SettingsMenuDialog extends SettingsDialog{
graphics.checkPref("pixelate", true, b -> {
if(b){
renderer.pixelSurface.setScale(Core.cameraScale);
renderer.shadowSurface.setScale(Core.cameraScale);
renderer.shieldSurface.setScale(Core.cameraScale);
renderer.effectSurface.setScale(Core.cameraScale);
//Graphics.getEffects1().setScale(Core.cameraScale);
//Graphics.getEffects2().setScale(Core.cameraScale);
}else{
renderer.shadowSurface.setScale(1);
renderer.shieldSurface.setScale(1);
renderer.effectSurface.setScale(1);
//Graphics.getEffects1().setScale(1);
//Graphics.getEffects2().setScale(1);
}

View File

@@ -304,6 +304,10 @@ public class Block extends BaseBlock {
}
}
public TextureRegion[] getBlockIcon(){
return getIcon();
}
public TextureRegion[] getCompactIcon(){
TextureRegion[] out = getIcon();
for(int i = 0; i < out.length; i ++){

View File

@@ -10,6 +10,7 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.resource.ItemStack;
import io.anuke.mindustry.resource.Recipe;
import io.anuke.mindustry.world.blocks.types.BuildBlock.BuildEntity;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.entities.Entities;
@@ -62,7 +63,10 @@ public class Placement {
//just in case
if(tile == null) return;
tile.setBlock(result, rotation);
Block sub = Block.getByName("build" + result.size);
tile.setBlock(sub, rotation);
tile.<BuildEntity>entity().result = result;
tile.setTeam(team);
if(result.isMultiblock()){

View File

@@ -0,0 +1,73 @@
package io.anuke.mindustry.world.blocks.types;
import com.badlogic.gdx.graphics.Colors;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.Shaders;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.graphics.Draw;
public class BuildBlock extends Block {
private static final float buildTime = 120f;
public BuildBlock(String name) {
super(name);
solid = true;
update = true;
size = Integer.parseInt(name.charAt(name.length()-1) + "");
health = 1;
layer = Layer.placement;
}
@Override
public void draw(Tile tile){
}
@Override
public void drawLayer(Tile tile) {
BuildEntity entity = tile.entity();
Shaders.inline.color = Colors.get("accent");
for(TextureRegion region : entity.result.getBlockIcon()){
Shaders.inline.region = region;
Shaders.inline.progress = entity.progress;
Shaders.inline.apply();
Draw.rect(region, tile.drawx(), tile.drawy());
Graphics.flush();
}
}
@Override
public void drawShadow(Tile tile) {
BuildEntity entity = tile.entity();
entity.result.drawShadow(tile);
}
@Override
public void update(Tile tile) {
BuildEntity entity = tile.entity();
entity.progress += 1f/buildTime;
if(entity.progress > 1f){
Team team = tile.getTeam();
tile.setBlock(entity.result);
tile.setTeam(team);
}
}
@Override
public TileEntity getEntity() {
return new BuildEntity();
}
public class BuildEntity extends TileEntity{
public Block result;
public float progress;
}
}

View File

@@ -1,6 +1,7 @@
package io.anuke.mindustry.world.blocks.types.defense;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.*;
@@ -18,7 +19,10 @@ import io.anuke.ucore.core.Timers;
import io.anuke.ucore.function.BiConsumer;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.*;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
import io.anuke.ucore.util.Translator;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -111,6 +115,11 @@ public abstract class Turret extends Block{
Draw.color();
}
@Override
public TextureRegion[] getBlockIcon(){
return new TextureRegion[]{Draw.region("block-" + size), Draw.region(name)};
}
@Override
public void drawSelect(Tile tile){