package com.siondream.core.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;
import com.siondream.core.Env;
/** {@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() {
atlasName = "";
scale = Env.pixelsToMetres;
}
}
}