• Editor
  • Spine 3.8 Export attachments atlas maintaining image folders

Related Discussions
...
Nate wrote

You can use the "combine subdirectories" setting to pack images in folders (subdirectories) into the same atlas page. If they don't fit they will spill over into subsequent pages.


Just found that the latest version has this option missing. No wonder why I don't find it.

Unchecking Export for a skin causes that skin and its attachments to not be written in exported JSON or binary data. You can inspect the JSON and make sure that is the case. The only reason you should ever get "missing region" messages in Unity is that there are attachments in the data that don't have a matching texture region in the atlas.

Exactly, the xxx.export.json didn't store which skin to ignore. Thus, when exporting from command line using that export.json file , all skins are exported. That's the issue. Alhought exporting directly from spine UI mode works, it would not be easy because for each skin, user has to manually adjust the ignore list for the skins.

Here is the saved export.json file. Not mentioning the export-unchecked skins at all.

{
"class": "export-binary",
"name": "Binary",
"project": "Kids.spine",
"output": "D:/exports/Units/Npc/HarbourKids",
"open": false,
"extension": ".skel.bytes",
"nonessential": false,
"cleanUp": false,
"packAtlas": {
   "stripWhitespaceX": true,
   "stripWhitespaceY": true,
   "rotation": true,
   "alias": true,
   "ignoreBlankImages": false,
   "alphaThreshold": 3,
   "minWidth": 16,
   "minHeight": 16,
   "maxWidth": 2048,
   "maxHeight": 2048,
   "pot": true,
   "multipleOfFour": false,
   "square": false,
   "outputFormat": "png",
   "jpegQuality": 0.9,
   "premultiplyAlpha": true,
   "bleed": false,
   "scale": [ 0.5 ],
   "scaleSuffix": [ "_half" ],
   "scaleResampling": [ "bicubic" ],
   "paddingX": 1,
   "paddingY": 1,
   "edgePadding": true,
   "duplicatePadding": false,
   "filterMin": "Linear",
   "filterMag": "Linear",
   "wrapX": "ClampToEdge",
   "wrapY": "ClampToEdge",
   "format": "RGBA8888",
   "atlasExtension": ".atlas.txt",
   "combineSubdirectories": false,
   "flattenPaths": false,
   "useIndexes": false,
   "debug": false,
   "fast": false,
   "limitMemory": true,
   "currentProject": true,
   "packing": "polygons",
   "silent": false,
   "ignore": false,
   "bleedIterations": 2
},
"packSource": "attachments",
"packTarget": "perskeleton",
"warnings": true
}

I changed the combineSubdirectories to true directly from .json file. It works, now only output one PNG.

However, when try to export directly from Spine Editor instead of command line. It has error.
The HomeTown_Girl skin has "export" unchecked and it blame not being able to find it.

Spine Launcher 3.8.82
Esoteric Software LLC (C) 2013-2020 | http://esotericsoftware.com
Windows 10 Enterprise x86 10.0
Spine 3.8.93 Professional
Licensed to: Secret
Pack: skeleton
Complete.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ERROR: Unable to export:
java.lang.RuntimeException: java.lang.RuntimeException: Skin not found in skeleton: HomeTown_Girl
   at OT.Z(SourceFile:1858)
   at CF.S(SourceFile:48)
   at AP.run(SourceFile:671)
   at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: Skin not found in skeleton: HomeTown_Girl
   at sX.S(SourceFile:853)
   at sX.S(SourceFile:428)
   at sX.S(SourceFile:103)
   at sX.S(SourceFile:123)
   at CH.run(SourceFile:60)
   at OV.run(SourceFile:1846)
   at cOM9.S(SourceFile:289)
   at Com2.run(SourceFile:252)
   at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
   at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   at java.desktop/java.awt.EventQueue.access$600(Unknown Source)
   at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
   at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
   at java.base/java.security.AccessController.doPrivileged(Native Method)
   at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)

Nothing about skins will ever be in the export JSON or texture packing setting JSON. Whether a skin is exported is only stored in the .spine project file.

There are two ways to export an atlas:
Texture Packing - Spine User Guide

1) Packing during skeleton data export
When doing this, there is no option to combine subdirectories because Spine is packing only the images actually used by the skeleton


subdirectories/folders are not being used at all to find images or decide which images go on what atlas page (which also means pack.json in your image folders files are not used). I will make a note about this setting not being shown when packing in this mode.

You get this mode when you check Pack while doing binary or JSON export AND you choose Attachments. When you export from the command line, you'd use the `


exportor-e` options with an export settings JSON file.

Note this option is for convenience, to quickly get an atlas for a skeleton, or for simple projects that don't need more control.

2) Using the Spine Texture Packer separately
When doing this, folders are used to determine which pages images are written to and combine subdirectories can be set.

You get this mode when you run the texture packer separately, not as part of binary or JSON export. When you export from the command line, you'd use the `


packor-p` options with a texture atlas settings JSON file.

Note this option gives more control over how packing is done (via folders, combine subdirectories, and pack.json files, you can pack images for multiple skeletons into the same atlas, etc).


The export settings JSON you showed is for binary export with texture atlas packing (#1). Everything will be packed in one page, if it fits.

Using the "kids" project you posted in another thread, I reproduced the error log you showed by unchecking Export for HomeTown_Girl. It happens for me in the UI. I didn't try the CLI, but seeing it is sufficient for us to fix it. From a quick look, it happens during export of a deform timeline for a mesh attachment in the skin that is not being exported. The fix is easy (we should just skip such timelines). We'll do a 3.8 release in a day or two, in case there are other fixes needed for 3.8.

With that fixed, I notice the atlas still contains HomeTown_Girl/* images. I think there is another bug that doesn't respect the skin Export being unchecked. It should not include those images in the atlas when packing. We'll get that fixed too!

Sorry for the trouble with bugs you are having lately! We really do appreciate that you are taking the time to help us reproduce and fix them.


Hmm. For the export checkbox on attachments, if the attachment is keyed in an animation, it is exported anyway and a warning is shown. I honestly don't remember when we added an export checkbox for skins, so we'll have to think on how that should behave.


To follow up, in 3.8.94 we've fixed a number of bugs with export checkboxes for attachments and skins, and changed how they work for attachments slightly. :greatsuccess:

14 days later
Nick wrote
Nate wrote

You can use the "combine subdirectories" setting to pack images in folders (subdirectories) into the same atlas page. If they don't fit they will spill over into subsequent pages.


Just found that the latest version has this option missing. No wonder why I don't find it.

Unchecking Export for a skin causes that skin and its attachments to not be written in exported JSON or binary data. You can inspect the JSON and make sure that is the case. The only reason you should ever get "missing region" messages in Unity is that there are attachments in the data that don't have a matching texture region in the atlas.

Exactly, the xxx.export.json didn't store which skin to ignore. Thus, when exporting from command line using that export.json file , all skins are exported. That's the issue. Alhought exporting directly from spine UI mode works, it would not be easy because for each skin, user has to manually adjust the ignore list for the skins.

Here is the saved export.json file. Not mentioning the export-unchecked skins at all.

{
"class": "export-binary",
"name": "Binary",
"project": "Kids.spine",
"output": "D:/exports/Units/Npc/HarbourKids",
"open": false,
"extension": ".skel.bytes",
"nonessential": false,
"cleanUp": false,
"packAtlas": {
   "stripWhitespaceX": true,
   "stripWhitespaceY": true,
   "rotation": true,
   "alias": true,
   "ignoreBlankImages": false,
   "alphaThreshold": 3,
   "minWidth": 16,
   "minHeight": 16,
   "maxWidth": 2048,
   "maxHeight": 2048,
   "pot": true,
   "multipleOfFour": false,
   "square": false,
   "outputFormat": "png",
   "jpegQuality": 0.9,
   "premultiplyAlpha": true,
   "bleed": false,
   "scale": [ 0.5 ],
   "scaleSuffix": [ "_half" ],
   "scaleResampling": [ "bicubic" ],
   "paddingX": 1,
   "paddingY": 1,
   "edgePadding": true,
   "duplicatePadding": false,
   "filterMin": "Linear",
   "filterMag": "Linear",
   "wrapX": "ClampToEdge",
   "wrapY": "ClampToEdge",
   "format": "RGBA8888",
   "atlasExtension": ".atlas.txt",
   "combineSubdirectories": false,
   "flattenPaths": false,
   "useIndexes": false,
   "debug": false,
   "fast": false,
   "limitMemory": true,
   "currentProject": true,
   "packing": "polygons",
   "silent": false,
   "ignore": false,
   "bleedIterations": 2
},
"packSource": "attachments",
"packTarget": "perskeleton",
"warnings": true
}

I changed the combineSubdirectories to true directly from .json file. It works, now only output one PNG.

However, when try to export directly from Spine Editor instead of command line. It has error.
The HomeTown_Girl skin has "export" unchecked and it blame not being able to find it.

Spine Launcher 3.8.82
Esoteric Software LLC (C) 2013-2020 | http://esotericsoftware.com
Windows 10 Enterprise x86 10.0
Spine 3.8.93 Professional
Licensed to: Secret
Pack: skeleton
Complete.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ERROR: Unable to export:
java.lang.RuntimeException: java.lang.RuntimeException: Skin not found in skeleton: HomeTown_Girl
   at OT.Z(SourceFile:1858)
   at CF.S(SourceFile:48)
   at AP.run(SourceFile:671)
   at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: Skin not found in skeleton: HomeTown_Girl
   at sX.S(SourceFile:853)
   at sX.S(SourceFile:428)
   at sX.S(SourceFile:103)
   at sX.S(SourceFile:123)
   at CH.run(SourceFile:60)
   at OV.run(SourceFile:1846)
   at cOM9.S(SourceFile:289)
   at Com2.run(SourceFile:252)
   at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
   at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
   at java.desktop/java.awt.EventQueue.access$600(Unknown Source)
   at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
   at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
   at java.base/java.security.AccessController.doPrivileged(Native Method)
   at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
   at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.desktop/java.awt.EventDispatchThread.run(Unknown Source) https://mouseclicker.net/minecraft-auto-clicker/

The problem is not writing them, is to make them easily accessible from the program GUI; for example, Photoshop has the option to place .jsx files in the Scripts folder that then pop-up in the program GUI as menu options.