This commit is contained in:
ww-rm
2025-03-14 18:55:56 +08:00
parent 2bf2509df7
commit 32fde582fc

View File

@@ -62,20 +62,18 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
private void ReadStrings() private void ReadStrings()
{ {
int count = reader.ReadVarInt(); for (int n = reader.ReadVarInt(); n > 0; n--)
for (int i = 0; i < count; i++)
reader.StringTable.Add(reader.ReadString()); reader.StringTable.Add(reader.ReadString());
} }
private JsonArray ReadBones() private JsonArray ReadBones()
{ {
JsonArray bones = []; JsonArray bones = [];
int count = reader.ReadVarInt(); for (int i = 0, n = reader.ReadVarInt(); i < n; i++)
for (int i = 0; i < count; i++)
{ {
JsonObject data = []; JsonObject data = [];
data["name"] = reader.ReadString(); data["name"] = reader.ReadString();
if (i != 0) data["parent"] = bones[reader.ReadVarInt()]["name"].GetValue<string>(); if (i > 0) data["parent"] = bones[reader.ReadVarInt()]["name"].GetValue<string>();
data["rotation"] = reader.ReadFloat(); data["rotation"] = reader.ReadFloat();
data["x"] = reader.ReadFloat(); data["x"] = reader.ReadFloat();
data["y"] = reader.ReadFloat(); data["y"] = reader.ReadFloat();
@@ -96,8 +94,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
{ {
JsonArray bones = root["bones"].AsArray(); JsonArray bones = root["bones"].AsArray();
JsonArray slots = []; JsonArray slots = [];
int count = reader.ReadVarInt(); for (int n = reader.ReadVarInt(); n > 0; n--)
for (int i = 0; i < count; i++)
{ {
JsonObject data = []; JsonObject data = [];
data["name"] = reader.ReadString(); data["name"] = reader.ReadString();
@@ -116,16 +113,13 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
{ {
JsonArray bones = root["bones"].AsArray(); JsonArray bones = root["bones"].AsArray();
JsonArray ik = []; JsonArray ik = [];
int count = reader.ReadVarInt(); for (int n = reader.ReadVarInt(); n > 0; n--)
for (int i = 0, bonesCount; i < count; i++)
{ {
JsonObject data = []; JsonObject data = [];
data["name"] = reader.ReadString(); data["name"] = reader.ReadString();
data["order"] = reader.ReadVarInt(); data["order"] = reader.ReadVarInt();
data["skin"] = reader.ReadBoolean(); data["skin"] = reader.ReadBoolean();
JsonArray bonesArray = []; bonesCount = reader.ReadVarInt(); data["bones"] = ReadNames(bones);
for (int j = 0; j < bonesCount; j++) bonesArray.Add(bones[reader.ReadVarInt()]["name"].GetValue<string>());
data["bones"] = bonesArray;
data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>(); data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>();
data["mix"] = reader.ReadFloat(); data["mix"] = reader.ReadFloat();
data["softness"] = reader.ReadFloat(); data["softness"] = reader.ReadFloat();
@@ -142,16 +136,13 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
{ {
JsonArray bones = root["bones"].AsArray(); JsonArray bones = root["bones"].AsArray();
JsonArray transform = []; JsonArray transform = [];
int count = reader.ReadVarInt(); for (int n = reader.ReadVarInt(); n > 0; n--)
for (int i = 0, bonesCount; i < count; i++)
{ {
JsonObject data = []; JsonObject data = [];
data["name"] = reader.ReadString(); data["name"] = reader.ReadString();
data["order"] = reader.ReadVarInt(); data["order"] = reader.ReadVarInt();
data["skin"] = reader.ReadBoolean(); data["skin"] = reader.ReadBoolean();
JsonArray bonesArray = []; bonesCount = reader.ReadVarInt(); data["bones"] = ReadNames(bones);
for (int j = 0; j < bonesCount; j++) bonesArray.Add(bones[reader.ReadVarInt()]["name"].GetValue<string>());
data["bones"] = bonesArray;
data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>(); data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>();
data["local"] = reader.ReadBoolean(); data["local"] = reader.ReadBoolean();
data["relative"] = reader.ReadBoolean(); data["relative"] = reader.ReadBoolean();
@@ -174,16 +165,13 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
{ {
JsonArray bones = root["bones"].AsArray(); JsonArray bones = root["bones"].AsArray();
JsonArray path = []; JsonArray path = [];
int count = reader.ReadVarInt(); for (int n = reader.ReadVarInt(); n > 0; n--)
for (int i = 0, bonesCount; i < count; i++)
{ {
JsonObject data = []; JsonObject data = [];
data["name"] = reader.ReadString(); data["name"] = reader.ReadString();
data["order"] = reader.ReadVarInt(); data["order"] = reader.ReadVarInt();
data["skin"] = reader.ReadBoolean(); data["skin"] = reader.ReadBoolean();
JsonArray bonesArray = []; bonesCount = reader.ReadVarInt(); data["bones"] = ReadNames(bones);
for (int j = 0; j < bonesCount; j++) bonesArray.Add(bones[reader.ReadVarInt()]["name"].GetValue<string>());
data["bones"] = bonesArray;
data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>(); data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>();
data["positionMode"] = ((PositionMode)reader.ReadVarInt()).ToString(); data["positionMode"] = ((PositionMode)reader.ReadVarInt()).ToString();
data["spacingMode"] = ((SpacingMode)reader.ReadVarInt()).ToString(); data["spacingMode"] = ((SpacingMode)reader.ReadVarInt()).ToString();
@@ -207,8 +195,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
skins.Add(data); skins.Add(data);
// other skins // other skins
int count = reader.ReadVarInt(); for (int n = reader.ReadVarInt(); n > 0; n--)
for (int i = 0; i < count; i++)
skins.Add(ReadSkin()); skins.Add(ReadSkin());
return skins; return skins;
@@ -217,52 +204,34 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
private JsonObject? ReadSkin(bool isDefault = false) private JsonObject? ReadSkin(bool isDefault = false)
{ {
JsonObject skin = []; JsonObject skin = [];
int count = 0; int count;
if (isDefault) if (isDefault)
{ {
// 这里固定有一个给 default 的 count 值, 算是占位符, 如果是 0 则表示没有 default 的 skin // 这里固定有一个给 default 的 count 值, 算是占位符, 如果是 0 则表示没有 default 的 skin
skin["name"] = "default";
count = reader.ReadVarInt(); count = reader.ReadVarInt();
if (count <= 0) return null; if (count <= 0) return null;
skin["name"] = "default";
} }
else else
{ {
skin["name"] = reader.ReadStringRef(); skin["name"] = reader.ReadStringRef();
skin["bones"] = ReadNames(root["bones"].AsArray());
JsonArray bones = root["bones"].AsArray(); skin["ik"] = ReadNames(root["ik"].AsArray());
JsonArray bonesArray = []; count = reader.ReadVarInt(); skin["transform"] = ReadNames(root["transform"].AsArray()); ;
for (int i = 0; i < count; i++) bonesArray.Add(bones[reader.ReadVarInt()]["name"].GetValue<string>()); skin["path"] = ReadNames(root["path"].AsArray()); ;
skin["bones"] = bonesArray;
JsonArray ik = root["ik"].AsArray();
JsonArray ikArray = []; count = reader.ReadVarInt();
for (int i = 0; i < count; i++) ikArray.Add(ik[reader.ReadVarInt()]["name"].GetValue<string>());
skin["ik"] = ikArray;
JsonArray transform = root["transform"].AsArray();
JsonArray transformArray = []; count = reader.ReadVarInt();
for (int i = 0; i < count; i++) transformArray.Add(transform[reader.ReadVarInt()]["name"].GetValue<string>());
skin["transform"] = transformArray;
JsonArray path = root["path"].AsArray();
JsonArray pathArray = []; count = reader.ReadVarInt();
for (int i = 0; i < count; i++) pathArray.Add(path[reader.ReadVarInt()]["name"].GetValue<string>());
skin["path"] = pathArray;
count = reader.ReadVarInt(); count = reader.ReadVarInt();
} }
JsonArray slots = root["slots"].AsArray(); JsonArray slots = root["slots"].AsArray();
JsonObject attachments = []; JsonObject attachments = [];
for (int i = 0; i < count; i++) while (count-- > 0)
{ {
JsonObject data = []; JsonObject data = [];
attachments[slots[reader.ReadVarInt()]["name"].GetValue<string>()] = data; attachments[slots[reader.ReadVarInt()]["name"].GetValue<string>()] = data;
for (int j = 0, attachmentCount = reader.ReadVarInt(); j < attachmentCount; j++) for (int n = reader.ReadVarInt(); n > 0; n--)
{ {
var attachmentName = reader.ReadStringRef(); var attachmentName = reader.ReadStringRef();
var attachment = ReadAttachment(attachmentName); data[attachmentName] = ReadAttachment(attachmentName);
if (attachment is not null) data[attachmentName] = attachment;
} }
} }
skin["attachments"] = attachments; skin["attachments"] = attachments;
@@ -270,11 +239,11 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
return skin; return skin;
} }
private JsonObject? ReadAttachment(string keyName) private JsonObject ReadAttachment(string keyName)
{ {
JsonArray slots = root["slots"].AsArray(); JsonArray slots = root["slots"].AsArray();
JsonObject attachment = []; JsonObject attachment = [];
int vertexCount = 0; int vertexCount;
string name = reader.ReadStringRef() ?? keyName; string name = reader.ReadStringRef() ?? keyName;
var type = (AttachmentType)reader.ReadByte(); var type = (AttachmentType)reader.ReadByte();
@@ -292,13 +261,13 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
attachment["width"] = reader.ReadFloat(); attachment["width"] = reader.ReadFloat();
attachment["height"] = reader.ReadFloat(); attachment["height"] = reader.ReadFloat();
attachment["color"] = reader.ReadInt().ToString("x8"); attachment["color"] = reader.ReadInt().ToString("x8");
return attachment; break;
case AttachmentType.Boundingbox: case AttachmentType.Boundingbox:
vertexCount = reader.ReadVarInt(); vertexCount = reader.ReadVarInt();
attachment["vertexCount"] = vertexCount; attachment["vertexCount"] = vertexCount;
attachment["vertices"] = ReadVertices(vertexCount); attachment["vertices"] = ReadVertices(vertexCount);
if (nonessential) reader.ReadInt(); if (nonessential) reader.ReadInt();
return attachment; break;
case AttachmentType.Mesh: case AttachmentType.Mesh:
attachment["path"] = reader.ReadStringRef(); attachment["path"] = reader.ReadStringRef();
attachment["color"] = reader.ReadInt().ToString("x8"); attachment["color"] = reader.ReadInt().ToString("x8");
@@ -313,7 +282,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
attachment["width"] = reader.ReadFloat(); attachment["width"] = reader.ReadFloat();
attachment["height"] = reader.ReadFloat(); attachment["height"] = reader.ReadFloat();
} }
return attachment; break;
case AttachmentType.Linkedmesh: case AttachmentType.Linkedmesh:
attachment["path"] = reader.ReadStringRef(); attachment["path"] = reader.ReadStringRef();
attachment["color"] = reader.ReadInt().ToString("x8"); attachment["color"] = reader.ReadInt().ToString("x8");
@@ -329,7 +298,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
attachment["uvs"] = new JsonArray(); attachment["uvs"] = new JsonArray();
attachment["triangles"] = new JsonArray(); attachment["triangles"] = new JsonArray();
attachment["vertices"] = new JsonArray(); attachment["vertices"] = new JsonArray();
return attachment; break;
case AttachmentType.Path: case AttachmentType.Path:
attachment["closed"] = reader.ReadBoolean(); attachment["closed"] = reader.ReadBoolean();
attachment["constantSpeed"] = reader.ReadBoolean(); attachment["constantSpeed"] = reader.ReadBoolean();
@@ -338,29 +307,30 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
attachment["vertices"] = ReadVertices(vertexCount); attachment["vertices"] = ReadVertices(vertexCount);
attachment["lengths"] = ReadFloatArray(vertexCount / 3); attachment["lengths"] = ReadFloatArray(vertexCount / 3);
if (nonessential) reader.ReadInt(); if (nonessential) reader.ReadInt();
return attachment; break;
case AttachmentType.Point: case AttachmentType.Point:
attachment["rotation"] = reader.ReadFloat(); attachment["rotation"] = reader.ReadFloat();
attachment["x"] = reader.ReadFloat(); attachment["x"] = reader.ReadFloat();
attachment["y"] = reader.ReadFloat(); attachment["y"] = reader.ReadFloat();
if (nonessential) reader.ReadInt(); if (nonessential) reader.ReadInt();
return attachment; break;
case AttachmentType.Clipping: case AttachmentType.Clipping:
attachment["end"] = slots[reader.ReadVarInt()]["name"].GetValue<string>(); attachment["end"] = slots[reader.ReadVarInt()]["name"].GetValue<string>();
vertexCount = reader.ReadVarInt(); vertexCount = reader.ReadVarInt();
attachment["vertexCount"] = vertexCount; attachment["vertexCount"] = vertexCount;
attachment["vertices"] = ReadVertices(vertexCount); attachment["vertices"] = ReadVertices(vertexCount);
if (nonessential) reader.ReadInt(); if (nonessential) reader.ReadInt();
return attachment; break;
default:
throw new ArgumentException($"Invalid attachment type: {type}");
} }
return null; return attachment;
} }
private JsonObject ReadEvents() private JsonObject ReadEvents()
{ {
JsonObject events = []; JsonObject events = [];
int count = reader.ReadVarInt(); for (int n = reader.ReadVarInt(); n > 0; n--)
for (int i = 0; i < count; i++)
{ {
JsonObject data = []; JsonObject data = [];
events[reader.ReadStringRef()] = data; events[reader.ReadStringRef()] = data;
@@ -381,32 +351,38 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
private JsonObject ReadAnimations() private JsonObject ReadAnimations()
{ {
JsonObject animations = []; JsonObject animations = [];
int count = reader.ReadVarInt(); for (int n = reader.ReadVarInt(); n > 0; n--)
for (int i = 0; i < count; i++)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
return animations; return animations;
} }
public JsonArray ReadFloatArray(int length) private JsonArray ReadNames(JsonArray array)
{
JsonArray names = [];
for (int n = reader.ReadVarInt(); n > 0; n--)
names.Add(array[reader.ReadVarInt()]["name"].GetValue<string>());
return names;
}
private JsonArray ReadFloatArray(int n)
{ {
JsonArray array = []; JsonArray array = [];
for (int i = 0; i < length; i++) while (n-- > 0)
array.Add(reader.ReadFloat()); array.Add(reader.ReadFloat());
return array; return array;
} }
public JsonArray ReadShortArray() private JsonArray ReadShortArray()
{ {
JsonArray array = []; JsonArray array = [];
int length = reader.ReadVarInt(); for (int n = reader.ReadVarInt(); n > 0; n--)
for (int i = 0; i < length; i++)
array.Add((reader.ReadByte() << 8) | reader.ReadByte()); array.Add((reader.ReadByte() << 8) | reader.ReadByte());
return array; return array;
} }
public JsonArray ReadVertices(int vertexCount) private JsonArray ReadVertices(int vertexCount)
{ {
JsonArray vertices = []; JsonArray vertices = [];
if (!reader.ReadBoolean()) if (!reader.ReadBoolean())