Thanks for getting back to me Nate.
So I've written a custom shader which will hue shift specific parts of my atlas to be able to color customize the character as shown below.
Loading Image
Although the texture in each character is exactly the same, the materials need to be individual instances because of the different properties that gets passed into the shader.
I've managed to speed up initialization by programmatically cloning the default skin with a new atlas containing a unique material instance. Unfortunately I have had to change a code in the FFDTimeline which checks that the attachment matches the attachment in the current skin.
override public void Apply (Skeleton skeleton, float lastTime, float time, List<Event> firedEvents, float alpha) {
Slot slot = skeleton.slots[slotIndex];
// if (slot.attachment != attachment) return;
I think because the SkeletonData is stateless and shared accross all Skeleton instances, the FFDTimeline.Attachment needs to be able to work with multiple skins with different attachments as long as they have matching slotIndexes. I also had to add a custom Reset method in SkeletonRenderer which will initialize the private variables and create a new skeleton without reloading the SkeletonData from JSON.