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