Added chat icons for in-game items and blocks

This commit is contained in:
Anuken 2020-01-17 18:08:23 -05:00
parent d9e5dc8ba2
commit 8d61ddbbd4
11 changed files with 2272 additions and 2622 deletions

View File

@ -72,10 +72,10 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{
ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("(char)" + code).build());
ictype.addField(TextureRegionDrawable.class, name + "Sm", Modifier.PUBLIC, Modifier.STATIC);
icload.addStatement(name + "Sm = mindustry.Vars.ui.getGlyph(mindustry.ui.Fonts.def, (char)" + code + ")");
icload.addStatement(name + "Sm = mindustry.ui.Fonts.getGlyph(mindustry.ui.Fonts.def, (char)" + code + ")");
ictype.addField(TextureRegionDrawable.class, name, Modifier.PUBLIC, Modifier.STATIC);
icload.addStatement(name + " = mindustry.Vars.ui.getGlyph(mindustry.ui.Fonts.icon, (char)" + code + ")");
icload.addStatement(name + " = mindustry.ui.Fonts.getGlyph(mindustry.ui.Fonts.icon, (char)" + code + ")");
icload.addStatement("icons.put($S, " + name + ")", name);
}

View File

@ -0,0 +1,219 @@
63743=spawn|block-spawn-medium
63742=deepwater|block-deepwater-medium
63741=water|block-water-medium
63740=tainted-water|block-tainted-water-medium
63739=darksand-tainted-water|block-darksand-tainted-water-medium
63738=sand-water|block-sand-water-medium
63737=darksand-water|block-darksand-water-medium
63736=tar|block-tar-medium
63735=stone|block-stone-medium
63734=craters|block-craters-medium
63733=char|block-char-medium
63732=ignarock|block-ignarock-medium
63731=hotrock|block-hotrock-medium
63730=magmarock|block-magmarock-medium
63729=sand|block-sand-medium
63728=darksand|block-darksand-medium
63727=holostone|block-holostone-medium
63726=grass|block-grass-medium
63725=salt|block-salt-medium
63724=snow|block-snow-medium
63723=ice|block-ice-medium
63722=ice-snow|block-ice-snow-medium
63721=cliffs|block-cliffs-medium
63720=rocks|block-rocks-medium
63719=sporerocks|block-sporerocks-medium
63718=rock|block-rock-medium
63717=snowrock|block-snowrock-medium
63716=icerocks|block-icerocks-medium
63715=snowrocks|block-snowrocks-medium
63714=dunerocks|block-dunerocks-medium
63713=sandrocks|block-sandrocks-medium
63712=saltrocks|block-saltrocks-medium
63711=spore-pine|block-spore-pine-medium
63710=snow-pine|block-snow-pine-medium
63709=pine|block-pine-medium
63708=shrubs|block-shrubs-medium
63707=white-tree-dead|block-white-tree-dead-medium
63706=white-tree|block-white-tree-medium
63705=spore-cluster|block-spore-cluster-medium
63704=shale|block-shale-medium
63703=shalerocks|block-shalerocks-medium
63702=shale-boulder|block-shale-boulder-medium
63701=sand-boulder|block-sand-boulder-medium
63700=moss|block-moss-medium
63699=spore-moss|block-spore-moss-medium
63698=metal-floor|block-metal-floor-medium
63697=metal-floor-damaged|block-metal-floor-damaged-medium
63696=metal-floor-2|block-metal-floor-2-medium
63695=metal-floor-3|block-metal-floor-3-medium
63694=metal-floor-5|block-metal-floor-5-medium
63693=dark-panel-1|block-dark-panel-1-medium
63692=dark-panel-2|block-dark-panel-2-medium
63691=dark-panel-3|block-dark-panel-3-medium
63690=dark-panel-4|block-dark-panel-4-medium
63689=dark-panel-5|block-dark-panel-5-medium
63688=dark-panel-6|block-dark-panel-6-medium
63687=dark-metal|block-dark-metal-medium
63686=pebbles|block-pebbles-medium
63685=tendrils|block-tendrils-medium
63684=ore-copper|block-ore-copper-medium
63683=ore-lead|block-ore-lead-medium
63682=ore-scrap|block-ore-scrap-medium
63681=ore-coal|block-ore-coal-medium
63680=ore-titanium|block-ore-titanium-medium
63679=ore-thorium|block-ore-thorium-medium
63678=graphite-press|block-graphite-press-medium
63677=multi-press|block-multi-press-medium
63676=silicon-smelter|block-silicon-smelter-medium
63675=kiln|block-kiln-medium
63674=plastanium-compressor|block-plastanium-compressor-medium
63673=phase-weaver|block-phase-weaver-medium
63672=alloy-smelter|block-alloy-smelter-medium
63671=cryofluidmixer|block-cryofluidmixer-medium
63670=blast-mixer|block-blast-mixer-medium
63669=pyratite-mixer|block-pyratite-mixer-medium
63668=melter|block-melter-medium
63667=separator|block-separator-medium
63666=spore-press|block-spore-press-medium
63665=pulverizer|block-pulverizer-medium
63664=coal-centrifuge|block-coal-centrifuge-medium
63663=incinerator|block-incinerator-medium
63662=copper-wall|block-copper-wall-medium
63661=copper-wall-large|block-copper-wall-large-medium
63660=titanium-wall|block-titanium-wall-medium
63659=titanium-wall-large|block-titanium-wall-large-medium
63658=plastanium-wall|block-plastanium-wall-medium
63657=plastanium-wall-large|block-plastanium-wall-large-medium
63656=thorium-wall|block-thorium-wall-medium
63655=thorium-wall-large|block-thorium-wall-large-medium
63654=phase-wall|block-phase-wall-medium
63653=phase-wall-large|block-phase-wall-large-medium
63652=surge-wall|block-surge-wall-medium
63651=surge-wall-large|block-surge-wall-large-medium
63650=door|block-door-medium
63649=door-large|block-door-large-medium
63648=scrap-wall|block-scrap-wall-medium
63647=scrap-wall-large|block-scrap-wall-large-medium
63646=scrap-wall-huge|block-scrap-wall-huge-medium
63645=scrap-wall-gigantic|block-scrap-wall-gigantic-medium
63644=thruster|block-thruster-medium
63643=mender|block-mender-medium
63642=mend-projector|block-mend-projector-medium
63641=overdrive-projector|block-overdrive-projector-medium
63640=force-projector|block-force-projector-medium
63639=shock-mine|block-shock-mine-medium
63638=conveyor|block-conveyor-medium
63637=titanium-conveyor|block-titanium-conveyor-medium
63636=armored-conveyor|block-armored-conveyor-medium
63635=junction|block-junction-medium
63634=bridge-conveyor|block-bridge-conveyor-medium
63633=phase-conveyor|block-phase-conveyor-medium
63632=sorter|block-sorter-medium
63631=inverted-sorter|block-inverted-sorter-medium
63630=router|block-router-medium
63629=distributor|block-distributor-medium
63628=overflow-gate|block-overflow-gate-medium
63627=mass-driver|block-mass-driver-medium
63626=mechanical-pump|block-mechanical-pump-medium
63625=rotary-pump|block-rotary-pump-medium
63624=thermal-pump|block-thermal-pump-medium
63623=conduit|block-conduit-medium
63622=pulse-conduit|block-pulse-conduit-medium
63621=plated-conduit|block-plated-conduit-medium
63620=liquid-router|block-liquid-router-medium
63619=liquid-tank|block-liquid-tank-medium
63618=liquid-junction|block-liquid-junction-medium
63617=bridge-conduit|block-bridge-conduit-medium
63616=phase-conduit|block-phase-conduit-medium
63615=power-node|block-power-node-medium
63614=power-node-large|block-power-node-large-medium
63613=surge-tower|block-surge-tower-medium
63612=diode|block-diode-medium
63611=battery|block-battery-medium
63610=battery-large|block-battery-large-medium
63609=combustion-generator|block-combustion-generator-medium
63608=thermal-generator|block-thermal-generator-medium
63607=turbine-generator|block-turbine-generator-medium
63606=differential-generator|block-differential-generator-medium
63605=rtg-generator|block-rtg-generator-medium
63604=solar-panel|block-solar-panel-medium
63603=solar-panel-large|block-solar-panel-large-medium
63602=thorium-reactor|block-thorium-reactor-medium
63601=impact-reactor|block-impact-reactor-medium
63600=mechanical-drill|block-mechanical-drill-medium
63599=pneumatic-drill|block-pneumatic-drill-medium
63598=laser-drill|block-laser-drill-medium
63597=blast-drill|block-blast-drill-medium
63596=water-extractor|block-water-extractor-medium
63595=cultivator|block-cultivator-medium
63594=oil-extractor|block-oil-extractor-medium
63593=core-shard|block-core-shard-medium
63592=core-foundation|block-core-foundation-medium
63591=core-nucleus|block-core-nucleus-medium
63590=vault|block-vault-medium
63589=container|block-container-medium
63588=unloader|block-unloader-medium
63587=launch-pad|block-launch-pad-medium
63586=launch-pad-large|block-launch-pad-large-medium
63585=duo|block-duo-medium
63584=scatter|block-scatter-medium
63583=scorch|block-scorch-medium
63582=hail|block-hail-medium
63581=wave|block-wave-medium
63580=lancer|block-lancer-medium
63579=arc|block-arc-medium
63578=swarmer|block-swarmer-medium
63577=salvo|block-salvo-medium
63576=fuse|block-fuse-medium
63575=ripple|block-ripple-medium
63574=cyclone|block-cyclone-medium
63573=spectre|block-spectre-medium
63572=meltdown|block-meltdown-medium
63571=draug-factory|block-draug-factory-medium
63570=spirit-factory|block-spirit-factory-medium
63569=phantom-factory|block-phantom-factory-medium
63568=command-center|block-command-center-medium
63567=wraith-factory|block-wraith-factory-medium
63566=ghoul-factory|block-ghoul-factory-medium
63565=revenant-factory|block-revenant-factory-medium
63564=dagger-factory|block-dagger-factory-medium
63563=crawler-factory|block-crawler-factory-medium
63562=titan-factory|block-titan-factory-medium
63561=fortress-factory|block-fortress-factory-medium
63560=repair-point|block-repair-point-medium
63559=dart-mech-pad|block-dart-mech-pad-medium
63558=delta-mech-pad|block-delta-mech-pad-medium
63557=tau-mech-pad|block-tau-mech-pad-medium
63556=omega-mech-pad|block-omega-mech-pad-medium
63555=javelin-ship-pad|block-javelin-ship-pad-medium
63554=trident-ship-pad|block-trident-ship-pad-medium
63553=glaive-ship-pad|block-glaive-ship-pad-medium
63552=power-source|block-power-source-medium
63551=power-void|block-power-void-medium
63550=item-source|block-item-source-medium
63549=item-void|block-item-void-medium
63548=liquid-source|block-liquid-source-medium
63547=liquid-void|block-liquid-void-medium
63546=message|block-message-medium
63545=illuminator|block-illuminator-medium
63544=copper|item-copper-icon
63543=lead|item-lead-icon
63542=metaglass|item-metaglass-icon
63541=graphite|item-graphite-icon
63540=sand|item-sand-icon
63539=coal|item-coal-icon
63538=titanium|item-titanium-icon
63537=thorium|item-thorium-icon
63536=scrap|item-scrap-icon
63535=silicon|item-silicon-icon
63534=plastanium|item-plastanium-icon
63533=phase-fabric|item-phase-fabric-icon
63532=surge-alloy|item-surge-alloy-icon
63531=spore-pod|item-spore-pod-icon
63530=blast-compound|item-blast-compound-icon
63529=pyratite|item-pyratite-icon
63528=water|liquid-water-icon
63527=slag|liquid-slag-icon
63526=oil|liquid-oil-icon
63525=cryofluid|liquid-cryofluid-icon

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 744 KiB

After

Width:  |  Height:  |  Size: 722 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 905 KiB

After

Width:  |  Height:  |  Size: 896 KiB

View File

@ -18,6 +18,7 @@ import mindustry.graphics.*;
import mindustry.maps.*;
import mindustry.mod.*;
import mindustry.net.Net;
import mindustry.ui.*;
import static arc.Core.*;
import static mindustry.Vars.*;
@ -55,15 +56,15 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
Vars.net = new Net(platform.getNet());
mods = new Mods();
UI.loadSystemCursors();
Fonts.loadSystemCursors();
assets.load(new Vars());
UI.loadDefaultFont();
Fonts.loadDefaultFont();
assets.load(new AssetDescriptor<>("sprites/sprites.atlas", TextureAtlas.class)).loaded = t -> {
atlas = (TextureAtlas)t;
UI.cleanAtlas(atlas);
Fonts.mergeFontAtlas(atlas);
};
assets.loadRun("maps", Map.class, () -> maps.loadPreviews());

View File

@ -2,26 +2,13 @@ package mindustry.core;
import arc.*;
import arc.Graphics.*;
import arc.Graphics.Cursor.*;
import arc.Input.*;
import arc.assets.*;
import arc.assets.loaders.*;
import arc.assets.loaders.resolvers.*;
import arc.files.*;
import arc.freetype.*;
import arc.freetype.FreeTypeFontGenerator.*;
import arc.freetype.FreetypeFontLoader.*;
import arc.func.*;
import arc.graphics.*;
import arc.graphics.Pixmap.*;
import arc.graphics.Texture.*;
import arc.graphics.g2d.*;
import arc.graphics.g2d.BitmapFont.*;
import arc.graphics.g2d.PixmapPacker.*;
import arc.graphics.g2d.TextureAtlas.*;
import arc.input.*;
import arc.math.*;
import arc.math.geom.*;
import arc.scene.*;
import arc.scene.actions.*;
import arc.scene.event.*;
@ -85,7 +72,7 @@ public class UI implements ApplicationListener, Loadable{
public Cursor drillCursor, unloadCursor;
public UI(){
setupFonts();
Fonts.loadFonts();
}
@Override
@ -107,6 +94,7 @@ public class UI implements ApplicationListener, Loadable{
Icon.load();
Styles.load();
Tex.loadStyles();
Fonts.loadContentIcons();
Dialog.setShowAction(() -> sequence(alpha(0f), fadeIn(0.1f)));
Dialog.setHideAction(() -> sequence(fadeOut(0.1f)));
@ -124,7 +112,9 @@ public class UI implements ApplicationListener, Loadable{
Colors.put("unlaunched", Color.valueOf("8982ed"));
Colors.put("highlight", Pal.accent.cpy().lerp(Color.white, 0.3f));
Colors.put("stat", Pal.stat);
loadExtraCursors();
drillCursor = Core.graphics.newCursor("drill");
unloadCursor = Core.graphics.newCursor("unload");
}
@Override
@ -132,134 +122,6 @@ public class UI implements ApplicationListener, Loadable{
return Array.with(new AssetDescriptor<>(Control.class), new AssetDescriptor<>("outline", BitmapFont.class), new AssetDescriptor<>("default", BitmapFont.class), new AssetDescriptor<>("chat", BitmapFont.class));
}
/** Called from a static context to make the cursor appear immediately upon startup.*/
public static void loadSystemCursors(){
SystemCursor.arrow.set(Core.graphics.newCursor("cursor"));
SystemCursor.hand.set(Core.graphics.newCursor("hand"));
SystemCursor.ibeam.set(Core.graphics.newCursor("ibeam"));
Core.graphics.restoreCursor();
}
/** Called from a static context for use in the loading screen.*/
public static void loadDefaultFont(){
packer = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true);
FileHandleResolver resolver = new InternalFileHandleResolver();
Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
Core.assets.setLoader(BitmapFont.class, null, new FreetypeFontLoader(resolver){
@Override
public BitmapFont loadSync(AssetManager manager, String fileName, Fi file, FreeTypeFontLoaderParameter parameter){
if(fileName.equals("outline")){
parameter.fontParameters.borderWidth = Scl.scl(2f);
parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth;
}
parameter.fontParameters.magFilter = TextureFilter.Linear;
parameter.fontParameters.minFilter = TextureFilter.Linear;
parameter.fontParameters.packer = packer;
return super.loadSync(manager, fileName, file, parameter);
}
});
FreeTypeFontParameter param = new FreeTypeFontParameter(){{
borderColor = Color.darkGray;
size = (int)(Scl.scl(18f));
incremental = true;
}};
Core.assets.load("outline", BitmapFont.class, new FreeTypeFontLoaderParameter("fonts/font.ttf", param)).loaded = t -> Fonts.outline = (BitmapFont)t;
}
public static void cleanAtlas(TextureAtlas atlas){
//grab all textures from the ui page, remove all the regions assigned to it, then copy them over to Fonts.packer and replace the texture in this atlas.
//grab old UI texture and regions...
Texture texture = atlas.find("logo").getTexture();
Page page = packer.getPages().first();
Array<AtlasRegion> regions = atlas.getRegions().select(t -> t.getTexture() == texture);
for(AtlasRegion region : regions){
//get new pack rect
page.setDirty(false);
Rect rect = packer.pack(region.name + (region.splits != null ? ".9" : ""), atlas.getPixmap(region));
//set new texture
region.setTexture(packer.getPages().first().getTexture());
//set its new position
region.set((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
//add old texture
atlas.getTextures().add(region.getTexture());
}
//remove old texture, it will no longer be used
atlas.getTextures().remove(texture);
texture.dispose();
atlas.disposePixmap(texture);
page.setDirty(true);
page.updateTexture(TextureFilter.Linear, TextureFilter.Linear, false);
}
void loadExtraCursors(){
drillCursor = Core.graphics.newCursor("drill");
unloadCursor = Core.graphics.newCursor("unload");
}
public TextureRegionDrawable getGlyph(BitmapFont font, char glyph){
Glyph g = font.getData().getGlyph(glyph);
if(g == null) throw new IllegalArgumentException("No glyph: " + glyph + " (" + (int)glyph + ")");
float size = Math.max(g.width, g.height);
float aspect = (float)g.height / g.width;
TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(font.getRegion().getTexture(), g.u, g.v2, g.u2, g.v)){
@Override
public void draw(float x, float y, float width, float height){
Draw.color(Tmp.c1.set(tint).mul(Draw.getColor()).toFloatBits());
float cx = x + width/2f - g.width/2f, cy = y + height/2f - g.height/2f;
cx = (int)cx;
cy = (int)cy;
Draw.rect(region, cx + g.width/2f, cy + g.height/2f, g.width, g.height);
}
@Override
public float imageSize(){
return size;
}
};
draw.setMinWidth(size);
draw.setMinHeight(size);
return draw;
}
public void setupFonts(){
String fontName = "fonts/font.ttf";
FreeTypeFontParameter param = fontParameter();
Core.assets.load("default", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> Fonts.def = (BitmapFont)f;
Core.assets.load("chat", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> Fonts.chat = (BitmapFont)f;
Core.assets.load("icon", BitmapFont.class, new FreeTypeFontLoaderParameter("fonts/icon.ttf", new FreeTypeFontParameter(){{
size = (int)(Scl.scl(30f));
incremental = true;
}})).loaded = f -> Fonts.icon = (BitmapFont)f;
}
public TextureRegionDrawable getIcon(String name){
if(Icon.icons.containsKey(name)){
return Icon.icons.get(name);
}
return Core.atlas.getDrawable("error");
}
static FreeTypeFontParameter fontParameter(){
return new FreeTypeFontParameter(){{
size = (int)(Scl.scl(18f));
shadowColor = Color.darkGray;
shadowOffsetY = 2;
incremental = true;
}};
}
@Override
public void update(){
if(disableUI || Core.scene == null) return;
@ -355,6 +217,13 @@ public class UI implements ApplicationListener, Loadable{
}
}
public TextureRegionDrawable getIcon(String name){
if(Icon.icons.containsKey(name)){
return Icon.icons.get(name);
}
return Core.atlas.getDrawable("error");
}
public void loadAnd(Runnable call){
loadAnd("$loading", call);
}

View File

@ -1,6 +1,29 @@
package mindustry.ui;
import arc.*;
import arc.Graphics.Cursor.*;
import arc.assets.*;
import arc.assets.loaders.*;
import arc.assets.loaders.resolvers.*;
import arc.files.*;
import arc.freetype.*;
import arc.freetype.FreeTypeFontGenerator.*;
import arc.freetype.FreetypeFontLoader.*;
import arc.graphics.*;
import arc.graphics.Pixmap.*;
import arc.graphics.Texture.*;
import arc.graphics.g2d.*;
import arc.graphics.g2d.BitmapFont.*;
import arc.graphics.g2d.PixmapPacker.*;
import arc.graphics.g2d.TextureAtlas.*;
import arc.math.geom.*;
import arc.scene.style.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import mindustry.core.*;
import java.util.*;
public class Fonts{
public static BitmapFont def;
@ -8,4 +31,156 @@ public class Fonts{
public static BitmapFont chat;
public static BitmapFont icon;
/** Called from a static context to make the cursor appear immediately upon startup.*/
public static void loadSystemCursors(){
SystemCursor.arrow.set(Core.graphics.newCursor("cursor"));
SystemCursor.hand.set(Core.graphics.newCursor("hand"));
SystemCursor.ibeam.set(Core.graphics.newCursor("ibeam"));
Core.graphics.restoreCursor();
}
public static void loadFonts(){
String fontName = "fonts/font.ttf";
FreeTypeFontParameter param = fontParameter();
Core.assets.load("default", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> Fonts.def = (BitmapFont)f;
Core.assets.load("chat", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> Fonts.chat = (BitmapFont)f;
Core.assets.load("icon", BitmapFont.class, new FreeTypeFontLoaderParameter("fonts/icon.ttf", new FreeTypeFontParameter(){{
size = (int)(Scl.scl(30f));
incremental = true;
}})).loaded = f -> Fonts.icon = (BitmapFont)f;
}
public static void loadContentIcons(){
Array<BitmapFont> fonts = Array.with(Fonts.chat, Fonts.def, Fonts.outline);
Texture uitex = Core.atlas.find("logo").getTexture();
int size = (int)(Fonts.def.getData().lineHeight/Fonts.def.getData().scaleY);
try(Scanner scan = new Scanner(Core.files.internal("icons/icons.properties").read(512))){
while(scan.hasNextLine()){
String line = scan.nextLine();
String[] split = line.split("=");
String character = split[0], texture = split[1].split("\\|")[1];
int ch = Integer.parseInt(character);
TextureRegion region = Core.atlas.find(texture);
if(region.getTexture() != uitex) throw new IllegalArgumentException("Font icon '" + texture + "' is not in the UI texture.");
Glyph glyph = new Glyph();
glyph.id = ch;
glyph.srcX = 0;
glyph.srcY = 0;
glyph.width = size;
glyph.height = size;
glyph.u = region.getU();
glyph.v = region.getV2();
glyph.u2 = region.getU2();
glyph.v2 = region.getV();
glyph.xoffset = 0;
glyph.yoffset = -size;
glyph.xadvance = size;
glyph.kerning = null;
glyph.fixedWidth = true;
glyph.page = 0;
fonts.each(f -> f.getData().setGlyph(ch, glyph));
}
}
}
/** Called from a static context for use in the loading screen.*/
public static void loadDefaultFont(){
UI.packer = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true);
FileHandleResolver resolver = new InternalFileHandleResolver();
Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
Core.assets.setLoader(BitmapFont.class, null, new FreetypeFontLoader(resolver){
@Override
public BitmapFont loadSync(AssetManager manager, String fileName, Fi file, FreeTypeFontLoaderParameter parameter){
if(fileName.equals("outline")){
parameter.fontParameters.borderWidth = Scl.scl(2f);
parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth;
}
parameter.fontParameters.magFilter = TextureFilter.Linear;
parameter.fontParameters.minFilter = TextureFilter.Linear;
parameter.fontParameters.packer = UI.packer;
return super.loadSync(manager, fileName, file, parameter);
}
});
FreeTypeFontParameter param = new FreeTypeFontParameter(){{
borderColor = Color.darkGray;
size = (int)(Scl.scl(18f));
incremental = true;
}};
Core.assets.load("outline", BitmapFont.class, new FreeTypeFontLoaderParameter("fonts/font.ttf", param)).loaded = t -> Fonts.outline = (BitmapFont)t;
}
/** Merges the UI and font atlas together for better performance. */
public static void mergeFontAtlas(TextureAtlas atlas){
//grab all textures from the ui page, remove all the regions assigned to it, then copy them over to Fonts.packer and replace the texture in this atlas.
//grab old UI texture and regions...
Texture texture = atlas.find("logo").getTexture();
Page page = UI.packer.getPages().first();
Array<AtlasRegion> regions = atlas.getRegions().select(t -> t.getTexture() == texture);
for(AtlasRegion region : regions){
//get new pack rect
page.setDirty(false);
Rect rect = UI.packer.pack(region.name + (region.splits != null ? ".9" : ""), atlas.getPixmap(region));
//set new texture
region.setTexture(UI.packer.getPages().first().getTexture());
//set its new position
region.set((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
//add old texture
atlas.getTextures().add(region.getTexture());
}
//remove old texture, it will no longer be used
atlas.getTextures().remove(texture);
texture.dispose();
atlas.disposePixmap(texture);
page.setDirty(true);
page.updateTexture(TextureFilter.Linear, TextureFilter.Linear, false);
}
public static TextureRegionDrawable getGlyph(BitmapFont font, char glyph){
Glyph g = font.getData().getGlyph(glyph);
if(g == null) throw new IllegalArgumentException("No glyph: " + glyph + " (" + (int)glyph + ")");
float size = Math.max(g.width, g.height);
float aspect = (float)g.height / g.width;
TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(font.getRegion().getTexture(), g.u, g.v2, g.u2, g.v)){
@Override
public void draw(float x, float y, float width, float height){
Draw.color(Tmp.c1.set(tint).mul(Draw.getColor()).toFloatBits());
float cx = x + width/2f - g.width/2f, cy = y + height/2f - g.height/2f;
cx = (int)cx;
cy = (int)cy;
Draw.rect(region, cx + g.width/2f, cy + g.height/2f, g.width, g.height);
}
@Override
public float imageSize(){
return size;
}
};
draw.setMinWidth(size);
draw.setMinHeight(size);
return draw;
}
static FreeTypeFontParameter fontParameter(){
return new FreeTypeFontParameter(){{
size = (int)(Scl.scl(18f));
shadowColor = Color.darkGray;
shadowOffsetY = 2;
incremental = true;
}};
}
}

View File

@ -1,3 +1,3 @@
org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=e1b23af5b5e426fdd32c3940a00ffbcb429dd77e
archash=1d6a93973f44e4ef310cd959168ed611f2dbfef9

View File

@ -176,6 +176,10 @@ public class Generators{
Image image = new Image(icon.size, icon.size);
image.drawScaled(base);
image.save(item.getContentType().name() + "-" + item.name + "-" + icon.name(), false);
if(icon == Cicon.medium){
image.save("../ui/" + item.getContentType() + "-" + item.name + "-icon");
}
}
}
});
@ -254,12 +258,11 @@ public class Generators{
image.save("../blocks/environment/ore-" + item.name + (i + 1));
image.save("../editor/editor-ore-" + item.name + (i + 1));
//save icons
image.save("block-" + ore.name + "-full");
for(Cicon icon : Cicon.scaled){
Image scaled = new Image(icon.size, icon.size);
scaled.drawScaled(image);
scaled.save("block-" + ore.name + "-" + icon.name());
scaled.save("../ui/block-" + ore.name + "-" + icon.name());
}
}
});

View File

@ -7,8 +7,13 @@ 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.world.*;
import mindustry.world.blocks.*;
import javax.imageio.*;
import java.awt.image.*;
@ -93,6 +98,42 @@ public class ImagePacker{
Log.info("&ly[Generator]&lc Total time to generate: &lg{0}&lcms", Time.elapsed());
Log.info("&ly[Generator]&lc Total images created: &lg{0}", 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));
Array<UnlockableContent> cont = Array.withArrays(Vars.content.blocks(), Vars.content.items(), Vars.content.liquids());
cont.removeAll(u -> u instanceof BlockPart || u instanceof BuildBlock || 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";
return c.getContentType() + "-" + c.name + "-icon";
}
static void generate(String name, Runnable run){