package com.overlap2d.extensions.spine; import com.badlogic.ashley.core.Component; import com.badlogic.gdx.utils.Array; import com.esotericsoftware.spine.*; import com.esotericsoftware.spine.attachments.Attachment; import com.esotericsoftware.spine.attachments.MeshAttachment; import com.esotericsoftware.spine.attachments.RegionAttachment; import com.uwsoft.editor.renderer.components.DimensionsComponent; public class SpineObjectComponent implements Component { public SkeletonData skeletonData; public Skeleton skeleton; public SkeletonJson skeletonJson; public AnimationState state; public float minX; public float minY; public Array<Animation> getAnimations() { return skeletonData.getAnimations(); } public void setAnimation(String animName) { state.setAnimation(0, animName, true); } public AnimationState getState() { return state; } public void computeBoundBox(DimensionsComponent dimensionsComponent) { skeleton.updateWorldTransform(); minX = Float.MAX_VALUE; minY = Float.MAX_VALUE; float maxX = Float.MIN_VALUE, maxY = Float.MIN_VALUE; for (int i = 0, n = skeleton.getSlots().size; i < n; i++) { Slot slot = skeleton.getSlots().get(i); Attachment attachment = slot.getAttachment(); if (attachment == null) continue; if (!((attachment instanceof RegionAttachment) || (attachment instanceof MeshAttachment))) continue; float[] vertices = new float[0]; if ((attachment instanceof RegionAttachment)) { RegionAttachment region = (RegionAttachment) attachment; region.updateWorldVertices(slot, false); vertices = region.getWorldVertices(); } if ((attachment instanceof MeshAttachment)) { MeshAttachment region = (MeshAttachment) attachment; region.updateWorldVertices(slot, false); vertices = region.getWorldVertices(); } for (int ii = 0, nn = vertices.length; ii < nn; ii += 5) { minX = Math.min(minX, vertices[ii]); minY = Math.min(minY, vertices[ii + 1]); maxX = Math.max(maxX, vertices[ii]); maxY = Math.max(maxY, vertices[ii + 1]); } } dimensionsComponent.width = (maxX - minX); dimensionsComponent.height = (maxY - minY); } }