201 lines
6.2 KiB
Java
201 lines
6.2 KiB
Java
package mindustry.tools;
|
|
|
|
import arc.*;
|
|
import arc.files.*;
|
|
import arc.graphics.g2d.*;
|
|
import arc.graphics.g2d.TextureAtlas.*;
|
|
import arc.struct.*;
|
|
import arc.util.*;
|
|
import arc.util.Log.*;
|
|
import arc.util.io.*;
|
|
import mindustry.*;
|
|
import mindustry.content.*;
|
|
import mindustry.core.*;
|
|
import mindustry.ctype.*;
|
|
import mindustry.type.*;
|
|
import mindustry.world.*;
|
|
import mindustry.world.blocks.*;
|
|
|
|
import javax.imageio.*;
|
|
import java.awt.image.*;
|
|
import java.io.*;
|
|
|
|
public class ImagePacker{
|
|
static ObjectMap<String, TextureRegion> regionCache = new ObjectMap<>();
|
|
static ObjectMap<String, BufferedImage> imageCache = new ObjectMap<>();
|
|
|
|
public static void main(String[] args) throws Exception{
|
|
Vars.headless = true;
|
|
ArcNativesLoader.load();
|
|
|
|
Log.logger = new NoopLogHandler();
|
|
Vars.content = new ContentLoader();
|
|
Vars.content.createBaseContent();
|
|
Log.logger = new DefaultLogHandler();
|
|
|
|
Fi.get("../../../assets-raw/sprites_out").walk(path -> {
|
|
if(!path.extEquals("png")) return;
|
|
|
|
String fname = path.nameWithoutExtension();
|
|
|
|
try{
|
|
BufferedImage image = ImageIO.read(path.file());
|
|
|
|
if(image == null) throw new IOException("image " + path.absolutePath() + " is null for terrible reasons");
|
|
GenRegion region = new GenRegion(fname, path){{
|
|
width = image.getWidth();
|
|
height = image.getHeight();
|
|
u2 = v2 = 1f;
|
|
u = v = 0f;
|
|
}};
|
|
|
|
regionCache.put(fname, region);
|
|
imageCache.put(fname, image);
|
|
}catch(IOException e){
|
|
throw new RuntimeException(e);
|
|
}
|
|
});
|
|
|
|
Core.atlas = new TextureAtlas(){
|
|
@Override
|
|
public AtlasRegion find(String name){
|
|
if(!regionCache.containsKey(name)){
|
|
GenRegion region = new GenRegion(name, null);
|
|
region.invalid = true;
|
|
return region;
|
|
}
|
|
return (AtlasRegion)regionCache.get(name);
|
|
}
|
|
|
|
@Override
|
|
public AtlasRegion find(String name, TextureRegion def){
|
|
if(!regionCache.containsKey(name)){
|
|
return (AtlasRegion)def;
|
|
}
|
|
return (AtlasRegion)regionCache.get(name);
|
|
}
|
|
|
|
@Override
|
|
public AtlasRegion find(String name, String def){
|
|
if(!regionCache.containsKey(name)){
|
|
return (AtlasRegion)regionCache.get(def);
|
|
}
|
|
return (AtlasRegion)regionCache.get(name);
|
|
}
|
|
|
|
@Override
|
|
public boolean has(String s){
|
|
return regionCache.containsKey(s);
|
|
}
|
|
};
|
|
|
|
Draw.scl = 1f / Core.atlas.find("scale_marker").width;
|
|
|
|
Time.mark();
|
|
Generators.generate();
|
|
Log.info("&ly[Generator]&lc Total time to generate: &lg@&lcms", Time.elapsed());
|
|
Log.info("&ly[Generator]&lc Total images created: &lg@", Image.total());
|
|
Image.dispose();
|
|
|
|
//format:
|
|
//character-ID=contentname:texture-name
|
|
Fi iconfile = Fi.get("../../../assets/icons/icons.properties");
|
|
OrderedMap<String, String> map = new OrderedMap<>();
|
|
PropertiesUtils.load(map, iconfile.reader(256));
|
|
|
|
ObjectMap<String, String> content2id = new ObjectMap<>();
|
|
map.each((key, val) -> content2id.put(val.split("\\|")[0], key));
|
|
|
|
Seq<UnlockableContent> cont = Seq.withArrays(Vars.content.blocks(), Vars.content.items(), Vars.content.liquids(), Vars.content.units());
|
|
cont.removeAll(u -> u instanceof ConstructBlock || u == Blocks.air);
|
|
|
|
int minid = 0xF8FF;
|
|
for(String key : map.keys()){
|
|
minid = Math.min(Integer.parseInt(key) - 1, minid);
|
|
}
|
|
|
|
for(UnlockableContent c : cont){
|
|
if(!content2id.containsKey(c.name)){
|
|
map.put(minid + "", c.name + "|" + texname(c));
|
|
minid --;
|
|
}
|
|
}
|
|
|
|
Writer writer = iconfile.writer(false);
|
|
for(String key : map.keys()){
|
|
writer.write(key + "=" + map.get(key) + "\n");
|
|
}
|
|
|
|
writer.close();
|
|
}
|
|
|
|
static String texname(UnlockableContent c){
|
|
if(c instanceof Block) return "block-" + c.name + "-medium";
|
|
if(c instanceof UnitType) return "unit-" + c.name + "-medium";
|
|
return c.getContentType() + "-" + c.name + "-icon";
|
|
}
|
|
|
|
static void generate(String name, Runnable run){
|
|
Time.mark();
|
|
run.run();
|
|
Log.info("&ly[Generator]&lc Time to generate &lm@&lc: &lg@&lcms", name, Time.elapsed());
|
|
}
|
|
|
|
static BufferedImage buf(TextureRegion region){
|
|
return imageCache.get(((AtlasRegion)region).name);
|
|
}
|
|
|
|
static Image create(int width, int height){
|
|
return new Image(width, height);
|
|
}
|
|
|
|
static Image get(String name){
|
|
return get(Core.atlas.find(name));
|
|
}
|
|
|
|
static boolean has(String name){
|
|
return Core.atlas.has(name);
|
|
}
|
|
|
|
static Image get(TextureRegion region){
|
|
GenRegion.validate(region);
|
|
|
|
return new Image(imageCache.get(((AtlasRegion)region).name));
|
|
}
|
|
|
|
static void replace(String name, Image image){
|
|
image.save(name);
|
|
((GenRegion)Core.atlas.find(name)).path.delete();
|
|
}
|
|
|
|
static void replace(TextureRegion region, Image image){
|
|
replace(((GenRegion)region).name, image);
|
|
}
|
|
|
|
static void err(String message, Object... args){
|
|
throw new IllegalArgumentException(Strings.format(message, args));
|
|
}
|
|
|
|
static class GenRegion extends AtlasRegion{
|
|
boolean invalid;
|
|
Fi path;
|
|
|
|
GenRegion(String name, Fi path){
|
|
if(name == null) throw new IllegalArgumentException("name is null");
|
|
this.name = name;
|
|
this.path = path;
|
|
}
|
|
|
|
@Override
|
|
public boolean found(){
|
|
return !invalid;
|
|
}
|
|
|
|
static void validate(TextureRegion region){
|
|
if(((GenRegion)region).invalid){
|
|
ImagePacker.err("Region does not exist: @", ((GenRegion)region).name);
|
|
}
|
|
}
|
|
}
|
|
}
|