192 lines
10 KiB
C#
192 lines
10 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Eden.AutoMorpher.BodyPoseMatchSetupUtil
|
|
// Assembly: EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
|
// MVID: D39968B3-E151-4276-BDB4-E82752BBAFF0
|
|
// Assembly location: D:\dev\AutoMorpher\Assets\@Eden_Tools\Eden_AutoMorpher\Script\EdenAutoMorpherScript.dll
|
|
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
|
|
namespace Eden.AutoMorpher
|
|
{
|
|
public class BodyPoseMatchSetupUtil
|
|
{
|
|
public void AdjustAvatarScaleByNeck(
|
|
Transform avatarRoot,
|
|
Dictionary<HumanBodyBones, HashSet<Transform>> humanBoneMap,
|
|
float targetHeight)
|
|
{
|
|
if (Object.op_Equality((Object)avatarRoot, (Object)null))
|
|
{
|
|
Debug.LogWarning((object)"[AvatarBodyMatchUtil] NormalizeAvatarScaleByNeck: avatar == null");
|
|
}
|
|
else
|
|
{
|
|
Transform boneFromBoneMap = new BodyPoseMatch_CommonUtil().GetBoneFromBoneMap(humanBoneMap, (HumanBodyBones)9);
|
|
if (Object.op_Equality((Object)boneFromBoneMap, (Object)null))
|
|
{
|
|
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] {((Object)avatarRoot).name} 에서 Neck 본을 찾지 못했습니다. 스케일 정규화를 건너뜁니다.");
|
|
}
|
|
else
|
|
{
|
|
Transform transform = ((Component)avatarRoot).transform;
|
|
float num1 = boneFromBoneMap.position.y - transform.position.y;
|
|
if (Mathf.Approximately(num1, 0.0f))
|
|
{
|
|
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] {((Object)avatarRoot).name} Neck Y가 0에 가까워 스케일 계산을 건너뜁니다. (neckY = {num1})");
|
|
}
|
|
else
|
|
{
|
|
float num2 = targetHeight / num1;
|
|
Vector3 vector3 = Vector3.op_Multiply(transform.localScale, num2);
|
|
transform.localScale = vector3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public GameObject CreateBodyProxy(
|
|
Animator sourceAvatar,
|
|
IReadOnlyList<SkinnedMeshRenderer> sourceBodyMeshes,
|
|
out List<SkinnedMeshRenderer> proxyBodyMeshes,
|
|
out Dictionary<Transform, Transform> sourceToProxy)
|
|
{
|
|
proxyBodyMeshes = (List<SkinnedMeshRenderer>)null;
|
|
if (Object.op_Equality((Object)sourceAvatar, (Object)null))
|
|
{
|
|
Debug.LogError((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: sourceAvatar == null");
|
|
sourceToProxy = new Dictionary<Transform, Transform>();
|
|
return (GameObject)null;
|
|
}
|
|
GameObject clone = Object.Instantiate<GameObject>(((Component)sourceAvatar).gameObject);
|
|
((Object)clone).name = ((Object)sourceAvatar).name + "_BodyProxy";
|
|
HashSet<Transform> remainTransforms = new HashSet<Transform>();
|
|
remainTransforms.Add(clone.transform);
|
|
Animator component = clone.GetComponent<Animator>();
|
|
if (Object.op_Inequality((Object)component, (Object)null))
|
|
{
|
|
((Behaviour)component).enabled = false;
|
|
remainTransforms.Add(((Component)component).transform);
|
|
}
|
|
if (Object.op_Inequality((Object)component, (Object)null) && Object.op_Inequality((Object)component.avatar, (Object)null) && component.avatar.isHuman)
|
|
{
|
|
for (int index = 0; index < 55; ++index)
|
|
{
|
|
HumanBodyBones humanBodyBones = (HumanBodyBones)index;
|
|
Transform boneTransform = component.GetBoneTransform(humanBodyBones);
|
|
if (Object.op_Inequality((Object)boneTransform, (Object)null))
|
|
remainTransforms.Add(boneTransform);
|
|
}
|
|
}
|
|
HashSet<Mesh> meshSet = new HashSet<Mesh>();
|
|
if (sourceBodyMeshes != null)
|
|
{
|
|
foreach (SkinnedMeshRenderer sourceBodyMesh in (IEnumerable<SkinnedMeshRenderer>)sourceBodyMeshes)
|
|
{
|
|
if (!Object.op_Equality((Object)sourceBodyMesh, (Object)null) && !Object.op_Equality((Object)sourceBodyMesh.sharedMesh, (Object)null))
|
|
meshSet.Add(sourceBodyMesh.sharedMesh);
|
|
}
|
|
}
|
|
SkinnedMeshRenderer[] componentsInChildren1 = clone.GetComponentsInChildren<SkinnedMeshRenderer>(true);
|
|
List<SkinnedMeshRenderer> skinnedMeshRendererList = new List<SkinnedMeshRenderer>();
|
|
foreach (SkinnedMeshRenderer skinnedMeshRenderer in componentsInChildren1)
|
|
{
|
|
if (!Object.op_Equality((Object)skinnedMeshRenderer, (Object)null))
|
|
{
|
|
Mesh sharedMesh = skinnedMeshRenderer.sharedMesh;
|
|
if (!Object.op_Equality((Object)sharedMesh, (Object)null) && meshSet.Contains(sharedMesh))
|
|
skinnedMeshRendererList.Add(skinnedMeshRenderer);
|
|
}
|
|
}
|
|
if (skinnedMeshRendererList.Count == 0)
|
|
Debug.LogWarning((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone에서 동일 sharedMesh를 가진 BodyMesh를 찾지 못했습니다.");
|
|
if (skinnedMeshRendererList.Count > 0)
|
|
{
|
|
MeshClassifier meshClassifier = new MeshClassifier();
|
|
foreach (SkinnedMeshRenderer smr in skinnedMeshRendererList)
|
|
{
|
|
if (!Object.op_Equality((Object)smr, (Object)null))
|
|
{
|
|
remainTransforms.Add(((Component)smr).transform);
|
|
HashSet<Transform> activeBones = meshClassifier.GetActiveBones(smr);
|
|
if (activeBones == null)
|
|
{
|
|
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone smr '{((Object)smr).name}' has null bones array (mesh='{((Object)smr.sharedMesh)?.name}')");
|
|
}
|
|
else
|
|
{
|
|
foreach (Transform transform in activeBones)
|
|
{
|
|
if (!Object.op_Equality((Object)transform, (Object)null))
|
|
remainTransforms.Add(transform);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach (Transform t in remainTransforms.ToList<Transform>())
|
|
AddWithParents(t);
|
|
Transform[] componentsInChildren2 = clone.GetComponentsInChildren<Transform>(true);
|
|
for (int index = componentsInChildren2.Length - 1; index >= 0; --index)
|
|
{
|
|
Transform transform = componentsInChildren2[index];
|
|
if (!Object.op_Equality((Object)transform, (Object)null) && !Object.op_Equality((Object)transform, (Object)clone.transform) && !remainTransforms.Contains(transform))
|
|
Object.DestroyImmediate((Object)((Component)transform).gameObject);
|
|
}
|
|
proxyBodyMeshes = skinnedMeshRendererList;
|
|
new BoneMatchUtil().BuildSourceToProxyBoneMap(sourceAvatar, component, out sourceToProxy);
|
|
return clone;
|
|
|
|
void AddWithParents(Transform t)
|
|
{
|
|
for (; Object.op_Inequality((Object)t, (Object)null) && Object.op_Inequality((Object)t, (Object)clone.transform); t = t.parent)
|
|
remainTransforms.Add(t);
|
|
}
|
|
}
|
|
|
|
public Vector3 GetComprehensiveScale(
|
|
Transform rootT,
|
|
Dictionary<HumanBodyBones, HashSet<Transform>> clothHumanoidBoneMap,
|
|
ProfileData profileData)
|
|
{
|
|
if (Object.op_Equality((Object)rootT, (Object)null))
|
|
throw new AutoMorpherException("Root Transform is Missing", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - rootT is null");
|
|
if (profileData.bones == null || profileData.bones.Count == 0)
|
|
throw new AutoMorpherException("Profile Bones are Missing", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - profileData.bones is null or empty");
|
|
Transform transform1 = (Transform)null;
|
|
HashSet<Transform> transformSet;
|
|
if (clothHumanoidBoneMap.TryGetValue((HumanBodyBones)0, out transformSet) && transformSet != null && transformSet.Count > 0)
|
|
{
|
|
foreach (Transform transform2 in transformSet)
|
|
{
|
|
if (Object.op_Inequality((Object)transform2, (Object)null))
|
|
{
|
|
transform1 = transform2;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (Object.op_Equality((Object)transform1, (Object)null))
|
|
throw new AutoMorpherException("Hip Transform is Missing", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - failed to get [hip] transform from clothHumanoidBoneMap");
|
|
BoneData boneData = (BoneData)null;
|
|
for (int index = 0; index < profileData.bones.Count; ++index)
|
|
{
|
|
BoneData bone = profileData.bones[index];
|
|
if (bone != null && bone.hBone == null)
|
|
{
|
|
boneData = bone;
|
|
break;
|
|
}
|
|
}
|
|
Vector3 vector3_1 = boneData != null ? boneData.rootLocalScale : throw new AutoMorpherException("Hip Bone Data is Missing in Profile", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - profileData bones does not contain Hips");
|
|
Vector3 lossyScale1 = rootT.lossyScale;
|
|
Vector3 lossyScale2 = transform1.lossyScale;
|
|
Vector3 vector3_2;
|
|
// ISSUE: explicit constructor call
|
|
((Vector3)ref vector3_2).\u002Ector(lossyScale2.x / lossyScale1.x, lossyScale2.y / lossyScale1.y, lossyScale2.z / lossyScale1.z);
|
|
return new Vector3(vector3_2.x / vector3_1.x, vector3_2.y / vector3_1.y, vector3_2.z / vector3_1.z);
|
|
}
|
|
}
|
|
}
|