Improved texture gen system, mech icon generation

This commit is contained in:
Anuken
2018-06-18 23:05:31 -04:00
parent 354c6e17c0
commit 6cfd1a1ef6
15 changed files with 694 additions and 553 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 B

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 118 KiB

View File

@@ -77,7 +77,6 @@ public class Recipes implements ContentList{
new Recipe(crafting, CraftingBlocks.stoneFormer, new ItemStack(Items.steel, 10), new ItemStack(Items.iron, 10)); new Recipe(crafting, CraftingBlocks.stoneFormer, new ItemStack(Items.steel, 10), new ItemStack(Items.iron, 10));
new Recipe(crafting, CraftingBlocks.melter, new ItemStack(Items.steel, 30), new ItemStack(Items.titanium, 15)); new Recipe(crafting, CraftingBlocks.melter, new ItemStack(Items.steel, 30), new ItemStack(Items.titanium, 15));
new Recipe(crafting, CraftingBlocks.incinerator, new ItemStack(Items.steel, 60), new ItemStack(Items.iron, 60)); new Recipe(crafting, CraftingBlocks.incinerator, new ItemStack(Items.steel, 60), new ItemStack(Items.iron, 60));
new Recipe(crafting, CraftingBlocks.weaponFactory, new ItemStack(Items.steel, 1), new ItemStack(Items.iron, 1)).setDesktop();
new Recipe(production, ProductionBlocks.ironDrill, new ItemStack(Items.iron, 25)); new Recipe(production, ProductionBlocks.ironDrill, new ItemStack(Items.iron, 25));
new Recipe(production, ProductionBlocks.reinforcedDrill, new ItemStack(Items.iron, 25)); new Recipe(production, ProductionBlocks.reinforcedDrill, new ItemStack(Items.iron, 25));

View File

@@ -11,7 +11,7 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.production.*; import io.anuke.mindustry.world.blocks.production.*;
public class CraftingBlocks extends BlockList implements ContentList { public class CraftingBlocks extends BlockList implements ContentList {
public static Block smelter, arcsmelter, siliconsmelter, plasteelcompressor, phaseweaver, alloysmelter, alloyfuser, cryofluidmixer, melter, separator, centrifuge, biomatterCompressor, pulverizer, oilRefinery, stoneFormer, weaponFactory, incinerator; public static Block smelter, arcsmelter, siliconsmelter, plasteelcompressor, phaseweaver, alloysmelter, alloyfuser, cryofluidmixer, melter, separator, centrifuge, biomatterCompressor, pulverizer, oilRefinery, stoneFormer, incinerator;
@Override @Override
public void load() { public void load() {
@@ -215,11 +215,6 @@ public class CraftingBlocks extends BlockList implements ContentList {
hasLiquids = hasItems = true; hasLiquids = hasItems = true;
}}; }};
weaponFactory = new MechFactory("weaponfactory") {{
size = 2;
health = 250;
}};
incinerator = new Incinerator("incinerator") {{ incinerator = new Incinerator("incinerator") {{
health = 90; health = 90;
}}; }};

View File

@@ -282,12 +282,11 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
Draw.rect(mech.region, x, y, rotation -90); Draw.rect(mech.region, x, y, rotation -90);
for (int i : Mathf.signs) { for (int i : Mathf.signs) {
float tra = rotation - 90, float tra = rotation - 90, trY = - mech.weapon.getRecoil(this, i > 0)*1.5f;
trX = 4*i, trY = 3 - mech.weapon.getRecoil(this, i > 0)*1.5f; float w = i > 0 ? -12 : 12;
float w = i > 0 ? -8 : 8;
Draw.rect(mech.weapon.equipRegion, Draw.rect(mech.weapon.equipRegion,
x + Angles.trnsx(tra, trX, trY), x + Angles.trnsx(tra, 0, trY),
y + Angles.trnsy(tra, trX, trY), w, 8, rotation - 90); y + Angles.trnsy(tra, 0, trY), w, 12, rotation - 90);
} }
float backTrns = 4f, itemSize = 5f; float backTrns = 4f, itemSize = 5f;

View File

@@ -14,7 +14,7 @@ public class Mech extends Upgrade {
public float armor = 1f; public float armor = 1f;
public Weapon weapon = Weapons.blaster; public Weapon weapon = Weapons.blaster;
public TextureRegion baseRegion, legRegion, region; public TextureRegion baseRegion, legRegion, region, iconRegion;
public Mech(String name, boolean flying){ public Mech(String name, boolean flying){
super(name); super(name);
@@ -29,5 +29,6 @@ public class Mech extends Upgrade {
} }
region = Draw.region(name); region = Draw.region(name);
iconRegion = Draw.optional("mech-icon-"+ name);
} }
} }

View File

@@ -69,7 +69,7 @@ public class CoreBlock extends StorageBlock {
if(entity.currentPlayer != null) { if(entity.currentPlayer != null) {
Player player = entity.currentPlayer; Player player = entity.currentPlayer;
TextureRegion region = Draw.region(player.mech.name); TextureRegion region = player.mech.iconRegion;
Shaders.build.region = region; Shaders.build.region = region;
Shaders.build.progress = entity.progress; Shaders.build.progress = entity.progress;

View File

@@ -112,7 +112,7 @@ public class Reconstructor extends Block{
Player player = entity.current; Player player = entity.current;
TextureRegion region = Draw.region(player.mech.name); TextureRegion region = player.mech.iconRegion;
Shaders.build.region = region; Shaders.build.region = region;
Shaders.build.progress = progress; Shaders.build.progress = progress;
@@ -253,6 +253,8 @@ public class Reconstructor extends Block{
entity.power.amount -= ((Reconstructor)tile.block()).powerPerTeleport; entity.power.amount -= ((Reconstructor)tile.block()).powerPerTeleport;
entity.updateTime = 1f; entity.updateTime = 1f;
entity.set(tile.drawx(), tile.drawy()); entity.set(tile.drawx(), tile.drawy());
player.rotation = 90f;
player.baseRotation = 90f;
player.setDead(true); player.setDead(true);
player.setRespawning(true); player.setRespawning(true);
player.setRespawning(); player.setRespawning();

View File

@@ -38,7 +38,7 @@ task cleanup(){
task generateSprites(dependsOn: classes, type: JavaExec) { task generateSprites(dependsOn: classes, type: JavaExec) {
file(textureFolder).mkdirs() file(textureFolder).mkdirs()
main = "io.anuke.mindustry.TextureGenerator" main = "io.anuke.mindustry.PackerLauncher"
classpath = sourceSets.main.runtimeClasspath classpath = sourceSets.main.runtimeClasspath
standardInput = System.in standardInput = System.in
workingDir = textureFolder workingDir = textureFolder

View File

@@ -0,0 +1,61 @@
package io.anuke.mindustry;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.type.Mech;
import io.anuke.mindustry.type.Upgrade;
import io.anuke.mindustry.world.Block;
public class Generators {
public static void generate(ImageContext context){
context.generate("block-icons", () -> {
for(Block block : Block.all()){
TextureRegion[] regions = block.getBlockIcon();
if(regions.length == 0){
continue;
}
if(regions[0] == null){
context.err("Error in block \"{0}\": null region!", block.name);
}
Image image = context.get(regions[0]);
for(TextureRegion region : regions){
image.draw(region);
}
image.save("block-icon-" + block.name);
}
});
context.generate("mech-icons", () -> {
for(Upgrade upgrade : Upgrade.all()){
if(!(upgrade instanceof Mech)) continue;
Mech mech = (Mech)upgrade;
mech.load();
mech.weapon.load();
Image image = context.get(mech.region);
if(!mech.flying){
image.draw(mech.baseRegion);
image.draw(mech.legRegion);
image.draw(mech.legRegion, true, false);
image.draw(mech.region);
}
image.draw(mech.weapon.equipRegion, false, false);
image.draw(mech.weapon.equipRegion, true, false);
image.save("mech-icon-" + mech.name);
}
});
}
}

View File

@@ -0,0 +1,88 @@
package io.anuke.mindustry;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class Image {
private static ArrayList<Image> toDispose = new ArrayList<>();
private BufferedImage atlas;
private BufferedImage image;
private Graphics2D graphics;
public Image(BufferedImage atlas, TextureRegion region){
this.atlas = atlas;
this.image = new BufferedImage(region.getRegionWidth(), region.getRegionHeight(), BufferedImage.TYPE_INT_ARGB);
this.graphics = image.createGraphics();
draw(region);
toDispose.add(this);
}
/**Draws a region at the top left corner.*/
public void draw(TextureRegion region){
draw(region, 0, 0, false, false);
}
/**Draws an image at the top left corner.*/
public void draw(Image image){
graphics.drawImage(image.image, 0, 0, null);
}
public void draw(TextureRegion region, boolean flipx, boolean flipy){
draw(region, 0, 0, flipx, flipy);
}
public void draw(TextureRegion region, int x, int y, boolean flipx, boolean flipy){
int ofx = 0, ofy = 0;
if(x < 0){
ofx = x;
x = 0;
}
if(y < 0){
ofy = y;
y = 0;
}
graphics.drawImage(atlas,
x, y,
x + region.getRegionWidth(),
y + region.getRegionHeight(),
(flipx ? region.getRegionX() + region.getRegionWidth() : region.getRegionX()) + ofx,
(flipy ? region.getRegionY() + region.getRegionHeight() : region.getRegionY()) + ofy,
(flipx ? region.getRegionX() : region.getRegionX() + region.getRegionWidth()) + ofx,
(flipy ? region.getRegionY() : region.getRegionY() + region.getRegionHeight()) + ofy,
null);
}
/** @param name Name of texture file name to create, without any extensions.*/
public void save(String name){
try {
ImageIO.write(image, "png", new File(name + ".png"));
}catch (IOException e){
throw new RuntimeException(e);
}
}
public static int total(){
return toDispose.size();
}
public static void dispose(){
for(Image image : toDispose){
image.graphics.dispose();
}
toDispose.clear();
}
}

View File

@@ -6,30 +6,27 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas.TextureAtlasData.Region;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap;
import io.anuke.mindustry.core.ContentLoader; import io.anuke.mindustry.core.ContentLoader;
import io.anuke.mindustry.world.Block;
import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Core;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Atlas; import io.anuke.ucore.util.Atlas;
import io.anuke.ucore.util.Log; import io.anuke.ucore.util.Log;
import io.anuke.ucore.util.Log.LogHandler;
import io.anuke.ucore.util.Log.NoopLogHandler; import io.anuke.ucore.util.Log.NoopLogHandler;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
/**Used for generating extra textures before packing.*/ public class ImageContext {
public class TextureGenerator { private BufferedImage image;
static BufferedImage image;
static Graphics2D graphics;
public static void main(String[] args) throws Exception{ public void load() throws IOException{
Log.setLogger(new NoopLogHandler()); Log.setLogger(new NoopLogHandler());
ContentLoader.load(); ContentLoader.load();
Log.setLogger(new LogHandler());
String spritesFolder = new File("../../../assets/sprites").getAbsolutePath(); String spritesFolder = new File("../../../assets/sprites").getAbsolutePath();
TextureAtlasData data = new TextureAtlasData(new FileHandle(spritesFolder + "/sprites.atlas"), TextureAtlasData data = new TextureAtlasData(new FileHandle(spritesFolder + "/sprites.atlas"),
new FileHandle(spritesFolder), false); new FileHandle(spritesFolder), false);
@@ -77,45 +74,24 @@ public class TextureGenerator {
Core.atlas.setErrorRegion("error"); Core.atlas.setErrorRegion("error");
image = ImageIO.read(new File(spritesFolder + "/sprites.png")); image = ImageIO.read(new File(spritesFolder + "/sprites.png"));
graphics = image.createGraphics();
generateBlocks();
} }
/**Generates full block icons for use in the editor.*/ public void generate(String name, Runnable run){
static void generateBlocks() throws IOException { Timers.mark();
run.run();
Log.info("&ly[Generator]&lc Time to generate &lm{0}&lc: &lg{1}&lcms", name, Timers.elapsed());
}
for(Block block : Block.all()){ public Image get(String name){
TextureRegion[] regions = block.getBlockIcon(); return get(Core.atlas.getRegion(name));
}
if(regions.length == 0){ public Image get(TextureRegion region){
continue; return new Image(image, region);
} }
if(regions[0] == null){ public void err(String message, Object... args){
System.err.println("Error in block \"" + block.name + "\": null region!"); Log.err(message, args);
System.exit(-1); System.exit(-1);
}
BufferedImage target = new BufferedImage(regions[0].getRegionWidth(), regions[0].getRegionHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D tg = target.createGraphics();
for(TextureRegion region : regions){
tg.drawImage(image,
0, 0,
region.getRegionWidth(),
region.getRegionHeight(),
region.getRegionX(),
region.getRegionY(),
region.getRegionX() + region.getRegionWidth(),
region.getRegionY() + region.getRegionHeight(),
null);
}
tg.dispose();
ImageIO.write(target, "png", new File("block-icon-" + block.name + ".png"));
}
} }
} }

View File

@@ -0,0 +1,20 @@
package io.anuke.mindustry;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Log;
import java.io.IOException;
public class PackerLauncher {
public static void main(String[] args) throws IOException {
ImageContext context = new ImageContext();
context.load();
Timers.mark();
Generators.generate(context);
Log.info("&ly[Generator]&lc Total time to generate: &lg{0}&lcms", Timers.elapsed());
Log.info("&ly[Generator]&lc Total images created: &lg{0}", Image.total());
Image.dispose();
}
}