diff --git a/PCK-Studio/Internal/ModelImporter.cs b/PCK-Studio/Internal/ModelImporter.cs index 95f57d44..8e4ae6b3 100644 --- a/PCK-Studio/Internal/ModelImporter.cs +++ b/PCK-Studio/Internal/ModelImporter.cs @@ -169,27 +169,18 @@ namespace PckStudio.Internal if (!element.UseBoxUv || !element.IsVisibile) return; - //Debug.WriteLine($"{type} {element.Name}({element.Uuid})"); BoundingBox boundingBox = new BoundingBox(element.From, element.To); Vector3 pos = boundingBox.Start; Vector3 size = boundingBox.Volume; Vector2 uv = element.UvOffset; pos = TranslateToInternalPosition(boxType, pos, size, new Vector3(1, 1, 0)); - //Debug.WriteLine(pos); - var box = new SkinBOX(boxType, pos, size, uv); - if (box.IsBasePart() && ((boxType == "HEAD" && element.Inflate == 0.5f) || (element.Inflate == 0.25f))) + var box = new SkinBOX(boxType, pos, size, uv, mirror: element.MirrorUv); + if (box.IsBasePart() && ((boxType == "HEAD" && element.Inflate == 0.5f) || (element.Inflate >= 0.25f && element.Inflate <= 0.5f))) box.Type = box.GetOverlayType(); - // IMPROVMENT: detect default body parts and toggle anim flag instead of adding box data -miku - //int hash = box.GetHashCode(); - //if (SkinBOX.KnownHashes.ContainsKey(hash)) - //{ - // Debug.WriteLine("Found known hash of " + box.ToString()); - // modelInfo.ANIM.SetFlag(SkinBOX.KnownHashes[hash], false); - // return; - //} - modelInfo.AdditionalBoxes.Add(box); + if (!BOX2ANIM(box, ref modelInfo)) + modelInfo.AdditionalBoxes.Add(box); } internal static void ExportBlockBenchModel(string fileName, SkinModelInfo modelInfo) @@ -288,8 +279,14 @@ namespace PckStudio.Internal if (selectedGeometry is not null) { modelInfo = LoadGeometry(selectedGeometry); - modelInfo.ANIM.SetMask( - SkinAnimMask.RESOLUTION_64x64 | + } + return modelInfo; + } + + private static SkinModelInfo LoadGeometry(Geometry geometry) + { + SkinModelInfo modelInfo = new SkinModelInfo(); + modelInfo.ANIM.SetMask( SkinAnimMask.HEAD_DISABLED | SkinAnimMask.HEAD_OVERLAY_DISABLED | SkinAnimMask.BODY_DISABLED | @@ -302,13 +299,9 @@ namespace PckStudio.Internal SkinAnimMask.RIGHT_LEG_OVERLAY_DISABLED | SkinAnimMask.LEFT_LEG_DISABLED | SkinAnimMask.LEFT_LEG_OVERLAY_DISABLED); - } - return modelInfo; - } + if (geometry.Description?.TextureSize.Width == geometry.Description?.TextureSize.Height) + modelInfo.ANIM.SetFlag(SkinAnimFlag.RESOLUTION_64x64, true); - private static SkinModelInfo LoadGeometry(Geometry geometry) - { - SkinModelInfo modelInfo = new SkinModelInfo(); foreach (Bone bone in geometry.Bones) { string boxType = bone.Name; @@ -368,7 +361,8 @@ namespace PckStudio.Internal { skinBox.HideWithArmor = true; } - modelInfo.AdditionalBoxes.Add(skinBox); + if (!BOX2ANIM(skinBox, ref modelInfo)) + modelInfo.AdditionalBoxes.Add(skinBox); } } return modelInfo; @@ -393,8 +387,6 @@ namespace PckStudio.Internal bones.Add(box.Type, bone); } - box.GetHashCode(); - Vector3 pos = TranslateFromInternalPosistion(box, Vector3.UnitY); bones[box.Type].Cubes.Add(new External.Format.Cube() @@ -498,6 +490,17 @@ namespace PckStudio.Internal } } + internal static bool BOX2ANIM(SkinBOX box, ref SkinModelInfo modelInfo) + { + int hash = box.GetHashCode(); + if (SkinBOX.KnownHashes.ContainsKey(hash)) + { + modelInfo.ANIM.SetFlag(SkinBOX.KnownHashes[hash], false); + return true; + } + return false; + } + internal static Vector3 TranslateToInternalPosition(string boxType, Vector3 origin, Vector3 size, Vector3 translationUnit) { Vector3 pos = TransformSpace(origin, size, translationUnit); diff --git a/PCK-Studio/Internal/SkinBOX.cs b/PCK-Studio/Internal/SkinBOX.cs index 2662ded1..59b78e55 100644 --- a/PCK-Studio/Internal/SkinBOX.cs +++ b/PCK-Studio/Internal/SkinBOX.cs @@ -49,33 +49,38 @@ namespace PckStudio.Internal public static Dictionary KnownHashes = new Dictionary() { - //[unchecked((int)0x9560320c)] = SkinAnimFlag.HEAD_DISABLED, // HEAD -4 -8 -4 8 8 8 0 0 0 0 0 + [unchecked((int)0x9560320c)] = SkinAnimFlag.HEAD_DISABLED, // HEAD -4 -8 -4 8 8 8 0 0 0 0 0 - //[unchecked((int)0x1f13e4a3)] = SkinAnimFlag.BODY_DISABLED, // BODY -4 0 -2 8 12 4 16 16 0 0 0 + [unchecked((int)0x1f13e4a3)] = SkinAnimFlag.BODY_DISABLED, // BODY -4 0 -2 8 12 4 16 16 0 0 0 - //[unchecked((int)0x407c9b27)] = SkinAnimFlag.RIGHT_ARM_DISABLED, // ARM0 -3 -2 -2 4 12 4 40 16 0 0 0 // standard (64x64) - //[unchecked((int)0x867c9b27)] = SkinAnimFlag.RIGHT_ARM_DISABLED, // ARM0 -2 -2 -2 3 12 4 40 16 0 0 0 // slim + [unchecked((int)0x407c9b27)] = SkinAnimFlag.RIGHT_ARM_DISABLED, // ARM0 -3 -2 -2 4 12 4 40 16 0 0 0 // standard (64x64) + [unchecked((int)0x867c9b27)] = SkinAnimFlag.RIGHT_ARM_DISABLED, // ARM0 -2 -2 -2 3 12 4 40 16 0 0 0 // slim - //[unchecked((int)0xca3cf050)] = SkinAnimFlag.LEFT_ARM_DISABLED, // ARM1 -1 -2 -2 4 12 4 40 16 0 1 0 // classic (64x32) - //[unchecked((int)0x879b27)] = SkinAnimFlag.LEFT_ARM_DISABLED, // ARM1 -1 -2 -2 4 12 4 32 48 0 0 0 // standard (64x64) - //[unchecked((int)0xe8c79b27)] = SkinAnimFlag.LEFT_ARM_DISABLED, // ARM1 -1 -2 -2 3 12 4 32 48 0 0 0 // slim + [unchecked((int)0xca3cf050)] = SkinAnimFlag.LEFT_ARM_DISABLED, // ARM1 -1 -2 -2 4 12 4 40 16 0 1 0 // classic (64x32) + [unchecked((int)0x879b27)] = SkinAnimFlag.LEFT_ARM_DISABLED, // ARM1 -1 -2 -2 4 12 4 32 48 0 0 0 // standard (64x64) + [unchecked((int)0xe8c79b27)] = SkinAnimFlag.LEFT_ARM_DISABLED, // ARM1 -1 -2 -2 3 12 4 32 48 0 0 0 // slim - //[unchecked((int)0x49a63773)] = SkinAnimFlag.LEFT_LEG_DISABLED, // LEG1 -1 -2 -2 4 12 4 0 16 0 1 0 // 64x32 - //[unchecked((int)0xdd10e24a)] = SkinAnimFlag.LEFT_LEG_DISABLED, // LEG1 -1 -2 -2 4 12 4 32 48 0 0 0 // 64x64 + [unchecked((int)0x1910e24a)] = SkinAnimFlag.LEFT_LEG_DISABLED, // LEG1 -2 0 -2 4 12 4 16 48 0 0 0 // 64x64 + [unchecked((int)0xce263773)] = SkinAnimFlag.LEFT_LEG_DISABLED, // LEG1 -2 0 -2 4 12 4 0 16 0 1 0 // 64x32 - //[unchecked((int)0x5da5e24a)] = SkinAnimFlag.RIGHT_LEG_DISABLED, // LEG0 -2 0 -2 4 12 4 0 16 0 0 0 + [unchecked((int)0x5da5e24a)] = SkinAnimFlag.RIGHT_LEG_DISABLED, // LEG0 -2 0 -2 4 12 4 0 16 0 0 0 - //[unchecked((int)0x4bfe0142)] = SkinAnimFlag.HEAD_OVERLAY_DISABLED, // HEADWEAR -4 -8 -4 8 8 8 32 0 0 0 0 + [unchecked((int)0x4bfe0142)] = SkinAnimFlag.HEAD_OVERLAY_DISABLED, // HEADWEAR -4 -8 -4 8 8 8 32 0 0 0 0 - //// ------------------------------------------------------------------------------------------------------------------------------------ + // ------------------------------------------------------------------------------------------------------------------------------------ - //[unchecked((int)0xe693e4a3)] = SkinAnimFlag.BODY_OVERLAY_DISABLED, // BODY -4 0 -2 8 12 4 16 32 0 0 0 - //[unchecked((int)0x8e322609)] = SkinAnimFlag.BODY_OVERLAY_DISABLED, // JACKET -4 0 -2 8 12 4 16 32 0 0 0 - - //[unchecked((int)0xbefc9b27)] = SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED, // ARM0 -2 -2 -2 3 12 4 40 32 0 0 0 - //[unchecked((int)0xd7807908)] = SkinAnimFlag.LEFT_ARM_OVERLAY_DISABLED, // SLEEVE1 -1 -2 -2 4 12 4 32 48 0 0 0 + [unchecked((int)0xe693e4a3)] = SkinAnimFlag.BODY_OVERLAY_DISABLED, // BODY -4 0 -2 8 12 4 16 32 0 0 0 + [unchecked((int)0x8e322609)] = SkinAnimFlag.BODY_OVERLAY_DISABLED, // JACKET -4 0 -2 8 12 4 16 32 0 0 0 - //[unchecked((int)0xf3d833dc)] = SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED, // PATNS0 -2 0 -2 4 12 4 0 16 0 0 0 + [unchecked((int)0x860c4433)] = SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED, // SLEEVE0 -3 -2 -2 4 12 4 40 32 0 0 0 // classic + [unchecked((int)0xcc0c4433)] = SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED, // SLEEVE0 -2 -2 -2 3 12 4 40 32 0 0 0 // slim + + [unchecked((int)0x91407908)] = SkinAnimFlag.LEFT_ARM_OVERLAY_DISABLED, // SLEEVE1 -1 -2 -2 4 12 4 48 48 0 0 0 // classic + [unchecked((int)0x79807908)] = SkinAnimFlag.LEFT_ARM_OVERLAY_DISABLED, // SLEEVE1 -1 -2 -2 3 12 4 48 48 0 0 0 // slim + + [unchecked((int)0x4de0238a)] = SkinAnimFlag.RIGHT_LEG_OVERLAY_DISABLED, // PANTS0 -2 0 -2 4 12 4 0 32 0 0 0 + + [unchecked((int)0x176f238a)] = SkinAnimFlag.LEFT_LEG_OVERLAY_DISABLED, // PANTS1 -2 0 -2 4 12 4 0 48 0 0 0 }; public static readonly string[] ValidBoxTypes = BaseTypes.Concat(OverlayTypes).ToArray(); @@ -169,7 +174,6 @@ namespace PckStudio.Internal hashCode = hashCode * -1521134295 + HideWithArmor.GetHashCode(); hashCode = hashCode * -1521134295 + Mirror.GetHashCode(); hashCode = hashCode * -1521134295 + Scale.GetHashCode(); - //Debug.WriteLineIf(!KnownHashes.ContainsKey(hashCode), $"Hash for {this}: 0x{hashCode:x}"); return hashCode; }