From 39f53d5587ba27770c47c84c0f5a23d75cdb9976 Mon Sep 17 00:00:00 2001 From: fgnm Date: Sat, 15 May 2021 19:07:36 +0200 Subject: [PATCH] [editor only] Tileset auto splitter --- assets/plugins/plugin-tiled-0.0.7.jar | Bin 65918 -> 72027 bytes gradle.properties | 2 +- .../editor/plugin/tiled/TiledPlugin.java | 6 ++ .../view/dialog/ImportTileSetDialog.java | 83 ++++++++++++++++++ .../dialog/ImportTileSetDialogMediator.java | 81 +++++++++++++++++ .../editor/proxy/ResourceManager.java | 17 +--- .../editor/view/menu/HyperLap2DMenuBar.java | 5 ++ 7 files changed, 180 insertions(+), 14 deletions(-) create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/dialog/ImportTileSetDialog.java create mode 100644 plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/dialog/ImportTileSetDialogMediator.java diff --git a/assets/plugins/plugin-tiled-0.0.7.jar b/assets/plugins/plugin-tiled-0.0.7.jar index 8f3e9355229793e56bed054e049fbbfdcc1c021a..af8113e15a6d7881ec6a2ad06a68060cc8b4430d 100644 GIT binary patch delta 11783 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 diff --git a/gradle.properties b/gradle.properties index c36cd308..7761b0b4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ gdxVersion = 1.10.0 gdxVersionBeta = 1.10.0 ashleyVersion = 1.7.4 spineVersion = 3.8.55.1 -visuiVersion = 1.5.0-SNAPSHOT +visuiVersion = 1.5.0 typingLabelVersion = 1.2.0 shapedrawerVersion = 2.4.0 talosVersion = 1.3.1 \ No newline at end of file diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java index c5eb273a..19b9adc0 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/TiledPlugin.java @@ -34,12 +34,14 @@ import games.rednblack.editor.plugin.tiled.save.DataToSave; import games.rednblack.editor.plugin.tiled.save.SaveDataManager; import games.rednblack.editor.plugin.tiled.tools.DeleteTileTool; import games.rednblack.editor.plugin.tiled.tools.DrawTileTool; +import games.rednblack.editor.plugin.tiled.view.dialog.ImportTileSetDialogMediator; import games.rednblack.editor.renderer.components.MainItemComponent; import games.rednblack.editor.renderer.components.TextureRegionComponent; import games.rednblack.editor.renderer.components.TransformComponent; import games.rednblack.editor.renderer.components.ZIndexComponent; import games.rednblack.editor.renderer.utils.ComponentRetriever; import games.rednblack.editor.renderer.utils.CustomVariables; +import games.rednblack.h2d.common.MenuAPI; import games.rednblack.h2d.common.plugins.H2DPluginAdapter; import net.mountainblade.modular.annotations.Implementation; @@ -57,6 +59,7 @@ public class TiledPlugin extends H2DPluginAdapter { public static final String TILE_SELECTED = CLASS_NAME + ".TILE_SELECTED"; public static final String OPEN_DROP_DOWN = CLASS_NAME + ".OPEN_DROP_DOWN"; public static final String GRID_CHANGED = CLASS_NAME + ".GRID_CHANGED"; + public static final String IMPORT_TILESET_PANEL_OPEN = CLASS_NAME + ".IMPORT_TILESET_PANEL_OPEN"; public static final String ACTION_DELETE_TILE = CLASS_NAME + ".ACTION_DELETE_TILE"; public static final String ACTION_SET_OFFSET = CLASS_NAME + ".ACTION_SET_OFFSET"; public static final String ACTION_OPEN_OFFSET_PANEL = CLASS_NAME + ".ACTION_OPEN_OFFSET_PANEL"; @@ -91,6 +94,7 @@ public class TiledPlugin extends H2DPluginAdapter { @Override public void initPlugin() { facade.registerMediator(new TiledPanelMediator(this)); + facade.registerMediator(new ImportTileSetDialogMediator(pluginAPI, facade)); pluginRM = new ResourcesManager(this); offsetPanel = new OffsetPanel(this); @@ -117,6 +121,8 @@ public class TiledPlugin extends H2DPluginAdapter { pluginAPI.addTool(DeleteTileTool.NAME, tileDeleteButtonStyle, false, deleteTileTool); pluginAPI.setDropDownItemName(ACTION_SET_GRID_SIZE_FROM_ITEM, "Set tile grid size"); + + pluginAPI.addMenuItem(MenuAPI.RESOURCE_MENU, "Import Tile Set...", IMPORT_TILESET_PANEL_OPEN); } @Override diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/dialog/ImportTileSetDialog.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/dialog/ImportTileSetDialog.java new file mode 100644 index 00000000..ac7810b0 --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/dialog/ImportTileSetDialog.java @@ -0,0 +1,83 @@ +package games.rednblack.editor.plugin.tiled.view.dialog; + +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.kotcrab.vis.ui.util.Validators; +import com.kotcrab.vis.ui.widget.VisLabel; +import com.kotcrab.vis.ui.widget.VisTable; +import com.kotcrab.vis.ui.widget.VisTextButton; +import com.kotcrab.vis.ui.widget.VisValidatableTextField; +import com.kotcrab.vis.ui.widget.file.FileChooser; +import games.rednblack.h2d.common.H2DDialog; +import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; +import games.rednblack.h2d.common.view.ui.widget.InputFileWidget; +import org.puremvc.java.interfaces.IFacade; + +public class ImportTileSetDialog extends H2DDialog { + private static final String prefix = "games.rednblack.editor.plugin.tiled.view.dialog.ImportTileSetDialog"; + public static final String IMPORT_TILESET = prefix + ".IMPORT_TILESET"; + + private final VisValidatableTextField width, height; + private final InputFileWidget imagePathField; + private final VisTextButton importButton; + private final IFacade facade; + + public ImportTileSetDialog(IFacade facade) { + super("Import TileSet"); + this.facade = facade; + + setModal(true); + addCloseButton(); + VisTable fileTable = new VisTable(); + fileTable.pad(6); + // + fileTable.add(new VisLabel("Tile Set:")).right().padRight(5); + imagePathField = new InputFileWidget(FileChooser.Mode.OPEN, FileChooser.SelectionMode.FILES, false); + imagePathField.setTextFieldWidth(156); + fileTable.add(imagePathField); + getContentTable().add(fileTable); + // + getContentTable().row().padTop(10); + // + + Validators.IntegerValidator validator = new Validators.IntegerValidator(); + + width = StandardWidgetsFactory.createValidableTextField(validator); + height = StandardWidgetsFactory.createValidableTextField(validator); + + VisTable sizeTable = new VisTable(); + sizeTable.add("Width:").padRight(3); + sizeTable.add(width).width(60); + sizeTable.add("px"); + sizeTable.row().padTop(5); + sizeTable.add("Height:").padRight(3); + sizeTable.add(height).width(60); + sizeTable.add("px"); + getContentTable().add(sizeTable); + + importButton = StandardWidgetsFactory.createTextButton("Import"); + getButtonsTable().add(importButton); + pack(); + + setListeners(); + } + + public int getTileWidth() { + return Integer.parseInt(width.getText()); + } + + public int getTileHeight() { + return Integer.parseInt(height.getText()); + } + + private void setListeners() { + importButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + if (width.isInputValid() && height.isInputValid() && imagePathField.getValue() != null) { + facade.sendNotification(IMPORT_TILESET, imagePathField.getValue()); + } + } + }); + } +} diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/dialog/ImportTileSetDialogMediator.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/dialog/ImportTileSetDialogMediator.java new file mode 100644 index 00000000..7d60958e --- /dev/null +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/view/dialog/ImportTileSetDialogMediator.java @@ -0,0 +1,81 @@ +package games.rednblack.editor.plugin.tiled.view.dialog; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.PixmapIO; +import games.rednblack.editor.plugin.tiled.TiledPlugin; +import games.rednblack.h2d.common.MsgAPI; +import games.rednblack.h2d.common.plugins.PluginAPI; +import org.puremvc.java.interfaces.IFacade; +import org.puremvc.java.interfaces.INotification; +import org.puremvc.java.patterns.mediator.Mediator; + +import java.io.File; + +public class ImportTileSetDialogMediator extends Mediator { + private static final String TAG = ImportTileSetDialogMediator.class.getCanonicalName(); + public static final String NAME = TAG; + + private final PluginAPI pluginAPI; + + public ImportTileSetDialogMediator(PluginAPI pluginAPI, IFacade facade) { + super(NAME, new ImportTileSetDialog(facade)); + this.pluginAPI = pluginAPI; + } + + @Override + public String[] listNotificationInterests() { + return new String[] { + TiledPlugin.IMPORT_TILESET_PANEL_OPEN, + ImportTileSetDialog.IMPORT_TILESET + }; + } + + @Override + public void handleNotification(INotification notification) { + switch (notification.getName()) { + case TiledPlugin.IMPORT_TILESET_PANEL_OPEN: + viewComponent.show(pluginAPI.getUIStage()); + break; + case ImportTileSetDialog.IMPORT_TILESET: + FileHandle tileset = notification.getBody(); + importTileset(tileset); + break; + } + } + + private void importTileset(FileHandle tileset) { + byte[] image = tileset.readBytes(); + Pixmap pixmap = new Pixmap(image, 0, image.length); + String name = tileset.nameWithoutExtension(); + + int tileW = viewComponent.getTileWidth(); + int tileH = viewComponent.getTileHeight(); + + int i = 0; + for (int x = 0; x < pixmap.getWidth(); x += tileW) { + for (int y = 0; y < pixmap.getHeight(); y += tileH) { + int w = x + tileW <= pixmap.getWidth() ? tileW : pixmap.getWidth() - x; + int h = y + tileH <= pixmap.getHeight() ? tileH : pixmap.getHeight() - y; + Pixmap tilePixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888); + tilePixmap.drawPixmap(pixmap, 0, 0, x, y, w, h); + + String imagesPath = getCurrentRawImagesPath() + File.separator + name + i + ".png"; + FileHandle path = new FileHandle(imagesPath); + PixmapIO.writePNG(path, tilePixmap); + + tilePixmap.dispose(); + i++; + } + } + + pixmap.dispose(); + + viewComponent.close(); + facade.sendNotification(MsgAPI.ACTION_REPACK); + } + + public String getCurrentRawImagesPath() { + return pluginAPI.getProjectPath() + File.separator + "assets" + File.separator + "orig" + File.separator + "images"; + } +} diff --git a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java index 3417fb41..06b6c3cb 100644 --- a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java @@ -87,7 +87,6 @@ public class ResourceManager extends Proxy implements IResourceRetriever { packer.setTransparentColor(Color.WHITE); packer.getTransparentColor().a = 0; - FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("freetypefonts/DejaVuSans.ttf")); FreeTypeFontGenerator monoGenerator = new FreeTypeFontGenerator(Gdx.files.internal("freetypefonts/FiraCode-Regular.ttf")); FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter(); @@ -98,27 +97,19 @@ public class ResourceManager extends Proxy implements IResourceRetriever { parameter.minFilter = Texture.TextureFilter.Linear; parameter.magFilter = Texture.TextureFilter.Linear; - parameter.size = 10; - BitmapFont smallFont = generator.generateFont(parameter); - - parameter.size = 12; - BitmapFont defaultFont = generator.generateFont(parameter); - - parameter.size = 14; - BitmapFont bigFont = generator.generateFont(parameter); BitmapFont defaultMono = monoGenerator.generateFont(parameter); defaultMono.setFixedWidthGlyphs(parameter.characters); - generator.dispose(); monoGenerator.dispose(); - ShadedDistanceFieldFont smallDistanceField = new ShadedDistanceFieldFont(Gdx.files.internal("style/default-font-32.fnt")); + TextureRegion dejavuRegion = new TextureRegion(new Texture(Gdx.files.internal("style/default-font-32.png"))); + ShadedDistanceFieldFont smallDistanceField = new ShadedDistanceFieldFont(Gdx.files.internal("style/default-font-32.fnt"), dejavuRegion); smallDistanceField.setDistanceFieldSmoothing(6); smallDistanceField.getData().setScale(0.35f); - ShadedDistanceFieldFont defaultDistanceField = new ShadedDistanceFieldFont(Gdx.files.internal("style/default-font-32.fnt")); + ShadedDistanceFieldFont defaultDistanceField = new ShadedDistanceFieldFont(Gdx.files.internal("style/default-font-32.fnt"), dejavuRegion); defaultDistanceField.setDistanceFieldSmoothing(6); defaultDistanceField.getData().setScale(0.4f); - ShadedDistanceFieldFont bigDistanceField = new ShadedDistanceFieldFont(Gdx.files.internal("style/default-font-32.fnt")); + ShadedDistanceFieldFont bigDistanceField = new ShadedDistanceFieldFont(Gdx.files.internal("style/default-font-32.fnt"), dejavuRegion); bigDistanceField.setDistanceFieldSmoothing(6); bigDistanceField.getData().setScale(0.5f); /* Create the ObjectMap and add the fonts to it */ diff --git a/src/main/java/games/rednblack/editor/view/menu/HyperLap2DMenuBar.java b/src/main/java/games/rednblack/editor/view/menu/HyperLap2DMenuBar.java index c9c397bf..a2f8bfd1 100644 --- a/src/main/java/games/rednblack/editor/view/menu/HyperLap2DMenuBar.java +++ b/src/main/java/games/rednblack/editor/view/menu/HyperLap2DMenuBar.java @@ -68,18 +68,23 @@ public class HyperLap2DMenuBar extends CustomMenuBar { public void addMenuItem(String menu, String subMenuName, String notificationName) { if(menu.equals(MenuAPI.FILE_MENU)) { + fileMenu.addSeparator(); fileMenu.addItem(new MenuItem(subMenuName, new MenuItemListener(notificationName, null, menu))); } if(menu.equals(MenuAPI.EDIT_MENU)) { + editMenu.addSeparator(); editMenu.addItem(new MenuItem(subMenuName, new MenuItemListener(notificationName, null, menu))); } if(menu.equals(MenuAPI.RESOURCE_MENU)) { + resourcesMenu.addSeparator(); resourcesMenu.addItem(new MenuItem(subMenuName, new MenuItemListener(notificationName, null, menu))); } if(menu.equals(MenuAPI.WINDOW_MENU)) { + windowMenu.addSeparator(); windowMenu.addItem(new MenuItem(subMenuName, new MenuItemListener(notificationName, null, menu))); } if(menu.equals(MenuAPI.HELP_MENU)) { + helpMenu.addSeparator(); helpMenu.addItem(new MenuItem(subMenuName, new MenuItemListener(notificationName, null, menu))); } }