Support libGDX atlas importing

This commit is contained in:
fgnm
2021-06-04 18:26:22 +02:00
parent c1526d7437
commit 59a575f3fb
7 changed files with 91 additions and 17 deletions
+2
View File
@@ -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
@@ -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<String, TexturePackVO> 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))
@@ -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());
@@ -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<FileHandle> 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<FileHandle> 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();
}
}
}
@@ -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<AtlasesPackDialog> {
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<AtlasesPackDialog> {
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<AtlasesPackDialog> {
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";
@@ -202,6 +202,8 @@ public class AtlasesPackDialog extends H2DDialog {
}
public String getSelectedTab() {
if (tabbedPane.getActiveTab() == null)
return null;
return tabbedPane.getActiveTab().getTabTitle();
}
@@ -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<AtlasesPackDialog> {
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<AtlasesPackDialog> {
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<AtlasesPackDialog> {
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";