add something

This commit is contained in:
ww-rm
2025-03-13 14:32:11 +08:00
parent c781ec5a4f
commit 0495a2344c
2 changed files with 266 additions and 19 deletions

View File

@@ -0,0 +1,246 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SpineRuntime38;
using System.Text.Json;
using System.Text.Json.Nodes;
namespace SpineViewer.Spine.Implementations.SkeletonConverter
{
[SkeletonConverterImplementation(Version.V38)]
class SkeletonConverter38 : SpineViewer.Spine.SkeletonConverter
{
private SkeletonReader reader = null;
private bool nonessential = false;
private JsonObject root = null;
public override void BinaryToJson(string binPath, string jsonPath)
{
using var input = new FileStream(binPath, FileMode.Open, FileAccess.Read, FileShare.Read);
reader = new(input);
root = [];
root["skeleton"] = ReadSkeleton();
ReadStrings();
root["bones"] = ReadBones();
root["slots"] = ReadSlots();
root["ik"] = ReadIK();
root["transform"] = ReadTransform();
root["path"] = ReadPath();
root["skins"] = ReadSkins();
root["events"] = ReadEvents();
root["aimations"] = ReadAnimations();
using var output = new FileStream(jsonPath, FileMode.Create, FileAccess.Write, FileShare.None);
using var writer = new Utf8JsonWriter(output, jsonWriterOptions);
root.WriteTo(writer);
}
private JsonObject ReadSkeleton()
{
JsonObject skeleton = [];
skeleton["hash"] = reader.ReadString();
skeleton["spine"] = reader.ReadString();
skeleton["x"] = reader.ReadFloat();
skeleton["y"] = reader.ReadFloat();
skeleton["width"] = reader.ReadFloat();
skeleton["height"] = reader.ReadFloat();
nonessential = reader.ReadBoolean();
if (nonessential)
{
skeleton["fps"] = reader.ReadFloat();
skeleton["images"] = reader.ReadString();
skeleton["audio"] = reader.ReadString();
}
return skeleton;
}
private void ReadStrings()
{
int count = reader.ReadVarInt();
for (int i = 0; i < count; i++)
reader.StringTable.Add(reader.ReadString());
}
private JsonArray ReadBones()
{
JsonArray bones = [];
int count = reader.ReadVarInt();
for (int i = 0; i < count; i++)
{
JsonObject data = [];
data["name"] = reader.ReadString();
if (i != 0) data["parent"] = bones[reader.ReadVarInt()]["name"].GetValue<string>();
data["rotation"] = reader.ReadFloat();
data["x"] = reader.ReadFloat();
data["y"] = reader.ReadFloat();
data["scaleX"] = reader.ReadFloat();
data["scaleY"] = reader.ReadFloat();
data["shearX"] = reader.ReadFloat();
data["shearY"] = reader.ReadFloat();
data["length"] = reader.ReadFloat();
data["transform"] = SkeletonBinary.TransformModeValues[reader.ReadVarInt()].ToString();
data["skin"] = reader.ReadBoolean();
if (nonessential) reader.ReadInt();
bones.Add(data);
}
return bones;
}
private JsonArray ReadSlots()
{
JsonArray bones = root["bones"].AsArray();
JsonArray slots = [];
int count = reader.ReadVarInt();
for (int i = 0; i < count; i++)
{
JsonObject data = [];
data["name"] = reader.ReadString();
data["bone"] = bones[reader.ReadVarInt()]["name"].GetValue<string>();
data["color"] = reader.ReadInt().ToString("x8"); // 0xrrggbbaa -> rrggbbaa
int dark = reader.ReadInt();
if (dark != -1) data["dark"] = dark.ToString("x6"); // 0x00rrggbb -> rrggbb
data["attachment"] = reader.ReadStringRef();
data["blend"] = ((BlendMode)reader.ReadVarInt()).ToString();
slots.Add(data);
}
return slots;
}
private JsonArray ReadIK()
{
JsonArray bones = root["bones"].AsArray();
JsonArray ik = [];
int count = reader.ReadVarInt();
for (int i = 0, bonesCount; i < count; i++)
{
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<string>());
data["bones"] = bonesArray;
data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>();
data["mix"] = reader.ReadFloat();
data["softness"] = reader.ReadFloat();
data["bendPositive"] = reader.ReadSByte() > 0;
data["compress"] = reader.ReadBoolean();
data["stretch"] = reader.ReadBoolean();
data["uniform"] = reader.ReadBoolean();
ik.Add(data);
}
return ik;
}
private JsonArray ReadTransform()
{
JsonArray bones = root["bones"].AsArray();
JsonArray transform = [];
int count = reader.ReadVarInt();
for (int i = 0, bonesCount; i < count; i++)
{
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<string>());
data["bones"] = bonesArray;
data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>();
data["local"] = reader.ReadBoolean();
data["relative"] = reader.ReadBoolean();
data["rotation"] = reader.ReadFloat();
data["x"] = reader.ReadFloat();
data["y"] = reader.ReadFloat();
data["scaleX"] = reader.ReadFloat();
data["scaleY"] = reader.ReadFloat();
data["shearY"] = reader.ReadFloat();
data["rotateMix"] = reader.ReadFloat();
data["translateMix"] = reader.ReadFloat();
data["scaleMix"] = reader.ReadFloat();
data["shearMix"] = reader.ReadFloat();
transform.Add(data);
}
return transform;
}
private JsonArray ReadPath()
{
JsonArray bones = root["bones"].AsArray();
JsonArray path = [];
int count = reader.ReadVarInt();
for (int i = 0, bonesCount; i < count; i++)
{
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<string>());
data["bones"] = bonesArray;
data["target"] = bones[reader.ReadVarInt()]["name"].GetValue<string>();
data["positionMode"] = ((PositionMode)reader.ReadVarInt()).ToString();
data["spacingMode"] = ((SpacingMode)reader.ReadVarInt()).ToString();
data["rotateMode"] = ((RotateMode)reader.ReadVarInt()).ToString();
data["rotation"] = reader.ReadFloat();
data["position"] = reader.ReadFloat();
data["spacing"] = reader.ReadFloat();
data["rotateMix"] = reader.ReadFloat();
data["translateMix"] = reader.ReadFloat();
path.Add(data);
}
return path;
}
private JsonArray ReadSkins()
{
JsonArray skins = [];
int count = reader.ReadVarInt();
for (int i = 0; i < count; i++)
{
throw new NotImplementedException();
}
return skins;
}
private JsonObject ReadEvents()
{
JsonObject events = [];
int count = reader.ReadVarInt();
for (int i = 0; i < count; i++)
{
JsonObject data = [];
events[reader.ReadStringRef()] = data;
data["int"] = reader.ReadVarInt(false);
data["float"] = reader.ReadFloat();
data["string"] = reader.ReadString();
string audio = reader.ReadString();
if (audio is not null)
{
data["audio"] = audio;
data["volume"] = reader.ReadFloat();
data["balance"] = reader.ReadFloat();
}
}
return events;
}
private JsonObject ReadAnimations()
{
JsonObject animations = [];
return animations;
}
public override void JsonToBinary(string jsonPath, string binPath)
{
// 按顺序把 json 的内容写入到骨骼 binary 缓冲区
// 然后在文件中依次写入文件头和骨骼数据
throw new NotImplementedException();
}
}
}