修复浮点数转换问题

This commit is contained in:
ww-rm
2025-05-01 20:52:55 +08:00
parent c93b78528d
commit 9f1f66776c

View File

@@ -1257,17 +1257,17 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
JsonObject skeleton = root["skeleton"].AsObject(); JsonObject skeleton = root["skeleton"].AsObject();
writer.WriteLong(long.Parse(Convert.ToHexString(Convert.FromBase64String(skeleton["hash"] + "=")), NumberStyles.HexNumber)); writer.WriteLong(long.Parse(Convert.ToHexString(Convert.FromBase64String(skeleton["hash"] + "=")), NumberStyles.HexNumber));
writer.WriteString((string)skeleton["spine"]); writer.WriteString((string)skeleton["spine"]);
if (skeleton["x"] is JsonValue x) writer.WriteFloat((float)x); else writer.WriteFloat(0); writer.WriteFloat((float)(skeleton["x"] ?? 0f));
if (skeleton["y"] is JsonValue y) writer.WriteFloat((float)y); else writer.WriteFloat(0); writer.WriteFloat((float)(skeleton["y"] ?? 0f));
if (skeleton["width"] is JsonValue width) writer.WriteFloat((float)width); else writer.WriteFloat(0); writer.WriteFloat((float)(skeleton["width"] ?? 0f));
if (skeleton["height"] is JsonValue height) writer.WriteFloat((float)height); else writer.WriteFloat(0); writer.WriteFloat((float)(skeleton["height"] ?? 0f));
if (skeleton["referenceScale"] is JsonValue referenceScale) writer.WriteFloat((float)referenceScale); else writer.WriteFloat(100); writer.WriteFloat((float)(skeleton["referenceScale"] ?? 100f));
writer.WriteBoolean(nonessential); writer.WriteBoolean(nonessential);
if (nonessential) if (nonessential)
{ {
if (skeleton["fps"] is JsonValue fps) writer.WriteFloat((float)fps); else writer.WriteFloat(30); writer.WriteFloat((float)(skeleton["fps"] ?? 30f));
if (skeleton["images"] is JsonValue images) writer.WriteString((string)images); else writer.WriteString(null); writer.WriteString((string)skeleton["images"]);
if (skeleton["audio"] is JsonValue audio) writer.WriteString((string)audio); else writer.WriteString(null); writer.WriteString((string)skeleton["audio"]);
} }
} }
@@ -1293,16 +1293,16 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
var name = (string)data["name"]; var name = (string)data["name"];
writer.WriteString(name); writer.WriteString(name);
if (i > 0) writer.WriteVarInt(bone2idx[(string)data["parent"]]); if (i > 0) writer.WriteVarInt(bone2idx[(string)data["parent"]]);
if (data["rotation"] is JsonValue rotation) writer.WriteFloat((float)rotation); else writer.WriteFloat(0); writer.WriteFloat((float)(data["rotation"] ?? 0f));
if (data["x"] is JsonValue x) writer.WriteFloat((float)x); else writer.WriteFloat(0); writer.WriteFloat((float)(data["x"] ?? 0f));
if (data["y"] is JsonValue y) writer.WriteFloat((float)y); else writer.WriteFloat(0); writer.WriteFloat((float)(data["y"] ?? 0f));
if (data["scaleX"] is JsonValue scaleX) writer.WriteFloat((float)scaleX); else writer.WriteFloat(1); writer.WriteFloat((float)(data["scaleX"] ?? 1f));
if (data["scaleY"] is JsonValue scaleY) writer.WriteFloat((float)scaleY); else writer.WriteFloat(1); writer.WriteFloat((float)(data["scaleY"] ?? 1f));
if (data["shearX"] is JsonValue shearX) writer.WriteFloat((float)shearX); else writer.WriteFloat(0); writer.WriteFloat((float)(data["shearX"] ?? 0f));
if (data["shearY"] is JsonValue shearY) writer.WriteFloat((float)shearY); else writer.WriteFloat(0); writer.WriteFloat((float)(data["shearY"] ?? 0f));
if (data["length"] is JsonValue length) writer.WriteFloat((float)length); else writer.WriteFloat(0); writer.WriteFloat((float)(data["length"] ?? 0f));
if (data["inherit"] is JsonValue inherit) writer.WriteVarInt((int)Enum.Parse<Inherit>((string)inherit, true)); else writer.WriteVarInt((int)Inherit.Normal); writer.WriteVarInt((int)Enum.Parse<Inherit>((string)(data["inherit"] ?? "normal"), true));
if (data["skin"] is JsonValue skin) writer.WriteBoolean((bool)skin); else writer.WriteBoolean(false); writer.WriteBoolean((bool)(data["skin"] ?? false));
if (nonessential) if (nonessential)
{ {
writer.WriteInt(0); writer.WriteInt(0);
@@ -1328,10 +1328,10 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
var name = (string)data["name"]; var name = (string)data["name"];
writer.WriteString(name); writer.WriteString(name);
writer.WriteVarInt(bone2idx[(string)data["bone"]]); writer.WriteVarInt(bone2idx[(string)data["bone"]]);
if (data["color"] is JsonValue color) writer.WriteInt(int.Parse((string)color, NumberStyles.HexNumber)); else writer.WriteInt(-1); // 默认值是全 255 writer.WriteInt(int.Parse((string)(data["color"] ?? "ffffffff"), NumberStyles.HexNumber));
if (data["dark"] is JsonValue dark) writer.WriteInt(int.Parse((string)dark, NumberStyles.HexNumber)); else writer.WriteInt(-1); writer.WriteInt(int.Parse((string)(data["dark"] ?? "ffffff"), NumberStyles.HexNumber));
if (data["attachment"] is JsonValue attachment) writer.WriteStringRef((string)attachment); else writer.WriteStringRef(null); writer.WriteStringRef((string)data["attachment"]);
if (data["blend"] is JsonValue blend) writer.WriteVarInt((int)Enum.Parse<BlendMode>((string)blend, true)); else writer.WriteVarInt((int)BlendMode.Normal); writer.WriteVarInt((int)Enum.Parse<BlendMode>((string)(data["blend"] ?? "normal"), true));
if (nonessential) writer.WriteBoolean(false); if (nonessential) writer.WriteBoolean(false);
slot2idx[name] = i; slot2idx[name] = i;
} }
@@ -1351,7 +1351,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
JsonObject data = ik[i].AsObject(); JsonObject data = ik[i].AsObject();
var name = (string)data["name"]; var name = (string)data["name"];
writer.WriteString(name); writer.WriteString(name);
if (data["order"] is JsonValue order) writer.WriteVarInt((int)order); else writer.WriteVarInt(0); writer.WriteVarInt((int)(data["order"] ?? 0));
if (data["bones"] is JsonArray bones) WriteNames(bone2idx, bones); else writer.WriteVarInt(0); if (data["bones"] is JsonArray bones) WriteNames(bone2idx, bones); else writer.WriteVarInt(0);
writer.WriteVarInt(bone2idx[(string)data["target"]]); writer.WriteVarInt(bone2idx[(string)data["target"]]);
@@ -1384,7 +1384,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
JsonObject data = transform[i].AsObject(); JsonObject data = transform[i].AsObject();
var name = (string)data["name"]; var name = (string)data["name"];
writer.WriteString(name); writer.WriteString(name);
if (data["order"] is JsonValue order) writer.WriteVarInt((int)order); else writer.WriteVarInt(0); writer.WriteVarInt((int)(data["order"] ?? 0));
if (data["bones"] is JsonArray bones) WriteNames(bone2idx, bones); else writer.WriteVarInt(0); if (data["bones"] is JsonArray bones) WriteNames(bone2idx, bones); else writer.WriteVarInt(0);
writer.WriteVarInt(bone2idx[(string)data["target"]]); writer.WriteVarInt(bone2idx[(string)data["target"]]);
@@ -1438,8 +1438,8 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
JsonObject data = path[i].AsObject(); JsonObject data = path[i].AsObject();
var name = (string)data["name"]; var name = (string)data["name"];
writer.WriteString(name); writer.WriteString(name);
if (data["order"] is JsonValue order) writer.WriteVarInt((int)order); else writer.WriteVarInt(0); writer.WriteVarInt((int)(data["order"] ?? 0));
if (data["skin"] is JsonValue skin) writer.WriteBoolean((bool)skin); else writer.WriteBoolean(false); writer.WriteBoolean((bool)(data["skin"] ?? false));
if (data["bones"] is JsonArray bones) WriteNames(bone2idx, bones); else writer.WriteVarInt(0); if (data["bones"] is JsonArray bones) WriteNames(bone2idx, bones); else writer.WriteVarInt(0);
writer.WriteVarInt(slot2idx[(string)data["target"]]); writer.WriteVarInt(slot2idx[(string)data["target"]]);
@@ -1454,11 +1454,11 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
writer.WriteByte((byte)flags); writer.WriteByte((byte)flags);
if ((flags & 128) != 0) writer.WriteFloat((float)data["rotation"]); if ((flags & 128) != 0) writer.WriteFloat((float)data["rotation"]);
if (data["position"] is JsonValue position) writer.WriteFloat((float)position); else writer.WriteFloat(0); writer.WriteFloat((float)(data["position"] ?? 0f));
if (data["spacing"] is JsonValue spacing) writer.WriteFloat((float)spacing); else writer.WriteFloat(0); writer.WriteFloat((float)(data["spacing"] ?? 0f));
if (data["mixRotate"] is JsonValue mixRotate) writer.WriteFloat((float)mixRotate); else writer.WriteFloat(1); writer.WriteFloat((float)(data["mixRotate"] ?? 1f));
if (data["mixX"] is JsonValue mixX) writer.WriteFloat((float)mixX); else writer.WriteFloat(1); writer.WriteFloat((float)(data["mixX"] ?? 1f));
if (data["mixY"] is JsonValue mixY) writer.WriteFloat((float)mixY); else if (data["mixX"] is JsonValue mixX2) writer.WriteFloat((float)mixX2); else writer.WriteFloat(1); writer.WriteFloat((float)(data["mixY"] ?? data["mixX"] ?? 1f));
path2idx[name] = i; path2idx[name] = i;
} }
} }
@@ -1477,8 +1477,8 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
JsonObject data = physics[i].AsObject(); JsonObject data = physics[i].AsObject();
var name = (string)data["name"]; var name = (string)data["name"];
writer.WriteString(name); writer.WriteString(name);
if (data["order"] is JsonValue order) writer.WriteVarInt((int)order); else writer.WriteVarInt(0); writer.WriteVarInt((int)(data["order"] ?? 0));
if (data["bone"] is JsonValue bone) writer.WriteVarInt(bone2idx[(string)bone]); else writer.WriteVarInt(0); writer.WriteVarInt(bone2idx[(string)data["bone"]]);
int flags = 0; int flags = 0;
if (data["skin"] is JsonValue skin && (bool)skin) flags |= 1; if (data["skin"] is JsonValue skin && (bool)skin) flags |= 1;
@@ -1496,13 +1496,13 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
if ((flags & 16) != 0) writer.WriteFloat((float)data["scaleX"]); if ((flags & 16) != 0) writer.WriteFloat((float)data["scaleX"]);
if ((flags & 32) != 0) writer.WriteFloat((float)data["shearX"]); if ((flags & 32) != 0) writer.WriteFloat((float)data["shearX"]);
if ((flags & 64) != 0) writer.WriteFloat((float)data["limit"]); if ((flags & 64) != 0) writer.WriteFloat((float)data["limit"]);
if (data["fps"] is JsonValue fps) writer.WriteByte((byte)(int)fps); else writer.WriteByte(60); writer.WriteByte((byte)(int)(data["fps"] ?? 60));
if (data["inertia"] is JsonValue inertia) writer.WriteFloat((float)inertia); else writer.WriteFloat(1); writer.WriteFloat((float)(data["inertia"] ?? 1f));
if (data["strength"] is JsonValue strength) writer.WriteFloat((float)strength); else writer.WriteFloat(100); writer.WriteFloat((float)(data["strength"] ?? 100f));
if (data["damping"] is JsonValue damping) writer.WriteFloat((float)damping); else writer.WriteFloat(1); writer.WriteFloat((float)(data["damping"] ?? 1f));
if ((flags & 128) != 0) writer.WriteFloat(1f / (float)data["mass"]); if ((flags & 128) != 0) writer.WriteFloat(1f / (float)data["mass"]);
if (data["wind"] is JsonValue wind) writer.WriteFloat((float)wind); else writer.WriteFloat(0); writer.WriteFloat((float)(data["wind"] ?? 0f));
if (data["gravity"] is JsonValue gravity) writer.WriteFloat((float)gravity); else writer.WriteFloat(0); writer.WriteFloat((float)(data["gravity"] ?? 0f));
flags = 0; flags = 0;
if (data["inertiaGlobal"] is JsonValue inertiaGlobal && (bool)inertiaGlobal) flags |= 1; if (data["inertiaGlobal"] is JsonValue inertiaGlobal && (bool)inertiaGlobal) flags |= 1;
@@ -1655,15 +1655,15 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
if ((flags & 32) != 0) writer.WriteInt(int.Parse((string)attachment["color"], NumberStyles.HexNumber)); if ((flags & 32) != 0) writer.WriteInt(int.Parse((string)attachment["color"], NumberStyles.HexNumber));
if ((flags & 64) != 0) WriteSequence(attachment["sequence"].AsObject()); if ((flags & 64) != 0) WriteSequence(attachment["sequence"].AsObject());
if ((flags & 128) != 0) writer.WriteFloat((float)attachment["rotation"]); if ((flags & 128) != 0) writer.WriteFloat((float)attachment["rotation"]);
if (attachment["x"] is JsonValue x1) writer.WriteFloat((float)x1); else writer.WriteFloat(0); writer.WriteFloat((float)(attachment["x"] ?? 0f));
if (attachment["y"] is JsonValue y1) writer.WriteFloat((float)y1); else writer.WriteFloat(0); writer.WriteFloat((float)(attachment["y"] ?? 0f));
if (attachment["scaleX"] is JsonValue scaleX) writer.WriteFloat((float)scaleX); else writer.WriteFloat(1); writer.WriteFloat((float)(attachment["scaleX"] ?? 1f));
if (attachment["scaleY"] is JsonValue scaleY) writer.WriteFloat((float)scaleY); else writer.WriteFloat(1); writer.WriteFloat((float)(attachment["scaleY"] ?? 1f));
if (attachment["width"] is JsonValue width) writer.WriteFloat((float)width); else writer.WriteFloat(32); writer.WriteFloat((float)(attachment["width"] ?? 32f));
if (attachment["height"] is JsonValue height) writer.WriteFloat((float)height); else writer.WriteFloat(32); writer.WriteFloat((float)(attachment["height"] ?? 32f));
break; break;
case AttachmentType.Boundingbox: case AttachmentType.Boundingbox:
if (attachment["vertexCount"] is JsonValue _vc1) vertexCount = (int)_vc1; else vertexCount = 0; vertexCount = (int)(attachment["vertexCount"] ?? 0);
writer.WriteVarInt(vertexCount); writer.WriteVarInt(vertexCount);
WriteVertices(attachment["vertices"].AsArray(), vertexCount, (flags & 16) != 0); WriteVertices(attachment["vertices"].AsArray(), vertexCount, (flags & 16) != 0);
if (nonessential) writer.WriteInt(0); if (nonessential) writer.WriteInt(0);
@@ -1672,7 +1672,7 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
if ((flags & 16) != 0) writer.WriteStringRef((string)attachment["path"]); if ((flags & 16) != 0) writer.WriteStringRef((string)attachment["path"]);
if ((flags & 32) != 0) writer.WriteInt(int.Parse((string)attachment["color"], NumberStyles.HexNumber)); if ((flags & 32) != 0) writer.WriteInt(int.Parse((string)attachment["color"], NumberStyles.HexNumber));
if ((flags & 64) != 0) WriteSequence(attachment["sequence"].AsObject()); if ((flags & 64) != 0) WriteSequence(attachment["sequence"].AsObject());
if (attachment["hull"] is JsonValue hull) writer.WriteVarInt((int)hull); else writer.WriteVarInt(0); writer.WriteVarInt((int)(attachment["hull"] ?? 0));
vertexCount = attachment["uvs"].AsArray().Count >> 1; vertexCount = attachment["uvs"].AsArray().Count >> 1;
writer.WriteVarInt(vertexCount); writer.WriteVarInt(vertexCount);
WriteVertices(attachment["vertices"].AsArray(), vertexCount, (flags & 128) != 0); WriteVertices(attachment["vertices"].AsArray(), vertexCount, (flags & 128) != 0);
@@ -1685,38 +1685,38 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
writer.WriteVarInt(edges.Count); writer.WriteVarInt(edges.Count);
WriteShortArray(edges, edges.Count); WriteShortArray(edges, edges.Count);
} }
if (attachment["width"] is JsonArray _width) writer.WriteFloat((float)_width); else writer.WriteFloat(0); writer.WriteFloat((float)(attachment["width"] ?? 0f));
if (attachment["height"] is JsonArray _height) writer.WriteFloat((float)_height); else writer.WriteFloat(0); writer.WriteFloat((float)(attachment["height"] ?? 0f));
} }
break; break;
case AttachmentType.Linkedmesh: case AttachmentType.Linkedmesh:
if ((flags & 16) != 0) writer.WriteStringRef((string)attachment["path"]); if ((flags & 16) != 0) writer.WriteStringRef((string)attachment["path"]);
if ((flags & 32) != 0) writer.WriteInt(int.Parse((string)attachment["color"], NumberStyles.HexNumber)); if ((flags & 32) != 0) writer.WriteInt(int.Parse((string)attachment["color"], NumberStyles.HexNumber));
if ((flags & 64) != 0) WriteSequence(attachment["sequence"].AsObject()); if ((flags & 64) != 0) WriteSequence(attachment["sequence"].AsObject());
if (attachment["skin"] is JsonArray skin) writer.WriteVarInt(skin2idx[(string)skin]); else writer.WriteVarInt(0); if (attachment["skin"] is JsonValue skin) writer.WriteVarInt(skin2idx[(string)attachment["skin"]]); else writer.WriteVarInt(0); // XXX: 此处很抽象, json 里允许 skin 为 null, 但是二进制里一定是读取一个有效索引
if (attachment["parent"] is JsonValue parent) writer.WriteStringRef((string)parent); else writer.WriteStringRef(null); if (attachment["parent"] is JsonValue parent) writer.WriteStringRef((string)parent); else writer.WriteStringRef(null);
if (nonessential) if (nonessential)
{ {
if (attachment["width"] is JsonArray _width) writer.WriteFloat((float)_width); else writer.WriteFloat(0); writer.WriteFloat((float)(attachment["width"] ?? 0f));
if (attachment["height"] is JsonArray _height) writer.WriteFloat((float)_height); else writer.WriteFloat(0); writer.WriteFloat((float)(attachment["height"] ?? 0f));
} }
break; break;
case AttachmentType.Path: case AttachmentType.Path:
if (attachment["vertexCount"] is JsonValue _vc2) vertexCount = (int)_vc2; else vertexCount = 0; vertexCount = (int)(attachment["vertexCount"] ?? 0);
writer.WriteVarInt(vertexCount); writer.WriteVarInt(vertexCount);
WriteVertices(attachment["vertices"].AsArray(), vertexCount, (flags & 64) != 0); WriteVertices(attachment["vertices"].AsArray(), vertexCount, (flags & 64) != 0);
WriteFloatArray(attachment["lengths"].AsArray(), vertexCount * 2 / 6); WriteFloatArray(attachment["lengths"].AsArray(), vertexCount * 2 / 6);
if (nonessential) writer.WriteInt(0); if (nonessential) writer.WriteInt(0);
break; break;
case AttachmentType.Point: case AttachmentType.Point:
if (attachment["rotation"] is JsonArray rotation) writer.WriteFloat((float)rotation); else writer.WriteFloat(0); writer.WriteFloat((float)(attachment["rotation"] ?? 0f));
if (attachment["x"] is JsonArray x2) writer.WriteFloat((float)x2); else writer.WriteFloat(0); writer.WriteFloat((float)(attachment["x"] ?? 0f));
if (attachment["y"] is JsonArray y2) writer.WriteFloat((float)y2); else writer.WriteFloat(0); writer.WriteFloat((float)(attachment["y"] ?? 0f));
if (nonessential) writer.WriteInt(0); if (nonessential) writer.WriteInt(0);
break; break;
case AttachmentType.Clipping: case AttachmentType.Clipping:
writer.WriteVarInt(slot2idx[(string)attachment["end"]]); writer.WriteVarInt(slot2idx[(string)attachment["end"]]);
if (attachment["vertexCount"] is JsonValue _vc3) vertexCount = (int)_vc3; else vertexCount = 0; vertexCount = (int)(attachment["vertexCount"] ?? 0);
writer.WriteVarInt(vertexCount); writer.WriteVarInt(vertexCount);
WriteVertices(attachment["vertices"].AsArray(), vertexCount, (flags & 16) != 0); WriteVertices(attachment["vertices"].AsArray(), vertexCount, (flags & 16) != 0);
if (nonessential) writer.WriteInt(0); if (nonessential) writer.WriteInt(0);
@@ -1729,9 +1729,9 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
private void WriteSequence(JsonObject sequence) private void WriteSequence(JsonObject sequence)
{ {
writer.WriteVarInt((int)sequence["count"]); writer.WriteVarInt((int)sequence["count"]);
if (sequence["start"] is JsonValue start) writer.WriteVarInt((int)start); else writer.WriteVarInt(1); writer.WriteVarInt((int)(sequence["start"] ?? 1));
if (sequence["digits"] is JsonValue digits) writer.WriteVarInt((int)digits); else writer.WriteVarInt(0); writer.WriteVarInt((int)(sequence["digits"] ?? 0));
if (sequence["setup"] is JsonValue setup) writer.WriteVarInt((int)setup); else writer.WriteVarInt(0); writer.WriteVarInt((int)(sequence["setup"] ?? 0));
} }
private void WriteEvents() private void WriteEvents()
@@ -1906,7 +1906,6 @@ namespace SpineViewer.Spine.Implementations.SkeletonConverter
frame = frames[0].AsObject(); frame = frames[0].AsObject();
writer.WriteFloat((float)(frame["time"] ?? 0f)); writer.WriteFloat((float)(frame["time"] ?? 0f));
writer.Write((byte)((float)(frame["value"] ?? 1f) * 255)); writer.Write((byte)((float)(frame["value"] ?? 1f) * 255));
if (frame.TryGetPropertyValue("value", out var value)) writer.WriteFloat((float)value); else writer.WriteFloat(1);
for (int i = 1; i < frames.Count; i++) for (int i = 1; i < frames.Count; i++)
{ {
frame = frames[i].AsObject(); frame = frames[i].AsObject();