mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/PCK-Studio.git
synced 2026-05-23 23:26:48 +00:00
ModelImporter - Add common model part dectection
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -49,33 +49,38 @@ namespace PckStudio.Internal
|
||||
|
||||
public static Dictionary<int, SkinAnimFlag> KnownHashes = new Dictionary<int, SkinAnimFlag>()
|
||||
{
|
||||
//[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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user