修改类型转换

This commit is contained in:
ww-rm
2025-03-18 13:52:58 +08:00
parent 2dbc235631
commit b3e1b7c902

View File

@@ -7,6 +7,7 @@ using SpineRuntime38;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Nodes; using System.Text.Json.Nodes;
using SpineRuntime38.Attachments; using SpineRuntime38.Attachments;
using System.Globalization;
namespace SpineViewer.Spine.Implementations.SkeletonConverter namespace SpineViewer.Spine.Implementations.SkeletonConverter
{ {
@@ -78,7 +79,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
{ {
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"] = (string)bones[reader.ReadVarInt()]["name"];
data["rotation"] = reader.ReadFloat(); data["rotation"] = reader.ReadFloat();
data["x"] = reader.ReadFloat(); data["x"] = reader.ReadFloat();
data["y"] = reader.ReadFloat(); data["y"] = reader.ReadFloat();
@@ -103,7 +104,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
{ {
JsonObject data = []; JsonObject data = [];
data["name"] = reader.ReadString(); data["name"] = reader.ReadString();
data["bone"] = bones[reader.ReadVarInt()]["name"].GetValue<string>(); data["bone"] = (string)bones[reader.ReadVarInt()]["name"];
data["color"] = reader.ReadInt().ToString("x8"); // 0xrrggbbaa -> rrggbbaa data["color"] = reader.ReadInt().ToString("x8"); // 0xrrggbbaa -> rrggbbaa
int dark = reader.ReadInt(); int dark = reader.ReadInt();
if (dark != -1) data["dark"] = dark.ToString("x6"); // 0x00rrggbb -> rrggbb if (dark != -1) data["dark"] = dark.ToString("x6"); // 0x00rrggbb -> rrggbb
@@ -125,7 +126,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
data["order"] = reader.ReadVarInt(); data["order"] = reader.ReadVarInt();
data["skin"] = reader.ReadBoolean(); data["skin"] = reader.ReadBoolean();
data["bones"] = ReadNames(bones); data["bones"] = ReadNames(bones);
data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>(); data["target"] = (string)bones[reader.ReadVarInt()]["name"];
data["mix"] = reader.ReadFloat(); data["mix"] = reader.ReadFloat();
data["softness"] = reader.ReadFloat(); data["softness"] = reader.ReadFloat();
data["bendPositive"] = reader.ReadSByte() > 0; data["bendPositive"] = reader.ReadSByte() > 0;
@@ -148,7 +149,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
data["order"] = reader.ReadVarInt(); data["order"] = reader.ReadVarInt();
data["skin"] = reader.ReadBoolean(); data["skin"] = reader.ReadBoolean();
data["bones"] = ReadNames(bones); data["bones"] = ReadNames(bones);
data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>(); data["target"] = (string)bones[reader.ReadVarInt()]["name"];
data["local"] = reader.ReadBoolean(); data["local"] = reader.ReadBoolean();
data["relative"] = reader.ReadBoolean(); data["relative"] = reader.ReadBoolean();
data["rotation"] = reader.ReadFloat(); data["rotation"] = reader.ReadFloat();
@@ -177,7 +178,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
data["order"] = reader.ReadVarInt(); data["order"] = reader.ReadVarInt();
data["skin"] = reader.ReadBoolean(); data["skin"] = reader.ReadBoolean();
data["bones"] = ReadNames(bones); data["bones"] = ReadNames(bones);
data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>(); data["target"] = (string)bones[reader.ReadVarInt()]["name"];
data["positionMode"] = ((PositionMode)reader.ReadVarInt()).ToString(); data["positionMode"] = ((PositionMode)reader.ReadVarInt()).ToString();
data["spacingMode"] = ((SpacingMode)reader.ReadVarInt()).ToString(); data["spacingMode"] = ((SpacingMode)reader.ReadVarInt()).ToString();
data["rotateMode"] = ((RotateMode)reader.ReadVarInt()).ToString(); data["rotateMode"] = ((RotateMode)reader.ReadVarInt()).ToString();
@@ -232,7 +233,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
while (slotCount-- > 0) while (slotCount-- > 0)
{ {
JsonObject slotAttachments = []; JsonObject slotAttachments = [];
skinAttachments[slots[reader.ReadVarInt()]["name"].GetValue<string>()] = slotAttachments; skinAttachments[(string)slots[reader.ReadVarInt()]["name"]] = slotAttachments;
for (int attachmentCount = reader.ReadVarInt(); attachmentCount > 0; attachmentCount--) for (int attachmentCount = reader.ReadVarInt(); attachmentCount > 0; attachmentCount--)
{ {
var attachmentKey = reader.ReadStringRef(); var attachmentKey = reader.ReadStringRef();
@@ -324,7 +325,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
if (nonessential) reader.ReadInt(); if (nonessential) reader.ReadInt();
break; break;
case AttachmentType.Clipping: case AttachmentType.Clipping:
attachment["end"] = slots[reader.ReadVarInt()]["name"].GetValue<string>(); attachment["end"] = (string)slots[reader.ReadVarInt()]["name"];
vertexCount = reader.ReadVarInt(); vertexCount = reader.ReadVarInt();
attachment["vertexCount"] = vertexCount; attachment["vertexCount"] = vertexCount;
attachment["vertices"] = ReadVertices(vertexCount); attachment["vertices"] = ReadVertices(vertexCount);
@@ -387,7 +388,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
for (int slotCount = reader.ReadVarInt(); slotCount > 0; slotCount--) for (int slotCount = reader.ReadVarInt(); slotCount > 0; slotCount--)
{ {
JsonObject timeline = []; JsonObject timeline = [];
slotTimelines[slots[reader.ReadVarInt()]["name"].GetValue<string>()] = timeline; slotTimelines[(string)slots[reader.ReadVarInt()]["name"]] = timeline;
for (int timelineCount = reader.ReadVarInt(); timelineCount > 0; timelineCount--) for (int timelineCount = reader.ReadVarInt(); timelineCount > 0; timelineCount--)
{ {
JsonArray frames = []; JsonArray frames = [];
@@ -450,7 +451,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
for (int boneCount = reader.ReadVarInt(); boneCount > 0; boneCount--) for (int boneCount = reader.ReadVarInt(); boneCount > 0; boneCount--)
{ {
JsonObject timeline = []; JsonObject timeline = [];
boneTimelines[bones[reader.ReadVarInt()]["name"].GetValue<string>()] = timeline; boneTimelines[(string)bones[reader.ReadVarInt()]["name"]] = timeline;
for (int timelineCount = reader.ReadVarInt(); timelineCount > 0; timelineCount--) for (int timelineCount = reader.ReadVarInt(); timelineCount > 0; timelineCount--)
{ {
JsonArray frames = []; JsonArray frames = [];
@@ -530,7 +531,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
for (int ikCount = reader.ReadVarInt(); ikCount > 0; ikCount--) for (int ikCount = reader.ReadVarInt(); ikCount > 0; ikCount--)
{ {
JsonArray frames = []; JsonArray frames = [];
ikTimelines[ik[reader.ReadVarInt()]["name"].GetValue<string>()] = frames; ikTimelines[(string)ik[reader.ReadVarInt()]["name"]] = frames;
for (int frameCount = reader.ReadVarInt(); frameCount > 0; frameCount--) for (int frameCount = reader.ReadVarInt(); frameCount > 0; frameCount--)
{ {
var o = new JsonObject() var o = new JsonObject()
@@ -558,7 +559,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
for (int transformCount = reader.ReadVarInt(); transformCount > 0; transformCount--) for (int transformCount = reader.ReadVarInt(); transformCount > 0; transformCount--)
{ {
JsonArray frames = []; JsonArray frames = [];
transformTimelines[transform[reader.ReadVarInt()]["name"].GetValue<string>()] = frames; transformTimelines[(string)transform[reader.ReadVarInt()]["name"]] = frames;
for (int frameCount = reader.ReadVarInt(); frameCount > 0; frameCount--) for (int frameCount = reader.ReadVarInt(); frameCount > 0; frameCount--)
{ {
var o = new JsonObject() var o = new JsonObject()
@@ -585,7 +586,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
for (int pathCount = reader.ReadVarInt(); pathCount > 0; pathCount--) for (int pathCount = reader.ReadVarInt(); pathCount > 0; pathCount--)
{ {
JsonObject timeline = []; JsonObject timeline = [];
pathTimelines[path[reader.ReadVarInt()]["name"].GetValue<string>()] = timeline; pathTimelines[(string)path[reader.ReadVarInt()]["name"]] = timeline;
for (int timelineCount = reader.ReadVarInt(); timelineCount > 0; timelineCount--) for (int timelineCount = reader.ReadVarInt(); timelineCount > 0; timelineCount--)
{ {
JsonArray frames = []; JsonArray frames = [];
@@ -649,11 +650,11 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
for (int skinCount = reader.ReadVarInt(); skinCount > 0; skinCount--) for (int skinCount = reader.ReadVarInt(); skinCount > 0; skinCount--)
{ {
JsonObject skinValue = []; JsonObject skinValue = [];
deformTimelines[skins[reader.ReadVarInt()]["name"].GetValue<string>()] = skinValue; deformTimelines[(string)skins[reader.ReadVarInt()]["name"]] = skinValue;
for (int slotCount = reader.ReadVarInt(); slotCount > 0; slotCount--) for (int slotCount = reader.ReadVarInt(); slotCount > 0; slotCount--)
{ {
JsonObject slotValue = []; JsonObject slotValue = [];
skinValue[slots[reader.ReadVarInt()]["name"].GetValue<string>()] = slotValue; skinValue[(string)slots[reader.ReadVarInt()]["name"]] = slotValue;
for (int attachmentCount = reader.ReadVarInt(); attachmentCount > 0; attachmentCount--) for (int attachmentCount = reader.ReadVarInt(); attachmentCount > 0; attachmentCount--)
{ {
JsonArray frames = []; JsonArray frames = [];
@@ -698,7 +699,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
{ {
offsets.Add(new JsonObject() offsets.Add(new JsonObject()
{ {
["slot"] = slots[reader.ReadVarInt()]["name"].GetValue<string>(), ["slot"] = (string)slots[reader.ReadVarInt()]["name"],
["offset"] = reader.ReadVarInt(), ["offset"] = reader.ReadVarInt(),
}); });
} }
@@ -716,14 +717,14 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
JsonObject data = []; JsonObject data = [];
data["time"] = reader.ReadFloat(); data["time"] = reader.ReadFloat();
JsonObject eventData = idx2event[reader.ReadVarInt()].AsObject(); JsonObject eventData = idx2event[reader.ReadVarInt()].AsObject();
data["name"] = eventData["name"].GetValue<string>(); data["name"] = (string)eventData["name"];
data["int"] = reader.ReadVarInt(); data["int"] = reader.ReadVarInt();
data["float"] = reader.ReadFloat(); data["float"] = reader.ReadFloat();
data["string"] = reader.ReadBoolean() ? reader.ReadString() : eventData["string"].GetValue<string>(); data["string"] = reader.ReadBoolean() ? reader.ReadString() : (string)eventData["string"];
if (eventData.ContainsKey("audio")) if (eventData.ContainsKey("audio"))
{ {
data["volume"] = eventData["volume"].GetValue<string>(); data["volume"] = (string)eventData["volume"];
data["balance"] = eventData["balance"].GetValue<string>(); data["balance"] = (string)eventData["balance"];
} }
eventTimelines.Add(data); eventTimelines.Add(data);
} }
@@ -735,7 +736,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
{ {
JsonArray names = []; JsonArray names = [];
for (int n = reader.ReadVarInt(); n > 0; n--) for (int n = reader.ReadVarInt(); n > 0; n--)
names.Add(array[reader.ReadVarInt()]["name"].GetValue<string>()); names.Add((string)array[reader.ReadVarInt()]["name"]);
return names; return names;
} }
@@ -840,18 +841,18 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
private void WriteSkeleton() private void WriteSkeleton()
{ {
JsonObject skeleton = root["skeleton"].AsObject(); JsonObject skeleton = root["skeleton"].AsObject();
writer.WriteString(skeleton["hash"].GetValue<string>()); writer.WriteString((string)skeleton["hash"]);
writer.WriteString(skeleton["spine"].GetValue<string>()); writer.WriteString((string)skeleton["spine"]);
if (skeleton.TryGetPropertyValue("x", out var x)) writer.WriteFloat(x.GetValue<float>()); else writer.WriteFloat(0); if (skeleton.TryGetPropertyValue("x", out var x)) writer.WriteFloat((float)x); else writer.WriteFloat(0);
if (skeleton.TryGetPropertyValue("y", out var y)) writer.WriteFloat(y.GetValue<float>()); else writer.WriteFloat(0); if (skeleton.TryGetPropertyValue("y", out var y)) writer.WriteFloat((float)y); else writer.WriteFloat(0);
if (skeleton.TryGetPropertyValue("width", out var width)) writer.WriteFloat(width.GetValue<float>()); else writer.WriteFloat(0); if (skeleton.TryGetPropertyValue("width", out var width)) writer.WriteFloat((float)width); else writer.WriteFloat(0);
if (skeleton.TryGetPropertyValue("height", out var height)) writer.WriteFloat(height.GetValue<float>()); else writer.WriteFloat(0); if (skeleton.TryGetPropertyValue("height", out var height)) writer.WriteFloat((float)height); else writer.WriteFloat(0);
writer.WriteBoolean(nonessential); writer.WriteBoolean(nonessential);
if (nonessential) if (nonessential)
{ {
if (skeleton.TryGetPropertyValue("fps", out var fps)) writer.WriteFloat(fps.GetValue<float>()); else writer.WriteFloat(30); if (skeleton.TryGetPropertyValue("fps", out var fps)) writer.WriteFloat((float)fps); else writer.WriteFloat(30);
if (skeleton.TryGetPropertyValue("images", out var images)) writer.WriteString(images.GetValue<string>()); else writer.WriteString(null); if (skeleton.TryGetPropertyValue("images", out var images)) writer.WriteString((string)images); else writer.WriteString(null);
if (skeleton.TryGetPropertyValue("audio", out var audio)) writer.WriteString(audio.GetValue<string>()); else writer.WriteString(null); if (skeleton.TryGetPropertyValue("audio", out var audio)) writer.WriteString((string)audio); else writer.WriteString(null);
} }
} }
@@ -864,12 +865,55 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
private void WriteBones() private void WriteBones()
{ {
if (!root.ContainsKey("bones"))
{
writer.WriteVarInt(0);
return;
}
JsonArray bones = root["bones"].AsArray();
writer.WriteVarInt(bones.Count);
for (int i = 0; i < bones.Count; i++)
{
JsonObject data = bones[i].AsObject();
var name = (string)data["name"];
writer.WriteString(name);
if (i > 0) writer.WriteVarInt(bone2idx[(string)data["parent"]]);
if (data.TryGetPropertyValue("rotation", out var rotation)) writer.WriteFloat((float)rotation); else writer.WriteFloat(0);
if (data.TryGetPropertyValue("x", out var x)) writer.WriteFloat((float)x); else writer.WriteFloat(0);
if (data.TryGetPropertyValue("y", out var y)) writer.WriteFloat((float)y); else writer.WriteFloat(0);
if (data.TryGetPropertyValue("scaleX", out var scaleX)) writer.WriteFloat((float)scaleX); else writer.WriteFloat(1);
if (data.TryGetPropertyValue("scaleY", out var scaleY)) writer.WriteFloat((float)scaleY); else writer.WriteFloat(1);
if (data.TryGetPropertyValue("shearX", out var shearX)) writer.WriteFloat((float)shearX); else writer.WriteFloat(0);
if (data.TryGetPropertyValue("shearY", out var shearY)) writer.WriteFloat((float)shearY); else writer.WriteFloat(0);
if (data.TryGetPropertyValue("length", out var length)) writer.WriteFloat((float)length); else writer.WriteFloat(0);
if (data.TryGetPropertyValue("transform", out var transform)) writer.WriteVarInt((int)Enum.Parse<TransformMode>((string)transform, true)); else writer.WriteVarInt((int)TransformMode.Normal);
if (data.TryGetPropertyValue("skin", out var skin)) writer.WriteBoolean((bool)skin); else writer.WriteBoolean(false);
if (nonessential) writer.WriteInt(0);
bone2idx[name] = i;
}
} }
private void WriteSlots() private void WriteSlots()
{ {
if (!root.ContainsKey("slots"))
{
writer.WriteVarInt(0);
return;
}
JsonArray slots = root["slots"].AsArray();
writer.WriteVarInt(slots.Count);
for (int i = slots.Count; i < slots.Count; i++)
{
JsonObject data = slots[i].AsObject();
string name = (string)data["name"];
writer.WriteString(name);
writer.WriteVarInt(bone2idx[(string)data["bone"]]);
if (data.TryGetPropertyValue("color", out var color)) writer.WriteInt(int.Parse((string)color, NumberStyles.HexNumber)); else writer.WriteInt(0);
if (data.TryGetPropertyValue("dark", out var dark)) writer.WriteInt(int.Parse((string)dark, NumberStyles.HexNumber)); else writer.WriteInt(-1);
if (data.TryGetPropertyValue("attachment", out var attachment)) writer.WriteStringRef((string)attachment); else writer.WriteStringRef(null);
if (data.TryGetPropertyValue("blend", out var blend)) writer.WriteVarInt((int)Enum.Parse<BlendMode>((string)blend, true)); else writer.WriteVarInt((int)BlendMode.Normal);
slot2idx[name] = i;
}
} }
private void WriteIK() private void WriteIK()