![JAR search and dependency download from the Maven repository](/logo.png)
com.brashmonkey.spriter.xml.SCMLReader Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of Spriter Show documentation
Show all versions of Spriter Show documentation
A generic Java library for Spriter animation files.
/**************************************************************************
* Copyright 2013 by Trixt0r
* (https://github.com/Trixt0r, Heinrich Reich, e-mail: [email protected])
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/
package com.brashmonkey.spriter.xml;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import com.brashmonkey.spriter.file.Reference;
import com.discobeard.spriter.dom.*;
import com.discobeard.spriter.dom.Entity.ObjectInfo;
import com.discobeard.spriter.dom.Entity.ObjectInfoType;
/**
* This class was implemented to give you the chance loading scml files on android since JAXB does not run on android devices.
* @author Trixt0r
*/
public class SCMLReader {
protected static SpriterData data;
/**
* Loads a whole spriter file.
* @param filename Path to the scml file.
* @param loader The concrete loader you have implemented.
* @return Spriter instance which holds the read spriter structure.
*/
/*public static Spriter getSpriter(String filename, FileLoader> loader){
return new Spriter(load(filename),loader, new java.io.File(filename));
}*/
/**
* Reads the whole given scml file.
* @param filename Path to scml file.
* @return Spriter data in form of lists.
*/
public static SpriterData load(String filename){
try {
return load(new FileInputStream(filename));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
public static SpriterData load(InputStream stream){
XmlReader reader = new XmlReader();
data = new SpriterData();
try {
XmlReader.Element root = reader.parse(stream);
loadFolders(root.getChildrenByName("folder"));
loadEntities(root.getChildrenByName("entity"));
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
protected static void loadFolders(ArrayList folders){
for(int i = 0; i < folders.size(); i++){
XmlReader.Element repo = folders.get(i);
Folder folder = new Folder();
folder.setId(repo.getInt("id")); folder.setName(repo.getAttribute("name", ""));
ArrayList files = repo.getChildrenByName("file");
for(int j = 0; j < files.size(); j++){
XmlReader.Element f = files.get(j);
File file = new File();
file.setId(f.getInt("id")); file.setName(f.getAttribute("name", ""));
file.setWidth((long)f.getInt("width"));
file.setHeight((long)f.getInt("height"));
try{
file.setPivotX(f.getFloat("pivot_x"));
file.setPivotY(f.getFloat("pivot_y"));
} catch(RuntimeException e){
file.setPivotX(new Float(0));
file.setPivotY(new Float(1));
}
folder.getFile().add(file);
}
data.getFolder().add(folder);
}
}
protected static void loadEntities(ArrayList entities){
for(int i = 0; i < entities.size(); i++){
XmlReader.Element e = entities.get(i);
Entity entity = new Entity();
entity.setId(e.getInt("id")); entity.setName(e.getAttribute("name", ""));
data.getEntity().add(entity);
loadAnimations(e.getChildrenByName("animation"), entity);
loadCharacterMaps(e.getChildrenByName("character_map"), entity);
loadObjectInfos(e.getChildrenByName("obj_info"), entity);
}
}
private static void loadObjectInfos(ArrayList infos, Entity entity){
for(int i = 0; i< infos.size(); i++){
XmlReader.Element info = infos.get(i);
ObjectInfo objInfo = new ObjectInfo(info.get("name","info"+i),
ObjectInfoType.getObjectInfoFor(info.get("type","")),
info.getFloat("w", 0f),info.getFloat("h", 0f));
entity.addInfo(objInfo);
XmlReader.Element frames = info.getChildByName("frames");
if(frames == null) continue;
ArrayList frameIndices = frames.getChildrenByName("i");
for(XmlReader.Element index: frameIndices)
objInfo.frames.add(new Reference(index.getInt("folder", 0), index.getInt("file", 0)));
}
}
private static void loadCharacterMaps(ArrayList maps, Entity entity){
for(int i = 0; i< maps.size(); i++){
XmlReader.Element map = maps.get(i);
CharacterMap charMap = new CharacterMap(map.getInt("id"), map.getAttribute("name", "charMap"+i));
entity.getCharacterMaps().add(charMap);
ArrayList mappings = map.getChildrenByName("map");
for(XmlReader.Element mapping: mappings){
int folder = mapping.getInt("folder");
int file = mapping.getInt("file");
charMap.put(new Reference(folder, file), new Reference(mapping.getInt("target_folder", folder), mapping.getInt("target_file", file)));
}
}
}
private static void loadAnimations(ArrayList animations, Entity entity){
for(int i = 0; i < animations.size(); i++){
XmlReader.Element a = animations.get(i);
Animation animation = new Animation();
animation.setId(a.getInt("id"));
animation.setName(a.getAttribute("name", ""));
animation.setLength((long)a.getInt("length"));
animation.setLooping(a.getBoolean("looping", true));
entity.getAnimation().add(animation);
loadMainline(a.getChildByName("mainline"), animation);
loadTimelines(a.getChildrenByName("timeline"), animation);
}
}
private static void loadMainline(XmlReader.Element mainline, Animation animation){
MainLine main = new MainLine();
animation.setMainline(main);
loadMainlineKeys(mainline.getChildrenByName("key"),main);
}
private static void loadMainlineKeys(ArrayList keys, MainLine main){
for(int i = 0; i < keys.size(); i++){
XmlReader.Element k = keys.get(i);
Key key = new Key();
key.setId(k.getInt("id"));
int time = k.getInt("time",-1);
key.setTime((time == -1) ? null: new Long(time));
key.curveType = k.getAttribute("curve_type", "linear");
key.c1 = k.getFloat("c1", 0f);
key.c2 = k.getFloat("c2", 0f);
key.c3 = k.getFloat("c3", 0f);
key.c4 = k.getFloat("c4", 0f);
main.getKey().add(key);
loadRefs(k.getChildrenByName("object_ref"),k.getChildrenByName("bone_ref"),key);
}
}
private static void loadRefs(ArrayList objectRefs, ArrayList boneRefs, Key key){
for(int i = 0; i< boneRefs.size(); i++){
XmlReader.Element o = boneRefs.get(i);
BoneRef bone = new BoneRef();
bone.setId(o.getInt("id"));
bone.setKey(o.getInt("key"));
int par = o.getInt("parent",-1);
bone.setParent((par == -1) ? null : par);
bone.setTimeline(o.getInt("timeline"));
key.getBoneRef().add(bone);
}
for(int i = 0; i < objectRefs.size(); i++){
XmlReader.Element o = objectRefs.get(i);
AnimationObjectRef object = new AnimationObjectRef();
object.setId(o.getInt("id"));
object.setKey(o.getInt("key"));
int par = o.getInt("parent", -1);
object.setParent((par == -1) ? null : par);
object.setTimeline(o.getInt("timeline"));
object.setZIndex(o.getInt("z_index"));
key.getObjectRef().add(object);
}
}
private static void loadTimelines(ArrayList timelines, Animation animation){
for(int i = 0; i< timelines.size(); i++){
TimeLine timeline = new TimeLine();
timeline.setId(timelines.get(i).getInt("id"));
animation.getTimeline().add(timeline);
timeline.objectType = timelines.get(i).get("object_type", "sprite");
loadTimelineKeys(timelines.get(i).getChildrenByName("key"), timeline);
}
}
private static void loadTimelineKeys(ArrayList keys, TimeLine timeline){
for(int i = 0; i< keys.size(); i++){
XmlReader.Element k = keys.get(i);
XmlReader.Element obj = k.getChildByName("bone");
Key key = new Key();
key.setId(k.getInt("id")); key.setSpin(k.getInt("spin", 1));
key.setTime(new Long(k.getInt("time", 0)));
key.curveType = k.getAttribute("curve_type", "linear");
key.c1 = k.getFloat("c1", 0f);
key.c2 = k.getFloat("c2", 0f);
key.c3 = k.getFloat("c3", 0f);
key.c4 = k.getFloat("c4", 0f);
String name = k.getParent().getAttribute("name");
timeline.setName(name);
if(obj != null){
Bone bone = new Bone();
bone.setAngle(new BigDecimal(obj.getFloat("angle", 0f)));
bone.setX(new BigDecimal(obj.getFloat("x", 0f)));
bone.setY(new BigDecimal(obj.getFloat("y", 0f)));
bone.setScaleX(new BigDecimal(obj.getFloat("scale_x", 1f)));
bone.setScaleY(new BigDecimal(obj.getFloat("scale_y", 1f)));
key.setBone(bone);
}
else{
AnimationObject object = new AnimationObject();
obj = k.getChildByName("object");
object.setAngle(new BigDecimal(obj.getFloat("angle", 0f)));
object.setA(new BigDecimal(obj.getFloat("a", 1f)));
object.setX(new BigDecimal(obj.getFloat("x", 0f)));
object.setY(new BigDecimal(obj.getFloat("y", 0f)));
object.setScaleX(new BigDecimal(obj.getFloat("scale_x", 1f)));
object.setScaleY(new BigDecimal(obj.getFloat("scale_y", 1f)));
object.setFolder(obj.getInt("folder", -1));
object.setFile(obj.getInt("file", -1));
ObjectInfoType type = ObjectInfoType.getObjectInfoFor(timeline.objectType);
if(type == ObjectInfoType.Point)
object.info = new ObjectInfo(timeline.getName(), type, 10f,10f);
if(object.getFile() != -1 && object.getFolder() != -1){
File f = data.getFolder().get(object.getFolder()).getFile().get(object.getFile());
object.setPivotX(new BigDecimal(obj.getFloat("pivot_x", f.getPivotX())));
object.setPivotY(new BigDecimal(obj.getFloat("pivot_y", f.getPivotY())));
} else{
object.setPivotX(new BigDecimal(obj.getFloat("pivot_x", .5f)));
object.setPivotY(new BigDecimal(obj.getFloat("pivot_y", .5f)));
}
key.getObject().add(object);
}
timeline.getKey().add(key);
}
}
public SpriterData getCurrentSpriterData(){
return data;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy