public SkeletonData ReadSkeletonData(Stream input)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
float scale = this.Scale;
SkeletonData skeletonData = new SkeletonData();
skeletonData.hash = this.ReadString(input);
if (skeletonData.hash.Length == 0)
{
skeletonData.hash = null;
}
skeletonData.version = this.ReadString(input);
if (skeletonData.version.Length == 0)
{
skeletonData.version = null;
}
skeletonData.width = this.ReadFloat(input);
skeletonData.height = this.ReadFloat(input);
bool flag = SkeletonBinary.ReadBoolean(input);
if (flag)
{
skeletonData.imagesPath = this.ReadString(input);
if (skeletonData.imagesPath.Length == 0)
{
skeletonData.imagesPath = null;
}
}
int i = 0;
int num = SkeletonBinary.ReadVarint(input, true);
while (i < num)
{
string name = this.ReadString(input);
BoneData parent = (i != 0) ? skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)] : null;
BoneData boneData = new BoneData(i, name, parent);
boneData.rotation = this.ReadFloat(input);
boneData.x = this.ReadFloat(input) * scale;
boneData.y = this.ReadFloat(input) * scale;
boneData.scaleX = this.ReadFloat(input);
boneData.scaleY = this.ReadFloat(input);
boneData.shearX = this.ReadFloat(input);
boneData.shearY = this.ReadFloat(input);
boneData.length = this.ReadFloat(input) * scale;
boneData.inheritRotation = SkeletonBinary.ReadBoolean(input);
boneData.inheritScale = SkeletonBinary.ReadBoolean(input);
if (flag)
{
SkeletonBinary.ReadInt(input);
}
skeletonData.bones.Add(boneData);
i++;
}
int j = 0;
int num2 = SkeletonBinary.ReadVarint(input, true);
while (j < num2)
{
string name2 = this.ReadString(input);
BoneData boneData2 = skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)];
SlotData slotData = new SlotData(j, name2, boneData2);
int num3 = SkeletonBinary.ReadInt(input);
slotData.r = (float)((num3 & 4278190080u) >> 24) / 255f;
slotData.g = (float)((num3 & 16711680) >> 16) / 255f;
slotData.b = (float)((num3 & 65280) >> 8) / 255f;
slotData.a = (float)(num3 & 255) / 255f;
slotData.attachmentName = this.ReadString(input);
slotData.blendMode = (BlendMode)SkeletonBinary.ReadVarint(input, true);
skeletonData.slots.Add(slotData);
j++;
}
int k = 0;
int num4 = SkeletonBinary.ReadVarint(input, true);
while (k < num4)
{
IkConstraintData ikConstraintData = new IkConstraintData(this.ReadString(input));
int l = 0;
int num5 = SkeletonBinary.ReadVarint(input, true);
while (l < num5)
{
ikConstraintData.bones.Add(skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)]);
l++;
}
ikConstraintData.target = skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)];
ikConstraintData.mix = this.ReadFloat(input);
ikConstraintData.bendDirection = (int)SkeletonBinary.ReadSByte(input);
skeletonData.ikConstraints.Add(ikConstraintData);
k++;
}
int m = 0;
int num6 = SkeletonBinary.ReadVarint(input, true);
while (m < num6)
{
TransformConstraintData transformConstraintData = new TransformConstraintData(this.ReadString(input));
int n = 0;
int num7 = SkeletonBinary.ReadVarint(input, true);
while (n < num7)
{
transformConstraintData.bones.Add(skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)]);
n++;
}
transformConstraintData.target = skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)];
transformConstraintData.offsetRotation = this.ReadFloat(input);
transformConstraintData.offsetX = this.ReadFloat(input) * scale;
transformConstraintData.offsetY = this.ReadFloat(input) * scale;
transformConstraintData.offsetScaleX = this.ReadFloat(input);
transformConstraintData.offsetScaleY = this.ReadFloat(input);
transformConstraintData.offsetShearY = this.ReadFloat(input);
transformConstraintData.rotateMix = this.ReadFloat(input);
transformConstraintData.translateMix = this.ReadFloat(input);
transformConstraintData.scaleMix = this.ReadFloat(input);
transformConstraintData.shearMix = this.ReadFloat(input);
skeletonData.transformConstraints.Add(transformConstraintData);
m++;
}
int num8 = 0;
int num9 = SkeletonBinary.ReadVarint(input, true);
while (num8 < num9)
{
PathConstraintData pathConstraintData = new PathConstraintData(this.ReadString(input));
int num10 = 0;
int num11 = SkeletonBinary.ReadVarint(input, true);
while (num10 < num11)
{
pathConstraintData.bones.Add(skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)]);
num10++;
}
pathConstraintData.target = skeletonData.slots.Items[SkeletonBinary.ReadVarint(input, true)];
pathConstraintData.positionMode = (PositionMode)Enum.GetValues(typeof(PositionMode)).GetValue(SkeletonBinary.ReadVarint(input, true));
pathConstraintData.spacingMode = (SpacingMode)Enum.GetValues(typeof(SpacingMode)).GetValue(SkeletonBinary.ReadVarint(input, true));
pathConstraintData.rotateMode = (RotateMode)Enum.GetValues(typeof(RotateMode)).GetValue(SkeletonBinary.ReadVarint(input, true));
pathConstraintData.offsetRotation = this.ReadFloat(input);
pathConstraintData.position = this.ReadFloat(input);
if (pathConstraintData.positionMode == PositionMode.Fixed)
{
pathConstraintData.position *= scale;
}
pathConstraintData.spacing = this.ReadFloat(input);
if (pathConstraintData.spacingMode == SpacingMode.Length || pathConstraintData.spacingMode == SpacingMode.Fixed)
{
pathConstraintData.spacing *= scale;
}
pathConstraintData.rotateMix = this.ReadFloat(input);
pathConstraintData.translateMix = this.ReadFloat(input);
skeletonData.pathConstraints.Add(pathConstraintData);
num8++;
}
Skin skin = this.ReadSkin(input, "default", flag);
if (skin != null)
{
skeletonData.defaultSkin = skin;
skeletonData.skins.Add(skin);
}
int num12 = 0;
int num13 = SkeletonBinary.ReadVarint(input, true);
while (num12 < num13)
{
skeletonData.skins.Add(this.ReadSkin(input, this.ReadString(input), flag));
num12++;
}
int num14 = 0;
int count = this.linkedMeshes.Count;
while (num14 < count)
{
SkeletonJson.LinkedMesh linkedMesh = this.linkedMeshes[num14];
Skin skin2 = (linkedMesh.skin != null) ? skeletonData.FindSkin(linkedMesh.skin) : skeletonData.DefaultSkin;
if (skin2 == null)
{
throw new Exception("Skin not found: " + linkedMesh.skin);
}
Attachment attachment = skin2.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent);
if (attachment == null)
{
throw new Exception("Parent mesh not found: " + linkedMesh.parent);
}
linkedMesh.mesh.ParentMesh = (MeshAttachment)attachment;
linkedMesh.mesh.UpdateUVs();
num14++;
}
this.linkedMeshes.Clear();
int num15 = 0;
int num16 = SkeletonBinary.ReadVarint(input, true);
while (num15 < num16)
{
EventData eventData = new EventData(this.ReadString(input));
eventData.Int = SkeletonBinary.ReadVarint(input, false);
eventData.Float = this.ReadFloat(input);
eventData.String = this.ReadString(input);
skeletonData.events.Add(eventData);
num15++;
}
int num17 = 0;
int num18 = SkeletonBinary.ReadVarint(input, true);
while (num17 < num18)
{
this.ReadAnimation(this.ReadString(input), input, skeletonData);
num17++;
}
skeletonData.bones.TrimExcess();
skeletonData.slots.TrimExcess();
skeletonData.skins.TrimExcess();
skeletonData.events.TrimExcess();
skeletonData.animations.TrimExcess();
skeletonData.ikConstraints.TrimExcess();
skeletonData.pathConstraints.TrimExcess();
return(skeletonData);
}