From 3b42b604e188173c4fbed1b767d20348c09d41c3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 26 Dec 2018 17:38:40 -0500 Subject: [PATCH] Successful desktop compilation --- android/build.gradle | 2 +- .../annotations/RemoteWriteGenerator.java | 2 +- .../SerializeAnnotationProcessor.java | 8 +- build.gradle | 23 +- core/assets/cursors/{ibar.png => ibeam.png} | Bin core/src/io/anuke/mindustry/Mindustry.java | 28 +- .../src/io/anuke/mindustry/content/Mechs.java | 12 +- .../content/blocks/TurretBlocks.java | 15 +- .../content/bullets/TurretBullets.java | 20 +- .../anuke/mindustry/content/fx/BlockFx.java | 4 +- .../mindustry/content/fx/EnvironmentFx.java | 1 + .../anuke/mindustry/content/fx/ShootFx.java | 18 +- core/src/io/anuke/mindustry/core/Control.java | 3 +- .../src/io/anuke/mindustry/core/Renderer.java | 8 +- core/src/io/anuke/mindustry/core/UI.java | 29 +- .../anuke/mindustry/editor/MapRenderer.java | 26 +- .../io/anuke/mindustry/editor/MapView.java | 86 ++---- .../entities/bullet/ArtilleryBulletType.java | 4 +- .../anuke/mindustry/entities/effect/Fire.java | 2 +- .../entities/traits/BuilderTrait.java | 5 +- .../mindustry/entities/units/GroundUnit.java | 19 +- core/src/io/anuke/mindustry/game/Saves.java | 1 - .../mindustry/graphics/FloorRenderer.java | 39 ++- .../anuke/mindustry/graphics/FogRenderer.java | 176 ------------- .../mindustry/graphics/IndexedRenderer.java | 248 ++++++++++++++++++ .../io/anuke/mindustry/graphics/Shaders.java | 29 +- .../io/anuke/mindustry/graphics/Shapes.java | 39 +++ .../anuke/mindustry/io/SaveFileVersion.java | 34 --- .../anuke/mindustry/maps/SectorPresets.java | 7 +- .../src/io/anuke/mindustry/net/NetworkIO.java | 34 --- core/src/io/anuke/mindustry/ui/Minimap.java | 30 +-- .../mindustry/ui/dialogs/JoinDialog.java | 2 +- core/src/io/anuke/mindustry/world/Tile.java | 14 - .../world/blocks/units/Reconstructor.java | 11 +- .../world/blocks/units/RepairPoint.java | 8 +- .../anuke/mindustry/desktop/CrashHandler.java | 12 +- .../mindustry/desktop/DesktopLauncher.java | 6 +- .../mindustry/desktop/DesktopPlatform.java | 12 +- {kryonet => net}/build.gradle | 0 net/build/libs/kryonet-release.jar | Bin 0 -> 22107 bytes net/build/libs/net-release.jar | Bin 0 -> 22107 bytes .../src/io/anuke/kryonet/ByteSerializer.java | 4 +- .../io/anuke/kryonet/FrameworkSerializer.java | 0 .../src/io/anuke/kryonet/KryoClient.java | 23 +- .../src/io/anuke/kryonet/KryoCore.java | 4 +- .../src/io/anuke/kryonet/KryoServer.java | 9 +- settings.gradle | 7 +- .../io/anuke/mindustry/BundleLauncher.java | 6 +- tools/src/io/anuke/mindustry/GenRegion.java | 5 +- tools/src/io/anuke/mindustry/Generators.java | 15 +- tools/src/io/anuke/mindustry/Image.java | 14 +- .../src/io/anuke/mindustry/ImageContext.java | 39 ++- .../io/anuke/mindustry/PackerLauncher.java | 2 +- 53 files changed, 560 insertions(+), 585 deletions(-) rename core/assets/cursors/{ibar.png => ibeam.png} (100%) delete mode 100644 core/src/io/anuke/mindustry/graphics/FogRenderer.java create mode 100644 core/src/io/anuke/mindustry/graphics/IndexedRenderer.java create mode 100644 core/src/io/anuke/mindustry/graphics/Shapes.java rename {kryonet => net}/build.gradle (100%) create mode 100644 net/build/libs/kryonet-release.jar create mode 100644 net/build/libs/net-release.jar rename {kryonet => net}/src/io/anuke/kryonet/ByteSerializer.java (97%) rename {kryonet => net}/src/io/anuke/kryonet/FrameworkSerializer.java (100%) rename {kryonet => net}/src/io/anuke/kryonet/KryoClient.java (92%) rename {kryonet => net}/src/io/anuke/kryonet/KryoCore.java (95%) rename {kryonet => net}/src/io/anuke/kryonet/KryoServer.java (98%) diff --git a/android/build.gradle b/android/build.gradle index 8a56fe58fb..4a388fee88 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -26,7 +26,7 @@ repositories { dependencies { implementation project(":core") - implementation project(":kryonet") + implementation project(":net") implementation 'com.android.support:support-v4:28.0.0' implementation 'org.sufficientlysecure:donations:2.5' implementation 'com.google.android.gms:play-services-auth:16.0.1' diff --git a/annotations/src/main/java/io/anuke/annotations/RemoteWriteGenerator.java b/annotations/src/main/java/io/anuke/annotations/RemoteWriteGenerator.java index 4ee8aec0df..7a6b42d74b 100644 --- a/annotations/src/main/java/io/anuke/annotations/RemoteWriteGenerator.java +++ b/annotations/src/main/java/io/anuke/annotations/RemoteWriteGenerator.java @@ -129,7 +129,7 @@ public class RemoteWriteGenerator{ method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")"); //add statement to create packet from pool - method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.arc.util.Pooling"); + method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.arc.util.pooling.Pools"); //assign buffer method.addStatement("packet.writeBuffer = TEMP_BUFFER"); //assign priority diff --git a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java index 2fad06df7c..cbfdc3bc06 100644 --- a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java @@ -53,7 +53,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("") .addSuperinterface(ParameterizedTypeName.get( - ClassName.bestGuess("io.anuke.arc.io.TypeSerializer"), type)); + ClassName.bestGuess("io.anuke.arc.Settings.TypeSerializer"), type)); MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write") .returns(void.class) @@ -84,8 +84,8 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ writeMethod.addStatement("stream.write" + capName + "(object." + name + ")"); readMethod.addStatement("object." + name + "= stream.read" + capName + "()"); }else{ - writeMethod.addStatement("io.anuke.arc.core.Core.settings.getSerializer(" + typeName+ ".class).write(stream, object." + name + ")"); - readMethod.addStatement("object." + name + " = (" +typeName+")io.anuke.arc.core.Core.settings.getSerializer(" + typeName+ ".class).read(stream)"); + writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).write(stream, object." + name + ")"); + readMethod.addStatement("object." + name + " = (" +typeName+")io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).read(stream)"); } } @@ -94,7 +94,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ serializer.addMethod(writeMethod.build()); serializer.addMethod(readMethod.build()); - method.addStatement("io.anuke.arc.core.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build()); + method.addStatement("io.anuke.arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build()); } classBuilder.addMethod(method.build()); diff --git a/build.gradle b/build.gradle index 85f23d1f5e..bedef4db0c 100644 --- a/build.gradle +++ b/build.gradle @@ -88,13 +88,13 @@ project(":desktop"){ dependencies{ compile project(":core") - compile project(":kryonet") + compile project(":net") if(new File(projectDir.parent, '../debug').exists() && System.properties["release"] == null) compile project(":debug") - compile "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" - compile "com.badlogicgames.gdx:gdx-controllers-lwjgl3:$gdxVersion" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" + + compile project(":Arc:backends:backend-lwjgl3") compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0' } } @@ -145,7 +145,7 @@ project(":ios"){ dependencies{ compile project(":core") - implementation project(":kryonet") + implementation project(":net") compile "com.mobidevelop.robovm:robovm-rt:$roboVMVersion" compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion" @@ -170,21 +170,12 @@ project(":core"){ if(new File(projectDir.parent, '../Arc').exists() && comp){ compile project(":Arc:arc-core") - //compile project(":Arc:extensions:freetype") + compile project(":Arc:extensions:freetype") }else{ //TODO compile arc from jitpack //compile 'com.github.Anuken.Arc:arc:-SNAPSHOT' } - // if(new File(projectDir.parent, '../GDXGifRecorder').exists() && comp){ - // compile project(":GDXGifRecorder") - // } - - - //compile "com.badlogicgames.gdx:gdx:$gdxVersion" - //compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion" - //compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" - compileOnly project(":annotations") annotationProcessor project(":annotations") } @@ -196,7 +187,7 @@ project(":server"){ dependencies{ compile project(":core") - compile project(":kryonet") + compile project(":net") compile "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" } @@ -235,7 +226,7 @@ project(":annotations"){ } } -project(":kryonet"){ +project(":net"){ apply plugin: "java" dependencies{ diff --git a/core/assets/cursors/ibar.png b/core/assets/cursors/ibeam.png similarity index 100% rename from core/assets/cursors/ibar.png rename to core/assets/cursors/ibeam.png diff --git a/core/src/io/anuke/mindustry/Mindustry.java b/core/src/io/anuke/mindustry/Mindustry.java index 753348b053..c00058a403 100644 --- a/core/src/io/anuke/mindustry/Mindustry.java +++ b/core/src/io/anuke/mindustry/Mindustry.java @@ -1,6 +1,6 @@ package io.anuke.mindustry; -import io.anuke.arc.ApplicationListener; +import io.anuke.arc.ApplicationCore; import io.anuke.arc.Core; import io.anuke.arc.Events; import io.anuke.arc.util.Log; @@ -11,10 +11,10 @@ import io.anuke.mindustry.io.BundleLoader; import static io.anuke.mindustry.Vars.*; -public class Mindustry implements ApplicationListener{ - private long lastFrameTime; +public class Mindustry extends ApplicationCore{ - public Mindustry(){ + @Override + public void setup(){ Time.setDeltaProvider(() -> { float result = Core.graphics.getDeltaTime() * 60f; return Float.isNaN(result) || Float.isInfinite(result) ? 1f : Math.min(result, 60f / 10f); @@ -28,26 +28,28 @@ public class Mindustry implements ApplicationListener{ BundleLoader.load(); content.load(); - Core.app.addListener(logic = new Logic()); - Core.app.addListener(world = new World()); - Core.app.addListener(control = new Control()); - Core.app.addListener(renderer = new Renderer()); - Core.app.addListener(ui = new UI()); - Core.app.addListener(netServer = new NetServer()); - Core.app.addListener(netClient = new NetClient()); + add(logic = new Logic()); + add(world = new World()); + add(control = new Control()); + add(renderer = new Renderer()); + add(ui = new UI()); + add(netServer = new NetServer()); + add(netClient = new NetClient()); } @Override public void init(){ + super.init(); + Log.info("Time to load [total]: {0}", Time.elapsed()); Events.fire(new GameLoadEvent()); } @Override public void update(){ - lastFrameTime = Time.millis(); + long lastFrameTime = Time.millis(); - //TODO ??render it all?? + super.update(); int fpsCap = Core.settings.getInt("fpscap", 125); diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/io/anuke/mindustry/content/Mechs.java index 4017065305..82651d9ec6 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.content; import io.anuke.arc.Core; import io.anuke.arc.entities.Effects; -import io.anuke.arc.Graphics; +import io.anuke.arc.graphics.Blending; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; @@ -202,14 +202,14 @@ public class Mechs implements ContentList{ public void draw(Player player){ if(player.shootHeat <= 0.01f) return; - float alpha = Core.batch.getColor().a; + float alpha = Core.graphics.batch().getColor().a; Shaders.build.progress = player.shootHeat; Shaders.build.region = armorRegion; Shaders.build.time = Time.time() / 10f; Shaders.build.color.set(Palette.accent).a = player.shootHeat; Draw.shader(Shaders.build); Draw.alpha(1f); - Draw.rect(armorRegion, player.snappedX(), player.snappedY(), player.rotation); + Draw.rect(armorRegion, player.snappedX(), player.snappedY()).rot(player.rotation); Draw.shader(Shaders.mix); Draw.color(1f, 1f, 1f, alpha); } @@ -268,13 +268,11 @@ public class Mechs implements ContentList{ public void draw(Player player){ float scl = scld(player); if(scl < 0.01f) return; - float alpha = Core.batch.getColor().a; + float alpha = Core.graphics.batch().getColor().a; Draw.shader(); - Graphics.setAdditiveBlending(); Draw.color(Palette.lancerLaser); Draw.alpha(scl/2f); - Draw.rect(shield, player.snappedX() + Mathf.range(scl/2f), player.snappedY() + Mathf.range(scl/2f), player.rotation - 90); - Graphics.setNormalBlending(); + Draw.rect(shield, player.snappedX() + Mathf.range(scl/2f), player.snappedY() + Mathf.range(scl/2f)).rot(player.rotation - 90).blend(Blending.additive); Draw.shader(Shaders.mix); Draw.color(); Draw.alpha(alpha); diff --git a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java index dbd4794aa6..2a11a2c96f 100644 --- a/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/TurretBlocks.java @@ -58,7 +58,7 @@ public class TurretBlocks extends BlockList implements ContentList{ ammoUseEffect = ShootFx.shellEjectSmall; health = 160; - drawer = (tile, entity) -> Draw.rect(entity.target != null ? shootRegion : region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); + drawer = (tile, entity) -> Draw.rect(entity.target != null ? shootRegion : region, tile.drawx() + tr2.x, tile.drawy() + tr2.y).rot(entity.rotation - 90); } }; @@ -157,20 +157,25 @@ public class TurretBlocks extends BlockList implements ContentList{ ammoUseEffect = ShootFx.shellEjectBig; drawer = (tile, entity) -> { - Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); - float offsetx = (int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 3f); - float offsety = -(int) (Mathf.abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 2f); + Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y).rot(entity.rotation - 90); + float offsetx = (int) (abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 3f); + float offsety = -(int) (abscurve(Mathf.curve(entity.reload / reload, 0.3f, 0.2f)) * 2f); for(int i : Mathf.signs){ float rot = entity.rotation + 90 * i; Draw.rect(panels[i == -1 ? 0 : 1], tile.drawx() + tr2.x + Angles.trnsx(rot, offsetx, offsety), - tile.drawy() + tr2.y + Angles.trnsy(rot, -offsetx, offsety), entity.rotation - 90); + tile.drawy() + tr2.y + Angles.trnsy(rot, -offsetx, offsety)).rot(entity.rotation - 90); } }; health = 360; } + + /** Converts a value range from 0-1 to a value range 0-1-0. */ + float abscurve(float f){ + return 1f - Math.abs(f - 0.5f) * 2f; + } }; ripple = new ArtilleryTurret("ripple"){{ diff --git a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java index bacf36be8e..a326387785 100644 --- a/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java +++ b/core/src/io/anuke/mindustry/content/bullets/TurretBullets.java @@ -1,6 +1,14 @@ package io.anuke.mindustry.content.bullets; +import io.anuke.arc.entities.Effects; import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.g2d.CapStyle; +import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.arc.graphics.g2d.Fill; +import io.anuke.arc.graphics.g2d.Lines; +import io.anuke.arc.math.Angles; +import io.anuke.arc.math.Mathf; +import io.anuke.arc.util.Time; import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.StatusEffects; import io.anuke.mindustry.content.fx.BlockFx; @@ -15,14 +23,10 @@ import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.entities.effect.Lightning; import io.anuke.mindustry.game.ContentList; import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.graphics.Shapes; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.BuildBlock; import io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData; -import io.anuke.arc.entities.Effects; -import io.anuke.arc.util.Time; -import io.anuke.arc.graphics.*; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; import static io.anuke.mindustry.Vars.content; import static io.anuke.mindustry.Vars.world; @@ -342,10 +346,10 @@ public class TurretBullets extends BulletList implements ContentList{ float w = 11f, h = 13f; Draw.color(Palette.bulletYellowBack); - Draw.rect("shell-back", b.x, b.y, w, h, b.angle() + 90); + Draw.rect("shell-back", b.x, b.y, w, h).rot(b.angle() + 90); Draw.color(Palette.bulletYellow); - Draw.rect("shell", b.x, b.y, w, h, b.angle() + 90); + Draw.rect("shell", b.x, b.y, w, h).rot(b.angle() + 90); Draw.reset(); } @@ -379,7 +383,7 @@ public class TurretBullets extends BulletList implements ContentList{ float baseAngle = data.to.angleTo(data.from); //if angles are nearby, then yes, it did - if(Mathf.angNear(angleTo, baseAngle, 2f)){ + if(Angles.near(angleTo, baseAngle, 2f)){ intersect = true; //snap bullet position back; this is used for low-FPS situations b.set(data.to.x + Angles.trnsx(baseAngle, hitDst), data.to.y + Angles.trnsy(baseAngle, hitDst)); diff --git a/core/src/io/anuke/mindustry/content/fx/BlockFx.java b/core/src/io/anuke/mindustry/content/fx/BlockFx.java index 8198377bf2..042fa5516a 100644 --- a/core/src/io/anuke/mindustry/content/fx/BlockFx.java +++ b/core/src/io/anuke/mindustry/content/fx/BlockFx.java @@ -263,14 +263,14 @@ public class BlockFx extends FxList implements ContentList{ Draw.reset(); }); ripple = new GroundEffect(false, 30, e -> { - Draw.color(Hue.shift(Tmp.c1.set(e.color), 2, 0.1f)); + Draw.color(Tmp.c1.set(e.color).shiftValue(0.1f)); Lines.stroke(e.fout() + 0.4f); Lines.circle(e.x, e.y, 2f + e.fin() * 4f); Draw.reset(); }); bubble = new Effect(20, e -> { - Draw.color(Hue.shift(Tmp.c1.set(e.color), 2, 0.1f)); + Draw.color(Tmp.c1.set(e.color).shiftValue(0.1f)); Lines.stroke(e.fout() + 0.2f); Angles.randLenVectors(e.id, 2, 8f, (x, y) -> { Lines.circle(e.x + x, e.y + y, 1f + e.fin() * 3f); diff --git a/core/src/io/anuke/mindustry/content/fx/EnvironmentFx.java b/core/src/io/anuke/mindustry/content/fx/EnvironmentFx.java index abd76acf28..16b3c5e85a 100644 --- a/core/src/io/anuke/mindustry/content/fx/EnvironmentFx.java +++ b/core/src/io/anuke/mindustry/content/fx/EnvironmentFx.java @@ -4,6 +4,7 @@ import io.anuke.arc.entities.Effects.Effect; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Fill; +import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.game.ContentList; diff --git a/core/src/io/anuke/mindustry/content/fx/ShootFx.java b/core/src/io/anuke/mindustry/content/fx/ShootFx.java index 1cd63b53ba..263ab8cf43 100644 --- a/core/src/io/anuke/mindustry/content/fx/ShootFx.java +++ b/core/src/io/anuke/mindustry/content/fx/ShootFx.java @@ -1,16 +1,16 @@ package io.anuke.mindustry.content.fx; -import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect; -import io.anuke.mindustry.graphics.Palette; -import io.anuke.mindustry.game.ContentList; import io.anuke.arc.entities.Effects.Effect; +import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Fill; import io.anuke.arc.graphics.g2d.Lines; -import io.anuke.arc.graphics.Shapes; import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; +import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect; +import io.anuke.mindustry.game.ContentList; +import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.graphics.Shapes; public class ShootFx extends FxList implements ContentList{ public static Effect shootSmall, shootHeal, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke, shootBigSmoke2, shootSmallFlame, shootLiquid, shellEjectSmall, shellEjectMedium, shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot; @@ -111,7 +111,7 @@ public class ShootFx extends FxList implements ContentList{ Draw.rect("white", e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), - 1f, 2f, rot + e.fin() * 50f * i); + 1f, 2f).rot(rot + e.fin() * 50f * i); Draw.color(); }); @@ -125,7 +125,7 @@ public class ShootFx extends FxList implements ContentList{ Draw.rect("casing", e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), - 2f, 3f, rot); + 2f, 3f).rot(rot); } Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin()); @@ -148,8 +148,8 @@ public class ShootFx extends FxList implements ContentList{ Draw.rect("casing", e.x + Angles.trnsx(lr, len) + Mathf.randomSeedRange(e.id + i + 7, 3f * e.fin()), e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), - 2.5f, 4f, - rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin())); + 2.5f, 4f) + .rot(rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin())); } Draw.color(Color.LIGHT_GRAY); diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index af0c17dc01..56cdb7e2f9 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -57,11 +57,12 @@ public class Control implements ApplicationListener{ unlocks = new Unlocks(); Core.input.setCatch(KeyCode.BACK, true); + Core.keybinds.setDefaults(Binding.values()); Effects.setShakeFalloff(10000f); content.initialize(Content::init); - Core.atlas = new TextureAtlas("sprites.atlas"); + Core.atlas = new TextureAtlas("sprites/sprites.atlas"); content.initialize(Content::load); unlocks.load(); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 513ae5353d..e5dc8abe04 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -10,6 +10,7 @@ import io.anuke.arc.entities.trait.DrawTrait; import io.anuke.arc.entities.trait.Entity; import io.anuke.arc.function.Consumer; import io.anuke.arc.function.Predicate; +import io.anuke.arc.graphics.Camera; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Lines; @@ -37,7 +38,6 @@ public class Renderer implements ApplicationListener{ public final BlockRenderer blocks = new BlockRenderer(); public final MinimapRenderer minimap = new MinimapRenderer(); public final OverlayRenderer overlays = new OverlayRenderer(); - public final FogRenderer fog = new FogRenderer(); private Color clearColor; private int targetscale = baseCameraScale; @@ -45,6 +45,7 @@ public class Renderer implements ApplicationListener{ private Vector2 avgPosition = new Vector2(); public Renderer(){ + camera = new Camera(); Lines.setCircleVertices(14); Shaders.init(); @@ -285,11 +286,6 @@ public class Renderer implements ApplicationListener{ camera.resize(width, height); } - @Override - public void dispose(){ - fog.dispose(); - } - public Vector2 averagePosition(){ avgPosition.setZero(); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 58539c88d4..0b248f5fa1 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -5,6 +5,8 @@ import io.anuke.arc.Core; import io.anuke.arc.Events; import io.anuke.arc.Graphics.Cursor; import io.anuke.arc.Graphics.Cursor.SystemCursor; +import io.anuke.arc.freetype.FreeTypeFontGenerator; +import io.anuke.arc.freetype.FreeTypeFontGenerator.FreeTypeFontParameter; import io.anuke.arc.function.Consumer; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Colors; @@ -24,7 +26,6 @@ import io.anuke.arc.scene.ui.layout.Unit; import io.anuke.arc.util.Align; import io.anuke.arc.util.Strings; import io.anuke.arc.util.Time; -import io.anuke.arc.freetype.*; import io.anuke.mindustry.editor.MapEditorDialog; import io.anuke.mindustry.game.EventType.ResizeEvent; import io.anuke.mindustry.graphics.Palette; @@ -32,17 +33,18 @@ import io.anuke.mindustry.ui.dialogs.*; import io.anuke.mindustry.ui.fragments.*; import static io.anuke.arc.scene.actions.Actions.*; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.control; +import static io.anuke.mindustry.Vars.disableUI; public class UI implements ApplicationListener{ private FreeTypeFontGenerator generator; - public final MenuFragment menufrag = new MenuFragment(); - public final HudFragment hudfrag = new HudFragment(); - public final ChatFragment chatfrag = new ChatFragment(); - public final PlayerListFragment listfrag = new PlayerListFragment(); - public final BackgroundFragment backfrag = new BackgroundFragment(); - public final LoadingFragment loadfrag = new LoadingFragment(); + public MenuFragment menufrag; + public HudFragment hudfrag; + public ChatFragment chatfrag; + public PlayerListFragment listfrag; + public BackgroundFragment backfrag; + public LoadingFragment loadfrag; public AboutDialog about; public RestartDialog restart; @@ -71,7 +73,7 @@ public class UI implements ApplicationListener{ public UI(){ Skin skin = new Skin(Core.atlas); - generateFonts(); + generateFonts(skin); skin.load(Core.files.internal("ui/uiskin.json")); for(BitmapFont font : skin.getAll(BitmapFont.class).values()){ @@ -120,7 +122,7 @@ public class UI implements ApplicationListener{ Core.graphics.restoreCursor(); } - void generateFonts(){ + void generateFonts(Skin skin){ generator = new FreeTypeFontGenerator(Core.files.internal("fonts/pixel.ttf")); FreeTypeFontParameter param = new FreeTypeFontParameter(); param.size = (int)(14*2 * Math.max(Unit.dp.scl(1f), 0.5f)); @@ -145,6 +147,13 @@ public class UI implements ApplicationListener{ @Override public void init(){ + menufrag = new MenuFragment(); + hudfrag = new HudFragment(); + chatfrag = new ChatFragment(); + listfrag = new PlayerListFragment(); + backfrag = new BackgroundFragment(); + loadfrag = new LoadingFragment(); + editor = new MapEditorDialog(); controls = new ControlsDialog(); restart = new RestartDialog(); diff --git a/core/src/io/anuke/mindustry/editor/MapRenderer.java b/core/src/io/anuke/mindustry/editor/MapRenderer.java index 4092f154e9..a0b08ad66a 100644 --- a/core/src/io/anuke/mindustry/editor/MapRenderer.java +++ b/core/src/io/anuke/mindustry/editor/MapRenderer.java @@ -1,21 +1,20 @@ package io.anuke.mindustry.editor; +import io.anuke.arc.Core; +import io.anuke.arc.collection.IntSet; +import io.anuke.arc.collection.IntSet.IntSetIterator; import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; +import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Point2; import io.anuke.arc.util.Disposable; -import io.anuke.arc.util.IntSet; -import io.anuke.arc.util.IntSet.IntSetIterator; +import io.anuke.arc.util.Pack; +import io.anuke.arc.util.Structs; import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.graphics.IndexedRenderer; import io.anuke.mindustry.maps.MapTileData.DataPosition; import io.anuke.mindustry.world.Block; -import io.anuke.arc.Core; -import io.anuke.arc.Graphics; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.IndexedRenderer; -import io.anuke.arc.util.Structs; -import io.anuke.arc.util.Bits; -import io.anuke.arc.math.geom.Geometry; import static io.anuke.mindustry.Vars.content; import static io.anuke.mindustry.Vars.tilesize; @@ -56,7 +55,7 @@ public class MapRenderer implements Disposable{ public void draw(float tx, float ty, float tw, float th){ - Graphics.end(); + Draw.flush(); IntSetIterator it = updates.iterator(); while(it.hasNext){ @@ -79,15 +78,12 @@ public class MapRenderer implements Disposable{ mesh = chunks[x][y]; } - mesh.getTransformMatrix().setToTranslation(tx, ty, 0).scl(tw / (width * tilesize), - th / (height * tilesize), 1f); - mesh.setProjectionMatrix(Core.batch.getProjectionMatrix()); + mesh.getTransformMatrix().setToTranslation(tx, ty).scale(tw / (width * tilesize), th / (height * tilesize)); + mesh.setProjectionMatrix(Core.graphics.batch().getProjection()); mesh.render(Core.atlas.getTextures().first()); } } - - Graphics.begin(); } public void updatePoint(int x, int y){ diff --git a/core/src/io/anuke/mindustry/editor/MapView.java b/core/src/io/anuke/mindustry/editor/MapView.java index 3a2c98bd0f..7b98e37955 100644 --- a/core/src/io/anuke/mindustry/editor/MapView.java +++ b/core/src/io/anuke/mindustry/editor/MapView.java @@ -1,32 +1,27 @@ package io.anuke.mindustry.editor; -import io.anuke.arc.Input.Buttons; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Batch; -import io.anuke.arc.input.GestureDetector; -import io.anuke.arc.input.GestureDetector.GestureListener; -import io.anuke.arc.math.Bresenham2; -import io.anuke.arc.math.geom.Point2; -import io.anuke.arc.math.geom.Rectangle; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.collection.Array; -import io.anuke.mindustry.editor.DrawOperation.TileOperation; -import io.anuke.mindustry.graphics.Palette; -import io.anuke.mindustry.ui.GridImage; import io.anuke.arc.Core; -import io.anuke.arc.Graphics; -import io.anuke.arc.Inputs; +import io.anuke.arc.collection.Array; +import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Lines; +import io.anuke.arc.graphics.g2d.ScissorStack; +import io.anuke.arc.input.GestureDetector; +import io.anuke.arc.input.GestureDetector.GestureListener; +import io.anuke.arc.input.KeyCode; +import io.anuke.arc.math.Mathf; +import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.Element; import io.anuke.arc.scene.event.InputEvent; import io.anuke.arc.scene.event.InputListener; import io.anuke.arc.scene.event.Touchable; import io.anuke.arc.scene.ui.TextField; import io.anuke.arc.scene.ui.layout.Unit; -import io.anuke.arc.math.geom.Geometry; -import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Tmp; +import io.anuke.mindustry.editor.DrawOperation.TileOperation; +import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.input.Binding; +import io.anuke.mindustry.ui.GridImage; import static io.anuke.mindustry.Vars.mobile; import static io.anuke.mindustry.Vars.ui; @@ -60,7 +55,7 @@ public class MapView extends Element implements GestureListener{ brushPolygons[i] = Geometry.pixelCircle(size, (index, x, y) -> Mathf.dst(x, y, index, index) <= index - 0.5f); } - Core.input.addProcessor(0, new GestureDetector(20, 0.5f, 2, 0.15f, this)); + Core.input.getInputProcessors().insert(0, new GestureDetector(20, 0.5f, 2, 0.15f, this)); touchable(Touchable.enabled); addListener(new InputListener(){ @@ -74,16 +69,16 @@ public class MapView extends Element implements GestureListener{ } @Override - public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){ + public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){ if(pointer != 0){ return false; } - if(!mobile && button != Buttons.LEFT && button != Buttons.MIDDLE){ + if(!mobile && button != KeyCode.MOUSE_LEFT && button != KeyCode.MOUSE_MIDDLE){ return true; } - if(button == Buttons.MIDDLE){ + if(button == KeyCode.MOUSE_MIDDLE){ lastTool = tool; tool = EditorTool.zoom; } @@ -112,8 +107,8 @@ public class MapView extends Element implements GestureListener{ } @Override - public void touchUp(InputEvent event, float x, float y, int pointer, int button){ - if(!mobile && button != Buttons.LEFT && button != Buttons.MIDDLE){ + public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){ + if(!mobile && button != KeyCode.MOUSE_LEFT && button != KeyCode.MOUSE_MIDDLE){ return; } @@ -214,16 +209,16 @@ public class MapView extends Element implements GestureListener{ super.act(delta); if(Core.scene.getKeyboardFocus() == null || !(Core.scene.getKeyboardFocus() instanceof TextField) && - !Core.input.keyDown(io.anuke.arc.input.Input.CONTROL_LEFT)){ - float ax = Core.input.getAxis("move_x"); - float ay = Core.input.getAxis("move_y"); + !Core.input.keyDown(KeyCode.CONTROL_LEFT)){ + float ax = Core.input.axis(Binding.move_x); + float ay = Core.input.axis(Binding.move_y); offsetx -= ax * 15f / zoom; offsety -= ay * 15f / zoom; } if(ui.editor.hasPane()) return; - zoom += Core.input.scroll() / 10f * zoom; + zoom += Core.input.axis(KeyCode.SCROLL) / 10f * zoom; clampZoom(); } @@ -258,7 +253,7 @@ public class MapView extends Element implements GestureListener{ } @Override - public void draw(Batch batch, float alpha){ + public void draw(){ float ratio = 1f / ((float) editor.getMap().width() / editor.getMap().height()); float size = Math.min(width, height); float sclwidth = size * zoom; @@ -268,7 +263,9 @@ public class MapView extends Element implements GestureListener{ image.setImageSize(editor.getMap().width(), editor.getMap().height()); - Graphics.beginClip(x, y, width, height); + if(!ScissorStack.pushScissors(rect.set(x, y, width, height))){ + return; + } Draw.color(Palette.remove); Lines.stroke(2f); @@ -279,7 +276,7 @@ public class MapView extends Element implements GestureListener{ if(grid){ Draw.color(Color.GRAY); image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); - image.draw(batch, alpha); + image.draw(); Draw.color(); } @@ -323,8 +320,6 @@ public class MapView extends Element implements GestureListener{ } } - Graphics.endClip(); - Draw.color(Palette.accent); Lines.stroke(Unit.dp.scl(3f)); Lines.rect(x, y, width, height); @@ -335,27 +330,7 @@ public class MapView extends Element implements GestureListener{ return Core.scene.getKeyboardFocus() != null && Core.scene.getKeyboardFocus().isDescendantOf(ui.editor) && ui.editor.isShown() && tool == EditorTool.zoom && - Core.scene.hit(Graphics.mouse().x, Graphics.mouse().y, true) == this; - } - - @Override - public boolean touchDown(float x, float y, int pointer, int button){ - return false; - } - - @Override - public boolean tap(float x, float y, int count, int button){ - return false; - } - - @Override - public boolean longPress(float x, float y){ - return false; - } - - @Override - public boolean fling(float velocityX, float velocityY, int button){ - return false; + Core.scene.hit(Core.input.mouse().x, Core.input.mouse().y, true) == this; } @Override @@ -366,11 +341,6 @@ public class MapView extends Element implements GestureListener{ return false; } - @Override - public boolean panStop(float x, float y, int pointer, int button){ - return false; - } - @Override public boolean zoom(float initialDistance, float distance){ if(!active()) return false; diff --git a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java index 6a317f0882..7bbba4afeb 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/ArtilleryBulletType.java @@ -34,9 +34,9 @@ public class ArtilleryBulletType extends BasicBulletType{ float height = bulletHeight * ((1f - bulletShrink) + bulletShrink * b.fout()); Draw.color(backColor); - Draw.rect(backRegion, b.x, b.y, bulletWidth * scale, height * scale, b.angle() - 90); + Draw.rect(backRegion, b.x, b.y, bulletWidth * scale, height * scale).rot(b.angle() - 90); Draw.color(frontColor); - Draw.rect(frontRegion, b.x, b.y, bulletWidth * scale, height * scale, b.angle() - 90); + Draw.rect(frontRegion, b.x, b.y, bulletWidth * scale, height * scale).rot(b.angle() - 90); Draw.color(); } } diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java index 07fece83ec..a87dfefa9b 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java @@ -8,7 +8,7 @@ import io.anuke.arc.entities.EntityGroup; import io.anuke.arc.entities.impl.TimedEntity; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; -import io.anuke.arc.math.geom.Point2 +import io.anuke.arc.math.geom.Point2; import io.anuke.arc.util.Structs; import io.anuke.arc.util.Time; import io.anuke.arc.util.pooling.Pool.Poolable; diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 23629674e1..0933a9db79 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -22,6 +22,7 @@ import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.game.EventType.BuildSelectEvent; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.graphics.Shapes; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Recipe; @@ -353,8 +354,8 @@ public interface BuilderTrait extends Entity{ float ey = tile.worldy() + Mathf.sin(Time.time() + 48, swingScl + 2f, swingMag); Draw.color(Color.LIGHT_GRAY, Color.WHITE, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl)); - //TODO better laser drawing functions - //Shapes.laser("minelaser", "minelaser-end", px, py, ex, ey); + + Shapes.laser("minelaser", "minelaser-end", px, py, ex, ey); if(unit instanceof Player && ((Player) unit).isLocal){ Lines.stroke(1f, Palette.accent); diff --git a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java index 4a3a0a58cd..122fec1238 100644 --- a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java @@ -1,7 +1,11 @@ package io.anuke.mindustry.entities.units; import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.arc.math.Angles; +import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Vector2; +import io.anuke.arc.util.Time; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.Predict; import io.anuke.mindustry.entities.TileEntity; @@ -12,11 +16,6 @@ import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.Weapon; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; -import io.anuke.arc.util.Time; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Vector2; import java.io.DataInput; import java.io.DataOutput; @@ -155,7 +154,7 @@ public abstract class GroundUnit extends BaseUnit{ Draw.rect(type.legRegion, x + Angles.trnsx(baseRotation, ft * i), y + Angles.trnsy(baseRotation, ft * i), - 12f * i, 12f - Mathf.clamp(ft * i, 0, 2), baseRotation - 90); + 12f * i, 12f - Mathf.clamp(ft * i, 0, 2)).rot(baseRotation - 90); } if(floor.isLiquid){ @@ -164,16 +163,16 @@ public abstract class GroundUnit extends BaseUnit{ Draw.tint(Color.WHITE); } - Draw.rect(type.baseRegion, x, y, baseRotation - 90); + Draw.rect(type.baseRegion, x, y).rot(baseRotation - 90); - Draw.rect(type.region, x, y, rotation - 90); + Draw.rect(type.region, x, y).rot(rotation - 90); for(int i : Mathf.signs){ float tra = rotation - 90, trY = -weapon.getRecoil(this, i > 0) + type.weaponOffsetY; float w = i > 0 ? -12 : 12; Draw.rect(weapon.equipRegion, x + Angles.trnsx(tra, type.weaponOffsetX * i, trY), - y + Angles.trnsy(tra, type.weaponOffsetX * i, trY), w, 12, rotation - 90); + y + Angles.trnsy(tra, type.weaponOffsetX * i, trY), w, 12).rot(rotation - 90); } drawItems(); @@ -191,7 +190,7 @@ public abstract class GroundUnit extends BaseUnit{ if(dst(target) < getWeapon().getAmmo().getRange()){ rotate(angleTo(target)); - if(Mathf.angNear(angleTo(target), rotation, 13f)){ + if(Angles.near(angleTo(target), rotation, 13f)){ AmmoType ammo = getWeapon().getAmmo(); Vector2 to = Predict.intercept(GroundUnit.this, target, ammo.bullet.speed); diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index c9bbfe98c2..ba93efea35 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -163,7 +163,6 @@ public class Saves{ public void save(){ long time = totalPlaytime; - renderer.fog.writeFog(); long prev = totalPlaytime; totalPlaytime = time; diff --git a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java index 5f8cc6497f..6dcb73b6d5 100644 --- a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java @@ -2,19 +2,22 @@ package io.anuke.mindustry.graphics; import io.anuke.arc.Core; import io.anuke.arc.Events; -import io.anuke.arc.Graphics; import io.anuke.arc.collection.IntArray; import io.anuke.arc.collection.IntSet; import io.anuke.arc.collection.IntSet.IntSetIterator; import io.anuke.arc.collection.ObjectSet; +import io.anuke.arc.graphics.Camera; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.GL20; +import io.anuke.arc.graphics.g2d.CacheBatch; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Fill; +import io.anuke.arc.graphics.g2d.SpriteBatch; import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Log; import io.anuke.arc.util.Structs; import io.anuke.arc.util.Time; +import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.maps.Sector; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Floor; @@ -33,7 +36,7 @@ public class FloorRenderer{ private IntArray drawnLayers = new IntArray(); public FloorRenderer(){ - Events.on(WorldLoadGraphicsEvent.class, event -> clearTiles()); + Events.on(WorldLoadEvent.class, event -> clearTiles()); } public void drawFloor(){ @@ -41,13 +44,13 @@ public class FloorRenderer{ return; } - OrthographicCamera camera = Core.camera; + Camera camera = Core.camera; int crangex = (int) (camera.width / (chunksize * tilesize)) + 1; int crangey = (int) (camera.height / (chunksize * tilesize)) + 1; - int camx = Mathf.scl(camera.position.x, chunksize * tilesize); - int camy = Mathf.scl(camera.position.y, chunksize * tilesize); + int camx = (int)(camera.position.x / (chunksize * tilesize)); + int camy = (int)(camera.position.y / (chunksize * tilesize)); int layers = CacheLayer.values().length; @@ -81,7 +84,7 @@ public class FloorRenderer{ drawnLayers.sort(); - Graphics.end(); + Draw.flush(); beginDraw(); for(int i = 0; i < drawnLayers.size; i++){ @@ -91,7 +94,6 @@ public class FloorRenderer{ } endDraw(); - Graphics.begin(); } public void beginDraw(){ @@ -99,7 +101,7 @@ public class FloorRenderer{ return; } - cbatch.setProjectionMatrix(Core.camera.combined); + cbatch.setProjection(Core.camera.projection()); cbatch.beginDraw(); Core.gl.glEnable(GL20.GL_BLEND); @@ -118,7 +120,7 @@ public class FloorRenderer{ return; } - OrthographicCamera camera = Core.camera; + Camera camera = Core.camera; int crangex = (int) (camera.width / (chunksize * tilesize)) + 1; int crangey = (int) (camera.height / (chunksize * tilesize)) + 1; @@ -127,8 +129,8 @@ public class FloorRenderer{ for(int x = -crangex; x <= crangex; x++){ for(int y = -crangey; y <= crangey; y++){ - int worldx = Mathf.scl(camera.position.x, chunksize * tilesize) + x; - int worldy = Mathf.scl(camera.position.y, chunksize * tilesize) + y; + int worldx = (int)(camera.position.x / (chunksize * tilesize)) + x; + int worldy = (int)(camera.position.y / (chunksize * tilesize)) + y; if(!Structs.inBounds(worldx, worldy, cache)){ continue; @@ -145,7 +147,7 @@ public class FloorRenderer{ private void fillChunk(float x, float y){ Draw.color(Color.BLACK); - Fill.crect(x, y, chunksize * tilesize, chunksize * tilesize); + Fill.rect().set(x, y, chunksize * tilesize, chunksize * tilesize); Draw.color(); } @@ -172,11 +174,8 @@ public class FloorRenderer{ } private void cacheChunkLayer(int cx, int cy, Chunk chunk, CacheLayer layer){ - - Graphics.useBatch(cbatch); - cbatch.begin(); - - Sector sector = world.getSector(); + SpriteBatch current = Core.graphics.batch(); + Core.graphics.useBatch(cbatch); for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){ @@ -196,10 +195,8 @@ public class FloorRenderer{ } } } - - cbatch.end(); - Graphics.popBatch(); - chunk.caches[layer.ordinal()] = cbatch.getLastCache(); + Core.graphics.useBatch(current); + chunk.caches[layer.ordinal()] = cbatch.flushCache(); } public void clearTiles(){ diff --git a/core/src/io/anuke/mindustry/graphics/FogRenderer.java b/core/src/io/anuke/mindustry/graphics/FogRenderer.java deleted file mode 100644 index fe391418b3..0000000000 --- a/core/src/io/anuke/mindustry/graphics/FogRenderer.java +++ /dev/null @@ -1,176 +0,0 @@ -package io.anuke.mindustry.graphics; - -import io.anuke.arc.Core; -import io.anuke.arc.Events; -import io.anuke.arc.Graphics; -import io.anuke.arc.collection.Array; -import io.anuke.arc.entities.EntityDraw; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.GL20; -import io.anuke.arc.graphics.Pixmap.Format; -import io.anuke.arc.graphics.Texture; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Fill; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.graphics.glutils.FrameBuffer; -import io.anuke.arc.util.Disposable; -import io.anuke.mindustry.entities.Unit; -import io.anuke.mindustry.game.EventType.TileChangeEvent; -import io.anuke.mindustry.game.EventType.WorldLoadEvent; -import io.anuke.mindustry.world.Tile; - -import java.nio.ByteBuffer; - -import static io.anuke.mindustry.Vars.*; - -/**Used for rendering fog of war. A framebuffer is used for this.*/ -public class FogRenderer implements Disposable{ - private TextureRegion region = new TextureRegion(); - private FrameBuffer buffer; - private ByteBuffer pixelBuffer; - private Array changeQueue = new Array<>(); - private int shadowPadding; - private boolean dirty; - - public FogRenderer(){ - Events.on(WorldLoadEvent.class, event -> { - dispose(); - - shadowPadding = -1; - - buffer = new FrameBuffer(Format.RGBA8888, world.width(), world.height(), false); - changeQueue.clear(); - - //clear buffer to black - buffer.begin(); - Core.graphics.clear(0, 0, 0, 1f); - 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().synthetic() && tile.block().viewRange > 0){ - changeQueue.add(tile); - } - } - } - - pixelBuffer = ByteBuffer.allocateDirect(world.width() * world.height() * 4); - dirty = true; - }); - - Events.on(TileChangeEvent.class, event -> { - if(event.tile.getTeam() == players[0].getTeam() && event.tile.block().synthetic() && event.tile.block().viewRange > 0){ - changeQueue.add(event.tile); - } - }); - } - - public void writeFog(){ - if(buffer == null) return; - - buffer.begin(); - pixelBuffer.position(0); - Core.gl.glPixelStorei(GL20.GL_PACK_ALIGNMENT, 1); - Core.gl.glReadPixels(0, 0, world.width(), world.height(), GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixelBuffer); - - pixelBuffer.position(0); - for(int i = 0; i < world.width() * world.height(); i++){ - int x = i % world.width(); - int y = i / world.width(); - byte r = pixelBuffer.get(); - if(r != 0){ - world.tile(x, y).setVisibility((byte)1); - } - pixelBuffer.position(pixelBuffer.position() + 3); - } - buffer.end(); - } - - public int getPadding(){ - return -shadowPadding; - } - - public void draw(){ - if(buffer == null) return; - - float vw = Core.camera.width ; - float vh = Core.camera.height ; - - float px = Core.camera.position.x - vw / 2f; - float py = Core.camera.position.y - vh / 2f; - - float u = (px / tilesize) / buffer.getWidth(); - float v = (py / tilesize) / buffer.getHeight(); - - float u2 = ((px + vw) / tilesize) / buffer.getWidth(); - float v2 = ((py + vh) / tilesize) / buffer.getHeight(); - - Core.batch.getProjectionMatrix().setToOrtho2D(0, 0, buffer.getWidth() * tilesize, buffer.getHeight() * tilesize); - - Draw.color(Color.WHITE); - - buffer.begin(); - - Graphics.beginClip((-shadowPadding), (-shadowPadding), (world.width() + shadowPadding*2), (world.height() + shadowPadding*2)); - - Graphics.begin(); - EntityDraw.setClip(false); - - renderer.drawAndInterpolate(playerGroup, player -> !player.isDead() && player.getTeam() == players[0].getTeam(), Unit::drawView); - renderer.drawAndInterpolate(unitGroups[players[0].getTeam().ordinal()], unit -> !unit.isDead(), Unit::drawView); - - for(Tile tile : changeQueue){ - float viewRange = tile.block().viewRange; - if(viewRange < 0) continue; - Fill.circle(tile.drawx(), tile.drawy(), tile.block().viewRange); - } - - changeQueue.clear(); - - if(dirty){ - for(int x = 0; x < world.width(); x++){ - for(int y = 0; y < world.height(); y++){ - Tile tile = world.tile(x, y); - if(tile.discovered()){ - Fill.rect(tile.worldx(), tile.worldy(), tilesize, tilesize); - } - } - } - dirty = false; - } - - EntityDraw.setClip(true); - Graphics.end(); - buffer.end(); - - Graphics.endClip(); - - region.setTexture(buffer.getTexture()); - region.setRegion(u, v2, u2, v); - - Core.batch.setProjectionMatrix(Core.camera.combined); - Draw.shader(Shaders.fog); - renderer.pixelSurface.getBuffer().begin(); - Graphics.begin(); - - Core.batch.draw(region, px, py, vw, vh); - - Graphics.end(); - renderer.pixelSurface.getBuffer().end(); - Draw.shader(); - - Graphics.setScreen(); - Core.batch.draw(renderer.pixelSurface.texture(), 0, Core.graphics.getHeight(), Core.graphics.getWidth(), -Core.graphics.getHeight()); - Graphics.end(); - } - - public Texture getTexture(){ - return buffer.getTexture(); - } - - @Override - public void dispose(){ - if(buffer != null) buffer.dispose(); - } -} diff --git a/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java b/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java new file mode 100644 index 0000000000..9e5d25515a --- /dev/null +++ b/core/src/io/anuke/mindustry/graphics/IndexedRenderer.java @@ -0,0 +1,248 @@ +package io.anuke.mindustry.graphics; + +import io.anuke.arc.Core; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.VertexAttributes.Usage; +import io.anuke.arc.graphics.g2d.TextureRegion; +import io.anuke.arc.graphics.glutils.Shader; +import io.anuke.arc.math.Mathf; +import io.anuke.arc.math.Matrix3; +import io.anuke.arc.util.Disposable; + +//TODO this class is a trainwreck, remove it +public class IndexedRenderer implements Disposable{ + private final static int vsize = 5; + + private Shader program = createDefaultShader(); + private Mesh mesh; + private float[] tmpVerts = new float[vsize * 6]; + private float[] vertices; + + private Matrix3 projMatrix = new Matrix3(); + private Matrix3 transMatrix = new Matrix3(); + private Matrix3 combined = new Matrix3(); + private float color = Color.WHITE.toFloatBits(); + + public IndexedRenderer(int sprites){ + resize(sprites); + } + + static public Shader createDefaultShader(){ + String vertexShader = "attribute vec4 " + Shader.POSITION_ATTRIBUTE + ";\n" // + + "attribute vec2 " + Shader.TEXCOORD_ATTRIBUTE + "0;\n" // + + "uniform mat4 u_projTrans;\n" // + + "varying vec2 v_texCoords;\n" // + + "\n" // + + "void main()\n" // + + "{\n" // + + " v_texCoords = " + Shader.TEXCOORD_ATTRIBUTE + "0;\n" // + + " gl_Position = u_projTrans * " + Shader.POSITION_ATTRIBUTE + ";\n" // + + "}\n"; + String fragmentShader = "#ifdef GL_ES\n" // + + "#define LOWP lowp\n" // + + "precision mediump float;\n" // + + "#else\n" // + + "#define LOWP \n" // + + "#endif\n" // + + "varying vec2 v_texCoords;\n" // + + "uniform sampler2D u_texture;\n" // + + "void main()\n"// + + "{\n" // + + " gl_FragColor = texture2D(u_texture, v_texCoords);\n" // + + "}"; + + return new Shader(vertexShader, fragmentShader); + } + + public void render(Texture texture){ + Core.gl.glEnable(GL20.GL_BLEND); + + updateMatrix(); + + program.begin(); + + texture.bind(); + + program.setUniformMatrix("u_projTrans", combined); + program.setUniformi("u_texture", 0); + + mesh.render(program, GL20.GL_TRIANGLES, 0, vertices.length / 5); + + program.end(); + } + + public void setColor(Color color){ + this.color = color.toFloatBits(); + } + + public void draw(int index, TextureRegion region, float x, float y, float w, float h){ + final float fx2 = x + w; + final float fy2 = y + h; + final float u = region.getU(); + final float v = region.getV2(); + final float u2 = region.getU2(); + final float v2 = region.getV(); + + float[] vertices = tmpVerts; + + int idx = 0; + vertices[idx++] = x; + vertices[idx++] = y; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v; + + vertices[idx++] = x; + vertices[idx++] = fy2; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v2; + + vertices[idx++] = fx2; + vertices[idx++] = fy2; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v2; + + //tri2 + vertices[idx++] = x; + vertices[idx++] = y; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v; + + vertices[idx++] = fx2; + vertices[idx++] = y; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v; + + vertices[idx++] = fx2; + vertices[idx++] = fy2; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v2; + + mesh.updateVertices(index * vsize * 6, vertices); + } + + public void draw(int index, TextureRegion region, float x, float y, float w, float h, float rotation){ + final float u = region.getU(); + final float v = region.getV2(); + final float u2 = region.getU2(); + final float v2 = region.getV(); + + final float originX = w / 2, originY = h / 2; + + final float cos = Mathf.cosDeg(rotation); + final float sin = Mathf.sinDeg(rotation); + + float fx = -originX; + float fy = -originY; + float fx2 = w - originX; + float fy2 = h - originY; + + final float worldOriginX = x + originX; + final float worldOriginY = y + originY; + + float x1 = cos * fx - sin * fy; + float y1 = sin * fx + cos * fy; + + float x2 = cos * fx - sin * fy2; + float y2 = sin * fx + cos * fy2; + + float x3 = cos * fx2 - sin * fy2; + float y3 = sin * fx2 + cos * fy2; + + float x4 = x1 + (x3 - x2); + float y4 = y3 - (y2 - y1); + + x1 += worldOriginX; + y1 += worldOriginY; + x2 += worldOriginX; + y2 += worldOriginY; + x3 += worldOriginX; + y3 += worldOriginY; + x4 += worldOriginX; + y4 += worldOriginY; + + float[] vertices = tmpVerts; + + int idx = 0; + vertices[idx++] = x1; + vertices[idx++] = y1; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v; + + vertices[idx++] = x3; + vertices[idx++] = y3; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v2; + + vertices[idx++] = x4; + vertices[idx++] = y4; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v2; + + //tri2 + vertices[idx++] = x1; + vertices[idx++] = y1; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v; + + vertices[idx++] = x2; + vertices[idx++] = y2; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v; + + vertices[idx++] = x3; + vertices[idx++] = y3; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v2; + + mesh.updateVertices(index * vsize * 6, vertices); + } + + public Matrix3 getTransformMatrix(){ + return transMatrix; + } + + public void setTransformMatrix(Matrix3 matrix){ + transMatrix = matrix; + } + + public Matrix3 getProjectionMatrix(){ + return projMatrix; + } + + public void setProjectionMatrix(Matrix3 matrix){ + projMatrix = matrix; + } + + public void resize(int sprites){ + if(mesh != null) mesh.dispose(); + + mesh = new Mesh(true, 6 * sprites, 0, + new VertexAttribute(Usage.Position, 2, "a_position"), + new VertexAttribute(Usage.ColorPacked, 4, "a_color"), + new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoord0")); + vertices = new float[6 * sprites * vsize]; + mesh.setVertices(vertices); + } + + private void updateMatrix(){ + combined.set(projMatrix).mul(transMatrix); + } + + @Override + public void dispose(){ + mesh.dispose(); + program.dispose(); + } +} diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/io/anuke/mindustry/graphics/Shaders.java index 0ae4a3a354..94e6a96050 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/io/anuke/mindustry/graphics/Shaders.java @@ -37,11 +37,11 @@ public class Shaders{ build = new UnitBuild(); mix = new MixShader(); fog = new FogShader(); - fullMix = new Shader("fullmix", "default"); + fullMix = new LoadShader("fullmix", "default"); menu = new MenuShader(); } - public static class MenuShader extends Shader{ + public static class MenuShader extends LoadShader{ float time = 0f; public MenuShader(){ @@ -60,13 +60,13 @@ public class Shaders{ } } - public static class FogShader extends Shader{ + public static class FogShader extends LoadShader{ public FogShader(){ super("fog", "default"); } } - public static class MixShader extends Shader{ + public static class MixShader extends LoadShader{ public Color color = new Color(Color.WHITE); public MixShader(){ @@ -93,7 +93,7 @@ public class Shaders{ } } - public static class UnitBuild extends Shader{ + public static class UnitBuild extends LoadShader{ public float progress, time; public Color color = new Color(); public TextureRegion region; @@ -113,8 +113,9 @@ public class Shaders{ } } - public static class Outline extends Shader{ + public static class Outline extends LoadShader{ public Color color = new Color(); + public TextureRegion region = new TextureRegion(); public Outline(){ super("outline", "default"); @@ -127,9 +128,10 @@ public class Shaders{ } } - public static class BlockBuild extends Shader{ + public static class BlockBuild extends LoadShader{ public Color color = new Color(); public float progress; + public TextureRegion region = new TextureRegion(); public BlockBuild(){ super("blockbuild", "default"); @@ -146,8 +148,9 @@ public class Shaders{ } } - public static class BlockPreview extends Shader{ + public static class BlockPreview extends LoadShader{ public Color color = new Color(); + public TextureRegion region = new TextureRegion(); public BlockPreview(){ super("blockpreview", "default"); @@ -162,7 +165,7 @@ public class Shaders{ } } - public static class Shield extends Shader{ + public static class Shield extends LoadShader{ public Shield(){ super("shield", "default"); @@ -180,7 +183,7 @@ public class Shaders{ } } - public static class SurfaceShader extends Shader{ + public static class SurfaceShader extends LoadShader{ public SurfaceShader(String frag){ super(frag, "default"); @@ -196,4 +199,10 @@ public class Shaders{ setUniformf("time", Time.time()); } } + + public static class LoadShader extends Shader{ + public LoadShader(String frag, String vert){ + super(Core.files.internal("shaders/" + vert + ".vertex"), Core.files.internal("shaders/" + frag + ".fragment")); + } + } } diff --git a/core/src/io/anuke/mindustry/graphics/Shapes.java b/core/src/io/anuke/mindustry/graphics/Shapes.java new file mode 100644 index 0000000000..bc460b89b2 --- /dev/null +++ b/core/src/io/anuke/mindustry/graphics/Shapes.java @@ -0,0 +1,39 @@ +package io.anuke.mindustry.graphics; + +import io.anuke.arc.Core; +import io.anuke.arc.graphics.g2d.CapStyle; +import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.arc.graphics.g2d.Lines; +import io.anuke.arc.graphics.g2d.TextureRegion; +import io.anuke.arc.math.Mathf; + +//TODO remove +public class Shapes{ + + public static void laser(String line, String edge, float x, float y, float x2, float y2, float scale){ + laser(line, edge, x, y, x2, y2, Mathf.atan2(x2 - x, y2 - y), scale); + } + + public static void laser(String line, String edge, float x, float y, float x2, float y2){ + laser(line, edge, x, y, x2, y2, Mathf.atan2(x2 - x, y2 - y), 1f); + } + + public static void laser(String line, String edge, float x, float y, float x2, float y2, float rotation, float scale){ + + Lines.stroke(12f * scale); + Lines.line(Core.atlas.find(line), x, y, x2, y2, CapStyle.none, 0f); + Lines.stroke(1f); + + TextureRegion region = Core.atlas.find(edge); + + Draw.rect(edge, x, y, region.getWidth() * Draw.scl, region.getHeight() * scale * Draw.scl).rot(rotation + 180); + + Draw.rect(edge, x2, y2, region.getWidth() * Draw.scl, region.getHeight() * scale * Draw.scl).rot(rotation); + } + + public static void tri(float x, float y, float width, float length, float rotation){ + float oy = 17f / 63f * length; + Core.graphics.batch().draw().tex(Core.atlas.find("shape-3")).pos(x - width / 2f, y - oy) + .origin(width / 2f, oy).size(width, length).rot(rotation - 90); + } +} diff --git a/core/src/io/anuke/mindustry/io/SaveFileVersion.java b/core/src/io/anuke/mindustry/io/SaveFileVersion.java index bfdcb724bf..73ad0f5ddb 100644 --- a/core/src/io/anuke/mindustry/io/SaveFileVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveFileVersion.java @@ -86,28 +86,6 @@ public abstract class SaveFileVersion{ i += consecutives; } } - - //write visibility, length-run encoded - for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i % world.width(), i / world.width()); - boolean discovered = tile.discovered(); - - int consecutives = 0; - - for(int j = i + 1; j < world.width() * world.height() && consecutives < 32767*2-1; j++){ - Tile nextTile = world.tile(j % world.width(), j / world.width()); - - if(nextTile.discovered() != discovered){ - break; - } - - consecutives++; - } - - stream.writeBoolean(discovered); - stream.writeShort(consecutives); - i += consecutives; - } } public void readMap(DataInputStream stream) throws IOException{ @@ -175,18 +153,6 @@ public abstract class SaveFileVersion{ tiles[x][y] = tile; } - for(int i = 0; i < width * height; i++){ - boolean discovered = stream.readBoolean(); - int consecutives = stream.readUnsignedShort(); - if(discovered){ - for(int j = i + 1; j < i + 1 + consecutives; j++){ - int newx = j % width, newy = j / width; - tiles[newx][newy].setVisibility((byte) 1); - } - } - i += consecutives; - } - content.setTemporaryMapper(null); world.endMapLoad(); } diff --git a/core/src/io/anuke/mindustry/maps/SectorPresets.java b/core/src/io/anuke/mindustry/maps/SectorPresets.java index 7adacebe8d..c60115e2e2 100644 --- a/core/src/io/anuke/mindustry/maps/SectorPresets.java +++ b/core/src/io/anuke/mindustry/maps/SectorPresets.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.maps; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.GridMap; -import io.anuke.arc.util.Structs; import io.anuke.mindustry.content.Items; import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.Mechs; @@ -30,7 +29,7 @@ public class SectorPresets{ //command center mission add(new SectorPreset(0, 1, - Structs.array( + Array.ofRecursive( Missions.blockRecipe(UnitBlocks.daggerFactory), new UnitMission(UnitTypes.dagger), Missions.blockRecipe(UnitBlocks.commandCenter), @@ -42,7 +41,7 @@ public class SectorPresets{ //pad mission add(new SectorPreset(0, -2, - Structs.array( + Array.ofRecursive( Missions.blockRecipe(mobile ? UpgradeBlocks.alphaPad : UpgradeBlocks.dartPad), new MechMission(mobile ? Mechs.alpha : Mechs.dart), new WaveMission(15) @@ -51,7 +50,7 @@ public class SectorPresets{ //oil mission add(new SectorPreset(-2, 0, - Structs.array( + Array.ofRecursive( Missions.blockRecipe(ProductionBlocks.cultivator), Missions.blockRecipe(ProductionBlocks.waterExtractor), new ContentMission(Items.biomatter), diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index 5c7a59f9f3..d4cbd1d918 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -93,28 +93,6 @@ public class NetworkIO{ } } - //write visibility, length-run encoded - for(int i = 0; i < world.width() * world.height(); i++){ - Tile tile = world.tile(i % world.width(), i / world.width());; - boolean discovered = tile.discovered(); - - int consecutives = 0; - - for(int j = i + 1; j < world.width() * world.height() && consecutives < 32767*2-1; j++){ - Tile nextTile = world.tile(j % world.width(), j / world.width());; - - if(nextTile.discovered() != discovered){ - break; - } - - consecutives++; - } - - stream.writeBoolean(discovered); - stream.writeShort(consecutives); - i += consecutives; - } - stream.write(Team.all.length); //write team data @@ -247,18 +225,6 @@ public class NetworkIO{ tiles[x][y] = tile; } - for(int i = 0; i < width * height; i++){ - boolean discovered = stream.readBoolean(); - int consecutives = stream.readUnsignedShort(); - if(discovered){ - for(int j = i + 1; j < i + 1 + consecutives; j++){ - int newx = j % width, newy = j / width; - tiles[newx][newy].setVisibility((byte) 1); - } - } - i += consecutives; - } - state.teams = new Teams(); byte teams = stream.readByte(); diff --git a/core/src/io/anuke/mindustry/ui/Minimap.java b/core/src/io/anuke/mindustry/ui/Minimap.java index 011b8916a2..da07bdc36e 100644 --- a/core/src/io/anuke/mindustry/ui/Minimap.java +++ b/core/src/io/anuke/mindustry/ui/Minimap.java @@ -1,22 +1,18 @@ package io.anuke.mindustry.ui; import io.anuke.arc.Core; -import io.anuke.arc.graphics.Texture.TextureFilter; import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.scene.Element; import io.anuke.arc.scene.event.InputEvent; import io.anuke.arc.scene.event.InputListener; import io.anuke.arc.scene.ui.layout.Container; -import io.anuke.mindustry.graphics.Shaders; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.renderer; public class Minimap extends Container{ public Minimap(){ super(new Element(){ - TextureRegion r = new TextureRegion(); @Override public void draw(){ @@ -27,30 +23,6 @@ public class Minimap extends Container{ if(renderer.minimap.getTexture() != null){ renderer.minimap.drawEntities(x, y, width, height); } - - if(showFog){ - renderer.fog.getTexture().setFilter(TextureFilter.Nearest, TextureFilter.Nearest); - - r.set(renderer.minimap.getRegion()); - float pad = renderer.fog.getPadding(); - - float px = r.getU() * world.width() + pad; - float py = r.getV() * world.height() + pad; - float px2 = r.getU2() * world.width() + pad; - float py2 = r.getV2() * world.height() + pad; - - r.setTexture(renderer.fog.getTexture()); - r.setU(px / (world.width() + pad*2f)); - r.setV(1f - py / (world.height() + pad*2f)); - r.setU2(px2 / (world.width() + pad*2f)); - r.setV2(1f - py2 / (world.height() + pad*2f)); - - Draw.shader(Shaders.fog); - Draw.rect().tex(r).set(x, y, width, height); - Draw.shader(); - - renderer.fog.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear); - } } }); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index e7ec90ffdd..2489382a20 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -232,7 +232,7 @@ public class JoinDialog extends FloatingDialog{ pad = 6; } - Cell cell = ((Table) pane.getParent()).getCell(button); + Cell cell = ((Table) pane.getParent()).getCell(button); if(!Mathf.isEqual(cell.getMinWidth(), pw)){ cell.width(pw); diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index fa03911c41..f579d3b683 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -42,8 +42,6 @@ public class Tile implements Position, TargetTrait{ private byte team; /** Tile elevation. -1 means slope.*/ private byte elevation; - /** Fog visibility status: 3 states, but saved as a single bit. 0 = unexplored, 1 = visited, 2 = currently visible (saved as 1)*/ - private byte visibility; public Tile(int x, int y){ this.x = (short) x; @@ -67,10 +65,6 @@ public class Tile implements Position, TargetTrait{ this.team = team; } - public boolean discovered(){ - return visibility > 0; - } - /**Returns this tile's position as a {@link Pos}.*/ public int pos(){ return Pos.get(x, y); @@ -171,14 +165,6 @@ public class Tile implements Position, TargetTrait{ this.floor = type; } - public byte getVisibility(){ - return visibility; - } - - public void setVisibility(byte visibility){ - this.visibility = visibility; - } - public byte getRotation(){ return rotation; } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java b/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java index e7ffe1514b..e81ab38efd 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/Reconstructor.java @@ -99,14 +99,11 @@ public class Reconstructor extends Block{ ReconstructorEntity entity = tile.entity(); ReconstructorEntity oe = other.entity(); - //called in main thread to prevent issues - threads.run(() -> { - unlink(entity); - unlink(oe); + unlink(entity); + unlink(oe); - entity.link = other.pos(); - oe.link = tile.pos(); - }); + entity.link = other.pos(); + oe.link = tile.pos(); } @Remote(targets = Loc.both, called = Loc.server, forward = true) diff --git a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java index 387ebb0bd4..cf93041a76 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.graphics.Shapes; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockFlag; @@ -71,11 +72,10 @@ public class RepairPoint extends Block{ float ang = entity.angleTo(entity.target); float len = 5f; - //TODO new laser drawing system Draw.color(Color.valueOf("e8ffd7")); - //Shapes.laser("laser", "laser-end", - // tile.drawx() + Angles.trnsx(ang, len), tile.drawy() + Angles.trnsy(ang, len), - // entity.target.x, entity.target.y, entity.strength); + Shapes.laser("laser", "laser-end", + tile.drawx() + Angles.trnsx(ang, len), tile.drawy() + Angles.trnsy(ang, len), + entity.target.x, entity.target.y, entity.strength); Draw.color(); } } diff --git a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java index af88b624ad..353fd9a106 100644 --- a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java +++ b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java @@ -1,14 +1,14 @@ package io.anuke.mindustry.desktop; -import com.badlogic.gdx.utils.JsonValue; -import com.badlogic.gdx.utils.JsonValue.ValueType; -import com.badlogic.gdx.utils.JsonWriter.OutputType; +import io.anuke.arc.Core; +import io.anuke.arc.util.Log; +import io.anuke.arc.util.OS; +import io.anuke.arc.util.serialization.JsonValue; +import io.anuke.arc.util.serialization.JsonValue.ValueType; +import io.anuke.arc.util.serialization.JsonWriter.OutputType; import io.anuke.mindustry.Vars; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.net.Net; -import io.anuke.arc.core.Settings; -import io.anuke.arc.util.Log; -import io.anuke.arc.util.OS; import java.io.PrintWriter; import java.io.StringWriter; diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index aabde84354..b93858e166 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -1,8 +1,8 @@ package io.anuke.mindustry.desktop; -import com.badlogic.gdx.ApplicationListener; -import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; -import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; +import io.anuke.arc.ApplicationListener; +import io.anuke.arc.backends.lwjgl3.Lwjgl3Application; +import io.anuke.arc.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import io.anuke.kryonet.KryoClient; import io.anuke.kryonet.KryoServer; import io.anuke.mindustry.Mindustry; diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java index d611603f76..59fd39501a 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java @@ -3,18 +3,18 @@ package io.anuke.mindustry.desktop; import club.minnced.discord.rpc.DiscordEventHandlers; import club.minnced.discord.rpc.DiscordRPC; import club.minnced.discord.rpc.DiscordRichPresence; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.Base64Coder; +import io.anuke.arc.collection.Array; +import io.anuke.arc.files.FileHandle; +import io.anuke.arc.function.Consumer; +import io.anuke.arc.util.OS; +import io.anuke.arc.util.Strings; +import io.anuke.arc.util.serialization.Base64Coder; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.ui.dialogs.FileChooser; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.util.OS; -import io.anuke.arc.util.Strings; import java.net.NetworkInterface; import java.util.Enumeration; diff --git a/kryonet/build.gradle b/net/build.gradle similarity index 100% rename from kryonet/build.gradle rename to net/build.gradle diff --git a/net/build/libs/kryonet-release.jar b/net/build/libs/kryonet-release.jar new file mode 100644 index 0000000000000000000000000000000000000000..43bf63903be25cda66ccde5ff0a9ff73830a8a4d GIT binary patch literal 22107 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 literal 0 HcmV?d00001 diff --git a/net/build/libs/net-release.jar b/net/build/libs/net-release.jar new file mode 100644 index 0000000000000000000000000000000000000000..6048c7e54f1f016e7137d7a0ecb2183b849a1fa5 GIT binary patch literal 22107 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 lastCallback.accept(host)); + Core.app.post(() -> lastCallback.accept(host)); foundAddresses.add(datagramPacket.getAddress()); } @@ -194,9 +195,9 @@ public class KryoClient implements ClientProvider{ ByteBuffer buffer = ByteBuffer.wrap(packet.getData()); Host host = NetworkIO.readServerData(packet.getAddress().getHostAddress(), buffer); - Gdx.app.postRunnable(() -> valid.accept(host)); + Core.app.post(() -> valid.accept(host)); }catch(Exception e){ - Gdx.app.postRunnable(() -> invalid.accept(e)); + Core.app.post(() -> invalid.accept(e)); } } }); @@ -209,7 +210,7 @@ public class KryoClient implements ClientProvider{ foundAddresses.clear(); lastCallback = callback; client.discoverHosts(port, 3000); - Gdx.app.postRunnable(done); + Core.app.post(done); } }); } @@ -231,9 +232,9 @@ public class KryoClient implements ClientProvider{ private void handleException(Exception e){ if(e instanceof KryoNetException){ - Gdx.app.postRunnable(() -> Net.showError(new IOException("mismatch"))); + Core.app.post(() -> Net.showError(new IOException("mismatch"))); }else{ - Gdx.app.postRunnable(() -> Net.showError(e)); + Core.app.post(() -> Net.showError(e)); } } diff --git a/kryonet/src/io/anuke/kryonet/KryoCore.java b/net/src/io/anuke/kryonet/KryoCore.java similarity index 95% rename from kryonet/src/io/anuke/kryonet/KryoCore.java rename to net/src/io/anuke/kryonet/KryoCore.java index e5169433ff..9f4a100d4e 100644 --- a/kryonet/src/io/anuke/kryonet/KryoCore.java +++ b/net/src/io/anuke/kryonet/KryoCore.java @@ -1,7 +1,7 @@ package io.anuke.kryonet; -import com.esotericsoftware.minlog.Log; -import com.esotericsoftware.minlog.Log.Logger; +import com.esotericsoftware.kryonet.util.Log; +import com.esotericsoftware.kryonet.util.Log.Logger; import io.anuke.arc.util.ColorCodes; import java.io.PrintWriter; diff --git a/kryonet/src/io/anuke/kryonet/KryoServer.java b/net/src/io/anuke/kryonet/KryoServer.java similarity index 98% rename from kryonet/src/io/anuke/kryonet/KryoServer.java rename to net/src/io/anuke/kryonet/KryoServer.java index 77a4dffd4e..6920d5eb03 100644 --- a/kryonet/src/io/anuke/kryonet/KryoServer.java +++ b/net/src/io/anuke/kryonet/KryoServer.java @@ -1,6 +1,5 @@ package io.anuke.kryonet; -import com.badlogic.gdx.utils.Array; import com.dosse.upnp.UPnP; import com.esotericsoftware.kryonet.Connection; import com.esotericsoftware.kryonet.FrameworkMessage; @@ -8,6 +7,10 @@ import com.esotericsoftware.kryonet.Listener; import com.esotericsoftware.kryonet.Listener.LagListener; import com.esotericsoftware.kryonet.Server; import com.esotericsoftware.kryonet.util.InputStreamSender; +import io.anuke.arc.Core; +import io.anuke.arc.collection.Array; +import io.anuke.arc.util.Log; +import io.anuke.arc.util.Time; import io.anuke.mindustry.Vars; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.SendMode; @@ -16,8 +19,6 @@ import io.anuke.mindustry.net.Packets.Connect; import io.anuke.mindustry.net.Packets.Disconnect; import io.anuke.mindustry.net.Packets.StreamBegin; import io.anuke.mindustry.net.Packets.StreamChunk; -import io.anuke.arc.core.Timers; -import io.anuke.arc.util.Log; import net.jpountz.lz4.LZ4Compressor; import net.jpountz.lz4.LZ4Factory; @@ -27,8 +28,6 @@ import java.nio.channels.ClosedSelectorException; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; -import static io.anuke.mindustry.Vars.threads; - public class KryoServer implements ServerProvider{ final Server server; final CopyOnWriteArrayList connections = new CopyOnWriteArrayList<>(); diff --git a/settings.gradle b/settings.gradle index fd1e78544c..e29e15bc8a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -include 'desktop', 'core', 'kryonet', 'server', 'ios', 'annotations', 'tools', 'tests' +include 'desktop', 'core', 'net', 'server', 'ios', 'annotations', 'tools', 'tests' def use = { String name, String path -> include(name) @@ -25,9 +25,8 @@ if(System.properties["release"] == null || System.properties["release"] == "fals use(':Arc:arc-core', '../Arc/arc-core') use(':Arc:extensions', '../Arc/extensions') use(':Arc:extensions:freetype', '../Arc/extensions/freetype') - } - if (new File(settingsDir, '../GDXGifRecorder').exists()) { - use(':GDXGifRecorder', '../GDXGifRecorder') + use(':Arc:backends', '../Arc/backends') + use(':Arc:backends:backend-lwjgl3', '../Arc/backends/backend-lwjgl3') } if (new File(settingsDir, '../debug').exists()) { use(':debug', '../debug') diff --git a/tools/src/io/anuke/mindustry/BundleLauncher.java b/tools/src/io/anuke/mindustry/BundleLauncher.java index b60b46eda0..8732638b89 100644 --- a/tools/src/io/anuke/mindustry/BundleLauncher.java +++ b/tools/src/io/anuke/mindustry/BundleLauncher.java @@ -1,10 +1,10 @@ package io.anuke.mindustry; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.OrderedMap; -import com.badlogic.gdx.utils.PropertiesUtils; +import io.anuke.arc.collection.Array; +import io.anuke.arc.collection.OrderedMap; import io.anuke.arc.function.BiFunction; import io.anuke.arc.util.Log; +import io.anuke.arc.util.io.PropertiesUtils; import java.io.File; import java.io.FileInputStream; diff --git a/tools/src/io/anuke/mindustry/GenRegion.java b/tools/src/io/anuke/mindustry/GenRegion.java index 0bca16cdd4..6f6bf2a093 100644 --- a/tools/src/io/anuke/mindustry/GenRegion.java +++ b/tools/src/io/anuke/mindustry/GenRegion.java @@ -1,8 +1,9 @@ package io.anuke.mindustry; -import com.badlogic.gdx.graphics.g2d.TextureRegion; +import io.anuke.arc.graphics.g2d.TextureAtlas.AtlasRegion; +import io.anuke.arc.graphics.g2d.TextureRegion; -public class GenRegion extends TextureRegion { +public class GenRegion extends AtlasRegion{ public String name; public boolean invalid; public ImageContext context; diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/Generators.java index 01bbdc8d98..d938df0394 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/Generators.java @@ -1,7 +1,9 @@ package io.anuke.mindustry; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.g2d.TextureRegion; +import io.anuke.arc.Core; +import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.type.ContentType; import io.anuke.mindustry.type.Item; @@ -10,9 +12,8 @@ import io.anuke.mindustry.type.Mech; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.OreBlock; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.Hue; -import static io.anuke.mindustry.Vars.*; + +import static io.anuke.mindustry.Vars.content; public class Generators { @@ -50,7 +51,7 @@ public class Generators { for (int y = 0; y < base.height(); y++) { Color result = top.getColor(x, y); if(result.a > 0.01f){ - Hue.mix(result, color, 0.45f, result); + result.lerp(color, 0.45f); base.draw(x, y, result); } } @@ -144,7 +145,7 @@ public class Generators { for(Block block : content.blocks()){ if(!(block instanceof Floor)) continue; Floor floor = (Floor)block; - if(floor.getIcon().length > 0 && !Draw.hasRegion(floor.name + "-cliff-side")){ + if(floor.getIcon().length > 0 && !Core.atlas.has(floor.name + "-cliff-side")){ Image floori = context.get(floor.getIcon()[0]); Color color = floori.getColor(0, 0).mul(1.3f, 1.3f, 1.3f, 1f); diff --git a/tools/src/io/anuke/mindustry/Image.java b/tools/src/io/anuke/mindustry/Image.java index e4678c346c..13a8b61848 100644 --- a/tools/src/io/anuke/mindustry/Image.java +++ b/tools/src/io/anuke/mindustry/Image.java @@ -1,13 +1,13 @@ package io.anuke.mindustry; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.g2d.TextureRegion; +import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.util.Structs; import javax.imageio.ImageIO; -import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; +import java.awt.Graphics2D; import java.io.IOException; import java.util.ArrayList; @@ -110,10 +110,10 @@ public class Image { x, y, x + region.getWidth(), y + region.getHeight(), - (flipx ? region.getRegionX() + region.getWidth() : region.getRegionX()) + ofx, - (flipy ? region.getRegionY() + region.getHeight() : region.getRegionY()) + ofy, - (flipx ? region.getRegionX() : region.getRegionX() + region.getWidth()) + ofx, - (flipy ? region.getRegionY() : region.getRegionY() + region.getHeight()) + ofy, + (flipx ? region.getX() + region.getWidth() : region.getX()) + ofx, + (flipy ? region.getY() + region.getHeight() : region.getY()) + ofy, + (flipx ? region.getX() : region.getX() + region.getWidth()) + ofx, + (flipy ? region.getY() : region.getY() + region.getHeight()) + ofy, null); } diff --git a/tools/src/io/anuke/mindustry/ImageContext.java b/tools/src/io/anuke/mindustry/ImageContext.java index c8b5d832d5..38c6720ce7 100644 --- a/tools/src/io/anuke/mindustry/ImageContext.java +++ b/tools/src/io/anuke/mindustry/ImageContext.java @@ -1,17 +1,18 @@ package io.anuke.mindustry; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.graphics.g2d.TextureAtlas.TextureAtlasData; -import com.badlogic.gdx.graphics.g2d.TextureAtlas.TextureAtlasData.Region; -import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.utils.ObjectMap; -import io.anuke.mindustry.core.ContentLoader; -import io.anuke.arc.core.Core; -import io.anuke.arc.core.Timers; -import io.anuke.arc.util.Atlas; +import io.anuke.arc.Core; +import io.anuke.arc.collection.ObjectMap; +import io.anuke.arc.files.FileHandle; +import io.anuke.arc.graphics.g2d.TextureAtlas; +import io.anuke.arc.graphics.g2d.TextureAtlas.AtlasRegion; +import io.anuke.arc.graphics.g2d.TextureAtlas.TextureAtlasData; +import io.anuke.arc.graphics.g2d.TextureAtlas.TextureAtlasData.Region; +import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.util.Log; import io.anuke.arc.util.Log.LogHandler; import io.anuke.arc.util.Log.NoopLogHandler; +import io.anuke.arc.util.Time; +import io.anuke.mindustry.core.ContentLoader; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; @@ -31,7 +32,7 @@ public class ImageContext { TextureAtlasData data = new TextureAtlasData(new FileHandle(spritesFolder + "/sprites.atlas"), new FileHandle(spritesFolder), false); - ObjectMap regionCache = new ObjectMap<>(); + ObjectMap regionCache = new ObjectMap<>(); for(Region region : data.getRegions()){ int x = region.left, y = region.top, width = region.width, height = region.height; @@ -43,30 +44,30 @@ public class ImageContext { } @Override - public int getRegionX(){ + public int getX(){ return x; } @Override - public int getRegionY(){ + public int getY(){ return y; } @Override - public int getRegionWidth(){ + public int getWidth(){ return width; } @Override - public int getRegionHeight(){ + public int getHeight(){ return height; } }); } - Core.atlas = new Atlas(){ + Core.atlas = new TextureAtlas(){ @Override - public TextureRegion getRegion(String name){ + public AtlasRegion find(String name){ if(!regionCache.containsKey(name)){ GenRegion region = new GenRegion(); region.name = name; @@ -78,13 +79,11 @@ public class ImageContext { } @Override - public boolean hasRegion(String s) { + public boolean has(String s) { return regionCache.containsKey(s); } }; - Core.atlas.setErrorRegion("error"); - image = ImageIO.read(new File(spritesFolder + "/sprites.png")); } @@ -99,7 +98,7 @@ public class ImageContext { } public Image get(String name){ - return get(Core.atlas.getRegion(name)); + return get(Core.atlas.find(name)); } public Image get(TextureRegion region){ diff --git a/tools/src/io/anuke/mindustry/PackerLauncher.java b/tools/src/io/anuke/mindustry/PackerLauncher.java index df2e3f4f8e..21871dc132 100644 --- a/tools/src/io/anuke/mindustry/PackerLauncher.java +++ b/tools/src/io/anuke/mindustry/PackerLauncher.java @@ -1,7 +1,7 @@ package io.anuke.mindustry; -import io.anuke.arc.core.Timers; import io.anuke.arc.util.Log; +import io.anuke.arc.util.Time; import java.io.IOException;