package com.bladecoder.engine.spine;
import com.badlogic.gdx.assets.AssetDescriptor;
import com.badlogic.gdx.assets.AssetLoaderParameters;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader;
import com.badlogic.gdx.assets.loaders.FileHandleResolver;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.utils.Array;
import com.esotericsoftware.spine.SkeletonBinary;
import com.esotericsoftware.spine.SkeletonData;
import com.esotericsoftware.spine.SkeletonJson;
/**
* {@link AssetLoader} for {@link SkeletonData} instances. Loads an exported
* Spine's skeleton data. The atlas with the images will be loaded as a
* dependency. This has to be declared as a {@link SkeletonDataLoaderParameter}
* in the {@link AssetManager#load(String, Class, AssetLoaderParameters)} call.
* Supports both binary and JSON skeleton format files. If the animation file
* name has a 'skel' extension, it will be loaded as binary. Any other extension
* will be assumed as JSON.
*
* Example: suppose you have 'data/spine/character.atlas',
* 'data/spine/character.png' and 'data/spine/character.skel'. To load it with
* an asset manager, just do the following: *
*
* <pre>
* {@code
* assetManager.setLoader(SkeletonData.class, new SkeletonDataLoader(new InternalFileHandleResolver()));
* SkeletonDataLoaderParameter parameter = new SkeletonDataLoaderParameter("data/spine/character.atlas");
* assetManager.load("data/spine/character.skel", SkeletonData.class, parameter);
* }
* </pre>
*
* @author Alvaro Barbeira
*/
public class SkeletonDataLoader
extends AsynchronousAssetLoader<SkeletonData, SkeletonDataLoader.SkeletonDataLoaderParameter> {
SkeletonData skeletonData;
public SkeletonDataLoader(FileHandleResolver resolver) {
super(resolver);
}
@Override
public void loadAsync(AssetManager manager, String fileName, FileHandle file,
SkeletonDataLoaderParameter parameter) {
skeletonData = null;
TextureAtlas atlas = manager.get(parameter.atlasName, TextureAtlas.class);
String extension = file.extension();
if (extension.toLowerCase().equals("skel")) {
SkeletonBinary skeletonBinary = new SkeletonBinary(atlas);
skeletonBinary.setScale(parameter.scale);
skeletonData = skeletonBinary.readSkeletonData(file);
} else {
SkeletonJson skeletonJson = new SkeletonJson(atlas);
skeletonJson.setScale(parameter.scale);
skeletonData = skeletonJson.readSkeletonData(file);
}
}
@Override
public SkeletonData loadSync(AssetManager manager, String fileName, FileHandle file,
SkeletonDataLoaderParameter parameter) {
return skeletonData;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Array<AssetDescriptor> getDependencies(String fileName, FileHandle file,
SkeletonDataLoaderParameter parameter) {
Array<AssetDescriptor> deps = new Array<AssetDescriptor>();
deps.add(new AssetDescriptor(parameter.atlasName, TextureAtlas.class));
return deps;
}
/**
* Mandatory parameter to be passed to
* {@link AssetManager#load(String, Class, AssetLoaderParameters)}. This
* will insure the skeleton data is loaded correctly
*
* @author Alvaro Barbeira
*/
static public class SkeletonDataLoaderParameter extends AssetLoaderParameters<SkeletonData> {
// A SkeletonJson must be loaded from an atlas.
public String atlasName;
public float scale;
public SkeletonDataLoaderParameter(String atlasName, float scale) {
this.atlasName = atlasName;
this.scale = scale;
}
public SkeletonDataLoaderParameter(String atlasName) {
this(atlasName, 1);
}
}
}