From 59a575f3fb22fc36c7b3a051b05dcb21530b1075 Mon Sep 17 00:00:00 2001 From: fgnm Date: Fri, 4 Jun 2021 18:26:22 +0200 Subject: [PATCH] Support libGDX atlas importing --- CHANGES | 2 + .../editor/proxy/ProjectManager.java | 11 +++-- .../editor/proxy/ResolutionManager.java | 2 +- .../editor/utils/asset/impl/AtlasAsset.java | 40 ++++++++++++++++--- .../dialog/AnimationsPackDialogMediator.java | 26 ++++++++++-- .../view/ui/dialog/AtlasesPackDialog.java | 2 + .../ui/dialog/ImagesPackDialogMediator.java | 25 ++++++++++-- 7 files changed, 91 insertions(+), 17 deletions(-) diff --git a/CHANGES b/CHANGES index 0d27bf77..56428b31 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,8 @@ = Editor = - Use Distance Field fonts for GUI - Add Editor performance settings (MSAA, OpenGL 3) +- Add multiple atlas packing settings +- Add Import libGDX atlas format - Huge improvements to Tiled Plugin: * Sprite and Spine animated Tiles * UI improvements and general refactoring diff --git a/src/main/java/games/rednblack/editor/proxy/ProjectManager.java b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java index f2e80aff..c5ba39de 100755 --- a/src/main/java/games/rednblack/editor/proxy/ProjectManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java @@ -631,7 +631,7 @@ public class ProjectManager extends Proxy { private boolean deleteSingleImage(String resolutionName, String imageName) { String imagesPath = currentProjectPath + "/assets/" + resolutionName + "/images" + File.separator; String filePath = imagesPath + imageName + ".png"; - currentProjectInfoVO.imagesPacks.get("main").regions.remove(imageName); + deleteRegionFromPack(currentProjectInfoVO.imagesPacks, imageName); if (!(new File(filePath)).delete()) { filePath = imagesPath + imageName + ".9.png"; return (new File(filePath)).delete(); @@ -670,7 +670,7 @@ public class ProjectManager extends Proxy { for (JsonValue entry = slotEntry.child; entry != null; entry = entry.next) { String name = spineName + entry.getString("name", entry.name); deleteSingleImage(resolutionName, name); - currentProjectInfoVO.animationsPacks.get("main").regions.remove(name); + deleteRegionFromPack(currentProjectInfoVO.animationsPacks, name); } } } @@ -695,10 +695,15 @@ public class ProjectManager extends Proxy { f.delete(); } } - currentProjectInfoVO.animationsPacks.get("main").regions.remove(spriteName); + deleteRegionFromPack(currentProjectInfoVO.animationsPacks, spriteName); return deleteDirectory(filePath); } + public void deleteRegionFromPack(HashMap map, String region) { + for (TexturePackVO vo : map.values()) + vo.regions.remove(region); + } + public boolean deleteSpriteAnimationForAllResolutions(String spineName) { for (ResolutionEntryVO resolutionEntryVO : currentProjectInfoVO.resolutions) { if(!deleteSpriteAnimation(resolutionEntryVO.name, spineName)) diff --git a/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java b/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java index f943f282..449904f4 100644 --- a/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java @@ -212,7 +212,7 @@ public class ResolutionManager extends Proxy { for (FileHandle entry : sourceDir.list()) { if (entry.extension().equals("png")) { - String name = regionsReverse.get(entry.nameWithoutExtension().replace(".9", "").replaceAll("_.*", "")); + String name = regionsReverse.get(entry.nameWithoutExtension().replace(".9", "").replaceAll("_[0-9]+", "")); name = name == null ? "pack" : name; TexturePacker tp = packerMap.get(name); tp.addImage(entry.file()); diff --git a/src/main/java/games/rednblack/editor/utils/asset/impl/AtlasAsset.java b/src/main/java/games/rednblack/editor/utils/asset/impl/AtlasAsset.java index 78586309..7256e9c4 100644 --- a/src/main/java/games/rednblack/editor/utils/asset/impl/AtlasAsset.java +++ b/src/main/java/games/rednblack/editor/utils/asset/impl/AtlasAsset.java @@ -3,18 +3,20 @@ package games.rednblack.editor.utils.asset.impl; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.GdxRuntimeException; +import games.rednblack.editor.renderer.data.TexturePackVO; import games.rednblack.editor.utils.ImportUtils; import games.rednblack.editor.utils.asset.Asset; import games.rednblack.h2d.common.ProgressHandler; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.IOException; public class AtlasAsset extends Asset { @Override protected int getType() { - //TODO Atlas not suported yet - return ImportUtils.TYPE_UNKNOWN; - //return ImportUtils.TYPE_TEXTURE_ATLAS; + return ImportUtils.TYPE_TEXTURE_ATLAS; } @Override @@ -35,6 +37,34 @@ public class AtlasAsset extends Asset { @Override public void importAsset(Array files, ProgressHandler progressHandler, boolean skipRepack) { - throw new GdxRuntimeException("Atlas not suported yet."); + try { + for (FileHandle fileHandle : new Array.ArrayIterator<>(files)) { + FileHandle tmpDir = new FileHandle(projectManager.getCurrentProjectPath() + File.separator + "tmp"); + if (tmpDir.exists()) + FileUtils.forceDelete(tmpDir.file()); + FileUtils.forceMkdir(tmpDir.file()); + ImportUtils.unpackAtlasIntoTmpFolder(fileHandle.file(), null, tmpDir.path()); + Array images = new Array<>(tmpDir.list()); + projectManager.copyImageFilesForAllResolutionsIntoProject(images, true, progressHandler); + FileUtils.forceDelete(tmpDir.file()); + + TexturePackVO texturePackVO = projectManager.getCurrentProjectInfoVO().imagesPacks.get(fileHandle.nameWithoutExtension()); + if (texturePackVO == null) { + texturePackVO = new TexturePackVO(); + texturePackVO.name = fileHandle.nameWithoutExtension(); + + projectManager.getCurrentProjectInfoVO().imagesPacks.put(texturePackVO.name, texturePackVO); + } + + for (FileHandle image : images) { + texturePackVO.regions.add(image.nameWithoutExtension().replace(".9", "")); + } + } + + resolutionManager.rePackProjectImagesForAllResolutionsSync(); + } catch (IOException e) { + e.printStackTrace(); + progressHandler.progressFailed(); + } } } diff --git a/src/main/java/games/rednblack/editor/view/ui/dialog/AnimationsPackDialogMediator.java b/src/main/java/games/rednblack/editor/view/ui/dialog/AnimationsPackDialogMediator.java index d4afc349..71871078 100644 --- a/src/main/java/games/rednblack/editor/view/ui/dialog/AnimationsPackDialogMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/dialog/AnimationsPackDialogMediator.java @@ -1,6 +1,9 @@ package games.rednblack.editor.view.ui.dialog; import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.resource.DeleteImageResource; +import games.rednblack.editor.controller.commands.resource.DeleteSpineAnimation; +import games.rednblack.editor.controller.commands.resource.DeleteSpriteAnimation; import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.editor.renderer.data.TexturePackVO; import games.rednblack.editor.view.menu.ResourcesMenu; @@ -34,7 +37,11 @@ public class AnimationsPackDialogMediator extends Mediator { ProjectManager.PROJECT_OPENED, NEW_IMAGES_PACK, MOVE_REGION_TO_PACK, - UPDATE_CURRENT_LIST + UPDATE_CURRENT_LIST, + ProjectManager.PROJECT_DATA_UPDATED, + DeleteImageResource.DONE, + DeleteSpineAnimation.DONE, + DeleteSpriteAnimation.DONE }; } @@ -43,11 +50,20 @@ public class AnimationsPackDialogMediator extends Mediator { Sandbox sandbox = Sandbox.getInstance(); UIStage uiStage = sandbox.getUIStage(); ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); - + String currentTab; switch (notification.getName()) { case ResourcesMenu.OPEN_ANIMATIONS_PACK: viewComponent.show(uiStage); break; + case ProjectManager.PROJECT_DATA_UPDATED: + case DeleteImageResource.DONE: + case DeleteSpineAnimation.DONE: + case DeleteSpriteAnimation.DONE: + viewComponent.updateMainPack(projectManager.currentProjectInfoVO.animationsPacks.get("main").regions); + currentTab = viewComponent.getSelectedTab(); + if (currentTab != null) + viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.animationsPacks.get(currentTab).regions); + break; case ProjectManager.PROJECT_OPENED: viewComponent.initPacks(projectManager.currentProjectInfoVO.animationsPacks.keySet()); viewComponent.updateMainPack(projectManager.currentProjectInfoVO.animationsPacks.get("main").regions); @@ -61,8 +77,10 @@ public class AnimationsPackDialogMediator extends Mediator { viewComponent.addNewPack(newVo.name); break; case UPDATE_CURRENT_LIST: - String currentTab = viewComponent.getSelectedTab(); - viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.animationsPacks.get(currentTab).regions); + currentTab = viewComponent.getSelectedTab(); + System.out.println(currentTab); + if (currentTab != null) + viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.animationsPacks.get(currentTab).regions); break; case MOVE_REGION_TO_PACK: String toPack = viewComponent.getMainSelected() != null ? viewComponent.getSelectedTab() : "main"; diff --git a/src/main/java/games/rednblack/editor/view/ui/dialog/AtlasesPackDialog.java b/src/main/java/games/rednblack/editor/view/ui/dialog/AtlasesPackDialog.java index cdcc0425..c86219df 100644 --- a/src/main/java/games/rednblack/editor/view/ui/dialog/AtlasesPackDialog.java +++ b/src/main/java/games/rednblack/editor/view/ui/dialog/AtlasesPackDialog.java @@ -202,6 +202,8 @@ public class AtlasesPackDialog extends H2DDialog { } public String getSelectedTab() { + if (tabbedPane.getActiveTab() == null) + return null; return tabbedPane.getActiveTab().getTabTitle(); } diff --git a/src/main/java/games/rednblack/editor/view/ui/dialog/ImagesPackDialogMediator.java b/src/main/java/games/rednblack/editor/view/ui/dialog/ImagesPackDialogMediator.java index bce1ff55..8d038c86 100644 --- a/src/main/java/games/rednblack/editor/view/ui/dialog/ImagesPackDialogMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/dialog/ImagesPackDialogMediator.java @@ -1,6 +1,9 @@ package games.rednblack.editor.view.ui.dialog; import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.resource.DeleteImageResource; +import games.rednblack.editor.controller.commands.resource.DeleteSpineAnimation; +import games.rednblack.editor.controller.commands.resource.DeleteSpriteAnimation; import games.rednblack.editor.proxy.ProjectManager; import games.rednblack.editor.renderer.data.TexturePackVO; import games.rednblack.editor.view.menu.ResourcesMenu; @@ -34,7 +37,11 @@ public class ImagesPackDialogMediator extends Mediator { ProjectManager.PROJECT_OPENED, NEW_IMAGES_PACK, MOVE_REGION_TO_PACK, - UPDATE_CURRENT_LIST + UPDATE_CURRENT_LIST, + ProjectManager.PROJECT_DATA_UPDATED, + DeleteImageResource.DONE, + DeleteSpineAnimation.DONE, + DeleteSpriteAnimation.DONE }; } @@ -43,11 +50,20 @@ public class ImagesPackDialogMediator extends Mediator { Sandbox sandbox = Sandbox.getInstance(); UIStage uiStage = sandbox.getUIStage(); ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); - + String currentTab; switch (notification.getName()) { case ResourcesMenu.OPEN_IMAGES_PACK: viewComponent.show(uiStage); break; + case ProjectManager.PROJECT_DATA_UPDATED: + case DeleteImageResource.DONE: + case DeleteSpineAnimation.DONE: + case DeleteSpriteAnimation.DONE: + viewComponent.updateMainPack(projectManager.currentProjectInfoVO.imagesPacks.get("main").regions); + currentTab = viewComponent.getSelectedTab(); + if (currentTab != null) + viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.imagesPacks.get(currentTab).regions); + break; case ProjectManager.PROJECT_OPENED: viewComponent.initPacks(projectManager.currentProjectInfoVO.imagesPacks.keySet()); viewComponent.updateMainPack(projectManager.currentProjectInfoVO.imagesPacks.get("main").regions); @@ -61,8 +77,9 @@ public class ImagesPackDialogMediator extends Mediator { viewComponent.addNewPack(newVo.name); break; case UPDATE_CURRENT_LIST: - String currentTab = viewComponent.getSelectedTab(); - viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.imagesPacks.get(currentTab).regions); + currentTab = viewComponent.getSelectedTab(); + if (currentTab != null) + viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.imagesPacks.get(currentTab).regions); break; case MOVE_REGION_TO_PACK: String toPack = viewComponent.getMainSelected() != null ? viewComponent.getSelectedTab() : "main";