From dc0d9188b20eea4e99ae5203f3a2b7e3405d30d3 Mon Sep 17 00:00:00 2001 From: gattolfo Date: Sun, 4 Aug 2024 19:31:12 +0200 Subject: [PATCH 1/2] Implemented ignoring blank tile Implemented ognoring bloank tile in ImportTileSetDialogMediator & ImportTileSetDialog --- .../view/dialog/ImportTileSetDialog.java | 17 +++++-- .../dialog/ImportTileSetDialogMediator.java | 46 +++++++++++++++---- 2 files changed, 49 insertions(+), 14 deletions(-) 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 index 9f6b720d..e90c5c74 100644 --- 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 @@ -3,10 +3,7 @@ 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.*; import com.kotcrab.vis.ui.widget.file.FileChooser; import games.rednblack.h2d.common.H2DDialog; import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; @@ -21,6 +18,7 @@ public class ImportTileSetDialog extends H2DDialog { private final InputFileWidget imagePathField; private final VisTextButton importButton; private final Facade facade; + private final VisCheckBox removeBlankTileCheck; public ImportTileSetDialog(Facade facade) { super("Import TileSet"); @@ -40,6 +38,8 @@ public ImportTileSetDialog(Facade facade) { getContentTable().row().padTop(10); // + + Validators.IntegerValidator validator = new Validators.IntegerValidator(); width = StandardWidgetsFactory.createValidableTextField(validator); @@ -55,6 +55,13 @@ public ImportTileSetDialog(Facade facade) { sizeTable.add("px"); getContentTable().add(sizeTable); + //test + getContentTable().row().padTop(10); + removeBlankTileCheck = StandardWidgetsFactory.createCheckBox("Remove blank tile"); + getContentTable().add(removeBlankTileCheck); + getContentTable().row().padTop(10); + + importButton = StandardWidgetsFactory.createTextButton("Import"); getButtonsTable().add(importButton); pack(); @@ -70,6 +77,8 @@ public int getTileHeight() { return Integer.parseInt(height.getText()); } + public Boolean getBlankTileOption(){ return removeBlankTileCheck.isChecked(); } + private void setListeners() { importButton.addListener(new ClickListener() { @Override 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 index b5f4f396..cdfe026b 100644 --- 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 @@ -45,6 +45,7 @@ public void handleNotification(INotification notification) { } private void importTileset(FileHandle tileset) { + System.out.println("Importing tileset " ); byte[] image = tileset.readBytes(); Pixmap pixmap = new Pixmap(image, 0, image.length); String name = tileset.nameWithoutExtension(); @@ -65,16 +66,15 @@ private void importTileset(FileHandle tileset) { 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(); - texturePackVO.regions.add(name + i); - i++; + if( getViewComponent().getBlankTileOption()){ + if(!isBlankTile(pixmap, x, y, w, h)) { //check if the tile is blank (empty, if not it can be added) + createTilePixmap(pixmap,x,y,w,h,i,name,texturePackVO); + i++; + } + }else{ + createTilePixmap(pixmap,x,y,w,h,i,name,texturePackVO); + i++; + } } } @@ -86,7 +86,33 @@ private void importTileset(FileHandle tileset) { facade.sendNotification(MsgAPI.ACTION_REPACK); } + private void createTilePixmap(Pixmap pixmap, int x, int y, int w, int h, int i, String name, TexturePackVO texturePackVO){ + Pixmap tilePixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888); + + //insert control + + tilePixmap.drawPixmap(pixmap, 0, 0, x, y, w, h); + + int pix = pixmap.getPixel(x,y); + String imagesPath = getCurrentRawImagesPath() + File.separator + name + i + ".png"; + FileHandle path = new FileHandle(imagesPath); + PixmapIO.writePNG(path, tilePixmap); + + tilePixmap.dispose(); + texturePackVO.regions.add(name + i); + } + public String getCurrentRawImagesPath() { return pluginAPI.getProjectPath() + File.separator + "assets" + File.separator + "orig" + File.separator + "images"; } + + private boolean isBlankTile(Pixmap pixmap ,int x, int y, int w, int h){ + System.out.println("buildpixelmap"); + for(int cx = x; cx < x + w; cx += 1) { + for(int cy = y; cy < y + h; cy += 1 ){ + if(pixmap.getPixel(cx, cy)!= 0) return false; + } + } + return true; + } } From ee2c61af32165b2867f09944d1d74e5c1a368350 Mon Sep 17 00:00:00 2001 From: fgnm Date: Mon, 12 Aug 2024 19:03:57 +0200 Subject: [PATCH 2/2] Remove log, update jar plugin --- assets/plugins/plugin-tiled-0.1.5.jar | Bin 103137 -> 103729 bytes .../dialog/ImportTileSetDialogMediator.java | 2 -- 2 files changed, 2 deletions(-) diff --git a/assets/plugins/plugin-tiled-0.1.5.jar b/assets/plugins/plugin-tiled-0.1.5.jar index 16ee7ffc354bf6a5bd2fb0a86af57ea461e19eed..f2cf7e3247d8ccaf431c0c4ec375738a0d89c4bc 100644 GIT binary patch delta 8104 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 delta 7527 zcmZ8m1yqz<7o87=8X9Q?>5>L%M38Qf?hZjhI!79Yl8}*h=#Y}`ZUg}d0YOknB@_e! zX5BsK?6c3g_nS3y@43~b=qm;2cpA#6UJtfkZCrx@6TX@-+ZRRk#2csZf(6gnEq%MX|5Fbz*$T z+H1BYbOF4}i2^gd=ZY5-EdwV@$*^Ck1xcD+vsR?Eu91+81Q{}ekJ0#bjml;U*GbKu z;UW>$6Xxp~%lgpYxw0iY!ex=57Or%)wm7X%Q)JOWAa#5YNb+J1yfqJAnxi8H^0P<5 zS9LKjBUlg@ldQ)`t`cQWem4k#dq)BUHQjk-*XiAg9wB1}izFdPg#G3f0TNYqZ(gry z=3vWpfYGQ5*5#Dpj69wXldDGcp(ZZ3%hSi;uywasKT#b8}Sj5UT{6}M1?&Db^ z{C`h#B>#e4@$rXWTH5zoGTs}vNx>r`+;O8|Oa2;=sbcx!X&w>9ejroMo&q$QF~-+l zVC?A>15_{lbWAA0VKjwz8xboKv4-`aqJn=k9Whxpi&f>05+#L3()uW3-2#Zgp|TKM zMJ1d_f%x90cBLLpdDFNf*UJJf^JUOnF_m|CIF>2=QKy8@GeXO=ToONm34hlz&0;MY zHu~ILjMST(-+~LhSMg``ssNNsx#v{rNH&+=qL(&N!q?nTiJ6es|4z|}@aGlOOdEZu z6&PK8(@Qj)TxfglkNt6F$65cHuO%rX)mt-+&^=U%yW_Ld+$umq*^L)RLZpOLtauKn>~ux4hSIS5TIc ziLXl5Y4-ql8@c9yQMkW=6xZCmW#jeL!qwWiM zPSX5i!AK1M&SB72o!DFF8ojQ2$2P9`vr?4pdw!JpcQ~i)#rPlVg?ATo6j+vK4Op7( z$>j6yrW+Ty?cEvg>9T@Sq??zIR~bkoW>_E!snQDEOY^jvBq(sLmuiTt^mnWg3Mce> zYEQ%6=S@{3Fjx|UJSEIoBY$NpCaw4#9;cn}+KRpvII?*hqC1k5lQ?7Ec*3kqF$dI< z))nDkn>;*g=shm(Ruanif~Xa>5 z{_2srC%4xSqXr}x9Y{QqSrKdpEe_^tIvf*u$5#c(MZY1m{Z64Y?z%;=`zIu>TX;QI zIedSDPWNwjQ+H#nnX&(-M6XUp$Cn@6TKG;YeD#~V)&u*+BowB5#h>qjZ_g#yIMXyFOTqQja1#Y@}O(fo2)S#eAA z-KE`)irKanvWY^4whB0Y&{RifLeP?3$M>J#KKqX`hS#&@i+5gp)A`rW#{B=Z?e4uj z9}hw?$7t8BilR%LkZ&v#SscVQ@H>IN?8lv|q2_cU;j>lysS-mqUpzD*(DR;CERRY4 zNB!r+Nk9CfU&D2@C^&k@+?2{L(#7Gqw8go2bPio75wWaDoTT-E(}r3t(lg_Z(hP$#uUmX)pTZ>lKe+o?I;YL>W=X zSmHJMYcl@6OuuVgNJ(6pT!g=2&gQSJhotxxXu1%aO1xSqdeo*Tdk}0IoIHyg5tlf& zmeNTvi90#1;z(g->^>zf|7Ii@$|2oI#93kfwy#2U^Wh@IlKNp*l`jKD8)ul@Yceh4 z@v5zWTg-2or+Rj|_Ked9!sqW2XimhkM$13u_mJmeU)&KulWS#XB3gVixWhSDOj{`3 z6Ne+D?Hg}VZDsq0rYAz-5RNv#OrY!1WlJJtf$f|Adg=S;T5ShEto%=;5zr@On0jeA z>*9%{U$ISDL|&PVZCBwwfvmFETVaF>c3?+t#xmnEzY#>snv!u-T)8dmQ~Vj!Q}`Z5 zy??t3`#Z#|Y%UbsGlQ17yF#k&Uzqh%R(~-~#q)rtmQyBzg8a*A#snQob#hlchdx}n z!{?n{bRc_DW8BmE+Y|g}&v&3UVye!XnFH%pveOkWlnS&xg3lhQ%S?_8NMI@Nw!Jn_ z$scEp)IP)ch%>UG-96?jzCKh-if9B8VIs%~(Hi(=N+lTL56X_46dEZ9Xt2LIA55*{ zk$A&uiwkNu>V87vd7LWDzoPKA&lDLIA|BPZs46Di@5$PHL4apvgDDD)AkNnz|1@o* zoKUom^N}~;QM1fjuor&MJ%`9`nxlQiV22F8+ZE(OS`RkU9MY6B1-Kuj3XVNXh+!Qn z9_-G4cIPK`<8LCj_>wBH+LKi5eykAK0FmM_AKyIq;~Lt>B~>) zH+UjkMVsQPs#;xTIMi?iuH!s$H`|$7)y{4-z~KIJhlt0fau0n;doLB%u&-7UtGDuS z81$H9xZT{o%_nq%S4qa;KA{T@vD4Q*3-?Sq@!6+1%F#w9t0Y}uG@4$s;qOjPhU+gY z-A89dm_6gMvaH(2pw$r37}NUgcU?P6Eq=1p-!^bpO&&kzLVfDQ%+=G}q?SJ2DtM%s z!eVV;n#$*X_Q1kAO03{9k=h4`k6TmJk0Q!D$oJk9DieAdEULdPU~OdDD2!pOdTr=o zT{}98W3={l51W`GcqRQPwNgix=)^|9N}%qm;?p39iFKg}jRdHP>!fjtV=4QKSZ?~L z+#ewCHZHE$3c6a!BCxu!f)*}sl7N1K^7cboqf^|eNeYRm5bnE2J2mf_e`J*l&k(?; zC)d+LUL2$TRj84ia3cI0i+*<4`g@sxv>+zCC--15k&;G)=x{jkezHBzyEM_Wte|tC zY8Nw*H*O?vC0!B95%2u6Gs*r{l+6Tv5MMY6YO?*tW2{Q{)%m}vYyx;;vue2|QB<%w zf+cMkN2mux2tTubW@=6m)1SrF@c?zvFku!pw@gpt;4X=vc4EtwzfU|tM#E}Z1%*Un zomZev#M$k|VBx^~^9uYIP;i6y6bQZM2+8h&F`vAA*X;}?q*3k3JBaV6?+<4UwcN~3 zTSyrDzy&6dS4i0lv~xWNtG%17wBLF?!K9B?!qHSEtWMoV_I>_yvG|+rUzDA? z8s3WsB^d2NQR`PF?R(A%>>%|uOmjo2n%jT5n-7_ng*!2-CT9EKXAMX$=H!KgRlQ%6mSy0mB%`C@stL2li zLyMBl1;J^(6ic4@S*)>TQbwu4j(ytBGt(XlgrIoc7ik_xE#nTJHdop?!@L8RJ|^xx zH+)^N{^XcAr$Oi)Q_kwL08KyHF--c5_)E?m;J<&SHTiS*uD9_Y7ox8>F3voGjek%k{B*w5Lh_x-buA zq_r~g@N}Ek(MElEnW(L$LNKI+oAmrknOYl6$GvV7XPUSHX$ z1yfoJQRh`%KVxXrvRhvM@mu?2os;Dw=2J!)$@Nh0-Ik+F_wgS&?&Bj5$FmyoJ7uA{ z??c5KiNBPwK0tK-Y7{KClXj3u{ibX`5&WEnpM#%Ti78@Lj?bC`OM+C?e4_{P62Ua; z!z%ugZ%UVJR?M?($kdS~L5?~2Od-&}=2_);rSH#3mF$Onil>yQhJ3P68XkO(aeYY! zX=R7Kf)G3NB}LR3n0p#5s7#a~YVZ3%X(=C1cUq&#IYi&uEz8vD0)?b=XdUSwpEk+FLF` z=I7}Xo3nKyDLF$f@EB$%y@?1fW>3ReOI!@jtl&}ZyUSCr%rWi`a`5igrfv!49yIgv z6&JKdeIhb&_L{7CBZ0e8#ZV7b?&FG{E>P^R9H=^ZOIPOGJDE(es@dEk-&a87$eu-a zxWj9y+p*ZF(nr&znfcLvI?ktq$-=D(7Pvv8-=Ecw@JJ`vQplLJTlo@Hld(1PF2|ji zOl#m};HHL3P3=2@c2RtR1GcErsNlwupuhBBSgceo-ISD{pKJ6jU9s;_qcoB4hNWWz zBWxA9chFVI-=iPM@eiG)jID53IVc)X%&f5vitu}Zu+T!;lX%cb$3^3PDaWNPytLL( zKI&lKYgN8et?!y&@KLN)fsWy`%ZKpbBN+&WHqMB@kXgSeyPrnibYld#gf8icvHo;M z8)Nk^2+6FXN27x=DIZ}gRI9J-OKxNgp0T(OuCs<~9&C2ilcTmMbU&SxU!qu3DJQSz=L)QvOeK{hdvC~mJs~XV*)&^On1?rJ)@#WuJcs~@q@a- zGvV)Br%vBv4MplKveA|I#;OdDZV=5x>I4wq`D|#IP!sia@TnKp=nwHlrawo~i*I$D zmjfUi1=x4^2Y?YudJok%X{`pF16Jg~VH1TERedOGq{&<}aJPvHe)9h+%HC$`b zTHtqE%5%=NP9K}#tfNuc+!W;0`AEDtJ)ylky=b&Nt-CyATju8PV$_%{F|qEN6Ea@b zXoi0J?YF08L!yOm+I&UhzHBhA`)zI#8xH<1wfm=|iROV;dOq^dd~drN?FXi}%yjpk zjfN4~O4lolfcLt>F>K7+*{hDwQ2c`ne$xe*boH>e(@nExG1{xxQ*_%Vs%UaLFgv(N zd)e^4T-M$%R#DN@ljsT<`eqAVYCk#1LFX7yJJp@HWjq{wXP%S2GkIeD<8)qyeX_g& z_jk6*Xu}Ea*8KfhXyA$T{p`7MG$OhFbjojRs%~Ew&4i~;?G|n)@D4SZ%TX@4=!I;4 z-;ZcQ8=Zc%Aj&%9Gf?LT^hN3jiF}{iT8FZq(${BA084ux9$*QUg-E>GSjVM5r09?u z6A7$lh~#y9$g{@gPw-8p5A$wZ8_V;CqF`C(7bHfs;~PWq<GSxQ##L2#PKIPs zvSEl%ilhgs6EeR-XQv!`lhYZAc-9Wy3)c&_kv}M3;4qnVz$?gWcIU0g#2AxG`=GLp zK2^&{YO+vKGahH7guO4xo!wOf$xcRFPw7k_qBm#6e~Ic>uP@9=o1C(`acERDQ^0{> zcpt1`tD50}hXXBG<5ry_Z_%%Cf4-a6@p%|#|DGsX&9utXnQnu;TFuXm8rUV}>W9V9 zzf|h~nEQ;Cu$zrA?8cvD50|4DCnD7Um^rplH>3(D}UbP=kSOk!sf_8SAjzE+hr zmIC8Q@-lrb-++N+N6o$AF4eyll z`t)lUYx>@9XILEUu?k3?lNr%ea#LnI5eqQdCes*|+^;nZD!4^8d?{<44(dBRp)W#bI|ynLn7&W4b)w{{;?aO(xf zT+q&y`DgTQKRo=SA$+_e8}~{l!w=7jEn$(~XGmyzO%MD-e&T7b*Rhpgna3gJw?0EJ zwRO7Cr@y|FGy>bq0bbM&L9iS;vr%b&R$r7MUry?R)L$14?jDj2XKjB~L)5spEmM_g77+fW@9-n8 zr0Lmqj6v<&Hs*r-81B<-t+pg~k$`!FfBf0G?2g;ueXh5s*5kO&7CAkK3VhS z>)lH0{4KNK$02twmC&rL8lbB;UZ^4zbEWIpaQuzchBf=iGQu0%nSRlQu5d?=AtRSL zw}ArMsXNoJi=gFDsxsk_$`B^|o{MvsoBnJ*Ou3iT1NLN&NpynqSMET>C>{E#bL=NQ zpG;rqDZ#Im+02p@iY}KuFpRAZ(!o@$#OhBHBya!XN6(hpS+<915MB0{4+;D+m}zc} zZp?Ip3o6Di$yG%Zr)qmET?wf&cr@v6I^|~-q;<#qzSsmrQfJ{c(oT76(7xrlG&A|Z zzgdpXRJBx}L}W19 z4@wZoe>=;5EqE>%sF^ zAcftSej^7B-Jz#V7Q`cQay2(xj1uwBK`kWH0Qjenq9GMlr=aCFN78@-b()wyd{hj zG)THxhJd7tlITQ`=6