ModelImporter - Add common model part dectection

This commit is contained in:
miku-666
2024-05-18 08:44:25 +02:00
parent 3c96fd4c8d
commit f8730065ed
2 changed files with 50 additions and 43 deletions

View File

@@ -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);

View File

@@ -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;
}