package com.overlap2d.extensions.spine;
import com.badlogic.ashley.core.ComponentMapper;
import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem;
import com.uwsoft.editor.renderer.components.ParentNodeComponent;
import com.uwsoft.editor.renderer.components.SpineDataComponent;
import com.uwsoft.editor.renderer.components.TransformComponent;
public class SpineSystem extends IteratingSystem {
private ComponentMapper<SpineObjectComponent> spineObjectComponentMapper = ComponentMapper.getFor(SpineObjectComponent.class);
private ComponentMapper<TransformComponent> transformComponentMapper = ComponentMapper.getFor(TransformComponent.class);
public SpineSystem() {
super(Family.all(SpineDataComponent.class).get());
}
@Override
protected void processEntity(Entity entity, float deltaTime) {
TransformComponent transformComponent = transformComponentMapper.get(entity);
SpineObjectComponent spineObjectComponent = spineObjectComponentMapper.get(entity);
ParentNodeComponent parentNodeComponent = entity.getComponent(ParentNodeComponent.class);
Entity parentEntity = parentNodeComponent.parentEntity;
TransformComponent parentTransformComponent = transformComponentMapper.get(parentEntity);
float offsetX = 0;
float offsetY = 0;
if (parentTransformComponent.scaleX == 1 && parentTransformComponent.scaleY == 1 && parentTransformComponent.rotation == 0) {
offsetX = parentTransformComponent.x;
offsetY = parentTransformComponent.y;
while (true) {
parentNodeComponent = parentEntity.getComponent(ParentNodeComponent.class);
if (parentNodeComponent == null) {
break;
}
parentEntity = parentNodeComponent.parentEntity;
if (parentEntity == null) {
break;
}
parentTransformComponent = transformComponentMapper.get(parentEntity);
offsetX += parentTransformComponent.x;
offsetY += parentTransformComponent.y;
}
}
spineObjectComponent.skeleton.updateWorldTransform(); //
spineObjectComponent.state.update(deltaTime); // Update the animation time.
spineObjectComponent.state.apply(spineObjectComponent.skeleton); // Poses skeleton using current animations. This sets the bones' local SRT.
spineObjectComponent.skeleton.setPosition(transformComponent.x - spineObjectComponent.minX + offsetX, transformComponent.y - spineObjectComponent.minY + offsetY);
}
}