BedrockConverter - Move Json Definition to their own file

This commit is contained in:
miku-666
2023-04-02 23:53:23 +02:00
parent 4d3f2f1703
commit 256fe9ca41
11 changed files with 445 additions and 211 deletions

View File

@@ -3,24 +3,31 @@ using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Numerics;
using System.Windows.Forms;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using OMI.Formats.Languages;
using OMI.Formats.Pck;
using OMI.Workers.Language;
using OMI.Workers.Pck;
using PckStudio.Conversion.Bedrock.Json;
using PckStudio.Classes.Utils;
using PckStudio.Classes.Conversion.Bedrock.JsonDefinitions;
namespace PckStudio.Classes.FromLCE
namespace PckStudio.Classes.Bedrock
{
internal class BedrockConverter
{
// this is just a placeholder in case the locfile entry fails
// the placeholder name can be changed at any time
string PackName = "pck_studio";
// Geometry.json
JObject GJSON = new JObject();
@@ -174,8 +181,6 @@ namespace PckStudio.Classes.FromLCE
{ "res/armor", "/textures/models/armor" }
};
#region Texture Packs
public void ConvertTexturePack(PckFile sourcePck, string exportPath)
{
Directory.CreateDirectory(exportPath);
@@ -259,17 +264,12 @@ namespace PckStudio.Classes.FromLCE
File.WriteAllBytes(exportPath + exportName, file.Data);
}
#endregion
#region Skin Packs
public void ConvertSkinPack(PckFile sourcePck, string exportFilepath)
{
List<string> localisables = new List<string>();
SkinJSON skinJson = new SkinJSON(); // Skins.json
SkinJSON SJSON = new SkinJSON(); // Skins.json
string ExportPath = Path.GetDirectoryName(exportFilepath);
Directory.CreateDirectory(Path.Combine(ExportPath, "skin_pack"));
string exportPath = Path.GetDirectoryName(exportFilepath);
Directory.CreateDirectory(Path.Combine(exportPath, "skin_pack"));
if (sourcePck.TryGetFile("localisation.loc", PckFile.FileData.FileType.LocalisationFile, out PckFile.FileData locFileData) ||
sourcePck.TryGetFile("languages.loc", PckFile.FileData.FileType.LocalisationFile, out locFileData))
@@ -284,30 +284,31 @@ namespace PckStudio.Classes.FromLCE
{
PackName = newPackName.Replace(" ", "_");
}
localisables.Add(PackName);
ExportLOC(locFile, ExportPath + "\\skin_pack\\texts");
ExportLOC(locFile, exportPath + "\\skin_pack\\texts");
}
}
SJSON.skins = ConvertSkins(sourcePck, ExportPath).ToArray();
SJSON.localization_name = SJSON.serialize_name = localisables[0];
skinJson.Skins = ConvertSkins(sourcePck, exportPath).ToArray();
skinJson.LocalizationName = skinJson.SerializeName = PackName;
CreateSkinPackManifest(ExportPath + "\\skin_pack", localisables[0]);
var manifest = CreateSkinPackManifest(skinJson.LocalizationName);
string SKINS_JSON = JsonConvert.SerializeObject(SJSON, Formatting.Indented);
File.WriteAllText(ExportPath + "\\skin_pack\\skins.json", SKINS_JSON);
string manifest_JSON = JsonConvert.SerializeObject(manifest, Formatting.Indented);
File.WriteAllText(exportPath + "\\skin_pack\\manifest.json", manifest_JSON);
string SKINS_JSON = JsonConvert.SerializeObject(skinJson, Formatting.Indented);
File.WriteAllText(exportPath + "\\skin_pack\\skins.json", SKINS_JSON);
string GEO_JSON = JsonConvert.SerializeObject(GJSON, Formatting.Indented);
File.WriteAllText(ExportPath + "\\skin_pack\\geometry.json", GEO_JSON);
File.WriteAllText(exportPath + "\\skin_pack\\geometry.json", GEO_JSON);
using (var outputStream = new ZipOutputStream(File.Create(exportFilepath)))
{
outputStream.SetLevel(Deflater.NO_COMPRESSION);
string[] files = Directory.GetFiles(ExportPath + "\\skin_pack", "*", SearchOption.AllDirectories);
string[] files = Directory.GetFiles(exportPath + "\\skin_pack", "*", SearchOption.AllDirectories);
foreach (string file in files)
{
ZipEntry entry = new ZipEntry(file.Replace(ExportPath + "\\", ""));
ZipEntry entry = new ZipEntry(file.Replace(exportPath + "\\", ""));
outputStream.PutNextEntry(entry);
byte[] sourceBytes = File.ReadAllBytes(file);
@@ -385,8 +386,6 @@ namespace PckStudio.Classes.FromLCE
File.WriteAllText(exportPath + "\\languages.json", serializedLanguages);
}
List<(string, string)> offsets = null;
List<(string, string)> GetSkinOffsets(PckFile.PCKProperties skinProperties)
{
List<(string, string)> skinOffsets = new List<ValueTuple<string, string>>();
@@ -401,9 +400,8 @@ namespace PckStudio.Classes.FromLCE
if (v != null && v.Length >= 2) part_offset = v.Split(' ')[2];
else part_offset = "0";
}
catch (Exception ex)
catch
{
//Console.WriteLine(ex);
part_offset = "0";
}
@@ -439,15 +437,15 @@ namespace PckStudio.Classes.FromLCE
}
if(skinOffsets.Find(p => p.Item1 == offsetName) != default!)
skinOffsets.Add(new ValueTuple<string, string>(offsetName, part_offset));
skinOffsets.Add((offsetName, part_offset));
}
return skinOffsets;
}
modelCube[] ConvertBoxes(string part, PckFile.FileData file, Vector3 pivot)
GeometryCube[] ConvertBoxes(string part, PckFile.FileData file, Vector3 pivot, List<(string, string)> offsets)
{
List<modelCube> cubes = new List<modelCube>();
List<GeometryCube> cubes = new List<GeometryCube>();
var anim = new SkinANIM();
@@ -467,7 +465,7 @@ namespace PckStudio.Classes.FromLCE
if (box.Parent == part)
{
float y = -1 * (box.Pos.Y + offset + box.Size.Y);
cubes.Add(new modelCube(new Vector3(pivot.X + box.Pos.X, pivot.Y + y, pivot.Z + box.Pos.Z),
cubes.Add(new GeometryCube(new Vector3(pivot.X + box.Pos.X, pivot.Y + y, pivot.Z + box.Pos.Z),
box.Size, box.UV, box.Mirror, box.Inflation));
}
break;
@@ -483,51 +481,51 @@ namespace PckStudio.Classes.FromLCE
{
case "HEAD":
if (!anim.GetFlag(ANIM_EFFECTS.HEAD_DISABLED))
cubes.Add(new modelCube(new Vector3(- 4, 24 - offset, -4), new Vector3(8, 8, 8), new Vector2(0, 0)));
cubes.Add(new GeometryCube(new Vector3(- 4, 24 - offset, -4), new Vector3(8, 8, 8), new Vector2(0, 0)));
break;
case "BODY":
if (!anim.GetFlag(ANIM_EFFECTS.BODY_DISABLED))
cubes.Add(new modelCube(new Vector3(-4, 12 - offset, -2), new Vector3(8, 12, 4), new Vector2(16, 16)));
cubes.Add(new GeometryCube(new Vector3(-4, 12 - offset, -2), new Vector3(8, 12, 4), new Vector2(16, 16)));
break;
case "ARM0":
if (!anim.GetFlag(ANIM_EFFECTS.RIGHT_ARM_DISABLED))
cubes.Add(new modelCube(new Vector3(slim ? -7 : - 8, 12 - offset, -2), new Vector3(slim ? 3 : 4, 12, 4), new Vector2(40, 16)));
cubes.Add(new GeometryCube(new Vector3(slim ? -7 : - 8, 12 - offset, -2), new Vector3(slim ? 3 : 4, 12, 4), new Vector2(40, 16)));
break;
case "ARM1":
if (!anim.GetFlag(ANIM_EFFECTS.LEFT_ARM_DISABLED))
cubes.Add(new modelCube(new Vector3(4, 12 - offset, -2), new Vector3(slim ? 3 : 4, 12, 4), classic_res ? new Vector2(40, 16) : new Vector2(32, 48), classic_res));
cubes.Add(new GeometryCube(new Vector3(4, 12 - offset, -2), new Vector3(slim ? 3 : 4, 12, 4), classic_res ? new Vector2(40, 16) : new Vector2(32, 48), classic_res));
break;
case "LEG0":
if (!anim.GetFlag(ANIM_EFFECTS.RIGHT_LEG_DISABLED))
cubes.Add(new modelCube(new Vector3(-3.9f, 0 - offset, -2), new Vector3(4, 12, 4), new Vector2(0, 16)));
cubes.Add(new GeometryCube(new Vector3(-3.9f, 0 - offset, -2), new Vector3(4, 12, 4), new Vector2(0, 16)));
break;
case "LEG1":
if (!anim.GetFlag(ANIM_EFFECTS.LEFT_LEG_DISABLED))
cubes.Add(new modelCube(new Vector3(0.1f, 0 - offset, -2), new Vector3(4, 12, 4), classic_res ? new Vector2(0, 16) : new Vector2(16, 48), classic_res));
cubes.Add(new GeometryCube(new Vector3(0.1f, 0 - offset, -2), new Vector3(4, 12, 4), classic_res ? new Vector2(0, 16) : new Vector2(16, 48), classic_res));
break;
case "HEADWEAR":
if (!anim.GetFlag(ANIM_EFFECTS.HEAD_OVERLAY_DISABLED))
cubes.Add(new modelCube(new Vector3(-4, 24 - offset, -4), new Vector3(8, 8, 8), new Vector2(32, 0), false, 0.5f));
cubes.Add(new GeometryCube(new Vector3(-4, 24 - offset, -4), new Vector3(8, 8, 8), new Vector2(32, 0), false, 0.5f));
break;
case "JACKET":
if (!classic_res && !anim.GetFlag(ANIM_EFFECTS.BODY_OVERLAY_DISABLED))
cubes.Add(new modelCube(new Vector3(0, 24 - offset, 0), new Vector3(8, 12, 4), new Vector2(16, 32), false, 0.25f));
cubes.Add(new GeometryCube(new Vector3(0, 24 - offset, 0), new Vector3(8, 12, 4), new Vector2(16, 32), false, 0.25f));
break;
case "SLEEVE0":
if (!classic_res && !anim.GetFlag(ANIM_EFFECTS.RIGHT_ARM_OVERLAY_DISABLED))
cubes.Add(new modelCube(new Vector3(slim ? -7 : -8, 12 - offset, -2), new Vector3(slim ? 3 : 4, 12, 4), new Vector2(40, 32), false, 0.25f));
cubes.Add(new GeometryCube(new Vector3(slim ? -7 : -8, 12 - offset, -2), new Vector3(slim ? 3 : 4, 12, 4), new Vector2(40, 32), false, 0.25f));
break;
case "SLEEVE1":
if (!classic_res && !anim.GetFlag(ANIM_EFFECTS.LEFT_ARM_OVERLAY_DISABLED))
cubes.Add(new modelCube(new Vector3(4, 12 - offset, -2), new Vector3(slim ? 3 : 4, 12, 4), new Vector2(48, 48), false, 0.25f));
cubes.Add(new GeometryCube(new Vector3(4, 12 - offset, -2), new Vector3(slim ? 3 : 4, 12, 4), new Vector2(48, 48), false, 0.25f));
break;
case "PANTS0":
if (!classic_res && !anim.GetFlag(ANIM_EFFECTS.RIGHT_LEG_OVERLAY_DISABLED))
cubes.Add(new modelCube(new Vector3(-3.9f, 0 - offset, -2), new Vector3(4, 12, 4), new Vector2(0, 32), false, 0.25f));
cubes.Add(new GeometryCube(new Vector3(-3.9f, 0 - offset, -2), new Vector3(4, 12, 4), new Vector2(0, 32), false, 0.25f));
break;
case "PANTS1":
if (!classic_res && !anim.GetFlag(ANIM_EFFECTS.LEFT_LEG_OVERLAY_DISABLED))
cubes.Add(new modelCube(new Vector3(0.1f, 0 - offset, -2), new Vector3(4, 12, 4), new Vector2(0, 48), false, 0.25f));
cubes.Add(new GeometryCube(new Vector3(0.1f, 0 - offset, -2), new Vector3(4, 12, 4), new Vector2(0, 48), false, 0.25f));
break;
default:
break;
@@ -542,11 +540,9 @@ namespace PckStudio.Classes.FromLCE
return default!;
SkinObject skinObj = new SkinObject();
string skinID = file.Filename.Replace(".png", "").Replace("Skins/", "");
skinObj.localization_name = skinID;
skinObj.texture = skinID + ".png";
skinObj.geometry = "geometry." + PackName + "." + skinID;
skinObj.LocalizationName = Path.GetFileNameWithoutExtension(file.Filename);
skinObj.TextureName = Path.GetFileName(file.Filename);
skinObj.GeometryName = $"geometry.{PackName}.{skinObj.LocalizationName}";
Vector3 head_and_body_pivot = new Vector3(0, 24, 0);
Vector3 right_arm_pivot = new Vector3(-5, 22, 0);
@@ -554,58 +550,58 @@ namespace PckStudio.Classes.FromLCE
Vector3 right_leg_pivot = new Vector3(-1.9f, 12, 0);
Vector3 left_leg_pivot = new Vector3(1.9f, 12, 0);
offsets = GetSkinOffsets(file.Properties);
var offsets = GetSkinOffsets(file.Properties);
List<modelBone> bones = new List<modelBone>();
var geometry = new Geometry((1, 2, new int[3] { 0, 1, 0 }),
new GeometryBone("head", null, head_and_body_pivot, ConvertBoxes("HEAD", file, head_and_body_pivot, offsets), "base"),
new GeometryBone("body", null, head_and_body_pivot, ConvertBoxes("BODY", file, head_and_body_pivot, offsets), "base"),
new GeometryBone("rightArm", null, right_arm_pivot, ConvertBoxes("ARM0", file, right_arm_pivot, offsets), "base"),
new GeometryBone("leftArm", null, left_arm_pivot, ConvertBoxes("ARM1", file, left_arm_pivot, offsets), "base"),
new GeometryBone("rightLeg", null, right_leg_pivot, ConvertBoxes("LEG0", file, right_leg_pivot, offsets), "base"),
new GeometryBone("leftLeg", null, left_leg_pivot, ConvertBoxes("LEG1", file, left_leg_pivot, offsets), "base"),
bones.Add(new modelBone("head", null, head_and_body_pivot, ConvertBoxes("HEAD", file, head_and_body_pivot), "base"));
bones.Add(new modelBone("body", null, head_and_body_pivot, ConvertBoxes("BODY", file, head_and_body_pivot), "base"));
bones.Add(new modelBone("rightArm", null, right_arm_pivot, ConvertBoxes("ARM0", file, right_arm_pivot), "base"));
bones.Add(new modelBone("leftArm", null, left_arm_pivot, ConvertBoxes("ARM1", file, left_arm_pivot), "base"));
bones.Add(new modelBone("rightLeg", null, right_leg_pivot, ConvertBoxes("LEG0", file, right_leg_pivot), "base"));
bones.Add(new modelBone("leftLeg", null, left_leg_pivot, ConvertBoxes("LEG1", file, left_leg_pivot), "base"));
new GeometryBone("hat", "head", head_and_body_pivot, ConvertBoxes("HEADWEAR", file, head_and_body_pivot, offsets), "clothing"),
new GeometryBone("jacket", "body", head_and_body_pivot, ConvertBoxes("JACKET", file, head_and_body_pivot, offsets), "clothing"),
new GeometryBone("rightSleeve", "rightArm", right_arm_pivot, ConvertBoxes("SLEEVE0", file, right_arm_pivot, offsets), "clothing"),
new GeometryBone("leftSleeve", "leftArm", left_arm_pivot, ConvertBoxes("SLEEVE1", file, left_arm_pivot, offsets), "clothing"),
new GeometryBone("rightPants", "rightLeg", right_leg_pivot, ConvertBoxes("PANTS0", file, right_leg_pivot, offsets), "clothing"),
new GeometryBone("leftPants", "leftLeg", left_leg_pivot, ConvertBoxes("PANTS1", file, left_leg_pivot, offsets), "clothing"),
new GeometryBone("rightSock", "rightLeg", right_leg_pivot, ConvertBoxes("SOCK0", file, right_leg_pivot, offsets), "clothing"),
new GeometryBone("leftSock", "leftLeg", left_leg_pivot, ConvertBoxes("SOCK1", file, left_leg_pivot, offsets), "clothing"),
bones.Add(new modelBone("hat", "head", head_and_body_pivot, ConvertBoxes("HEADWEAR", file, head_and_body_pivot), "clothing"));
bones.Add(new modelBone("jacket", "body", head_and_body_pivot, ConvertBoxes("JACKET", file, head_and_body_pivot), "clothing"));
bones.Add(new modelBone("rightSleeve", "rightArm", right_arm_pivot, ConvertBoxes("SLEEVE0", file, right_arm_pivot), "clothing"));
bones.Add(new modelBone("leftSleeve", "leftArm", left_arm_pivot, ConvertBoxes("SLEEVE1", file, left_arm_pivot), "clothing"));
bones.Add(new modelBone("rightPants", "rightLeg", right_leg_pivot, ConvertBoxes("PANTS0", file, right_leg_pivot), "clothing"));
bones.Add(new modelBone("leftPants", "leftLeg", left_leg_pivot, ConvertBoxes("PANTS1", file, left_leg_pivot), "clothing"));
bones.Add(new modelBone("rightSock", "rightLeg", right_leg_pivot, ConvertBoxes("SOCK0", file, right_leg_pivot), "clothing"));
bones.Add(new modelBone("leftSock", "leftLeg", left_leg_pivot, ConvertBoxes("SOCK1", file, left_leg_pivot), "clothing"));
new GeometryBone("helmet", "head", head_and_body_pivot, ConvertBoxes("HELMET", file, head_and_body_pivot, offsets), "armor"),
new GeometryBone("bodyArmor", "body", head_and_body_pivot, ConvertBoxes("BODYARMOR", file, head_and_body_pivot, offsets), "armor"),
new GeometryBone("belt", "body", head_and_body_pivot, ConvertBoxes("BELT", file, head_and_body_pivot, offsets), "armor"),
new GeometryBone("rightArmArmor", "rightArm", right_arm_pivot, ConvertBoxes("ARMARMOR0", file, right_arm_pivot, offsets), "armor"),
new GeometryBone("leftArmArmor", "leftArm", left_arm_pivot, ConvertBoxes("ARMARMOR1", file, left_arm_pivot, offsets), "armor"),
new GeometryBone("rightLegArmor", "rightLeg", right_leg_pivot, ConvertBoxes("LEGGING0", file, right_leg_pivot, offsets), "armor"),
new GeometryBone("leftLegArmor", "leftLeg", left_leg_pivot, ConvertBoxes("LEGGING1", file, left_leg_pivot, offsets), "armor"),
new GeometryBone("rightBoot", "rightLeg", right_leg_pivot, ConvertBoxes("BOOT0", file, right_leg_pivot, offsets), "armor"),
new GeometryBone("leftBoot", "leftLeg", left_leg_pivot, ConvertBoxes("BOOT1", file, left_leg_pivot, offsets), "armor"),
bones.Add(new modelBone("helmet", "head", head_and_body_pivot, ConvertBoxes("HELMET", file, head_and_body_pivot), "armor"));
bones.Add(new modelBone("bodyArmor", "body", head_and_body_pivot, ConvertBoxes("BODYARMOR", file, head_and_body_pivot), "armor"));
bones.Add(new modelBone("belt", "body", head_and_body_pivot, ConvertBoxes("BELT", file, head_and_body_pivot), "armor"));
bones.Add(new modelBone("rightArmArmor", "rightArm", right_arm_pivot, ConvertBoxes("ARMARMOR0", file, right_arm_pivot), "armor"));
bones.Add(new modelBone("leftArmArmor", "leftArm", left_arm_pivot, ConvertBoxes("ARMARMOR1", file, left_arm_pivot), "armor"));
bones.Add(new modelBone("rightLegArmor", "rightLeg", right_leg_pivot, ConvertBoxes("LEGGING0", file, right_leg_pivot), "armor"));
bones.Add(new modelBone("leftLegArmor", "leftLeg", left_leg_pivot, ConvertBoxes("LEGGING1", file, left_leg_pivot), "armor"));
bones.Add(new modelBone("rightBoot", "rightLeg", right_leg_pivot, ConvertBoxes("BOOT0", file, right_leg_pivot), "armor"));
bones.Add(new modelBone("leftBoot", "leftLeg", left_leg_pivot, ConvertBoxes("BOOT1", file, left_leg_pivot), "armor"));
// calculates armor and item offsets
new GeometryBone("rightItem", "rightArm", new Vector3(-6.0f, 15.0f - float.Parse(offsets.Find(o => o.Item1 == "TOOL0").Item2), 1.0f), null, "item"),
new GeometryBone("leftItem", "leftArm", new Vector3(6.0f, 15.0f - float.Parse(offsets.Find(o => o.Item1 == "TOOL1").Item2), 1.0f), null, "item"),
// calculates armor and item offsets
bones.Add(new modelBone("rightItem", "rightArm", new Vector3(-6.0f, 15.0f - float.Parse(offsets.Find(o => o.Item1 == "TOOL0").Item2), 1.0f), null, "item"));
bones.Add(new modelBone("leftItem", "leftArm", new Vector3(6.0f, 15.0f - float.Parse(offsets.Find(o => o.Item1 == "TOOL1").Item2), 1.0f), null, "item"));
bones.Add(new modelBone("helmetArmorOffset", "head", new Vector3(0f, 24f - float.Parse(offsets.Find(o => o.Item1 == "HEAD").Item2), 0f), null, "armor_offset"));
bones.Add(new modelBone("bodyArmorOffset", "body", new Vector3(- 4f, 12f - float.Parse(offsets.Find(o => o.Item1 == "BODY").Item2), -2f), null, "armor_offset"));
bones.Add(new modelBone("rightArmArmorOffset", "rightArm", new Vector3(4f, 12f - float.Parse(offsets.Find(o => o.Item1 == "ARM0").Item2), -2f), null, "armor_offset"));
bones.Add(new modelBone("leftArmArmorOffset", "leftArm", new Vector3(- 8f, 12f - float.Parse(offsets.Find(o => o.Item1 == "ARM1").Item2), -2f), null, "armor_offset"));
bones.Add(new modelBone("rightLegArmorOffset", "rightLeg", new Vector3(-0.1f, float.Parse(offsets.Find(o => o.Item1 == "LEG0").Item2), -2f), null, "armor_offset"));
bones.Add(new modelBone("leftLegArmorOffset", "leftLeg", new Vector3(-4.1f, float.Parse(offsets.Find(o => o.Item1 == "LEG1").Item2), -2f), null, "armor_offset"));
bones.Add(new modelBone("rightBootArmorOffset", "rightLeg", new Vector3(2f, 12f - float.Parse(offsets.Find(o => o.Item1 == "BOOT0").Item2), 0f), null, "armor_offset"));
bones.Add(new modelBone("leftBootArmorOffset", "leftLeg", new Vector3(- 2f, 12f - float.Parse(offsets.Find(o => o.Item1 == "BOOT1").Item2), 0f), null, "armor_offset"));
new GeometryBone("helmetArmorOffset", "head", new Vector3(0f, 24f - float.Parse(offsets.Find(o => o.Item1 == "HEAD").Item2), 0f), null, "armor_offset"),
new GeometryBone("bodyArmorOffset", "body", new Vector3(-4f, 12f - float.Parse(offsets.Find(o => o.Item1 == "BODY").Item2), -2f), null, "armor_offset"),
new GeometryBone("rightArmArmorOffset", "rightArm", new Vector3(4f, 12f - float.Parse(offsets.Find(o => o.Item1 == "ARM0").Item2), -2f), null, "armor_offset"),
new GeometryBone("leftArmArmorOffset", "leftArm", new Vector3(-8f, 12f - float.Parse(offsets.Find(o => o.Item1 == "ARM1").Item2), -2f), null, "armor_offset"),
new GeometryBone("rightLegArmorOffset", "rightLeg", new Vector3(-0.1f, float.Parse(offsets.Find(o => o.Item1 == "LEG0").Item2), -2f), null, "armor_offset"),
new GeometryBone("leftLegArmorOffset", "leftLeg", new Vector3(-4.1f, float.Parse(offsets.Find(o => o.Item1 == "LEG1").Item2), -2f), null, "armor_offset"),
new GeometryBone("rightBootArmorOffset", "rightLeg", new Vector3(2f, 12f - float.Parse(offsets.Find(o => o.Item1 == "BOOT0").Item2), 0f), null, "armor_offset"),
new GeometryBone("leftBootArmorOffset", "leftLeg", new Vector3(-2f, 12f - float.Parse(offsets.Find(o => o.Item1 == "BOOT1").Item2), 0f), null, "armor_offset")
);
string capepath = file.Properties.Find(o => o.property == "CAPEPATH").value;
JToken geo = JToken.FromObject(new skinModel(bones.ToArray()));
JToken geo = JToken.FromObject(geometry);
if (capepath != null)
geo["cape"] = capepath;
GJSON.Add(skinObj.geometry, geo);
GJSON.Add(skinObj.GeometryName, geo);
File.WriteAllBytes(exportPath + "\\" + skinID + ".png", file.Data);
File.WriteAllBytes(exportPath + "\\" + skinObj.LocalizationName + ".png", file.Data);
return skinObj;
}
@@ -614,132 +610,24 @@ namespace PckStudio.Classes.FromLCE
if (file.Filetype != PckFile.FileData.FileType.CapeFile)
return;
string capeID = file.Filename.Replace(".png", string.Empty).Replace("Skins/", string.Empty);
File.WriteAllBytes(exportPath + "\\" + capeID + ".png", file.Data);
string capeId = file.Filename.Replace(".png", string.Empty).Replace("Skins/", string.Empty);
File.WriteAllBytes(exportPath + "\\" + capeId + ".png", file.Data);
}
void CreateSkinPackManifest(string exportPath, string localizedName)
Manifest CreateSkinPackManifest(string localizedName)
{
SkinManifest manifest = new SkinManifest();
manifest.header = new Header()
{
name = localizedName,
description = "Exported with PCK Studio",
return new Manifest
{
Header = new ManifestHeader()
{
Name = localizedName,
Description = "Exported with " + Application.ProductName,
},
Modules = new ManifestModule[]
{
new ManifestModule("skin_pack")
}
};
manifest.modules = new Module[] { new Module() };
manifest.format_version = 1;
string JSON = JsonConvert.SerializeObject(manifest, Formatting.Indented);
File.WriteAllText(exportPath + "\\manifest.json", JSON);
}
#endregion
#region JSONObjects
class SkinManifest
{
public Header header { get; set; }
public Module[] modules { get; set; }
public int format_version = 1;
}
class Header
{
public int[] version = { 1, 0, 0 };
public string description = "";
public string name = "";
public string uuid = Guid.NewGuid().ToString();
}
class Module
{
public int[] version = { 1, 0, 0 };
public string type = "skin_pack";
public string uuid = Guid.NewGuid().ToString();
}
class SkinJSON
{
public SkinObject[] skins { get; set; }
public string serialize_name = "";
public string localization_name = "";
}
public class SkinObject
{
public string localization_name = "dlcskin00000000";
public string geometry = "geometry.humanoid.custom";
public string texture = "dlcskin00000000.png";
public string type = "free";
}
#endregion
#region Model classes for ANIM conversion
public class modelCube
{
public modelCube(Vector3 origin, Vector3 size, Vector2 uv, bool mirror = false, float inflate = 0.0f)
{
this.origin = origin;
this.size = size;
this.uv = uv;
this.mirror = mirror;
this.inflate = inflate;
}
public Vector3 origin = Vector3.Zero;
public Vector3 size = Vector3.Zero;
// for whatever reason, uv is a float on LCE,
// so I've kept it a float for the sake of consistency
public Vector2 uv = Vector2.Zero;
public bool mirror = false;
public float inflate = 0.0f;
}
public class modelBone
{
public modelBone(string name, string parent, Vector3 pivot, modelCube[] cubes, string metaBone = "")
{
this.name = name;
this.parent = parent;
pivot.CopyTo(this.pivot);
this.cubes = cubes;
//if (!String.IsNullOrEmpty(metaBone)) this.META_BoneType = metaBone;
}
//[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
//public string META_BoneType = null;
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string name = "partName";
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string parent = "parentName";
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public float[] pivot = { 0, 0, 0 };
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public modelCube[] cubes = null;
public override string ToString()
{
return name + " - " + cubes.Length + " cubes";
}
}
public class skinModel
{
public skinModel(modelBone[] bones)
{
this.bones = bones;
}
public int visible_bounds_width = 1;
public int visible_bounds_height = 2;
public int[] visible_bounds_offset = { 0, 1, 0};
public modelBone[] bones;
}
#endregion
}
}

View File

@@ -0,0 +1,44 @@
/* Copyright (c) 2023-present miku-666
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1.The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
using Newtonsoft.Json;
namespace PckStudio.Classes.Conversion.Bedrock.JsonDefinitions
{
internal class Geometry
{
public Geometry((int Width, int Height, int[] Offset) visibleBounds, params GeometryBone[] bones)
{
Bones = bones;
VisibleBoundsWidth = visibleBounds.Width;
VisibleBoundsHeight = visibleBounds.Height;
VisibleBoundsOffset = visibleBounds.Offset;
}
[JsonProperty("visible_bounds_width")]
public int VisibleBoundsWidth = 1;
[JsonProperty("visible_bounds_height")]
public int VisibleBoundsHeight = 2;
[JsonProperty("visible_bounds_offset")]
public int[] VisibleBoundsOffset = { 0, 1, 0 };
[JsonProperty("bones")]
public GeometryBone[] Bones { get; set; }
}
}

View File

@@ -0,0 +1,49 @@
/* Copyright (c) 2023-present miku-666
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1.The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
using System.Numerics;
using Newtonsoft.Json;
namespace PckStudio.Classes.Conversion.Bedrock.JsonDefinitions
{
internal class GeometryBone
{
public GeometryBone(string name, string parent, Vector3 pivot, GeometryCube[] cubes, string metaBone = "")
{
Name = name;
Parent = parent;
pivot.CopyTo(Pivot);
Cubes = cubes;
//if (!String.IsNullOrEmpty(metaBone)) this.META_BoneType = metaBone;
}
//[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
//public string META_BoneType = null;
[JsonProperty(PropertyName = "name", NullValueHandling = NullValueHandling.Ignore)]
public string Name = "partName";
[JsonProperty(PropertyName = "parent", NullValueHandling = NullValueHandling.Ignore)]
public string Parent = "parentName";
[JsonProperty(PropertyName = "pivot", NullValueHandling = NullValueHandling.Ignore)]
public float[] Pivot = { 0, 0, 0 };
[JsonProperty(PropertyName = "cubes", NullValueHandling = NullValueHandling.Ignore)]
public GeometryCube[] Cubes = null;
}
}

View File

@@ -0,0 +1,51 @@
/* Copyright (c) 2023-present miku-666
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1.The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
using System.Numerics;
using Newtonsoft.Json;
namespace PckStudio.Classes.Conversion.Bedrock.JsonDefinitions
{
internal class GeometryCube
{
public GeometryCube(Vector3 origin, Vector3 size, Vector2 uv, bool mirror = false, float inflate = 0.0f)
{
origin.CopyTo(Origin);
size.CopyTo(Size);
uv.CopyTo(UV);
Mirror = mirror;
Inflate = inflate;
}
[JsonProperty("origin")]
public float[] Origin = { 0, 0, 0 };
[JsonProperty("size")]
public float[] Size = { 0, 0, 0 };
// for whatever reason, uv is a float on LCE,
// so I've kept it a float for the sake of consistency
[JsonProperty("uv")]
public float[] UV = { 0, 0 };
[JsonProperty("mirror")]
public bool Mirror = false;
[JsonProperty("inflate")]
public float Inflate = 0.0f;
}
}

View File

@@ -0,0 +1,33 @@
/* Copyright (c) 2023-present miku-666
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1.The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
using Newtonsoft.Json;
namespace PckStudio.Conversion.Bedrock.Json
{
internal class Manifest
{
[JsonProperty("header")]
public ManifestHeader Header { get; set; }
[JsonProperty("modules")]
public ManifestModule[] Modules { get; set; }
[JsonProperty("format_version")]
public int FormatVersion = 1;
}
}

View File

@@ -0,0 +1,47 @@
/* Copyright (c) 2023-present miku-666
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1.The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
using System;
using Newtonsoft.Json;
namespace PckStudio.Conversion.Bedrock.Json
{
internal class ManifestHeader
{
public ManifestHeader(Version version = default!)
{
version ??= new Version(1, 0, 0);
Version = new int[3]
{
version.Major, version.Minor, version.Build
};
UUID = Guid.NewGuid().ToString();
}
[JsonProperty("version")]
public int[] Version = { 1, 0, 0 };
[JsonProperty("name")]
public string Name { get; set; } = string.Empty;
[JsonProperty("description")]
public string Description { get; set; } = string.Empty;
[JsonProperty("uuid")]
public string UUID { get; }
}
}

View File

@@ -0,0 +1,45 @@
/* Copyright (c) 2023-present miku-666
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1.The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
using System;
using Newtonsoft.Json;
namespace PckStudio.Conversion.Bedrock.Json
{
internal class ManifestModule
{
public ManifestModule(string type, Version version = default!)
{
Type = type;
version ??= new Version(1, 0, 0);
Version = new int[3]
{
version.Major, version.Minor, version.Build,
};
UUID = Guid.NewGuid().ToString();
}
[JsonProperty("version")]
public int[] Version { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("uuid")]
public string UUID { get; }
}
}

View File

@@ -0,0 +1,33 @@
/* Copyright (c) 2023-present miku-666
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1.The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
using Newtonsoft.Json;
namespace PckStudio.Conversion.Bedrock.Json
{
internal class SkinJSON
{
[JsonProperty("serialize_name")]
public string SerializeName = string.Empty;
[JsonProperty("localization_name")]
public string LocalizationName = string.Empty;
[JsonProperty("skins")]
public SkinObject[] Skins { get; set; }
}
}

View File

@@ -0,0 +1,36 @@
/* Copyright (c) 2023-present miku-666
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1.The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
**/
using Newtonsoft.Json;
namespace PckStudio.Conversion.Bedrock.Json
{
internal class SkinObject
{
[JsonProperty("localization_name")]
public string LocalizationName = "dlcskin00000000";
[JsonProperty("geometry")]
public string GeometryName = "geometry.humanoid.custom";
[JsonProperty("texture")]
public string TextureName = "dlcskin00000000.png";
[JsonProperty("type")]
public string Type = "free";
}
}

View File

@@ -27,7 +27,7 @@ using PckStudio.Forms.Additional_Popups.Animation;
using PckStudio.Forms.Additional_Popups;
using PckStudio.Classes.Misc;
using PckStudio.Classes.IO.PCK;
using PckStudio.Classes.FromLCE;
using PckStudio.Classes.Bedrock;
namespace PckStudio
{

View File

@@ -170,7 +170,15 @@
<Compile Include="Classes\API\PCKCenter\PCKCollections.cs" />
<Compile Include="Classes\API\PCKCenter\PCKCollectionsLocal.cs" />
<Compile Include="Classes\API\PCKCenter\SaveLocalJSON.cs" />
<Compile Include="Classes\Conversion\FromLCE\BedrockConverter.cs" />
<Compile Include="Classes\Conversion\Bedrock\BedrockConverter.cs" />
<Compile Include="Classes\Conversion\Bedrock\JsonDefinitions\Geometry.cs" />
<Compile Include="Classes\Conversion\Bedrock\JsonDefinitions\GeometryBone.cs" />
<Compile Include="Classes\Conversion\Bedrock\JsonDefinitions\GeometryCube.cs" />
<Compile Include="Classes\Conversion\Bedrock\JsonDefinitions\ManifestModule.cs" />
<Compile Include="Classes\Conversion\Bedrock\JsonDefinitions\SkinJSON.cs" />
<Compile Include="Classes\Conversion\Bedrock\JsonDefinitions\Manifest.cs" />
<Compile Include="Classes\Conversion\Bedrock\JsonDefinitions\ManifestHeader.cs" />
<Compile Include="Classes\Conversion\Bedrock\JsonDefinitions\SkinObject.cs" />
<Compile Include="Classes\Extentions\EnumerableExtentions.cs" />
<Compile Include="Classes\FileTypes\CSMBFile.cs" />
<Compile Include="Classes\FileTypes\PCKAudioFile.cs" />