From e7dabb2f10ebc5b7d1d4e29e3dea5c6b44eb5cbd Mon Sep 17 00:00:00 2001 From: fgnm Date: Thu, 3 Jun 2021 23:38:04 +0200 Subject: [PATCH] Resources can be split into multiple atlas --- assets/plugins/plugin-9patch-0.0.7.jar | Bin 22780 -> 22746 bytes assets/plugins/plugin-tiled-0.0.7.jar | Bin 72180 -> 72109 bytes assets/style/uiskin.json | 3 + h2d-libgdx-spine-extension | 2 +- h2d-libgdx-talos-extension | 2 +- hyperlap2d-common-api | 2 +- hyperlap2d-runtime-libgdx | 2 +- .../plugin/ninepatch/MainPanelMediator.java | 7 +- .../tiled/manager/ResourcesManager.java | 4 +- .../tools/drawStrategy/SpineDrawStrategy.java | 4 +- .../controller/BootstrapViewCommand.java | 2 + .../rednblack/editor/data/SpineAnimData.java | 1 - .../rednblack/editor/proxy/PluginManager.java | 4 +- .../editor/proxy/ProjectManager.java | 38 +-- .../editor/proxy/ResolutionManager.java | 33 ++- .../editor/proxy/ResourceManager.java | 68 +++-- .../editor/view/menu/ResourcesMenu.java | 6 + .../resourcespanel/UIImagesTabMediator.java | 2 +- .../dialog/AnimationsPackDialogMediator.java | 80 ++++++ .../view/ui/dialog/AtlasesPackDialog.java | 248 ++++++++++++++++++ .../ui/dialog/ImagesPackDialogMediator.java | 80 ++++++ .../view/ui/widget/actors/SpineActor.java | 4 +- 22 files changed, 509 insertions(+), 83 deletions(-) create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/AnimationsPackDialogMediator.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/AtlasesPackDialog.java create mode 100644 src/main/java/games/rednblack/editor/view/ui/dialog/ImagesPackDialogMediator.java diff --git a/assets/plugins/plugin-9patch-0.0.7.jar b/assets/plugins/plugin-9patch-0.0.7.jar index f3541ac666572e9164ff9b73ef58eaa0a62b30fb..39dee0e62c9b09979873eea9ae7d96a1eae43eea 100644 GIT binary patch delta 4757 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 X|DE@s10(+blc8i6T??Fu$2q00Z?#XaV;i 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 delta 6250 zcmZWtby$?k+uoP%UOFWY-O}A4jg)jZ2$I6GbR#UVbP9+_E)60|ODG_XNGK^t%MrwH z*>jHPI=^rJ*m>Ujy`N|9Yi4$5_O3%^|jG4@IW9O9MExMZxf*$fR5~8x_}}P zvNv30zIXf_0|aWuhrQzFhTD<=ci1^s$eL^_ErcV1ZtoIfs}45 zz&M#0Aw_1mwiL58H`dLLnG*`WP>mhB%>dE=SM6qIntR_G_(|XU z`PE-rW!2xpKz)HttLb+rc#dk!BFUhG^X}@c`Vd2rjk0>E$N4ip{bp7>wy#!bgRPIk zE4jdCww#%vF9;&Cc=Szp2kt-_{P-$elyVqFure(IxSkG^wYkMkkFE#5!I3ml`eWk# zMi+Q*N@S}MJS)O*hz@0!^~$J^maX&3sQum=zg&Olx$8=f6T^9|;>lw-Pyptoe3qVH zLjrMH=*muT9%sD}nwVD33wZNhIfF&EX1Qvrf==k;G@m@TKJROOgC>eGR|n@M9O%%I z30JJ6Y*n{fP$v+bz#a4TXWf&F~T(36bIzqK;8BPtn! z5hYSJ$j2wEp&qwU;98{}mYnP*()QNumDyU<65849xn_=lK@-CSj6c8;S9F|0u+~|) zhrFBO!E^h&78r9fwcaN@OhUFE`wyDQs!sFEEt*Uf3zEX83EdC1SBD&X_N>&F{dS9f z76;K*^xq$9c^X9Ytb^W8PA}hL99^>=vh9y6(hGaNjq{$5ufnpp5VWt}p0r)6zP6Gj z{{KX|eWrg$9mCSen!(Ty^M`rnbpH$e<%iiF zi!(B(njgp2Bj|_x!7_S-CLI>cqVJyCc{v8R2ejjRmL^xdV|2uL|1`@jm`s=@2*T(h z3RmurjCz(tJrdskm}AE8!+uueOWdvL=_Q%093iz0ZY(D+{;?gmiD}PWF{nr7d>jVR z=i_@UdM8{kATQGmoU@-;b0>8lLyKK2PHxk7lpmgQ; z*=ud%9twd|t%w!TP0jE(cj>!b2Ij2nRQ8kecS)gDOFd@I#QrRz^9)Cu;NZ$A)0*Jc z@on~yt%tLz91|)0fd7t%zxtzAhV(r*X*=48m4pK09&4={4H$URS@hh(0%8n5-ww@_ zX@3^Xx;pTg1u-KWP;b1Lf_&y#yyT$ zB(-LHP8XW1s>MHDCL_7!^y~}YL|Gwj%(Zuq`s*;09^!8h8q%9vQLNJ*OkL_0E!U~L^2=Zgbd}+G79+`s(Qph=9J~99^^)tLU z%Y3AkR@Y9QnB^?ZEe@`F<7H#Pt4+u9XGtF?__5Z|5-v2`pD;&TFRVD%$QM4p2X;-2 z3d7)^Fx8UOy8BefT5tGbOJk#hJd{t|$Wd@`zWy6KT?O}$Z-b?aG^8bF>Yk)3oEPLHwR2+j%h`&K1UdiW2_6beF_S@-*XUZxm_=aZUBoBG!})m4jB2`ScPro5}U z?D_hI+tF2rD>2}a7Q2n{F?*rigJ!is4(r2N&%op&%vRG_(N#mn==CwQeLU)e;poex zmY=l`?r*n*Cp{iLn#X{&QBI@N-`g2h%2{nmy z2MshLwz^ee*OwL()HTm=jI6hP-4)tHD>XWe#49YC^$=tyt6@6`Y;sSnK=4!dwwIEx z`2#KSocVJthCCqD z@_wb}u-W)Bsh=x9m%FjIH2?5I&%4)oth{d$;X2hk^GCq);>8Rkh00~nmXu3seCJrb z*~WgSVK;A;O;OnJBDbojsisu99ecv8s$7NlIJwe3?+$lo5XCm$2c0FDU|PO%mrKqS zsci|R(@0}Ox7fU|PbtrbIh0Aa-Mob{;}MbTqm^!IJ(b!V9kqpJad;AU zeU(y#5;u6e=>!MDqNOV4hKC!c(`~ntg8*hVtwM+@lg#>Uxsbo@FUZZrzUxbkFrE1}YZ;)=`sld>7?2b))M6GVpm2^yZP3c?zRPnP#gzDMa zM;*;U86RA%J$3VyC}^t8Ba-p0n;$}+l8IiAdmSjkXjhB`eHXcwqM<~LoOX4UvkD0> zyqM$Zn$QX$BVV1PmZCU32UR;3pe;)#TZ)F4he4OJWxVB@kTnz1U;OF|=q^vxC3`u{ zAWU7LL{GFK*=Nt0)StexBfwUl3UVdWj^u#K@l?;Fu{kghmVB^+RaRg@0zu1zCe{Pv@C|9XW~6jB#1Xs5;b<~*LAYp>IwRP+@#DPN zmu@P7u5v#LfrfH&8-Hmn>5$Vdzpq)W-g1h3v#$LSD;maRkDeT2_!(DZ^RH;9EhU6A zl{^@#MW^p%I=J3vmY>eI3b2z6xgo#N!L@9phP<|M3z3FE`adyPUNyH}tTUz6&30h? z8hGWp3)%FJlu>RP#Jk43snbX3`&OiH-Y8#LF$PNafS&hXa;^H(W{{iLJ5fXH^9b&W z)f$~&f>)sOyP9D!4o`#X%S36+d=5QjqF1wnMvgzG8B2_q9&s*yDs;NJubA}71cJxJ zrL=vZ8>$m_oN}9i-z%bnZ)8s^0Fs@;2 zqy(ZLNK34DH!SisL*=MY)zirqDJ2oCj5qq?G44|wNinQRx*t z=EY<5rYVlQG{-w3D}I^5nP{;`$q&`R^|9bSrL8LB26 z`B=PI={9=<7IbZ1%I%|`tna`Zt3!HIiQ#Pf?268Wio40D1|0X3Tg$ObeqsOT!Vh!j zR!7~zTeuT(P=SI76hK}5Nho?cd68HD0UQ{KrYwR$>>dUR-=Oo9mB0ppQb})d*i%Vb zNErDrO~mlLeFzjJl$QA?9$al7bg03){p7p=eIJfoI|2>MacJJ zT^yNi_8$zY8T#H#@BQRMF+;C|6v-r-93HUl^rO?3OEC^8qYV*#!7LBijo&tc6gU=2ZPCMBv9DiW4vSyEHmOHO? z#F0zsZfHW4mk&8U%I@ORC$htitCFscveK&kwAMiA+GBTKjTB13C>+Q-N~R!ILJj$9 zQ!S@hnm&smcP`~pTs3wiqFpesf=J}VoUKM3h)3kyEzgD@el6AYY?>Lkx-5M7*_^>e zh})OxClkK$w$d9e91DlfxoO+J*0wf_$JcK2qgwAQ=Se+u#~m|2yyH?u&MJ_^wiq?e z?>t_f?NPMqPb;@jx;NWAoh=U8hX#NforZJTzRf0O>=roedywj|RIZn&xjoic3lMPv zJ9oNxCcM)?6KHt;X13UrEwrrj)1zVW`=YV}O@v!?ak-e}8v7kF+n9j``=U6K?GPUF zI~^%hqT_qH{qZ4l1$P@6N2qw5Gh&~$7i&;$H$34TxZfI`zIU0+EmL#~$y|JKU#_fw zK;~S?LG4>$c{{*l;_$Yq>h4DOgA*F6K|;NvB%y=1m>zB)IN2(CeVp;xBZ>obHtO-- zN2ST&*-2`;RPy!frH+km8P$?A3!64RD|=Rf(XGhu&8p4j8eYZb+lEdS-|NflF$-oWS>xK?t zP(h@lpNZIw2U-OmI6G|L5POpLD2A-8pf{j%!u+TqkIg@La#wXu=Tj4>OnjEbo9e7x zJ@P0)|3elhZ~ZqS;xnwS0km?poBo$Qebx^Vt2okgZO`|=8)i%82|)HP$$E86{**G= zP5uLFlxo%sF2kf0dZ%&n9qk*3YMy>Z?~6_FUDib2|*is);ZJ8C5tuH`_Gx<_aD=kd8#Q?xc)DaCZ_{YT#c9!{(Do2pS8(IuL0X5l7hyp$CB8H( zi<8^L*m+K9hnpTLiT1VjN&3~YReUG!f@ycNZj)howk+60!!z&-qU2gT{QMP+@L)%6 zh$zb$k6$hVhx5Vmi=-~pNsbz@5Y9<`hA!bDtUhW za&(bmd+(|j`Wl=76@$1Ucy=Q2e+W}8AFIeU;<@ zudrH&+qJeN%^U; zK+)#TaL6i^Vd2Ed>+T4=sSy(fmV!SBBj`#6<1OhQ zz1PKiRpH6`h-mZsCAz~;he(rUhI57M8HU2yUso;Qh;UQ9K7RUaNdOG2C z)zS@XphZVAZhys4mLL5-28(f`CewSpHAyEi=&MIwl>xHe!zT!(mb;1CuJKCiD@vjqjq6pu_e{W_hW(L$oH=lWM{kgVsUk^)cuuZm7GVPa064zrp{{ zscbl3cvw7yJY(C)Kp;Jo0an6|1yj%@gp&{h)Cgh4_t>bz8dK903l-St#r);2ZCMul z<;%s`rsAT`>tEA6;-ustP>mpL4F_f6VIlO~o0x9%V7XXgF#Rq}gly6oF$xgP*G5@z z2W9!jp6DP@0#bz{QUNcbCqL~k-|k+q^;2@#Aa{YwU2*AEm2M%{Z4rOUNf zf)=HMD`14?9SH~|!46w{^0$$gOAQbqjuvuxZ>jCcm_P{1e1v0T1A4a*+#DNlLj}HM z03Cb{8z@CFqj3PiznE>fzEpYW4P(h=L`u!3{6-7dV)GfGEfdU!9e^07B7zs8bkf1ai4hG0j%on$y zN!KkCX3<3g$EEyxSKN;M&!!XnE#y|YVK0)+1Gl9F$WcqcFJ>O1hzkN4BfsnhznQm^ z%YQSm;oVdKIjpCb2)>F35Wv7A6iA=_uhs%Jgp*PMfoPxJ{Zkl4R|Vj3fEqykPk?Jv yBXxdUK(3Mmyp$RcM8n#HPg4U*KpY%Q14sZ5;JP$`I8Y6br2+0>^ { } private void loadRegion(String name) { - TextureAtlas atlas = plugin.getAPI().getProjectTextureAtlas(); - validateNinePatchTextureRegion(atlas.findRegion(name)); - viewComponent.setTexture(atlas.findRegion(name)); + TextureAtlas.AtlasRegion region = plugin.getAPI().getProjectTextureRegion(name); + validateNinePatchTextureRegion(region); + viewComponent.setTexture(region); viewComponent.setListeners(plugin.getAPI().getUIStage()); } diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java index 2eb06a0a..bf5d7aa6 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/manager/ResourcesManager.java @@ -14,7 +14,7 @@ import com.google.common.io.ByteStreams; import games.rednblack.editor.plugin.tiled.TiledPlugin; import games.rednblack.editor.plugin.tiled.view.SpineDrawable; import games.rednblack.editor.renderer.factory.EntityFactory; -import games.rednblack.h2d.extention.spine.PrefixAtlasAttachmentLoader; +import games.rednblack.h2d.extention.spine.ResourceRetrieverAttachmentLoader; import java.io.File; import java.io.FileOutputStream; @@ -96,7 +96,7 @@ public class ResourcesManager { public SpineDrawable getSpineDrawable(String name) { if (spineDrawableCache.get(name) == null) { - PrefixAtlasAttachmentLoader atlasAttachmentLoader = new PrefixAtlasAttachmentLoader(name, tiledPlugin.getAPI().getSceneLoader().getRm().getMainPack()); + ResourceRetrieverAttachmentLoader atlasAttachmentLoader = new ResourceRetrieverAttachmentLoader(name, tiledPlugin.getAPI().getSceneLoader().getRm()); SkeletonJson skeletonJson = new SkeletonJson(atlasAttachmentLoader); SkeletonData skeletonData = skeletonJson.readSkeletonData(tiledPlugin.getAPI().getSceneLoader().getRm().getSkeletonJSON(name)); Skeleton skeleton = new Skeleton(skeletonData); diff --git a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/drawStrategy/SpineDrawStrategy.java b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/drawStrategy/SpineDrawStrategy.java index 927a615e..22f51459 100644 --- a/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/drawStrategy/SpineDrawStrategy.java +++ b/plugin-tiled/src/main/java/games/rednblack/editor/plugin/tiled/tools/drawStrategy/SpineDrawStrategy.java @@ -9,7 +9,7 @@ import games.rednblack.editor.renderer.components.SpineDataComponent; import games.rednblack.editor.renderer.utils.ComponentRetriever; import games.rednblack.h2d.common.command.ReplaceSpineCommandBuilder; import games.rednblack.h2d.common.factory.IFactory; -import games.rednblack.h2d.extention.spine.PrefixAtlasAttachmentLoader; +import games.rednblack.h2d.extention.spine.ResourceRetrieverAttachmentLoader; public class SpineDrawStrategy extends BasicDrawStrategy { @@ -45,7 +45,7 @@ public class SpineDrawStrategy extends BasicDrawStrategy { replaceSpineCommandBuilder.begin(entity); String animName = tiledPlugin.getSelectedTileName(); replaceSpineCommandBuilder.setAnimationName(animName); - PrefixAtlasAttachmentLoader atlasAttachmentLoader = new PrefixAtlasAttachmentLoader(animName, tiledPlugin.getAPI().getSceneLoader().getRm().getMainPack()); + ResourceRetrieverAttachmentLoader atlasAttachmentLoader = new ResourceRetrieverAttachmentLoader(animName, tiledPlugin.getAPI().getSceneLoader().getRm()); SkeletonJson skeletonJson = new SkeletonJson(atlasAttachmentLoader); replaceSpineCommandBuilder.setSkeletonJson(skeletonJson); SkeletonData skeletonData = skeletonJson.readSkeletonData((tiledPlugin.getAPI().getSceneLoader().getRm().getSkeletonJSON(animName))); diff --git a/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java b/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java index 6326a396..a458325e 100644 --- a/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java +++ b/src/main/java/games/rednblack/editor/controller/BootstrapViewCommand.java @@ -87,6 +87,8 @@ public class BootstrapViewCommand extends SimpleCommand { facade.registerMediator(new CreatePlaceholderDialogMediator()); facade.registerMediator(new CreateNoiseDialogMediator()); facade.registerMediator(new ConsoleDialogMediator()); + facade.registerMediator(new ImagesPackDialogMediator()); + facade.registerMediator(new AnimationsPackDialogMediator()); facade.registerMediator(new SaveProjectDialogMediator()); } diff --git a/src/main/java/games/rednblack/editor/data/SpineAnimData.java b/src/main/java/games/rednblack/editor/data/SpineAnimData.java index d7299f18..f3f2f965 100644 --- a/src/main/java/games/rednblack/editor/data/SpineAnimData.java +++ b/src/main/java/games/rednblack/editor/data/SpineAnimData.java @@ -25,7 +25,6 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas; * Created by azakhary on 7/3/2014. */ public class SpineAnimData { - public TextureAtlas atlas; public FileHandle jsonFile; public String animName; } diff --git a/src/main/java/games/rednblack/editor/proxy/PluginManager.java b/src/main/java/games/rednblack/editor/proxy/PluginManager.java index 521c9563..4210a176 100644 --- a/src/main/java/games/rednblack/editor/proxy/PluginManager.java +++ b/src/main/java/games/rednblack/editor/proxy/PluginManager.java @@ -109,9 +109,9 @@ public class PluginManager extends Proxy implements PluginAPI { } @Override - public TextureAtlas getProjectTextureAtlas() { + public TextureAtlas.AtlasRegion getProjectTextureRegion(String regionName) { ResourceManager resourceManager = facade.retrieveProxy(ResourceManager.NAME); - return resourceManager.getTextureAtlas(); + return (TextureAtlas.AtlasRegion) resourceManager.getTextureRegion(regionName); } @Override diff --git a/src/main/java/games/rednblack/editor/proxy/ProjectManager.java b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java index 461da150..f2e80aff 100755 --- a/src/main/java/games/rednblack/editor/proxy/ProjectManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ProjectManager.java @@ -299,12 +299,6 @@ public class ProjectManager extends Proxy { } } - public void reLoadProjectAssets() { - ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); - ResourceManager resourceManager = facade.retrieveProxy(ResourceManager.NAME); - resourceManager.loadCurrentProjectAssets(currentProjectPath + "/assets/" + resolutionManager.currentResolutionName + "/pack/pack.atlas"); - } - public void loadProjectData(String projectPath) { // All legit loading assets ResolutionManager resolutionManager = facade.retrieveProxy(ResolutionManager.NAME); @@ -405,12 +399,7 @@ public class ProjectManager extends Proxy { newFile.mkdir(); } - // The filename should not be changed because the particle effects contain the name in their - // configuration. Unfortunately though, the texture packer does not support the underscore because - // any underscore in the texture packer is considered an image index. More info here: - // https://github.com/libgdx/libgdx/wiki/Texture-packer#image-indexes - // So, long story short, we MUST remove the underscore. - ImageIO.write(bufferedImage, "png", new File(targetPath + "/" + handle.name().replace("_", ""))); + ImageIO.write(bufferedImage, "png", new File(targetPath + "/" + handle.name())); } catch (IOException e) { e.printStackTrace(); } @@ -450,7 +439,6 @@ public class ProjectManager extends Proxy { if (!currentProjectVO.projectMainExportPath.isEmpty()) { exportFonts(currentProjectVO.projectMainExportPath); } - exportStyles(defaultBuildPath); SceneDataManager sceneDataManager = facade.retrieveProxy(SceneDataManager.NAME); sceneDataManager.buildScenes(defaultBuildPath); if (!currentProjectVO.projectMainExportPath.isEmpty()) { @@ -458,18 +446,6 @@ public class ProjectManager extends Proxy { } } - private void exportStyles(String targetPath) { - String srcPath = currentProjectPath + "/assets/orig"; - FileHandle origDirectoryHandle = Gdx.files.absolute(srcPath); - FileHandle stylesDirectory = origDirectoryHandle.child("styles"); - File fileTarget = new File(targetPath + "/" + stylesDirectory.name()); - try { - FileUtils.copyDirectory(stylesDirectory.file(), fileTarget); - } catch (IOException e) { - e.printStackTrace(); - } - } - private void exportShaders(String targetPath) { String srcPath = currentProjectPath + "/assets"; FileHandle origDirectoryHandle = Gdx.files.absolute(srcPath); @@ -477,8 +453,7 @@ public class ProjectManager extends Proxy { File fileTarget = new File(targetPath + "/" + shadersDirectory.name()); try { FileUtils.copyDirectory(shadersDirectory.file(), fileTarget); - } catch (IOException e) { - e.printStackTrace(); + } catch (IOException ignore) { } } @@ -489,8 +464,7 @@ public class ProjectManager extends Proxy { File fileTarget = new File(targetPath + "/" + particlesDirectory.name()); try { FileUtils.copyDirectory(particlesDirectory.file(), fileTarget); - } catch (IOException e) { - e.printStackTrace(); + } catch (IOException ignore) { } } @@ -501,8 +475,7 @@ public class ProjectManager extends Proxy { File fileTarget = new File(targetPath + "/" + particlesDirectory.name()); try { FileUtils.copyDirectory(particlesDirectory.file(), fileTarget); - } catch (IOException e) { - e.printStackTrace(); + } catch (IOException ignore) { } } @@ -513,8 +486,7 @@ public class ProjectManager extends Proxy { File fileTarget = new File(targetPath + "/" + fontsDirectory.name()); try { FileUtils.copyDirectory(fontsDirectory.file(), fileTarget); - } catch (IOException e) { - e.printStackTrace(); + } catch (IOException ignore) { } } diff --git a/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java b/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java index cd2fd2f1..f943f282 100644 --- a/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ResolutionManager.java @@ -29,7 +29,9 @@ import java.util.concurrent.Executors; import javax.imageio.ImageIO; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.ObjectMap; import com.kotcrab.vis.ui.util.dialog.Dialogs; +import games.rednblack.editor.renderer.data.TexturePackVO; import games.rednblack.h2d.common.MsgAPI; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; @@ -178,8 +180,6 @@ public class ResolutionManager extends Proxy { ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); TexturePacker.Settings settings = projectManager.getTexturePackerSettings(); - TexturePacker tp = new TexturePacker(settings); - String sourcePath = projectManager.getCurrentProjectPath() + "/assets/" + resEntry.name + "/images"; String outputPath = projectManager.getCurrentProjectPath() + "/assets/" + resEntry.name + "/pack"; @@ -193,15 +193,36 @@ public class ResolutionManager extends Proxy { e.printStackTrace(); } + ObjectMap packerMap = new ObjectMap<>(); + ObjectMap regionsReverse = new ObjectMap<>(); + for (TexturePackVO packVO : projectManager.currentProjectInfoVO.imagesPacks.values()) { + String name = packVO.name.equals("main") ? "pack" : packVO.name; + packerMap.put(name, new TexturePacker(settings)); + for (String region : packVO.regions) + regionsReverse.put(region, name); + } + for (TexturePackVO packVO : projectManager.currentProjectInfoVO.animationsPacks.values()) { + String name = packVO.name.equals("main") ? "pack" : packVO.name; + if (packerMap.get(name) == null) + packerMap.put(name, new TexturePacker(settings)); + for (String region : packVO.regions) + regionsReverse.put(region, name); + } + + for (FileHandle entry : sourceDir.list()) { - String filename = entry.file().getName(); - String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); - if (extension.equals("png")) { + if (entry.extension().equals("png")) { + String name = regionsReverse.get(entry.nameWithoutExtension().replace(".9", "").replaceAll("_.*", "")); + name = name == null ? "pack" : name; + TexturePacker tp = packerMap.get(name); tp.addImage(entry.file()); } } - tp.pack(outputDir, "pack"); + for (String name : packerMap.keys()) { + TexturePacker tp = packerMap.get(name); + tp.pack(outputDir, name); + } } private int resizeTextures(String path, ResolutionEntryVO resolution) { diff --git a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java index 777b27e2..491382f1 100644 --- a/src/main/java/games/rednblack/editor/proxy/ResourceManager.java +++ b/src/main/java/games/rednblack/editor/proxy/ResourceManager.java @@ -30,6 +30,7 @@ import games.rednblack.editor.renderer.data.*; import games.rednblack.editor.renderer.utils.H2DSkinLoader; import games.rednblack.editor.renderer.utils.ShadedDistanceFieldFont; import games.rednblack.editor.view.ui.widget.actors.basic.WhitePixel; +import games.rednblack.h2d.extension.talos.ResourceRetrieverAssetProvider; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; @@ -58,7 +59,7 @@ public class ResourceManager extends Proxy implements IResourceRetriever { private final HashMap particleEffects = new HashMap<>(1); private final HashMap talosVFXs = new HashMap<>(1); private final HashMap talosVFXsFiles = new HashMap<>(1); - private TextureAtlas currentProjectAtlas; + private HashMap currentProjectAtlas = new HashMap<>(1); private final HashMap spineAnimAtlases = new HashMap<>(); private final HashMap> spriteAnimAtlases = new HashMap<>(); @@ -145,17 +146,17 @@ public class ResourceManager extends Proxy implements IResourceRetriever { @Override public TextureRegion getTextureRegion(String name) { - TextureRegion reg = currentProjectAtlas.findRegion(name); - - if(reg == null) { - reg = defaultRegion; + for (TextureAtlas atlas : currentProjectAtlas.values()) { + TextureRegion region = atlas.findRegion(name); + if (region != null) + return region; } - - return reg; + return defaultRegion; } - public TextureAtlas getTextureAtlas() { - return currentProjectAtlas; + @Override + public TextureAtlas getTextureAtlas(String atlasName) { + return currentProjectAtlas.get(atlasName); } @Override @@ -201,7 +202,11 @@ public class ResourceManager extends Proxy implements IResourceRetriever { @Override public boolean hasTextureRegion(String regionName) { - return currentProjectAtlas.findRegion(regionName) != null; + for (TextureAtlas atlas : currentProjectAtlas.values()) { + if (atlas.findRegion(regionName) != null) + return true; + } + return false; } @Override @@ -223,7 +228,7 @@ public class ResourceManager extends Proxy implements IResourceRetriever { public void loadCurrentProjectData(String projectPath, String curResolution) { packResolutionName = curResolution; - loadCurrentProjectAssets(projectPath + "/assets/" + curResolution + "/pack/pack.atlas"); + loadCurrentProjectAssets(projectPath + "/assets/" + curResolution + "/pack"); loadCurrentProjectParticles(projectPath + "/assets/orig/particles"); loadCurrentProjectTalosVFXs(projectPath + "/assets/orig/talos-vfx"); loadCurrentProjectSpineAnimations(projectPath + "/assets/", curResolution); @@ -241,7 +246,13 @@ public class ResourceManager extends Proxy implements IResourceRetriever { if (file.isDirectory() || filename.endsWith(".DS_Store")) continue; ParticleEffect particleEffect = new ParticleEffect(); - particleEffect.load(Gdx.files.internal(file.getAbsolutePath()), currentProjectAtlas, ""); + particleEffect.loadEmitters(Gdx.files.internal(file.getAbsolutePath())); + for (TextureAtlas atlas : currentProjectAtlas.values()) { + try { + particleEffect.loadEmitterImages(atlas, ""); + break; + } catch (Exception ignore) { } + } particleEffects.put(filename, particleEffect); } } @@ -255,7 +266,7 @@ public class ResourceManager extends Proxy implements IResourceRetriever { String filename = file.getName(); if (file.isDirectory() || filename.endsWith(".DS_Store") || filename.endsWith("shdr") || filename.endsWith(".fga")) continue; - AtlasAssetProvider assetProvider = new AtlasAssetProvider(currentProjectAtlas); + ResourceRetrieverAssetProvider assetProvider = new ResourceRetrieverAssetProvider(this); assetProvider.setAssetHandler(ShaderDescriptor.class, this::findShaderDescriptorOnLoad); assetProvider.setAssetHandler(VectorField.class, this::findVectorFieldDescriptorOnLoad); ParticleEffectDescriptor effectDescriptor = new ParticleEffectDescriptor(); @@ -305,7 +316,6 @@ public class ResourceManager extends Proxy implements IResourceRetriever { String animName = FilenameUtils.removeExtension(entry.file().getName()); FileHandle animJsonFile = Gdx.files.internal(entry.file().getAbsolutePath() + File.separator + animName + ".json"); SpineAnimData data = new SpineAnimData(); - data.atlas = currentProjectAtlas; data.jsonFile = animJsonFile; data.animName = animName; spineAnimAtlases.put(animName, data); @@ -320,16 +330,25 @@ public class ResourceManager extends Proxy implements IResourceRetriever { for (FileHandle entry : sourceDir.list()) { if (entry.file().isDirectory()) { String animName = FilenameUtils.removeExtension(entry.file().getName()); - spriteAnimAtlases.put(animName, currentProjectAtlas.findRegions(animName)); + Array regions = null; + for (TextureAtlas atlas : currentProjectAtlas.values()) { + regions = atlas.findRegions(animName); + if (regions.size > 0) + break; + } + if (regions != null) + spriteAnimAtlases.put(animName, regions); } } } - public void loadCurrentProjectAssets(String packPath) { - try { - currentProjectAtlas = new TextureAtlas(Gdx.files.getFileHandle(packPath, Files.FileType.Internal)); - } catch (Exception e) { - currentProjectAtlas = new TextureAtlas(); + public void loadCurrentProjectAssets(String packFolderPath) { + FileHandle folder = new FileHandle(packFolderPath); + for (FileHandle file : folder.list()) { + if (file.extension().equals("atlas")) { + String name = file.nameWithoutExtension().equals("pack") ? "main" : file.nameWithoutExtension(); + currentProjectAtlas.put(name, new TextureAtlas(file)); + } } } @@ -485,8 +504,8 @@ public class ResourceManager extends Proxy implements IResourceRetriever { return spriteAnimAtlases; } - public TextureAtlas getProjectAssetsList() { - return currentProjectAtlas; + public TextureAtlas getProjectAssetsList(String atlas) { + return currentProjectAtlas.get(atlas); } public HashMap getProjectParticleList() { @@ -513,9 +532,4 @@ public class ResourceManager extends Proxy implements IResourceRetriever { public HashMap getShaders() { return shaderPrograms; } - - @Override - public TextureAtlas getMainPack() { - return currentProjectAtlas; - } } diff --git a/src/main/java/games/rednblack/editor/view/menu/ResourcesMenu.java b/src/main/java/games/rednblack/editor/view/menu/ResourcesMenu.java index 9da2006e..8ff7a6a7 100644 --- a/src/main/java/games/rednblack/editor/view/menu/ResourcesMenu.java +++ b/src/main/java/games/rednblack/editor/view/menu/ResourcesMenu.java @@ -14,6 +14,8 @@ public class ResourcesMenu extends H2DMenu { public static final String IMPORT_TO_LIBRARY = HyperLap2DMenuBar.prefix + ".IMPORT_TO_LIBRARY"; public static final String CREATE_PLACEHOLDER = HyperLap2DMenuBar.prefix + ".CREATE_PLACEHOLDER"; public static final String CREATE_NOISE = HyperLap2DMenuBar.prefix + ".CREATE_NOISE"; + public static final String OPEN_IMAGES_PACK = HyperLap2DMenuBar.prefix + ".OPEN_IMAGES_PACK"; + public static final String OPEN_ANIMATIONS_PACK = HyperLap2DMenuBar.prefix + ".OPEN_ANIMATIONS_PACK"; public ResourcesMenu() { super("Resources"); @@ -21,10 +23,14 @@ public class ResourcesMenu extends H2DMenu { MenuItem placeholders = new MenuItem("Create Placeholder...", new MenuItemListener(CREATE_PLACEHOLDER, null, RESOURCE_MENU)); MenuItem noise = new MenuItem("Create Perlin Noise...", new MenuItemListener(CREATE_NOISE, null, RESOURCE_MENU)); MenuItem repack = new MenuItem("Repack Assets", new MenuItemListener(MsgAPI.ACTION_REPACK, null, RESOURCE_MENU)); + MenuItem imagesPack = new MenuItem("Images Atlases...", new MenuItemListener(OPEN_IMAGES_PACK, null, RESOURCE_MENU)); + MenuItem animationsPack = new MenuItem("Animations Atlases...", new MenuItemListener(OPEN_ANIMATIONS_PACK, null, RESOURCE_MENU)); addItem(importToLibrary); addSeparator(); addItem(repack); + addItem(imagesPack); + addItem(animationsPack); addSeparator(); addItem(placeholders); addItem(noise); diff --git a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTabMediator.java b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTabMediator.java index 76cd40eb..f35361b1 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTabMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/resourcespanel/UIImagesTabMediator.java @@ -71,7 +71,7 @@ public class UIImagesTabMediator extends UIResourcesTabMediator { ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); ProjectInfoVO projectInfoVO = projectManager.getCurrentProjectInfoVO(); - TextureAtlas atlas = resourceManager.getProjectAssetsList(); + TextureAtlas atlas = resourceManager.getProjectAssetsList("main"); Array thumbnailBoxes = new Array<>(); Array atlasRegions = atlas.getRegions(); 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 new file mode 100644 index 00000000..d4afc349 --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/ui/dialog/AnimationsPackDialogMediator.java @@ -0,0 +1,80 @@ +package games.rednblack.editor.view.ui.dialog; + +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.renderer.data.TexturePackVO; +import games.rednblack.editor.view.menu.ResourcesMenu; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.stage.UIStage; +import org.puremvc.java.interfaces.INotification; +import org.puremvc.java.patterns.mediator.Mediator; + +public class AnimationsPackDialogMediator extends Mediator { + private static final String TAG = AnimationsPackDialogMediator.class.getCanonicalName(); + private static final String NAME = TAG; + + private static final String NEW_IMAGES_PACK = "games.rednblack.editor.view.ui.dialog.AnimationsPackDialogMediator.NEW_IMAGES_PACK"; + private static final String MOVE_REGION_TO_PACK = "games.rednblack.editor.view.ui.dialog.AnimationsPackDialogMediator.MOVE_REGION_TO_PACK"; + private static final String UPDATE_CURRENT_LIST = "games.rednblack.editor.view.ui.dialog.AnimationsPackDialogMediator.UPDATE_CURRENT_LIST"; + + public AnimationsPackDialogMediator() { + super(NAME, new AtlasesPackDialog("Animations Atlases", NEW_IMAGES_PACK, MOVE_REGION_TO_PACK, UPDATE_CURRENT_LIST)); + } + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + } + + @Override + public String[] listNotificationInterests() { + return new String[]{ + ResourcesMenu.OPEN_ANIMATIONS_PACK, + ProjectManager.PROJECT_OPENED, + NEW_IMAGES_PACK, + MOVE_REGION_TO_PACK, + UPDATE_CURRENT_LIST + }; + } + + @Override + public void handleNotification(INotification notification) { + Sandbox sandbox = Sandbox.getInstance(); + UIStage uiStage = sandbox.getUIStage(); + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + + switch (notification.getName()) { + case ResourcesMenu.OPEN_ANIMATIONS_PACK: + viewComponent.show(uiStage); + break; + case ProjectManager.PROJECT_OPENED: + viewComponent.initPacks(projectManager.currentProjectInfoVO.animationsPacks.keySet()); + viewComponent.updateMainPack(projectManager.currentProjectInfoVO.animationsPacks.get("main").regions); + break; + case NEW_IMAGES_PACK: + TexturePackVO newVo = new TexturePackVO(); + newVo.name = notification.getBody(); + + projectManager.currentProjectInfoVO.animationsPacks.put(newVo.name, newVo); + + viewComponent.addNewPack(newVo.name); + break; + case UPDATE_CURRENT_LIST: + String currentTab = viewComponent.getSelectedTab(); + viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.animationsPacks.get(currentTab).regions); + break; + case MOVE_REGION_TO_PACK: + String toPack = viewComponent.getMainSelected() != null ? viewComponent.getSelectedTab() : "main"; + String fromPack = viewComponent.getMainSelected() == null ? viewComponent.getSelectedTab() : "main"; + String region = viewComponent.getMainSelected() != null ? viewComponent.getMainSelected() : viewComponent.getCurrentSelected(); + + projectManager.currentProjectInfoVO.animationsPacks.get(fromPack).regions.remove(region); + projectManager.currentProjectInfoVO.animationsPacks.get(toPack).regions.add(region); + + viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.animationsPacks.get(viewComponent.getSelectedTab()).regions); + viewComponent.updateMainPack(projectManager.currentProjectInfoVO.animationsPacks.get("main").regions); + break; + } + } +} 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 new file mode 100644 index 00000000..cdcc0425 --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/ui/dialog/AtlasesPackDialog.java @@ -0,0 +1,248 @@ +package games.rednblack.editor.view.ui.dialog; + +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.Array; +import com.kotcrab.vis.ui.util.adapter.AbstractListAdapter; +import com.kotcrab.vis.ui.util.adapter.SimpleListAdapter; +import com.kotcrab.vis.ui.widget.*; +import com.kotcrab.vis.ui.widget.tabbedpane.Tab; +import com.kotcrab.vis.ui.widget.tabbedpane.TabbedPane; +import com.kotcrab.vis.ui.widget.tabbedpane.TabbedPaneAdapter; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.h2d.common.H2DDialog; +import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; +import games.rednblack.h2d.common.view.ui.listener.ScrollFocusListener; + +import java.util.Set; + +public class AtlasesPackDialog extends H2DDialog { + + private final TabbedPane tabbedPane; + private final String addNewNotification; + private final String moveRegionNotification, updateCurrentNotification; + private final SimpleListAdapter mainPackAdapter, currentPackAdapter; + private final VisTextButton insertButton, removeButton; + private final VisLabel currentSelectedPackLabel; + + private final HyperLap2DFacade facade = HyperLap2DFacade.getInstance(); + + private final Array mainList = new Array<>(); + private final Array currentList = new Array<>(); + + private String mainSelected = null, currentSelected = null; + + public AtlasesPackDialog(String title, String add, String move, String updateList) { + super(title); + addNewNotification = add; + moveRegionNotification = move; + updateCurrentNotification = updateList; + + addCloseButton(); + getContentTable().top().left(); + + tabbedPane = new TabbedPane(); + tabbedPane.addListener(new TabbedPaneAdapter() { + @Override + public void switchedTab(Tab tab) { + facade.sendNotification(updateCurrentNotification); + updateOpButtons(); + currentSelectedPackLabel.setText(tab.getTabTitle()); + } + }); + + VisTable addNewPackTable = new VisTable(); + VisTextField newPackName = StandardWidgetsFactory.createTextField(); + newPackName.setMessageText("Add new atlas pack"); + VisTextButton newPackButton = StandardWidgetsFactory.createTextButton("Add"); + newPackButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + if (!newPackName.getText().equals("")) + facade.sendNotification(addNewNotification, newPackName.getText()); + newPackName.setText(""); + } + }); + addNewPackTable.add(newPackName).growX(); + addNewPackTable.add(newPackButton).width(80); + + mainPackAdapter = new SimpleListAdapter<>(mainList); + mainPackAdapter.setSelectionMode(AbstractListAdapter.SelectionMode.SINGLE); + mainPackAdapter.getSelectionManager().setProgrammaticChangeEvents(false); + + currentPackAdapter = new SimpleListAdapter<>(currentList); + currentPackAdapter.setSelectionMode(AbstractListAdapter.SelectionMode.SINGLE); + currentPackAdapter.getSelectionManager().setProgrammaticChangeEvents(false); + + ListView mainPackList = new ListView<>(mainPackAdapter); + mainPackList.getScrollPane().addListener(new ScrollFocusListener()); + ListView currentPackList = new ListView<>(currentPackAdapter); + currentPackList.getScrollPane().addListener(new ScrollFocusListener()); + + mainPackList.setItemClickListener(this::selectMainItem); + currentPackList.setItemClickListener(this::selectCurrentItem); + + getContentTable().add(addNewPackTable).growX().row(); + getContentTable().add(tabbedPane.getTable()).height(30).growX().row(); + + insertButton = StandardWidgetsFactory.createTextButton("->"); + insertButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + if (!insertButton.isDisabled()) + facade.sendNotification(moveRegionNotification); + } + }); + removeButton = StandardWidgetsFactory.createTextButton("<-"); + removeButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + if (!removeButton.isDisabled()) + facade.sendNotification(moveRegionNotification); + } + }); + updateOpButtons(); + VisTable opButtonsContainer = new VisTable(); + VisTable opButtons = new VisTable(); + opButtons.add(insertButton).width(80).row(); + opButtons.add(removeButton).width(80).row(); + opButtonsContainer.addSeparator(true); + opButtonsContainer.add(opButtons); + opButtonsContainer.addSeparator(true); + + VisTable opTable = new VisTable(); + opTable.add(new VisLabel("Main Pack", Align.center)).uniformX().growX(); + opTable.add().width(80); + currentSelectedPackLabel = new VisLabel("Select Pack", Align.center); + opTable.add(currentSelectedPackLabel).uniformX().growX().row(); + opTable.addSeparator().colspan(3); + opTable.add(mainPackList.getMainTable()).uniformX().grow(); + opTable.add(opButtonsContainer).growY(); + opTable.add(currentPackList.getMainTable()).uniformX().grow().row(); + + getContentTable().add(opTable).grow().row(); + } + + private void selectCurrentItem(String item) { + mainPackAdapter.getSelectionManager().deselectAll(); + mainSelected = null; + currentSelected = item; + + updateOpButtons(); + } + + private void selectMainItem(String item) { + currentPackAdapter.getSelectionManager().deselectAll(); + currentSelected = null; + mainSelected = item; + + updateOpButtons(); + } + + public void initPacks(Set packs) { + tabbedPane.removeAll(); + + for (String name : packs) { + if (name.equals("main")) continue; + tabbedPane.add(new PackTab(name)); + } + + if (tabbedPane.getTabs().size > 0) tabbedPane.switchTab(0); + } + + public void updateCurrentPack(Set regions) { + String toSelect = null; + if (currentPackAdapter.getSelection().size > 0) { + String selected = currentPackAdapter.getSelection().get(0); + int nextIndex = currentList.indexOf(selected, false); + if (nextIndex + 1 < currentList.size) + toSelect = currentList.get(nextIndex + 1); + + } + currentList.clear(); + for (String item : regions) + currentList.addAll(item); + currentList.sort(); + if (currentPackAdapter.getSelection().size > 0) { + selectCurrentItem(currentList.contains(toSelect, false) ? toSelect : null); + } + + currentPackAdapter.itemsChanged(); + if (toSelect != null && currentList.contains(toSelect, false)) { + currentPackAdapter.getSelectionManager().select(toSelect); + } + } + + public void updateMainPack(Set regions) { + String toSelect = null; + if (mainPackAdapter.getSelection().size > 0) { + String selected = mainPackAdapter.getSelection().get(0); + int nextIndex = mainList.indexOf(selected, false); + if (nextIndex + 1 < mainList.size) + toSelect = mainList.get(nextIndex + 1); + selectMainItem(toSelect); + } + mainList.clear(); + for (String item : regions) + mainList.addAll(item); + mainList.sort(); + + mainPackAdapter.itemsChanged(); + if (toSelect != null) { + mainPackAdapter.getSelectionManager().select(toSelect); + } + } + + public void addNewPack(String name) { + tabbedPane.add(new PackTab(name)); + pack(); + } + + public String getSelectedTab() { + return tabbedPane.getActiveTab().getTabTitle(); + } + + private void updateOpButtons() { + insertButton.setDisabled(tabbedPane.getActiveTab() == null || mainSelected == null); + removeButton.setDisabled(tabbedPane.getActiveTab() == null || currentSelected == null); + } + + public String getCurrentSelected() { + return currentSelected; + } + + public String getMainSelected() { + return mainSelected; + } + + @Override + public float getPrefWidth() { + return Sandbox.getInstance().getUIStage().getWidth() * 0.5f; + } + + @Override + public float getPrefHeight() { + return Sandbox.getInstance().getUIStage().getHeight() * 0.5f; + } + + public static class PackTab extends Tab { + String name; + public PackTab (String name) { + super(false, false); + this.name = name; + } + + @Override + public String getTabTitle() { + return name; + } + + @Override + public Table getContentTable() { + return null; + } + } +} 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 new file mode 100644 index 00000000..bce1ff55 --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/ui/dialog/ImagesPackDialogMediator.java @@ -0,0 +1,80 @@ +package games.rednblack.editor.view.ui.dialog; + +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.proxy.ProjectManager; +import games.rednblack.editor.renderer.data.TexturePackVO; +import games.rednblack.editor.view.menu.ResourcesMenu; +import games.rednblack.editor.view.stage.Sandbox; +import games.rednblack.editor.view.stage.UIStage; +import org.puremvc.java.interfaces.INotification; +import org.puremvc.java.patterns.mediator.Mediator; + +public class ImagesPackDialogMediator extends Mediator { + private static final String TAG = ImagesPackDialogMediator.class.getCanonicalName(); + private static final String NAME = TAG; + + private static final String NEW_IMAGES_PACK = "games.rednblack.editor.view.ui.dialog.ImagesPackDialogMediator.NEW_IMAGES_PACK"; + private static final String MOVE_REGION_TO_PACK = "games.rednblack.editor.view.ui.dialog.ImagesPackDialogMediator.MOVE_REGION_TO_PACK"; + private static final String UPDATE_CURRENT_LIST = "games.rednblack.editor.view.ui.dialog.ImagesPackDialogMediator.UPDATE_CURRENT_LIST"; + + public ImagesPackDialogMediator() { + super(NAME, new AtlasesPackDialog("Images Atlases", NEW_IMAGES_PACK, MOVE_REGION_TO_PACK, UPDATE_CURRENT_LIST)); + } + + @Override + public void onRegister() { + super.onRegister(); + facade = HyperLap2DFacade.getInstance(); + } + + @Override + public String[] listNotificationInterests() { + return new String[]{ + ResourcesMenu.OPEN_IMAGES_PACK, + ProjectManager.PROJECT_OPENED, + NEW_IMAGES_PACK, + MOVE_REGION_TO_PACK, + UPDATE_CURRENT_LIST + }; + } + + @Override + public void handleNotification(INotification notification) { + Sandbox sandbox = Sandbox.getInstance(); + UIStage uiStage = sandbox.getUIStage(); + ProjectManager projectManager = facade.retrieveProxy(ProjectManager.NAME); + + switch (notification.getName()) { + case ResourcesMenu.OPEN_IMAGES_PACK: + viewComponent.show(uiStage); + break; + case ProjectManager.PROJECT_OPENED: + viewComponent.initPacks(projectManager.currentProjectInfoVO.imagesPacks.keySet()); + viewComponent.updateMainPack(projectManager.currentProjectInfoVO.imagesPacks.get("main").regions); + break; + case NEW_IMAGES_PACK: + TexturePackVO newVo = new TexturePackVO(); + newVo.name = notification.getBody(); + + projectManager.currentProjectInfoVO.imagesPacks.put(newVo.name, newVo); + + viewComponent.addNewPack(newVo.name); + break; + case UPDATE_CURRENT_LIST: + String currentTab = viewComponent.getSelectedTab(); + viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.imagesPacks.get(currentTab).regions); + break; + case MOVE_REGION_TO_PACK: + String toPack = viewComponent.getMainSelected() != null ? viewComponent.getSelectedTab() : "main"; + String fromPack = viewComponent.getMainSelected() == null ? viewComponent.getSelectedTab() : "main"; + String region = viewComponent.getMainSelected() != null ? viewComponent.getMainSelected() : viewComponent.getCurrentSelected(); + + projectManager.currentProjectInfoVO.imagesPacks.get(fromPack).regions.remove(region); + projectManager.currentProjectInfoVO.imagesPacks.get(toPack).regions.add(region); + + viewComponent.updateCurrentPack(projectManager.currentProjectInfoVO.imagesPacks.get(viewComponent.getSelectedTab()).regions); + viewComponent.updateMainPack(projectManager.currentProjectInfoVO.imagesPacks.get("main").regions); + break; + } + } +} diff --git a/src/main/java/games/rednblack/editor/view/ui/widget/actors/SpineActor.java b/src/main/java/games/rednblack/editor/view/ui/widget/actors/SpineActor.java index 6f5dcdfd..c2fad424 100644 --- a/src/main/java/games/rednblack/editor/view/ui/widget/actors/SpineActor.java +++ b/src/main/java/games/rednblack/editor/view/ui/widget/actors/SpineActor.java @@ -19,7 +19,7 @@ import com.esotericsoftware.spine.attachments.Attachment; import com.esotericsoftware.spine.attachments.MeshAttachment; import com.esotericsoftware.spine.attachments.RegionAttachment; import games.rednblack.editor.renderer.resources.IResourceRetriever; -import games.rednblack.h2d.extention.spine.PrefixAtlasAttachmentLoader; +import games.rednblack.h2d.extention.spine.ResourceRetrieverAttachmentLoader; public class SpineActor extends Actor { @@ -81,7 +81,7 @@ public class SpineActor extends Actor { } private void initSkeletonData() { - skeletonJson = new SkeletonJson(new PrefixAtlasAttachmentLoader(animationName, irr.getMainPack())); + skeletonJson = new SkeletonJson(new ResourceRetrieverAttachmentLoader(animationName, irr)); skeletonData = skeletonJson.readSkeletonData((irr.getSkeletonJSON(animationName))); }