Compare commits
1 Commits
349976b787
...
1aac69c7d2
| Author | SHA1 | Date | |
|---|---|---|---|
| 1aac69c7d2 |
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3f15b8b51b341c647a98a34a47707efb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0a87e8255c6175649ab3d14c5d7390a0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,19 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.BaseKey3
|
||||
public struct BaseKey3
|
||||
{
|
||||
public uint x;
|
||||
|
||||
public uint y;
|
||||
|
||||
public uint z;
|
||||
|
||||
public BaseKey3(uint x, uint y, uint z)
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 33819e87e935234448269d35d6e155b5
|
||||
@@ -1,31 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.BoneData
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
[Serializable]
|
||||
public class BoneData
|
||||
{
|
||||
public int id;
|
||||
|
||||
public string boneName;
|
||||
|
||||
public string parentName;
|
||||
|
||||
public string hierarchyPath;
|
||||
|
||||
public HumanBodyBones hBone;
|
||||
|
||||
public int parentId;
|
||||
|
||||
public List<int> childrenIds;
|
||||
|
||||
public Vector3 rootLocalPosition;
|
||||
|
||||
public Quaternion rootLocalRotation;
|
||||
|
||||
public Vector3 rootLocalScale;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8d3573fd768baee41b6e2b78d647bf04
|
||||
@@ -1,16 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.BoneSpatialData
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
[Serializable]
|
||||
public class BoneSpatialData
|
||||
{
|
||||
public HumanBodyBones refBone;
|
||||
|
||||
public PCAData pcaData;
|
||||
|
||||
public VolumeData volumeData;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 48d80c2519b3d8b4a97a8d6d5cd7b159
|
||||
@@ -1,332 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.EdenAutoMorpher_ProfileSaver
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
public class EdenAutoMorpher_ProfileSaver : MonoBehaviour
|
||||
{
|
||||
public Transform sourceAvatar;
|
||||
|
||||
public List<SkinnedMeshRenderer> sourceBodyMeshes = new List<SkinnedMeshRenderer>();
|
||||
|
||||
public string profileName;
|
||||
|
||||
private const float adjustHigh = 1.5f;
|
||||
|
||||
[ContextMenu("SaveProfile")]
|
||||
public void SaveProfile()
|
||||
{
|
||||
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0205: Unknown result type (might be due to invalid IL or missing references)
|
||||
Vector3 position = this.sourceAvatar.position;
|
||||
Quaternion rotation = this.sourceAvatar.rotation;
|
||||
Vector3 localScale = this.sourceAvatar.localScale;
|
||||
Transform parent = this.sourceAvatar.parent;
|
||||
this.sourceAvatar.SetParent((Transform)null);
|
||||
this.sourceAvatar.position = Vector3.zero;
|
||||
this.sourceAvatar.rotation = Quaternion.identity;
|
||||
this.sourceAvatar.localScale = Vector3.one;
|
||||
ProfileData newProfileData = new ProfileData();
|
||||
ProfileUtils profileUtils = new ProfileUtils();
|
||||
newProfileData.version = profileUtils.GetProfileVersion();
|
||||
Animator component = ((Component)this.sourceAvatar).GetComponent<Animator>();
|
||||
if (component == null)
|
||||
{
|
||||
Debug.LogError((object)("[EdenAutoMorpher_ProfileSaver] Source Avatar Has No Animator\nSet Animator to Source Avatar " + this.sourceAvatar.name));
|
||||
}
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> humanoidMeshBoneMap = profileUtils.GetHumanoidMeshBoneMap(component, this.sourceBodyMeshes);
|
||||
List<ProfileBakedBodyMesh> list = new List<ProfileBakedBodyMesh>();
|
||||
foreach (SkinnedMeshRenderer sourceBodyMesh in this.sourceBodyMeshes)
|
||||
{
|
||||
list.Add(new ProfileBakedBodyMesh(sourceBodyMesh));
|
||||
}
|
||||
this.SaveBoneData(ref newProfileData, this.sourceAvatar, humanoidMeshBoneMap, list);
|
||||
ProfileUtils_BVHUtil profileUtils_BVHUtil = new ProfileUtils_BVHUtil();
|
||||
ProfileBVH bVHData = profileUtils_BVHUtil.GetBVHData(this.sourceAvatar, list);
|
||||
profileUtils_BVHUtil.SaveProfileBVH(bVHData, Path.Combine(profileUtils.GetProfileBasePath(), this.profileName), this.profileName);
|
||||
newProfileData.neckTargetHeight = 1.5f;
|
||||
this.AdjustAvatarHigh(this.sourceAvatar, humanoidMeshBoneMap, 1.5f);
|
||||
foreach (ProfileBakedBodyMesh item in list)
|
||||
{
|
||||
item.ReBakeMesh();
|
||||
}
|
||||
this.SaveSpatialData(ref newProfileData, humanoidMeshBoneMap, list);
|
||||
this.SaveProfileToJson(newProfileData, Path.Combine(profileUtils.GetProfileBasePath(), this.profileName), this.profileName);
|
||||
this.sourceAvatar.SetParent(parent);
|
||||
this.sourceAvatar.position = position;
|
||||
this.sourceAvatar.rotation = rotation;
|
||||
this.sourceAvatar.localScale = localScale;
|
||||
}
|
||||
|
||||
public void SaveSpatialData(ref ProfileData newProfileData, Dictionary<HumanBodyBones, HashSet<Transform>> sourceBoneMap, List<ProfileBakedBodyMesh> sourceBodyBakedMeshes)
|
||||
{
|
||||
ProfileUtils profileUtils = new ProfileUtils();
|
||||
HumanBodyBones[] influencedBones = new HumanBodyBones[1] { HumanBodyBones.Neck };
|
||||
newProfileData.NeckSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.Neck, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.LeftUpperArm, HumanBodyBones.LeftLowerArm, HumanBodyBones.LeftHand };
|
||||
newProfileData.LeftUpperArmSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftUpperArm, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.RightUpperArm, HumanBodyBones.RightLowerArm, HumanBodyBones.RightHand };
|
||||
newProfileData.RightUpperArmSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightUpperArm, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftLowerArm };
|
||||
newProfileData.LeftLowerArmSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftLowerArm, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightLowerArm };
|
||||
newProfileData.RightLowerArmSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightLowerArm, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftHand };
|
||||
newProfileData.LeftLowerArm_HandSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftLowerArm, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightHand };
|
||||
newProfileData.RightLowerArm_HandSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightLowerArm, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[2] { HumanBodyBones.LeftUpperLeg, HumanBodyBones.LeftLowerLeg };
|
||||
newProfileData.LeftUpperLegSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftUpperLeg, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[2] { HumanBodyBones.RightUpperLeg, HumanBodyBones.RightLowerLeg };
|
||||
newProfileData.RightUpperLegSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightUpperLeg, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftFoot };
|
||||
newProfileData.LeftFootSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftFoot, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightFoot };
|
||||
newProfileData.RightFootSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightFoot, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.Chest };
|
||||
newProfileData.ChestSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.Chest, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.UpperChest };
|
||||
newProfileData.UpperChestSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.UpperChest, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[2] { HumanBodyBones.Chest, HumanBodyBones.UpperChest };
|
||||
newProfileData.IntegratedChestSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.Chest, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.Spine };
|
||||
newProfileData.SpineSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.Spine, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftHand };
|
||||
newProfileData.LeftHandSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftHand, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.LeftThumbProximal, HumanBodyBones.LeftThumbIntermediate, HumanBodyBones.LeftThumbDistal };
|
||||
newProfileData.LeftHandThumbSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftThumbProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftThumbProximal };
|
||||
newProfileData.LeftHandThumbProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftThumbProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftThumbIntermediate };
|
||||
newProfileData.LeftHandThumbIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftThumbIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftThumbDistal };
|
||||
newProfileData.LeftHandThumbDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftThumbDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.LeftIndexProximal, HumanBodyBones.LeftIndexIntermediate, HumanBodyBones.LeftIndexDistal };
|
||||
newProfileData.LeftHandIndexSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftIndexProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftIndexProximal };
|
||||
newProfileData.LeftHandIndexProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftIndexProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftIndexIntermediate };
|
||||
newProfileData.LeftHandIndexIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftIndexIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftIndexDistal };
|
||||
newProfileData.LeftHandIndexDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftIndexDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.LeftMiddleProximal, HumanBodyBones.LeftMiddleIntermediate, HumanBodyBones.LeftMiddleDistal };
|
||||
newProfileData.LeftHandMiddleSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftMiddleProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftMiddleProximal };
|
||||
newProfileData.LeftHandMiddleProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftMiddleProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftMiddleIntermediate };
|
||||
newProfileData.LeftHandMiddleIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftMiddleIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftMiddleDistal };
|
||||
newProfileData.LeftHandMiddleDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftMiddleDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.LeftRingProximal, HumanBodyBones.LeftRingIntermediate, HumanBodyBones.LeftRingDistal };
|
||||
newProfileData.LeftHandRingSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftRingProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftRingProximal };
|
||||
newProfileData.LeftHandRingProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftRingProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftRingIntermediate };
|
||||
newProfileData.LeftHandRingIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftRingIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftRingDistal };
|
||||
newProfileData.LeftHandRingDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftRingDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.LeftLittleProximal, HumanBodyBones.LeftLittleIntermediate, HumanBodyBones.LeftLittleDistal };
|
||||
newProfileData.LeftHandLittleSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftLittleProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftLittleProximal };
|
||||
newProfileData.LeftHandLittleProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftLittleProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftLittleIntermediate };
|
||||
newProfileData.LeftHandLittleIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftLittleIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.LeftLittleDistal };
|
||||
newProfileData.LeftHandLittleDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.LeftLittleDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightHand };
|
||||
newProfileData.RightHandSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightHand, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.RightThumbProximal, HumanBodyBones.RightThumbIntermediate, HumanBodyBones.RightThumbDistal };
|
||||
newProfileData.RightHandThumbSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightThumbProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightThumbProximal };
|
||||
newProfileData.RightHandThumbProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightThumbProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightThumbIntermediate };
|
||||
newProfileData.RightHandThumbIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightThumbIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightThumbDistal };
|
||||
newProfileData.RightHandThumbDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightThumbDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.RightIndexProximal, HumanBodyBones.RightIndexIntermediate, HumanBodyBones.RightIndexDistal };
|
||||
newProfileData.RightHandIndexSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightIndexProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightIndexProximal };
|
||||
newProfileData.RightHandIndexProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightIndexProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightIndexIntermediate };
|
||||
newProfileData.RightHandIndexIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightIndexIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightIndexDistal };
|
||||
newProfileData.RightHandIndexDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightIndexDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.RightMiddleProximal, HumanBodyBones.RightMiddleIntermediate, HumanBodyBones.RightMiddleDistal };
|
||||
newProfileData.RightHandMiddleSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightMiddleProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightMiddleProximal };
|
||||
newProfileData.RightHandMiddleProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightMiddleProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightMiddleIntermediate };
|
||||
newProfileData.RightHandMiddleIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightMiddleIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightMiddleDistal };
|
||||
newProfileData.RightHandMiddleDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightMiddleDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.RightRingProximal, HumanBodyBones.RightRingIntermediate, HumanBodyBones.RightRingDistal };
|
||||
newProfileData.RightHandRingSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightRingProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightRingProximal };
|
||||
newProfileData.RightHandRingProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightRingProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightRingIntermediate };
|
||||
newProfileData.RightHandRingIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightRingIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightRingDistal };
|
||||
newProfileData.RightHandRingDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightRingDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[3] { HumanBodyBones.RightLittleProximal, HumanBodyBones.RightLittleIntermediate, HumanBodyBones.RightLittleDistal };
|
||||
newProfileData.RightHandLittleSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightLittleProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes, addChildBones: true);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightLittleProximal };
|
||||
newProfileData.RightHandLittleProximalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightLittleProximal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightLittleIntermediate };
|
||||
newProfileData.RightHandLittleIntermediateSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightLittleIntermediate, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
|
||||
influencedBones = new HumanBodyBones[1] { HumanBodyBones.RightLittleDistal };
|
||||
newProfileData.RightHandLittleDistalSpatialData = profileUtils.GetBoneSpatialData(HumanBodyBones.RightLittleDistal, influencedBones, sourceBoneMap, sourceBodyBakedMeshes);
|
||||
}
|
||||
|
||||
public void SaveBoneData(ref ProfileData newProfileData, Transform sourceAvatar, Dictionary<HumanBodyBones, HashSet<Transform>> sourceBoneMap, List<ProfileBakedBodyMesh> sourceBodyBakedMeshes)
|
||||
{
|
||||
ProfileUtils profileUtils = new ProfileUtils();
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
foreach (ProfileBakedBodyMesh sourceBodyBakedMesh in sourceBodyBakedMeshes)
|
||||
{
|
||||
foreach (Transform bodyMeshBone in profileUtils.GetBodyMeshBones(sourceBodyBakedMesh.smr))
|
||||
{
|
||||
hashSet.Add(bodyMeshBone);
|
||||
}
|
||||
}
|
||||
if (hashSet.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[EdenAutoMorpher_ProfileSaver] SaveBoneData - avatarBones is empty.");
|
||||
newProfileData.boneRootId = -1;
|
||||
newProfileData.bones = new List<BoneData>();
|
||||
}
|
||||
else
|
||||
{
|
||||
newProfileData.boneRootId = 0;
|
||||
newProfileData.bones = profileUtils.GetBoneDatas(sourceAvatar, hashSet, sourceBoneMap);
|
||||
}
|
||||
}
|
||||
|
||||
private void AdjustAvatarHigh(Transform sourceRoot, Dictionary<HumanBodyBones, HashSet<Transform>> sourceBoneMap, float targetHeight)
|
||||
{
|
||||
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (!sourceBoneMap.TryGetValue(HumanBodyBones.Neck, out var value) || value.Count == 0)
|
||||
{
|
||||
Debug.LogError("[EdenAutoMorpher_ProfileSaver] Can't Find Neck Bones");
|
||||
return;
|
||||
}
|
||||
float num = value.FirstOrDefault().position.y - sourceRoot.position.y;
|
||||
if (Mathf.Approximately(num, 0f))
|
||||
{
|
||||
Debug.LogWarning($"[EdenAutoMorpher_ProfileSaver] {sourceRoot.name} Neck Y가 0에 가까워 스케일 계산을 건너뜁니다. (neckY = {num})");
|
||||
return;
|
||||
}
|
||||
float num2 = targetHeight / num;
|
||||
Vector3 localScale = sourceRoot.localScale;
|
||||
localScale *= num2;
|
||||
sourceRoot.localScale = localScale;
|
||||
}
|
||||
|
||||
private void SaveProfileToJson(ProfileData profileData, string savePath, string profileName)
|
||||
{
|
||||
if (profileData == null)
|
||||
{
|
||||
Debug.LogError("[EdenAutoMorpher_ProfileSaver] ProfileData is null. Abort save.");
|
||||
return;
|
||||
}
|
||||
if (string.IsNullOrEmpty(profileName))
|
||||
{
|
||||
Debug.LogError("[EdenAutoMorpher_ProfileSaver] profileName is empty.");
|
||||
return;
|
||||
}
|
||||
string path = profileName.EndsWith(".json") ? profileName : (profileName + ".json");
|
||||
string text = Path.Combine(Application.dataPath, savePath ?? string.Empty);
|
||||
if (!Directory.Exists(text))
|
||||
{
|
||||
Directory.CreateDirectory(text);
|
||||
}
|
||||
string text2 = Path.Combine(text, path);
|
||||
string contents = JsonUtility.ToJson(profileData, true);
|
||||
File.WriteAllText(text2, contents);
|
||||
Debug.Log("[EdenAutoMorpher_ProfileSaver] Profile saved successfully.\nPath: " + text2);
|
||||
AssetDatabase.Refresh();
|
||||
}
|
||||
|
||||
public bool IsExistBaseData()
|
||||
{
|
||||
ProfileUtils profileUtils = new ProfileUtils();
|
||||
return File.Exists(Path.Combine(Application.dataPath, profileUtils.GetBaseDataPath()));
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2fd1a8210b48a8d49843a3f2859e67b6
|
||||
@@ -1,18 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.PCAData
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
[Serializable]
|
||||
public class PCAData
|
||||
{
|
||||
public Vector3 pcaCenter;
|
||||
|
||||
public Vector3 pcaPrincipalAxis;
|
||||
|
||||
public float pcaLength;
|
||||
|
||||
public float pcaAvgRadius;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba923ad66ccb9824aa21217281bc8f03
|
||||
@@ -1,17 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileBVH
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileBVH
|
||||
{
|
||||
public List<Vector3> vertices;
|
||||
|
||||
public profileBVHData[] datas;
|
||||
|
||||
public profileBVHNode[] nodes;
|
||||
|
||||
public int[] dataIndices;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ca85c008bacb4c04fab51354ef3d6365
|
||||
@@ -1,106 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileBakedBodyMesh
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileBakedBodyMesh
|
||||
{
|
||||
public SkinnedMeshRenderer smr;
|
||||
|
||||
public Mesh bakedMesh;
|
||||
|
||||
public Vector3[] worldVertices;
|
||||
|
||||
public BoneWeight[] boneWeights
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!((Object)(object)this.smr != (Object)null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return this.smr.sharedMesh.boneWeights;
|
||||
}
|
||||
}
|
||||
|
||||
public Transform[] bones
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!((Object)(object)this.smr != (Object)null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return this.smr.bones;
|
||||
}
|
||||
}
|
||||
|
||||
public ProfileBakedBodyMesh(SkinnedMeshRenderer _smr)
|
||||
{
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006d: Expected O, but got Unknown
|
||||
if ((Object)(object)_smr == (Object)null)
|
||||
{
|
||||
Debug.LogError((object)("[ProfileUtil - ProfileBakedBodyMesh] BakeBodyMesh Init : SkinnedMeshRenderer " + ((Object)((Component)_smr).gameObject).name + " is null"));
|
||||
}
|
||||
this.smr = _smr;
|
||||
if ((Object)(object)_smr.sharedMesh == (Object)null)
|
||||
{
|
||||
Debug.LogError((object)("[ProfileUtil - ProfileBakedBodyMesh] BakeBodyMesh Init : SkinnedMeshRenderer " + ((Object)((Component)_smr).gameObject).name + " has null sharedMesh."));
|
||||
}
|
||||
this.bakedMesh = new Mesh();
|
||||
this.smr.BakeMesh(this.bakedMesh);
|
||||
this.worldVertices = this.CalculateWorldVertices(this.smr, this.bakedMesh);
|
||||
}
|
||||
|
||||
public void ReBakeMesh()
|
||||
{
|
||||
this.smr.BakeMesh(this.bakedMesh);
|
||||
this.worldVertices = this.CalculateWorldVertices(this.smr, this.bakedMesh);
|
||||
}
|
||||
|
||||
~ProfileBakedBodyMesh()
|
||||
{
|
||||
this.smr = null;
|
||||
this.bakedMesh = null;
|
||||
}
|
||||
|
||||
private Vector3[] CalculateWorldVertices(SkinnedMeshRenderer smr, Mesh bakedMesh)
|
||||
{
|
||||
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)smr == (Object)null)
|
||||
{
|
||||
Debug.LogError((object)("[ProfileUtil - ProfileBakedBodyMesh] CalculateWorldVertices: smr " + ((Object)((Component)smr).gameObject).name + " == null"));
|
||||
return null;
|
||||
}
|
||||
if ((Object)(object)bakedMesh == (Object)null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
Transform transform = ((Component)smr).transform;
|
||||
Vector3 lossyScale = transform.lossyScale;
|
||||
Vector3 val = new Vector3(1f / Mathf.Max(lossyScale.x, 1E-08f), 1f / Mathf.Max(lossyScale.y, 1E-08f), 1f / Mathf.Max(lossyScale.z, 1E-08f));
|
||||
Matrix4x4 val2 = transform.localToWorldMatrix * Matrix4x4.Scale(val);
|
||||
Vector3[] vertices = bakedMesh.vertices;
|
||||
int num = vertices.Length;
|
||||
Vector3[] array = (Vector3[])(object)new Vector3[num];
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
array[i] = val2.MultiplyPoint3x4(vertices[i]);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1b9accce356c005478e76fd0fa193f3a
|
||||
@@ -1,132 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileData
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
[Serializable]
|
||||
public class ProfileData
|
||||
{
|
||||
public int version = 1;
|
||||
|
||||
public float neckTargetHeight = 1.5f;
|
||||
|
||||
public BoneSpatialData NeckSpatialData;
|
||||
|
||||
public BoneSpatialData LeftUpperArmSpatialData;
|
||||
|
||||
public BoneSpatialData RightUpperArmSpatialData;
|
||||
|
||||
public BoneSpatialData LeftLowerArmSpatialData;
|
||||
|
||||
public BoneSpatialData RightLowerArmSpatialData;
|
||||
|
||||
public BoneSpatialData LeftLowerArm_HandSpatialData;
|
||||
|
||||
public BoneSpatialData RightLowerArm_HandSpatialData;
|
||||
|
||||
public BoneSpatialData LeftUpperLegSpatialData;
|
||||
|
||||
public BoneSpatialData RightUpperLegSpatialData;
|
||||
|
||||
public BoneSpatialData LeftFootSpatialData;
|
||||
|
||||
public BoneSpatialData RightFootSpatialData;
|
||||
|
||||
public BoneSpatialData ChestSpatialData;
|
||||
|
||||
public BoneSpatialData UpperChestSpatialData;
|
||||
|
||||
public BoneSpatialData IntegratedChestSpatialData;
|
||||
|
||||
public BoneSpatialData SpineSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandThumbSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandThumbProximalSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandThumbIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandThumbDistalSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandIndexSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandIndexProximalSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandIndexIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandIndexDistalSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandMiddleSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandMiddleProximalSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandMiddleIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandMiddleDistalSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandRingSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandRingProximalSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandRingIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandRingDistalSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandLittleSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandLittleProximalSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandLittleIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData LeftHandLittleDistalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandThumbSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandThumbProximalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandThumbIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandThumbDistalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandIndexSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandIndexProximalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandIndexIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandIndexDistalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandMiddleSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandMiddleProximalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandMiddleIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandMiddleDistalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandRingSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandRingProximalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandRingIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandRingDistalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandLittleSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandLittleProximalSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandLittleIntermediateSpatialData;
|
||||
|
||||
public BoneSpatialData RightHandLittleDistalSpatialData;
|
||||
|
||||
public int boneRootId;
|
||||
|
||||
public List<BoneData> bones;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d62ebbd77f472fd4bb8abf3546d9d12a
|
||||
@@ -1,280 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileUtil_IndexUtil
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileUtil_IndexUtil
|
||||
{
|
||||
public class BlockPermutations
|
||||
{
|
||||
private struct XorShift32
|
||||
{
|
||||
private uint _state;
|
||||
|
||||
public XorShift32(uint seed)
|
||||
{
|
||||
this._state = ((seed != 0) ? seed : 1831565813u);
|
||||
}
|
||||
|
||||
public uint NextUInt()
|
||||
{
|
||||
uint state = this._state;
|
||||
state ^= state << 13;
|
||||
state ^= state >> 17;
|
||||
return this._state = state ^ (state << 5);
|
||||
}
|
||||
|
||||
public int NextInt(int maxExclusive)
|
||||
{
|
||||
return (int)(this.NextUInt() % (uint)maxExclusive);
|
||||
}
|
||||
}
|
||||
|
||||
private readonly int _blockSize;
|
||||
|
||||
private int[] _px;
|
||||
|
||||
private int[] _py;
|
||||
|
||||
private int[] _pz;
|
||||
|
||||
private int[] _pall;
|
||||
|
||||
private uint _checksum;
|
||||
|
||||
private int _cachedLen = -1;
|
||||
|
||||
private int[] _pxLen;
|
||||
|
||||
private int[] _pyLen;
|
||||
|
||||
private int[] _pzLen;
|
||||
|
||||
private int[] _pallLen;
|
||||
|
||||
public BlockPermutations(int blockSize)
|
||||
{
|
||||
this._blockSize = blockSize;
|
||||
}
|
||||
|
||||
public void Build(int seed)
|
||||
{
|
||||
if (this._blockSize <= 1)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_IndexUtil] BlockPermutations.Build - invalid blockSize");
|
||||
return;
|
||||
}
|
||||
XorShift32 rng = new XorShift32((uint)(seed ^ -1556008596));
|
||||
XorShift32 rng2 = new XorShift32((uint)(seed ^ -939442524));
|
||||
XorShift32 rng3 = new XorShift32((uint)(seed ^ -1383041155));
|
||||
XorShift32 rng4 = new XorShift32((uint)(seed ^ 0x7E95761E));
|
||||
this._px = this.MakePermutation(this._blockSize, ref rng);
|
||||
this._py = this.MakePermutation(this._blockSize, ref rng2);
|
||||
this._pz = this.MakePermutation(this._blockSize, ref rng3);
|
||||
this._pall = this.MakePermutation(this._blockSize, ref rng4);
|
||||
this._checksum = this.ComputeChecksum(this._px, this._py, this._pz, this._pall);
|
||||
this._cachedLen = -1;
|
||||
this._pxLen = (this._pyLen = (this._pzLen = (this._pallLen = null)));
|
||||
}
|
||||
|
||||
public bool ValidateRebuild(int seed)
|
||||
{
|
||||
uint checksum = this._checksum;
|
||||
BlockPermutations blockPermutations = new BlockPermutations(this._blockSize);
|
||||
blockPermutations.Build(seed);
|
||||
return blockPermutations._checksum == checksum;
|
||||
}
|
||||
|
||||
public void GetPermutationsForLen(int len, out int[] pxUse, out int[] pyUse, out int[] pzUse, out int[] pallUse)
|
||||
{
|
||||
if (len == this._blockSize)
|
||||
{
|
||||
pxUse = this._px;
|
||||
pyUse = this._py;
|
||||
pzUse = this._pz;
|
||||
pallUse = this._pall;
|
||||
return;
|
||||
}
|
||||
if (this._cachedLen != len)
|
||||
{
|
||||
this._cachedLen = len;
|
||||
this._pxLen = this.MakeSubPermutation(this._px, len);
|
||||
this._pyLen = this.MakeSubPermutation(this._py, len);
|
||||
this._pzLen = this.MakeSubPermutation(this._pz, len);
|
||||
this._pallLen = this.MakeSubPermutation(this._pall, len);
|
||||
}
|
||||
pxUse = this._pxLen;
|
||||
pyUse = this._pyLen;
|
||||
pzUse = this._pzLen;
|
||||
pallUse = this._pallLen;
|
||||
}
|
||||
|
||||
private int[] MakeSubPermutation(int[] fullPerm, int len)
|
||||
{
|
||||
int[] array = new int[len];
|
||||
int num = 0;
|
||||
for (int i = 0; i < fullPerm.Length; i++)
|
||||
{
|
||||
if (num >= len)
|
||||
{
|
||||
break;
|
||||
}
|
||||
int num2 = fullPerm[i];
|
||||
if (num2 < len)
|
||||
{
|
||||
array[num++] = num2;
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
private int[] MakePermutation(int n, ref XorShift32 rng)
|
||||
{
|
||||
int[] array = new int[n];
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
array[i] = i;
|
||||
}
|
||||
for (int num = n - 1; num > 0; num--)
|
||||
{
|
||||
int num2 = rng.NextInt(num + 1);
|
||||
ref int reference = ref array[num];
|
||||
ref int reference2 = ref array[num2];
|
||||
int num3 = array[num2];
|
||||
int num4 = array[num];
|
||||
reference = num3;
|
||||
reference2 = num4;
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
private uint ComputeChecksum(int[] a, int[] b, int[] c, int[] d)
|
||||
{
|
||||
uint h = 2166136261u;
|
||||
this.MixArray(ref h, a);
|
||||
this.MixArray(ref h, b);
|
||||
this.MixArray(ref h, c);
|
||||
this.MixArray(ref h, d);
|
||||
return h;
|
||||
}
|
||||
|
||||
private void MixArray(ref uint h, int[] arr)
|
||||
{
|
||||
for (int i = 0; i < arr.Length; i++)
|
||||
{
|
||||
uint num = (uint)arr[i];
|
||||
h ^= num;
|
||||
h *= 16777619u;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public readonly int blockSize = 9783;
|
||||
|
||||
private readonly BlockPermutations _perm;
|
||||
|
||||
private float[] _xTmp;
|
||||
|
||||
private float[] _yTmp;
|
||||
|
||||
private float[] _zTmp;
|
||||
|
||||
public ProfileUtil_IndexUtil(int blockSize = 9783)
|
||||
{
|
||||
this.blockSize = blockSize;
|
||||
this._perm = new BlockPermutations(blockSize);
|
||||
this._xTmp = new float[blockSize];
|
||||
this._yTmp = new float[blockSize];
|
||||
this._zTmp = new float[blockSize];
|
||||
}
|
||||
|
||||
public void Build(int seed)
|
||||
{
|
||||
this._perm.Build(seed);
|
||||
}
|
||||
|
||||
public void EncodeInto(Vector3[] input, Vector3[] output)
|
||||
{
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (input == null || output == null)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_IndexUtil] EncodeInto - null args");
|
||||
return;
|
||||
}
|
||||
if (output.Length < input.Length)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_IndexUtil] EncodeInto - output too small");
|
||||
return;
|
||||
}
|
||||
int num = input.Length;
|
||||
int num2 = this.blockSize;
|
||||
int num3 = (num + num2 - 1) / num2;
|
||||
for (int i = 0; i < num3; i++)
|
||||
{
|
||||
int num4 = i * num2;
|
||||
int num5 = Mathf.Min(num2, num - num4);
|
||||
this._perm.GetPermutationsForLen(num5, out var pxUse, out var pyUse, out var pzUse, out var pallUse);
|
||||
for (int j = 0; j < num5; j++)
|
||||
{
|
||||
Vector3 val = input[num4 + j];
|
||||
this._xTmp[pxUse[j]] = val.x;
|
||||
this._yTmp[pyUse[j]] = val.y;
|
||||
this._zTmp[pzUse[j]] = val.z;
|
||||
}
|
||||
for (int k = 0; k < num5; k++)
|
||||
{
|
||||
int num6 = pallUse[k];
|
||||
output[num4 + num6] = new Vector3(this._xTmp[k], this._yTmp[k], this._zTmp[k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void DecodeInto(Vector3[] encoded, Vector3[] output)
|
||||
{
|
||||
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (encoded == null || output == null)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_IndexUtil] DecodeInto - null args");
|
||||
return;
|
||||
}
|
||||
if (output.Length < encoded.Length)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_IndexUtil] DecodeInto - output too small");
|
||||
return;
|
||||
}
|
||||
int num = encoded.Length;
|
||||
int num2 = this.blockSize;
|
||||
int num3 = (num + num2 - 1) / num2;
|
||||
for (int i = 0; i < num3; i++)
|
||||
{
|
||||
int num4 = i * num2;
|
||||
int num5 = Mathf.Min(num2, num - num4);
|
||||
this._perm.GetPermutationsForLen(num5, out var pxUse, out var pyUse, out var pzUse, out var pallUse);
|
||||
for (int j = 0; j < num5; j++)
|
||||
{
|
||||
int num6 = pallUse[j];
|
||||
Vector3 val = encoded[num4 + num6];
|
||||
this._xTmp[j] = val.x;
|
||||
this._yTmp[j] = val.y;
|
||||
this._zTmp[j] = val.z;
|
||||
}
|
||||
for (int k = 0; k < num5; k++)
|
||||
{
|
||||
output[num4 + k] = new Vector3(this._xTmp[pxUse[k]], this._yTmp[pyUse[k]], this._zTmp[pzUse[k]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 08f2754ac23e3bd419413380289a1d1f
|
||||
@@ -1,75 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileUtils
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileUtils
|
||||
{
|
||||
private ProfileUtils_BoneUtil boneUtil;
|
||||
|
||||
private ProfileUtils_PoseUtil poseUtil;
|
||||
|
||||
private string profileBasePath = "@Eden_Tools\\Eden_AutoMorpher\\Profiles";
|
||||
|
||||
private string baseDataPath = "@Eden_Tools\\Eden_AutoMorpher\\ProfileSaver\\BaseData\\base.vb";
|
||||
|
||||
private int profileVersion = 1;
|
||||
|
||||
private string profileMagic = "PBVH";
|
||||
|
||||
private string baseMagic = "PVTB";
|
||||
|
||||
public ProfileUtils()
|
||||
{
|
||||
this.boneUtil = new ProfileUtils_BoneUtil();
|
||||
this.poseUtil = new ProfileUtils_PoseUtil();
|
||||
}
|
||||
|
||||
public string GetProfileBasePath()
|
||||
{
|
||||
return this.profileBasePath;
|
||||
}
|
||||
|
||||
public string GetBaseDataPath()
|
||||
{
|
||||
return this.baseDataPath;
|
||||
}
|
||||
|
||||
public int GetProfileVersion()
|
||||
{
|
||||
return this.profileVersion;
|
||||
}
|
||||
|
||||
public string GetProfileMagic()
|
||||
{
|
||||
return this.profileMagic;
|
||||
}
|
||||
|
||||
public string GetBaseMagic()
|
||||
{
|
||||
return this.baseMagic;
|
||||
}
|
||||
|
||||
public Dictionary<HumanBodyBones, HashSet<Transform>> GetHumanoidMeshBoneMap(Animator animator, IReadOnlyList<SkinnedMeshRenderer> bodyMeshes, float posTolerance = 0.0001f, float weightThreshold = 0.0001f)
|
||||
{
|
||||
return this.boneUtil.GetHumanoidMeshBoneMap(animator, bodyMeshes, posTolerance, weightThreshold);
|
||||
}
|
||||
|
||||
public BoneSpatialData GetBoneSpatialData(HumanBodyBones refBone, HumanBodyBones[] influencedBones, Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, List<ProfileBakedBodyMesh> sourceBodyBakedMeshes, bool addChildBones = false)
|
||||
{
|
||||
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
|
||||
return this.poseUtil.GetBoneSpatialData(refBone, influencedBones, boneMap, sourceBodyBakedMeshes, addChildBones);
|
||||
}
|
||||
|
||||
public HashSet<Transform> GetBodyMeshBones(SkinnedMeshRenderer smr, float weightThreshold = 0.0001f)
|
||||
{
|
||||
return this.boneUtil.GetBodyMeshBones(smr, weightThreshold);
|
||||
}
|
||||
|
||||
public List<BoneData> GetBoneDatas(Transform rootTransform, HashSet<Transform> avatarBones, Dictionary<HumanBodyBones, HashSet<Transform>> sourceBoneMap)
|
||||
{
|
||||
return this.boneUtil.GetBoneDatas(rootTransform, avatarBones, sourceBoneMap);
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0575b5a00bd94c64d96d49da0465ee70
|
||||
@@ -1,354 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileUtils_BVHUtil
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileUtils_BVHUtil
|
||||
{
|
||||
private const int LeafMaxTriangles = 4;
|
||||
|
||||
public ProfileBVH GetBVHData(Transform rootTransform, List<ProfileBakedBodyMesh> bakedBodyMeshes)
|
||||
{
|
||||
return this.BuildFromSkinnedMeshes(rootTransform, bakedBodyMeshes);
|
||||
}
|
||||
|
||||
public ProfileBVH BuildFromSkinnedMeshes(Transform rootTransform, List<ProfileBakedBodyMesh> bakedBodyMeshes)
|
||||
{
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
|
||||
ProfileBVH profileBVH = new ProfileBVH
|
||||
{
|
||||
vertices = new List<Vector3>(1024)
|
||||
};
|
||||
int num = 0;
|
||||
foreach (ProfileBakedBodyMesh bakedBodyMesh in bakedBodyMeshes)
|
||||
{
|
||||
if (bakedBodyMesh != null && !(bakedBodyMesh.smr == null) && !(bakedBodyMesh.smr.sharedMesh == null))
|
||||
{
|
||||
num += bakedBodyMesh.smr.sharedMesh.triangles.Length / 3;
|
||||
}
|
||||
}
|
||||
if (num == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
profileBVH.datas = new profileBVHData[num];
|
||||
Matrix4x4 worldToLocalMatrix = rootTransform.worldToLocalMatrix;
|
||||
int num2 = 0;
|
||||
foreach (ProfileBakedBodyMesh bakedBodyMesh2 in bakedBodyMeshes)
|
||||
{
|
||||
if (bakedBodyMesh2 != null && !(bakedBodyMesh2.smr == null) && !(bakedBodyMesh2.smr.sharedMesh == null))
|
||||
{
|
||||
int count = profileBVH.vertices.Count;
|
||||
for (int i = 0; i < bakedBodyMesh2.worldVertices.Length; i++)
|
||||
{
|
||||
Vector3 item = worldToLocalMatrix.MultiplyPoint3x4(bakedBodyMesh2.worldVertices[i]);
|
||||
profileBVH.vertices.Add(item);
|
||||
}
|
||||
int[] triangles = bakedBodyMesh2.smr.sharedMesh.triangles;
|
||||
int num3 = triangles.Length / 3;
|
||||
for (int j = 0; j < num3; j++)
|
||||
{
|
||||
int num4 = triangles[j * 3];
|
||||
int num5 = triangles[j * 3 + 1];
|
||||
int num6 = triangles[j * 3 + 2];
|
||||
profileBVH.datas[num2++] = new profileBVHData
|
||||
{
|
||||
verA = count + num4,
|
||||
verB = count + num5,
|
||||
verC = count + num6
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
int num7 = num;
|
||||
int[] array = new int[num7];
|
||||
for (int k = 0; k < num7; k++)
|
||||
{
|
||||
array[k] = k;
|
||||
}
|
||||
profileBVH.dataIndices = array;
|
||||
List<profileBVHNode> list = new List<profileBVHNode>();
|
||||
this.BuildRecursive(profileBVH, array, 0, num7, list);
|
||||
profileBVH.nodes = list.ToArray();
|
||||
return profileBVH;
|
||||
}
|
||||
|
||||
private int BuildRecursive(ProfileBVH bvh, int[] triIndices, int start, int count, List<profileBVHNode> outNodes)
|
||||
{
|
||||
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0196: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
|
||||
int count2 = outNodes.Count;
|
||||
profileBVHNode profileBVHNode2 = new profileBVHNode();
|
||||
Bounds bounds = default(Bounds);
|
||||
bool flag = true;
|
||||
for (int i = start; i < start + count; i++)
|
||||
{
|
||||
profileBVHData profileBVHData2 = bvh.datas[triIndices[i]];
|
||||
Vector3 val = bvh.vertices[profileBVHData2.verA];
|
||||
Vector3 val2 = bvh.vertices[profileBVHData2.verB];
|
||||
Vector3 val3 = bvh.vertices[profileBVHData2.verC];
|
||||
if (flag)
|
||||
{
|
||||
bounds = new Bounds(val, Vector3.zero);
|
||||
bounds.Encapsulate(val2);
|
||||
bounds.Encapsulate(val3);
|
||||
flag = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
bounds.Encapsulate(val);
|
||||
bounds.Encapsulate(val2);
|
||||
bounds.Encapsulate(val3);
|
||||
}
|
||||
}
|
||||
profileBVHNode2.bounds = bounds;
|
||||
if (count <= 4)
|
||||
{
|
||||
profileBVHNode2.isLeaf = true;
|
||||
profileBVHNode2.start = start;
|
||||
profileBVHNode2.count = count;
|
||||
profileBVHNode2.leftChild = -1;
|
||||
profileBVHNode2.rightChild = -1;
|
||||
outNodes.Add(profileBVHNode2);
|
||||
return count2;
|
||||
}
|
||||
Vector3 size = bounds.size;
|
||||
int num = 0;
|
||||
if (size.y > size.x && size.y > size.z)
|
||||
{
|
||||
num = 1;
|
||||
}
|
||||
else if (size.z > size.x && size.z > size.y)
|
||||
{
|
||||
num = 2;
|
||||
}
|
||||
float num2 = 0f;
|
||||
for (int j = start; j < start + count; j++)
|
||||
{
|
||||
profileBVHData profileBVHData3 = bvh.datas[triIndices[j]];
|
||||
Vector3 val4 = bvh.vertices[profileBVHData3.verA];
|
||||
Vector3 val5 = bvh.vertices[profileBVHData3.verB];
|
||||
Vector3 val6 = bvh.vertices[profileBVHData3.verC];
|
||||
Vector3 val7 = (val4 + val5 + val6) / 3f;
|
||||
num2 += val7[num];
|
||||
}
|
||||
num2 /= (float)count;
|
||||
int num3 = this.Partition(bvh, triIndices, start, count, num, num2);
|
||||
if (num3 == start || num3 == start + count)
|
||||
{
|
||||
num3 = start + count / 2;
|
||||
}
|
||||
profileBVHNode2.isLeaf = false;
|
||||
profileBVHNode2.start = -1;
|
||||
profileBVHNode2.count = 0;
|
||||
outNodes.Add(profileBVHNode2);
|
||||
int leftChild = this.BuildRecursive(bvh, triIndices, start, num3 - start, outNodes);
|
||||
int rightChild = this.BuildRecursive(bvh, triIndices, num3, start + count - num3, outNodes);
|
||||
profileBVHNode2.leftChild = leftChild;
|
||||
profileBVHNode2.rightChild = rightChild;
|
||||
outNodes[count2] = profileBVHNode2;
|
||||
return count2;
|
||||
}
|
||||
|
||||
private int Partition(ProfileBVH bvh, int[] triIndices, int start, int count, int axis, float splitPos)
|
||||
{
|
||||
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
int num = start;
|
||||
int num2 = start + count - 1;
|
||||
while (num <= num2)
|
||||
{
|
||||
profileBVHData profileBVHData2 = bvh.datas[triIndices[num]];
|
||||
profileBVHData profileBVHData3 = bvh.datas[triIndices[num2]];
|
||||
Vector3 val = bvh.vertices[profileBVHData2.verA];
|
||||
Vector3 val2 = bvh.vertices[profileBVHData2.verB];
|
||||
Vector3 val3 = bvh.vertices[profileBVHData2.verC];
|
||||
Vector3 val4 = bvh.vertices[profileBVHData3.verA];
|
||||
Vector3 val5 = bvh.vertices[profileBVHData3.verB];
|
||||
Vector3 val6 = bvh.vertices[profileBVHData3.verC];
|
||||
float num3 = (val[axis] + val2[axis] + val3[axis]) / 3f;
|
||||
_ = (val4[axis] + val5[axis] + val6[axis]) / 3f;
|
||||
if (num3 < splitPos)
|
||||
{
|
||||
num++;
|
||||
continue;
|
||||
}
|
||||
ref int reference = ref triIndices[num];
|
||||
ref int reference2 = ref triIndices[num2];
|
||||
int num4 = triIndices[num2];
|
||||
int num5 = triIndices[num];
|
||||
reference = num4;
|
||||
reference2 = num5;
|
||||
num2--;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
public void SaveProfileBVH(ProfileBVH bvh, string savePath, string profileName)
|
||||
{
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (bvh == null || bvh.vertices == null || bvh.datas == null || bvh.nodes == null || bvh.dataIndices == null)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtils_BVHUtil] SaveProfileBVH - bvh or fields are null");
|
||||
return;
|
||||
}
|
||||
ProfileUtils profileUtils = new ProfileUtils();
|
||||
int num = new System.Random().Next(int.MinValue, int.MaxValue);
|
||||
int count = bvh.vertices.Count;
|
||||
int version;
|
||||
int countInFile;
|
||||
BaseKey3[] array = new ProfileUtils_VertexUtil().LoadTable(profileUtils.GetBaseDataPath(), out version, out countInFile);
|
||||
if (array == null || array.Length == 0)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtils_BVHUtil] SaveProfileBVH - failed to load base vertex table");
|
||||
return;
|
||||
}
|
||||
Vector3[] array2 = bvh.vertices.ToArray();
|
||||
for (int i = 0; i < array2.Length; i++)
|
||||
{
|
||||
array2[i] = this.TransformVec3(array2[i], array[i % array.Length]);
|
||||
}
|
||||
ProfileUtil_IndexUtil profileUtil_IndexUtil = new ProfileUtil_IndexUtil();
|
||||
profileUtil_IndexUtil.Build(num);
|
||||
Vector3[] array3 = (Vector3[])(object)new Vector3[array2.Length];
|
||||
profileUtil_IndexUtil.EncodeInto(array2, array3);
|
||||
StringBuilder stringBuilder = new StringBuilder(1024);
|
||||
stringBuilder.Append(profileUtils.GetProfileMagic());
|
||||
this.AppendHexInt(stringBuilder, profileUtils.GetProfileVersion());
|
||||
this.AppendHexInt(stringBuilder, num);
|
||||
this.AppendHexInt(stringBuilder, count);
|
||||
this.AppendHexInt(stringBuilder, bvh.datas.Length);
|
||||
this.AppendHexInt(stringBuilder, bvh.nodes.Length);
|
||||
this.AppendHexInt(stringBuilder, bvh.dataIndices.Length);
|
||||
for (int j = 0; j < array3.Length; j++)
|
||||
{
|
||||
this.AppendHexVec3(stringBuilder, array3[j]);
|
||||
}
|
||||
for (int k = 0; k < bvh.datas.Length; k++)
|
||||
{
|
||||
profileBVHData profileBVHData2 = bvh.datas[k];
|
||||
this.AppendHexInt(stringBuilder, profileBVHData2.verA);
|
||||
this.AppendHexInt(stringBuilder, profileBVHData2.verB);
|
||||
this.AppendHexInt(stringBuilder, profileBVHData2.verC);
|
||||
}
|
||||
for (int l = 0; l < bvh.nodes.Length; l++)
|
||||
{
|
||||
profileBVHNode profileBVHNode2 = bvh.nodes[l];
|
||||
this.AppendHexVec3(stringBuilder, profileBVHNode2.bounds.center);
|
||||
this.AppendHexVec3(stringBuilder, profileBVHNode2.bounds.extents);
|
||||
this.AppendHexInt(stringBuilder, profileBVHNode2.leftChild);
|
||||
this.AppendHexInt(stringBuilder, profileBVHNode2.rightChild);
|
||||
this.AppendHexInt(stringBuilder, profileBVHNode2.start);
|
||||
this.AppendHexInt(stringBuilder, profileBVHNode2.count);
|
||||
stringBuilder.Append(profileBVHNode2.isLeaf ? '1' : '0');
|
||||
}
|
||||
for (int m = 0; m < bvh.dataIndices.Length; m++)
|
||||
{
|
||||
this.AppendHexInt(stringBuilder, bvh.dataIndices[m]);
|
||||
}
|
||||
string path = (profileName.EndsWith(".eb") ? profileName : (profileName + ".eb"));
|
||||
string text = Path.Combine(Application.dataPath, savePath ?? string.Empty);
|
||||
if (!Directory.Exists(text))
|
||||
{
|
||||
Directory.CreateDirectory(text);
|
||||
}
|
||||
File.WriteAllText(Path.Combine(text, path), stringBuilder.ToString(), Encoding.UTF8);
|
||||
}
|
||||
|
||||
private void AppendHexVec3(StringBuilder sb, Vector3 v)
|
||||
{
|
||||
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
|
||||
this.AppendHexFloat(sb, v.x);
|
||||
this.AppendHexFloat(sb, v.y);
|
||||
this.AppendHexFloat(sb, v.z);
|
||||
}
|
||||
|
||||
private void AppendHexFloat(StringBuilder sb, float v)
|
||||
{
|
||||
int num = BitConverter.SingleToInt32Bits(v);
|
||||
uint num2 = (uint)num;
|
||||
sb.Append(num2.ToString("X8"));
|
||||
}
|
||||
|
||||
private void AppendHexInt(StringBuilder sb, int v)
|
||||
{
|
||||
uint num = (uint)v;
|
||||
sb.Append(num.ToString("X8"));
|
||||
}
|
||||
|
||||
private Vector3 TransformVec3(Vector3 v, BaseKey3 k)
|
||||
{
|
||||
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
|
||||
return new Vector3(this.TransformFloatBits(v.x, k.x), this.TransformFloatBits(v.y, k.y), this.TransformFloatBits(v.z, k.z));
|
||||
}
|
||||
|
||||
private float TransformFloatBits(float a, uint keyBits)
|
||||
{
|
||||
return BitConverter.Int32BitsToSingle(BitConverter.SingleToInt32Bits(a) ^ (int)keyBits);
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c2016668835db4f418cb2b3ef14bd00e
|
||||
@@ -1,403 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileUtils_BoneUtil
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileUtils_BoneUtil
|
||||
{
|
||||
public HashSet<Transform> GetBodyMeshBones(SkinnedMeshRenderer smr, float weightThreshold = 0.0001f)
|
||||
{
|
||||
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
|
||||
Mesh sharedMesh = smr.sharedMesh;
|
||||
if (sharedMesh == null)
|
||||
{
|
||||
Debug.LogError("[ProfileUtils_BoneUtil] SkinnedMeshRenderer에 연결된 Mesh가 없습니다.");
|
||||
return new HashSet<Transform>();
|
||||
}
|
||||
Transform[] bones = smr.bones;
|
||||
BoneWeight[] boneWeights = sharedMesh.boneWeights;
|
||||
HashSet<int> hashSet = new HashSet<int>();
|
||||
BoneWeight[] array = boneWeights;
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
{
|
||||
BoneWeight val = array[i];
|
||||
if (val.weight0 > weightThreshold)
|
||||
{
|
||||
hashSet.Add(val.boneIndex0);
|
||||
}
|
||||
if (val.weight1 > weightThreshold)
|
||||
{
|
||||
hashSet.Add(val.boneIndex1);
|
||||
}
|
||||
if (val.weight2 > weightThreshold)
|
||||
{
|
||||
hashSet.Add(val.boneIndex2);
|
||||
}
|
||||
if (val.weight3 > weightThreshold)
|
||||
{
|
||||
hashSet.Add(val.boneIndex3);
|
||||
}
|
||||
}
|
||||
HashSet<Transform> hashSet2 = new HashSet<Transform>();
|
||||
foreach (int item in hashSet)
|
||||
{
|
||||
if (item >= 0 && item < bones.Length)
|
||||
{
|
||||
hashSet2.Add(bones[item]);
|
||||
}
|
||||
}
|
||||
return hashSet2;
|
||||
}
|
||||
|
||||
public Dictionary<HumanBodyBones, HashSet<Transform>> GetHumanoidMeshBoneMap(Animator animator, IReadOnlyList<SkinnedMeshRenderer> bodyMeshes, float posTolerance = 0.0001f, float weightThreshold = 0.0001f)
|
||||
{
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> dictionary = new Dictionary<HumanBodyBones, HashSet<Transform>>();
|
||||
if (animator == null)
|
||||
{
|
||||
Debug.LogError("[MeshHumanoidBoneMatcher] Animator is Empty");
|
||||
return dictionary;
|
||||
}
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
if (bodyMeshes != null)
|
||||
{
|
||||
foreach (SkinnedMeshRenderer bodyMesh in bodyMeshes)
|
||||
{
|
||||
if (bodyMesh == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform activeBone in this.GetActiveBones(bodyMesh, weightThreshold))
|
||||
{
|
||||
if (activeBone != null)
|
||||
{
|
||||
hashSet.Add(activeBone);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < 55; i++)
|
||||
{
|
||||
HumanBodyBones val = (HumanBodyBones)i;
|
||||
Transform boneTransform = animator.GetBoneTransform(val);
|
||||
if (boneTransform == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
HashSet<Transform> hashSet2 = new HashSet<Transform>();
|
||||
hashSet2.Add(boneTransform);
|
||||
foreach (Transform item in this.FindBonesByPosition(boneTransform, hashSet, posTolerance))
|
||||
{
|
||||
hashSet2.Add(item);
|
||||
}
|
||||
dictionary[val] = hashSet2;
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
public HashSet<Transform> GetActiveBones(SkinnedMeshRenderer smr, float weightThreshold = 0.0001f)
|
||||
{
|
||||
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
|
||||
Mesh sharedMesh = smr.sharedMesh;
|
||||
if (sharedMesh == null)
|
||||
{
|
||||
Debug.LogError((object)"SkinnedMeshRenderer에 연결된 Mesh가 없습니다.");
|
||||
return new HashSet<Transform>();
|
||||
}
|
||||
Transform[] bones = smr.bones;
|
||||
BoneWeight[] boneWeights = sharedMesh.boneWeights;
|
||||
HashSet<int> hashSet = new HashSet<int>();
|
||||
BoneWeight[] array = boneWeights;
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
{
|
||||
BoneWeight val = array[i];
|
||||
if (val.weight0 > weightThreshold)
|
||||
{
|
||||
hashSet.Add(val.boneIndex0);
|
||||
}
|
||||
if (val.weight1 > weightThreshold)
|
||||
{
|
||||
hashSet.Add(val.boneIndex1);
|
||||
}
|
||||
if (val.weight2 > weightThreshold)
|
||||
{
|
||||
hashSet.Add(val.boneIndex2);
|
||||
}
|
||||
if (val.weight3 > weightThreshold)
|
||||
{
|
||||
hashSet.Add(val.boneIndex3);
|
||||
}
|
||||
}
|
||||
HashSet<Transform> hashSet2 = new HashSet<Transform>();
|
||||
foreach (int item in hashSet)
|
||||
{
|
||||
if (item >= 0 && item < bones.Length)
|
||||
{
|
||||
hashSet2.Add(bones[item]);
|
||||
}
|
||||
}
|
||||
return hashSet2;
|
||||
}
|
||||
|
||||
private List<Transform> FindBonesByPosition(Transform boneToCheck, HashSet<Transform> smrBoneSet, float posTolerance = 0.0001f)
|
||||
{
|
||||
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
List<Transform> list = new List<Transform>();
|
||||
if (boneToCheck == null)
|
||||
{
|
||||
return list;
|
||||
}
|
||||
float num = posTolerance * posTolerance;
|
||||
Vector3 position = boneToCheck.position;
|
||||
foreach (Transform item in smrBoneSet)
|
||||
{
|
||||
if (!(item == null) && !(item == boneToCheck) && this.NameMatches(item.gameObject.name, boneToCheck.gameObject.name))
|
||||
{
|
||||
Vector3 val = item.position - position;
|
||||
if (val.sqrMagnitude <= num)
|
||||
{
|
||||
list.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private string[] TokenizeBoneName(string name)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(name))
|
||||
{
|
||||
return Array.Empty<string>();
|
||||
}
|
||||
char[] separator = new char[5] { '-', '_', ':', '.', '|' };
|
||||
name = name.Trim();
|
||||
return name.Split(separator, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
private bool NameMatches(string boneToCheckName, string candidateName)
|
||||
{
|
||||
string[] array = this.TokenizeBoneName(boneToCheckName);
|
||||
string[] array2 = this.TokenizeBoneName(candidateName);
|
||||
if (array.Length == 0 || array2.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!array[0].Equals(array2[0], StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (array.Length > 1 && array2.Length > 1 && !array[1].Equals(array2[1], StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<BoneData> GetBoneDatas(Transform rootTransform, HashSet<Transform> avatarBones, Dictionary<HumanBodyBones, HashSet<Transform>> sourceBoneMap)
|
||||
{
|
||||
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0202: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0221: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0226: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_022d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0232: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0237: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_023b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0240: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_025b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0260: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0267: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0274: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_027b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0288: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_028f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_030d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_030f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0315: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0317: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_031d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_031f: Unknown result type (might be due to invalid IL or missing references)
|
||||
Dictionary<Transform, HumanBodyBones> dictionary = new Dictionary<Transform, HumanBodyBones>();
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> item2 in sourceBoneMap)
|
||||
{
|
||||
HumanBodyBones key = item2.Key;
|
||||
HashSet<Transform> value = item2.Value;
|
||||
if (value == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item3 in value)
|
||||
{
|
||||
if (!(item3 == null) && !dictionary.ContainsKey(item3))
|
||||
{
|
||||
dictionary[item3] = key;
|
||||
}
|
||||
}
|
||||
}
|
||||
List<BoneData> list = new List<BoneData>();
|
||||
BoneData item = new BoneData
|
||||
{
|
||||
id = 0,
|
||||
boneName = rootTransform != null ? rootTransform.name : "Root",
|
||||
parentName = null,
|
||||
hierarchyPath = "",
|
||||
hBone = (HumanBodyBones)55,
|
||||
parentId = -1,
|
||||
childrenIds = new List<int>(),
|
||||
rootLocalPosition = Vector3.zero,
|
||||
rootLocalRotation = Quaternion.identity,
|
||||
rootLocalScale = Vector3.one
|
||||
};
|
||||
list.Add(item);
|
||||
List<Transform> list2 = (from t in avatarBones
|
||||
where t != null
|
||||
orderby this.GetDepthFromSkeletonRoot(rootTransform, t), this.GetHierarchyPath(rootTransform, t)
|
||||
select t).ToList();
|
||||
Dictionary<Transform, int> dictionary2 = new Dictionary<Transform, int>(list2.Count);
|
||||
int num = 1;
|
||||
foreach (Transform item4 in list2)
|
||||
{
|
||||
dictionary2[item4] = num++;
|
||||
string hierarchyPath = this.GetHierarchyPath(rootTransform, item4);
|
||||
HumanBodyBones value2;
|
||||
HumanBodyBones hBone = (HumanBodyBones)((!dictionary.TryGetValue(item4, out value2)) ? 55 : ((int)value2));
|
||||
Vector3 rootLocalPosition = (rootTransform != null) ? rootTransform.InverseTransformPoint(item4.position) : item4.position;
|
||||
Quaternion rootLocalRotation = (rootTransform != null) ? (Quaternion.Inverse(rootTransform.rotation) * item4.rotation) : item4.rotation;
|
||||
Vector3 lossyScale = item4.lossyScale;
|
||||
if (rootTransform != null)
|
||||
{
|
||||
Vector3 lossyScale2 = rootTransform.lossyScale;
|
||||
lossyScale = new Vector3(this.SafeDiv(lossyScale.x, lossyScale2.x), this.SafeDiv(lossyScale.y, lossyScale2.y), this.SafeDiv(lossyScale.z, lossyScale2.z));
|
||||
}
|
||||
list.Add(new BoneData
|
||||
{
|
||||
id = dictionary2[item4],
|
||||
boneName = item4.name,
|
||||
parentName = (item4.parent != null) ? (item4.parent).name : "",
|
||||
hierarchyPath = hierarchyPath,
|
||||
hBone = hBone,
|
||||
parentId = -1,
|
||||
childrenIds = new List<int>(),
|
||||
rootLocalPosition = rootLocalPosition,
|
||||
rootLocalRotation = rootLocalRotation,
|
||||
rootLocalScale = lossyScale
|
||||
});
|
||||
}
|
||||
Dictionary<int, List<int>> dictionary3 = new Dictionary<int, List<int>>();
|
||||
foreach (BoneData item5 in list)
|
||||
{
|
||||
dictionary3[item5.id] = new List<int>();
|
||||
}
|
||||
foreach (BoneData node in list.Where((BoneData n) => n.id != 0))
|
||||
{
|
||||
Transform key2 = dictionary2.FirstOrDefault((KeyValuePair<Transform, int> kv) => kv.Value == node.id).Key;
|
||||
int num2 = 0;
|
||||
if (key2 != null)
|
||||
{
|
||||
Transform parent = key2.parent;
|
||||
while (parent != null)
|
||||
{
|
||||
if (dictionary2.TryGetValue(parent, out var value3))
|
||||
{
|
||||
num2 = value3;
|
||||
break;
|
||||
}
|
||||
if (parent == rootTransform)
|
||||
{
|
||||
num2 = 0;
|
||||
break;
|
||||
}
|
||||
parent = parent.parent;
|
||||
}
|
||||
}
|
||||
node.parentId = num2;
|
||||
dictionary3[num2].Add(node.id);
|
||||
}
|
||||
foreach (BoneData item6 in list)
|
||||
{
|
||||
item6.childrenIds = dictionary3[item6.id];
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private float SafeDiv(float a, float b)
|
||||
{
|
||||
if (!(Mathf.Abs(b) < 1E-08f))
|
||||
{
|
||||
return a / b;
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
private int GetDepthFromSkeletonRoot(Transform root, Transform t)
|
||||
{
|
||||
int num = 0;
|
||||
Transform val = t;
|
||||
while (val != null && val != root)
|
||||
{
|
||||
num++;
|
||||
val = val.parent;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
private string GetHierarchyPath(Transform root, Transform t)
|
||||
{
|
||||
if (t == null)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
if (root == null)
|
||||
{
|
||||
return t.name;
|
||||
}
|
||||
if (!t.IsChildOf(root) && t != root)
|
||||
{
|
||||
Debug.LogError((object)("[ProfileUtils_BoneUtil] GetHierarchyPath - bone " + t.name + " is not child of root " + root.name));
|
||||
return "";
|
||||
}
|
||||
if (t == root)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
Stack<string> stack = new Stack<string>();
|
||||
Transform val = t;
|
||||
while (val != null && val != root)
|
||||
{
|
||||
stack.Push(val.name);
|
||||
val = val.parent;
|
||||
}
|
||||
return string.Join("/", stack);
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b987b9b34807b3b48b843afcb2aefa28
|
||||
@@ -1,212 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileUtils_PCAUtil
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileUtils_PCAUtil
|
||||
{
|
||||
public PCAData ComputeRegionStats(IList<Vector3> points)
|
||||
{
|
||||
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0181: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0206: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0207: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_020d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_020f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
PCAData pCAData = new PCAData();
|
||||
if (points == null || points.Count == 0)
|
||||
{
|
||||
return pCAData;
|
||||
}
|
||||
int count = points.Count;
|
||||
Vector3 val = Vector3.zero;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
val += points[i];
|
||||
}
|
||||
val /= (float)count;
|
||||
float num = 0f;
|
||||
float num2 = 0f;
|
||||
float num3 = 0f;
|
||||
float num4 = 0f;
|
||||
float num5 = 0f;
|
||||
float num6 = 0f;
|
||||
for (int j = 0; j < count; j++)
|
||||
{
|
||||
Vector3 val2 = points[j] - val;
|
||||
num += val2.x * val2.x;
|
||||
num2 += val2.x * val2.y;
|
||||
num3 += val2.x * val2.z;
|
||||
num4 += val2.y * val2.y;
|
||||
num5 += val2.y * val2.z;
|
||||
num6 += val2.z * val2.z;
|
||||
}
|
||||
float num7 = 1f / (float)count;
|
||||
num *= num7;
|
||||
num2 *= num7;
|
||||
num3 *= num7;
|
||||
num4 *= num7;
|
||||
num5 *= num7;
|
||||
num6 *= num7;
|
||||
this.JacobiEigenDecomposition3x3(num, num2, num3, num4, num5, num6, out var eigenValues, out var eigenVectors);
|
||||
int num8 = 0;
|
||||
if (eigenValues[1] > eigenValues[num8])
|
||||
{
|
||||
num8 = 1;
|
||||
}
|
||||
if (eigenValues[2] > eigenValues[num8])
|
||||
{
|
||||
num8 = 2;
|
||||
}
|
||||
Vector3 normalized = eigenVectors[num8].normalized;
|
||||
float num9 = float.PositiveInfinity;
|
||||
float num10 = float.NegativeInfinity;
|
||||
float num11 = 0f;
|
||||
for (int k = 0; k < count; k++)
|
||||
{
|
||||
float num12 = Vector3.Dot(points[k] - val, normalized);
|
||||
if (num12 < num9)
|
||||
{
|
||||
num9 = num12;
|
||||
}
|
||||
if (num12 > num10)
|
||||
{
|
||||
num10 = num12;
|
||||
}
|
||||
Vector3 val3 = val + normalized * num12;
|
||||
Vector3 val4 = points[k] - val3;
|
||||
float magnitude = val4.magnitude;
|
||||
num11 += magnitude;
|
||||
}
|
||||
pCAData.pcaCenter = val;
|
||||
pCAData.pcaPrincipalAxis = normalized;
|
||||
pCAData.pcaLength = num10 - num9;
|
||||
pCAData.pcaAvgRadius = num11 / (float)count;
|
||||
return pCAData;
|
||||
}
|
||||
|
||||
private void JacobiEigenDecomposition3x3(float c00, float c01, float c02, float c11, float c12, float c22, out float[] eigenValues, out Vector3[] eigenVectors)
|
||||
{
|
||||
//IL_032d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0332: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0353: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0358: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0379: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_037e: Unknown result type (might be due to invalid IL or missing references)
|
||||
float[,] array = new float[3, 3]
|
||||
{
|
||||
{ c00, c01, c02 },
|
||||
{ c01, c11, c12 },
|
||||
{ c02, c12, c22 }
|
||||
};
|
||||
float[,] array2 = new float[3, 3]
|
||||
{
|
||||
{ 1f, 0f, 0f },
|
||||
{ 0f, 1f, 0f },
|
||||
{ 0f, 0f, 1f }
|
||||
};
|
||||
for (int i = 0; i < 32; i++)
|
||||
{
|
||||
int num = 0;
|
||||
int num2 = 1;
|
||||
float num3 = Mathf.Abs(array[0, 1]);
|
||||
float num4 = Mathf.Abs(array[0, 2]);
|
||||
if (num4 > num3)
|
||||
{
|
||||
num3 = num4;
|
||||
num = 0;
|
||||
num2 = 2;
|
||||
}
|
||||
float num5 = Mathf.Abs(array[1, 2]);
|
||||
if (num5 > num3)
|
||||
{
|
||||
num3 = num5;
|
||||
num = 1;
|
||||
num2 = 2;
|
||||
}
|
||||
if (num3 < 1E-10f)
|
||||
{
|
||||
break;
|
||||
}
|
||||
float num6 = array[num, num];
|
||||
float num7 = array[num2, num2];
|
||||
float num8 = array[num, num2];
|
||||
float num9 = 0.5f * Mathf.Atan2(2f * num8, num7 - num6);
|
||||
float num10 = Mathf.Cos(num9);
|
||||
float num11 = Mathf.Sin(num9);
|
||||
for (int j = 0; j < 3; j++)
|
||||
{
|
||||
if (j != num && j != num2)
|
||||
{
|
||||
float num12 = array[j, num];
|
||||
float num13 = array[j, num2];
|
||||
array[j, num] = num10 * num12 - num11 * num13;
|
||||
array[num, j] = array[j, num];
|
||||
array[j, num2] = num11 * num12 + num10 * num13;
|
||||
array[num2, j] = array[j, num2];
|
||||
}
|
||||
}
|
||||
float num14 = num10 * num10 * num6 - 2f * num11 * num10 * num8 + num11 * num11 * num7;
|
||||
float num15 = num11 * num11 * num6 + 2f * num11 * num10 * num8 + num10 * num10 * num7;
|
||||
array[num, num] = num14;
|
||||
array[num2, num2] = num15;
|
||||
array[num, num2] = 0f;
|
||||
array[num2, num] = 0f;
|
||||
for (int k = 0; k < 3; k++)
|
||||
{
|
||||
float num16 = array2[k, num];
|
||||
float num17 = array2[k, num2];
|
||||
array2[k, num] = num10 * num16 - num11 * num17;
|
||||
array2[k, num2] = num11 * num16 + num10 * num17;
|
||||
}
|
||||
}
|
||||
eigenValues = new float[3];
|
||||
eigenVectors = (Vector3[])(object)new Vector3[3];
|
||||
eigenValues[0] = array[0, 0];
|
||||
eigenValues[1] = array[1, 1];
|
||||
eigenValues[2] = array[2, 2];
|
||||
eigenVectors[0] = new Vector3(array2[0, 0], array2[1, 0], array2[2, 0]);
|
||||
eigenVectors[1] = new Vector3(array2[0, 1], array2[1, 1], array2[2, 1]);
|
||||
eigenVectors[2] = new Vector3(array2[0, 2], array2[1, 2], array2[2, 2]);
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 404cff939caffe44bbb6cfbb33580445
|
||||
@@ -1,165 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileUtils_PoseUtil
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileUtils_PoseUtil
|
||||
{
|
||||
public BoneSpatialData GetBoneSpatialData(HumanBodyBones refBone, HumanBodyBones[] influencedBones, Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, List<ProfileBakedBodyMesh> sourceBodyBakedMeshes, bool addChildBones = false)
|
||||
{
|
||||
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
||||
BoneSpatialData boneSpatialData = new BoneSpatialData();
|
||||
boneSpatialData.refBone = refBone;
|
||||
Transform baseBoneFromBoneMap = this.GetBaseBoneFromBoneMap(boneMap, refBone);
|
||||
if ((Object)(object)baseBoneFromBoneMap == (Object)null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
List<Vector3> refVertices = this.GetRefVertices(influencedBones, boneMap, sourceBodyBakedMeshes, addChildBones);
|
||||
boneSpatialData.pcaData = this.GetPCAData(baseBoneFromBoneMap, refVertices);
|
||||
Transform baseBoneFromBoneMap2 = this.GetBaseBoneFromBoneMap(boneMap, (HumanBodyBones)0);
|
||||
boneSpatialData.volumeData = this.GetVolumeData(baseBoneFromBoneMap, baseBoneFromBoneMap2, refVertices);
|
||||
return boneSpatialData;
|
||||
}
|
||||
|
||||
private List<Vector3> GetRefVertices(HumanBodyBones[] influencedBones, Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, List<ProfileBakedBodyMesh> sourceBodyBakedMeshes, bool addChildBones = false, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0190: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0212: Unknown result type (might be due to invalid IL or missing references)
|
||||
List<Vector3> list = new List<Vector3>();
|
||||
HashSet<Transform> targetBoneSet = new HashSet<Transform>();
|
||||
foreach (HumanBodyBones key in influencedBones)
|
||||
{
|
||||
if (!boneMap.TryGetValue(key, out var value) || value == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if ((Object)(object)item != (Object)null)
|
||||
{
|
||||
targetBoneSet.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (targetBoneSet.Count == 0)
|
||||
{
|
||||
string text = string.Join(", ", influencedBones.Select((HumanBodyBones b) => b.ToString()));
|
||||
Debug.LogError((object)("[ProfileSaver_PoseUtil] CollectBodyPartVerticesWorld: targetBoneSet is empty.\nMissing Humanoid Set : " + text));
|
||||
return list;
|
||||
}
|
||||
if (addChildBones)
|
||||
{
|
||||
Transform[] array = targetBoneSet.ToArray();
|
||||
targetBoneSet.Clear();
|
||||
Transform[] array2 = array;
|
||||
for (int i = 0; i < array2.Length; i++)
|
||||
{
|
||||
AddDescendants(array2[i]);
|
||||
}
|
||||
}
|
||||
foreach (ProfileBakedBodyMesh sourceBodyBakedMesh in sourceBodyBakedMeshes)
|
||||
{
|
||||
BoneWeight[] boneWeights = sourceBodyBakedMesh.boneWeights;
|
||||
Transform[] bones = sourceBodyBakedMesh.bones;
|
||||
if (boneWeights == null || boneWeights.Length == 0 || bones == null || bones.Length == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Vector3[] worldVertices = sourceBodyBakedMesh.worldVertices;
|
||||
if (worldVertices == null || worldVertices.Length == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int num = Mathf.Min(worldVertices.Length, boneWeights.Length);
|
||||
for (int num2 = 0; num2 < num; num2 += sampleStep)
|
||||
{
|
||||
BoneWeight val = boneWeights[num2];
|
||||
float wSum = 0f;
|
||||
Acc(val.boneIndex0, val.weight0);
|
||||
Acc(val.boneIndex1, val.weight1);
|
||||
Acc(val.boneIndex2, val.weight2);
|
||||
Acc(val.boneIndex3, val.weight3);
|
||||
if (!(wSum < weightThreshold))
|
||||
{
|
||||
list.Add(worldVertices[num2]);
|
||||
}
|
||||
void Acc(int index, float w)
|
||||
{
|
||||
if (index >= 0 && index < bones.Length && !(w <= 0f))
|
||||
{
|
||||
Transform val2 = bones[index];
|
||||
if ((Object)(object)val2 != (Object)null && targetBoneSet.Contains(val2))
|
||||
{
|
||||
wSum += w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
void AddDescendants(Transform t)
|
||||
{
|
||||
if (!((Object)(object)t == (Object)null) && targetBoneSet.Add(t))
|
||||
{
|
||||
for (int j = 0; j < t.childCount; j++)
|
||||
{
|
||||
AddDescendants(t.GetChild(j));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private PCAData GetPCAData(Transform originTransform, List<Vector3> points)
|
||||
{
|
||||
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
|
||||
PCAData pCAData = new ProfileUtils_PCAUtil().ComputeRegionStats(points);
|
||||
if ((Object)(object)originTransform == (Object)null)
|
||||
{
|
||||
return pCAData;
|
||||
}
|
||||
PCAData obj = new PCAData
|
||||
{
|
||||
pcaCenter = originTransform.InverseTransformPoint(pCAData.pcaCenter)
|
||||
};
|
||||
Vector3 val = originTransform.InverseTransformDirection(pCAData.pcaPrincipalAxis);
|
||||
obj.pcaPrincipalAxis = val.normalized;
|
||||
obj.pcaLength = pCAData.pcaLength;
|
||||
obj.pcaAvgRadius = pCAData.pcaAvgRadius;
|
||||
if (Mathf.Abs(pCAData.pcaLength) < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)("[ProfileUtils_PoseUtil] GetPCAData - " + ((Object)originTransform).name + " Pca Length is to Small"));
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
private VolumeData GetVolumeData(Transform originTransform, Transform axisTransform, List<Vector3> points)
|
||||
{
|
||||
return new ProfileUtils_VolumeUtil().GetVolumeData(originTransform, axisTransform, points);
|
||||
}
|
||||
|
||||
private Transform GetBaseBoneFromBoneMap(Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, HumanBodyBones bone)
|
||||
{
|
||||
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (boneMap == null || !boneMap.TryGetValue(bone, out var value) || value == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return value.FirstOrDefault();
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 094b9fc668fbf684aa9bd5db84b2aaad
|
||||
@@ -1,79 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileUtils_VertexUtil
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileUtils_VertexUtil
|
||||
{
|
||||
public BaseKey3[] LoadTable(string path, out int version, out int countInFile)
|
||||
{
|
||||
version = 0;
|
||||
countInFile = 0;
|
||||
if (string.IsNullOrEmpty(path))
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_VertexUtil] LoadTable - path is null or empty");
|
||||
return null;
|
||||
}
|
||||
path = Path.Combine(Application.dataPath, path);
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_VertexUtil] LoadTable - file not found");
|
||||
return null;
|
||||
}
|
||||
string text;
|
||||
try
|
||||
{
|
||||
text = File.ReadAllText(path, Encoding.UTF8);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError((object)("[ProfileUtil_VertexUtil] LoadTable - read failed: " + ex.Message));
|
||||
return null;
|
||||
}
|
||||
int num = 0;
|
||||
string baseMagic = new ProfileUtils().GetBaseMagic();
|
||||
if (text.Length < 4 || text.Substring(0, 4) != baseMagic)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_VertexUtil] LoadTable - MAGIC mismatch");
|
||||
return null;
|
||||
}
|
||||
num += 4;
|
||||
version = this.ReadHexIntSafe(text, ref num);
|
||||
countInFile = this.ReadHexIntSafe(text, ref num);
|
||||
if (countInFile <= 0)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_VertexUtil] LoadTable - invalid count");
|
||||
return null;
|
||||
}
|
||||
BaseKey3[] array = new BaseKey3[countInFile];
|
||||
for (int i = 0; i < countInFile; i++)
|
||||
{
|
||||
array[i] = this.ReadHexKey3Safe(text, ref num);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
private int ReadHexIntSafe(string s, ref int p)
|
||||
{
|
||||
if (p + 8 > s.Length)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtil_VertexUtil] ReadHexIntSafe - out of range");
|
||||
return 0;
|
||||
}
|
||||
string value = s.Substring(p, 8);
|
||||
p += 8;
|
||||
return (int)Convert.ToUInt32(value, 16);
|
||||
}
|
||||
|
||||
private BaseKey3 ReadHexKey3Safe(string s, ref int p)
|
||||
{
|
||||
int x = this.ReadHexIntSafe(s, ref p);
|
||||
uint y = (uint)this.ReadHexIntSafe(s, ref p);
|
||||
uint z = (uint)this.ReadHexIntSafe(s, ref p);
|
||||
return new BaseKey3((uint)x, y, z);
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 26eb8c4f9b6a08e4abb70a33d9b81ccf
|
||||
@@ -1,135 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.ProfileUtils_VolumeUtil
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class ProfileUtils_VolumeUtil
|
||||
{
|
||||
public VolumeData GetVolumeData(Transform originTransform, Transform axisTransform, List<Vector3> points, int sampleStep = 1)
|
||||
{
|
||||
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0153: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0168: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0191: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0199: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)originTransform == (Object)null)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtils_VolumeUtil] originTransform is null");
|
||||
return null;
|
||||
}
|
||||
if ((Object)(object)axisTransform == (Object)null)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtils_VolumeUtil] axisTransform is null");
|
||||
return null;
|
||||
}
|
||||
if (points == null || points.Count == 0)
|
||||
{
|
||||
Debug.LogError((object)"[ProfileUtils_VolumeUtil] There is No Points to calculate volume");
|
||||
return null;
|
||||
}
|
||||
VolumeData volumeData = new VolumeData();
|
||||
Vector3 forward = axisTransform.forward;
|
||||
Vector3 right = axisTransform.right;
|
||||
Vector3 up = axisTransform.up;
|
||||
float num = float.PositiveInfinity;
|
||||
float num2 = float.NegativeInfinity;
|
||||
float num3 = float.PositiveInfinity;
|
||||
float num4 = float.NegativeInfinity;
|
||||
float num5 = float.PositiveInfinity;
|
||||
float num6 = float.NegativeInfinity;
|
||||
for (int i = 0; i < points.Count; i += sampleStep)
|
||||
{
|
||||
Vector3 val = points[i] - originTransform.position;
|
||||
float num7 = Vector3.Dot(val, up);
|
||||
if (num7 < num)
|
||||
{
|
||||
num = num7;
|
||||
}
|
||||
if (num7 > num2)
|
||||
{
|
||||
num2 = num7;
|
||||
}
|
||||
float num8 = Vector3.Dot(val, forward);
|
||||
if (num8 < num3)
|
||||
{
|
||||
num3 = num8;
|
||||
}
|
||||
if (num8 > num4)
|
||||
{
|
||||
num4 = num8;
|
||||
}
|
||||
float num9 = Vector3.Dot(val, right);
|
||||
if (num9 < num5)
|
||||
{
|
||||
num5 = num9;
|
||||
}
|
||||
if (num9 > num6)
|
||||
{
|
||||
num6 = num9;
|
||||
}
|
||||
}
|
||||
volumeData.forwardDir = forward;
|
||||
volumeData.rightDir = right;
|
||||
volumeData.upDir = up;
|
||||
volumeData.fMaxLocalPos = originTransform.InverseTransformPoint(originTransform.position + forward * num4);
|
||||
volumeData.fMinLocalPos = originTransform.InverseTransformPoint(originTransform.position + forward * num3);
|
||||
volumeData.rMaxLocalPos = originTransform.InverseTransformPoint(originTransform.position + right * num6);
|
||||
volumeData.rMinLocalPos = originTransform.InverseTransformPoint(originTransform.position + right * num5);
|
||||
volumeData.uMaxLocalPos = originTransform.InverseTransformPoint(originTransform.position + up * num2);
|
||||
volumeData.uMinLocalPos = originTransform.InverseTransformPoint(originTransform.position + up * num);
|
||||
return volumeData;
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b1bc4188262eb1140b111907361dfc56
|
||||
@@ -1,28 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.VolumeData
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
[Serializable]
|
||||
public class VolumeData
|
||||
{
|
||||
public Vector3 forwardDir;
|
||||
|
||||
public Vector3 rightDir;
|
||||
|
||||
public Vector3 upDir;
|
||||
|
||||
public Vector3 fMaxLocalPos;
|
||||
|
||||
public Vector3 fMinLocalPos;
|
||||
|
||||
public Vector3 rMaxLocalPos;
|
||||
|
||||
public Vector3 rMinLocalPos;
|
||||
|
||||
public Vector3 uMaxLocalPos;
|
||||
|
||||
public Vector3 uMinLocalPos;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c9990806ed64171428cb56bac9d781fa
|
||||
@@ -1,12 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.profileBVHData
|
||||
public class profileBVHData
|
||||
{
|
||||
public int verA;
|
||||
|
||||
public int verB;
|
||||
|
||||
public int verC;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3e693ae64a726864a88a172c17d13af9
|
||||
@@ -1,20 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpher_ProfileSaver_Script, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.profile.profileBVHNode
|
||||
using UnityEngine;
|
||||
|
||||
public class profileBVHNode
|
||||
{
|
||||
public Bounds bounds;
|
||||
|
||||
public int leftChild;
|
||||
|
||||
public int rightChild;
|
||||
|
||||
public int start;
|
||||
|
||||
public int count;
|
||||
|
||||
public bool isLeaf;
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d1647fc2736619c4fbf9804e952bf2c6
|
||||
@@ -1,56 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.AutoMorpherDev
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
|
||||
public static class AutoMorpherDev
|
||||
{
|
||||
public readonly struct ScopeTimer : IDisposable
|
||||
{
|
||||
private readonly bool _enabled;
|
||||
|
||||
private readonly string _label;
|
||||
|
||||
private readonly Stopwatch _sw;
|
||||
|
||||
public ScopeTimer(bool enabled, string label)
|
||||
{
|
||||
this._enabled = enabled;
|
||||
this._label = label;
|
||||
if (enabled)
|
||||
{
|
||||
this._sw = Stopwatch.StartNew();
|
||||
}
|
||||
else
|
||||
{
|
||||
this._sw = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (this._enabled && this._sw != null)
|
||||
{
|
||||
this._sw.Stop();
|
||||
UnityEngine.Debug.Log((object)$"[DevTimer] {this._label}: {this._sw.ElapsedMilliseconds} ms");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static bool isDeveloperMode;
|
||||
|
||||
public static void Log(string message)
|
||||
{
|
||||
if (isDeveloperMode)
|
||||
{
|
||||
UnityEngine.Debug.Log((object)message);
|
||||
}
|
||||
}
|
||||
|
||||
public static ScopeTimer Profile(string label)
|
||||
{
|
||||
return new ScopeTimer(isDeveloperMode, label);
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BakedBodyMesh
|
||||
using UnityEngine;
|
||||
|
||||
public class BakedBodyMesh
|
||||
{
|
||||
public SkinnedMeshRenderer smr;
|
||||
|
||||
public Mesh bakedMesh;
|
||||
|
||||
public BakedBodyMesh(SkinnedMeshRenderer _smr)
|
||||
{
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0018: Expected O, but got Unknown
|
||||
this.smr = _smr;
|
||||
this.bakedMesh = new Mesh();
|
||||
this.smr.BakeMesh(this.bakedMesh);
|
||||
}
|
||||
|
||||
public void ReBakeMesh()
|
||||
{
|
||||
this.smr.BakeMesh(this.bakedMesh);
|
||||
}
|
||||
|
||||
~BakedBodyMesh()
|
||||
{
|
||||
this.smr = null;
|
||||
this.bakedMesh = null;
|
||||
}
|
||||
}
|
||||
@@ -1,235 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatchSetupUtil
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatchSetupUtil
|
||||
{
|
||||
public void AdjustAvatarScaleByNeck(Transform avatarRoot, Dictionary<HumanBodyBones, HashSet<Transform>> humanBoneMap, float targetHeight)
|
||||
{
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)avatarRoot == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] NormalizeAvatarScaleByNeck: avatar == null");
|
||||
return;
|
||||
}
|
||||
Transform boneFromBoneMap = new BodyPoseMatch_CommonUtil().GetBoneFromBoneMap(humanBoneMap, (HumanBodyBones)9);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)("[AvatarBodyMatchUtil] " + ((Object)avatarRoot).name + " 에서 Neck 본을 찾지 못했습니다. 스케일 정규화를 건너뜁니다."));
|
||||
return;
|
||||
}
|
||||
Transform transform = ((Component)avatarRoot).transform;
|
||||
float num = boneFromBoneMap.position.y - transform.position.y;
|
||||
if (Mathf.Approximately(num, 0f))
|
||||
{
|
||||
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] {((Object)avatarRoot).name} Neck Y가 0에 가까워 스케일 계산을 건너뜁니다. (neckY = {num})");
|
||||
return;
|
||||
}
|
||||
float num2 = targetHeight / num;
|
||||
Vector3 localScale = transform.localScale;
|
||||
localScale *= num2;
|
||||
transform.localScale = localScale;
|
||||
}
|
||||
|
||||
public GameObject CreateBodyProxy(Animator sourceAvatar, IReadOnlyList<SkinnedMeshRenderer> sourceBodyMeshes, out List<SkinnedMeshRenderer> proxyBodyMeshes, out Dictionary<Transform, Transform> sourceToProxy)
|
||||
{
|
||||
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
proxyBodyMeshes = null;
|
||||
if ((Object)(object)sourceAvatar == (Object)null)
|
||||
{
|
||||
Debug.LogError((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: sourceAvatar == null");
|
||||
sourceToProxy = new Dictionary<Transform, Transform>();
|
||||
return 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)(object)component != (Object)null)
|
||||
{
|
||||
((Behaviour)component).enabled = false;
|
||||
remainTransforms.Add(((Component)component).transform);
|
||||
}
|
||||
if ((Object)(object)component != (Object)null && (Object)(object)component.avatar != (Object)null && component.avatar.isHuman)
|
||||
{
|
||||
for (int i = 0; i < 55; i++)
|
||||
{
|
||||
HumanBodyBones val = (HumanBodyBones)i;
|
||||
Transform boneTransform = component.GetBoneTransform(val);
|
||||
if ((Object)(object)boneTransform != (Object)null)
|
||||
{
|
||||
remainTransforms.Add(boneTransform);
|
||||
}
|
||||
}
|
||||
}
|
||||
HashSet<Mesh> hashSet = new HashSet<Mesh>();
|
||||
if (sourceBodyMeshes != null)
|
||||
{
|
||||
foreach (SkinnedMeshRenderer sourceBodyMesh in sourceBodyMeshes)
|
||||
{
|
||||
if (!((Object)(object)sourceBodyMesh == (Object)null) && !((Object)(object)sourceBodyMesh.sharedMesh == (Object)null))
|
||||
{
|
||||
hashSet.Add(sourceBodyMesh.sharedMesh);
|
||||
}
|
||||
}
|
||||
}
|
||||
SkinnedMeshRenderer[] componentsInChildren = clone.GetComponentsInChildren<SkinnedMeshRenderer>(true);
|
||||
List<SkinnedMeshRenderer> list = new List<SkinnedMeshRenderer>();
|
||||
SkinnedMeshRenderer[] array = componentsInChildren;
|
||||
foreach (SkinnedMeshRenderer val2 in array)
|
||||
{
|
||||
if (!((Object)(object)val2 == (Object)null))
|
||||
{
|
||||
Mesh sharedMesh = val2.sharedMesh;
|
||||
if (!((Object)(object)sharedMesh == (Object)null) && hashSet.Contains(sharedMesh))
|
||||
{
|
||||
list.Add(val2);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (list.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone에서 동일 sharedMesh를 가진 BodyMesh를 찾지 못했습니다.");
|
||||
}
|
||||
if (list.Count > 0)
|
||||
{
|
||||
MeshClassifier meshClassifier = new MeshClassifier();
|
||||
foreach (SkinnedMeshRenderer item in list)
|
||||
{
|
||||
if ((Object)(object)item == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
remainTransforms.Add(((Component)item).transform);
|
||||
HashSet<Transform> activeBones = meshClassifier.GetActiveBones(item);
|
||||
if (activeBones == null)
|
||||
{
|
||||
string[] obj = new string[5]
|
||||
{
|
||||
"[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone smr '",
|
||||
((Object)item).name,
|
||||
"' has null bones array (mesh='",
|
||||
null,
|
||||
null
|
||||
};
|
||||
Mesh sharedMesh2 = item.sharedMesh;
|
||||
obj[3] = ((sharedMesh2 != null) ? ((Object)sharedMesh2).name : null);
|
||||
obj[4] = "')";
|
||||
Debug.LogWarning((object)string.Concat(obj));
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item2 in activeBones)
|
||||
{
|
||||
if (!((Object)(object)item2 == (Object)null))
|
||||
{
|
||||
remainTransforms.Add(item2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (Transform item3 in remainTransforms.ToList())
|
||||
{
|
||||
AddWithParents(item3);
|
||||
}
|
||||
Transform[] componentsInChildren2 = clone.GetComponentsInChildren<Transform>(true);
|
||||
for (int num = componentsInChildren2.Length - 1; num >= 0; num--)
|
||||
{
|
||||
Transform val3 = componentsInChildren2[num];
|
||||
if (!((Object)(object)val3 == (Object)null) && !((Object)(object)val3 == (Object)(object)clone.transform) && !remainTransforms.Contains(val3))
|
||||
{
|
||||
Object.DestroyImmediate((Object)(object)((Component)val3).gameObject);
|
||||
}
|
||||
}
|
||||
proxyBodyMeshes = list;
|
||||
new BoneMatchUtil().BuildSourceToProxyBoneMap(sourceAvatar, component, out sourceToProxy);
|
||||
return clone;
|
||||
void AddWithParents(Transform t)
|
||||
{
|
||||
while ((Object)(object)t != (Object)null && (Object)(object)t != (Object)(object)clone.transform)
|
||||
{
|
||||
remainTransforms.Add(t);
|
||||
t = t.parent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Vector3 GetComprehensiveScale(Transform rootT, Dictionary<HumanBodyBones, HashSet<Transform>> clothHumanoidBoneMap, ProfileData profileData)
|
||||
{
|
||||
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0139: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0146: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(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 val = null;
|
||||
if (clothHumanoidBoneMap.TryGetValue((HumanBodyBones)0, out var value) && value != null && value.Count > 0)
|
||||
{
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if ((Object)(object)item != (Object)null)
|
||||
{
|
||||
val = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Hip Transform is Missing", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - failed to get [hip] transform from clothHumanoidBoneMap");
|
||||
}
|
||||
BoneData val2 = null;
|
||||
for (int i = 0; i < profileData.bones.Count; i++)
|
||||
{
|
||||
BoneData val3 = profileData.bones[i];
|
||||
if (val3 != null && (int)val3.hBone == 0)
|
||||
{
|
||||
val2 = val3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (val2 == null)
|
||||
{
|
||||
throw new AutoMorpherException("Hip Bone Data is Missing in Profile", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - profileData bones does not contain Hips");
|
||||
}
|
||||
Vector3 rootLocalScale = val2.rootLocalScale;
|
||||
Vector3 lossyScale = rootT.lossyScale;
|
||||
Vector3 lossyScale2 = val.lossyScale;
|
||||
Vector3 val4 = new Vector3(lossyScale2.x / lossyScale.x, lossyScale2.y / lossyScale.y, lossyScale2.z / lossyScale.z);
|
||||
return new Vector3(val4.x / rootLocalScale.x, val4.y / rootLocalScale.y, val4.z / rootLocalScale.z);
|
||||
}
|
||||
}
|
||||
@@ -1,132 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatchUtil
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatchUtil
|
||||
{
|
||||
private WorldVertexUtil _worldVertexUtil;
|
||||
|
||||
private MeshClassifier meshClassifier;
|
||||
|
||||
private BodyPoseMatch_CommonUtil poseMatchCommonUtil;
|
||||
|
||||
private bool doDebug;
|
||||
|
||||
public BodyPoseMatchUtil()
|
||||
{
|
||||
this._worldVertexUtil = new WorldVertexUtil();
|
||||
this.meshClassifier = new MeshClassifier();
|
||||
this.poseMatchCommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
}
|
||||
|
||||
public GameObject AutoAdjustBodyPose(GameObject sourceAvatar, IReadOnlyList<SkinnedMeshRenderer> sourceBodyMeshes, GameObject targetAvatar, IReadOnlyList<SkinnedMeshRenderer> targetBodyMeshes, out Dictionary<Transform, Transform> sourceToProxy, float neckTargetHeight = 1.5f, bool onlyScaling = false)
|
||||
{
|
||||
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_025b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0260: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_027b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0280: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03a3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03a8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03c5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03e5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03ea: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0405: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_040a: Unknown result type (might be due to invalid IL or missing references)
|
||||
Animator component = sourceAvatar.GetComponent<Animator>();
|
||||
Animator component2 = targetAvatar.GetComponent<Animator>();
|
||||
if ((Object)(object)component == (Object)null || (Object)(object)component2 == (Object)null)
|
||||
{
|
||||
Debug.LogError((object)"[AvatarBodyMatchUtil] sourceAvatar 또는 targetAvatar가 null입니다.");
|
||||
sourceToProxy = new Dictionary<Transform, Transform>();
|
||||
return null;
|
||||
}
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> humanBoneMap = this.meshClassifier.MeshHumanoidBoneMatcher(component, sourceBodyMeshes);
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> dictionary = this.meshClassifier.MeshHumanoidBoneMatcher(component2, targetBodyMeshes);
|
||||
BodyPoseMatchSetupUtil bodyPoseMatchSetupUtil = new BodyPoseMatchSetupUtil();
|
||||
bodyPoseMatchSetupUtil.AdjustAvatarScaleByNeck(sourceAvatar.transform, humanBoneMap, neckTargetHeight);
|
||||
bodyPoseMatchSetupUtil.AdjustAvatarScaleByNeck(targetAvatar.transform, dictionary, neckTargetHeight);
|
||||
List<SkinnedMeshRenderer> proxyBodyMeshes;
|
||||
GameObject val = bodyPoseMatchSetupUtil.CreateBodyProxy(component, sourceBodyMeshes, out proxyBodyMeshes, out sourceToProxy);
|
||||
Animator component3 = val.GetComponent<Animator>();
|
||||
if (onlyScaling)
|
||||
{
|
||||
val.transform.SetParent(targetAvatar.transform);
|
||||
val.transform.localPosition = Vector3.zero;
|
||||
return val;
|
||||
}
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> dictionary2 = this.meshClassifier.MeshHumanoidBoneMatcher(component3, proxyBodyMeshes);
|
||||
if (dictionary2 == null || dictionary2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Bone Map is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxyBoneMap is null");
|
||||
}
|
||||
val.transform.SetParent(targetAvatar.transform);
|
||||
val.transform.localPosition = Vector3.zero;
|
||||
List<BakedBodyMesh> list = new List<BakedBodyMesh>();
|
||||
foreach (SkinnedMeshRenderer item in proxyBodyMeshes)
|
||||
{
|
||||
list.Add(new BakedBodyMesh(item));
|
||||
}
|
||||
List<BakedBodyMesh> list2 = new List<BakedBodyMesh>();
|
||||
foreach (SkinnedMeshRenderer targetBodyMesh in targetBodyMeshes)
|
||||
{
|
||||
list2.Add(new BakedBodyMesh(targetBodyMesh));
|
||||
}
|
||||
BodyPoseMatch_Torso bodyPoseMatch_Torso = new BodyPoseMatch_Torso();
|
||||
bodyPoseMatch_Torso.AlignTorsoByNeck(val, list, dictionary2, targetAvatar, list2, dictionary);
|
||||
if (this.doDebug)
|
||||
{
|
||||
bodyPoseMatch_Torso.DrawTorsoPcaDebug(val, list, dictionary2, Color.yellow, Color.cyan, 1f, 20f);
|
||||
bodyPoseMatch_Torso.DrawTorsoPcaDebug(targetAvatar, list2, dictionary, Color.red, Color.green, 1f, 20f);
|
||||
}
|
||||
foreach (BakedBodyMesh item2 in list)
|
||||
{
|
||||
item2.ReBakeMesh();
|
||||
}
|
||||
BodyPoseMatch_Arm bodyPoseMatch_Arm = new BodyPoseMatch_Arm();
|
||||
bodyPoseMatch_Arm.AlignUpperArmByArmPcaCenters(list, dictionary2, list2, dictionary);
|
||||
if (this.doDebug)
|
||||
{
|
||||
bodyPoseMatch_Arm.DrawArmPcaDebug(val, list, dictionary2, isLeft: true, Color.yellow, Color.cyan, 1f, 20f);
|
||||
bodyPoseMatch_Arm.DrawArmPcaDebug(targetAvatar, list2, dictionary, isLeft: true, Color.red, Color.green, 1f, 20f);
|
||||
}
|
||||
foreach (BakedBodyMesh item3 in list)
|
||||
{
|
||||
item3.ReBakeMesh();
|
||||
}
|
||||
bodyPoseMatch_Arm.ScalingBothArmsLength(list, dictionary2, list2, dictionary);
|
||||
foreach (BakedBodyMesh item4 in list)
|
||||
{
|
||||
item4.ReBakeMesh();
|
||||
}
|
||||
BodyPoseMatch_Leg bodyPoseMatch_Leg = new BodyPoseMatch_Leg();
|
||||
bodyPoseMatch_Leg.AlignBothUpperLegs(val, list, dictionary2, targetAvatar, list2, dictionary);
|
||||
foreach (BakedBodyMesh item5 in list)
|
||||
{
|
||||
item5.ReBakeMesh();
|
||||
}
|
||||
bodyPoseMatch_Leg.ScalingBothLegsAndFoots(val, list, dictionary2, targetAvatar, list2, dictionary);
|
||||
if (this.doDebug)
|
||||
{
|
||||
foreach (BakedBodyMesh item6 in list)
|
||||
{
|
||||
item6.ReBakeMesh();
|
||||
}
|
||||
bodyPoseMatch_Leg.DrawLegPcaDebug(val, list, dictionary2, isLeft: true, Color.yellow, Color.cyan, 1f, 5f);
|
||||
bodyPoseMatch_Leg.DrawLegPcaDebug(val, list, dictionary2, isLeft: false, Color.yellow, Color.cyan, 1f, 5f);
|
||||
bodyPoseMatch_Leg.DrawLegPcaDebug(targetAvatar, list2, dictionary, isLeft: true, Color.magenta, Color.green, 1f, 5f);
|
||||
bodyPoseMatch_Leg.DrawLegPcaDebug(targetAvatar, list2, dictionary, isLeft: false, Color.magenta, Color.green, 1f, 5f);
|
||||
bodyPoseMatch_Arm.DrawForearmExtremeDebugPair(val.gameObject, proxyBodyMeshes, targetAvatar, targetBodyMeshes, isLeft: true, 1f, 5f);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
}
|
||||
@@ -1,751 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatch_Arm
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatch_Arm
|
||||
{
|
||||
private readonly BodyPoseMatch_CommonUtil poseMatchCommonUtil;
|
||||
|
||||
public BodyPoseMatch_Arm()
|
||||
{
|
||||
this.poseMatchCommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
}
|
||||
|
||||
public void AlignUpperArmByArmCenters(IReadOnlyCollection<Transform> sourceLeftUpperArmSet, IReadOnlyCollection<Transform> sourceRightUpperArmSet, Vector3 sourceShoulderCenterWorld, Vector3 targetShoulderCenterWorld, Transform axisReferenceTransform, bool lockRightAxis = true)
|
||||
{
|
||||
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (sourceLeftUpperArmSet == null || sourceLeftUpperArmSet.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Left UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmCenters\n - sourceLeftUpperArmSet is null or empty");
|
||||
}
|
||||
if (sourceRightUpperArmSet == null || sourceRightUpperArmSet.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Right UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmCenters\n - sourceRightUpperArmSet is null or empty");
|
||||
}
|
||||
if (axisReferenceTransform == null)
|
||||
{
|
||||
throw new AutoMorpherException("Axis Reference Transform is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmCenters\n - axisReferenceTransform is null");
|
||||
}
|
||||
Vector3 val = targetShoulderCenterWorld - sourceShoulderCenterWorld;
|
||||
if (lockRightAxis)
|
||||
{
|
||||
Vector3 right = axisReferenceTransform.right;
|
||||
float num = Vector3.Dot(val, right);
|
||||
val -= right * num;
|
||||
}
|
||||
foreach (Transform item in sourceLeftUpperArmSet)
|
||||
{
|
||||
if (!(item == null))
|
||||
{
|
||||
item.position += val;
|
||||
}
|
||||
}
|
||||
foreach (Transform item2 in sourceRightUpperArmSet)
|
||||
{
|
||||
if (!(item2 == null))
|
||||
{
|
||||
item2.position += val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AlignUpperArmByArmPcaCenters(IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap)
|
||||
{
|
||||
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (proxyBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Bone Map is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxyBoneMap is null");
|
||||
}
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, (HumanBodyBones)0);
|
||||
if (boneFromBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Hips is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxy hips transform is null");
|
||||
}
|
||||
RegionStats regionStats = this.ComputeArmRegionStats(proxyBakedBodyMeshes, proxyBoneMap, isLeft: true);
|
||||
RegionStats regionStats2 = this.ComputeArmRegionStats(proxyBakedBodyMeshes, proxyBoneMap, isLeft: false);
|
||||
bool flag = regionStats.length > 0.0001f;
|
||||
bool flag2 = regionStats2.length > 0.0001f;
|
||||
if (!flag && !flag2)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters: proxy arm PCA failed. Skip.");
|
||||
return;
|
||||
}
|
||||
Vector3 sourceShoulderCenterWorld = this.CalculateShoulderCenter(flag, flag2, regionStats.center, regionStats2.center);
|
||||
RegionStats regionStats3 = this.ComputeArmRegionStats(targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
RegionStats regionStats4 = this.ComputeArmRegionStats(targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
bool flag3 = regionStats3.length > 0.0001f;
|
||||
bool flag4 = regionStats4.length > 0.0001f;
|
||||
if (!flag3 && !flag4)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters: target arm PCA failed. Skip.");
|
||||
return;
|
||||
}
|
||||
Vector3 targetShoulderCenterWorld = this.CalculateShoulderCenter(flag3, flag4, regionStats3.center, regionStats4.center);
|
||||
if (!proxyBoneMap.TryGetValue((HumanBodyBones)13, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Left UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxyBoneMap has no LeftUpperArm set");
|
||||
}
|
||||
if (!proxyBoneMap.TryGetValue((HumanBodyBones)14, out var value2) || value2 == null || value2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Right UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxyBoneMap has no RightUpperArm set");
|
||||
}
|
||||
this.AlignUpperArmByArmCenters(value, value2, sourceShoulderCenterWorld, targetShoulderCenterWorld, boneFromBoneMap);
|
||||
}
|
||||
|
||||
public void AlignUpperArmByArmPcaCenters(IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, Transform clothesTransform, ProfileData profileData, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - clothBoneMap is null");
|
||||
}
|
||||
if (profileData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Data is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - profileData is null");
|
||||
}
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, (HumanBodyBones)0);
|
||||
if (boneFromBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Hips is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - cloth hips transform is null");
|
||||
}
|
||||
bool flag = profileData.LeftUpperArmSpatialData != null && profileData.LeftUpperArmSpatialData.pcaData != null && profileData.LeftUpperArmSpatialData.pcaData.pcaLength > 0.0001f;
|
||||
bool flag2 = profileData.RightUpperArmSpatialData != null && profileData.RightUpperArmSpatialData.pcaData != null && profileData.RightUpperArmSpatialData.pcaData.pcaLength > 0.0001f;
|
||||
if (!flag && !flag2)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters: profile arm data invalid. Skip.");
|
||||
return;
|
||||
}
|
||||
Vector3 leftCenter = Vector3.zero;
|
||||
if (flag)
|
||||
{
|
||||
leftCenter = this.poseMatchCommonUtil.GetProfilePcaCenterWorld(clothBoneMap, profileData.LeftUpperArmSpatialData, comprehensiveScale);
|
||||
}
|
||||
Vector3 rightCenter = Vector3.zero;
|
||||
if (flag2)
|
||||
{
|
||||
rightCenter = this.poseMatchCommonUtil.GetProfilePcaCenterWorld(clothBoneMap, profileData.RightUpperArmSpatialData, comprehensiveScale);
|
||||
}
|
||||
Vector3 sourceShoulderCenterWorld = this.CalculateShoulderCenter(flag, flag2, leftCenter, rightCenter);
|
||||
RegionStats regionStats = this.ComputeArmRegionStats(targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
RegionStats regionStats2 = this.ComputeArmRegionStats(targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
bool flag3 = regionStats.length > 0.0001f;
|
||||
bool flag4 = regionStats2.length > 0.0001f;
|
||||
if (!flag3 && !flag4)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters: target arm PCA failed. Skip.");
|
||||
return;
|
||||
}
|
||||
Vector3 targetShoulderCenterWorld = this.CalculateShoulderCenter(flag3, flag4, regionStats.center, regionStats2.center);
|
||||
if (!clothBoneMap.TryGetValue((HumanBodyBones)13, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Left UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - clothBoneMap has no LeftUpperArm set");
|
||||
}
|
||||
if (!clothBoneMap.TryGetValue((HumanBodyBones)14, out var value2) || value2 == null || value2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Right UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - clothBoneMap has no RightUpperArm set");
|
||||
}
|
||||
this.AlignUpperArmByArmCenters(value, value2, sourceShoulderCenterWorld, targetShoulderCenterWorld, boneFromBoneMap);
|
||||
}
|
||||
|
||||
private Vector3 CalculateShoulderCenter(bool leftValid, bool rightValid, Vector3 leftCenter, Vector3 rightCenter)
|
||||
{
|
||||
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (leftValid && rightValid)
|
||||
{
|
||||
return 0.5f * (leftCenter + rightCenter);
|
||||
}
|
||||
if (leftValid)
|
||||
{
|
||||
return leftCenter;
|
||||
}
|
||||
return rightCenter;
|
||||
}
|
||||
|
||||
public RegionStats ComputeArmRegionStats(IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0151: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0153: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones[] targetHumanBones;
|
||||
if (!isLeft)
|
||||
{
|
||||
targetHumanBones = new HumanBodyBones[] { (HumanBodyBones)14, (HumanBodyBones)16, (HumanBodyBones)18 };
|
||||
}
|
||||
else
|
||||
{
|
||||
targetHumanBones = new HumanBodyBones[] { (HumanBodyBones)13, (HumanBodyBones)15, (HumanBodyBones)17 };
|
||||
}
|
||||
List<Vector3> list = this.poseMatchCommonUtil.CollectHumanoidVerticesWorld(targetHumanBones, avatarBakedBodyMeshes, avatarBoneMap);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)$"[BodyPoseMatch_Arm] ComputeArmRegionStats: arm vertices 0. isLeft={isLeft}");
|
||||
return default(RegionStats);
|
||||
}
|
||||
RegionStats result = new PcaUtil().ComputeRegionStats(list);
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 13 : 14));
|
||||
Transform boneFromBoneMap2 = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 15 : 16));
|
||||
Transform boneFromBoneMap3 = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 17 : 18));
|
||||
Vector3 principalAxis = Vector3.zero;
|
||||
if (boneFromBoneMap != null && boneFromBoneMap3 != null)
|
||||
{
|
||||
principalAxis = boneFromBoneMap3.position - boneFromBoneMap.position;
|
||||
}
|
||||
else if (boneFromBoneMap != null && boneFromBoneMap2 != null)
|
||||
{
|
||||
principalAxis = boneFromBoneMap2.position - boneFromBoneMap.position;
|
||||
}
|
||||
else if (boneFromBoneMap2 != null && boneFromBoneMap3 != null)
|
||||
{
|
||||
principalAxis = boneFromBoneMap3.position - boneFromBoneMap2.position;
|
||||
}
|
||||
if (principalAxis.sqrMagnitude > 1E-08f)
|
||||
{
|
||||
principalAxis.Normalize();
|
||||
result.principalAxis = principalAxis;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private void ScalingUpperArmLength(Dictionary<HumanBodyBones, HashSet<Transform>> sourceBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft, bool autoDetectAxis, int forceAxisIndex)
|
||||
{
|
||||
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 13 : 14);
|
||||
HumanBodyBones bone = (HumanBodyBones)(isLeft ? 15 : 16);
|
||||
HumanBodyBones bone2 = (HumanBodyBones)(isLeft ? 17 : 18);
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, val);
|
||||
Transform boneFromBoneMap2 = this.poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, bone);
|
||||
Transform boneFromBoneMap3 = this.poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, bone2);
|
||||
Transform boneFromBoneMap4 = this.poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
Transform boneFromBoneMap5 = this.poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, bone);
|
||||
Transform boneFromBoneMap6 = this.poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, bone2);
|
||||
HashSet<Transform> value;
|
||||
if (boneFromBoneMap == null || boneFromBoneMap2 == null || boneFromBoneMap3 == null || boneFromBoneMap4 == null || boneFromBoneMap5 == null || boneFromBoneMap6 == null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingSingArmLenght: some arm bones are null. Skip.");
|
||||
}
|
||||
else if (sourceBoneMap == null || !sourceBoneMap.TryGetValue(val, out value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingSingArmLenght: sourceUpperSet missing. Skip.");
|
||||
}
|
||||
else
|
||||
{
|
||||
this.poseMatchCommonUtil.BoneLengthAdjust(boneFromBoneMap, boneFromBoneMap2, boneFromBoneMap4, boneFromBoneMap5, value, autoDetectAxis, forceAxisIndex);
|
||||
}
|
||||
}
|
||||
|
||||
private void ScalingLowerArmLength(Dictionary<HumanBodyBones, HashSet<Transform>> sourceBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft, bool autoDetectAxis, int forceAxisIndex, float sourceLowerarmExtremeX, float targetLowerarmExtremeX)
|
||||
{
|
||||
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014b: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 15 : 16);
|
||||
HumanBodyBones bone = (HumanBodyBones)(isLeft ? 17 : 18);
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, val);
|
||||
Transform boneFromBoneMap2 = this.poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, bone);
|
||||
Transform boneFromBoneMap3 = this.poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
if (boneFromBoneMap == null || boneFromBoneMap2 == null || boneFromBoneMap3 == null)
|
||||
{
|
||||
Debug.LogWarning("[BodyPoseMatch_Arm] ScalingSingArmLenght: some arm bones are null. Skip.");
|
||||
return;
|
||||
}
|
||||
float x = boneFromBoneMap.position.x;
|
||||
float x2 = boneFromBoneMap3.position.x;
|
||||
float num = Mathf.Abs(sourceLowerarmExtremeX - x);
|
||||
float num2 = Mathf.Abs(targetLowerarmExtremeX - x2);
|
||||
if (num < 0.0001f || num2 < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning($"[BodyPoseMatch_Arm] ScalingSingArmLenght: span too small. source={num}, target={num2}");
|
||||
return;
|
||||
}
|
||||
float num3 = num2 / num;
|
||||
int num4 = this.ResolveArmLengthAxisIndex(boneFromBoneMap, boneFromBoneMap2, autoDetectAxis, forceAxisIndex);
|
||||
Vector3 localScale = boneFromBoneMap.localScale;
|
||||
switch (num4)
|
||||
{
|
||||
case 0:
|
||||
localScale.x *= num3;
|
||||
break;
|
||||
case 1:
|
||||
localScale.y *= num3;
|
||||
break;
|
||||
case 2:
|
||||
localScale.z *= num3;
|
||||
break;
|
||||
}
|
||||
foreach (Transform item in sourceBoneMap[val])
|
||||
{
|
||||
if (!(item == null))
|
||||
{
|
||||
item.localScale = localScale;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ScalingBothArmsLength(IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
if (proxyBoneMap == null || targetBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_Arm] ScalingSingArmLenght\n - BoneMap is null");
|
||||
}
|
||||
this.ScalingUpperArmLength(proxyBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex);
|
||||
this.ScalingUpperArmLength(proxyBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex);
|
||||
if (proxyBakedBodyMeshes != null)
|
||||
{
|
||||
foreach (BakedBodyMesh proxyBakedBodyMesh in proxyBakedBodyMeshes)
|
||||
{
|
||||
proxyBakedBodyMesh.ReBakeMesh();
|
||||
}
|
||||
}
|
||||
this.ScalingLowerArmLength_BodyMatch(proxyBakedBodyMeshes, proxyBoneMap, targetBakedBodyMeshes, targetBoneMap, autoDetectAxis, forceAxisIndex);
|
||||
}
|
||||
|
||||
private void ScalingLowerArmLength_BodyMatch(IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool autoDetectAxis, int forceAxisIndex)
|
||||
{
|
||||
if (this.TryGetForearmExtremeX(proxyBakedBodyMeshes, proxyBoneMap, (HumanBodyBones)17, isLeft: true, out var extremeX) && this.TryGetForearmExtremeX(targetBakedBodyMeshes, targetBoneMap, (HumanBodyBones)17, isLeft: true, out var extremeX2))
|
||||
{
|
||||
this.ScalingLowerArmLength(proxyBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex, extremeX, extremeX2);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_BodyMatch: left extreme calc failed. Skip left lower.");
|
||||
}
|
||||
if (this.TryGetForearmExtremeX(proxyBakedBodyMeshes, proxyBoneMap, (HumanBodyBones)18, isLeft: false, out var extremeX3) && this.TryGetForearmExtremeX(targetBakedBodyMeshes, targetBoneMap, (HumanBodyBones)18, isLeft: false, out var extremeX4))
|
||||
{
|
||||
this.ScalingLowerArmLength(proxyBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex, extremeX3, extremeX4);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_BodyMatch: right extreme calc failed. Skip right lower.");
|
||||
}
|
||||
}
|
||||
|
||||
public void ScalingBothArmsLength(IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothBoneMap == null || targetBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_Arm] ScalingSingArmLenght\n - BoneMap is null");
|
||||
}
|
||||
if (profileData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Data is Missing", "[BodyPoseMatch_Arm] ScalingSingArmLenght\n - profileData is null");
|
||||
}
|
||||
this.ScalingUpperArmLength(clothBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex);
|
||||
this.ScalingUpperArmLength(clothBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex);
|
||||
this.ScalingLowerArmLength_ProfileMatch(targetBakedBodyMeshes, targetBoneMap, clothBoneMap, profileData, comprehensiveScale, autoDetectAxis, forceAxisIndex);
|
||||
}
|
||||
|
||||
private void ScalingLowerArmLength_ProfileMatch(IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale, bool autoDetectAxis, int forceAxisIndex)
|
||||
{
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
float extremeX;
|
||||
if (profileData.LeftLowerArm_HandSpatialData == null || profileData.LeftLowerArm_HandSpatialData.volumeData == null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_ProfileMatch: left spatial data missing. Skip left lower.");
|
||||
}
|
||||
else if (this.TryGetForearmExtremeX(targetBakedBodyMeshes, targetBoneMap, (HumanBodyBones)17, isLeft: true, out extremeX))
|
||||
{
|
||||
float profileForearmExtremeX = this.GetProfileForearmExtremeX(clothBoneMap, profileData.LeftLowerArm_HandSpatialData, comprehensiveScale, isLeft: true);
|
||||
this.ScalingLowerArmLength(clothBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex, profileForearmExtremeX, extremeX);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_ProfileMatch: left target extreme calc failed. Skip left lower.");
|
||||
}
|
||||
float extremeX2;
|
||||
if (profileData.RightLowerArm_HandSpatialData == null || profileData.RightLowerArm_HandSpatialData.volumeData == null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_ProfileMatch: right spatial data missing. Skip right lower.");
|
||||
}
|
||||
else if (this.TryGetForearmExtremeX(targetBakedBodyMeshes, targetBoneMap, (HumanBodyBones)18, isLeft: false, out extremeX2))
|
||||
{
|
||||
float profileForearmExtremeX2 = this.GetProfileForearmExtremeX(clothBoneMap, profileData.RightLowerArm_HandSpatialData, comprehensiveScale, isLeft: false);
|
||||
this.ScalingLowerArmLength(clothBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex, profileForearmExtremeX2, extremeX2);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_ProfileMatch: right target extreme calc failed. Skip right lower.");
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryGetForearmExtremeX(IReadOnlyList<BakedBodyMesh> bakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, HumanBodyBones targetBone, bool isLeft, out float extremeX, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
extremeX = (isLeft ? float.PositiveInfinity : float.NegativeInfinity);
|
||||
if (bakedBodyMeshes == null || boneMap == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!boneMap.TryGetValue(targetBone, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
List<Vector3> list = this.poseMatchCommonUtil.CollectWeightedVerticesWorld(bakedBodyMeshes, value, weightThreshold, sampleStep);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
{
|
||||
float x = list[i].x;
|
||||
if (isLeft)
|
||||
{
|
||||
if (x < extremeX)
|
||||
{
|
||||
extremeX = x;
|
||||
}
|
||||
}
|
||||
else if (x > extremeX)
|
||||
{
|
||||
extremeX = x;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private float GetProfileForearmExtremeX(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData spatialData, Vector3 comprehensiveScale, bool isLeft)
|
||||
{
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (spatialData == null || spatialData.volumeData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Volume Data is Missing", "[BodyPoseMatch_Arm] GetProfileForearmExtremeX\n - spatialData or spatialData.volumeData is null");
|
||||
}
|
||||
if (this.poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, spatialData.refBone) == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Ref Bone Transform is Missing", "[BodyPoseMatch_Arm] GetProfileForearmExtremeX\n - refBone transform is null");
|
||||
}
|
||||
BodyPoseMatch_CommonUtil bodyPoseMatch_CommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
float x = bodyPoseMatch_CommonUtil.GetProfileVolumeMinWorld(clothBoneMap, spatialData, 1, comprehensiveScale).x;
|
||||
float x2 = bodyPoseMatch_CommonUtil.GetProfileVolumeMaxWorld(clothBoneMap, spatialData, 1, comprehensiveScale).x;
|
||||
if (!isLeft)
|
||||
{
|
||||
return x2;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
private int ResolveArmLengthAxisIndex(Transform lowerArm, Transform hand, bool autoDetectAxis, int forceAxisIndex)
|
||||
{
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (!autoDetectAxis)
|
||||
{
|
||||
return Mathf.Clamp(forceAxisIndex, 0, 2);
|
||||
}
|
||||
Vector3 val = hand.position - lowerArm.position;
|
||||
Vector3 val2 = lowerArm.InverseTransformDirection(val);
|
||||
float num = Mathf.Abs(val2.x);
|
||||
float num2 = Mathf.Abs(val2.y);
|
||||
float num3 = Mathf.Abs(val2.z);
|
||||
if (num2 >= num && num2 >= num3)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (num >= num3)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
||||
public void DrawArmPcaDebug(GameObject avatarObject, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft, Color centerColor, Color axisColor, float axisScale = 1f, float duration = 0.1f)
|
||||
{
|
||||
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (avatarBakedBodyMeshes != null && avatarBoneMap != null)
|
||||
{
|
||||
RegionStats regionStats = this.ComputeArmRegionStats(avatarBakedBodyMeshes, avatarBoneMap, isLeft);
|
||||
if (!(regionStats.length < 0.0001f))
|
||||
{
|
||||
Vector3 center = regionStats.center;
|
||||
Vector3 val = (regionStats.principalAxis.sqrMagnitude > 1E-08f) ? regionStats.principalAxis.normalized : Vector3.up;
|
||||
float num = 0.02f * axisScale;
|
||||
Debug.DrawLine(center + Vector3.up * num, center - Vector3.up * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.right * num, center - Vector3.right * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.forward * num, center - Vector3.forward * num, centerColor, duration);
|
||||
float num2 = regionStats.length * 0.5f * axisScale;
|
||||
Debug.DrawLine(center - val * num2, center + val * num2, axisColor, duration);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void DrawForearmExtremeDebugPair(GameObject proxyObject, IReadOnlyList<SkinnedMeshRenderer> proxyBodyMeshes, GameObject targetObject, IReadOnlyList<SkinnedMeshRenderer> targetBodyMeshes, bool isLeft, float size = 0.03f, float duration = 3f)
|
||||
{
|
||||
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
this.DrawForearmExtremeDebugSingle(proxyObject, proxyBodyMeshes, isLeft, Color.blue, Color.cyan, size, duration);
|
||||
this.DrawForearmExtremeDebugSingle(targetObject, targetBodyMeshes, isLeft, Color.red, Color.magenta, size, duration);
|
||||
}
|
||||
|
||||
public void DrawForearmExtremeDebugSingle(GameObject avatarObject, IReadOnlyList<SkinnedMeshRenderer> bodyMeshes, bool isLeft, Color lineColor, Color pointColor, float size = 0.03f, float duration = 3f)
|
||||
{
|
||||
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (avatarObject == null || bodyMeshes == null || bodyMeshes.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Animator component = avatarObject.GetComponent<Animator>();
|
||||
if (!(component == null))
|
||||
{
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 15 : 16);
|
||||
Transform boneTransform = component.GetBoneTransform(val);
|
||||
if (boneTransform == null)
|
||||
{
|
||||
Debug.LogWarning($"[BodyPoseMatch_Arm] DrawForearmExtremeDebugSingle: elbow bone missing. isLeft={isLeft}");
|
||||
return;
|
||||
}
|
||||
if (!this.TryGetForearmExtremePoint(component, bodyMeshes, isLeft, out var extremePos))
|
||||
{
|
||||
Debug.LogWarning($"[BodyPoseMatch_Arm] DrawForearmExtremeDebugSingle: extreme vertex not found. isLeft={isLeft}");
|
||||
return;
|
||||
}
|
||||
Debug.DrawLine(boneTransform.position, extremePos, lineColor, duration);
|
||||
Debug.DrawLine(extremePos + Vector3.up * size, extremePos - Vector3.up * size, pointColor, duration);
|
||||
Debug.DrawLine(extremePos + Vector3.right * size, extremePos - Vector3.right * size, pointColor, duration);
|
||||
Debug.DrawLine(extremePos + Vector3.forward * size, extremePos - Vector3.forward * size, pointColor, duration);
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryGetForearmExtremePoint(Animator avatar, IReadOnlyList<SkinnedMeshRenderer> bodyMeshes, bool isLeft, out Vector3 extremePos)
|
||||
{
|
||||
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
|
||||
extremePos = default(Vector3);
|
||||
if (avatar == null || bodyMeshes == null || bodyMeshes.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 17 : 18);
|
||||
Transform boneTransform = avatar.GetBoneTransform(val);
|
||||
if (boneTransform == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
HashSet<Transform> targetBoneSet = new HashSet<Transform> { boneTransform };
|
||||
List<BakedBodyMesh> list = new List<BakedBodyMesh>(bodyMeshes.Count);
|
||||
for (int i = 0; i < bodyMeshes.Count; i++)
|
||||
{
|
||||
SkinnedMeshRenderer val2 = bodyMeshes[i];
|
||||
if (!(val2 == null))
|
||||
{
|
||||
BakedBodyMesh bakedBodyMesh = new BakedBodyMesh(val2);
|
||||
bakedBodyMesh.ReBakeMesh();
|
||||
list.Add(bakedBodyMesh);
|
||||
}
|
||||
}
|
||||
if (list.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
List<Vector3> list2 = this.poseMatchCommonUtil.CollectWeightedVerticesWorld(list, targetBoneSet, 0.1f);
|
||||
if (list2 == null || list2.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
bool flag = false;
|
||||
float num = (isLeft ? float.PositiveInfinity : float.NegativeInfinity);
|
||||
for (int j = 0; j < list2.Count; j++)
|
||||
{
|
||||
Vector3 val3 = list2[j];
|
||||
float x = val3.x;
|
||||
if (!flag)
|
||||
{
|
||||
flag = true;
|
||||
num = x;
|
||||
extremePos = val3;
|
||||
}
|
||||
else if (isLeft)
|
||||
{
|
||||
if (x < num)
|
||||
{
|
||||
num = x;
|
||||
extremePos = val3;
|
||||
}
|
||||
}
|
||||
else if (x > num)
|
||||
{
|
||||
num = x;
|
||||
extremePos = val3;
|
||||
}
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
}
|
||||
@@ -1,315 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatch_CommonUtil
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatch_CommonUtil
|
||||
{
|
||||
public Transform GetBoneFromBoneMap(Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, HumanBodyBones bone)
|
||||
{
|
||||
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (boneMap == null || !boneMap.TryGetValue(bone, out var value) || value == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return value.FirstOrDefault();
|
||||
}
|
||||
|
||||
public Vector3 GetProfilePcaCenterWorld(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData boneSpatialData, Vector3 comprehensiveScale, string errorContext = "")
|
||||
{
|
||||
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_CommonUtil] GetProfilePcaCenterWorld\n - clothBoneMap is null (context=" + errorContext + ")");
|
||||
}
|
||||
if (boneSpatialData == null || boneSpatialData.pcaData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Bone Spatial Data is Missing", "[BodyPoseMatch_CommonUtil] GetProfilePcaCenterWorld\n - boneSpatialData or boneSpatialData.pcaData is null (context=" + errorContext + ")");
|
||||
}
|
||||
Transform boneFromBoneMap = this.GetBoneFromBoneMap(clothBoneMap, boneSpatialData.refBone);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Ref Bone Transform is Missing", "[BodyPoseMatch_CommonUtil] GetProfilePcaCenterWorld" + $"\n - refBone transform is null (refBone={boneSpatialData.refBone}, context={errorContext})");
|
||||
}
|
||||
if ((Object)(object)this.GetBoneFromBoneMap(clothBoneMap, (HumanBodyBones)0) == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Hip Transform is Missing", "[BodyPoseMatch_CommonUtil] GetProfilePcaCenterWorld\n - hip transform is null (context=" + errorContext + ")");
|
||||
}
|
||||
Vector3 pcaCenter = boneSpatialData.pcaData.pcaCenter;
|
||||
Vector3 val = new Vector3(pcaCenter.x / comprehensiveScale.x, pcaCenter.y / comprehensiveScale.y, pcaCenter.z / comprehensiveScale.z);
|
||||
return boneFromBoneMap.TransformPoint(val);
|
||||
}
|
||||
|
||||
public Vector3 GetProfileVolumeMinWorld(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData spatialData, int axis, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
||||
return this.GetProfileVolumeWorld(clothBoneMap, spatialData, axis, comprehensiveScale, isMin: true);
|
||||
}
|
||||
|
||||
public Vector3 GetProfileVolumeMaxWorld(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData spatialData, int axis, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
||||
return this.GetProfileVolumeWorld(clothBoneMap, spatialData, axis, comprehensiveScale, isMin: false);
|
||||
}
|
||||
|
||||
public Vector3 GetProfileVolumeWorld(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData spatialData, int axisIndex, Vector3 comprehensiveScale, bool isMin)
|
||||
{
|
||||
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0129: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_CommonUtil] GetProfileVolumeWorld\n - clothBoneMap is null");
|
||||
}
|
||||
if (spatialData == null || spatialData.volumeData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Volume Data is Missing", "[BodyPoseMatch_CommonUtil] GetProfileVolumeWorld\n - spatialData or spatialData.volumeData is null");
|
||||
}
|
||||
Transform boneFromBoneMap = this.GetBoneFromBoneMap(clothBoneMap, spatialData.refBone);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Ref Bone Transform is Missing", "[BodyPoseMatch_CommonUtil] GetProfileVolumeWorld" + $"\n - refBone transform is null (refBone={spatialData.refBone})");
|
||||
}
|
||||
Vector3 val;
|
||||
switch (axisIndex)
|
||||
{
|
||||
case 0:
|
||||
val = (isMin ? spatialData.volumeData.fMinLocalPos : spatialData.volumeData.fMaxLocalPos);
|
||||
break;
|
||||
case 1:
|
||||
val = (isMin ? spatialData.volumeData.rMinLocalPos : spatialData.volumeData.rMaxLocalPos);
|
||||
break;
|
||||
case 2:
|
||||
val = (isMin ? spatialData.volumeData.uMinLocalPos : spatialData.volumeData.uMaxLocalPos);
|
||||
break;
|
||||
default:
|
||||
throw new AutoMorpherException("Unsupported Volume Axis Index", "[BodyPoseMatch_CommonUtil] GetProfileVolumeWorld" + $"\n - axisIndex must be 0(Forward), 1(Right), 2(Up) (axisIndex={axisIndex})");
|
||||
}
|
||||
Vector3 val2 = new Vector3(val.x / comprehensiveScale.x, val.y / comprehensiveScale.y, val.z / comprehensiveScale.z);
|
||||
return boneFromBoneMap.TransformPoint(val2);
|
||||
}
|
||||
|
||||
public List<Vector3> CollectWeightedVerticesWorld(IReadOnlyList<BakedBodyMesh> bakedBodyMeshes, HashSet<Transform> targetBoneSet, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
|
||||
List<Vector3> list = new List<Vector3>();
|
||||
if (bakedBodyMeshes == null || targetBoneSet == null || targetBoneSet.Count == 0)
|
||||
{
|
||||
return list;
|
||||
}
|
||||
foreach (BakedBodyMesh bakedBodyMesh in bakedBodyMeshes)
|
||||
{
|
||||
if (bakedBodyMesh == null || (Object)(object)bakedBodyMesh.smr == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Mesh sharedMesh = bakedBodyMesh.smr.sharedMesh;
|
||||
if ((Object)(object)sharedMesh == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
BoneWeight[] boneWeights = sharedMesh.boneWeights;
|
||||
Transform[] bones = bakedBodyMesh.smr.bones;
|
||||
if (boneWeights == null || boneWeights.Length == 0 || bones == null || bones.Length == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Vector3[] worldVerticesWithBakedMesh = new WorldVertexUtil().GetWorldVerticesWithBakedMesh(bakedBodyMesh.smr, bakedBodyMesh.bakedMesh);
|
||||
if (worldVerticesWithBakedMesh == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int num = Mathf.Min(worldVerticesWithBakedMesh.Length, boneWeights.Length);
|
||||
for (int i = 0; i < num; i += sampleStep)
|
||||
{
|
||||
BoneWeight val = boneWeights[i];
|
||||
float wSum = 0f;
|
||||
Acc(val.boneIndex0, val.weight0);
|
||||
Acc(val.boneIndex1, val.weight1);
|
||||
Acc(val.boneIndex2, val.weight2);
|
||||
Acc(val.boneIndex3, val.weight3);
|
||||
if (!(wSum < weightThreshold))
|
||||
{
|
||||
list.Add(worldVerticesWithBakedMesh[i]);
|
||||
}
|
||||
void Acc(int index, float w)
|
||||
{
|
||||
if (index >= 0 && index < bones.Length && !(w <= 0f))
|
||||
{
|
||||
Transform val2 = bones[index];
|
||||
if ((Object)(object)val2 != (Object)null && targetBoneSet.Contains(val2))
|
||||
{
|
||||
wSum += w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<Vector3> CollectHumanoidVerticesWorld(IReadOnlyList<HumanBodyBones> targetHumanBones, IReadOnlyList<BakedBodyMesh> bakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
|
||||
List<Vector3> result = new List<Vector3>();
|
||||
if (bakedBodyMeshes == null || boneMap == null || boneMap.Count == 0 || targetHumanBones == null)
|
||||
{
|
||||
throw new AutoMorpherException("Invalid Arguments for CollectHumanoidVerticesWorld", "[BodyPoseMatchCommonUtil] CollectHumanoidVerticesWorld\n - bakedBodyMeshes is null OR boneMap is null/empty OR targetHumanBones is null");
|
||||
}
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
foreach (HumanBodyBones targetHumanBone in targetHumanBones)
|
||||
{
|
||||
if (!boneMap.TryGetValue(targetHumanBone, out var value) || value == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if ((Object)(object)item != (Object)null)
|
||||
{
|
||||
hashSet.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hashSet.Count == 0)
|
||||
{
|
||||
Debug.Log((object)"[AvatarBodyMatchUtil] CollectBodyPartVerticesWorld: targetBoneSet is empty.");
|
||||
return result;
|
||||
}
|
||||
return this.CollectWeightedVerticesWorld(bakedBodyMeshes, hashSet, weightThreshold, sampleStep);
|
||||
}
|
||||
|
||||
public void BoneLengthAdjust(Transform proxyParent, Transform proxyChild, Transform targetParent, Transform targetChild, HashSet<Transform> proxyParentSet, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyParent == (Object)null || (Object)(object)proxyChild == (Object)null || (Object)(object)targetParent == (Object)null || (Object)(object)targetChild == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] MatchBoneSegmentLength: bone null");
|
||||
return;
|
||||
}
|
||||
float num = Vector3.Distance(proxyParent.position, proxyChild.position);
|
||||
float num2 = Vector3.Distance(targetParent.position, targetChild.position);
|
||||
if (num < 1E-06f || num2 < 1E-06f)
|
||||
{
|
||||
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] MatchBoneSegmentLength: too small length. proxy={num}, target={num2}");
|
||||
return;
|
||||
}
|
||||
float num3 = num2 / num;
|
||||
int num7;
|
||||
if (autoDetectAxis)
|
||||
{
|
||||
Vector3 val = proxyChild.position - proxyParent.position;
|
||||
Vector3 val2 = proxyParent.InverseTransformDirection(val);
|
||||
float num4 = Mathf.Abs(val2.x);
|
||||
float num5 = Mathf.Abs(val2.y);
|
||||
float num6 = Mathf.Abs(val2.z);
|
||||
num7 = ((num5 >= num4 && num5 >= num6) ? 1 : ((!(num4 >= num6)) ? 2 : 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
num7 = Mathf.Clamp(forceAxisIndex, 0, 2);
|
||||
}
|
||||
Vector3 localScale = proxyParent.localScale;
|
||||
switch (num7)
|
||||
{
|
||||
case 0:
|
||||
localScale.x *= num3;
|
||||
break;
|
||||
case 1:
|
||||
localScale.y *= num3;
|
||||
break;
|
||||
case 2:
|
||||
localScale.z *= num3;
|
||||
break;
|
||||
}
|
||||
foreach (Transform item in proxyParentSet)
|
||||
{
|
||||
item.localScale = localScale;
|
||||
}
|
||||
}
|
||||
|
||||
public Transform CreateTempMarker(string markerObjectName, Transform parentTransform, IReadOnlyList<Transform> childTransforms, Vector3 markerWorldPosition, Quaternion markerWorldRotation, Vector3 markerLocalScale, out TempBoneMarker tempBoneMarker)
|
||||
{
|
||||
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)parentTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Marker Parent Transform is Missing", "[BodyPoseMatch_CommonUtil] CreateTempMarker\n - parentTransform is null");
|
||||
}
|
||||
if (childTransforms == null || childTransforms.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Child Transforms are Missing", "[BodyPoseMatch_CommonUtil] CreateTempMarker\n - childTransforms is null or empty");
|
||||
}
|
||||
Transform transform = new GameObject(string.IsNullOrEmpty(markerObjectName) ? "scaleSupportBone" : markerObjectName).transform;
|
||||
transform.SetParent(parentTransform, true);
|
||||
transform.position = markerWorldPosition;
|
||||
transform.rotation = markerWorldRotation;
|
||||
transform.localScale = markerLocalScale;
|
||||
tempBoneMarker = ((Component)transform).gameObject.AddComponent<TempBoneMarker>();
|
||||
tempBoneMarker.originalParent = parentTransform;
|
||||
tempBoneMarker.additionalInfo = "";
|
||||
tempBoneMarker.wrappedChildNames = new List<string>();
|
||||
for (int i = 0; i < childTransforms.Count; i++)
|
||||
{
|
||||
Transform val = childTransforms[i];
|
||||
if (!((Object)(object)val == (Object)null))
|
||||
{
|
||||
tempBoneMarker.wrappedChildNames.Add(((Object)val).name);
|
||||
val.SetParent(transform, true);
|
||||
}
|
||||
}
|
||||
return transform;
|
||||
}
|
||||
}
|
||||
@@ -1,937 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatch_Leg
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatch_Leg
|
||||
{
|
||||
private readonly BodyPoseMatch_CommonUtil poseMatchCommonUtil;
|
||||
|
||||
public BodyPoseMatch_Leg()
|
||||
{
|
||||
this.poseMatchCommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
}
|
||||
|
||||
public void AlignBothUpperLegs(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap)
|
||||
{
|
||||
if ((Object)(object)proxyObject == (Object)null || (Object)(object)targetObject == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy or Target Object is Missing", "[BodyPoseMatch_Leg] AlignBothUpperLegs\n - proxyObject or targetObject is null");
|
||||
}
|
||||
this.AlignUpperLeg_BodyMatch(proxyObject, proxyBakedBodyMeshes, proxyBoneMap, targetObject, targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
this.AlignUpperLeg_BodyMatch(proxyObject, proxyBakedBodyMeshes, proxyBoneMap, targetObject, targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
}
|
||||
|
||||
public void AlignBothUpperLegs(Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Transform clothesTransform, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
|
||||
this.AlignUpperLeg_Profile(targetTransform, targetBakedBodyMeshes, targetBoneMap, clothesTransform, clothBoneMap, profileData, comprehensiveScale, isLeft: true);
|
||||
this.AlignUpperLeg_Profile(targetTransform, targetBakedBodyMeshes, targetBoneMap, clothesTransform, clothBoneMap, profileData, comprehensiveScale, isLeft: false);
|
||||
}
|
||||
|
||||
public void AlignUpperLeg_BodyMatch(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyObject == (Object)null || (Object)(object)targetObject == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy or Target Object is Missing", "[BodyPoseMatch_Leg] AlignUpperLeg_BodyMatch\n - proxyObject or targetObject is null");
|
||||
}
|
||||
RegionStats regionStats = this.ComputeLegRegionStats(proxyObject.transform, proxyBakedBodyMeshes, proxyBoneMap, isLeft);
|
||||
RegionStats regionStats2 = this.ComputeLegRegionStats(targetObject.transform, targetBakedBodyMeshes, targetBoneMap, isLeft);
|
||||
if (regionStats.length < 0.0001f || regionStats2.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] AlignUpperLeg_BodyMatch: leg PCA 통계가 비정상입니다.");
|
||||
return;
|
||||
}
|
||||
HumanBodyBones key = (HumanBodyBones)(isLeft ? 1 : 2);
|
||||
if (proxyBoneMap == null || !proxyBoneMap.TryGetValue(key, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] AlignUpperLeg_BodyMatch: proxy UpperLeg 본을 찾지 못했습니다.");
|
||||
}
|
||||
else
|
||||
{
|
||||
this.AlignUpperLegCore(value, regionStats.center, regionStats2.center);
|
||||
}
|
||||
}
|
||||
|
||||
public void AlignUpperLeg_Profile(Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Transform clothesTransform, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale, bool isLeft)
|
||||
{
|
||||
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)targetTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Target Object is Missing", "[BodyPoseMatch_Leg] AlignUpperLeg_Profile\n - targetObject is null");
|
||||
}
|
||||
HumanBodyBones key = (HumanBodyBones)(isLeft ? 1 : 2);
|
||||
BoneSpatialData val = (isLeft ? profileData.LeftUpperLegSpatialData : profileData.RightUpperLegSpatialData);
|
||||
if (val == null || val.pcaData == null)
|
||||
{
|
||||
Debug.LogWarning((object)("[BodyPoseMatch_Leg] AlignUpperLeg: " + (isLeft ? "Left" : "Right") + " spatial data missing."));
|
||||
return;
|
||||
}
|
||||
Vector3 profilePcaCenterWorld = this.poseMatchCommonUtil.GetProfilePcaCenterWorld(clothBoneMap, val, comprehensiveScale);
|
||||
RegionStats regionStats = this.ComputeLegRegionStats(targetTransform, targetBakedBodyMeshes, targetBoneMap, isLeft);
|
||||
HashSet<Transform> value;
|
||||
if (regionStats.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] AlignUpperLeg: Target leg PCA 통계가 비정상입니다.");
|
||||
}
|
||||
else if (clothBoneMap == null || !clothBoneMap.TryGetValue(key, out value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] AlignUpperLeg: clothes UpperLeg 본을 찾지 못했습니다.");
|
||||
}
|
||||
else
|
||||
{
|
||||
this.AlignUpperLegCore(value, profilePcaCenterWorld, regionStats.center);
|
||||
}
|
||||
}
|
||||
|
||||
private void AlignUpperLegCore(IReadOnlyCollection<Transform> upperLegSet, Vector3 sourceLegCenterWorld, Vector3 targetLegCenterWorld)
|
||||
{
|
||||
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (upperLegSet == null || upperLegSet.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Vector3 val = targetLegCenterWorld - sourceLegCenterWorld;
|
||||
val.y = 0f;
|
||||
foreach (Transform item in upperLegSet)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
item.position += val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public RegionStats ComputeLegRegionStats(Transform avatarTransform, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones[] targetHumanBones = (HumanBodyBones[])(object)((!isLeft) ? new HumanBodyBones[2]
|
||||
{
|
||||
(HumanBodyBones)2,
|
||||
(HumanBodyBones)4
|
||||
} : new HumanBodyBones[2]
|
||||
{
|
||||
(HumanBodyBones)1,
|
||||
(HumanBodyBones)3
|
||||
});
|
||||
List<Vector3> list = this.poseMatchCommonUtil.CollectHumanoidVerticesWorld(targetHumanBones, avatarBakedBodyMeshes, avatarBoneMap);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)$"[BodyPoseMatch_Leg] ComputeLegRegionStats: leg vertices 0개. avatar={((avatarTransform != null) ? ((Object)avatarTransform).name : null)}, isLeft={isLeft}");
|
||||
return default(RegionStats);
|
||||
}
|
||||
RegionStats result = new PcaUtil().ComputeRegionStats(list);
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 1 : 2));
|
||||
Transform boneFromBoneMap2 = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 3 : 4));
|
||||
if ((Object)(object)boneFromBoneMap != (Object)null && (Object)(object)boneFromBoneMap2 != (Object)null)
|
||||
{
|
||||
Vector3 val = boneFromBoneMap2.position - boneFromBoneMap.position;
|
||||
Vector3 normalized = val.normalized;
|
||||
Vector3 val2 = result.principalAxis.normalized;
|
||||
if (Vector3.Dot(val2, normalized) < 0f)
|
||||
{
|
||||
val2 = -val2;
|
||||
}
|
||||
result.principalAxis = val2;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public void ScalingBothLegsAndFoots(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
this.ScalingLeg(proxyBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex);
|
||||
this.ScalingLeg(proxyBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex);
|
||||
if (proxyBakedBodyMeshes != null)
|
||||
{
|
||||
foreach (BakedBodyMesh proxyBakedBodyMesh in proxyBakedBodyMeshes)
|
||||
{
|
||||
proxyBakedBodyMesh?.ReBakeMesh();
|
||||
}
|
||||
}
|
||||
this.ScalingFoot(proxyObject, proxyBakedBodyMeshes, proxyBoneMap, targetObject, targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
this.ScalingFoot(proxyObject, proxyBakedBodyMeshes, proxyBoneMap, targetObject, targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
}
|
||||
|
||||
public void ScalingBothLegsAndFoots(Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Transform clothTransform, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
|
||||
this.ScalingLeg(clothBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex);
|
||||
this.ScalingLeg(clothBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex);
|
||||
this.ScalingFoot(profileData, comprehensiveScale, clothBoneMap, targetTransform, targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
this.ScalingFoot(profileData, comprehensiveScale, clothBoneMap, targetTransform, targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
}
|
||||
|
||||
public void ScalingLeg(Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0185: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 1 : 2);
|
||||
HumanBodyBones bone = (HumanBodyBones)(isLeft ? 3 : 4);
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, val);
|
||||
Transform boneFromBoneMap2 = this.poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, bone);
|
||||
Transform boneFromBoneMap3 = this.poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
Transform boneFromBoneMap4 = this.poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, bone);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null || (Object)(object)boneFromBoneMap2 == (Object)null || (Object)(object)boneFromBoneMap3 == (Object)null || (Object)(object)boneFromBoneMap4 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingLeg: some leg bones are null");
|
||||
return;
|
||||
}
|
||||
if (proxyBoneMap == null || !proxyBoneMap.TryGetValue(val, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingLeg: proxy upperLeg bone set missing");
|
||||
return;
|
||||
}
|
||||
this.poseMatchCommonUtil.BoneLengthAdjust(boneFromBoneMap, boneFromBoneMap2, boneFromBoneMap3, boneFromBoneMap4, value, autoDetectAxis, forceAxisIndex);
|
||||
HumanBodyBones val2 = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
Transform boneFromBoneMap5 = this.poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, val2);
|
||||
Transform boneFromBoneMap6 = this.poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val2);
|
||||
if ((Object)(object)boneFromBoneMap5 == (Object)null || (Object)(object)boneFromBoneMap6 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: proxyFoot or targetFoot is null");
|
||||
return;
|
||||
}
|
||||
float y = boneFromBoneMap5.position.y;
|
||||
float num = boneFromBoneMap6.position.y - y;
|
||||
if (!(Mathf.Abs(num) > 1E-06f))
|
||||
{
|
||||
return;
|
||||
}
|
||||
Vector3 val3 = new Vector3(0f, num, 0f);
|
||||
if (proxyBoneMap == null || !proxyBoneMap.TryGetValue(val2, out var value2) || value2 == null || value2.Count <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
foreach (Transform item in value2)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
item.position += val3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ScalingFootCore(Transform proxyHip, Transform targetFoot, bool isLeft, HashSet<Transform> footBoneSet, float proxyToeF, float proxyHeelF, float proxySideMin, float proxySideMax, float proxySoleY, float targetToeF, float targetHeelF, float targetSideMin, float targetSideMax, float targetSoleY)
|
||||
{
|
||||
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018e: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyHip == (Object)null || (Object)(object)targetFoot == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFootCore: proxyHip or targetFoot is null");
|
||||
return;
|
||||
}
|
||||
if (footBoneSet == null || footBoneSet.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFootCore: footBoneSet is null or empty");
|
||||
return;
|
||||
}
|
||||
Dictionary<Transform, List<Transform>> dictionary = new Dictionary<Transform, List<Transform>>();
|
||||
foreach (Transform item in footBoneSet)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
Transform parent = item.parent;
|
||||
if (!dictionary.TryGetValue(parent, out var value))
|
||||
{
|
||||
value = new List<Transform>();
|
||||
dictionary.Add(parent, value);
|
||||
}
|
||||
value.Add(item);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<Transform, List<Transform>> item2 in dictionary)
|
||||
{
|
||||
Transform key = item2.Key;
|
||||
List<Transform> value2 = item2.Value;
|
||||
if ((Object)(object)key == (Object)null || value2 == null || value2.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform val = value2[0];
|
||||
if (!((Object)(object)val == (Object)null))
|
||||
{
|
||||
TempBoneMarker tempBoneMarker;
|
||||
Transform val2 = this.poseMatchCommonUtil.CreateTempMarker("scaleSupportBone", key, value2, val.position, Quaternion.identity, val.localScale, out tempBoneMarker);
|
||||
if (!((Object)(object)val2 == (Object)null))
|
||||
{
|
||||
this.ScaleAndAlignAlongAxis(proxyHip, proxyHip.forward, proxyHip.up, val2, proxyToeF, proxyHeelF, targetFoot, targetToeF, targetHeelF);
|
||||
this.ScaleAndAlignAlongAxis(proxyHip, proxyHip.right, proxyHip.up, val2, isLeft ? proxySideMin : proxySideMax, isLeft ? proxySideMax : proxySideMin, targetFoot, isLeft ? targetSideMin : targetSideMax, isLeft ? targetSideMax : targetSideMin);
|
||||
this.ScaleAndAlignAlongAxis(proxyHip, proxyHip.up, proxyHip.forward, val2, 0f, proxySoleY, targetFoot, 0f, targetSoleY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ScalingFoot(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyObject == (Object)null || (Object)(object)targetObject == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy or Target Object is Missing", "[BodyPoseMatch_Leg] ScalingFoot\n - proxyObject or targetObject is null");
|
||||
}
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, val);
|
||||
Transform boneFromBoneMap2 = this.poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null || (Object)(object)boneFromBoneMap2 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: proxyFoot or targetFoot is null");
|
||||
return;
|
||||
}
|
||||
if (!this.TryGetFootSpatialData(proxyObject.transform, proxyBakedBodyMeshes, proxyBoneMap, isLeft, out var _, out var footMinUp, out var heelF, out var toeF, out var sideMin, out var sideMax) || !this.TryGetFootSpatialData(targetObject.transform, targetBakedBodyMeshes, targetBoneMap, isLeft, out var _, out var footMinUp2, out var heelF2, out var toeF2, out var sideMin2, out var sideMax2))
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: foot spatial data 계산 실패");
|
||||
return;
|
||||
}
|
||||
Transform boneFromBoneMap3 = this.poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, (HumanBodyBones)0);
|
||||
HashSet<Transform> value;
|
||||
if ((Object)(object)boneFromBoneMap3 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFoot: proxyHip is null");
|
||||
}
|
||||
else if (proxyBoneMap == null || !proxyBoneMap.TryGetValue(val, out value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFoot: footBoneSet is missing");
|
||||
}
|
||||
else
|
||||
{
|
||||
this.ScalingFootCore(boneFromBoneMap3, boneFromBoneMap2, isLeft, value, toeF, heelF, sideMin, sideMax, footMinUp, toeF2, heelF2, sideMin2, sideMax2, footMinUp2);
|
||||
}
|
||||
}
|
||||
|
||||
public void ScalingFoot(ProfileData profileData, Vector3 comprehensiveScale, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0168: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)targetTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Target Transform is Missing", "[BodyPoseMatch_Leg] ScalingFoot\n - targetTransform is null");
|
||||
}
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, val);
|
||||
Transform boneFromBoneMap2 = this.poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null || (Object)(object)boneFromBoneMap2 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: proxyFoot or targetFoot is null");
|
||||
return;
|
||||
}
|
||||
if (!this.TryGetFootSpatialData(((Component)targetTransform).transform, targetBakedBodyMeshes, targetBoneMap, isLeft, out var _, out var footMinUp, out var heelF, out var toeF, out var sideMin, out var sideMax))
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: foot spatial data 계산 실패");
|
||||
return;
|
||||
}
|
||||
Transform boneFromBoneMap3 = this.poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, (HumanBodyBones)0);
|
||||
BoneSpatialData val2 = (isLeft ? profileData.LeftFootSpatialData : profileData.RightFootSpatialData);
|
||||
if (val2 == null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] AlignNeckCenterByPcaWithHipZ: Profile FootSpatialData Data is Not exist.");
|
||||
return;
|
||||
}
|
||||
Transform boneFromBoneMap4 = this.poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, val2.refBone);
|
||||
if ((Object)(object)boneFromBoneMap4 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFoot: clothRefBone is null");
|
||||
return;
|
||||
}
|
||||
BodyPoseMatch_CommonUtil bodyPoseMatch_CommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
float proxyToeF = Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMaxWorld(clothBoneMap, val2, 0, comprehensiveScale));
|
||||
float proxyHeelF = 0f - Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMinWorld(clothBoneMap, val2, 0, comprehensiveScale));
|
||||
float proxySideMax = Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMaxWorld(clothBoneMap, val2, 1, comprehensiveScale));
|
||||
float proxySideMin = 0f - Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMinWorld(clothBoneMap, val2, 1, comprehensiveScale));
|
||||
float proxySoleY = 0f - Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMinWorld(clothBoneMap, val2, 2, comprehensiveScale));
|
||||
if (clothBoneMap == null || !clothBoneMap.TryGetValue(val, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFoot: cloth footBoneSet is missing");
|
||||
}
|
||||
else
|
||||
{
|
||||
this.ScalingFootCore(boneFromBoneMap3, boneFromBoneMap2, isLeft, value, proxyToeF, proxyHeelF, proxySideMin, proxySideMax, proxySoleY, toeF, heelF, sideMin, sideMax, footMinUp);
|
||||
}
|
||||
}
|
||||
|
||||
private void ScaleAndAlignAlongAxis(Transform baseTransform, Vector3 targetWorldAxis, Vector3 targetWorldUpAxis, Transform proxyFoot, float proxyMaxF, float proxyMinF, Transform targetFoot, float targetMaxF, float targetMinF)
|
||||
{
|
||||
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0092: Expected O, but got Unknown
|
||||
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0161: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0177: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0191: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b5: Expected O, but got Unknown
|
||||
float num = proxyMaxF - proxyMinF;
|
||||
float num2 = targetMaxF - targetMinF;
|
||||
if (Mathf.Abs(num) < 0.0001f || Mathf.Abs(num2) < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[AdjustFootForwardScale] foot span too small.");
|
||||
return;
|
||||
}
|
||||
float num3 = num2 / num;
|
||||
if (!float.IsFinite(num3) || num3 <= 0f)
|
||||
{
|
||||
Debug.LogWarning((object)$"[ScaleAndAlignAlongAxis] invalid scaleF: {num3}");
|
||||
return;
|
||||
}
|
||||
Vector3 position = proxyFoot.position + targetWorldAxis * proxyMinF;
|
||||
Vector3 position2 = targetFoot.position + targetWorldAxis * targetMinF;
|
||||
GameObject val = new GameObject("proxyAnchor");
|
||||
val.transform.SetParent(proxyFoot);
|
||||
val.transform.position = position;
|
||||
GameObject val2 = new GameObject("targetAnchor");
|
||||
val2.transform.SetParent(targetFoot);
|
||||
val2.transform.position = position2;
|
||||
Transform parent = proxyFoot.parent;
|
||||
Vector3 position3 = proxyFoot.position;
|
||||
Transform transform = new GameObject("ScaleParnet").transform;
|
||||
transform.SetParent(parent);
|
||||
transform.position = position3;
|
||||
transform.rotation = Quaternion.LookRotation(targetWorldAxis, targetWorldUpAxis);
|
||||
proxyFoot.SetParent(transform, true);
|
||||
proxyFoot.localPosition = Vector3.zero;
|
||||
Vector3 localScale = transform.localScale;
|
||||
localScale.z *= num3;
|
||||
transform.localScale = localScale;
|
||||
proxyFoot.SetParent(parent, true);
|
||||
proxyFoot.position = position3;
|
||||
float num4 = Vector3.Dot(val2.transform.position - val.transform.position, targetWorldAxis);
|
||||
Vector3 val3 = targetWorldAxis * num4;
|
||||
proxyFoot.position += val3;
|
||||
Object.DestroyImmediate((Object)(object)((Component)transform).gameObject);
|
||||
Object.DestroyImmediate((Object)(object)val);
|
||||
Object.DestroyImmediate((Object)val2);
|
||||
}
|
||||
|
||||
private bool TryGetFootSpatialData(Transform avatarTransform, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft, out float footMaxUp, out float footMinUp, out float heelF, out float toeF, out float sideMin, out float sideMax, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01af: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
|
||||
footMaxUp = float.NegativeInfinity;
|
||||
footMinUp = float.PositiveInfinity;
|
||||
heelF = float.PositiveInfinity;
|
||||
toeF = float.NegativeInfinity;
|
||||
sideMin = float.PositiveInfinity;
|
||||
sideMax = float.NegativeInfinity;
|
||||
if ((Object)(object)avatarTransform == (Object)null || avatarBakedBodyMeshes == null || avatarBoneMap == null || avatarBoneMap.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
HumanBodyBones key = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
if (!avatarBoneMap.TryGetValue(key, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] TryGetFootSpatialData\n - foot bone set is missing");
|
||||
return false;
|
||||
}
|
||||
Vector3 up = Vector3.up;
|
||||
Vector3 forward = Vector3.forward;
|
||||
Vector3 right = Vector3.right;
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
Transform val = null;
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if ((Object)(object)item == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
val = item;
|
||||
}
|
||||
Stack<Transform> stack = new Stack<Transform>();
|
||||
stack.Push(item);
|
||||
while (stack.Count > 0)
|
||||
{
|
||||
Transform val2 = stack.Pop();
|
||||
if (!((Object)(object)val2 == (Object)null) && hashSet.Add(val2))
|
||||
{
|
||||
for (int i = 0; i < val2.childCount; i++)
|
||||
{
|
||||
stack.Push(val2.GetChild(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((Object)(object)val == (Object)null || hashSet.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
List<Vector3> list = this.poseMatchCommonUtil.CollectWeightedVerticesWorld(avatarBakedBodyMeshes, hashSet, weightThreshold, sampleStep);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (int j = 0; j < list.Count; j++)
|
||||
{
|
||||
Vector3 val3 = list[j] - val.position;
|
||||
float num = Vector3.Dot(val3, up);
|
||||
if (num < footMinUp)
|
||||
{
|
||||
footMinUp = num;
|
||||
}
|
||||
if (num > footMaxUp)
|
||||
{
|
||||
footMaxUp = num;
|
||||
}
|
||||
float num2 = Vector3.Dot(val3, forward);
|
||||
if (num2 < heelF)
|
||||
{
|
||||
heelF = num2;
|
||||
}
|
||||
if (num2 > toeF)
|
||||
{
|
||||
toeF = num2;
|
||||
}
|
||||
float num3 = Vector3.Dot(val3, right);
|
||||
if (num3 < sideMin)
|
||||
{
|
||||
sideMin = num3;
|
||||
}
|
||||
if (num3 > sideMax)
|
||||
{
|
||||
sideMax = num3;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void DrawLegPcaDebug(GameObject avatarObject, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft, Color centerColor, Color axisColor, float axisScale = 1f, float duration = 1f)
|
||||
{
|
||||
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (!((Object)(object)avatarObject == (Object)null))
|
||||
{
|
||||
RegionStats regionStats = this.ComputeLegRegionStats(avatarObject.transform, avatarBakedBodyMeshes, avatarBoneMap, isLeft);
|
||||
if (regionStats.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] DrawLegPcaDebug: PCA length too small (avatar={((Object)avatarObject).name}, isLeft={isLeft})");
|
||||
return;
|
||||
}
|
||||
Vector3 center = regionStats.center;
|
||||
Vector3 normalized = regionStats.principalAxis.normalized;
|
||||
float num = 0.03f * axisScale;
|
||||
Debug.DrawLine(center + Vector3.up * num, center - Vector3.up * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.right * num, center - Vector3.right * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.forward * num, center - Vector3.forward * num, centerColor, duration);
|
||||
float num2 = regionStats.length * 0.5f * axisScale;
|
||||
Vector3 val = center - normalized * num2;
|
||||
Vector3 val2 = center + normalized * num2;
|
||||
Debug.DrawLine(val, val2, axisColor, duration);
|
||||
Debug.Log((object)($"[DrawLegPcaDebug] avatar={((Object)avatarObject).name}, isLeft={isLeft}, " + $"center={center}, axis={normalized}, len={regionStats.length}, avgRadius={regionStats.avgRadius}"));
|
||||
}
|
||||
}
|
||||
|
||||
public void DrawFootSpatialDebug(GameObject avatarObject, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft, Color centerColor, Color axisColor, Color boxColor, float axisScale = 0.1f, float duration = 1f, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0171: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0168: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0176: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01de: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0202: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0186: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0317: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_037f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0386: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_038d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0251: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0253: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0257: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0261: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0265: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_026a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_026f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0273: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0278: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_027d: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)avatarObject == (Object)null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!this.TryGetFootSpatialData(avatarObject.transform, avatarBakedBodyMeshes, avatarBoneMap, isLeft, out var footMaxUp, out var footMinUp, out var heelF, out var toeF, out var sideMin, out var sideMax, weightThreshold, sampleStep))
|
||||
{
|
||||
Debug.LogWarning((object)("[BodyPoseMatch_Leg] DrawFootSpatialDebug" + $"\n - Failed to compute Foot Spatial Data (avatar={((Object)avatarObject).name}, isLeft={isLeft})"));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (avatarBoneMap == null || avatarBoneMap.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
if (!avatarBoneMap.TryGetValue(val, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Transform val2 = null;
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if ((Object)(object)item != (Object)null)
|
||||
{
|
||||
val2 = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((Object)(object)val2 == (Object)null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Vector3 position = val2.position;
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)0);
|
||||
Vector3 val3 = (boneFromBoneMap != null) ? boneFromBoneMap.forward : avatarObject.transform.forward;
|
||||
val3.y = 0f;
|
||||
if (val3.sqrMagnitude < 1E-06f)
|
||||
{
|
||||
val3 = Vector3.forward;
|
||||
}
|
||||
val3.Normalize();
|
||||
Vector3 val4 = Vector3.Cross(Vector3.up, val3);
|
||||
if (val4.sqrMagnitude < 1E-06f)
|
||||
{
|
||||
val4 = Vector3.right;
|
||||
}
|
||||
val4.Normalize();
|
||||
Vector3 val5 = (boneFromBoneMap != null) ? boneFromBoneMap.up : avatarObject.transform.up;
|
||||
if (val5.sqrMagnitude < 1E-06f)
|
||||
{
|
||||
val5 = Vector3.up;
|
||||
}
|
||||
val5.Normalize();
|
||||
float num = Mathf.Max(0.0001f, axisScale * 0.5f);
|
||||
DrawCross(position, val5, val4, centerColor, num, duration);
|
||||
DrawCross(position, val5, val3, centerColor, num, duration);
|
||||
float len = Mathf.Max(0.0001f, axisScale * 2f);
|
||||
DrawAxisLine(position, val5, len, axisColor, duration);
|
||||
DrawAxisLine(position, val3, len, axisColor, duration);
|
||||
DrawAxisLine(position, val4, len, axisColor, duration);
|
||||
Vector3[] array = (Vector3[])(object)new Vector3[8];
|
||||
int num2 = 0;
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
float num3 = ((i == 0) ? footMinUp : footMaxUp);
|
||||
for (int j = 0; j < 2; j++)
|
||||
{
|
||||
float num4 = ((j == 0) ? heelF : toeF);
|
||||
for (int k = 0; k < 2; k++)
|
||||
{
|
||||
float num5 = ((k == 0) ? sideMin : sideMax);
|
||||
array[num2++] = position + val5 * num3 + val3 * num4 + val4 * num5;
|
||||
}
|
||||
}
|
||||
}
|
||||
DrawBoxEdges(array, boxColor, duration);
|
||||
float size = Mathf.Max(5E-05f, num * 0.6f);
|
||||
for (int l = 0; l < array.Length; l++)
|
||||
{
|
||||
DrawCross(array[l], val3, val4, boxColor, size, duration);
|
||||
}
|
||||
Debug.Log((object)($"[DrawFootSpatialDebug] avatar={((Object)avatarObject).name}, isLeft={isLeft}\n" + $" - footBone={val}, footRoot={((Object)val2).name}\n" + $" - up(min,max)=({footMinUp:F4},{footMaxUp:F4})\n" + $" - forward(heel,toe)=({heelF:F4},{toeF:F4})\n" + $" - side(min,max)=({sideMin:F4},{sideMax:F4})\n" + $" - forwardDir={val3}, rightDir={val4}, upDir={val5}"));
|
||||
}
|
||||
void DrawAxisLine(Vector3 start, Vector3 dir, float num6, Color color, float d)
|
||||
{
|
||||
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (!(dir.sqrMagnitude < 1E-10f))
|
||||
{
|
||||
dir.Normalize();
|
||||
Debug.DrawLine(start, start + dir * num6, color, d);
|
||||
}
|
||||
}
|
||||
void DrawBoxEdges(Vector3[] c, Color color, float d)
|
||||
{
|
||||
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
DrawSegment(c[0], c[1], color, d);
|
||||
DrawSegment(c[1], c[3], color, d);
|
||||
DrawSegment(c[3], c[2], color, d);
|
||||
DrawSegment(c[2], c[0], color, d);
|
||||
DrawSegment(c[4], c[5], color, d);
|
||||
DrawSegment(c[5], c[7], color, d);
|
||||
DrawSegment(c[7], c[6], color, d);
|
||||
DrawSegment(c[6], c[4], color, d);
|
||||
DrawSegment(c[0], c[4], color, d);
|
||||
DrawSegment(c[1], c[5], color, d);
|
||||
DrawSegment(c[2], c[6], color, d);
|
||||
DrawSegment(c[3], c[7], color, d);
|
||||
}
|
||||
void DrawCross(Vector3 pos, Vector3 axisA, Vector3 axisB, Color color, float num6, float d)
|
||||
{
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (axisA.sqrMagnitude < 1E-10f)
|
||||
{
|
||||
axisA = Vector3.up;
|
||||
}
|
||||
if (axisB.sqrMagnitude < 1E-10f)
|
||||
{
|
||||
axisB = Vector3.right;
|
||||
}
|
||||
axisA.Normalize();
|
||||
axisB.Normalize();
|
||||
Debug.DrawLine(pos - axisA * num6, pos + axisA * num6, color, d);
|
||||
Debug.DrawLine(pos - axisB * num6, pos + axisB * num6, color, d);
|
||||
}
|
||||
void DrawSegment(Vector3 p0, Vector3 p1, Color color, float d)
|
||||
{
|
||||
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
||||
Debug.DrawLine(p0, p1, color, d);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,211 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatch_Torso
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatch_Torso
|
||||
{
|
||||
private readonly BodyPoseMatch_CommonUtil poseMatchCommonUtil;
|
||||
|
||||
public BodyPoseMatch_Torso()
|
||||
{
|
||||
this.poseMatchCommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
}
|
||||
|
||||
public void AlignTorsoByNeck(IReadOnlyCollection<Transform> sourceHipSet, Vector3 sourceNeckCenterWorld, Vector3 targetNeckCenterWorld)
|
||||
{
|
||||
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (sourceHipSet == null || sourceHipSet.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Hip Set is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - sourceHipSet is null or empty");
|
||||
}
|
||||
Transform val = sourceHipSet.FirstOrDefault((Transform t) => (Object)(object)t != (Object)null);
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Source Hip Transform is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - sourceHipSet has no valid Transform");
|
||||
}
|
||||
Vector3 val2 = targetNeckCenterWorld - sourceNeckCenterWorld;
|
||||
Vector3 forward = val.forward;
|
||||
float num = Vector3.Dot(val2, forward);
|
||||
Vector3 val3 = forward * num;
|
||||
foreach (Transform item in sourceHipSet)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
item.position += val3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AlignTorsoByNeck(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap)
|
||||
{
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyObject == (Object)null || (Object)(object)targetObject == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy/Target Object is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - proxyObject or targetObject is null");
|
||||
}
|
||||
RegionStats regionStats = this.ComputeNeckRegionStats(proxyObject.transform, proxyBakedBodyMeshes, proxyBoneMap);
|
||||
RegionStats regionStats2 = this.ComputeNeckRegionStats(targetObject.transform, targetBakedBodyMeshes, targetBoneMap);
|
||||
if (regionStats.length < 0.0001f || regionStats2.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Torso] AlignTorsoByNeck: Neck PCA 통계가 비정상입니다.");
|
||||
return;
|
||||
}
|
||||
if (proxyBoneMap == null || !proxyBoneMap.TryGetValue((HumanBodyBones)0, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Hip Set is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - proxyBoneMap has no Hips bone set");
|
||||
}
|
||||
this.AlignTorsoByNeck(value, regionStats.center, regionStats2.center);
|
||||
}
|
||||
|
||||
public void AlignTorsoByNeck(Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, Transform clothesTransform, ProfileData profileData, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)targetTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Target Transform is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - targetTransform is null");
|
||||
}
|
||||
if (profileData == null || profileData.NeckSpatialData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Neck Data is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - profileData or profileData.NeckSpatialData is null");
|
||||
}
|
||||
RegionStats regionStats = this.ComputeNeckRegionStats(targetTransform, targetBakedBodyMeshes, targetBoneMap);
|
||||
if (regionStats.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Torso] AlignTorsoByNeck: Neck PCA 통계가 비정상입니다.");
|
||||
return;
|
||||
}
|
||||
if (clothBoneMap == null || !clothBoneMap.TryGetValue((HumanBodyBones)0, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Hip Set is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - clothBoneMap has no Hips bone set");
|
||||
}
|
||||
Vector3 profilePcaCenterWorld = this.poseMatchCommonUtil.GetProfilePcaCenterWorld(clothBoneMap, profileData.NeckSpatialData, comprehensiveScale);
|
||||
this.AlignTorsoByNeck(value, profilePcaCenterWorld, regionStats.center);
|
||||
}
|
||||
|
||||
public RegionStats ComputeNeckRegionStats(Transform avatarTransform, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap)
|
||||
{
|
||||
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones[] targetHumanBones = (HumanBodyBones[])(object)new HumanBodyBones[1] { (HumanBodyBones)9 };
|
||||
List<Vector3> list = this.poseMatchCommonUtil.CollectHumanoidVerticesWorld(targetHumanBones, avatarBakedBodyMeshes, avatarBoneMap);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)("[AvatarBodyMatchUtil] ComputeNeckRegionStats: neck vertices 0개. avatar=" + ((avatarTransform != null) ? ((Object)avatarTransform).name : null)));
|
||||
return default(RegionStats);
|
||||
}
|
||||
RegionStats result = new PcaUtil().ComputeRegionStats(list);
|
||||
Vector3 val = avatarTransform.up;
|
||||
Transform boneFromBoneMap = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)10);
|
||||
Transform boneFromBoneMap2 = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)54);
|
||||
Transform boneFromBoneMap3 = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)8);
|
||||
Transform boneFromBoneMap4 = this.poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)0);
|
||||
Transform val2 = (((Object)(object)boneFromBoneMap2 != (Object)null) ? boneFromBoneMap2 : boneFromBoneMap3);
|
||||
if ((Object)(object)boneFromBoneMap != (Object)null && (Object)(object)val2 != (Object)null)
|
||||
{
|
||||
val = boneFromBoneMap.position - val2.position;
|
||||
}
|
||||
else if ((Object)(object)boneFromBoneMap != (Object)null && (Object)(object)boneFromBoneMap4 != (Object)null)
|
||||
{
|
||||
val = boneFromBoneMap.position - boneFromBoneMap4.position;
|
||||
}
|
||||
if (val.sqrMagnitude > 1E-08f)
|
||||
{
|
||||
val.Normalize();
|
||||
}
|
||||
if (Vector3.Dot(val, ((Component)avatarTransform).transform.up) < 0f)
|
||||
{
|
||||
val = -val;
|
||||
}
|
||||
result.principalAxis = val;
|
||||
return result;
|
||||
}
|
||||
|
||||
public void DrawTorsoPcaDebug(GameObject avatarObject, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, Color centerColor, Color axisColor, float axisScale = 1f, float duration = 0.1f)
|
||||
{
|
||||
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (!((Object)(object)avatarObject == (Object)null))
|
||||
{
|
||||
RegionStats regionStats = this.ComputeNeckRegionStats(avatarObject.transform, avatarBakedBodyMeshes, avatarBoneMap);
|
||||
if (regionStats.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] DrawNeckPcaDebug: neck.length가 너무 작음. avatar={((Object)avatarObject).name}, length={regionStats.length}");
|
||||
return;
|
||||
}
|
||||
Vector3 center = regionStats.center;
|
||||
Vector3 normalized = regionStats.principalAxis.normalized;
|
||||
float num = 0.02f * axisScale;
|
||||
Debug.DrawLine(center + Vector3.up * num, center - Vector3.up * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.right * num, center - Vector3.right * num, centerColor, duration);
|
||||
float num2 = regionStats.length * 0.5f * axisScale;
|
||||
Vector3 val = center + normalized * num2;
|
||||
Debug.DrawLine(center, val, axisColor, duration);
|
||||
Debug.Log((object)$"[AvatarBodyMatchUtil] DrawNeckPcaDebug: avatar={((Object)avatarObject).name}, center={center}, axis={normalized}, halfLen={num2}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,264 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseToClothApplier
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseToClothApplier
|
||||
{
|
||||
private class BoneMapping
|
||||
{
|
||||
public Transform proxyBone;
|
||||
|
||||
public Transform clothBone;
|
||||
|
||||
public int depth;
|
||||
|
||||
public HumanBodyBones? humanBone;
|
||||
}
|
||||
|
||||
public void ApplyBodyPoseToClothes(Transform bodyProxyRoot, Transform clothesRoot, Dictionary<Transform, BoneMatchUtil.BoneRootLocalData> clothToBodyMatched, Dictionary<Transform, Transform> sourceToProxy, bool copyPosition = true, bool copyRotation = false, bool copyScale = true)
|
||||
{
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016d: Invalid comparison between Unknown and I4
|
||||
//IL_017b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0272: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_028e: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)bodyProxyRoot == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Body Proxy Root is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - bodyProxyRoot is null");
|
||||
}
|
||||
if ((Object)(object)clothesRoot == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Clothes Root is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - clothesRoot is null");
|
||||
}
|
||||
if (clothToBodyMatched == null || clothToBodyMatched.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth To Body Matched Map is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - clothToBodyMatched is null or empty");
|
||||
}
|
||||
if (sourceToProxy == null)
|
||||
{
|
||||
throw new AutoMorpherException("Source To Proxy Map is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - sourceToProxy is null");
|
||||
}
|
||||
clothesRoot.localScale = bodyProxyRoot.localScale;
|
||||
Animator component = ((Component)bodyProxyRoot).GetComponent<Animator>();
|
||||
if ((Object)(object)component == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Body Proxy Animator is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - bodyProxyRoot has no Animator");
|
||||
}
|
||||
Transform transform = ((Component)component).transform;
|
||||
Dictionary<Transform, int> dictionary = this.BuildDepthMap(transform);
|
||||
Dictionary<Transform, Transform> dictionary2 = new Dictionary<Transform, Transform>();
|
||||
List<BoneMapping> list = new List<BoneMapping>();
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
foreach (KeyValuePair<Transform, BoneMatchUtil.BoneRootLocalData> item in clothToBodyMatched)
|
||||
{
|
||||
Transform key = item.Key;
|
||||
BoneMatchUtil.BoneRootLocalData value = item.Value;
|
||||
if ((Object)(object)key == (Object)null || value == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform t = value.t;
|
||||
if ((Object)(object)t == (Object)null || !sourceToProxy.TryGetValue(t, out var value2) || (Object)(object)value2 == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
HumanBodyBones hBone = value.hBone;
|
||||
if (hashSet.Add(key))
|
||||
{
|
||||
int depth = 999;
|
||||
if (dictionary != null && dictionary.TryGetValue(value2, out var value3))
|
||||
{
|
||||
depth = value3;
|
||||
}
|
||||
list.Add(new BoneMapping
|
||||
{
|
||||
proxyBone = value2,
|
||||
clothBone = key,
|
||||
depth = depth,
|
||||
humanBone = (((int)hBone != 55) ? new HumanBodyBones?(hBone) : ((HumanBodyBones?)null))
|
||||
});
|
||||
}
|
||||
if (!dictionary2.ContainsKey(value2))
|
||||
{
|
||||
dictionary2.Add(value2, key);
|
||||
}
|
||||
}
|
||||
this.MirrorBoneMarkers(transform, dictionary2, dictionary, list);
|
||||
foreach (BoneMapping item2 in (from m in list
|
||||
where m != null && (Object)(object)m.proxyBone != (Object)null && (Object)(object)m.clothBone != (Object)null
|
||||
orderby m.depth
|
||||
select m).ToList())
|
||||
{
|
||||
if (!((Object)(object)item2.proxyBone == (Object)null) && !((Object)(object)item2.clothBone == (Object)null))
|
||||
{
|
||||
if (copyPosition)
|
||||
{
|
||||
item2.clothBone.position = item2.proxyBone.position;
|
||||
}
|
||||
if (copyRotation)
|
||||
{
|
||||
item2.clothBone.rotation = item2.proxyBone.rotation;
|
||||
}
|
||||
if (copyScale)
|
||||
{
|
||||
item2.clothBone.localScale = item2.proxyBone.localScale;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Dictionary<Transform, int> BuildDepthMap(Transform root)
|
||||
{
|
||||
Dictionary<Transform, int> dictionary = new Dictionary<Transform, int>();
|
||||
if ((Object)(object)root == (Object)null)
|
||||
{
|
||||
return dictionary;
|
||||
}
|
||||
Transform[] componentsInChildren = ((Component)root).GetComponentsInChildren<Transform>(true);
|
||||
foreach (Transform val in componentsInChildren)
|
||||
{
|
||||
if (!((Object)(object)val == (Object)null))
|
||||
{
|
||||
dictionary[val] = this.GetDepthFromRoot(val, root);
|
||||
}
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
private int GetDepthFromRoot(Transform t, Transform root)
|
||||
{
|
||||
int num = 0;
|
||||
Transform val = t;
|
||||
while ((Object)(object)val != (Object)null && (Object)(object)val != (Object)(object)root)
|
||||
{
|
||||
num++;
|
||||
val = val.parent;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
private void MirrorBoneMarkers(Transform proxyArmature, Dictionary<Transform, Transform> proxyToCloth, Dictionary<Transform, int> proxyDepthMap, List<BoneMapping> mappings)
|
||||
{
|
||||
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0166: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0174: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyArmature == (Object)null || proxyToCloth == null || mappings == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
TempBoneMarker[] componentsInChildren = ((Component)proxyArmature).GetComponentsInChildren<TempBoneMarker>(true);
|
||||
if (componentsInChildren == null || componentsInChildren.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
for (int i = 0; i < mappings.Count; i++)
|
||||
{
|
||||
BoneMapping boneMapping = mappings[i];
|
||||
if (boneMapping != null && (Object)(object)boneMapping.proxyBone != (Object)null)
|
||||
{
|
||||
hashSet.Add(boneMapping.proxyBone);
|
||||
}
|
||||
}
|
||||
int value3;
|
||||
foreach (TempBoneMarker item in (from bm in componentsInChildren
|
||||
where (Object)(object)bm != (Object)null && (Object)(object)((Component)bm).transform != (Object)null
|
||||
orderby (proxyDepthMap != null && proxyDepthMap.TryGetValue(((Component)bm).transform, out value3)) ? value3 : int.MaxValue
|
||||
select bm).ToList())
|
||||
{
|
||||
Transform transform = ((Component)item).transform;
|
||||
if ((Object)(object)transform == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform originalParent = item.originalParent;
|
||||
if ((Object)(object)originalParent == (Object)null || !proxyToCloth.TryGetValue(originalParent, out var value) || (Object)(object)value == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
List<Transform> list = this.CollectDirectChilds(value);
|
||||
Transform val = this.FindMarkerInChild(value);
|
||||
TempBoneMarker tempBoneMarker = null;
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
val = new GameObject(((Object)transform).name).transform;
|
||||
val.SetParent(value, true);
|
||||
tempBoneMarker = ((Component)val).gameObject.AddComponent<TempBoneMarker>();
|
||||
}
|
||||
else
|
||||
{
|
||||
tempBoneMarker = ((Component)val).GetComponent<TempBoneMarker>();
|
||||
}
|
||||
val.position = transform.position;
|
||||
val.rotation = transform.rotation;
|
||||
val.localScale = transform.localScale;
|
||||
tempBoneMarker.originalParent = value;
|
||||
tempBoneMarker.additionalInfo = item.additionalInfo;
|
||||
tempBoneMarker.wrappedChildNames = item.wrappedChildNames;
|
||||
for (int num = 0; num < list.Count; num++)
|
||||
{
|
||||
Transform val2 = list[num];
|
||||
if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val2 == (Object)(object)val))
|
||||
{
|
||||
val2.SetParent(val, true);
|
||||
}
|
||||
}
|
||||
if (!proxyToCloth.ContainsKey(transform))
|
||||
{
|
||||
proxyToCloth.Add(transform, val);
|
||||
}
|
||||
if (hashSet.Add(transform))
|
||||
{
|
||||
int depth = 999;
|
||||
if (proxyDepthMap != null && proxyDepthMap.TryGetValue(transform, out var value2))
|
||||
{
|
||||
depth = value2;
|
||||
}
|
||||
mappings.Add(new BoneMapping
|
||||
{
|
||||
proxyBone = transform,
|
||||
clothBone = val,
|
||||
depth = depth,
|
||||
humanBone = null
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Transform FindMarkerInChild(Transform parent)
|
||||
{
|
||||
if ((Object)(object)parent == (Object)null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
for (int i = 0; i < parent.childCount; i++)
|
||||
{
|
||||
Transform child = parent.GetChild(i);
|
||||
if (!((Object)(object)child == (Object)null) && (Object)(object)((Component)child).GetComponent<TempBoneMarker>() != (Object)null)
|
||||
{
|
||||
return child;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<Transform> CollectDirectChilds(Transform parentTransform)
|
||||
{
|
||||
int childCount = parentTransform.childCount;
|
||||
List<Transform> list = new List<Transform>(childCount);
|
||||
for (int i = 0; i < childCount; i++)
|
||||
{
|
||||
list.Add(parentTransform.GetChild(i));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@@ -1,179 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BoneAlignmentUtil
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class BoneAlignmentUtil
|
||||
{
|
||||
public void AlignClothBonesToAvatar(ClothInstance cloth, Animator targetAvatarAnimator)
|
||||
{
|
||||
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (cloth == null || (Object)(object)targetAvatarAnimator == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BoneAlignmentUtil] cloth 또는 targetAvatarAnimator 가 null.");
|
||||
return;
|
||||
}
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> humanoidMatchedBone in cloth.humanoidMatchedBones)
|
||||
{
|
||||
HumanBodyBones key = humanoidMatchedBone.Key;
|
||||
foreach (Transform item in humanoidMatchedBone.Value)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
Transform boneTransform = targetAvatarAnimator.GetBoneTransform(key);
|
||||
if (!((Object)(object)boneTransform == (Object)null))
|
||||
{
|
||||
item.position = boneTransform.position;
|
||||
item.localScale = Vector3.one;
|
||||
((Object)item).name = ((Object)boneTransform).name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ReparentAccessoryBonesToAvatar(EdenAutoMorpherConfig config)
|
||||
{
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0201: Expected O, but got Unknown
|
||||
if (config.clothBoneTypeMap == null || (Object)(object)config.targetAvatarObject == (Object)null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Animator component = config.targetAvatarObject.GetComponent<Animator>();
|
||||
if ((Object)(object)component == (Object)null || !component.isHuman)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Dictionary<Transform, Transform> dictionary = new Dictionary<Transform, Transform>();
|
||||
if (config.clothesHumanoidMatchedBones != null)
|
||||
{
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> clothesHumanoidMatchedBone in config.clothesHumanoidMatchedBones)
|
||||
{
|
||||
HumanBodyBones key = clothesHumanoidMatchedBone.Key;
|
||||
foreach (Transform item2 in clothesHumanoidMatchedBone.Value)
|
||||
{
|
||||
Transform boneTransform = component.GetBoneTransform(key);
|
||||
if ((Object)(object)item2 != (Object)null && (Object)(object)boneTransform != (Object)null)
|
||||
{
|
||||
dictionary[item2] = boneTransform;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<Transform, ClothBoneType> item3 in config.clothBoneTypeMap)
|
||||
{
|
||||
if (item3.Value != ClothBoneType.Accessory)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform key2 = item3.Key;
|
||||
if ((Object)(object)key2 == (Object)null || !key2.IsChildOf(config.targetClothesObject.transform))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform parent = key2.parent;
|
||||
Transform val = null;
|
||||
while ((Object)(object)parent != (Object)null)
|
||||
{
|
||||
if (config.clothBoneTypeMap.TryGetValue(parent, out var value) && value == ClothBoneType.Body)
|
||||
{
|
||||
val = parent;
|
||||
break;
|
||||
}
|
||||
parent = parent.parent;
|
||||
}
|
||||
if (!((Object)(object)val == (Object)null) && dictionary.TryGetValue(val, out var value2))
|
||||
{
|
||||
key2.SetParent(value2, true);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<Transform, Transform> item4 in dictionary)
|
||||
{
|
||||
Transform key3 = item4.Key;
|
||||
Transform value3 = item4.Value;
|
||||
if ((Object)(object)key3 == (Object)null || (Object)(object)value3 == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
List<Transform> list = new List<Transform>();
|
||||
foreach (Transform item5 in key3)
|
||||
{
|
||||
Transform item = item5;
|
||||
list.Add(item);
|
||||
}
|
||||
foreach (Transform item6 in list)
|
||||
{
|
||||
if (!((Object)(object)item6 == (Object)null) && !config.clothBoneTypeMap.ContainsKey(item6))
|
||||
{
|
||||
item6.SetParent(value3, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void CleanupTempBones(Transform root)
|
||||
{
|
||||
if ((Object)(object)root == (Object)null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
TempBoneMarker[] componentsInChildren = ((Component)root).GetComponentsInChildren<TempBoneMarker>(true);
|
||||
if (componentsInChildren == null || componentsInChildren.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
TempBoneMarker[] array = (from m in componentsInChildren
|
||||
where (Object)(object)m != (Object)null
|
||||
orderby GetDepth(((Component)m).transform) descending
|
||||
select m).ToArray();
|
||||
foreach (TempBoneMarker tempBoneMarker in array)
|
||||
{
|
||||
if ((Object)(object)tempBoneMarker == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform transform = ((Component)tempBoneMarker).transform;
|
||||
Transform val = tempBoneMarker.originalParent;
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
val = transform.parent;
|
||||
}
|
||||
if ((Object)(object)val != (Object)null)
|
||||
{
|
||||
while (transform.childCount > 0)
|
||||
{
|
||||
transform.GetChild(0).SetParent(val, true);
|
||||
}
|
||||
}
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
Object.DestroyImmediate((Object)(object)((Component)transform).gameObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
Object.Destroy((Object)(object)((Component)transform).gameObject);
|
||||
}
|
||||
}
|
||||
int GetDepth(Transform t)
|
||||
{
|
||||
int num2 = 0;
|
||||
while ((Object)(object)t != (Object)null)
|
||||
{
|
||||
num2++;
|
||||
t = t.parent;
|
||||
}
|
||||
return num2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,195 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BoneCorrespondenceUtil
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
public class BoneCorrespondenceUtil
|
||||
{
|
||||
private char[] nameDelims = new char[8] { ' ', '-', '_', ':', '.', '|', '\\', '/' };
|
||||
|
||||
public float ComputeDistanceScore(float d, float near, float mid, float far)
|
||||
{
|
||||
if (d < near)
|
||||
{
|
||||
return 120f;
|
||||
}
|
||||
if (d < mid)
|
||||
{
|
||||
return 90f;
|
||||
}
|
||||
if (d < far)
|
||||
{
|
||||
return 50f;
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
public float ComputeRotationScore(float ang, float RotTolDeg)
|
||||
{
|
||||
return Mathf.Clamp01(1f - ang / RotTolDeg);
|
||||
}
|
||||
|
||||
public float ComputeNameScore(string bodyName, string bodyPath, string clothesName, string clothesPath)
|
||||
{
|
||||
string text = this.StripDigits(this.NormalizeName(bodyName));
|
||||
string text2 = this.StripDigits(this.NormalizeName(clothesName));
|
||||
string text3 = this.StripDigits(this.NormalizePath(bodyPath));
|
||||
string text4 = this.StripDigits(this.NormalizePath(clothesPath));
|
||||
if (!string.IsNullOrEmpty(text3) && text3 == text4)
|
||||
{
|
||||
return 80f;
|
||||
}
|
||||
if (!string.IsNullOrEmpty(text) && text == text2)
|
||||
{
|
||||
return 70f;
|
||||
}
|
||||
if (!string.IsNullOrEmpty(text) && !string.IsNullOrEmpty(text2) && (text.Contains(text2) || text2.Contains(text)))
|
||||
{
|
||||
return 40f;
|
||||
}
|
||||
return this.SubsequenceCoverage(bodyName, clothesName) * 10f;
|
||||
}
|
||||
|
||||
private float SubsequenceCoverage(string bodyRaw, string clothesRaw)
|
||||
{
|
||||
string text = this.StripDigits(this.NormalizeName(bodyRaw));
|
||||
string text2 = this.StripDigits(this.NormalizeName(clothesRaw));
|
||||
if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(text2))
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
return (float)this.SubNameMatchBest(text, text2) / (float)text.Length;
|
||||
}
|
||||
|
||||
private int SubNameMatchBest(string a, string b, int minMatchCount = 3)
|
||||
{
|
||||
if (string.IsNullOrEmpty(a) || string.IsNullOrEmpty(b))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (a.Length < minMatchCount || b.Length < minMatchCount)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int num = 0;
|
||||
for (int i = 0; i <= a.Length - minMatchCount; i++)
|
||||
{
|
||||
int num2 = this.SubNameMatch(a, i, b, minMatchCount);
|
||||
if (num2 > num)
|
||||
{
|
||||
num = num2;
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
private int SubNameMatch(string a, int startA, string b, int minMatchCount = 3)
|
||||
{
|
||||
int length = a.Length;
|
||||
int length2 = b.Length;
|
||||
int num = 0;
|
||||
int num2 = 0;
|
||||
int num3 = 0;
|
||||
int num4 = 0;
|
||||
for (int i = startA; i < length; i++)
|
||||
{
|
||||
for (int j = num3; j < length2; j++)
|
||||
{
|
||||
num3 = j + 1;
|
||||
if (a[i] == b[j])
|
||||
{
|
||||
num4 = i + 1;
|
||||
num2++;
|
||||
if (num2 > num)
|
||||
{
|
||||
num = num2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (num2 > num)
|
||||
{
|
||||
num = num2;
|
||||
}
|
||||
num2 = 0;
|
||||
}
|
||||
if (num3 >= length2)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (num2 > num)
|
||||
{
|
||||
num = num2;
|
||||
}
|
||||
if (num < minMatchCount)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return num4 - startA;
|
||||
}
|
||||
|
||||
public string GetHierarchyPath(Transform root, Transform t)
|
||||
{
|
||||
if ((Object)(object)t == (Object)null)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
Stack<string> stack = new Stack<string>();
|
||||
Transform val = t;
|
||||
while ((Object)(object)val != (Object)null && (Object)(object)val != (Object)(object)root)
|
||||
{
|
||||
stack.Push(((Object)val).name);
|
||||
val = val.parent;
|
||||
}
|
||||
return string.Join("/", stack);
|
||||
}
|
||||
|
||||
public string NormalizeName(string s)
|
||||
{
|
||||
if (string.IsNullOrEmpty(s))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
s = s.ToLowerInvariant();
|
||||
s = s.Replace("left", "l").Replace("right", "r");
|
||||
char[] array = this.nameDelims;
|
||||
foreach (char c in array)
|
||||
{
|
||||
s = s.Replace(c.ToString(), "");
|
||||
}
|
||||
s = this.StripDigits(s);
|
||||
return s;
|
||||
}
|
||||
|
||||
public string NormalizePath(string p)
|
||||
{
|
||||
if (string.IsNullOrEmpty(p))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return string.Join("/", (from x in p.Split('/')
|
||||
where !string.IsNullOrEmpty(x)
|
||||
select x).Select(this.NormalizeName));
|
||||
}
|
||||
|
||||
public string StripDigits(string s)
|
||||
{
|
||||
if (string.IsNullOrEmpty(s))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
StringBuilder stringBuilder = new StringBuilder(s.Length);
|
||||
foreach (char c in s)
|
||||
{
|
||||
if (!char.IsDigit(c))
|
||||
{
|
||||
stringBuilder.Append(c);
|
||||
}
|
||||
}
|
||||
return stringBuilder.ToString();
|
||||
}
|
||||
}
|
||||
@@ -1,651 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BoneMatchUtil
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class BoneMatchUtil
|
||||
{
|
||||
public class BoneRootLocalData
|
||||
{
|
||||
public Transform t;
|
||||
|
||||
public string name;
|
||||
|
||||
public string path;
|
||||
|
||||
public Vector3 rootLocalPos;
|
||||
|
||||
public Quaternion rootLocalRot;
|
||||
|
||||
public HumanBodyBones hBone = (HumanBodyBones)55;
|
||||
}
|
||||
|
||||
private const float PosTolNear = 0.0001f;
|
||||
|
||||
private const float PosTolMid = 0.0005f;
|
||||
|
||||
private const float PosTolFar = 0.002f;
|
||||
|
||||
private const float RotTolDeg = 30f;
|
||||
|
||||
private const float eps = 1E-06f;
|
||||
|
||||
public List<BoneRootLocalData> ConvertProfileBoneDataToRootLocalData(List<BoneData> boneDataList)
|
||||
{
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (boneDataList == null || boneDataList.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Bone Data is Missing", "[BoneMatchUtil] ConvertProfileBoneDataToRootLocalData\n - boneDataList is null or empty");
|
||||
}
|
||||
List<BoneRootLocalData> list = new List<BoneRootLocalData>(boneDataList.Count);
|
||||
foreach (BoneData boneData in boneDataList)
|
||||
{
|
||||
if (boneData != null)
|
||||
{
|
||||
BoneRootLocalData item = new BoneRootLocalData
|
||||
{
|
||||
t = null,
|
||||
name = (boneData.boneName ?? string.Empty),
|
||||
path = (boneData.hierarchyPath ?? string.Empty),
|
||||
rootLocalPos = boneData.rootLocalPosition,
|
||||
rootLocalRot = boneData.rootLocalRotation,
|
||||
hBone = boneData.hBone
|
||||
};
|
||||
list.Add(item);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public HashSet<Transform> GetMeshBones(List<SkinnedMeshRenderer> meshRenderers)
|
||||
{
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
if (meshRenderers != null)
|
||||
{
|
||||
foreach (SkinnedMeshRenderer meshRenderer in meshRenderers)
|
||||
{
|
||||
if (meshRenderer == null || meshRenderer.bones == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform[] bones = meshRenderer.bones;
|
||||
foreach (Transform val in bones)
|
||||
{
|
||||
if (val != null)
|
||||
{
|
||||
hashSet.Add(val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return hashSet;
|
||||
}
|
||||
|
||||
public List<BoneRootLocalData> GetRootLocalBones(Transform rootT, HashSet<Transform> boneList)
|
||||
{
|
||||
BoneCorrespondenceUtil correspondenceUtil = new BoneCorrespondenceUtil();
|
||||
return (from t in boneList.Where((Transform t) => t != null).Distinct()
|
||||
select new BoneRootLocalData
|
||||
{
|
||||
t = t,
|
||||
name = t.name,
|
||||
path = correspondenceUtil.GetHierarchyPath(rootT, t),
|
||||
rootLocalPos = rootT.InverseTransformPoint(t.position),
|
||||
rootLocalRot = Quaternion.Inverse(rootT.rotation) * t.rotation
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
public List<BoneRootLocalData> GetBodyRootLocalBones(Transform bodyTransform, Animator bodyAnimator, List<SkinnedMeshRenderer> bodyMeshes)
|
||||
{
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b8: Invalid comparison between Unknown and I4
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0139: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013f: Invalid comparison between Unknown and I4
|
||||
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0290: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0283: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0285: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (bodyTransform == null)
|
||||
{
|
||||
throw new AutoMorpherException("Body Transform is Missing", "[BoneMatchUtil] GetBodyRootLocalBones\n - bodyTransform is null");
|
||||
}
|
||||
if (bodyAnimator == null)
|
||||
{
|
||||
throw new AutoMorpherException("Body Animator is Missing", "[BoneMatchUtil] GetBodyRootLocalBones\n - animator is null");
|
||||
}
|
||||
Dictionary<Transform, HumanBodyBones> humanoidBoneList = this.GetHumanoidBoneList(bodyAnimator);
|
||||
if (humanoidBoneList == null || humanoidBoneList.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Humanoid Bone Map is Missing", "[BoneMatchUtil] GetBodyRootLocalBones\n - Can't find Humanoid Bone List");
|
||||
}
|
||||
if (bodyMeshes == null || bodyMeshes.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Body Meshes are Missing", "[BoneMatchUtil] GetBodyRootLocalBones\n - bodyMeshes is null or empty");
|
||||
}
|
||||
HashSet<Transform> meshBones = this.GetMeshBones(bodyMeshes);
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> dictionary = new MeshClassifier().MeshHumanoidBoneMatcher(bodyAnimator, bodyMeshes);
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
HashSet<Transform> hashSet2 = new HashSet<Transform>();
|
||||
foreach (KeyValuePair<Transform, HumanBodyBones> item in humanoidBoneList)
|
||||
{
|
||||
if ((int)item.Value != 55 && !(item.Key == null))
|
||||
{
|
||||
if (!dictionary.TryGetValue(item.Value, out var value) || value == null)
|
||||
{
|
||||
value = new HashSet<Transform>();
|
||||
dictionary[item.Value] = value;
|
||||
}
|
||||
value.Add(item.Key);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> item2 in dictionary)
|
||||
{
|
||||
HumanBodyBones key = item2.Key;
|
||||
if ((int)key == 55)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
HashSet<Transform> value2 = item2.Value;
|
||||
if (value2 == null || value2.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform val = bodyAnimator.GetBoneTransform(key);
|
||||
if (val == null)
|
||||
{
|
||||
val = value2.First();
|
||||
}
|
||||
if (val == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
hashSet.Add(val);
|
||||
foreach (Transform item3 in value2)
|
||||
{
|
||||
if (!(item3 == val) && !(item3 == null))
|
||||
{
|
||||
hashSet2.Add(item3);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (Transform item4 in meshBones)
|
||||
{
|
||||
if (!(item4 == null) && !hashSet2.Contains(item4))
|
||||
{
|
||||
hashSet.Add(item4);
|
||||
}
|
||||
}
|
||||
List<BoneRootLocalData> rootLocalBones = this.GetRootLocalBones(bodyTransform, hashSet);
|
||||
foreach (BoneRootLocalData item5 in rootLocalBones)
|
||||
{
|
||||
if (item5 != null && !(item5.t == null))
|
||||
{
|
||||
if (humanoidBoneList.TryGetValue(item5.t, out var value3))
|
||||
{
|
||||
item5.hBone = value3;
|
||||
}
|
||||
else
|
||||
{
|
||||
item5.hBone = (HumanBodyBones)55;
|
||||
}
|
||||
}
|
||||
}
|
||||
return rootLocalBones;
|
||||
}
|
||||
|
||||
private Dictionary<Transform, HumanBodyBones> GetHumanoidBoneList(Animator bodyAnimator)
|
||||
{
|
||||
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0052: Invalid comparison between Unknown and I4
|
||||
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
Dictionary<Transform, HumanBodyBones> dictionary = new Dictionary<Transform, HumanBodyBones>();
|
||||
if (bodyAnimator == null || bodyAnimator.avatar == null || !bodyAnimator.avatar.isHuman)
|
||||
{
|
||||
return dictionary;
|
||||
}
|
||||
foreach (HumanBodyBones value in Enum.GetValues(typeof(HumanBodyBones)))
|
||||
{
|
||||
if ((int)value != 55)
|
||||
{
|
||||
Transform boneTransform = bodyAnimator.GetBoneTransform(value);
|
||||
if (!(boneTransform == null))
|
||||
{
|
||||
dictionary.TryAdd(boneTransform, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
public void MatchClothesToBodyBones(List<BoneRootLocalData> bodyBones, List<BoneRootLocalData> clothesBones, out Dictionary<HumanBodyBones, HashSet<Transform>> clothHumanBones, out Dictionary<Transform, ClothBoneType> clothBoneTypeMap, out Dictionary<Transform, BoneRootLocalData> clothToBodyMatched)
|
||||
{
|
||||
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_035d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0362: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0364: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0368: Invalid comparison between Unknown and I4
|
||||
//IL_036c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0380: Unknown result type (might be due to invalid IL or missing references)
|
||||
clothHumanBones = new Dictionary<HumanBodyBones, HashSet<Transform>>();
|
||||
clothBoneTypeMap = new Dictionary<Transform, ClothBoneType>();
|
||||
clothToBodyMatched = new Dictionary<Transform, BoneRootLocalData>();
|
||||
if (bodyBones == null || bodyBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Body Bones are Missing", "[BoneMatchUtil] MatchClothesToBodyBones\n - bodyBones is null or empty");
|
||||
}
|
||||
if (clothesBones == null || clothesBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Clothes Bones are Missing", "[BoneMatchUtil] MatchClothesToBodyBones\n - clothesBones is null or empty");
|
||||
}
|
||||
List<(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float)> list = new List<(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float)>();
|
||||
BoneCorrespondenceUtil boneCorrespondenceUtil = new BoneCorrespondenceUtil();
|
||||
foreach (BoneRootLocalData clothesBone in clothesBones)
|
||||
{
|
||||
BoneRootLocalData boneRootLocalData = null;
|
||||
float num = float.NegativeInfinity;
|
||||
float num2 = float.NegativeInfinity;
|
||||
float num3 = float.NegativeInfinity;
|
||||
float num4 = float.PositiveInfinity;
|
||||
float num5 = float.PositiveInfinity;
|
||||
foreach (BoneRootLocalData bodyBone in bodyBones)
|
||||
{
|
||||
float num6 = Vector3.Distance(clothesBone.rootLocalPos, bodyBone.rootLocalPos);
|
||||
float num7 = boneCorrespondenceUtil.ComputeDistanceScore(num6, 0.0001f, 0.0005f, 0.002f);
|
||||
if (num7 == 0f)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
float num8 = boneCorrespondenceUtil.ComputeNameScore(bodyBone.name, bodyBone.path, clothesBone.name, clothesBone.path);
|
||||
if (num8 != 0f)
|
||||
{
|
||||
float num9 = Quaternion.Angle(bodyBone.rootLocalRot, clothesBone.rootLocalRot);
|
||||
float num10 = boneCorrespondenceUtil.ComputeRotationScore(num9, 30f) * 1f;
|
||||
if (this.IsBetterCandidate(num7, num, num10, num2, num8, num3, num6, num4, num9, num5))
|
||||
{
|
||||
boneRootLocalData = bodyBone;
|
||||
num = num7;
|
||||
num2 = num10;
|
||||
num3 = num8;
|
||||
num4 = num6;
|
||||
num5 = num9;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (boneRootLocalData != null)
|
||||
{
|
||||
list.Add((clothesBone, boneRootLocalData, num, num2, num3, num4, num5));
|
||||
}
|
||||
}
|
||||
Dictionary<Transform, BoneRootLocalData> dictionary = new Dictionary<Transform, BoneRootLocalData>();
|
||||
foreach (IGrouping<BoneRootLocalData, (BoneRootLocalData, BoneRootLocalData, float, float, float, float, float)> item in from x in list group x by x.Item2)
|
||||
{
|
||||
if (item.Key == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
List<(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float)> list2 = item.ToList();
|
||||
if (list2.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float) tuple = list2[0];
|
||||
for (int num11 = 1; num11 < list2.Count; num11++)
|
||||
{
|
||||
(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float) tuple2 = list2[num11];
|
||||
if (this.IsBetterCandidate(tuple2.Item3, tuple.Item3, tuple2.Item4, tuple.Item4, tuple2.Item5, tuple.Item5, tuple2.Item6, tuple.Item6, tuple2.Item7, tuple.Item7))
|
||||
{
|
||||
tuple = tuple2;
|
||||
}
|
||||
}
|
||||
if (tuple.Item1 != null && tuple.Item1.t != null && tuple.Item2 != null)
|
||||
{
|
||||
dictionary[tuple.Item1.t] = tuple.Item2;
|
||||
}
|
||||
}
|
||||
foreach (BoneRootLocalData clothesBone2 in clothesBones)
|
||||
{
|
||||
if (clothesBone2?.t == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (dictionary.TryGetValue(clothesBone2.t, out var value))
|
||||
{
|
||||
clothBoneTypeMap[clothesBone2.t] = ClothBoneType.Body;
|
||||
clothToBodyMatched[clothesBone2.t] = value;
|
||||
HumanBodyBones hBone = value.hBone;
|
||||
if ((int)hBone != 55)
|
||||
{
|
||||
if (!clothHumanBones.TryGetValue(hBone, out var value2))
|
||||
{
|
||||
value2 = new HashSet<Transform>();
|
||||
clothHumanBones[hBone] = value2;
|
||||
}
|
||||
value2.Add(clothesBone2.t);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
clothBoneTypeMap[clothesBone2.t] = ClothBoneType.Accessory;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsBetterCandidate(float candDistScore, float bestDistScore, float candRotScore, float bestRotScore, float candNameScore, float bestNameScore, float candD, float bestD, float candAng, float bestAng)
|
||||
{
|
||||
if (candDistScore > bestDistScore)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (candDistScore < bestDistScore)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (candNameScore > bestNameScore)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (candNameScore < bestNameScore)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (Mathf.Abs(candRotScore - bestRotScore) > 1E-06f)
|
||||
{
|
||||
if (candRotScore > bestRotScore)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (candRotScore < bestRotScore)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (Mathf.Abs(candD - bestD) > 1E-06f)
|
||||
{
|
||||
if (candD < bestD)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (candD > bestD)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (Mathf.Abs(candAng - bestAng) > 1E-06f)
|
||||
{
|
||||
if (candAng < bestAng)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Dictionary<Transform, Transform> BuildTransformMatchMap(List<BoneRootLocalData> sourceBones, List<BoneRootLocalData> destBones, bool resultReverse = false)
|
||||
{
|
||||
//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02be: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (sourceBones == null || sourceBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Bones are Missing", "[BoneMatchUtil] BuildTransformMatchMap\n - sourceBones is null or empty");
|
||||
}
|
||||
if (destBones == null || destBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Destination Bones are Missing", "[BoneMatchUtil] BuildTransformMatchMap\n - destBones is null or empty");
|
||||
}
|
||||
BoneCorrespondenceUtil boneCorrespondenceUtil = new BoneCorrespondenceUtil();
|
||||
Dictionary<Transform, Transform> dictionary = new Dictionary<Transform, Transform>();
|
||||
Dictionary<string, BoneRootLocalData> dictionary2 = new Dictionary<string, BoneRootLocalData>();
|
||||
Dictionary<string, BoneRootLocalData> dictionary3 = new Dictionary<string, BoneRootLocalData>();
|
||||
Dictionary<string, List<BoneRootLocalData>> dictionary4 = new Dictionary<string, List<BoneRootLocalData>>();
|
||||
foreach (BoneRootLocalData destBone in destBones)
|
||||
{
|
||||
if (destBone == null || destBone.t == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
string text = destBone.path ?? "";
|
||||
if (text.Length > 0 && !dictionary2.ContainsKey(text))
|
||||
{
|
||||
dictionary2.Add(text, destBone);
|
||||
}
|
||||
if (text.Length > 0)
|
||||
{
|
||||
string text2 = boneCorrespondenceUtil.NormalizePath(text);
|
||||
if (text2.Length > 0 && !dictionary3.ContainsKey(text2))
|
||||
{
|
||||
dictionary3.Add(text2, destBone);
|
||||
}
|
||||
}
|
||||
string text3 = destBone.name ?? destBone.t.name;
|
||||
if (!string.IsNullOrEmpty(text3))
|
||||
{
|
||||
if (!dictionary4.TryGetValue(text3, out var value))
|
||||
{
|
||||
value = (dictionary4[text3] = new List<BoneRootLocalData>());
|
||||
}
|
||||
value.Add(destBone);
|
||||
}
|
||||
}
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
foreach (BoneRootLocalData sourceBone in sourceBones)
|
||||
{
|
||||
if (sourceBone == null || sourceBone.t == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform val = null;
|
||||
string text4 = sourceBone.path ?? "";
|
||||
if (text4.Length > 0 && dictionary2.TryGetValue(text4, out var value2) && value2 != null && value2.t != null && !hashSet.Contains(value2.t))
|
||||
{
|
||||
val = value2.t;
|
||||
}
|
||||
if (val == null && text4.Length > 0)
|
||||
{
|
||||
string text5 = boneCorrespondenceUtil.NormalizePath(text4);
|
||||
if (text5.Length > 0 && dictionary3.TryGetValue(text5, out var value3) && value3 != null && value3.t != null && !hashSet.Contains(value3.t))
|
||||
{
|
||||
val = value3.t;
|
||||
}
|
||||
}
|
||||
if (val == null)
|
||||
{
|
||||
string text6 = sourceBone.name ?? sourceBone.t.name;
|
||||
if (!string.IsNullOrEmpty(text6) && dictionary4.TryGetValue(text6, out var value4))
|
||||
{
|
||||
float num = float.PositiveInfinity;
|
||||
Transform val2 = null;
|
||||
for (int i = 0; i < value4.Count; i++)
|
||||
{
|
||||
BoneRootLocalData boneRootLocalData = value4[i];
|
||||
if (boneRootLocalData != null && !(boneRootLocalData.t == null) && !hashSet.Contains(boneRootLocalData.t))
|
||||
{
|
||||
float num2 = Vector3.SqrMagnitude(boneRootLocalData.rootLocalPos - sourceBone.rootLocalPos);
|
||||
if (num2 < num)
|
||||
{
|
||||
num = num2;
|
||||
val2 = boneRootLocalData.t;
|
||||
}
|
||||
}
|
||||
}
|
||||
val = val2;
|
||||
}
|
||||
}
|
||||
if (val != null)
|
||||
{
|
||||
if (resultReverse)
|
||||
{
|
||||
dictionary[val] = sourceBone.t;
|
||||
}
|
||||
else
|
||||
{
|
||||
dictionary[sourceBone.t] = val;
|
||||
}
|
||||
hashSet.Add(val);
|
||||
}
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
public void RemapSourceClothMatchToTargetCloth(Transform sourceClothRoot, Transform targetClothRoot, Dictionary<HumanBodyBones, HashSet<Transform>> sourceClothHumanBones, Dictionary<Transform, ClothBoneType> sourceClothBoneTypeMap, out Dictionary<HumanBodyBones, HashSet<Transform>> targetClothHumanBones, out Dictionary<Transform, ClothBoneType> targetClothBoneTypeMap)
|
||||
{
|
||||
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0261: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
targetClothHumanBones = new Dictionary<HumanBodyBones, HashSet<Transform>>();
|
||||
targetClothBoneTypeMap = new Dictionary<Transform, ClothBoneType>();
|
||||
if (sourceClothRoot == null || targetClothRoot == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Root is Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - sourceClothRoot or targetClothRoot is null");
|
||||
}
|
||||
if (sourceClothHumanBones == null || sourceClothBoneTypeMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Source Cloth Match Data is Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - sourceClothHumanBones or sourceClothBoneTypeMap is null");
|
||||
}
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
foreach (KeyValuePair<Transform, ClothBoneType> item in sourceClothBoneTypeMap)
|
||||
{
|
||||
if (item.Key != null)
|
||||
{
|
||||
hashSet.Add(item.Key);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> sourceClothHumanBone in sourceClothHumanBones)
|
||||
{
|
||||
HashSet<Transform> value = sourceClothHumanBone.Value;
|
||||
if (value == null || value.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item2 in value)
|
||||
{
|
||||
if (item2 != null)
|
||||
{
|
||||
hashSet.Add(item2);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hashSet.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Cloth Bone Candidates are Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - sourceBoneSet is empty (no bones found in sourceClothBoneTypeMap/sourceClothHumanBones)");
|
||||
}
|
||||
HashSet<Transform> meshBones = this.GetMeshBones(((Component)targetClothRoot).GetComponentsInChildren<SkinnedMeshRenderer>(true).ToList());
|
||||
if (meshBones == null || meshBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Target Cloth Bone Candidates are Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - targetBoneSet is null or empty (GetMeshBones returned no bones)");
|
||||
}
|
||||
List<BoneRootLocalData> rootLocalBones = this.GetRootLocalBones(sourceClothRoot, hashSet);
|
||||
List<BoneRootLocalData> rootLocalBones2 = this.GetRootLocalBones(targetClothRoot, meshBones);
|
||||
if (rootLocalBones == null || rootLocalBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source RootLocal Bones are Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - sourceRootLocalBones is null or empty");
|
||||
}
|
||||
if (rootLocalBones2 == null || rootLocalBones2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Target RootLocal Bones are Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - targetRootLocalBones is null or empty");
|
||||
}
|
||||
Dictionary<Transform, Transform> dictionary = this.BuildTransformMatchMap(rootLocalBones, rootLocalBones2);
|
||||
foreach (KeyValuePair<Transform, ClothBoneType> item3 in sourceClothBoneTypeMap)
|
||||
{
|
||||
Transform key = item3.Key;
|
||||
ClothBoneType value2 = item3.Value;
|
||||
if (key == null || !dictionary.TryGetValue(key, out var value3) || value3 == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (targetClothBoneTypeMap.TryGetValue(value3, out var value4))
|
||||
{
|
||||
if (value4 == ClothBoneType.Accessory && value2 == ClothBoneType.Body)
|
||||
{
|
||||
targetClothBoneTypeMap[value3] = ClothBoneType.Body;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
targetClothBoneTypeMap.Add(value3, value2);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> sourceClothHumanBone2 in sourceClothHumanBones)
|
||||
{
|
||||
HumanBodyBones key2 = sourceClothHumanBone2.Key;
|
||||
HashSet<Transform> value5 = sourceClothHumanBone2.Value;
|
||||
if (value5 == null || value5.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item4 in value5)
|
||||
{
|
||||
if (!(item4 == null) && dictionary.TryGetValue(item4, out var value6) && !(value6 == null))
|
||||
{
|
||||
if (!targetClothHumanBones.TryGetValue(key2, out var value7))
|
||||
{
|
||||
value7 = new HashSet<Transform>();
|
||||
targetClothHumanBones[key2] = value7;
|
||||
}
|
||||
value7.Add(value6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void BuildSourceToProxyBoneMap(Animator sourceAvatar, Animator proxyAvatar, out Dictionary<Transform, Transform> sourceToProxy)
|
||||
{
|
||||
sourceToProxy = new Dictionary<Transform, Transform>();
|
||||
if (sourceAvatar == null)
|
||||
{
|
||||
throw new AutoMorpherException("Source Avatar is Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - sourceAvatar is null");
|
||||
}
|
||||
if (proxyAvatar == null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Avatar is Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - proxyAvatar is null");
|
||||
}
|
||||
Transform transform = ((Component)sourceAvatar).transform;
|
||||
Transform transform2 = ((Component)proxyAvatar).transform;
|
||||
HashSet<Transform> meshBones = this.GetMeshBones(((Component)transform2).GetComponentsInChildren<SkinnedMeshRenderer>(true).ToList());
|
||||
if (meshBones == null || meshBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Body Bone Candidates are Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - proxyBoneSet is null or empty (GetMeshBones returned no bones)");
|
||||
}
|
||||
HashSet<Transform> meshBones2 = this.GetMeshBones(((Component)transform).GetComponentsInChildren<SkinnedMeshRenderer>(true).ToList());
|
||||
if (meshBones2 == null || meshBones2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Body Bone Candidates are Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - sourceBoneSet is null or empty (GetMeshBones returned no bones)");
|
||||
}
|
||||
List<BoneRootLocalData> rootLocalBones = this.GetRootLocalBones(transform2, meshBones);
|
||||
List<BoneRootLocalData> rootLocalBones2 = this.GetRootLocalBones(transform, meshBones2);
|
||||
if (rootLocalBones == null || rootLocalBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy RootLocal Bones are Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - proxyRootLocalBones is null or empty");
|
||||
}
|
||||
if (rootLocalBones2 == null || rootLocalBones2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source RootLocal Bones are Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - sourceRootLocalBones is null or empty");
|
||||
}
|
||||
sourceToProxy = this.BuildTransformMatchMap(rootLocalBones, rootLocalBones2, resultReverse: true);
|
||||
if (sourceToProxy == null)
|
||||
{
|
||||
throw new AutoMorpherException("Source To Proxy Map Build Failed", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - BuildTransformMatchMap returned null");
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,305 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.ClothHumanoidMaskUtil
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class ClothHumanoidMaskUtil
|
||||
{
|
||||
public void BuildExcludedVertexMaskForHandsAndHead(ClothInstance clothInstance, bool excludeHandRoot = false, bool excludeThumbRoot = false)
|
||||
{
|
||||
//IL_02ea: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothInstance == null || (Object)(object)clothInstance.smr == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] clothInstance / smr 가 null");
|
||||
return;
|
||||
}
|
||||
SkinnedMeshRenderer smr = clothInstance.smr;
|
||||
Mesh val = clothInstance.editableMesh ?? smr.sharedMesh;
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] mesh 가 null");
|
||||
return;
|
||||
}
|
||||
BoneWeight[] boneWeights = val.boneWeights;
|
||||
Transform[] bones = smr.bones;
|
||||
if (boneWeights == null || boneWeights.Length == 0 || bones == null || bones.Length == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] boneWeights 또는 bones 비어있음");
|
||||
return;
|
||||
}
|
||||
if (clothInstance.humanoidMatchedBones == null || clothInstance.humanoidMatchedBones.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] humanoidMatchedBones 가 비어있음 (BodyToClothPoseApplier에서 매칭 안 되었을 가능성)");
|
||||
return;
|
||||
}
|
||||
int num = val.vertexCount;
|
||||
if (boneWeights.Length != num)
|
||||
{
|
||||
num = Mathf.Min(num, boneWeights.Length);
|
||||
}
|
||||
HashSet<Transform> excludedBones = new HashSet<Transform>();
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> humanoidMatchedBones = clothInstance.humanoidMatchedBones;
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)10, out var value) && value != null)
|
||||
{
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
AddHierarchy(item, includeRoot: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)17, out var value2) && value2 != null)
|
||||
{
|
||||
foreach (Transform item2 in value2)
|
||||
{
|
||||
if (!((Object)(object)item2 == (Object)null))
|
||||
{
|
||||
AddHierarchy(item2, excludeHandRoot);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)18, out var value3) && value3 != null)
|
||||
{
|
||||
foreach (Transform item3 in value3)
|
||||
{
|
||||
if (!((Object)(object)item3 == (Object)null))
|
||||
{
|
||||
AddHierarchy(item3, excludeHandRoot);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)24, out var value4) && value4 != null)
|
||||
{
|
||||
foreach (Transform item4 in value4)
|
||||
{
|
||||
if (!((Object)(object)item4 == (Object)null))
|
||||
{
|
||||
if (excludeThumbRoot)
|
||||
{
|
||||
excludedBones.Add(item4);
|
||||
}
|
||||
else
|
||||
{
|
||||
excludedBones.Remove(item4);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)39, out var value5) && value5 != null)
|
||||
{
|
||||
foreach (Transform item5 in value5)
|
||||
{
|
||||
if (!((Object)(object)item5 == (Object)null))
|
||||
{
|
||||
if (excludeThumbRoot)
|
||||
{
|
||||
excludedBones.Add(item5);
|
||||
}
|
||||
else
|
||||
{
|
||||
excludedBones.Remove(item5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
bool[] boneIndexExcluded = new bool[bones.Length];
|
||||
for (int i = 0; i < bones.Length; i++)
|
||||
{
|
||||
Transform val2 = bones[i];
|
||||
if ((Object)(object)val2 != (Object)null && excludedBones.Contains(val2))
|
||||
{
|
||||
boneIndexExcluded[i] = true;
|
||||
}
|
||||
}
|
||||
bool[] array = new bool[num];
|
||||
for (int j = 0; j < num; j++)
|
||||
{
|
||||
BoneWeight val3 = boneWeights[j];
|
||||
float excludedWeightSum = 0f;
|
||||
AddExcludedWeight(val3.weight0, val3.boneIndex0);
|
||||
AddExcludedWeight(val3.weight1, val3.boneIndex1);
|
||||
AddExcludedWeight(val3.weight2, val3.boneIndex2);
|
||||
AddExcludedWeight(val3.weight3, val3.boneIndex3);
|
||||
array[j] = excludedWeightSum >= 0.8f;
|
||||
void AddExcludedWeight(float w, int bi)
|
||||
{
|
||||
if (!(w <= 0f) && bi >= 0 && bi < boneIndexExcluded.Length && boneIndexExcluded[bi])
|
||||
{
|
||||
excludedWeightSum += w;
|
||||
}
|
||||
}
|
||||
}
|
||||
clothInstance.excludedVertices = array;
|
||||
this.BuildLegVertexMasks(clothInstance);
|
||||
void AddHierarchy(Transform root, bool includeRoot)
|
||||
{
|
||||
if (!((Object)(object)root == (Object)null))
|
||||
{
|
||||
Stack<Transform> stack = new Stack<Transform>();
|
||||
if (includeRoot)
|
||||
{
|
||||
stack.Push(root);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int k = 0; k < root.childCount; k++)
|
||||
{
|
||||
stack.Push(root.GetChild(k));
|
||||
}
|
||||
}
|
||||
while (stack.Count > 0)
|
||||
{
|
||||
Transform val4 = stack.Pop();
|
||||
if (!((Object)(object)val4 == (Object)null) && excludedBones.Add(val4))
|
||||
{
|
||||
for (int l = 0; l < val4.childCount; l++)
|
||||
{
|
||||
stack.Push(val4.GetChild(l));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void BuildLegVertexMasks(ClothInstance clothInstance)
|
||||
{
|
||||
//IL_020b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0210: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothInstance == null || (Object)(object)clothInstance.smr == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] clothInstance / smr 가 null");
|
||||
return;
|
||||
}
|
||||
SkinnedMeshRenderer smr = clothInstance.smr;
|
||||
Mesh val = clothInstance.editableMesh ?? smr.sharedMesh;
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] mesh 가 null");
|
||||
return;
|
||||
}
|
||||
BoneWeight[] boneWeights = val.boneWeights;
|
||||
Transform[] bones = smr.bones;
|
||||
if (boneWeights == null || boneWeights.Length == 0 || bones == null || bones.Length == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] boneWeights 또는 bones 비어있음");
|
||||
return;
|
||||
}
|
||||
if (clothInstance.humanoidMatchedBones == null || clothInstance.humanoidMatchedBones.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] humanoidMatchedBones 가 비어있음 (BodyToClothPoseApplier에서 매칭 필요)");
|
||||
return;
|
||||
}
|
||||
int num = val.vertexCount;
|
||||
if (boneWeights.Length != num)
|
||||
{
|
||||
num = Mathf.Min(num, boneWeights.Length);
|
||||
}
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> humanoidMatchedBones = clothInstance.humanoidMatchedBones;
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
HashSet<Transform> hashSet2 = new HashSet<Transform>();
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)1, out var value) && value != null)
|
||||
{
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
CollectHierarchy(item, hashSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)2, out var value2) && value2 != null)
|
||||
{
|
||||
foreach (Transform item2 in value2)
|
||||
{
|
||||
if (!((Object)(object)item2 == (Object)null))
|
||||
{
|
||||
CollectHierarchy(item2, hashSet2);
|
||||
}
|
||||
}
|
||||
}
|
||||
bool[] boneIsLeftLeg = new bool[bones.Length];
|
||||
bool[] boneIsRightLeg = new bool[bones.Length];
|
||||
for (int i = 0; i < bones.Length; i++)
|
||||
{
|
||||
Transform val2 = bones[i];
|
||||
if (!((Object)(object)val2 == (Object)null))
|
||||
{
|
||||
if (hashSet.Contains(val2))
|
||||
{
|
||||
boneIsLeftLeg[i] = true;
|
||||
}
|
||||
if (hashSet2.Contains(val2))
|
||||
{
|
||||
boneIsRightLeg[i] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
bool[] array = new bool[num];
|
||||
bool[] array2 = new bool[num];
|
||||
for (int j = 0; j < num; j++)
|
||||
{
|
||||
BoneWeight val3 = boneWeights[j];
|
||||
float leftWeight = 0f;
|
||||
float rightWeight = 0f;
|
||||
Check(val3.boneIndex0, val3.weight0);
|
||||
Check(val3.boneIndex1, val3.weight1);
|
||||
Check(val3.boneIndex2, val3.weight2);
|
||||
Check(val3.boneIndex3, val3.weight3);
|
||||
if (leftWeight > 0.8f)
|
||||
{
|
||||
array[j] = true;
|
||||
array2[j] = false;
|
||||
}
|
||||
else if (rightWeight > 0.8f)
|
||||
{
|
||||
array[j] = false;
|
||||
array2[j] = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
array[j] = false;
|
||||
array2[j] = false;
|
||||
}
|
||||
void Check(int bi, float w)
|
||||
{
|
||||
if (bi >= 0 && bi < bones.Length && !(w <= 0f))
|
||||
{
|
||||
if (boneIsLeftLeg[bi])
|
||||
{
|
||||
leftWeight += w;
|
||||
}
|
||||
if (boneIsRightLeg[bi])
|
||||
{
|
||||
rightWeight += w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
clothInstance.isLeftLegVertex = array;
|
||||
clothInstance.isRightLegVertex = array2;
|
||||
void CollectHierarchy(Transform root, HashSet<Transform> set)
|
||||
{
|
||||
if (!((Object)(object)root == (Object)null))
|
||||
{
|
||||
Stack<Transform> stack = new Stack<Transform>();
|
||||
stack.Push(root);
|
||||
while (stack.Count > 0)
|
||||
{
|
||||
Transform val4 = stack.Pop();
|
||||
if (!((Object)(object)val4 == (Object)null) && set.Add(val4))
|
||||
{
|
||||
for (int k = 0; k < val4.childCount; k++)
|
||||
{
|
||||
stack.Push(val4.GetChild(k));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,700 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.ClothInstance
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
[Serializable]
|
||||
public class ClothInstance
|
||||
{
|
||||
public SkinnedMeshRenderer smr;
|
||||
|
||||
public Mesh editableMesh;
|
||||
|
||||
public Mesh bakedMesh;
|
||||
|
||||
public Matrix4x4 worldNoScale;
|
||||
|
||||
public Vector3[] worldVertices;
|
||||
|
||||
public Vector3[] minDistanceVector;
|
||||
|
||||
public float[] minDistance;
|
||||
|
||||
public Vector3[] deltas;
|
||||
|
||||
public Vector3[] deltasLocal;
|
||||
|
||||
public List<int>[] vertexAdjacency;
|
||||
|
||||
public List<List<int>> equivalentVertices;
|
||||
|
||||
public bool[] isInsideVertex;
|
||||
|
||||
public bool[] excludedVertices;
|
||||
|
||||
public bool[] isLeftLegVertex;
|
||||
|
||||
public bool[] isRightLegVertex;
|
||||
|
||||
public Vector3[] bakedWorldNormals;
|
||||
|
||||
public Vector4[] bakedWorldTangents;
|
||||
|
||||
public Dictionary<HumanBodyBones, HashSet<Transform>> humanoidMatchedBones;
|
||||
|
||||
public ClothInstance(SkinnedMeshRenderer clotheSMR, bool duplicateMesh = true)
|
||||
{
|
||||
this.smr = clotheSMR;
|
||||
if (duplicateMesh)
|
||||
{
|
||||
string name = this.smr.sharedMesh.name;
|
||||
this.editableMesh = UnityEngine.Object.Instantiate<Mesh>(clotheSMR.sharedMesh);
|
||||
this.editableMesh.name = name + "_EditableMesh";
|
||||
this.smr.sharedMesh = this.editableMesh;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.editableMesh = this.smr.sharedMesh;
|
||||
}
|
||||
this.UpdateWorldVertices();
|
||||
int vertexCount = this.editableMesh.vertexCount;
|
||||
this.minDistanceVector = (Vector3[])(object)new Vector3[vertexCount];
|
||||
this.deltas = (Vector3[])(object)new Vector3[vertexCount];
|
||||
this.minDistance = new float[vertexCount];
|
||||
this.isInsideVertex = new bool[vertexCount];
|
||||
this.excludedVertices = new bool[vertexCount];
|
||||
this.isLeftLegVertex = new bool[vertexCount];
|
||||
this.isRightLegVertex = new bool[vertexCount];
|
||||
this.humanoidMatchedBones = new Dictionary<HumanBodyBones, HashSet<Transform>>();
|
||||
this.vertexAdjacency = this.BuildVertexAdjacency(this.editableMesh);
|
||||
this.BuildEquivalentVerticesFromWorld();
|
||||
}
|
||||
|
||||
public void UpdateWorldVertices()
|
||||
{
|
||||
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0019: Expected O, but got Unknown
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0185: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0198: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0205: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_021a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_021f: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (this.bakedMesh == null)
|
||||
{
|
||||
this.bakedMesh = new Mesh();
|
||||
}
|
||||
else
|
||||
{
|
||||
this.bakedMesh.Clear();
|
||||
}
|
||||
this.smr.BakeMesh(this.bakedMesh);
|
||||
int vertexCount = this.editableMesh.vertexCount;
|
||||
Vector3 lossyScale = ((Component)this.smr).transform.lossyScale;
|
||||
Vector3 val = new Vector3(1f / Mathf.Max(lossyScale.x, 1E-08f), 1f / Mathf.Max(lossyScale.y, 1E-08f), 1f / Mathf.Max(lossyScale.z, 1E-08f));
|
||||
this.worldNoScale = ((Component)this.smr).transform.localToWorldMatrix * Matrix4x4.Scale(val);
|
||||
this.worldVertices = (Vector3[])(object)new Vector3[vertexCount];
|
||||
this.deltasLocal = (Vector3[])(object)new Vector3[vertexCount];
|
||||
for (int i = 0; i < vertexCount; i++)
|
||||
{
|
||||
this.worldVertices[i] = this.worldNoScale.MultiplyPoint3x4(this.bakedMesh.vertices[i]);
|
||||
this.deltasLocal[i] = Vector3.zero;
|
||||
}
|
||||
Vector3[] normals = this.bakedMesh.normals;
|
||||
Vector4[] tangents = this.bakedMesh.tangents;
|
||||
this.bakedWorldNormals = (Vector3[])(object)new Vector3[vertexCount];
|
||||
if (tangents != null && tangents.Length == vertexCount)
|
||||
{
|
||||
this.bakedWorldTangents = (Vector4[])(object)new Vector4[vertexCount];
|
||||
}
|
||||
else
|
||||
{
|
||||
this.bakedWorldTangents = null;
|
||||
}
|
||||
for (int j = 0; j < vertexCount; j++)
|
||||
{
|
||||
Vector3[] array = this.bakedWorldNormals;
|
||||
int num = j;
|
||||
Vector3 val2 = ((Component)this.smr).transform.TransformDirection(normals[j]);
|
||||
array[num] = val2.normalized;
|
||||
if (this.bakedWorldTangents != null)
|
||||
{
|
||||
val2 = ((Component)this.smr).transform.TransformDirection(new Vector3(tangents[j].x, tangents[j].y, tangents[j].z));
|
||||
Vector3 normalized = val2.normalized;
|
||||
this.bakedWorldTangents[j] = new Vector4(normalized.x, normalized.y, normalized.z, tangents[j].w);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<int>[] BuildVertexAdjacency(Mesh mesh, float seamThreshold = 0.0001f, float proximityThreshold = 0f)
|
||||
{
|
||||
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0367: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_036c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0370: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_037f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_038e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0461: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_046f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0471: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0290: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0295: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_020f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0511: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0516: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0490: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0495: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02af: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_022c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0231: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0233: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0238: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_052b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0530: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0532: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0537: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_04ad: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_04b2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_04b4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_04b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (mesh == null)
|
||||
{
|
||||
throw new AutoMorpherException("Mesh is Missing", "[VertexAdjacencyUtil] BuildVertexAdjacency\n - mesh is null");
|
||||
}
|
||||
int vertexCount = mesh.vertexCount;
|
||||
int[] triangles = mesh.triangles;
|
||||
Vector3[] vertices = mesh.vertices;
|
||||
List<int>[] array = new List<int>[vertexCount];
|
||||
for (int i = 0; i < vertexCount; i++)
|
||||
{
|
||||
array[i] = new List<int>();
|
||||
}
|
||||
int num = triangles.Length / 3;
|
||||
for (int j = 0; j < num; j++)
|
||||
{
|
||||
int num2 = triangles[j * 3];
|
||||
int num3 = triangles[j * 3 + 1];
|
||||
int num4 = triangles[j * 3 + 2];
|
||||
AddNeighbor(array, num2, num3);
|
||||
AddNeighbor(array, num3, num2);
|
||||
AddNeighbor(array, num3, num4);
|
||||
AddNeighbor(array, num4, num3);
|
||||
AddNeighbor(array, num4, num2);
|
||||
AddNeighbor(array, num2, num4);
|
||||
}
|
||||
Vector3 val4;
|
||||
if (seamThreshold > 0f)
|
||||
{
|
||||
float num5 = seamThreshold * 2f;
|
||||
float num6 = seamThreshold * seamThreshold;
|
||||
Dictionary<Vector3Int, List<int>> dictionary = new Dictionary<Vector3Int, List<int>>();
|
||||
Vector3Int key = default(Vector3Int);
|
||||
for (int k = 0; k < vertexCount; k++)
|
||||
{
|
||||
Vector3 val = vertices[k];
|
||||
key = new Vector3Int(Mathf.FloorToInt(val.x / num5), Mathf.FloorToInt(val.y / num5), Mathf.FloorToInt(val.z / num5));
|
||||
if (!dictionary.TryGetValue(key, out var value))
|
||||
{
|
||||
value = (dictionary[key] = new List<int>());
|
||||
}
|
||||
value.Add(k);
|
||||
}
|
||||
Vector3Int val2 = default(Vector3Int);
|
||||
foreach (KeyValuePair<Vector3Int, List<int>> item in dictionary)
|
||||
{
|
||||
Vector3Int key2 = item.Key;
|
||||
List<int> value2 = item.Value;
|
||||
for (int l = -1; l <= 1; l++)
|
||||
{
|
||||
for (int m = -1; m <= 1; m++)
|
||||
{
|
||||
for (int n = -1; n <= 1; n++)
|
||||
{
|
||||
if (l < 0 || (l == 0 && m < 0) || (l == 0 && m == 0 && n < 0))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
val2 = new(key2.x + l, key2.y + m, key2.z + n);
|
||||
if (!dictionary.TryGetValue(val2, out var value3))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (val2 == key2)
|
||||
{
|
||||
for (int num7 = 0; num7 < value2.Count; num7++)
|
||||
{
|
||||
int num8 = value2[num7];
|
||||
Vector3 val3 = vertices[num8];
|
||||
for (int num9 = num7 + 1; num9 < value2.Count; num9++)
|
||||
{
|
||||
int num10 = value2[num9];
|
||||
val4 = vertices[num10] - val3;
|
||||
if (val4.sqrMagnitude <= num6)
|
||||
{
|
||||
AddNeighbor(array, num8, num10);
|
||||
AddNeighbor(array, num10, num8);
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
for (int num11 = 0; num11 < value2.Count; num11++)
|
||||
{
|
||||
int num12 = value2[num11];
|
||||
Vector3 val5 = vertices[num12];
|
||||
for (int num13 = 0; num13 < value3.Count; num13++)
|
||||
{
|
||||
int num14 = value3[num13];
|
||||
val4 = vertices[num14] - val5;
|
||||
if (val4.sqrMagnitude <= num6)
|
||||
{
|
||||
AddNeighbor(array, num12, num14);
|
||||
AddNeighbor(array, num14, num12);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (proximityThreshold > 0f)
|
||||
{
|
||||
float num15 = proximityThreshold * 2f;
|
||||
float num16 = proximityThreshold * proximityThreshold;
|
||||
Dictionary<Vector3Int, List<int>> dictionary2 = new Dictionary<Vector3Int, List<int>>();
|
||||
Vector3Int key3 = default(Vector3Int);
|
||||
for (int num17 = 0; num17 < vertexCount; num17++)
|
||||
{
|
||||
Vector3 val6 = vertices[num17];
|
||||
key3 = new Vector3Int(Mathf.FloorToInt(val6.x / num15), Mathf.FloorToInt(val6.y / num15), Mathf.FloorToInt(val6.z / num15));
|
||||
if (!dictionary2.TryGetValue(key3, out var value4))
|
||||
{
|
||||
value4 = (dictionary2[key3] = new List<int>());
|
||||
}
|
||||
value4.Add(num17);
|
||||
}
|
||||
Vector3Int val7 = default(Vector3Int);
|
||||
foreach (KeyValuePair<Vector3Int, List<int>> item2 in dictionary2)
|
||||
{
|
||||
Vector3Int key4 = item2.Key;
|
||||
List<int> value5 = item2.Value;
|
||||
for (int num18 = -1; num18 <= 1; num18++)
|
||||
{
|
||||
for (int num19 = -1; num19 <= 1; num19++)
|
||||
{
|
||||
for (int num20 = -1; num20 <= 1; num20++)
|
||||
{
|
||||
if (num18 < 0 || (num18 == 0 && num19 < 0) || (num18 == 0 && num19 == 0 && num20 < 0))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
val7 = new Vector3Int(key4.x + num18, key4.y + num19, key4.z + num20);
|
||||
if (!dictionary2.TryGetValue(val7, out var value6))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (val7 == key4)
|
||||
{
|
||||
for (int num21 = 0; num21 < value5.Count; num21++)
|
||||
{
|
||||
int num22 = value5[num21];
|
||||
Vector3 val8 = vertices[num22];
|
||||
for (int num23 = num21 + 1; num23 < value5.Count; num23++)
|
||||
{
|
||||
int num24 = value5[num23];
|
||||
val4 = vertices[num24] - val8;
|
||||
if (val4.sqrMagnitude <= num16)
|
||||
{
|
||||
AddNeighbor(array, num22, num24);
|
||||
AddNeighbor(array, num24, num22);
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
for (int num25 = 0; num25 < value5.Count; num25++)
|
||||
{
|
||||
int num26 = value5[num25];
|
||||
Vector3 val9 = vertices[num26];
|
||||
for (int num27 = 0; num27 < value6.Count; num27++)
|
||||
{
|
||||
int num28 = value6[num27];
|
||||
val4 = vertices[num28] - val9;
|
||||
if (val4.sqrMagnitude <= num16)
|
||||
{
|
||||
AddNeighbor(array, num26, num28);
|
||||
AddNeighbor(array, num28, num26);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return array;
|
||||
void AddNeighbor(List<int>[] adj, int from, int to)
|
||||
{
|
||||
List<int> list3 = adj[from];
|
||||
if (!list3.Contains(to))
|
||||
{
|
||||
list3.Add(to);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyWorldVerticesToMesh()
|
||||
{
|
||||
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0151: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0303: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0308: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_023f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0248: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_024f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0254: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0259: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0268: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0271: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0278: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_027d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0282: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0326: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_032b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_030e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0314: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0319: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_031e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_037e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0380: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0385: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_039f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03d1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03d6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_038b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0391: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0396: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_039b: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (this.editableMesh == null || this.smr == null || this.worldVertices == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Mesh val = this.editableMesh;
|
||||
int vertexCount = val.vertexCount;
|
||||
Vector3[] vertices = val.vertices;
|
||||
SkinningUtil skinningUtil = new SkinningUtil();
|
||||
Vector3[] array = null;
|
||||
int blendShapeCount = val.blendShapeCount;
|
||||
if (blendShapeCount > 0)
|
||||
{
|
||||
array = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array2 = new Vector3[vertexCount];
|
||||
Vector3[] array3 = new Vector3[vertexCount];
|
||||
Vector3[] array4 = new Vector3[vertexCount];
|
||||
for (int i = 0; i < blendShapeCount; i++)
|
||||
{
|
||||
float blendShapeWeight = this.smr.GetBlendShapeWeight(i);
|
||||
if (Mathf.Approximately(blendShapeWeight, 0f))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int num = val.GetBlendShapeFrameCount(i) - 1;
|
||||
float blendShapeFrameWeight = val.GetBlendShapeFrameWeight(i, num);
|
||||
val.GetBlendShapeFrameVertices(i, num, array2, array3, array4);
|
||||
float num2 = ((blendShapeFrameWeight != 0f) ? (blendShapeWeight / blendShapeFrameWeight) : 0f);
|
||||
if (!Mathf.Approximately(num2, 0f))
|
||||
{
|
||||
for (int j = 0; j < vertexCount; j++)
|
||||
{
|
||||
ref Vector3 reference = ref array[j];
|
||||
reference += array2[j] * num2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int k = 0; k < vertexCount; k++)
|
||||
{
|
||||
Vector3 val2 = skinningUtil.WorldPosToBindPos_Full(this.smr, val, k, this.worldVertices[k]);
|
||||
if (array != null)
|
||||
{
|
||||
val2 -= array[k];
|
||||
}
|
||||
vertices[k] = val2;
|
||||
}
|
||||
val.vertices = vertices;
|
||||
Vector3[] array5 = null;
|
||||
Vector3[] array6 = null;
|
||||
if (blendShapeCount > 0)
|
||||
{
|
||||
array5 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
array6 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array7 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array8 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array9 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
for (int l = 0; l < blendShapeCount; l++)
|
||||
{
|
||||
float blendShapeWeight2 = this.smr.GetBlendShapeWeight(l);
|
||||
if (Mathf.Approximately(blendShapeWeight2, 0f))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int num3 = val.GetBlendShapeFrameCount(l) - 1;
|
||||
float blendShapeFrameWeight2 = val.GetBlendShapeFrameWeight(l, num3);
|
||||
val.GetBlendShapeFrameVertices(l, num3, array7, array8, array9);
|
||||
float num4 = ((blendShapeFrameWeight2 != 0f) ? (blendShapeWeight2 / blendShapeFrameWeight2) : 0f);
|
||||
if (!Mathf.Approximately(num4, 0f))
|
||||
{
|
||||
for (int m = 0; m < vertexCount; m++)
|
||||
{
|
||||
ref Vector3 reference2 = ref array5[m];
|
||||
reference2 += array8[m] * num4;
|
||||
ref Vector3 reference3 = ref array6[m];
|
||||
reference3 += array9[m] * num4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.bakedWorldNormals == null || this.bakedWorldNormals.Length != vertexCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Vector3[] array10 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
bool flag = this.bakedWorldTangents != null && this.bakedWorldTangents.Length == vertexCount;
|
||||
Vector4[] array11 = (Vector4[])(object)(flag ? new Vector4[vertexCount] : null);
|
||||
Vector3 targetWorldDir = default(Vector3);
|
||||
for (int n = 0; n < vertexCount; n++)
|
||||
{
|
||||
Vector3 val3 = skinningUtil.WorldDirToBindDir_Full(this.smr, val, n, this.bakedWorldNormals[n]);
|
||||
if (array5 != null)
|
||||
{
|
||||
val3 -= array5[n];
|
||||
}
|
||||
array10[n] = val3.normalized;
|
||||
if (flag)
|
||||
{
|
||||
targetWorldDir = new Vector3(this.bakedWorldTangents[n].x, this.bakedWorldTangents[n].y, this.bakedWorldTangents[n].z);
|
||||
Vector3 val4 = skinningUtil.WorldDirToBindDir_Full(this.smr, val, n, targetWorldDir);
|
||||
if (array6 != null)
|
||||
{
|
||||
val4 -= array6[n];
|
||||
}
|
||||
val4 = val4.normalized;
|
||||
array11[n] = new Vector4(val4.x, val4.y, val4.z, this.bakedWorldTangents[n].w);
|
||||
}
|
||||
}
|
||||
val.normals = array10;
|
||||
if (array11 != null)
|
||||
{
|
||||
val.tangents = array11;
|
||||
}
|
||||
}
|
||||
|
||||
public void BuildEquivalentVerticesFromWorld(float maxDistance = 1E-05f)
|
||||
{
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0161: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (this.worldVertices == null || this.worldVertices.Length == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothInstance] BuildEquivalentVerticesFromWorld: worldVertices is null or empty. Call UpdateWorldVertices() first.");
|
||||
return;
|
||||
}
|
||||
int num = this.worldVertices.Length;
|
||||
if (this.equivalentVertices == null)
|
||||
{
|
||||
this.equivalentVertices = new List<List<int>>();
|
||||
}
|
||||
else
|
||||
{
|
||||
this.equivalentVertices.Clear();
|
||||
}
|
||||
float num2 = maxDistance * maxDistance;
|
||||
Dictionary<Vector3Int, List<int>> dictionary = new Dictionary<Vector3Int, List<int>>();
|
||||
Vector3Int key = default(Vector3Int);
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
Vector3 val = this.worldVertices[i];
|
||||
key = new Vector3Int(Mathf.FloorToInt(val.x / maxDistance), Mathf.FloorToInt(val.y / maxDistance), Mathf.FloorToInt(val.z / maxDistance));
|
||||
if (!dictionary.TryGetValue(key, out var value))
|
||||
{
|
||||
value = (dictionary[key] = new List<int>());
|
||||
}
|
||||
value.Add(i);
|
||||
}
|
||||
foreach (KeyValuePair<Vector3Int, List<int>> item in dictionary)
|
||||
{
|
||||
List<int> value2 = item.Value;
|
||||
int count = value2.Count;
|
||||
if (count < 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int[] parent = new int[count];
|
||||
for (int j = 0; j < count; j++)
|
||||
{
|
||||
parent[j] = j;
|
||||
}
|
||||
for (int k = 0; k < count; k++)
|
||||
{
|
||||
int num3 = value2[k];
|
||||
Vector3 val2 = this.worldVertices[num3];
|
||||
for (int l = k + 1; l < count; l++)
|
||||
{
|
||||
int num4 = value2[l];
|
||||
Vector3 val3 = this.worldVertices[num4];
|
||||
Vector3 val4 = val2 - val3;
|
||||
if (val4.sqrMagnitude <= num2)
|
||||
{
|
||||
Union(k, l);
|
||||
}
|
||||
}
|
||||
}
|
||||
Dictionary<int, List<int>> dictionary2 = new Dictionary<int, List<int>>();
|
||||
for (int m = 0; m < count; m++)
|
||||
{
|
||||
int key2 = Find(m);
|
||||
if (!dictionary2.TryGetValue(key2, out var value3))
|
||||
{
|
||||
value3 = (dictionary2[key2] = new List<int>());
|
||||
}
|
||||
value3.Add(value2[m]);
|
||||
}
|
||||
foreach (List<int> value4 in dictionary2.Values)
|
||||
{
|
||||
if (value4.Count >= 2)
|
||||
{
|
||||
this.equivalentVertices.Add(value4);
|
||||
}
|
||||
}
|
||||
int Find(int x)
|
||||
{
|
||||
if (parent[x] != x)
|
||||
{
|
||||
parent[x] = Find(parent[x]);
|
||||
}
|
||||
return parent[x];
|
||||
}
|
||||
void Union(int a, int b)
|
||||
{
|
||||
int num5 = Find(a);
|
||||
int num6 = Find(b);
|
||||
if (num5 != num6)
|
||||
{
|
||||
parent[num6] = num5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
~ClothInstance()
|
||||
{
|
||||
this.Dispose();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (this.bakedMesh != null)
|
||||
{
|
||||
UnityEngine.Object.DestroyImmediate(this.bakedMesh);
|
||||
this.bakedMesh = null;
|
||||
}
|
||||
this.worldVertices = null;
|
||||
this.minDistanceVector = null;
|
||||
this.minDistance = null;
|
||||
this.deltas = null;
|
||||
this.deltasLocal = null;
|
||||
this.isInsideVertex = null;
|
||||
this.excludedVertices = null;
|
||||
this.isLeftLegVertex = null;
|
||||
this.isRightLegVertex = null;
|
||||
this.vertexAdjacency = null;
|
||||
if (this.equivalentVertices != null)
|
||||
{
|
||||
for (int i = 0; i < this.equivalentVertices.Count; i++)
|
||||
{
|
||||
this.equivalentVertices[i]?.Clear();
|
||||
}
|
||||
this.equivalentVertices.Clear();
|
||||
this.equivalentVertices = null;
|
||||
}
|
||||
this.humanoidMatchedBones = null;
|
||||
this.smr = null;
|
||||
this.editableMesh = null;
|
||||
}
|
||||
}
|
||||
@@ -1,341 +0,0 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.ClothInstanceTotal
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class ClothInstanceTotal
|
||||
{
|
||||
private readonly List<ClothInstance> clothInstances;
|
||||
|
||||
public int TotalVertexCount { get; private set; }
|
||||
|
||||
public Vector3[] GlobalPositions { get; private set; }
|
||||
|
||||
public Vector3[] GlobalDeltas { get; private set; }
|
||||
|
||||
public List<int>[] GlobalAdjacencyTopology { get; private set; }
|
||||
|
||||
public List<int>[] GlobalAdjacencyDistance { get; private set; }
|
||||
|
||||
public List<int>[] GlobalAdjacencyMerged { get; private set; }
|
||||
|
||||
public int[] VertexOffsets { get; private set; }
|
||||
|
||||
public ClothInstanceTotal(List<ClothInstance> clothInstances, float distanceBuildRadius, int maxNeighborsPerVertex = 0)
|
||||
{
|
||||
if (clothInstances == null || clothInstances.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instances are Missing", "[ClothInstanceTotal] ClothInstanceTotal\n - clothInstances is null or empty");
|
||||
}
|
||||
if (distanceBuildRadius <= 0f)
|
||||
{
|
||||
throw new AutoMorpherException("Distance Build Radius is Invalid", "[ClothInstanceTotal] ClothInstanceTotal\n - distanceBuildRadius must be > 0");
|
||||
}
|
||||
this.clothInstances = clothInstances;
|
||||
this.BuildTopologyCache();
|
||||
this.BuildDistanceAdjacencyCandidates(distanceBuildRadius, maxNeighborsPerVertex);
|
||||
this.BuildMergedAdjacency();
|
||||
}
|
||||
|
||||
public void SetGlobalDeltas(Vector3[] globalDeltas)
|
||||
{
|
||||
if (globalDeltas == null || globalDeltas.Length != this.TotalVertexCount)
|
||||
{
|
||||
throw new AutoMorpherException("Global Deltas are Invalid", "[ClothInstanceTotal] SetGlobalDeltas\n - globalDeltas is null or length mismatch");
|
||||
}
|
||||
this.GlobalDeltas = globalDeltas;
|
||||
}
|
||||
|
||||
public void UpdateGlobalBuffersFromClothInstances()
|
||||
{
|
||||
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
this.ValidateGlobalBufferReady("[ClothInstanceTotal] UpdateGlobalBuffersFromClothInstances");
|
||||
for (int i = 0; i < this.clothInstances.Count; i++)
|
||||
{
|
||||
ClothInstance clothInstance = this.clothInstances[i];
|
||||
if (clothInstance != null)
|
||||
{
|
||||
if (clothInstance.worldVertices == null || clothInstance.deltasLocal == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Data is Missing", "[ClothInstanceTotal] UpdateGlobalBuffersFromClothInstances\n - worldVertices or deltasLocal is null");
|
||||
}
|
||||
int num = this.VertexOffsets[i];
|
||||
int num2 = clothInstance.worldVertices.Length;
|
||||
if (num2 != clothInstance.deltasLocal.Length)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Array Length Mismatch", "[ClothInstanceTotal] UpdateGlobalBuffersFromClothInstances\n - worldVertices.Length != deltasLocal.Length");
|
||||
}
|
||||
for (int j = 0; j < num2; j++)
|
||||
{
|
||||
this.GlobalPositions[num + j] = clothInstance.worldVertices[j];
|
||||
this.GlobalDeltas[num + j] = clothInstance.deltasLocal[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyGlobalDeltasToClothInstances()
|
||||
{
|
||||
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
this.ValidateGlobalBufferReady("[ClothInstanceTotal] ApplyGlobalDeltasToClothInstances");
|
||||
for (int i = 0; i < this.clothInstances.Count; i++)
|
||||
{
|
||||
ClothInstance clothInstance = this.clothInstances[i];
|
||||
if (clothInstance != null)
|
||||
{
|
||||
if (clothInstance.deltasLocal == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Deltas are Missing", "[ClothInstanceTotal] ApplyGlobalDeltasToClothInstances\n - deltasLocal is null");
|
||||
}
|
||||
int num = this.VertexOffsets[i];
|
||||
int num2 = clothInstance.deltasLocal.Length;
|
||||
for (int j = 0; j < num2; j++)
|
||||
{
|
||||
clothInstance.deltasLocal[j] = this.GlobalDeltas[num + j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ValidateGlobalBufferReady(string functionContext)
|
||||
{
|
||||
if (this.clothInstances == null || this.clothInstances.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instances are Missing", functionContext + "\n - clothInstances is null or empty");
|
||||
}
|
||||
if (this.TotalVertexCount <= 0 || this.GlobalPositions == null || this.GlobalDeltas == null || this.VertexOffsets == null || this.GlobalAdjacencyMerged == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Total Cache is Not Ready", functionContext + "\n - total/global buffers/merged adjacency are not initialized");
|
||||
}
|
||||
}
|
||||
|
||||
private void BuildTopologyCache()
|
||||
{
|
||||
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0128: Unknown result type (might be due to invalid IL or missing references)
|
||||
this.TotalVertexCount = this.CalculateTotalVertexCount(this.clothInstances);
|
||||
if (this.TotalVertexCount <= 0)
|
||||
{
|
||||
throw new AutoMorpherException("Total Vertex Count is Zero", "[ClothInstanceTotal] BuildTopologyCache\n - TotalVertexCount <= 0");
|
||||
}
|
||||
this.GlobalPositions = (Vector3[])(object)new Vector3[this.TotalVertexCount];
|
||||
this.GlobalDeltas = (Vector3[])(object)new Vector3[this.TotalVertexCount];
|
||||
this.GlobalAdjacencyTopology = new List<int>[this.TotalVertexCount];
|
||||
this.VertexOffsets = new int[this.clothInstances.Count];
|
||||
int num = 0;
|
||||
for (int i = 0; i < this.clothInstances.Count; i++)
|
||||
{
|
||||
ClothInstance clothInstance = this.clothInstances[i];
|
||||
this.VertexOffsets[i] = num;
|
||||
if (clothInstance == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (clothInstance.worldVertices == null || clothInstance.deltasLocal == null || clothInstance.vertexAdjacency == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Data is Missing", "[ClothInstanceTotal] BuildTopologyCache\n - worldVertices/deltasLocal/vertexAdjacency is null");
|
||||
}
|
||||
int num2 = clothInstance.worldVertices.Length;
|
||||
if (num2 != clothInstance.deltasLocal.Length || num2 != clothInstance.vertexAdjacency.Length)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Array Length Mismatch", "[ClothInstanceTotal] BuildTopologyCache\n - worldVertices/deltasLocal/vertexAdjacency lengths differ");
|
||||
}
|
||||
for (int j = 0; j < num2; j++)
|
||||
{
|
||||
this.GlobalPositions[num + j] = clothInstance.worldVertices[j];
|
||||
this.GlobalDeltas[num + j] = clothInstance.deltasLocal[j];
|
||||
int capacity = clothInstance.vertexAdjacency[j]?.Count ?? 0;
|
||||
this.GlobalAdjacencyTopology[num + j] = new List<int>(capacity);
|
||||
}
|
||||
for (int k = 0; k < num2; k++)
|
||||
{
|
||||
List<int> list = clothInstance.vertexAdjacency[k];
|
||||
if (list == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int num3 = num + k;
|
||||
List<int> list2 = this.GlobalAdjacencyTopology[num3];
|
||||
for (int l = 0; l < list.Count; l++)
|
||||
{
|
||||
int num4 = list[l];
|
||||
if ((uint)num4 >= (uint)num2)
|
||||
{
|
||||
throw new AutoMorpherException("Vertex Adjacency Index is Out of Range", "[ClothInstanceTotal] BuildTopologyCache\n - vertexAdjacency contains invalid neighbor index");
|
||||
}
|
||||
list2.Add(num + num4);
|
||||
}
|
||||
}
|
||||
num += num2;
|
||||
}
|
||||
}
|
||||
|
||||
private void BuildDistanceAdjacencyCandidates(float radius, int maxNeighborsPerVertex)
|
||||
{
|
||||
if (this.GlobalPositions == null || this.GlobalPositions.Length == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Reference Positions are Missing", "[ClothInstanceTotal] BuildDistanceAdjacencyCandidates\n - GlobalPositions is null or empty");
|
||||
}
|
||||
this.GlobalAdjacencyDistance = this.BuildDistanceAdjacencyCandidatesInternal(this.GlobalPositions, radius, maxNeighborsPerVertex);
|
||||
}
|
||||
|
||||
private void BuildMergedAdjacency()
|
||||
{
|
||||
if (this.GlobalAdjacencyTopology == null || this.GlobalAdjacencyDistance == null)
|
||||
{
|
||||
throw new AutoMorpherException("Adjacency Inputs are Missing", "[ClothInstanceTotal] BuildMergedAdjacency\n - GlobalAdjacencyTopology or GlobalAdjacencyDistance is null");
|
||||
}
|
||||
if (this.GlobalAdjacencyTopology.Length != this.GlobalAdjacencyDistance.Length)
|
||||
{
|
||||
throw new AutoMorpherException("Adjacency Length Mismatch", "[ClothInstanceTotal] BuildMergedAdjacency\n - topology and distance adjacency length differ");
|
||||
}
|
||||
int num = this.GlobalAdjacencyTopology.Length;
|
||||
this.GlobalAdjacencyMerged = new List<int>[num];
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
List<int> list = new List<int>((this.GlobalAdjacencyTopology[i]?.Count ?? 0) + (this.GlobalAdjacencyDistance[i]?.Count ?? 0));
|
||||
HashSet<int> hashSet = new HashSet<int>();
|
||||
List<int> list2 = this.GlobalAdjacencyTopology[i];
|
||||
if (list2 != null)
|
||||
{
|
||||
for (int j = 0; j < list2.Count; j++)
|
||||
{
|
||||
int num2 = list2[j];
|
||||
if (num2 != i && hashSet.Add(num2))
|
||||
{
|
||||
list.Add(num2);
|
||||
}
|
||||
}
|
||||
}
|
||||
List<int> list3 = this.GlobalAdjacencyDistance[i];
|
||||
if (list3 != null)
|
||||
{
|
||||
for (int k = 0; k < list3.Count; k++)
|
||||
{
|
||||
int num3 = list3[k];
|
||||
if (num3 != i && hashSet.Add(num3))
|
||||
{
|
||||
list.Add(num3);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.GlobalAdjacencyMerged[i] = list;
|
||||
}
|
||||
}
|
||||
|
||||
private int CalculateTotalVertexCount(List<ClothInstance> clothInstances)
|
||||
{
|
||||
int num = 0;
|
||||
for (int i = 0; i < clothInstances.Count; i++)
|
||||
{
|
||||
ClothInstance clothInstance = clothInstances[i];
|
||||
if (clothInstance != null && clothInstance.worldVertices != null)
|
||||
{
|
||||
num += clothInstance.worldVertices.Length;
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
private List<int>[] BuildDistanceAdjacencyCandidatesInternal(Vector3[] referencePositions, float radius, int maxNeighborsPerVertex)
|
||||
{
|
||||
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0196: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (referencePositions == null || referencePositions.Length == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Reference Positions are Missing", "[ClothInstanceTotal] BuildDistanceAdjacencyCandidatesInternal\n - referencePositions is null or empty");
|
||||
}
|
||||
if (radius <= 0f)
|
||||
{
|
||||
throw new AutoMorpherException("Radius is Invalid", "[ClothInstanceTotal] BuildDistanceAdjacencyCandidatesInternal\n - radius must be > 0");
|
||||
}
|
||||
int num = referencePositions.Length;
|
||||
List<int>[] array = new List<int>[num];
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
array[i] = new List<int>(8);
|
||||
}
|
||||
float num2 = 1f / Mathf.Max(radius, 1E-12f);
|
||||
float num3 = radius * radius;
|
||||
Dictionary<Vector3Int, List<int>> dictionary = new Dictionary<Vector3Int, List<int>>(num);
|
||||
Vector3Int key = default(Vector3Int);
|
||||
for (int j = 0; j < num; j++)
|
||||
{
|
||||
Vector3 val = referencePositions[j];
|
||||
key = new Vector3Int(Mathf.FloorToInt(val.x * num2), Mathf.FloorToInt(val.y * num2), Mathf.FloorToInt(val.z * num2));
|
||||
if (!dictionary.TryGetValue(key, out var value))
|
||||
{
|
||||
value = new List<int>(16);
|
||||
dictionary.Add(key, value);
|
||||
}
|
||||
value.Add(j);
|
||||
}
|
||||
Vector3Int val3 = default(Vector3Int);
|
||||
Vector3Int key2 = default(Vector3Int);
|
||||
for (int k = 0; k < num; k++)
|
||||
{
|
||||
Vector3 val2 = referencePositions[k];
|
||||
val3 = new Vector3Int(Mathf.FloorToInt(val2.x * num2), Mathf.FloorToInt(val2.y * num2), Mathf.FloorToInt(val2.z * num2));
|
||||
List<int> list = array[k];
|
||||
for (int l = -1; l <= 1; l++)
|
||||
{
|
||||
for (int m = -1; m <= 1; m++)
|
||||
{
|
||||
for (int n = -1; n <= 1; n++)
|
||||
{
|
||||
key2 = new Vector3Int(val3.x + l, val3.y + m, val3.z + n);
|
||||
if (!dictionary.TryGetValue(key2, out var value2))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
for (int num4 = 0; num4 < value2.Count; num4++)
|
||||
{
|
||||
int num5 = value2[num4];
|
||||
if (num5 == k)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Vector3 val4 = referencePositions[num5] - val2;
|
||||
if (!(val4.sqrMagnitude > num3))
|
||||
{
|
||||
list.Add(num5);
|
||||
if (maxNeighborsPerVertex > 0 && list.Count >= maxNeighborsPerVertex)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (maxNeighborsPerVertex > 0 && list.Count >= maxNeighborsPerVertex)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.AutoMorpherDev
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
public static class AutoMorpherDev
|
||||
{
|
||||
public readonly struct ScopeTimer : IDisposable
|
||||
{
|
||||
private readonly bool _enabled;
|
||||
|
||||
private readonly string _label;
|
||||
|
||||
private readonly Stopwatch _sw;
|
||||
|
||||
public ScopeTimer(bool enabled, string label)
|
||||
{
|
||||
_enabled = enabled;
|
||||
_label = label;
|
||||
if (enabled)
|
||||
{
|
||||
_sw = Stopwatch.StartNew();
|
||||
}
|
||||
else
|
||||
{
|
||||
_sw = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (_enabled && _sw != null)
|
||||
{
|
||||
_sw.Stop();
|
||||
Debug.Log((object)$"[DevTimer] {_label}: {_sw.ElapsedMilliseconds} ms");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static bool isDeveloperMode;
|
||||
|
||||
public static void Log(string message)
|
||||
{
|
||||
if (isDeveloperMode)
|
||||
{
|
||||
Debug.Log((object)message);
|
||||
}
|
||||
}
|
||||
|
||||
public static ScopeTimer Profile(string label)
|
||||
{
|
||||
return new ScopeTimer(isDeveloperMode, label);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.AutoMorpherException
|
||||
@@ -6,11 +6,11 @@ using System;
|
||||
|
||||
public class AutoMorpherException : Exception
|
||||
{
|
||||
public string title;
|
||||
public string title;
|
||||
|
||||
public AutoMorpherException(string title, string message)
|
||||
: base(message)
|
||||
{
|
||||
this.title = title;
|
||||
}
|
||||
public AutoMorpherException(string title, string message)
|
||||
: base(message)
|
||||
{
|
||||
this.title = title;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BakedBodyMesh
|
||||
using UnityEngine;
|
||||
|
||||
public class BakedBodyMesh
|
||||
{
|
||||
public SkinnedMeshRenderer smr;
|
||||
|
||||
public Mesh bakedMesh;
|
||||
|
||||
public BakedBodyMesh(SkinnedMeshRenderer _smr)
|
||||
{
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0018: Expected O, but got Unknown
|
||||
smr = _smr;
|
||||
bakedMesh = new Mesh();
|
||||
smr.BakeMesh(bakedMesh);
|
||||
}
|
||||
|
||||
public void ReBakeMesh()
|
||||
{
|
||||
smr.BakeMesh(bakedMesh);
|
||||
}
|
||||
|
||||
~BakedBodyMesh()
|
||||
{
|
||||
smr = null;
|
||||
bakedMesh = null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,238 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatchSetupUtil
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Eden.AutoMorpher;
|
||||
using Eden.AutoMorpher.profile;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatchSetupUtil
|
||||
{
|
||||
public void AdjustAvatarScaleByNeck(Transform avatarRoot, Dictionary<HumanBodyBones, HashSet<Transform>> humanBoneMap, float targetHeight)
|
||||
{
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)avatarRoot == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] NormalizeAvatarScaleByNeck: avatar == null");
|
||||
return;
|
||||
}
|
||||
Transform boneFromBoneMap = new BodyPoseMatch_CommonUtil().GetBoneFromBoneMap(humanBoneMap, (HumanBodyBones)9);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)("[AvatarBodyMatchUtil] " + ((Object)avatarRoot).name + " 에서 Neck 본을 찾지 못했습니다. 스케일 정규화를 건너뜁니다."));
|
||||
return;
|
||||
}
|
||||
Transform transform = ((Component)avatarRoot).transform;
|
||||
float num = boneFromBoneMap.position.y - transform.position.y;
|
||||
if (Mathf.Approximately(num, 0f))
|
||||
{
|
||||
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] {((Object)avatarRoot).name} Neck Y가 0에 가까워 스케일 계산을 건너뜁니다. (neckY = {num})");
|
||||
return;
|
||||
}
|
||||
float num2 = targetHeight / num;
|
||||
Vector3 localScale = transform.localScale;
|
||||
localScale *= num2;
|
||||
transform.localScale = localScale;
|
||||
}
|
||||
|
||||
public GameObject CreateBodyProxy(Animator sourceAvatar, IReadOnlyList<SkinnedMeshRenderer> sourceBodyMeshes, out List<SkinnedMeshRenderer> proxyBodyMeshes, out Dictionary<Transform, Transform> sourceToProxy)
|
||||
{
|
||||
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
proxyBodyMeshes = null;
|
||||
if ((Object)(object)sourceAvatar == (Object)null)
|
||||
{
|
||||
Debug.LogError((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: sourceAvatar == null");
|
||||
sourceToProxy = new Dictionary<Transform, Transform>();
|
||||
return 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)(object)component != (Object)null)
|
||||
{
|
||||
((Behaviour)component).enabled = false;
|
||||
remainTransforms.Add(((Component)component).transform);
|
||||
}
|
||||
if ((Object)(object)component != (Object)null && (Object)(object)component.avatar != (Object)null && component.avatar.isHuman)
|
||||
{
|
||||
for (int i = 0; i < 55; i++)
|
||||
{
|
||||
HumanBodyBones val = (HumanBodyBones)i;
|
||||
Transform boneTransform = component.GetBoneTransform(val);
|
||||
if ((Object)(object)boneTransform != (Object)null)
|
||||
{
|
||||
remainTransforms.Add(boneTransform);
|
||||
}
|
||||
}
|
||||
}
|
||||
HashSet<Mesh> hashSet = new HashSet<Mesh>();
|
||||
if (sourceBodyMeshes != null)
|
||||
{
|
||||
foreach (SkinnedMeshRenderer sourceBodyMesh in sourceBodyMeshes)
|
||||
{
|
||||
if (!((Object)(object)sourceBodyMesh == (Object)null) && !((Object)(object)sourceBodyMesh.sharedMesh == (Object)null))
|
||||
{
|
||||
hashSet.Add(sourceBodyMesh.sharedMesh);
|
||||
}
|
||||
}
|
||||
}
|
||||
SkinnedMeshRenderer[] componentsInChildren = clone.GetComponentsInChildren<SkinnedMeshRenderer>(true);
|
||||
List<SkinnedMeshRenderer> list = new List<SkinnedMeshRenderer>();
|
||||
SkinnedMeshRenderer[] array = componentsInChildren;
|
||||
foreach (SkinnedMeshRenderer val2 in array)
|
||||
{
|
||||
if (!((Object)(object)val2 == (Object)null))
|
||||
{
|
||||
Mesh sharedMesh = val2.sharedMesh;
|
||||
if (!((Object)(object)sharedMesh == (Object)null) && hashSet.Contains(sharedMesh))
|
||||
{
|
||||
list.Add(val2);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (list.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone에서 동일 sharedMesh를 가진 BodyMesh를 찾지 못했습니다.");
|
||||
}
|
||||
if (list.Count > 0)
|
||||
{
|
||||
MeshClassifier meshClassifier = new MeshClassifier();
|
||||
foreach (SkinnedMeshRenderer item in list)
|
||||
{
|
||||
if ((Object)(object)item == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
remainTransforms.Add(((Component)item).transform);
|
||||
HashSet<Transform> activeBones = meshClassifier.GetActiveBones(item);
|
||||
if (activeBones == null)
|
||||
{
|
||||
string[] obj = new string[5]
|
||||
{
|
||||
"[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone smr '",
|
||||
((Object)item).name,
|
||||
"' has null bones array (mesh='",
|
||||
null,
|
||||
null
|
||||
};
|
||||
Mesh sharedMesh2 = item.sharedMesh;
|
||||
obj[3] = ((sharedMesh2 != null) ? ((Object)sharedMesh2).name : null);
|
||||
obj[4] = "')";
|
||||
Debug.LogWarning((object)string.Concat(obj));
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item2 in activeBones)
|
||||
{
|
||||
if (!((Object)(object)item2 == (Object)null))
|
||||
{
|
||||
remainTransforms.Add(item2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (Transform item3 in remainTransforms.ToList())
|
||||
{
|
||||
AddWithParents(item3);
|
||||
}
|
||||
Transform[] componentsInChildren2 = clone.GetComponentsInChildren<Transform>(true);
|
||||
for (int num = componentsInChildren2.Length - 1; num >= 0; num--)
|
||||
{
|
||||
Transform val3 = componentsInChildren2[num];
|
||||
if (!((Object)(object)val3 == (Object)null) && !((Object)(object)val3 == (Object)(object)clone.transform) && !remainTransforms.Contains(val3))
|
||||
{
|
||||
Object.DestroyImmediate((Object)(object)((Component)val3).gameObject);
|
||||
}
|
||||
}
|
||||
proxyBodyMeshes = list;
|
||||
new BoneMatchUtil().BuildSourceToProxyBoneMap(sourceAvatar, component, out sourceToProxy);
|
||||
return clone;
|
||||
void AddWithParents(Transform t)
|
||||
{
|
||||
while ((Object)(object)t != (Object)null && (Object)(object)t != (Object)(object)clone.transform)
|
||||
{
|
||||
remainTransforms.Add(t);
|
||||
t = t.parent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Vector3 GetComprehensiveScale(Transform rootT, Dictionary<HumanBodyBones, HashSet<Transform>> clothHumanoidBoneMap, ProfileData profileData)
|
||||
{
|
||||
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0139: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0146: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(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 val = null;
|
||||
if (clothHumanoidBoneMap.TryGetValue((HumanBodyBones)0, out var value) && value != null && value.Count > 0)
|
||||
{
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if ((Object)(object)item != (Object)null)
|
||||
{
|
||||
val = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Hip Transform is Missing", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - failed to get [hip] transform from clothHumanoidBoneMap");
|
||||
}
|
||||
BoneData val2 = null;
|
||||
for (int i = 0; i < profileData.bones.Count; i++)
|
||||
{
|
||||
BoneData val3 = profileData.bones[i];
|
||||
if (val3 != null && (int)val3.hBone == 0)
|
||||
{
|
||||
val2 = val3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (val2 == null)
|
||||
{
|
||||
throw new AutoMorpherException("Hip Bone Data is Missing in Profile", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - profileData bones does not contain Hips");
|
||||
}
|
||||
Vector3 rootLocalScale = val2.rootLocalScale;
|
||||
Vector3 lossyScale = rootT.lossyScale;
|
||||
Vector3 lossyScale2 = val.lossyScale;
|
||||
Vector3 val4 = default(Vector3);
|
||||
((Vector3)(ref val4))._002Ector(lossyScale2.x / lossyScale.x, lossyScale2.y / lossyScale.y, lossyScale2.z / lossyScale.z);
|
||||
return new Vector3(val4.x / rootLocalScale.x, val4.y / rootLocalScale.y, val4.z / rootLocalScale.z);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatchUtil
|
||||
using System.Collections.Generic;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatchUtil
|
||||
{
|
||||
private WorldVertexUtil _worldVertexUtil;
|
||||
|
||||
private MeshClassifier meshClassifier;
|
||||
|
||||
private BodyPoseMatch_CommonUtil poseMatchCommonUtil;
|
||||
|
||||
private bool doDebug;
|
||||
|
||||
public BodyPoseMatchUtil()
|
||||
{
|
||||
_worldVertexUtil = new WorldVertexUtil();
|
||||
meshClassifier = new MeshClassifier();
|
||||
poseMatchCommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
}
|
||||
|
||||
public GameObject AutoAdjustBodyPose(GameObject sourceAvatar, IReadOnlyList<SkinnedMeshRenderer> sourceBodyMeshes, GameObject targetAvatar, IReadOnlyList<SkinnedMeshRenderer> targetBodyMeshes, out Dictionary<Transform, Transform> sourceToProxy, float neckTargetHeight = 1.5f, bool onlyScaling = false)
|
||||
{
|
||||
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_025b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0260: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_027b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0280: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03a3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03a8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03c5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03e5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03ea: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0405: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_040a: Unknown result type (might be due to invalid IL or missing references)
|
||||
Animator component = sourceAvatar.GetComponent<Animator>();
|
||||
Animator component2 = targetAvatar.GetComponent<Animator>();
|
||||
if ((Object)(object)component == (Object)null || (Object)(object)component2 == (Object)null)
|
||||
{
|
||||
Debug.LogError((object)"[AvatarBodyMatchUtil] sourceAvatar 또는 targetAvatar가 null입니다.");
|
||||
sourceToProxy = new Dictionary<Transform, Transform>();
|
||||
return null;
|
||||
}
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> humanBoneMap = meshClassifier.MeshHumanoidBoneMatcher(component, sourceBodyMeshes);
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> dictionary = meshClassifier.MeshHumanoidBoneMatcher(component2, targetBodyMeshes);
|
||||
BodyPoseMatchSetupUtil bodyPoseMatchSetupUtil = new BodyPoseMatchSetupUtil();
|
||||
bodyPoseMatchSetupUtil.AdjustAvatarScaleByNeck(sourceAvatar.transform, humanBoneMap, neckTargetHeight);
|
||||
bodyPoseMatchSetupUtil.AdjustAvatarScaleByNeck(targetAvatar.transform, dictionary, neckTargetHeight);
|
||||
List<SkinnedMeshRenderer> proxyBodyMeshes;
|
||||
GameObject val = bodyPoseMatchSetupUtil.CreateBodyProxy(component, sourceBodyMeshes, out proxyBodyMeshes, out sourceToProxy);
|
||||
Animator component3 = val.GetComponent<Animator>();
|
||||
if (onlyScaling)
|
||||
{
|
||||
val.transform.SetParent(targetAvatar.transform);
|
||||
val.transform.localPosition = Vector3.zero;
|
||||
return val;
|
||||
}
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> dictionary2 = meshClassifier.MeshHumanoidBoneMatcher(component3, proxyBodyMeshes);
|
||||
if (dictionary2 == null || dictionary2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Bone Map is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxyBoneMap is null");
|
||||
}
|
||||
val.transform.SetParent(targetAvatar.transform);
|
||||
val.transform.localPosition = Vector3.zero;
|
||||
List<BakedBodyMesh> list = new List<BakedBodyMesh>();
|
||||
foreach (SkinnedMeshRenderer item in proxyBodyMeshes)
|
||||
{
|
||||
list.Add(new BakedBodyMesh(item));
|
||||
}
|
||||
List<BakedBodyMesh> list2 = new List<BakedBodyMesh>();
|
||||
foreach (SkinnedMeshRenderer targetBodyMesh in targetBodyMeshes)
|
||||
{
|
||||
list2.Add(new BakedBodyMesh(targetBodyMesh));
|
||||
}
|
||||
BodyPoseMatch_Torso bodyPoseMatch_Torso = new BodyPoseMatch_Torso();
|
||||
bodyPoseMatch_Torso.AlignTorsoByNeck(val, list, dictionary2, targetAvatar, list2, dictionary);
|
||||
if (doDebug)
|
||||
{
|
||||
bodyPoseMatch_Torso.DrawTorsoPcaDebug(val, list, dictionary2, Color.yellow, Color.cyan, 1f, 20f);
|
||||
bodyPoseMatch_Torso.DrawTorsoPcaDebug(targetAvatar, list2, dictionary, Color.red, Color.green, 1f, 20f);
|
||||
}
|
||||
foreach (BakedBodyMesh item2 in list)
|
||||
{
|
||||
item2.ReBakeMesh();
|
||||
}
|
||||
BodyPoseMatch_Arm bodyPoseMatch_Arm = new BodyPoseMatch_Arm();
|
||||
bodyPoseMatch_Arm.AlignUpperArmByArmPcaCenters(list, dictionary2, list2, dictionary);
|
||||
if (doDebug)
|
||||
{
|
||||
bodyPoseMatch_Arm.DrawArmPcaDebug(val, list, dictionary2, isLeft: true, Color.yellow, Color.cyan, 1f, 20f);
|
||||
bodyPoseMatch_Arm.DrawArmPcaDebug(targetAvatar, list2, dictionary, isLeft: true, Color.red, Color.green, 1f, 20f);
|
||||
}
|
||||
foreach (BakedBodyMesh item3 in list)
|
||||
{
|
||||
item3.ReBakeMesh();
|
||||
}
|
||||
bodyPoseMatch_Arm.ScalingBothArmsLength(list, dictionary2, list2, dictionary);
|
||||
foreach (BakedBodyMesh item4 in list)
|
||||
{
|
||||
item4.ReBakeMesh();
|
||||
}
|
||||
BodyPoseMatch_Leg bodyPoseMatch_Leg = new BodyPoseMatch_Leg();
|
||||
bodyPoseMatch_Leg.AlignBothUpperLegs(val, list, dictionary2, targetAvatar, list2, dictionary);
|
||||
foreach (BakedBodyMesh item5 in list)
|
||||
{
|
||||
item5.ReBakeMesh();
|
||||
}
|
||||
bodyPoseMatch_Leg.ScalingBothLegsAndFoots(val, list, dictionary2, targetAvatar, list2, dictionary);
|
||||
if (doDebug)
|
||||
{
|
||||
foreach (BakedBodyMesh item6 in list)
|
||||
{
|
||||
item6.ReBakeMesh();
|
||||
}
|
||||
bodyPoseMatch_Leg.DrawLegPcaDebug(val, list, dictionary2, isLeft: true, Color.yellow, Color.cyan, 1f, 5f);
|
||||
bodyPoseMatch_Leg.DrawLegPcaDebug(val, list, dictionary2, isLeft: false, Color.yellow, Color.cyan, 1f, 5f);
|
||||
bodyPoseMatch_Leg.DrawLegPcaDebug(targetAvatar, list2, dictionary, isLeft: true, Color.magenta, Color.green, 1f, 5f);
|
||||
bodyPoseMatch_Leg.DrawLegPcaDebug(targetAvatar, list2, dictionary, isLeft: false, Color.magenta, Color.green, 1f, 5f);
|
||||
bodyPoseMatch_Arm.DrawForearmExtremeDebugPair(val.gameObject, proxyBodyMeshes, targetAvatar, targetBodyMeshes, isLeft: true, 1f, 5f);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,758 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatch_Arm
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Eden.AutoMorpher;
|
||||
using Eden.AutoMorpher.profile;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatch_Arm
|
||||
{
|
||||
private readonly BodyPoseMatch_CommonUtil poseMatchCommonUtil;
|
||||
|
||||
public BodyPoseMatch_Arm()
|
||||
{
|
||||
poseMatchCommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
}
|
||||
|
||||
public void AlignUpperArmByArmCenters(IReadOnlyCollection<Transform> sourceLeftUpperArmSet, IReadOnlyCollection<Transform> sourceRightUpperArmSet, Vector3 sourceShoulderCenterWorld, Vector3 targetShoulderCenterWorld, Transform axisReferenceTransform, bool lockRightAxis = true)
|
||||
{
|
||||
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (sourceLeftUpperArmSet == null || sourceLeftUpperArmSet.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Left UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmCenters\n - sourceLeftUpperArmSet is null or empty");
|
||||
}
|
||||
if (sourceRightUpperArmSet == null || sourceRightUpperArmSet.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Right UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmCenters\n - sourceRightUpperArmSet is null or empty");
|
||||
}
|
||||
if ((Object)(object)axisReferenceTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Axis Reference Transform is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmCenters\n - axisReferenceTransform is null");
|
||||
}
|
||||
Vector3 val = targetShoulderCenterWorld - sourceShoulderCenterWorld;
|
||||
if (lockRightAxis)
|
||||
{
|
||||
Vector3 right = axisReferenceTransform.right;
|
||||
float num = Vector3.Dot(val, right);
|
||||
val -= right * num;
|
||||
}
|
||||
foreach (Transform item in sourceLeftUpperArmSet)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
item.position += val;
|
||||
}
|
||||
}
|
||||
foreach (Transform item2 in sourceRightUpperArmSet)
|
||||
{
|
||||
if (!((Object)(object)item2 == (Object)null))
|
||||
{
|
||||
item2.position += val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AlignUpperArmByArmPcaCenters(IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap)
|
||||
{
|
||||
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (proxyBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Bone Map is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxyBoneMap is null");
|
||||
}
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, (HumanBodyBones)0);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Hips is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxy hips transform is null");
|
||||
}
|
||||
RegionStats regionStats = ComputeArmRegionStats(proxyBakedBodyMeshes, proxyBoneMap, isLeft: true);
|
||||
RegionStats regionStats2 = ComputeArmRegionStats(proxyBakedBodyMeshes, proxyBoneMap, isLeft: false);
|
||||
bool flag = regionStats.length > 0.0001f;
|
||||
bool flag2 = regionStats2.length > 0.0001f;
|
||||
if (!flag && !flag2)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters: proxy arm PCA failed. Skip.");
|
||||
return;
|
||||
}
|
||||
Vector3 sourceShoulderCenterWorld = CalculateShoulderCenter(flag, flag2, regionStats.center, regionStats2.center);
|
||||
RegionStats regionStats3 = ComputeArmRegionStats(targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
RegionStats regionStats4 = ComputeArmRegionStats(targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
bool flag3 = regionStats3.length > 0.0001f;
|
||||
bool flag4 = regionStats4.length > 0.0001f;
|
||||
if (!flag3 && !flag4)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters: target arm PCA failed. Skip.");
|
||||
return;
|
||||
}
|
||||
Vector3 targetShoulderCenterWorld = CalculateShoulderCenter(flag3, flag4, regionStats3.center, regionStats4.center);
|
||||
if (!proxyBoneMap.TryGetValue((HumanBodyBones)13, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Left UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxyBoneMap has no LeftUpperArm set");
|
||||
}
|
||||
if (!proxyBoneMap.TryGetValue((HumanBodyBones)14, out var value2) || value2 == null || value2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Right UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - proxyBoneMap has no RightUpperArm set");
|
||||
}
|
||||
AlignUpperArmByArmCenters(value, value2, sourceShoulderCenterWorld, targetShoulderCenterWorld, boneFromBoneMap);
|
||||
}
|
||||
|
||||
public void AlignUpperArmByArmPcaCenters(IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, Transform clothesTransform, ProfileData profileData, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - clothBoneMap is null");
|
||||
}
|
||||
if (profileData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Data is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - profileData is null");
|
||||
}
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, (HumanBodyBones)0);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Hips is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - cloth hips transform is null");
|
||||
}
|
||||
bool flag = profileData.LeftUpperArmSpatialData != null && profileData.LeftUpperArmSpatialData.pcaData != null && profileData.LeftUpperArmSpatialData.pcaData.pcaLength > 0.0001f;
|
||||
bool flag2 = profileData.RightUpperArmSpatialData != null && profileData.RightUpperArmSpatialData.pcaData != null && profileData.RightUpperArmSpatialData.pcaData.pcaLength > 0.0001f;
|
||||
if (!flag && !flag2)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters: profile arm data invalid. Skip.");
|
||||
return;
|
||||
}
|
||||
Vector3 leftCenter = Vector3.zero;
|
||||
if (flag)
|
||||
{
|
||||
leftCenter = poseMatchCommonUtil.GetProfilePcaCenterWorld(clothBoneMap, profileData.LeftUpperArmSpatialData, comprehensiveScale);
|
||||
}
|
||||
Vector3 rightCenter = Vector3.zero;
|
||||
if (flag2)
|
||||
{
|
||||
rightCenter = poseMatchCommonUtil.GetProfilePcaCenterWorld(clothBoneMap, profileData.RightUpperArmSpatialData, comprehensiveScale);
|
||||
}
|
||||
Vector3 sourceShoulderCenterWorld = CalculateShoulderCenter(flag, flag2, leftCenter, rightCenter);
|
||||
RegionStats regionStats = ComputeArmRegionStats(targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
RegionStats regionStats2 = ComputeArmRegionStats(targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
bool flag3 = regionStats.length > 0.0001f;
|
||||
bool flag4 = regionStats2.length > 0.0001f;
|
||||
if (!flag3 && !flag4)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters: target arm PCA failed. Skip.");
|
||||
return;
|
||||
}
|
||||
Vector3 targetShoulderCenterWorld = CalculateShoulderCenter(flag3, flag4, regionStats.center, regionStats2.center);
|
||||
if (!clothBoneMap.TryGetValue((HumanBodyBones)13, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Left UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - clothBoneMap has no LeftUpperArm set");
|
||||
}
|
||||
if (!clothBoneMap.TryGetValue((HumanBodyBones)14, out var value2) || value2 == null || value2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Right UpperArm Set is Missing", "[BodyPoseMatch_Arm] AlignUpperArmByArmPcaCenters\n - clothBoneMap has no RightUpperArm set");
|
||||
}
|
||||
AlignUpperArmByArmCenters(value, value2, sourceShoulderCenterWorld, targetShoulderCenterWorld, boneFromBoneMap);
|
||||
}
|
||||
|
||||
private Vector3 CalculateShoulderCenter(bool leftValid, bool rightValid, Vector3 leftCenter, Vector3 rightCenter)
|
||||
{
|
||||
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (leftValid && rightValid)
|
||||
{
|
||||
return 0.5f * (leftCenter + rightCenter);
|
||||
}
|
||||
if (leftValid)
|
||||
{
|
||||
return leftCenter;
|
||||
}
|
||||
return rightCenter;
|
||||
}
|
||||
|
||||
public RegionStats ComputeArmRegionStats(IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0151: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0153: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones[] array;
|
||||
if (!isLeft)
|
||||
{
|
||||
array = new HumanBodyBones[3];
|
||||
RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
|
||||
}
|
||||
else
|
||||
{
|
||||
array = new HumanBodyBones[3];
|
||||
RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
|
||||
}
|
||||
HumanBodyBones[] targetHumanBones = (HumanBodyBones[])(object)array;
|
||||
List<Vector3> list = poseMatchCommonUtil.CollectHumanoidVerticesWorld(targetHumanBones, avatarBakedBodyMeshes, avatarBoneMap);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)$"[BodyPoseMatch_Arm] ComputeArmRegionStats: arm vertices 0. isLeft={isLeft}");
|
||||
return default(RegionStats);
|
||||
}
|
||||
RegionStats result = new PcaUtil().ComputeRegionStats(list);
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 13 : 14));
|
||||
Transform boneFromBoneMap2 = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 15 : 16));
|
||||
Transform boneFromBoneMap3 = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 17 : 18));
|
||||
Vector3 principalAxis = Vector3.zero;
|
||||
if ((Object)(object)boneFromBoneMap != (Object)null && (Object)(object)boneFromBoneMap3 != (Object)null)
|
||||
{
|
||||
principalAxis = boneFromBoneMap3.position - boneFromBoneMap.position;
|
||||
}
|
||||
else if ((Object)(object)boneFromBoneMap != (Object)null && (Object)(object)boneFromBoneMap2 != (Object)null)
|
||||
{
|
||||
principalAxis = boneFromBoneMap2.position - boneFromBoneMap.position;
|
||||
}
|
||||
else if ((Object)(object)boneFromBoneMap2 != (Object)null && (Object)(object)boneFromBoneMap3 != (Object)null)
|
||||
{
|
||||
principalAxis = boneFromBoneMap3.position - boneFromBoneMap2.position;
|
||||
}
|
||||
if (((Vector3)(ref principalAxis)).sqrMagnitude > 1E-08f)
|
||||
{
|
||||
((Vector3)(ref principalAxis)).Normalize();
|
||||
result.principalAxis = principalAxis;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private void ScalingUpperArmLength(Dictionary<HumanBodyBones, HashSet<Transform>> sourceBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft, bool autoDetectAxis, int forceAxisIndex)
|
||||
{
|
||||
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 13 : 14);
|
||||
HumanBodyBones bone = (HumanBodyBones)(isLeft ? 15 : 16);
|
||||
HumanBodyBones bone2 = (HumanBodyBones)(isLeft ? 17 : 18);
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, val);
|
||||
Transform boneFromBoneMap2 = poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, bone);
|
||||
Transform boneFromBoneMap3 = poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, bone2);
|
||||
Transform boneFromBoneMap4 = poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
Transform boneFromBoneMap5 = poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, bone);
|
||||
Transform boneFromBoneMap6 = poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, bone2);
|
||||
HashSet<Transform> value;
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null || (Object)(object)boneFromBoneMap2 == (Object)null || (Object)(object)boneFromBoneMap3 == (Object)null || (Object)(object)boneFromBoneMap4 == (Object)null || (Object)(object)boneFromBoneMap5 == (Object)null || (Object)(object)boneFromBoneMap6 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingSingArmLenght: some arm bones are null. Skip.");
|
||||
}
|
||||
else if (sourceBoneMap == null || !sourceBoneMap.TryGetValue(val, out value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingSingArmLenght: sourceUpperSet missing. Skip.");
|
||||
}
|
||||
else
|
||||
{
|
||||
poseMatchCommonUtil.BoneLengthAdjust(boneFromBoneMap, boneFromBoneMap2, boneFromBoneMap4, boneFromBoneMap5, value, autoDetectAxis, forceAxisIndex);
|
||||
}
|
||||
}
|
||||
|
||||
private void ScalingLowerArmLength(Dictionary<HumanBodyBones, HashSet<Transform>> sourceBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft, bool autoDetectAxis, int forceAxisIndex, float sourceLowerarmExtremeX, float targetLowerarmExtremeX)
|
||||
{
|
||||
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014b: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 15 : 16);
|
||||
HumanBodyBones bone = (HumanBodyBones)(isLeft ? 17 : 18);
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, val);
|
||||
Transform boneFromBoneMap2 = poseMatchCommonUtil.GetBoneFromBoneMap(sourceBoneMap, bone);
|
||||
Transform boneFromBoneMap3 = poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null || (Object)(object)boneFromBoneMap2 == (Object)null || (Object)(object)boneFromBoneMap3 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingSingArmLenght: some arm bones are null. Skip.");
|
||||
return;
|
||||
}
|
||||
float x = boneFromBoneMap.position.x;
|
||||
float x2 = boneFromBoneMap3.position.x;
|
||||
float num = Mathf.Abs(sourceLowerarmExtremeX - x);
|
||||
float num2 = Mathf.Abs(targetLowerarmExtremeX - x2);
|
||||
if (num < 0.0001f || num2 < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)$"[BodyPoseMatch_Arm] ScalingSingArmLenght: span too small. source={num}, target={num2}");
|
||||
return;
|
||||
}
|
||||
float num3 = num2 / num;
|
||||
int num4 = ResolveArmLengthAxisIndex(boneFromBoneMap, boneFromBoneMap2, autoDetectAxis, forceAxisIndex);
|
||||
Vector3 localScale = boneFromBoneMap.localScale;
|
||||
switch (num4)
|
||||
{
|
||||
case 0:
|
||||
localScale.x *= num3;
|
||||
break;
|
||||
case 1:
|
||||
localScale.y *= num3;
|
||||
break;
|
||||
case 2:
|
||||
localScale.z *= num3;
|
||||
break;
|
||||
}
|
||||
foreach (Transform item in sourceBoneMap[val])
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
item.localScale = localScale;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ScalingBothArmsLength(IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
if (proxyBoneMap == null || targetBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_Arm] ScalingSingArmLenght\n - BoneMap is null");
|
||||
}
|
||||
ScalingUpperArmLength(proxyBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex);
|
||||
ScalingUpperArmLength(proxyBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex);
|
||||
if (proxyBakedBodyMeshes != null)
|
||||
{
|
||||
foreach (BakedBodyMesh proxyBakedBodyMesh in proxyBakedBodyMeshes)
|
||||
{
|
||||
proxyBakedBodyMesh.ReBakeMesh();
|
||||
}
|
||||
}
|
||||
ScalingLowerArmLength_BodyMatch(proxyBakedBodyMeshes, proxyBoneMap, targetBakedBodyMeshes, targetBoneMap, autoDetectAxis, forceAxisIndex);
|
||||
}
|
||||
|
||||
private void ScalingLowerArmLength_BodyMatch(IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool autoDetectAxis, int forceAxisIndex)
|
||||
{
|
||||
if (TryGetForearmExtremeX(proxyBakedBodyMeshes, proxyBoneMap, (HumanBodyBones)17, isLeft: true, out var extremeX) && TryGetForearmExtremeX(targetBakedBodyMeshes, targetBoneMap, (HumanBodyBones)17, isLeft: true, out var extremeX2))
|
||||
{
|
||||
ScalingLowerArmLength(proxyBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex, extremeX, extremeX2);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_BodyMatch: left extreme calc failed. Skip left lower.");
|
||||
}
|
||||
if (TryGetForearmExtremeX(proxyBakedBodyMeshes, proxyBoneMap, (HumanBodyBones)18, isLeft: false, out var extremeX3) && TryGetForearmExtremeX(targetBakedBodyMeshes, targetBoneMap, (HumanBodyBones)18, isLeft: false, out var extremeX4))
|
||||
{
|
||||
ScalingLowerArmLength(proxyBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex, extremeX3, extremeX4);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_BodyMatch: right extreme calc failed. Skip right lower.");
|
||||
}
|
||||
}
|
||||
|
||||
public void ScalingBothArmsLength(IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothBoneMap == null || targetBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_Arm] ScalingSingArmLenght\n - BoneMap is null");
|
||||
}
|
||||
if (profileData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Data is Missing", "[BodyPoseMatch_Arm] ScalingSingArmLenght\n - profileData is null");
|
||||
}
|
||||
ScalingUpperArmLength(clothBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex);
|
||||
ScalingUpperArmLength(clothBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex);
|
||||
ScalingLowerArmLength_ProfileMatch(targetBakedBodyMeshes, targetBoneMap, clothBoneMap, profileData, comprehensiveScale, autoDetectAxis, forceAxisIndex);
|
||||
}
|
||||
|
||||
private void ScalingLowerArmLength_ProfileMatch(IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale, bool autoDetectAxis, int forceAxisIndex)
|
||||
{
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
float extremeX;
|
||||
if (profileData.LeftLowerArm_HandSpatialData == null || profileData.LeftLowerArm_HandSpatialData.volumeData == null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_ProfileMatch: left spatial data missing. Skip left lower.");
|
||||
}
|
||||
else if (TryGetForearmExtremeX(targetBakedBodyMeshes, targetBoneMap, (HumanBodyBones)17, isLeft: true, out extremeX))
|
||||
{
|
||||
float profileForearmExtremeX = GetProfileForearmExtremeX(clothBoneMap, profileData.LeftLowerArm_HandSpatialData, comprehensiveScale, isLeft: true);
|
||||
ScalingLowerArmLength(clothBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex, profileForearmExtremeX, extremeX);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_ProfileMatch: left target extreme calc failed. Skip left lower.");
|
||||
}
|
||||
float extremeX2;
|
||||
if (profileData.RightLowerArm_HandSpatialData == null || profileData.RightLowerArm_HandSpatialData.volumeData == null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_ProfileMatch: right spatial data missing. Skip right lower.");
|
||||
}
|
||||
else if (TryGetForearmExtremeX(targetBakedBodyMeshes, targetBoneMap, (HumanBodyBones)18, isLeft: false, out extremeX2))
|
||||
{
|
||||
float profileForearmExtremeX2 = GetProfileForearmExtremeX(clothBoneMap, profileData.RightLowerArm_HandSpatialData, comprehensiveScale, isLeft: false);
|
||||
ScalingLowerArmLength(clothBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex, profileForearmExtremeX2, extremeX2);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Arm] ScalingLowerArmLength_ProfileMatch: right target extreme calc failed. Skip right lower.");
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryGetForearmExtremeX(IReadOnlyList<BakedBodyMesh> bakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, HumanBodyBones targetBone, bool isLeft, out float extremeX, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
extremeX = (isLeft ? float.PositiveInfinity : float.NegativeInfinity);
|
||||
if (bakedBodyMeshes == null || boneMap == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!boneMap.TryGetValue(targetBone, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
List<Vector3> list = poseMatchCommonUtil.CollectWeightedVerticesWorld(bakedBodyMeshes, value, weightThreshold, sampleStep);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
{
|
||||
float x = list[i].x;
|
||||
if (isLeft)
|
||||
{
|
||||
if (x < extremeX)
|
||||
{
|
||||
extremeX = x;
|
||||
}
|
||||
}
|
||||
else if (x > extremeX)
|
||||
{
|
||||
extremeX = x;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private float GetProfileForearmExtremeX(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData spatialData, Vector3 comprehensiveScale, bool isLeft)
|
||||
{
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (spatialData == null || spatialData.volumeData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Volume Data is Missing", "[BodyPoseMatch_Arm] GetProfileForearmExtremeX\n - spatialData or spatialData.volumeData is null");
|
||||
}
|
||||
if ((Object)(object)poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, spatialData.refBone) == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Ref Bone Transform is Missing", "[BodyPoseMatch_Arm] GetProfileForearmExtremeX\n - refBone transform is null");
|
||||
}
|
||||
BodyPoseMatch_CommonUtil bodyPoseMatch_CommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
float x = bodyPoseMatch_CommonUtil.GetProfileVolumeMinWorld(clothBoneMap, spatialData, 1, comprehensiveScale).x;
|
||||
float x2 = bodyPoseMatch_CommonUtil.GetProfileVolumeMaxWorld(clothBoneMap, spatialData, 1, comprehensiveScale).x;
|
||||
if (!isLeft)
|
||||
{
|
||||
return x2;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
private int ResolveArmLengthAxisIndex(Transform lowerArm, Transform hand, bool autoDetectAxis, int forceAxisIndex)
|
||||
{
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (!autoDetectAxis)
|
||||
{
|
||||
return Mathf.Clamp(forceAxisIndex, 0, 2);
|
||||
}
|
||||
Vector3 val = hand.position - lowerArm.position;
|
||||
Vector3 val2 = lowerArm.InverseTransformDirection(val);
|
||||
float num = Mathf.Abs(val2.x);
|
||||
float num2 = Mathf.Abs(val2.y);
|
||||
float num3 = Mathf.Abs(val2.z);
|
||||
if (num2 >= num && num2 >= num3)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (num >= num3)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
||||
public void DrawArmPcaDebug(GameObject avatarObject, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft, Color centerColor, Color axisColor, float axisScale = 1f, float duration = 0.1f)
|
||||
{
|
||||
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (avatarBakedBodyMeshes != null && avatarBoneMap != null)
|
||||
{
|
||||
RegionStats regionStats = ComputeArmRegionStats(avatarBakedBodyMeshes, avatarBoneMap, isLeft);
|
||||
if (!(regionStats.length < 0.0001f))
|
||||
{
|
||||
Vector3 center = regionStats.center;
|
||||
Vector3 val = ((((Vector3)(ref regionStats.principalAxis)).sqrMagnitude > 1E-08f) ? ((Vector3)(ref regionStats.principalAxis)).normalized : Vector3.up);
|
||||
float num = 0.02f * axisScale;
|
||||
Debug.DrawLine(center + Vector3.up * num, center - Vector3.up * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.right * num, center - Vector3.right * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.forward * num, center - Vector3.forward * num, centerColor, duration);
|
||||
float num2 = regionStats.length * 0.5f * axisScale;
|
||||
Debug.DrawLine(center - val * num2, center + val * num2, axisColor, duration);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void DrawForearmExtremeDebugPair(GameObject proxyObject, IReadOnlyList<SkinnedMeshRenderer> proxyBodyMeshes, GameObject targetObject, IReadOnlyList<SkinnedMeshRenderer> targetBodyMeshes, bool isLeft, float size = 0.03f, float duration = 3f)
|
||||
{
|
||||
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
DrawForearmExtremeDebugSingle(proxyObject, proxyBodyMeshes, isLeft, Color.blue, Color.cyan, size, duration);
|
||||
DrawForearmExtremeDebugSingle(targetObject, targetBodyMeshes, isLeft, Color.red, Color.magenta, size, duration);
|
||||
}
|
||||
|
||||
public void DrawForearmExtremeDebugSingle(GameObject avatarObject, IReadOnlyList<SkinnedMeshRenderer> bodyMeshes, bool isLeft, Color lineColor, Color pointColor, float size = 0.03f, float duration = 3f)
|
||||
{
|
||||
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)avatarObject == (Object)null || bodyMeshes == null || bodyMeshes.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Animator component = avatarObject.GetComponent<Animator>();
|
||||
if (!((Object)(object)component == (Object)null))
|
||||
{
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 15 : 16);
|
||||
Transform boneTransform = component.GetBoneTransform(val);
|
||||
if ((Object)(object)boneTransform == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)$"[BodyPoseMatch_Arm] DrawForearmExtremeDebugSingle: elbow bone missing. isLeft={isLeft}");
|
||||
return;
|
||||
}
|
||||
if (!TryGetForearmExtremePoint(component, bodyMeshes, isLeft, out var extremePos))
|
||||
{
|
||||
Debug.LogWarning((object)$"[BodyPoseMatch_Arm] DrawForearmExtremeDebugSingle: extreme vertex not found. isLeft={isLeft}");
|
||||
return;
|
||||
}
|
||||
Debug.DrawLine(boneTransform.position, extremePos, lineColor, duration);
|
||||
Debug.DrawLine(extremePos + Vector3.up * size, extremePos - Vector3.up * size, pointColor, duration);
|
||||
Debug.DrawLine(extremePos + Vector3.right * size, extremePos - Vector3.right * size, pointColor, duration);
|
||||
Debug.DrawLine(extremePos + Vector3.forward * size, extremePos - Vector3.forward * size, pointColor, duration);
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryGetForearmExtremePoint(Animator avatar, IReadOnlyList<SkinnedMeshRenderer> bodyMeshes, bool isLeft, out Vector3 extremePos)
|
||||
{
|
||||
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
|
||||
extremePos = default(Vector3);
|
||||
if ((Object)(object)avatar == (Object)null || bodyMeshes == null || bodyMeshes.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 17 : 18);
|
||||
Transform boneTransform = avatar.GetBoneTransform(val);
|
||||
if ((Object)(object)boneTransform == (Object)null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
HashSet<Transform> targetBoneSet = new HashSet<Transform> { boneTransform };
|
||||
List<BakedBodyMesh> list = new List<BakedBodyMesh>(bodyMeshes.Count);
|
||||
for (int i = 0; i < bodyMeshes.Count; i++)
|
||||
{
|
||||
SkinnedMeshRenderer val2 = bodyMeshes[i];
|
||||
if (!((Object)(object)val2 == (Object)null))
|
||||
{
|
||||
BakedBodyMesh bakedBodyMesh = new BakedBodyMesh(val2);
|
||||
bakedBodyMesh.ReBakeMesh();
|
||||
list.Add(bakedBodyMesh);
|
||||
}
|
||||
}
|
||||
if (list.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
List<Vector3> list2 = poseMatchCommonUtil.CollectWeightedVerticesWorld(list, targetBoneSet, 0.1f);
|
||||
if (list2 == null || list2.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
bool flag = false;
|
||||
float num = (isLeft ? float.PositiveInfinity : float.NegativeInfinity);
|
||||
for (int j = 0; j < list2.Count; j++)
|
||||
{
|
||||
Vector3 val3 = list2[j];
|
||||
float x = val3.x;
|
||||
if (!flag)
|
||||
{
|
||||
flag = true;
|
||||
num = x;
|
||||
extremePos = val3;
|
||||
}
|
||||
else if (isLeft)
|
||||
{
|
||||
if (x < num)
|
||||
{
|
||||
num = x;
|
||||
extremePos = val3;
|
||||
}
|
||||
}
|
||||
else if (x > num)
|
||||
{
|
||||
num = x;
|
||||
extremePos = val3;
|
||||
}
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,319 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatch_CommonUtil
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Eden.AutoMorpher;
|
||||
using Eden.AutoMorpher.profile;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatch_CommonUtil
|
||||
{
|
||||
public Transform GetBoneFromBoneMap(Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, HumanBodyBones bone)
|
||||
{
|
||||
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (boneMap == null || !boneMap.TryGetValue(bone, out var value) || value == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return value.FirstOrDefault();
|
||||
}
|
||||
|
||||
public Vector3 GetProfilePcaCenterWorld(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData boneSpatialData, Vector3 comprehensiveScale, string errorContext = "")
|
||||
{
|
||||
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_CommonUtil] GetProfilePcaCenterWorld\n - clothBoneMap is null (context=" + errorContext + ")");
|
||||
}
|
||||
if (boneSpatialData == null || boneSpatialData.pcaData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Bone Spatial Data is Missing", "[BodyPoseMatch_CommonUtil] GetProfilePcaCenterWorld\n - boneSpatialData or boneSpatialData.pcaData is null (context=" + errorContext + ")");
|
||||
}
|
||||
Transform boneFromBoneMap = GetBoneFromBoneMap(clothBoneMap, boneSpatialData.refBone);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Ref Bone Transform is Missing", "[BodyPoseMatch_CommonUtil] GetProfilePcaCenterWorld" + $"\n - refBone transform is null (refBone={boneSpatialData.refBone}, context={errorContext})");
|
||||
}
|
||||
if ((Object)(object)GetBoneFromBoneMap(clothBoneMap, (HumanBodyBones)0) == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Hip Transform is Missing", "[BodyPoseMatch_CommonUtil] GetProfilePcaCenterWorld\n - hip transform is null (context=" + errorContext + ")");
|
||||
}
|
||||
Vector3 pcaCenter = boneSpatialData.pcaData.pcaCenter;
|
||||
Vector3 val = default(Vector3);
|
||||
((Vector3)(ref val))._002Ector(pcaCenter.x / comprehensiveScale.x, pcaCenter.y / comprehensiveScale.y, pcaCenter.z / comprehensiveScale.z);
|
||||
return boneFromBoneMap.TransformPoint(val);
|
||||
}
|
||||
|
||||
public Vector3 GetProfileVolumeMinWorld(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData spatialData, int axis, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
||||
return GetProfileVolumeWorld(clothBoneMap, spatialData, axis, comprehensiveScale, isMin: true);
|
||||
}
|
||||
|
||||
public Vector3 GetProfileVolumeMaxWorld(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData spatialData, int axis, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
||||
return GetProfileVolumeWorld(clothBoneMap, spatialData, axis, comprehensiveScale, isMin: false);
|
||||
}
|
||||
|
||||
public Vector3 GetProfileVolumeWorld(Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, BoneSpatialData spatialData, int axisIndex, Vector3 comprehensiveScale, bool isMin)
|
||||
{
|
||||
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0129: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothBoneMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Bone Map is Missing", "[BodyPoseMatch_CommonUtil] GetProfileVolumeWorld\n - clothBoneMap is null");
|
||||
}
|
||||
if (spatialData == null || spatialData.volumeData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Volume Data is Missing", "[BodyPoseMatch_CommonUtil] GetProfileVolumeWorld\n - spatialData or spatialData.volumeData is null");
|
||||
}
|
||||
Transform boneFromBoneMap = GetBoneFromBoneMap(clothBoneMap, spatialData.refBone);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Ref Bone Transform is Missing", "[BodyPoseMatch_CommonUtil] GetProfileVolumeWorld" + $"\n - refBone transform is null (refBone={spatialData.refBone})");
|
||||
}
|
||||
Vector3 val;
|
||||
switch (axisIndex)
|
||||
{
|
||||
case 0:
|
||||
val = (isMin ? spatialData.volumeData.fMinLocalPos : spatialData.volumeData.fMaxLocalPos);
|
||||
break;
|
||||
case 1:
|
||||
val = (isMin ? spatialData.volumeData.rMinLocalPos : spatialData.volumeData.rMaxLocalPos);
|
||||
break;
|
||||
case 2:
|
||||
val = (isMin ? spatialData.volumeData.uMinLocalPos : spatialData.volumeData.uMaxLocalPos);
|
||||
break;
|
||||
default:
|
||||
throw new AutoMorpherException("Unsupported Volume Axis Index", "[BodyPoseMatch_CommonUtil] GetProfileVolumeWorld" + $"\n - axisIndex must be 0(Forward), 1(Right), 2(Up) (axisIndex={axisIndex})");
|
||||
}
|
||||
Vector3 val2 = default(Vector3);
|
||||
((Vector3)(ref val2))._002Ector(val.x / comprehensiveScale.x, val.y / comprehensiveScale.y, val.z / comprehensiveScale.z);
|
||||
return boneFromBoneMap.TransformPoint(val2);
|
||||
}
|
||||
|
||||
public List<Vector3> CollectWeightedVerticesWorld(IReadOnlyList<BakedBodyMesh> bakedBodyMeshes, HashSet<Transform> targetBoneSet, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
|
||||
List<Vector3> list = new List<Vector3>();
|
||||
if (bakedBodyMeshes == null || targetBoneSet == null || targetBoneSet.Count == 0)
|
||||
{
|
||||
return list;
|
||||
}
|
||||
foreach (BakedBodyMesh bakedBodyMesh in bakedBodyMeshes)
|
||||
{
|
||||
if (bakedBodyMesh == null || (Object)(object)bakedBodyMesh.smr == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Mesh sharedMesh = bakedBodyMesh.smr.sharedMesh;
|
||||
if ((Object)(object)sharedMesh == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
BoneWeight[] boneWeights = sharedMesh.boneWeights;
|
||||
Transform[] bones = bakedBodyMesh.smr.bones;
|
||||
if (boneWeights == null || boneWeights.Length == 0 || bones == null || bones.Length == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Vector3[] worldVerticesWithBakedMesh = new WorldVertexUtil().GetWorldVerticesWithBakedMesh(bakedBodyMesh.smr, bakedBodyMesh.bakedMesh);
|
||||
if (worldVerticesWithBakedMesh == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int num = Mathf.Min(worldVerticesWithBakedMesh.Length, boneWeights.Length);
|
||||
for (int i = 0; i < num; i += sampleStep)
|
||||
{
|
||||
BoneWeight val = boneWeights[i];
|
||||
float wSum = 0f;
|
||||
Acc(((BoneWeight)(ref val)).boneIndex0, ((BoneWeight)(ref val)).weight0);
|
||||
Acc(((BoneWeight)(ref val)).boneIndex1, ((BoneWeight)(ref val)).weight1);
|
||||
Acc(((BoneWeight)(ref val)).boneIndex2, ((BoneWeight)(ref val)).weight2);
|
||||
Acc(((BoneWeight)(ref val)).boneIndex3, ((BoneWeight)(ref val)).weight3);
|
||||
if (!(wSum < weightThreshold))
|
||||
{
|
||||
list.Add(worldVerticesWithBakedMesh[i]);
|
||||
}
|
||||
void Acc(int index, float w)
|
||||
{
|
||||
if (index >= 0 && index < bones.Length && !(w <= 0f))
|
||||
{
|
||||
Transform val2 = bones[index];
|
||||
if ((Object)(object)val2 != (Object)null && targetBoneSet.Contains(val2))
|
||||
{
|
||||
wSum += w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<Vector3> CollectHumanoidVerticesWorld(IReadOnlyList<HumanBodyBones> targetHumanBones, IReadOnlyList<BakedBodyMesh> bakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> boneMap, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
|
||||
List<Vector3> result = new List<Vector3>();
|
||||
if (bakedBodyMeshes == null || boneMap == null || boneMap.Count == 0 || targetHumanBones == null)
|
||||
{
|
||||
throw new AutoMorpherException("Invalid Arguments for CollectHumanoidVerticesWorld", "[BodyPoseMatchCommonUtil] CollectHumanoidVerticesWorld\n - bakedBodyMeshes is null OR boneMap is null/empty OR targetHumanBones is null");
|
||||
}
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
foreach (HumanBodyBones targetHumanBone in targetHumanBones)
|
||||
{
|
||||
if (!boneMap.TryGetValue(targetHumanBone, out var value) || value == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if ((Object)(object)item != (Object)null)
|
||||
{
|
||||
hashSet.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hashSet.Count == 0)
|
||||
{
|
||||
Debug.Log((object)"[AvatarBodyMatchUtil] CollectBodyPartVerticesWorld: targetBoneSet is empty.");
|
||||
return result;
|
||||
}
|
||||
return CollectWeightedVerticesWorld(bakedBodyMeshes, hashSet, weightThreshold, sampleStep);
|
||||
}
|
||||
|
||||
public void BoneLengthAdjust(Transform proxyParent, Transform proxyChild, Transform targetParent, Transform targetChild, HashSet<Transform> proxyParentSet, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyParent == (Object)null || (Object)(object)proxyChild == (Object)null || (Object)(object)targetParent == (Object)null || (Object)(object)targetChild == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] MatchBoneSegmentLength: bone null");
|
||||
return;
|
||||
}
|
||||
float num = Vector3.Distance(proxyParent.position, proxyChild.position);
|
||||
float num2 = Vector3.Distance(targetParent.position, targetChild.position);
|
||||
if (num < 1E-06f || num2 < 1E-06f)
|
||||
{
|
||||
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] MatchBoneSegmentLength: too small length. proxy={num}, target={num2}");
|
||||
return;
|
||||
}
|
||||
float num3 = num2 / num;
|
||||
int num7;
|
||||
if (autoDetectAxis)
|
||||
{
|
||||
Vector3 val = proxyChild.position - proxyParent.position;
|
||||
Vector3 val2 = proxyParent.InverseTransformDirection(val);
|
||||
float num4 = Mathf.Abs(val2.x);
|
||||
float num5 = Mathf.Abs(val2.y);
|
||||
float num6 = Mathf.Abs(val2.z);
|
||||
num7 = ((num5 >= num4 && num5 >= num6) ? 1 : ((!(num4 >= num6)) ? 2 : 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
num7 = Mathf.Clamp(forceAxisIndex, 0, 2);
|
||||
}
|
||||
Vector3 localScale = proxyParent.localScale;
|
||||
switch (num7)
|
||||
{
|
||||
case 0:
|
||||
localScale.x *= num3;
|
||||
break;
|
||||
case 1:
|
||||
localScale.y *= num3;
|
||||
break;
|
||||
case 2:
|
||||
localScale.z *= num3;
|
||||
break;
|
||||
}
|
||||
foreach (Transform item in proxyParentSet)
|
||||
{
|
||||
item.localScale = localScale;
|
||||
}
|
||||
}
|
||||
|
||||
public Transform CreateTempMarker(string markerObjectName, Transform parentTransform, IReadOnlyList<Transform> childTransforms, Vector3 markerWorldPosition, Quaternion markerWorldRotation, Vector3 markerLocalScale, out TempBoneMarker tempBoneMarker)
|
||||
{
|
||||
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)parentTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Marker Parent Transform is Missing", "[BodyPoseMatch_CommonUtil] CreateTempMarker\n - parentTransform is null");
|
||||
}
|
||||
if (childTransforms == null || childTransforms.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Child Transforms are Missing", "[BodyPoseMatch_CommonUtil] CreateTempMarker\n - childTransforms is null or empty");
|
||||
}
|
||||
Transform transform = new GameObject(string.IsNullOrEmpty(markerObjectName) ? "scaleSupportBone" : markerObjectName).transform;
|
||||
transform.SetParent(parentTransform, true);
|
||||
transform.position = markerWorldPosition;
|
||||
transform.rotation = markerWorldRotation;
|
||||
transform.localScale = markerLocalScale;
|
||||
tempBoneMarker = ((Component)transform).gameObject.AddComponent<TempBoneMarker>();
|
||||
tempBoneMarker.originalParent = parentTransform;
|
||||
tempBoneMarker.additionalInfo = "";
|
||||
tempBoneMarker.wrappedChildNames = new List<string>();
|
||||
for (int i = 0; i < childTransforms.Count; i++)
|
||||
{
|
||||
Transform val = childTransforms[i];
|
||||
if (!((Object)(object)val == (Object)null))
|
||||
{
|
||||
tempBoneMarker.wrappedChildNames.Add(((Object)val).name);
|
||||
val.SetParent(transform, true);
|
||||
}
|
||||
}
|
||||
return transform;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,940 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatch_Leg
|
||||
using System.Collections.Generic;
|
||||
using Eden.AutoMorpher;
|
||||
using Eden.AutoMorpher.profile;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatch_Leg
|
||||
{
|
||||
private readonly BodyPoseMatch_CommonUtil poseMatchCommonUtil;
|
||||
|
||||
public BodyPoseMatch_Leg()
|
||||
{
|
||||
poseMatchCommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
}
|
||||
|
||||
public void AlignBothUpperLegs(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap)
|
||||
{
|
||||
if ((Object)(object)proxyObject == (Object)null || (Object)(object)targetObject == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy or Target Object is Missing", "[BodyPoseMatch_Leg] AlignBothUpperLegs\n - proxyObject or targetObject is null");
|
||||
}
|
||||
AlignUpperLeg_BodyMatch(proxyObject, proxyBakedBodyMeshes, proxyBoneMap, targetObject, targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
AlignUpperLeg_BodyMatch(proxyObject, proxyBakedBodyMeshes, proxyBoneMap, targetObject, targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
}
|
||||
|
||||
public void AlignBothUpperLegs(Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Transform clothesTransform, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
|
||||
AlignUpperLeg_Profile(targetTransform, targetBakedBodyMeshes, targetBoneMap, clothesTransform, clothBoneMap, profileData, comprehensiveScale, isLeft: true);
|
||||
AlignUpperLeg_Profile(targetTransform, targetBakedBodyMeshes, targetBoneMap, clothesTransform, clothBoneMap, profileData, comprehensiveScale, isLeft: false);
|
||||
}
|
||||
|
||||
public void AlignUpperLeg_BodyMatch(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyObject == (Object)null || (Object)(object)targetObject == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy or Target Object is Missing", "[BodyPoseMatch_Leg] AlignUpperLeg_BodyMatch\n - proxyObject or targetObject is null");
|
||||
}
|
||||
RegionStats regionStats = ComputeLegRegionStats(proxyObject.transform, proxyBakedBodyMeshes, proxyBoneMap, isLeft);
|
||||
RegionStats regionStats2 = ComputeLegRegionStats(targetObject.transform, targetBakedBodyMeshes, targetBoneMap, isLeft);
|
||||
if (regionStats.length < 0.0001f || regionStats2.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] AlignUpperLeg_BodyMatch: leg PCA 통계가 비정상입니다.");
|
||||
return;
|
||||
}
|
||||
HumanBodyBones key = (HumanBodyBones)(isLeft ? 1 : 2);
|
||||
if (proxyBoneMap == null || !proxyBoneMap.TryGetValue(key, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] AlignUpperLeg_BodyMatch: proxy UpperLeg 본을 찾지 못했습니다.");
|
||||
}
|
||||
else
|
||||
{
|
||||
AlignUpperLegCore(value, regionStats.center, regionStats2.center);
|
||||
}
|
||||
}
|
||||
|
||||
public void AlignUpperLeg_Profile(Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Transform clothesTransform, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale, bool isLeft)
|
||||
{
|
||||
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)targetTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Target Object is Missing", "[BodyPoseMatch_Leg] AlignUpperLeg_Profile\n - targetObject is null");
|
||||
}
|
||||
HumanBodyBones key = (HumanBodyBones)(isLeft ? 1 : 2);
|
||||
BoneSpatialData val = (isLeft ? profileData.LeftUpperLegSpatialData : profileData.RightUpperLegSpatialData);
|
||||
if (val == null || val.pcaData == null)
|
||||
{
|
||||
Debug.LogWarning((object)("[BodyPoseMatch_Leg] AlignUpperLeg: " + (isLeft ? "Left" : "Right") + " spatial data missing."));
|
||||
return;
|
||||
}
|
||||
Vector3 profilePcaCenterWorld = poseMatchCommonUtil.GetProfilePcaCenterWorld(clothBoneMap, val, comprehensiveScale);
|
||||
RegionStats regionStats = ComputeLegRegionStats(targetTransform, targetBakedBodyMeshes, targetBoneMap, isLeft);
|
||||
HashSet<Transform> value;
|
||||
if (regionStats.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] AlignUpperLeg: Target leg PCA 통계가 비정상입니다.");
|
||||
}
|
||||
else if (clothBoneMap == null || !clothBoneMap.TryGetValue(key, out value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] AlignUpperLeg: clothes UpperLeg 본을 찾지 못했습니다.");
|
||||
}
|
||||
else
|
||||
{
|
||||
AlignUpperLegCore(value, profilePcaCenterWorld, regionStats.center);
|
||||
}
|
||||
}
|
||||
|
||||
private void AlignUpperLegCore(IReadOnlyCollection<Transform> upperLegSet, Vector3 sourceLegCenterWorld, Vector3 targetLegCenterWorld)
|
||||
{
|
||||
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (upperLegSet == null || upperLegSet.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Vector3 val = targetLegCenterWorld - sourceLegCenterWorld;
|
||||
val.y = 0f;
|
||||
foreach (Transform item in upperLegSet)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
item.position += val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public RegionStats ComputeLegRegionStats(Transform avatarTransform, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones[] targetHumanBones = (HumanBodyBones[])(object)((!isLeft) ? new HumanBodyBones[2]
|
||||
{
|
||||
(HumanBodyBones)2,
|
||||
(HumanBodyBones)4
|
||||
} : new HumanBodyBones[2]
|
||||
{
|
||||
(HumanBodyBones)1,
|
||||
(HumanBodyBones)3
|
||||
});
|
||||
List<Vector3> list = poseMatchCommonUtil.CollectHumanoidVerticesWorld(targetHumanBones, avatarBakedBodyMeshes, avatarBoneMap);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)$"[BodyPoseMatch_Leg] ComputeLegRegionStats: leg vertices 0개. avatar={((avatarTransform != null) ? ((Object)avatarTransform).name : null)}, isLeft={isLeft}");
|
||||
return default(RegionStats);
|
||||
}
|
||||
RegionStats result = new PcaUtil().ComputeRegionStats(list);
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 1 : 2));
|
||||
Transform boneFromBoneMap2 = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)(isLeft ? 3 : 4));
|
||||
if ((Object)(object)boneFromBoneMap != (Object)null && (Object)(object)boneFromBoneMap2 != (Object)null)
|
||||
{
|
||||
Vector3 val = boneFromBoneMap2.position - boneFromBoneMap.position;
|
||||
Vector3 normalized = ((Vector3)(ref val)).normalized;
|
||||
Vector3 val2 = ((Vector3)(ref result.principalAxis)).normalized;
|
||||
if (Vector3.Dot(val2, normalized) < 0f)
|
||||
{
|
||||
val2 = -val2;
|
||||
}
|
||||
result.principalAxis = val2;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public void ScalingBothLegsAndFoots(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
ScalingLeg(proxyBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex);
|
||||
ScalingLeg(proxyBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex);
|
||||
if (proxyBakedBodyMeshes != null)
|
||||
{
|
||||
foreach (BakedBodyMesh proxyBakedBodyMesh in proxyBakedBodyMeshes)
|
||||
{
|
||||
proxyBakedBodyMesh?.ReBakeMesh();
|
||||
}
|
||||
}
|
||||
ScalingFoot(proxyObject, proxyBakedBodyMeshes, proxyBoneMap, targetObject, targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
ScalingFoot(proxyObject, proxyBakedBodyMeshes, proxyBoneMap, targetObject, targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
}
|
||||
|
||||
public void ScalingBothLegsAndFoots(Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Transform clothTransform, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, ProfileData profileData, Vector3 comprehensiveScale, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
|
||||
ScalingLeg(clothBoneMap, targetBoneMap, isLeft: true, autoDetectAxis, forceAxisIndex);
|
||||
ScalingLeg(clothBoneMap, targetBoneMap, isLeft: false, autoDetectAxis, forceAxisIndex);
|
||||
ScalingFoot(profileData, comprehensiveScale, clothBoneMap, targetTransform, targetBakedBodyMeshes, targetBoneMap, isLeft: true);
|
||||
ScalingFoot(profileData, comprehensiveScale, clothBoneMap, targetTransform, targetBakedBodyMeshes, targetBoneMap, isLeft: false);
|
||||
}
|
||||
|
||||
public void ScalingLeg(Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft, bool autoDetectAxis = true, int forceAxisIndex = 1)
|
||||
{
|
||||
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0185: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 1 : 2);
|
||||
HumanBodyBones bone = (HumanBodyBones)(isLeft ? 3 : 4);
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, val);
|
||||
Transform boneFromBoneMap2 = poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, bone);
|
||||
Transform boneFromBoneMap3 = poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
Transform boneFromBoneMap4 = poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, bone);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null || (Object)(object)boneFromBoneMap2 == (Object)null || (Object)(object)boneFromBoneMap3 == (Object)null || (Object)(object)boneFromBoneMap4 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingLeg: some leg bones are null");
|
||||
return;
|
||||
}
|
||||
if (proxyBoneMap == null || !proxyBoneMap.TryGetValue(val, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingLeg: proxy upperLeg bone set missing");
|
||||
return;
|
||||
}
|
||||
poseMatchCommonUtil.BoneLengthAdjust(boneFromBoneMap, boneFromBoneMap2, boneFromBoneMap3, boneFromBoneMap4, value, autoDetectAxis, forceAxisIndex);
|
||||
HumanBodyBones val2 = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
Transform boneFromBoneMap5 = poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, val2);
|
||||
Transform boneFromBoneMap6 = poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val2);
|
||||
if ((Object)(object)boneFromBoneMap5 == (Object)null || (Object)(object)boneFromBoneMap6 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: proxyFoot or targetFoot is null");
|
||||
return;
|
||||
}
|
||||
float y = boneFromBoneMap5.position.y;
|
||||
float num = boneFromBoneMap6.position.y - y;
|
||||
if (!(Mathf.Abs(num) > 1E-06f))
|
||||
{
|
||||
return;
|
||||
}
|
||||
Vector3 val3 = default(Vector3);
|
||||
((Vector3)(ref val3))._002Ector(0f, num, 0f);
|
||||
if (proxyBoneMap == null || !proxyBoneMap.TryGetValue(val2, out var value2) || value2 == null || value2.Count <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
foreach (Transform item in value2)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
item.position += val3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ScalingFootCore(Transform proxyHip, Transform targetFoot, bool isLeft, HashSet<Transform> footBoneSet, float proxyToeF, float proxyHeelF, float proxySideMin, float proxySideMax, float proxySoleY, float targetToeF, float targetHeelF, float targetSideMin, float targetSideMax, float targetSoleY)
|
||||
{
|
||||
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018e: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyHip == (Object)null || (Object)(object)targetFoot == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFootCore: proxyHip or targetFoot is null");
|
||||
return;
|
||||
}
|
||||
if (footBoneSet == null || footBoneSet.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFootCore: footBoneSet is null or empty");
|
||||
return;
|
||||
}
|
||||
Dictionary<Transform, List<Transform>> dictionary = new Dictionary<Transform, List<Transform>>();
|
||||
foreach (Transform item in footBoneSet)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
Transform parent = item.parent;
|
||||
if (!dictionary.TryGetValue(parent, out var value))
|
||||
{
|
||||
value = new List<Transform>();
|
||||
dictionary.Add(parent, value);
|
||||
}
|
||||
value.Add(item);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<Transform, List<Transform>> item2 in dictionary)
|
||||
{
|
||||
Transform key = item2.Key;
|
||||
List<Transform> value2 = item2.Value;
|
||||
if ((Object)(object)key == (Object)null || value2 == null || value2.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform val = value2[0];
|
||||
if (!((Object)(object)val == (Object)null))
|
||||
{
|
||||
TempBoneMarker tempBoneMarker;
|
||||
Transform val2 = poseMatchCommonUtil.CreateTempMarker("scaleSupportBone", key, value2, val.position, Quaternion.identity, val.localScale, out tempBoneMarker);
|
||||
if (!((Object)(object)val2 == (Object)null))
|
||||
{
|
||||
ScaleAndAlignAlongAxis(proxyHip, proxyHip.forward, proxyHip.up, val2, proxyToeF, proxyHeelF, targetFoot, targetToeF, targetHeelF);
|
||||
ScaleAndAlignAlongAxis(proxyHip, proxyHip.right, proxyHip.up, val2, isLeft ? proxySideMin : proxySideMax, isLeft ? proxySideMax : proxySideMin, targetFoot, isLeft ? targetSideMin : targetSideMax, isLeft ? targetSideMax : targetSideMin);
|
||||
ScaleAndAlignAlongAxis(proxyHip, proxyHip.up, proxyHip.forward, val2, 0f, proxySoleY, targetFoot, 0f, targetSoleY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ScalingFoot(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyObject == (Object)null || (Object)(object)targetObject == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy or Target Object is Missing", "[BodyPoseMatch_Leg] ScalingFoot\n - proxyObject or targetObject is null");
|
||||
}
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, val);
|
||||
Transform boneFromBoneMap2 = poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null || (Object)(object)boneFromBoneMap2 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: proxyFoot or targetFoot is null");
|
||||
return;
|
||||
}
|
||||
if (!TryGetFootSpatialData(proxyObject.transform, proxyBakedBodyMeshes, proxyBoneMap, isLeft, out var _, out var footMinUp, out var heelF, out var toeF, out var sideMin, out var sideMax) || !TryGetFootSpatialData(targetObject.transform, targetBakedBodyMeshes, targetBoneMap, isLeft, out var _, out var footMinUp2, out var heelF2, out var toeF2, out var sideMin2, out var sideMax2))
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: foot spatial data 계산 실패");
|
||||
return;
|
||||
}
|
||||
Transform boneFromBoneMap3 = poseMatchCommonUtil.GetBoneFromBoneMap(proxyBoneMap, (HumanBodyBones)0);
|
||||
HashSet<Transform> value;
|
||||
if ((Object)(object)boneFromBoneMap3 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFoot: proxyHip is null");
|
||||
}
|
||||
else if (proxyBoneMap == null || !proxyBoneMap.TryGetValue(val, out value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFoot: footBoneSet is missing");
|
||||
}
|
||||
else
|
||||
{
|
||||
ScalingFootCore(boneFromBoneMap3, boneFromBoneMap2, isLeft, value, toeF, heelF, sideMin, sideMax, footMinUp, toeF2, heelF2, sideMin2, sideMax2, footMinUp2);
|
||||
}
|
||||
}
|
||||
|
||||
public void ScalingFoot(ProfileData profileData, Vector3 comprehensiveScale, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, bool isLeft)
|
||||
{
|
||||
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0168: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)targetTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Target Transform is Missing", "[BodyPoseMatch_Leg] ScalingFoot\n - targetTransform is null");
|
||||
}
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, val);
|
||||
Transform boneFromBoneMap2 = poseMatchCommonUtil.GetBoneFromBoneMap(targetBoneMap, val);
|
||||
if ((Object)(object)boneFromBoneMap == (Object)null || (Object)(object)boneFromBoneMap2 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: proxyFoot or targetFoot is null");
|
||||
return;
|
||||
}
|
||||
if (!TryGetFootSpatialData(((Component)targetTransform).transform, targetBakedBodyMeshes, targetBoneMap, isLeft, out var _, out var footMinUp, out var heelF, out var toeF, out var sideMin, out var sideMax))
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] ScalingFoot: foot spatial data 계산 실패");
|
||||
return;
|
||||
}
|
||||
Transform boneFromBoneMap3 = poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, (HumanBodyBones)0);
|
||||
BoneSpatialData val2 = (isLeft ? profileData.LeftFootSpatialData : profileData.RightFootSpatialData);
|
||||
if (val2 == null)
|
||||
{
|
||||
Debug.LogWarning((object)"[AvatarBodyMatchUtil] AlignNeckCenterByPcaWithHipZ: Profile FootSpatialData Data is Not exist.");
|
||||
return;
|
||||
}
|
||||
Transform boneFromBoneMap4 = poseMatchCommonUtil.GetBoneFromBoneMap(clothBoneMap, val2.refBone);
|
||||
if ((Object)(object)boneFromBoneMap4 == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFoot: clothRefBone is null");
|
||||
return;
|
||||
}
|
||||
BodyPoseMatch_CommonUtil bodyPoseMatch_CommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
float proxyToeF = Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMaxWorld(clothBoneMap, val2, 0, comprehensiveScale));
|
||||
float proxyHeelF = 0f - Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMinWorld(clothBoneMap, val2, 0, comprehensiveScale));
|
||||
float proxySideMax = Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMaxWorld(clothBoneMap, val2, 1, comprehensiveScale));
|
||||
float proxySideMin = 0f - Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMinWorld(clothBoneMap, val2, 1, comprehensiveScale));
|
||||
float proxySoleY = 0f - Vector3.Distance(boneFromBoneMap4.position, bodyPoseMatch_CommonUtil.GetProfileVolumeMinWorld(clothBoneMap, val2, 2, comprehensiveScale));
|
||||
if (clothBoneMap == null || !clothBoneMap.TryGetValue(val, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] ScalingFoot: cloth footBoneSet is missing");
|
||||
}
|
||||
else
|
||||
{
|
||||
ScalingFootCore(boneFromBoneMap3, boneFromBoneMap2, isLeft, value, proxyToeF, proxyHeelF, proxySideMin, proxySideMax, proxySoleY, toeF, heelF, sideMin, sideMax, footMinUp);
|
||||
}
|
||||
}
|
||||
|
||||
private void ScaleAndAlignAlongAxis(Transform baseTransform, Vector3 targetWorldAxis, Vector3 targetWorldUpAxis, Transform proxyFoot, float proxyMaxF, float proxyMinF, Transform targetFoot, float targetMaxF, float targetMinF)
|
||||
{
|
||||
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0092: Expected O, but got Unknown
|
||||
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0161: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0177: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0191: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b5: Expected O, but got Unknown
|
||||
float num = proxyMaxF - proxyMinF;
|
||||
float num2 = targetMaxF - targetMinF;
|
||||
if (Mathf.Abs(num) < 0.0001f || Mathf.Abs(num2) < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[AdjustFootForwardScale] foot span too small.");
|
||||
return;
|
||||
}
|
||||
float num3 = num2 / num;
|
||||
if (!float.IsFinite(num3) || num3 <= 0f)
|
||||
{
|
||||
Debug.LogWarning((object)$"[ScaleAndAlignAlongAxis] invalid scaleF: {num3}");
|
||||
return;
|
||||
}
|
||||
Vector3 position = proxyFoot.position + targetWorldAxis * proxyMinF;
|
||||
Vector3 position2 = targetFoot.position + targetWorldAxis * targetMinF;
|
||||
GameObject val = new GameObject("proxyAnchor");
|
||||
val.transform.SetParent(proxyFoot);
|
||||
val.transform.position = position;
|
||||
GameObject val2 = new GameObject("targetAnchor");
|
||||
val2.transform.SetParent(targetFoot);
|
||||
val2.transform.position = position2;
|
||||
Transform parent = proxyFoot.parent;
|
||||
Vector3 position3 = proxyFoot.position;
|
||||
Transform transform = new GameObject("ScaleParnet").transform;
|
||||
transform.SetParent(parent);
|
||||
transform.position = position3;
|
||||
transform.rotation = Quaternion.LookRotation(targetWorldAxis, targetWorldUpAxis);
|
||||
proxyFoot.SetParent(transform, true);
|
||||
proxyFoot.localPosition = Vector3.zero;
|
||||
Vector3 localScale = transform.localScale;
|
||||
localScale.z *= num3;
|
||||
transform.localScale = localScale;
|
||||
proxyFoot.SetParent(parent, true);
|
||||
proxyFoot.position = position3;
|
||||
float num4 = Vector3.Dot(val2.transform.position - val.transform.position, targetWorldAxis);
|
||||
Vector3 val3 = targetWorldAxis * num4;
|
||||
proxyFoot.position += val3;
|
||||
Object.DestroyImmediate((Object)(object)((Component)transform).gameObject);
|
||||
Object.DestroyImmediate((Object)(object)val);
|
||||
Object.DestroyImmediate((Object)val2);
|
||||
}
|
||||
|
||||
private bool TryGetFootSpatialData(Transform avatarTransform, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft, out float footMaxUp, out float footMinUp, out float heelF, out float toeF, out float sideMin, out float sideMax, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01af: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
|
||||
footMaxUp = float.NegativeInfinity;
|
||||
footMinUp = float.PositiveInfinity;
|
||||
heelF = float.PositiveInfinity;
|
||||
toeF = float.NegativeInfinity;
|
||||
sideMin = float.PositiveInfinity;
|
||||
sideMax = float.NegativeInfinity;
|
||||
if ((Object)(object)avatarTransform == (Object)null || avatarBakedBodyMeshes == null || avatarBoneMap == null || avatarBoneMap.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
HumanBodyBones key = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
if (!avatarBoneMap.TryGetValue(key, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Leg] TryGetFootSpatialData\n - foot bone set is missing");
|
||||
return false;
|
||||
}
|
||||
Vector3 up = Vector3.up;
|
||||
Vector3 forward = Vector3.forward;
|
||||
Vector3 right = Vector3.right;
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
Transform val = null;
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if ((Object)(object)item == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
val = item;
|
||||
}
|
||||
Stack<Transform> stack = new Stack<Transform>();
|
||||
stack.Push(item);
|
||||
while (stack.Count > 0)
|
||||
{
|
||||
Transform val2 = stack.Pop();
|
||||
if (!((Object)(object)val2 == (Object)null) && hashSet.Add(val2))
|
||||
{
|
||||
for (int i = 0; i < val2.childCount; i++)
|
||||
{
|
||||
stack.Push(val2.GetChild(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((Object)(object)val == (Object)null || hashSet.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
List<Vector3> list = poseMatchCommonUtil.CollectWeightedVerticesWorld(avatarBakedBodyMeshes, hashSet, weightThreshold, sampleStep);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (int j = 0; j < list.Count; j++)
|
||||
{
|
||||
Vector3 val3 = list[j] - val.position;
|
||||
float num = Vector3.Dot(val3, up);
|
||||
if (num < footMinUp)
|
||||
{
|
||||
footMinUp = num;
|
||||
}
|
||||
if (num > footMaxUp)
|
||||
{
|
||||
footMaxUp = num;
|
||||
}
|
||||
float num2 = Vector3.Dot(val3, forward);
|
||||
if (num2 < heelF)
|
||||
{
|
||||
heelF = num2;
|
||||
}
|
||||
if (num2 > toeF)
|
||||
{
|
||||
toeF = num2;
|
||||
}
|
||||
float num3 = Vector3.Dot(val3, right);
|
||||
if (num3 < sideMin)
|
||||
{
|
||||
sideMin = num3;
|
||||
}
|
||||
if (num3 > sideMax)
|
||||
{
|
||||
sideMax = num3;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void DrawLegPcaDebug(GameObject avatarObject, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft, Color centerColor, Color axisColor, float axisScale = 1f, float duration = 1f)
|
||||
{
|
||||
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (!((Object)(object)avatarObject == (Object)null))
|
||||
{
|
||||
RegionStats regionStats = ComputeLegRegionStats(avatarObject.transform, avatarBakedBodyMeshes, avatarBoneMap, isLeft);
|
||||
if (regionStats.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] DrawLegPcaDebug: PCA length too small (avatar={((Object)avatarObject).name}, isLeft={isLeft})");
|
||||
return;
|
||||
}
|
||||
Vector3 center = regionStats.center;
|
||||
Vector3 normalized = ((Vector3)(ref regionStats.principalAxis)).normalized;
|
||||
float num = 0.03f * axisScale;
|
||||
Debug.DrawLine(center + Vector3.up * num, center - Vector3.up * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.right * num, center - Vector3.right * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.forward * num, center - Vector3.forward * num, centerColor, duration);
|
||||
float num2 = regionStats.length * 0.5f * axisScale;
|
||||
Vector3 val = center - normalized * num2;
|
||||
Vector3 val2 = center + normalized * num2;
|
||||
Debug.DrawLine(val, val2, axisColor, duration);
|
||||
Debug.Log((object)($"[DrawLegPcaDebug] avatar={((Object)avatarObject).name}, isLeft={isLeft}, " + $"center={center}, axis={normalized}, len={regionStats.length}, avgRadius={regionStats.avgRadius}"));
|
||||
}
|
||||
}
|
||||
|
||||
public void DrawFootSpatialDebug(GameObject avatarObject, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, bool isLeft, Color centerColor, Color axisColor, Color boxColor, float axisScale = 0.1f, float duration = 1f, float weightThreshold = 0.15f, int sampleStep = 1)
|
||||
{
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0171: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0168: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0176: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01de: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0202: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0186: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0317: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_037f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0386: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_038d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0251: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0253: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0257: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0261: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0265: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_026a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_026f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0273: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0278: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_027d: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)avatarObject == (Object)null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!TryGetFootSpatialData(avatarObject.transform, avatarBakedBodyMeshes, avatarBoneMap, isLeft, out var footMaxUp, out var footMinUp, out var heelF, out var toeF, out var sideMin, out var sideMax, weightThreshold, sampleStep))
|
||||
{
|
||||
Debug.LogWarning((object)("[BodyPoseMatch_Leg] DrawFootSpatialDebug" + $"\n - Failed to compute Foot Spatial Data (avatar={((Object)avatarObject).name}, isLeft={isLeft})"));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (avatarBoneMap == null || avatarBoneMap.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
HumanBodyBones val = (HumanBodyBones)(isLeft ? 5 : 6);
|
||||
if (!avatarBoneMap.TryGetValue(val, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Transform val2 = null;
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if ((Object)(object)item != (Object)null)
|
||||
{
|
||||
val2 = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((Object)(object)val2 == (Object)null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Vector3 position = val2.position;
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)0);
|
||||
Vector3 val3 = (((Object)(object)boneFromBoneMap != (Object)null) ? boneFromBoneMap.forward : avatarObject.transform.forward);
|
||||
val3.y = 0f;
|
||||
if (((Vector3)(ref val3)).sqrMagnitude < 1E-06f)
|
||||
{
|
||||
val3 = Vector3.forward;
|
||||
}
|
||||
((Vector3)(ref val3)).Normalize();
|
||||
Vector3 val4 = Vector3.Cross(Vector3.up, val3);
|
||||
if (((Vector3)(ref val4)).sqrMagnitude < 1E-06f)
|
||||
{
|
||||
val4 = Vector3.right;
|
||||
}
|
||||
((Vector3)(ref val4)).Normalize();
|
||||
Vector3 val5 = (((Object)(object)boneFromBoneMap != (Object)null) ? boneFromBoneMap.up : avatarObject.transform.up);
|
||||
if (((Vector3)(ref val5)).sqrMagnitude < 1E-06f)
|
||||
{
|
||||
val5 = Vector3.up;
|
||||
}
|
||||
((Vector3)(ref val5)).Normalize();
|
||||
float num = Mathf.Max(0.0001f, axisScale * 0.5f);
|
||||
DrawCross(position, val5, val4, centerColor, num, duration);
|
||||
DrawCross(position, val5, val3, centerColor, num, duration);
|
||||
float len = Mathf.Max(0.0001f, axisScale * 2f);
|
||||
DrawAxisLine(position, val5, len, axisColor, duration);
|
||||
DrawAxisLine(position, val3, len, axisColor, duration);
|
||||
DrawAxisLine(position, val4, len, axisColor, duration);
|
||||
Vector3[] array = (Vector3[])(object)new Vector3[8];
|
||||
int num2 = 0;
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
float num3 = ((i == 0) ? footMinUp : footMaxUp);
|
||||
for (int j = 0; j < 2; j++)
|
||||
{
|
||||
float num4 = ((j == 0) ? heelF : toeF);
|
||||
for (int k = 0; k < 2; k++)
|
||||
{
|
||||
float num5 = ((k == 0) ? sideMin : sideMax);
|
||||
array[num2++] = position + val5 * num3 + val3 * num4 + val4 * num5;
|
||||
}
|
||||
}
|
||||
}
|
||||
DrawBoxEdges(array, boxColor, duration);
|
||||
float size = Mathf.Max(5E-05f, num * 0.6f);
|
||||
for (int l = 0; l < array.Length; l++)
|
||||
{
|
||||
DrawCross(array[l], val3, val4, boxColor, size, duration);
|
||||
}
|
||||
Debug.Log((object)($"[DrawFootSpatialDebug] avatar={((Object)avatarObject).name}, isLeft={isLeft}\n" + $" - footBone={val}, footRoot={((Object)val2).name}\n" + $" - up(min,max)=({footMinUp:F4},{footMaxUp:F4})\n" + $" - forward(heel,toe)=({heelF:F4},{toeF:F4})\n" + $" - side(min,max)=({sideMin:F4},{sideMax:F4})\n" + $" - forwardDir={val3}, rightDir={val4}, upDir={val5}"));
|
||||
}
|
||||
void DrawAxisLine(Vector3 start, Vector3 dir, float num6, Color color, float d)
|
||||
{
|
||||
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (!(((Vector3)(ref dir)).sqrMagnitude < 1E-10f))
|
||||
{
|
||||
((Vector3)(ref dir)).Normalize();
|
||||
Debug.DrawLine(start, start + dir * num6, color, d);
|
||||
}
|
||||
}
|
||||
void DrawBoxEdges(Vector3[] c, Color color, float d)
|
||||
{
|
||||
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
DrawSegment(c[0], c[1], color, d);
|
||||
DrawSegment(c[1], c[3], color, d);
|
||||
DrawSegment(c[3], c[2], color, d);
|
||||
DrawSegment(c[2], c[0], color, d);
|
||||
DrawSegment(c[4], c[5], color, d);
|
||||
DrawSegment(c[5], c[7], color, d);
|
||||
DrawSegment(c[7], c[6], color, d);
|
||||
DrawSegment(c[6], c[4], color, d);
|
||||
DrawSegment(c[0], c[4], color, d);
|
||||
DrawSegment(c[1], c[5], color, d);
|
||||
DrawSegment(c[2], c[6], color, d);
|
||||
DrawSegment(c[3], c[7], color, d);
|
||||
}
|
||||
void DrawCross(Vector3 pos, Vector3 axisA, Vector3 axisB, Color color, float num6, float d)
|
||||
{
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (((Vector3)(ref axisA)).sqrMagnitude < 1E-10f)
|
||||
{
|
||||
axisA = Vector3.up;
|
||||
}
|
||||
if (((Vector3)(ref axisB)).sqrMagnitude < 1E-10f)
|
||||
{
|
||||
axisB = Vector3.right;
|
||||
}
|
||||
((Vector3)(ref axisA)).Normalize();
|
||||
((Vector3)(ref axisB)).Normalize();
|
||||
Debug.DrawLine(pos - axisA * num6, pos + axisA * num6, color, d);
|
||||
Debug.DrawLine(pos - axisB * num6, pos + axisB * num6, color, d);
|
||||
}
|
||||
void DrawSegment(Vector3 p0, Vector3 p1, Color color, float d)
|
||||
{
|
||||
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
||||
Debug.DrawLine(p0, p1, color, d);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseMatch_Torso
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Eden.AutoMorpher;
|
||||
using Eden.AutoMorpher.profile;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseMatch_Torso
|
||||
{
|
||||
private readonly BodyPoseMatch_CommonUtil poseMatchCommonUtil;
|
||||
|
||||
public BodyPoseMatch_Torso()
|
||||
{
|
||||
poseMatchCommonUtil = new BodyPoseMatch_CommonUtil();
|
||||
}
|
||||
|
||||
public void AlignTorsoByNeck(IReadOnlyCollection<Transform> sourceHipSet, Vector3 sourceNeckCenterWorld, Vector3 targetNeckCenterWorld)
|
||||
{
|
||||
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (sourceHipSet == null || sourceHipSet.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Hip Set is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - sourceHipSet is null or empty");
|
||||
}
|
||||
Transform val = sourceHipSet.FirstOrDefault((Transform t) => (Object)(object)t != (Object)null);
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Source Hip Transform is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - sourceHipSet has no valid Transform");
|
||||
}
|
||||
Vector3 val2 = targetNeckCenterWorld - sourceNeckCenterWorld;
|
||||
Vector3 forward = val.forward;
|
||||
float num = Vector3.Dot(val2, forward);
|
||||
Vector3 val3 = forward * num;
|
||||
foreach (Transform item in sourceHipSet)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
item.position += val3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AlignTorsoByNeck(GameObject proxyObject, IReadOnlyList<BakedBodyMesh> proxyBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> proxyBoneMap, GameObject targetObject, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap)
|
||||
{
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyObject == (Object)null || (Object)(object)targetObject == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy/Target Object is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - proxyObject or targetObject is null");
|
||||
}
|
||||
RegionStats regionStats = ComputeNeckRegionStats(proxyObject.transform, proxyBakedBodyMeshes, proxyBoneMap);
|
||||
RegionStats regionStats2 = ComputeNeckRegionStats(targetObject.transform, targetBakedBodyMeshes, targetBoneMap);
|
||||
if (regionStats.length < 0.0001f || regionStats2.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Torso] AlignTorsoByNeck: Neck PCA 통계가 비정상입니다.");
|
||||
return;
|
||||
}
|
||||
if (proxyBoneMap == null || !proxyBoneMap.TryGetValue((HumanBodyBones)0, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Hip Set is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - proxyBoneMap has no Hips bone set");
|
||||
}
|
||||
AlignTorsoByNeck(value, regionStats.center, regionStats2.center);
|
||||
}
|
||||
|
||||
public void AlignTorsoByNeck(Transform targetTransform, IReadOnlyList<BakedBodyMesh> targetBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> targetBoneMap, Dictionary<HumanBodyBones, HashSet<Transform>> clothBoneMap, Transform clothesTransform, ProfileData profileData, Vector3 comprehensiveScale)
|
||||
{
|
||||
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)targetTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Target Transform is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - targetTransform is null");
|
||||
}
|
||||
if (profileData == null || profileData.NeckSpatialData == null)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Neck Data is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - profileData or profileData.NeckSpatialData is null");
|
||||
}
|
||||
RegionStats regionStats = ComputeNeckRegionStats(targetTransform, targetBakedBodyMeshes, targetBoneMap);
|
||||
if (regionStats.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)"[BodyPoseMatch_Torso] AlignTorsoByNeck: Neck PCA 통계가 비정상입니다.");
|
||||
return;
|
||||
}
|
||||
if (clothBoneMap == null || !clothBoneMap.TryGetValue((HumanBodyBones)0, out var value) || value == null || value.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Hip Set is Missing", "[BodyPoseMatch_Torso] AlignTorsoByNeck\n - clothBoneMap has no Hips bone set");
|
||||
}
|
||||
Vector3 profilePcaCenterWorld = poseMatchCommonUtil.GetProfilePcaCenterWorld(clothBoneMap, profileData.NeckSpatialData, comprehensiveScale);
|
||||
AlignTorsoByNeck(value, profilePcaCenterWorld, regionStats.center);
|
||||
}
|
||||
|
||||
public RegionStats ComputeNeckRegionStats(Transform avatarTransform, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap)
|
||||
{
|
||||
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
|
||||
HumanBodyBones[] targetHumanBones = (HumanBodyBones[])(object)new HumanBodyBones[1] { (HumanBodyBones)9 };
|
||||
List<Vector3> list = poseMatchCommonUtil.CollectHumanoidVerticesWorld(targetHumanBones, avatarBakedBodyMeshes, avatarBoneMap);
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)("[AvatarBodyMatchUtil] ComputeNeckRegionStats: neck vertices 0개. avatar=" + ((avatarTransform != null) ? ((Object)avatarTransform).name : null)));
|
||||
return default(RegionStats);
|
||||
}
|
||||
RegionStats result = new PcaUtil().ComputeRegionStats(list);
|
||||
Vector3 val = avatarTransform.up;
|
||||
Transform boneFromBoneMap = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)10);
|
||||
Transform boneFromBoneMap2 = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)54);
|
||||
Transform boneFromBoneMap3 = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)8);
|
||||
Transform boneFromBoneMap4 = poseMatchCommonUtil.GetBoneFromBoneMap(avatarBoneMap, (HumanBodyBones)0);
|
||||
Transform val2 = (((Object)(object)boneFromBoneMap2 != (Object)null) ? boneFromBoneMap2 : boneFromBoneMap3);
|
||||
if ((Object)(object)boneFromBoneMap != (Object)null && (Object)(object)val2 != (Object)null)
|
||||
{
|
||||
val = boneFromBoneMap.position - val2.position;
|
||||
}
|
||||
else if ((Object)(object)boneFromBoneMap != (Object)null && (Object)(object)boneFromBoneMap4 != (Object)null)
|
||||
{
|
||||
val = boneFromBoneMap.position - boneFromBoneMap4.position;
|
||||
}
|
||||
if (((Vector3)(ref val)).sqrMagnitude > 1E-08f)
|
||||
{
|
||||
((Vector3)(ref val)).Normalize();
|
||||
}
|
||||
if (Vector3.Dot(val, ((Component)avatarTransform).transform.up) < 0f)
|
||||
{
|
||||
val = -val;
|
||||
}
|
||||
result.principalAxis = val;
|
||||
return result;
|
||||
}
|
||||
|
||||
public void DrawTorsoPcaDebug(GameObject avatarObject, IReadOnlyList<BakedBodyMesh> avatarBakedBodyMeshes, Dictionary<HumanBodyBones, HashSet<Transform>> avatarBoneMap, Color centerColor, Color axisColor, float axisScale = 1f, float duration = 0.1f)
|
||||
{
|
||||
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (!((Object)(object)avatarObject == (Object)null))
|
||||
{
|
||||
RegionStats regionStats = ComputeNeckRegionStats(avatarObject.transform, avatarBakedBodyMeshes, avatarBoneMap);
|
||||
if (regionStats.length < 0.0001f)
|
||||
{
|
||||
Debug.LogWarning((object)$"[AvatarBodyMatchUtil] DrawNeckPcaDebug: neck.length가 너무 작음. avatar={((Object)avatarObject).name}, length={regionStats.length}");
|
||||
return;
|
||||
}
|
||||
Vector3 center = regionStats.center;
|
||||
Vector3 normalized = ((Vector3)(ref regionStats.principalAxis)).normalized;
|
||||
float num = 0.02f * axisScale;
|
||||
Debug.DrawLine(center + Vector3.up * num, center - Vector3.up * num, centerColor, duration);
|
||||
Debug.DrawLine(center + Vector3.right * num, center - Vector3.right * num, centerColor, duration);
|
||||
float num2 = regionStats.length * 0.5f * axisScale;
|
||||
Vector3 val = center + normalized * num2;
|
||||
Debug.DrawLine(center, val, axisColor, duration);
|
||||
Debug.Log((object)$"[AvatarBodyMatchUtil] DrawNeckPcaDebug: avatar={((Object)avatarObject).name}, center={center}, axis={normalized}, halfLen={num2}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,265 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BodyPoseToClothApplier
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
public class BodyPoseToClothApplier
|
||||
{
|
||||
private class BoneMapping
|
||||
{
|
||||
public Transform proxyBone;
|
||||
|
||||
public Transform clothBone;
|
||||
|
||||
public int depth;
|
||||
|
||||
public HumanBodyBones? humanBone;
|
||||
}
|
||||
|
||||
public void ApplyBodyPoseToClothes(Transform bodyProxyRoot, Transform clothesRoot, Dictionary<Transform, BoneMatchUtil.BoneRootLocalData> clothToBodyMatched, Dictionary<Transform, Transform> sourceToProxy, bool copyPosition = true, bool copyRotation = false, bool copyScale = true)
|
||||
{
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016d: Invalid comparison between Unknown and I4
|
||||
//IL_017b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0272: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_028e: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)bodyProxyRoot == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Body Proxy Root is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - bodyProxyRoot is null");
|
||||
}
|
||||
if ((Object)(object)clothesRoot == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Clothes Root is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - clothesRoot is null");
|
||||
}
|
||||
if (clothToBodyMatched == null || clothToBodyMatched.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth To Body Matched Map is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - clothToBodyMatched is null or empty");
|
||||
}
|
||||
if (sourceToProxy == null)
|
||||
{
|
||||
throw new AutoMorpherException("Source To Proxy Map is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - sourceToProxy is null");
|
||||
}
|
||||
clothesRoot.localScale = bodyProxyRoot.localScale;
|
||||
Animator component = ((Component)bodyProxyRoot).GetComponent<Animator>();
|
||||
if ((Object)(object)component == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Body Proxy Animator is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - bodyProxyRoot has no Animator");
|
||||
}
|
||||
Transform transform = ((Component)component).transform;
|
||||
Dictionary<Transform, int> dictionary = BuildDepthMap(transform);
|
||||
Dictionary<Transform, Transform> dictionary2 = new Dictionary<Transform, Transform>();
|
||||
List<BoneMapping> list = new List<BoneMapping>();
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
foreach (KeyValuePair<Transform, BoneMatchUtil.BoneRootLocalData> item in clothToBodyMatched)
|
||||
{
|
||||
Transform key = item.Key;
|
||||
BoneMatchUtil.BoneRootLocalData value = item.Value;
|
||||
if ((Object)(object)key == (Object)null || value == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform t = value.t;
|
||||
if ((Object)(object)t == (Object)null || !sourceToProxy.TryGetValue(t, out var value2) || (Object)(object)value2 == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
HumanBodyBones hBone = value.hBone;
|
||||
if (hashSet.Add(key))
|
||||
{
|
||||
int depth = 999;
|
||||
if (dictionary != null && dictionary.TryGetValue(value2, out var value3))
|
||||
{
|
||||
depth = value3;
|
||||
}
|
||||
list.Add(new BoneMapping
|
||||
{
|
||||
proxyBone = value2,
|
||||
clothBone = key,
|
||||
depth = depth,
|
||||
humanBone = (((int)hBone != 55) ? new HumanBodyBones?(hBone) : ((HumanBodyBones?)null))
|
||||
});
|
||||
}
|
||||
if (!dictionary2.ContainsKey(value2))
|
||||
{
|
||||
dictionary2.Add(value2, key);
|
||||
}
|
||||
}
|
||||
MirrorBoneMarkers(transform, dictionary2, dictionary, list);
|
||||
foreach (BoneMapping item2 in (from m in list
|
||||
where m != null && (Object)(object)m.proxyBone != (Object)null && (Object)(object)m.clothBone != (Object)null
|
||||
orderby m.depth
|
||||
select m).ToList())
|
||||
{
|
||||
if (!((Object)(object)item2.proxyBone == (Object)null) && !((Object)(object)item2.clothBone == (Object)null))
|
||||
{
|
||||
if (copyPosition)
|
||||
{
|
||||
item2.clothBone.position = item2.proxyBone.position;
|
||||
}
|
||||
if (copyRotation)
|
||||
{
|
||||
item2.clothBone.rotation = item2.proxyBone.rotation;
|
||||
}
|
||||
if (copyScale)
|
||||
{
|
||||
item2.clothBone.localScale = item2.proxyBone.localScale;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Dictionary<Transform, int> BuildDepthMap(Transform root)
|
||||
{
|
||||
Dictionary<Transform, int> dictionary = new Dictionary<Transform, int>();
|
||||
if ((Object)(object)root == (Object)null)
|
||||
{
|
||||
return dictionary;
|
||||
}
|
||||
Transform[] componentsInChildren = ((Component)root).GetComponentsInChildren<Transform>(true);
|
||||
foreach (Transform val in componentsInChildren)
|
||||
{
|
||||
if (!((Object)(object)val == (Object)null))
|
||||
{
|
||||
dictionary[val] = GetDepthFromRoot(val, root);
|
||||
}
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
private int GetDepthFromRoot(Transform t, Transform root)
|
||||
{
|
||||
int num = 0;
|
||||
Transform val = t;
|
||||
while ((Object)(object)val != (Object)null && (Object)(object)val != (Object)(object)root)
|
||||
{
|
||||
num++;
|
||||
val = val.parent;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
private void MirrorBoneMarkers(Transform proxyArmature, Dictionary<Transform, Transform> proxyToCloth, Dictionary<Transform, int> proxyDepthMap, List<BoneMapping> mappings)
|
||||
{
|
||||
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0166: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0174: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)proxyArmature == (Object)null || proxyToCloth == null || mappings == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
TempBoneMarker[] componentsInChildren = ((Component)proxyArmature).GetComponentsInChildren<TempBoneMarker>(true);
|
||||
if (componentsInChildren == null || componentsInChildren.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
for (int i = 0; i < mappings.Count; i++)
|
||||
{
|
||||
BoneMapping boneMapping = mappings[i];
|
||||
if (boneMapping != null && (Object)(object)boneMapping.proxyBone != (Object)null)
|
||||
{
|
||||
hashSet.Add(boneMapping.proxyBone);
|
||||
}
|
||||
}
|
||||
int value3;
|
||||
foreach (TempBoneMarker item in (from bm in componentsInChildren
|
||||
where (Object)(object)bm != (Object)null && (Object)(object)((Component)bm).transform != (Object)null
|
||||
orderby (proxyDepthMap != null && proxyDepthMap.TryGetValue(((Component)bm).transform, out value3)) ? value3 : int.MaxValue
|
||||
select bm).ToList())
|
||||
{
|
||||
Transform transform = ((Component)item).transform;
|
||||
if ((Object)(object)transform == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform originalParent = item.originalParent;
|
||||
if ((Object)(object)originalParent == (Object)null || !proxyToCloth.TryGetValue(originalParent, out var value) || (Object)(object)value == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
List<Transform> list = CollectDirectChilds(value);
|
||||
Transform val = FindMarkerInChild(value);
|
||||
TempBoneMarker tempBoneMarker = null;
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
val = new GameObject(((Object)transform).name).transform;
|
||||
val.SetParent(value, true);
|
||||
tempBoneMarker = ((Component)val).gameObject.AddComponent<TempBoneMarker>();
|
||||
}
|
||||
else
|
||||
{
|
||||
tempBoneMarker = ((Component)val).GetComponent<TempBoneMarker>();
|
||||
}
|
||||
val.position = transform.position;
|
||||
val.rotation = transform.rotation;
|
||||
val.localScale = transform.localScale;
|
||||
tempBoneMarker.originalParent = value;
|
||||
tempBoneMarker.additionalInfo = item.additionalInfo;
|
||||
tempBoneMarker.wrappedChildNames = item.wrappedChildNames;
|
||||
for (int num = 0; num < list.Count; num++)
|
||||
{
|
||||
Transform val2 = list[num];
|
||||
if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val2 == (Object)(object)val))
|
||||
{
|
||||
val2.SetParent(val, true);
|
||||
}
|
||||
}
|
||||
if (!proxyToCloth.ContainsKey(transform))
|
||||
{
|
||||
proxyToCloth.Add(transform, val);
|
||||
}
|
||||
if (hashSet.Add(transform))
|
||||
{
|
||||
int depth = 999;
|
||||
if (proxyDepthMap != null && proxyDepthMap.TryGetValue(transform, out var value2))
|
||||
{
|
||||
depth = value2;
|
||||
}
|
||||
mappings.Add(new BoneMapping
|
||||
{
|
||||
proxyBone = transform,
|
||||
clothBone = val,
|
||||
depth = depth,
|
||||
humanBone = null
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Transform FindMarkerInChild(Transform parent)
|
||||
{
|
||||
if ((Object)(object)parent == (Object)null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
for (int i = 0; i < parent.childCount; i++)
|
||||
{
|
||||
Transform child = parent.GetChild(i);
|
||||
if (!((Object)(object)child == (Object)null) && (Object)(object)((Component)child).GetComponent<TempBoneMarker>() != (Object)null)
|
||||
{
|
||||
return child;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<Transform> CollectDirectChilds(Transform parentTransform)
|
||||
{
|
||||
int childCount = parentTransform.childCount;
|
||||
List<Transform> list = new List<Transform>(childCount);
|
||||
for (int i = 0; i < childCount; i++)
|
||||
{
|
||||
list.Add(parentTransform.GetChild(i));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BoneAlignmentUtil
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
public class BoneAlignmentUtil
|
||||
{
|
||||
public void AlignClothBonesToAvatar(ClothInstance cloth, Animator targetAvatarAnimator)
|
||||
{
|
||||
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (cloth == null || (Object)(object)targetAvatarAnimator == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[BoneAlignmentUtil] cloth 또는 targetAvatarAnimator 가 null.");
|
||||
return;
|
||||
}
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> humanoidMatchedBone in cloth.humanoidMatchedBones)
|
||||
{
|
||||
HumanBodyBones key = humanoidMatchedBone.Key;
|
||||
foreach (Transform item in humanoidMatchedBone.Value)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
Transform boneTransform = targetAvatarAnimator.GetBoneTransform(key);
|
||||
if (!((Object)(object)boneTransform == (Object)null))
|
||||
{
|
||||
item.position = boneTransform.position;
|
||||
item.localScale = Vector3.one;
|
||||
((Object)item).name = ((Object)boneTransform).name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ReparentAccessoryBonesToAvatar(EdenAutoMorpherConfig config)
|
||||
{
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0201: Expected O, but got Unknown
|
||||
if (config.clothBoneTypeMap == null || (Object)(object)config.targetAvatarObject == (Object)null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Animator component = config.targetAvatarObject.GetComponent<Animator>();
|
||||
if ((Object)(object)component == (Object)null || !component.isHuman)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Dictionary<Transform, Transform> dictionary = new Dictionary<Transform, Transform>();
|
||||
if (config.clothesHumanoidMatchedBones != null)
|
||||
{
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> clothesHumanoidMatchedBone in config.clothesHumanoidMatchedBones)
|
||||
{
|
||||
HumanBodyBones key = clothesHumanoidMatchedBone.Key;
|
||||
foreach (Transform item2 in clothesHumanoidMatchedBone.Value)
|
||||
{
|
||||
Transform boneTransform = component.GetBoneTransform(key);
|
||||
if ((Object)(object)item2 != (Object)null && (Object)(object)boneTransform != (Object)null)
|
||||
{
|
||||
dictionary[item2] = boneTransform;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<Transform, ClothBoneType> item3 in config.clothBoneTypeMap)
|
||||
{
|
||||
if (item3.Value != ClothBoneType.Accessory)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform key2 = item3.Key;
|
||||
if ((Object)(object)key2 == (Object)null || !key2.IsChildOf(config.targetClothesObject.transform))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform parent = key2.parent;
|
||||
Transform val = null;
|
||||
while ((Object)(object)parent != (Object)null)
|
||||
{
|
||||
if (config.clothBoneTypeMap.TryGetValue(parent, out var value) && value == ClothBoneType.Body)
|
||||
{
|
||||
val = parent;
|
||||
break;
|
||||
}
|
||||
parent = parent.parent;
|
||||
}
|
||||
if (!((Object)(object)val == (Object)null) && dictionary.TryGetValue(val, out var value2))
|
||||
{
|
||||
key2.SetParent(value2, true);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<Transform, Transform> item4 in dictionary)
|
||||
{
|
||||
Transform key3 = item4.Key;
|
||||
Transform value3 = item4.Value;
|
||||
if ((Object)(object)key3 == (Object)null || (Object)(object)value3 == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
List<Transform> list = new List<Transform>();
|
||||
foreach (Transform item5 in key3)
|
||||
{
|
||||
Transform item = item5;
|
||||
list.Add(item);
|
||||
}
|
||||
foreach (Transform item6 in list)
|
||||
{
|
||||
if (!((Object)(object)item6 == (Object)null) && !config.clothBoneTypeMap.ContainsKey(item6))
|
||||
{
|
||||
item6.SetParent(value3, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void CleanupTempBones(Transform root)
|
||||
{
|
||||
if ((Object)(object)root == (Object)null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
TempBoneMarker[] componentsInChildren = ((Component)root).GetComponentsInChildren<TempBoneMarker>(true);
|
||||
if (componentsInChildren == null || componentsInChildren.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
TempBoneMarker[] array = (from m in componentsInChildren
|
||||
where (Object)(object)m != (Object)null
|
||||
orderby GetDepth(((Component)m).transform) descending
|
||||
select m).ToArray();
|
||||
foreach (TempBoneMarker tempBoneMarker in array)
|
||||
{
|
||||
if ((Object)(object)tempBoneMarker == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform transform = ((Component)tempBoneMarker).transform;
|
||||
Transform val = tempBoneMarker.originalParent;
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
val = transform.parent;
|
||||
}
|
||||
if ((Object)(object)val != (Object)null)
|
||||
{
|
||||
while (transform.childCount > 0)
|
||||
{
|
||||
transform.GetChild(0).SetParent(val, true);
|
||||
}
|
||||
}
|
||||
if (!Application.isPlaying)
|
||||
{
|
||||
Object.DestroyImmediate((Object)(object)((Component)transform).gameObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
Object.Destroy((Object)(object)((Component)transform).gameObject);
|
||||
}
|
||||
}
|
||||
int GetDepth(Transform t)
|
||||
{
|
||||
int num2 = 0;
|
||||
while ((Object)(object)t != (Object)null)
|
||||
{
|
||||
num2++;
|
||||
t = t.parent;
|
||||
}
|
||||
return num2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BoneCorrespondenceUtil
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
public class BoneCorrespondenceUtil
|
||||
{
|
||||
private char[] nameDelims = new char[8] { ' ', '-', '_', ':', '.', '|', '\\', '/' };
|
||||
|
||||
public float ComputeDistanceScore(float d, float near, float mid, float far)
|
||||
{
|
||||
if (d < near)
|
||||
{
|
||||
return 120f;
|
||||
}
|
||||
if (d < mid)
|
||||
{
|
||||
return 90f;
|
||||
}
|
||||
if (d < far)
|
||||
{
|
||||
return 50f;
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
public float ComputeRotationScore(float ang, float RotTolDeg)
|
||||
{
|
||||
return Mathf.Clamp01(1f - ang / RotTolDeg);
|
||||
}
|
||||
|
||||
public float ComputeNameScore(string bodyName, string bodyPath, string clothesName, string clothesPath)
|
||||
{
|
||||
string text = StripDigits(NormalizeName(bodyName));
|
||||
string text2 = StripDigits(NormalizeName(clothesName));
|
||||
string text3 = StripDigits(NormalizePath(bodyPath));
|
||||
string text4 = StripDigits(NormalizePath(clothesPath));
|
||||
if (!string.IsNullOrEmpty(text3) && text3 == text4)
|
||||
{
|
||||
return 80f;
|
||||
}
|
||||
if (!string.IsNullOrEmpty(text) && text == text2)
|
||||
{
|
||||
return 70f;
|
||||
}
|
||||
if (!string.IsNullOrEmpty(text) && !string.IsNullOrEmpty(text2) && (text.Contains(text2) || text2.Contains(text)))
|
||||
{
|
||||
return 40f;
|
||||
}
|
||||
return SubsequenceCoverage(bodyName, clothesName) * 10f;
|
||||
}
|
||||
|
||||
private float SubsequenceCoverage(string bodyRaw, string clothesRaw)
|
||||
{
|
||||
string text = StripDigits(NormalizeName(bodyRaw));
|
||||
string text2 = StripDigits(NormalizeName(clothesRaw));
|
||||
if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(text2))
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
return (float)SubNameMatchBest(text, text2) / (float)text.Length;
|
||||
}
|
||||
|
||||
private int SubNameMatchBest(string a, string b, int minMatchCount = 3)
|
||||
{
|
||||
if (string.IsNullOrEmpty(a) || string.IsNullOrEmpty(b))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (a.Length < minMatchCount || b.Length < minMatchCount)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int num = 0;
|
||||
for (int i = 0; i <= a.Length - minMatchCount; i++)
|
||||
{
|
||||
int num2 = SubNameMatch(a, i, b, minMatchCount);
|
||||
if (num2 > num)
|
||||
{
|
||||
num = num2;
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
private int SubNameMatch(string a, int startA, string b, int minMatchCount = 3)
|
||||
{
|
||||
int length = a.Length;
|
||||
int length2 = b.Length;
|
||||
int num = 0;
|
||||
int num2 = 0;
|
||||
int num3 = 0;
|
||||
int num4 = 0;
|
||||
for (int i = startA; i < length; i++)
|
||||
{
|
||||
for (int j = num3; j < length2; j++)
|
||||
{
|
||||
num3 = j + 1;
|
||||
if (a[i] == b[j])
|
||||
{
|
||||
num4 = i + 1;
|
||||
num2++;
|
||||
if (num2 > num)
|
||||
{
|
||||
num = num2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (num2 > num)
|
||||
{
|
||||
num = num2;
|
||||
}
|
||||
num2 = 0;
|
||||
}
|
||||
if (num3 >= length2)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (num2 > num)
|
||||
{
|
||||
num = num2;
|
||||
}
|
||||
if (num < minMatchCount)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return num4 - startA;
|
||||
}
|
||||
|
||||
public string GetHierarchyPath(Transform root, Transform t)
|
||||
{
|
||||
if ((Object)(object)t == (Object)null)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
Stack<string> stack = new Stack<string>();
|
||||
Transform val = t;
|
||||
while ((Object)(object)val != (Object)null && (Object)(object)val != (Object)(object)root)
|
||||
{
|
||||
stack.Push(((Object)val).name);
|
||||
val = val.parent;
|
||||
}
|
||||
return string.Join("/", stack);
|
||||
}
|
||||
|
||||
public string NormalizeName(string s)
|
||||
{
|
||||
if (string.IsNullOrEmpty(s))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
s = s.ToLowerInvariant();
|
||||
s = s.Replace("left", "l").Replace("right", "r");
|
||||
char[] array = nameDelims;
|
||||
foreach (char c in array)
|
||||
{
|
||||
s = s.Replace(c.ToString(), "");
|
||||
}
|
||||
s = StripDigits(s);
|
||||
return s;
|
||||
}
|
||||
|
||||
public string NormalizePath(string p)
|
||||
{
|
||||
if (string.IsNullOrEmpty(p))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return string.Join("/", (from x in p.Split('/')
|
||||
where !string.IsNullOrEmpty(x)
|
||||
select x).Select(NormalizeName));
|
||||
}
|
||||
|
||||
public string StripDigits(string s)
|
||||
{
|
||||
if (string.IsNullOrEmpty(s))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
StringBuilder stringBuilder = new StringBuilder(s.Length);
|
||||
foreach (char c in s)
|
||||
{
|
||||
if (!char.IsDigit(c))
|
||||
{
|
||||
stringBuilder.Append(c);
|
||||
}
|
||||
}
|
||||
return stringBuilder.ToString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,654 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BoneMatchUtil
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Eden.AutoMorpher;
|
||||
using Eden.AutoMorpher.profile;
|
||||
using UnityEngine;
|
||||
|
||||
public class BoneMatchUtil
|
||||
{
|
||||
public class BoneRootLocalData
|
||||
{
|
||||
public Transform t;
|
||||
|
||||
public string name;
|
||||
|
||||
public string path;
|
||||
|
||||
public Vector3 rootLocalPos;
|
||||
|
||||
public Quaternion rootLocalRot;
|
||||
|
||||
public HumanBodyBones hBone = (HumanBodyBones)55;
|
||||
}
|
||||
|
||||
private const float PosTolNear = 0.0001f;
|
||||
|
||||
private const float PosTolMid = 0.0005f;
|
||||
|
||||
private const float PosTolFar = 0.002f;
|
||||
|
||||
private const float RotTolDeg = 30f;
|
||||
|
||||
private const float eps = 1E-06f;
|
||||
|
||||
public List<BoneRootLocalData> ConvertProfileBoneDataToRootLocalData(List<BoneData> boneDataList)
|
||||
{
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (boneDataList == null || boneDataList.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Profile Bone Data is Missing", "[BoneMatchUtil] ConvertProfileBoneDataToRootLocalData\n - boneDataList is null or empty");
|
||||
}
|
||||
List<BoneRootLocalData> list = new List<BoneRootLocalData>(boneDataList.Count);
|
||||
foreach (BoneData boneData in boneDataList)
|
||||
{
|
||||
if (boneData != null)
|
||||
{
|
||||
BoneRootLocalData item = new BoneRootLocalData
|
||||
{
|
||||
t = null,
|
||||
name = (boneData.boneName ?? string.Empty),
|
||||
path = (boneData.hierarchyPath ?? string.Empty),
|
||||
rootLocalPos = boneData.rootLocalPosition,
|
||||
rootLocalRot = boneData.rootLocalRotation,
|
||||
hBone = boneData.hBone
|
||||
};
|
||||
list.Add(item);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public HashSet<Transform> GetMeshBones(List<SkinnedMeshRenderer> meshRenderers)
|
||||
{
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
if (meshRenderers != null)
|
||||
{
|
||||
foreach (SkinnedMeshRenderer meshRenderer in meshRenderers)
|
||||
{
|
||||
if ((Object)(object)meshRenderer == (Object)null || meshRenderer.bones == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform[] bones = meshRenderer.bones;
|
||||
foreach (Transform val in bones)
|
||||
{
|
||||
if ((Object)(object)val != (Object)null)
|
||||
{
|
||||
hashSet.Add(val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return hashSet;
|
||||
}
|
||||
|
||||
public List<BoneRootLocalData> GetRootLocalBones(Transform rootT, HashSet<Transform> boneList)
|
||||
{
|
||||
BoneCorrespondenceUtil correspondenceUtil = new BoneCorrespondenceUtil();
|
||||
return (from t in boneList.Where((Transform t) => (Object)(object)t != (Object)null).Distinct()
|
||||
select new BoneRootLocalData
|
||||
{
|
||||
t = t,
|
||||
name = ((Object)t).name,
|
||||
path = correspondenceUtil.GetHierarchyPath(rootT, t),
|
||||
rootLocalPos = rootT.InverseTransformPoint(t.position),
|
||||
rootLocalRot = Quaternion.Inverse(rootT.rotation) * t.rotation
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
public List<BoneRootLocalData> GetBodyRootLocalBones(Transform bodyTransform, Animator bodyAnimator, List<SkinnedMeshRenderer> bodyMeshes)
|
||||
{
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b8: Invalid comparison between Unknown and I4
|
||||
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0139: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013f: Invalid comparison between Unknown and I4
|
||||
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0290: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0283: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0285: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)bodyTransform == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Body Transform is Missing", "[BoneMatchUtil] GetBodyRootLocalBones\n - bodyTransform is null");
|
||||
}
|
||||
if ((Object)(object)bodyAnimator == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Body Animator is Missing", "[BoneMatchUtil] GetBodyRootLocalBones\n - animator is null");
|
||||
}
|
||||
Dictionary<Transform, HumanBodyBones> humanoidBoneList = GetHumanoidBoneList(bodyAnimator);
|
||||
if (humanoidBoneList == null || humanoidBoneList.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Humanoid Bone Map is Missing", "[BoneMatchUtil] GetBodyRootLocalBones\n - Can't find Humanoid Bone List");
|
||||
}
|
||||
if (bodyMeshes == null || bodyMeshes.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Body Meshes are Missing", "[BoneMatchUtil] GetBodyRootLocalBones\n - bodyMeshes is null or empty");
|
||||
}
|
||||
HashSet<Transform> meshBones = GetMeshBones(bodyMeshes);
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> dictionary = new MeshClassifier().MeshHumanoidBoneMatcher(bodyAnimator, bodyMeshes);
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
HashSet<Transform> hashSet2 = new HashSet<Transform>();
|
||||
foreach (KeyValuePair<Transform, HumanBodyBones> item in humanoidBoneList)
|
||||
{
|
||||
if ((int)item.Value != 55 && !((Object)(object)item.Key == (Object)null))
|
||||
{
|
||||
if (!dictionary.TryGetValue(item.Value, out var value) || value == null)
|
||||
{
|
||||
value = new HashSet<Transform>();
|
||||
dictionary[item.Value] = value;
|
||||
}
|
||||
value.Add(item.Key);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> item2 in dictionary)
|
||||
{
|
||||
HumanBodyBones key = item2.Key;
|
||||
if ((int)key == 55)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
HashSet<Transform> value2 = item2.Value;
|
||||
if (value2 == null || value2.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform val = bodyAnimator.GetBoneTransform(key);
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
val = value2.First();
|
||||
}
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
hashSet.Add(val);
|
||||
foreach (Transform item3 in value2)
|
||||
{
|
||||
if (!((Object)(object)item3 == (Object)(object)val) && !((Object)(object)item3 == (Object)null))
|
||||
{
|
||||
hashSet2.Add(item3);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (Transform item4 in meshBones)
|
||||
{
|
||||
if (!((Object)(object)item4 == (Object)null) && !hashSet2.Contains(item4))
|
||||
{
|
||||
hashSet.Add(item4);
|
||||
}
|
||||
}
|
||||
List<BoneRootLocalData> rootLocalBones = GetRootLocalBones(bodyTransform, hashSet);
|
||||
foreach (BoneRootLocalData item5 in rootLocalBones)
|
||||
{
|
||||
if (item5 != null && !((Object)(object)item5.t == (Object)null))
|
||||
{
|
||||
if (humanoidBoneList.TryGetValue(item5.t, out var value3))
|
||||
{
|
||||
item5.hBone = value3;
|
||||
}
|
||||
else
|
||||
{
|
||||
item5.hBone = (HumanBodyBones)55;
|
||||
}
|
||||
}
|
||||
}
|
||||
return rootLocalBones;
|
||||
}
|
||||
|
||||
private Dictionary<Transform, HumanBodyBones> GetHumanoidBoneList(Animator bodyAnimator)
|
||||
{
|
||||
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0052: Invalid comparison between Unknown and I4
|
||||
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
Dictionary<Transform, HumanBodyBones> dictionary = new Dictionary<Transform, HumanBodyBones>();
|
||||
if ((Object)(object)bodyAnimator == (Object)null || (Object)(object)bodyAnimator.avatar == (Object)null || !bodyAnimator.avatar.isHuman)
|
||||
{
|
||||
return dictionary;
|
||||
}
|
||||
foreach (HumanBodyBones value in Enum.GetValues(typeof(HumanBodyBones)))
|
||||
{
|
||||
if ((int)value != 55)
|
||||
{
|
||||
Transform boneTransform = bodyAnimator.GetBoneTransform(value);
|
||||
if (!((Object)(object)boneTransform == (Object)null))
|
||||
{
|
||||
dictionary.TryAdd(boneTransform, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
public void MatchClothesToBodyBones(List<BoneRootLocalData> bodyBones, List<BoneRootLocalData> clothesBones, out Dictionary<HumanBodyBones, HashSet<Transform>> clothHumanBones, out Dictionary<Transform, ClothBoneType> clothBoneTypeMap, out Dictionary<Transform, BoneRootLocalData> clothToBodyMatched)
|
||||
{
|
||||
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_035d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0362: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0364: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0368: Invalid comparison between Unknown and I4
|
||||
//IL_036c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0380: Unknown result type (might be due to invalid IL or missing references)
|
||||
clothHumanBones = new Dictionary<HumanBodyBones, HashSet<Transform>>();
|
||||
clothBoneTypeMap = new Dictionary<Transform, ClothBoneType>();
|
||||
clothToBodyMatched = new Dictionary<Transform, BoneRootLocalData>();
|
||||
if (bodyBones == null || bodyBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Body Bones are Missing", "[BoneMatchUtil] MatchClothesToBodyBones\n - bodyBones is null or empty");
|
||||
}
|
||||
if (clothesBones == null || clothesBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Clothes Bones are Missing", "[BoneMatchUtil] MatchClothesToBodyBones\n - clothesBones is null or empty");
|
||||
}
|
||||
List<(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float)> list = new List<(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float)>();
|
||||
BoneCorrespondenceUtil boneCorrespondenceUtil = new BoneCorrespondenceUtil();
|
||||
foreach (BoneRootLocalData clothesBone in clothesBones)
|
||||
{
|
||||
BoneRootLocalData boneRootLocalData = null;
|
||||
float num = float.NegativeInfinity;
|
||||
float num2 = float.NegativeInfinity;
|
||||
float num3 = float.NegativeInfinity;
|
||||
float num4 = float.PositiveInfinity;
|
||||
float num5 = float.PositiveInfinity;
|
||||
foreach (BoneRootLocalData bodyBone in bodyBones)
|
||||
{
|
||||
float num6 = Vector3.Distance(clothesBone.rootLocalPos, bodyBone.rootLocalPos);
|
||||
float num7 = boneCorrespondenceUtil.ComputeDistanceScore(num6, 0.0001f, 0.0005f, 0.002f);
|
||||
if (num7 == 0f)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
float num8 = boneCorrespondenceUtil.ComputeNameScore(bodyBone.name, bodyBone.path, clothesBone.name, clothesBone.path);
|
||||
if (num8 != 0f)
|
||||
{
|
||||
float num9 = Quaternion.Angle(bodyBone.rootLocalRot, clothesBone.rootLocalRot);
|
||||
float num10 = boneCorrespondenceUtil.ComputeRotationScore(num9, 30f) * 1f;
|
||||
if (IsBetterCandidate(num7, num, num10, num2, num8, num3, num6, num4, num9, num5))
|
||||
{
|
||||
boneRootLocalData = bodyBone;
|
||||
num = num7;
|
||||
num2 = num10;
|
||||
num3 = num8;
|
||||
num4 = num6;
|
||||
num5 = num9;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (boneRootLocalData != null)
|
||||
{
|
||||
list.Add((clothesBone, boneRootLocalData, num, num2, num3, num4, num5));
|
||||
}
|
||||
}
|
||||
Dictionary<Transform, BoneRootLocalData> dictionary = new Dictionary<Transform, BoneRootLocalData>();
|
||||
foreach (IGrouping<BoneRootLocalData, (BoneRootLocalData, BoneRootLocalData, float, float, float, float, float)> item in from x in list
|
||||
group x by x.body)
|
||||
{
|
||||
if (item.Key == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
List<(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float)> list2 = item.ToList();
|
||||
if (list2.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float) tuple = list2[0];
|
||||
for (int num11 = 1; num11 < list2.Count; num11++)
|
||||
{
|
||||
(BoneRootLocalData, BoneRootLocalData, float, float, float, float, float) tuple2 = list2[num11];
|
||||
if (IsBetterCandidate(tuple2.Item3, tuple.Item3, tuple2.Item4, tuple.Item4, tuple2.Item5, tuple.Item5, tuple2.Item6, tuple.Item6, tuple2.Item7, tuple.Item7))
|
||||
{
|
||||
tuple = tuple2;
|
||||
}
|
||||
}
|
||||
if (tuple.Item1 != null && (Object)(object)tuple.Item1.t != (Object)null && tuple.Item2 != null)
|
||||
{
|
||||
dictionary[tuple.Item1.t] = tuple.Item2;
|
||||
}
|
||||
}
|
||||
foreach (BoneRootLocalData clothesBone2 in clothesBones)
|
||||
{
|
||||
if ((Object)(object)clothesBone2?.t == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (dictionary.TryGetValue(clothesBone2.t, out var value))
|
||||
{
|
||||
clothBoneTypeMap[clothesBone2.t] = ClothBoneType.Body;
|
||||
clothToBodyMatched[clothesBone2.t] = value;
|
||||
HumanBodyBones hBone = value.hBone;
|
||||
if ((int)hBone != 55)
|
||||
{
|
||||
if (!clothHumanBones.TryGetValue(hBone, out var value2))
|
||||
{
|
||||
value2 = new HashSet<Transform>();
|
||||
clothHumanBones[hBone] = value2;
|
||||
}
|
||||
value2.Add(clothesBone2.t);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
clothBoneTypeMap[clothesBone2.t] = ClothBoneType.Accessory;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsBetterCandidate(float candDistScore, float bestDistScore, float candRotScore, float bestRotScore, float candNameScore, float bestNameScore, float candD, float bestD, float candAng, float bestAng)
|
||||
{
|
||||
if (candDistScore > bestDistScore)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (candDistScore < bestDistScore)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (candNameScore > bestNameScore)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (candNameScore < bestNameScore)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (Mathf.Abs(candRotScore - bestRotScore) > 1E-06f)
|
||||
{
|
||||
if (candRotScore > bestRotScore)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (candRotScore < bestRotScore)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (Mathf.Abs(candD - bestD) > 1E-06f)
|
||||
{
|
||||
if (candD < bestD)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (candD > bestD)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (Mathf.Abs(candAng - bestAng) > 1E-06f)
|
||||
{
|
||||
if (candAng < bestAng)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Dictionary<Transform, Transform> BuildTransformMatchMap(List<BoneRootLocalData> sourceBones, List<BoneRootLocalData> destBones, bool resultReverse = false)
|
||||
{
|
||||
//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02be: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (sourceBones == null || sourceBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Bones are Missing", "[BoneMatchUtil] BuildTransformMatchMap\n - sourceBones is null or empty");
|
||||
}
|
||||
if (destBones == null || destBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Destination Bones are Missing", "[BoneMatchUtil] BuildTransformMatchMap\n - destBones is null or empty");
|
||||
}
|
||||
BoneCorrespondenceUtil boneCorrespondenceUtil = new BoneCorrespondenceUtil();
|
||||
Dictionary<Transform, Transform> dictionary = new Dictionary<Transform, Transform>();
|
||||
Dictionary<string, BoneRootLocalData> dictionary2 = new Dictionary<string, BoneRootLocalData>();
|
||||
Dictionary<string, BoneRootLocalData> dictionary3 = new Dictionary<string, BoneRootLocalData>();
|
||||
Dictionary<string, List<BoneRootLocalData>> dictionary4 = new Dictionary<string, List<BoneRootLocalData>>();
|
||||
foreach (BoneRootLocalData destBone in destBones)
|
||||
{
|
||||
if (destBone == null || (Object)(object)destBone.t == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
string text = destBone.path ?? "";
|
||||
if (text.Length > 0 && !dictionary2.ContainsKey(text))
|
||||
{
|
||||
dictionary2.Add(text, destBone);
|
||||
}
|
||||
if (text.Length > 0)
|
||||
{
|
||||
string text2 = boneCorrespondenceUtil.NormalizePath(text);
|
||||
if (text2.Length > 0 && !dictionary3.ContainsKey(text2))
|
||||
{
|
||||
dictionary3.Add(text2, destBone);
|
||||
}
|
||||
}
|
||||
string text3 = destBone.name ?? ((Object)destBone.t).name;
|
||||
if (!string.IsNullOrEmpty(text3))
|
||||
{
|
||||
if (!dictionary4.TryGetValue(text3, out var value))
|
||||
{
|
||||
value = (dictionary4[text3] = new List<BoneRootLocalData>());
|
||||
}
|
||||
value.Add(destBone);
|
||||
}
|
||||
}
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
foreach (BoneRootLocalData sourceBone in sourceBones)
|
||||
{
|
||||
if (sourceBone == null || (Object)(object)sourceBone.t == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform val = null;
|
||||
string text4 = sourceBone.path ?? "";
|
||||
if (text4.Length > 0 && dictionary2.TryGetValue(text4, out var value2) && value2 != null && (Object)(object)value2.t != (Object)null && !hashSet.Contains(value2.t))
|
||||
{
|
||||
val = value2.t;
|
||||
}
|
||||
if ((Object)(object)val == (Object)null && text4.Length > 0)
|
||||
{
|
||||
string text5 = boneCorrespondenceUtil.NormalizePath(text4);
|
||||
if (text5.Length > 0 && dictionary3.TryGetValue(text5, out var value3) && value3 != null && (Object)(object)value3.t != (Object)null && !hashSet.Contains(value3.t))
|
||||
{
|
||||
val = value3.t;
|
||||
}
|
||||
}
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
string text6 = sourceBone.name ?? ((Object)sourceBone.t).name;
|
||||
if (!string.IsNullOrEmpty(text6) && dictionary4.TryGetValue(text6, out var value4))
|
||||
{
|
||||
float num = float.PositiveInfinity;
|
||||
Transform val2 = null;
|
||||
for (int i = 0; i < value4.Count; i++)
|
||||
{
|
||||
BoneRootLocalData boneRootLocalData = value4[i];
|
||||
if (boneRootLocalData != null && !((Object)(object)boneRootLocalData.t == (Object)null) && !hashSet.Contains(boneRootLocalData.t))
|
||||
{
|
||||
float num2 = Vector3.SqrMagnitude(boneRootLocalData.rootLocalPos - sourceBone.rootLocalPos);
|
||||
if (num2 < num)
|
||||
{
|
||||
num = num2;
|
||||
val2 = boneRootLocalData.t;
|
||||
}
|
||||
}
|
||||
}
|
||||
val = val2;
|
||||
}
|
||||
}
|
||||
if ((Object)(object)val != (Object)null)
|
||||
{
|
||||
if (resultReverse)
|
||||
{
|
||||
dictionary[val] = sourceBone.t;
|
||||
}
|
||||
else
|
||||
{
|
||||
dictionary[sourceBone.t] = val;
|
||||
}
|
||||
hashSet.Add(val);
|
||||
}
|
||||
}
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
public void RemapSourceClothMatchToTargetCloth(Transform sourceClothRoot, Transform targetClothRoot, Dictionary<HumanBodyBones, HashSet<Transform>> sourceClothHumanBones, Dictionary<Transform, ClothBoneType> sourceClothBoneTypeMap, out Dictionary<HumanBodyBones, HashSet<Transform>> targetClothHumanBones, out Dictionary<Transform, ClothBoneType> targetClothBoneTypeMap)
|
||||
{
|
||||
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0261: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
targetClothHumanBones = new Dictionary<HumanBodyBones, HashSet<Transform>>();
|
||||
targetClothBoneTypeMap = new Dictionary<Transform, ClothBoneType>();
|
||||
if ((Object)(object)sourceClothRoot == (Object)null || (Object)(object)targetClothRoot == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Root is Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - sourceClothRoot or targetClothRoot is null");
|
||||
}
|
||||
if (sourceClothHumanBones == null || sourceClothBoneTypeMap == null)
|
||||
{
|
||||
throw new AutoMorpherException("Source Cloth Match Data is Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - sourceClothHumanBones or sourceClothBoneTypeMap is null");
|
||||
}
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
foreach (KeyValuePair<Transform, ClothBoneType> item in sourceClothBoneTypeMap)
|
||||
{
|
||||
if ((Object)(object)item.Key != (Object)null)
|
||||
{
|
||||
hashSet.Add(item.Key);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> sourceClothHumanBone in sourceClothHumanBones)
|
||||
{
|
||||
HashSet<Transform> value = sourceClothHumanBone.Value;
|
||||
if (value == null || value.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item2 in value)
|
||||
{
|
||||
if ((Object)(object)item2 != (Object)null)
|
||||
{
|
||||
hashSet.Add(item2);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hashSet.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Cloth Bone Candidates are Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - sourceBoneSet is empty (no bones found in sourceClothBoneTypeMap/sourceClothHumanBones)");
|
||||
}
|
||||
HashSet<Transform> meshBones = GetMeshBones(((Component)targetClothRoot).GetComponentsInChildren<SkinnedMeshRenderer>(true).ToList());
|
||||
if (meshBones == null || meshBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Target Cloth Bone Candidates are Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - targetBoneSet is null or empty (GetMeshBones returned no bones)");
|
||||
}
|
||||
List<BoneRootLocalData> rootLocalBones = GetRootLocalBones(sourceClothRoot, hashSet);
|
||||
List<BoneRootLocalData> rootLocalBones2 = GetRootLocalBones(targetClothRoot, meshBones);
|
||||
if (rootLocalBones == null || rootLocalBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source RootLocal Bones are Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - sourceRootLocalBones is null or empty");
|
||||
}
|
||||
if (rootLocalBones2 == null || rootLocalBones2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Target RootLocal Bones are Missing", "[BoneMatchUtil] RemapClothMatchResultToTargetCloth\n - targetRootLocalBones is null or empty");
|
||||
}
|
||||
Dictionary<Transform, Transform> dictionary = BuildTransformMatchMap(rootLocalBones, rootLocalBones2);
|
||||
foreach (KeyValuePair<Transform, ClothBoneType> item3 in sourceClothBoneTypeMap)
|
||||
{
|
||||
Transform key = item3.Key;
|
||||
ClothBoneType value2 = item3.Value;
|
||||
if ((Object)(object)key == (Object)null || !dictionary.TryGetValue(key, out var value3) || (Object)(object)value3 == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (targetClothBoneTypeMap.TryGetValue(value3, out var value4))
|
||||
{
|
||||
if (value4 == ClothBoneType.Accessory && value2 == ClothBoneType.Body)
|
||||
{
|
||||
targetClothBoneTypeMap[value3] = ClothBoneType.Body;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
targetClothBoneTypeMap.Add(value3, value2);
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<HumanBodyBones, HashSet<Transform>> sourceClothHumanBone2 in sourceClothHumanBones)
|
||||
{
|
||||
HumanBodyBones key2 = sourceClothHumanBone2.Key;
|
||||
HashSet<Transform> value5 = sourceClothHumanBone2.Value;
|
||||
if (value5 == null || value5.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item4 in value5)
|
||||
{
|
||||
if (!((Object)(object)item4 == (Object)null) && dictionary.TryGetValue(item4, out var value6) && !((Object)(object)value6 == (Object)null))
|
||||
{
|
||||
if (!targetClothHumanBones.TryGetValue(key2, out var value7))
|
||||
{
|
||||
value7 = new HashSet<Transform>();
|
||||
targetClothHumanBones[key2] = value7;
|
||||
}
|
||||
value7.Add(value6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void BuildSourceToProxyBoneMap(Animator sourceAvatar, Animator proxyAvatar, out Dictionary<Transform, Transform> sourceToProxy)
|
||||
{
|
||||
sourceToProxy = new Dictionary<Transform, Transform>();
|
||||
if ((Object)(object)sourceAvatar == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Source Avatar is Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - sourceAvatar is null");
|
||||
}
|
||||
if ((Object)(object)proxyAvatar == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Avatar is Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - proxyAvatar is null");
|
||||
}
|
||||
Transform transform = ((Component)sourceAvatar).transform;
|
||||
Transform transform2 = ((Component)proxyAvatar).transform;
|
||||
HashSet<Transform> meshBones = GetMeshBones(((Component)transform2).GetComponentsInChildren<SkinnedMeshRenderer>(true).ToList());
|
||||
if (meshBones == null || meshBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy Body Bone Candidates are Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - proxyBoneSet is null or empty (GetMeshBones returned no bones)");
|
||||
}
|
||||
HashSet<Transform> meshBones2 = GetMeshBones(((Component)transform).GetComponentsInChildren<SkinnedMeshRenderer>(true).ToList());
|
||||
if (meshBones2 == null || meshBones2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source Body Bone Candidates are Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - sourceBoneSet is null or empty (GetMeshBones returned no bones)");
|
||||
}
|
||||
List<BoneRootLocalData> rootLocalBones = GetRootLocalBones(transform2, meshBones);
|
||||
List<BoneRootLocalData> rootLocalBones2 = GetRootLocalBones(transform, meshBones2);
|
||||
if (rootLocalBones == null || rootLocalBones.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Proxy RootLocal Bones are Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - proxyRootLocalBones is null or empty");
|
||||
}
|
||||
if (rootLocalBones2 == null || rootLocalBones2.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Source RootLocal Bones are Missing", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - sourceRootLocalBones is null or empty");
|
||||
}
|
||||
sourceToProxy = BuildTransformMatchMap(rootLocalBones, rootLocalBones2, resultReverse: true);
|
||||
if (sourceToProxy == null)
|
||||
{
|
||||
throw new AutoMorpherException("Source To Proxy Map Build Failed", "[AvatarBodyMatchUtil] BuildSourceToProxyBoneMap\n - BuildTransformMatchMap returned null");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BvhNode
|
||||
@@ -6,15 +6,15 @@ using UnityEngine;
|
||||
|
||||
public struct BvhNode
|
||||
{
|
||||
public Bounds bounds;
|
||||
public Bounds bounds;
|
||||
|
||||
public int leftChild;
|
||||
public int leftChild;
|
||||
|
||||
public int rightChild;
|
||||
public int rightChild;
|
||||
|
||||
public int start;
|
||||
public int start;
|
||||
|
||||
public int count;
|
||||
public int count;
|
||||
|
||||
public bool isLeaf;
|
||||
public bool isLeaf;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BvhTriangle
|
||||
@@ -6,13 +6,13 @@ using UnityEngine;
|
||||
|
||||
public struct BvhTriangle
|
||||
{
|
||||
public Vector3 a;
|
||||
public Vector3 a;
|
||||
|
||||
public Vector3 b;
|
||||
public Vector3 b;
|
||||
|
||||
public Vector3 c;
|
||||
public Vector3 c;
|
||||
|
||||
public Vector3 normal;
|
||||
public Vector3 normal;
|
||||
|
||||
public HumanBodyBones mainHumanBone;
|
||||
public HumanBodyBones mainHumanBone;
|
||||
}
|
||||
@@ -0,0 +1,983 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.BvhTriangleMesh
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
public class BvhTriangleMesh
|
||||
{
|
||||
public struct ClosestHit
|
||||
{
|
||||
public int triangleIndex;
|
||||
|
||||
public Vector3 closestPoint;
|
||||
|
||||
public Vector3 normal;
|
||||
|
||||
public float sqrDistance;
|
||||
|
||||
public HumanBodyBones mainHumanBone;
|
||||
}
|
||||
|
||||
private TriangleUtil triangleUtil;
|
||||
|
||||
private HumanBodyBones[] humanBones;
|
||||
|
||||
public BvhTriangle[] triangles;
|
||||
|
||||
public BvhNode[] nodes;
|
||||
|
||||
public int[] triIndices;
|
||||
|
||||
private const int LeafMaxTriangles = 4;
|
||||
|
||||
public BvhTriangleMesh()
|
||||
{
|
||||
HumanBodyBones[] array = new HumanBodyBones[34];
|
||||
RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
|
||||
humanBones = (HumanBodyBones[])(object)array;
|
||||
base._002Ector();
|
||||
triangleUtil = new TriangleUtil();
|
||||
}
|
||||
|
||||
private HumanBodyBones[] BuildVertexMainHumanBone(SkinnedMeshRenderer smr, Animator animator, HumanBodyBones[] bodyBones)
|
||||
{
|
||||
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
|
||||
Mesh sharedMesh = smr.sharedMesh;
|
||||
BoneWeight[] boneWeights = sharedMesh.boneWeights;
|
||||
int[] boneToBodyIndex = BuildBoneToBodyIndexMap(smr, animator, bodyBones);
|
||||
HumanBodyBones[] array = (HumanBodyBones[])(object)new HumanBodyBones[sharedMesh.vertexCount];
|
||||
for (int i = 0; i < sharedMesh.vertexCount; i++)
|
||||
{
|
||||
BoneWeight val = boneWeights[i];
|
||||
int bestBodyIdx = -1;
|
||||
float bestWeight = 0f;
|
||||
Try(((BoneWeight)(ref val)).boneIndex0, ((BoneWeight)(ref val)).weight0);
|
||||
Try(((BoneWeight)(ref val)).boneIndex1, ((BoneWeight)(ref val)).weight1);
|
||||
Try(((BoneWeight)(ref val)).boneIndex2, ((BoneWeight)(ref val)).weight2);
|
||||
Try(((BoneWeight)(ref val)).boneIndex3, ((BoneWeight)(ref val)).weight3);
|
||||
array[i] = (HumanBodyBones)((bestBodyIdx >= 0) ? ((int)bodyBones[bestBodyIdx]) : 55);
|
||||
void Try(int boneIdx, float w)
|
||||
{
|
||||
if (!(w <= 0f) && boneIdx >= 0 && boneIdx < boneToBodyIndex.Length)
|
||||
{
|
||||
int num = boneToBodyIndex[boneIdx];
|
||||
if (num >= 0 && w > bestWeight)
|
||||
{
|
||||
bestWeight = w;
|
||||
bestBodyIdx = num;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
public BvhTriangleMesh BuildFromSkinnedMeshes(IReadOnlyList<SkinnedMeshRenderer> renderers, Animator animator)
|
||||
{
|
||||
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0084: Expected O, but got Unknown
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0164: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0166: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0207: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_020c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0203: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_023a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0251: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0253: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_025a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0263: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0265: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_026c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_026e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0275: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0277: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (renderers == null || renderers.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
BvhTriangleMesh bvhTriangleMesh = new BvhTriangleMesh();
|
||||
int num = 0;
|
||||
foreach (SkinnedMeshRenderer renderer in renderers)
|
||||
{
|
||||
if (!((Object)(object)renderer == (Object)null) && !((Object)(object)renderer.sharedMesh == (Object)null))
|
||||
{
|
||||
num += renderer.sharedMesh.triangles.Length / 3;
|
||||
}
|
||||
}
|
||||
if (num == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
bvhTriangleMesh.triangles = new BvhTriangle[num];
|
||||
int num2 = 0;
|
||||
Mesh val = new Mesh();
|
||||
Vector3 val2 = default(Vector3);
|
||||
foreach (SkinnedMeshRenderer renderer2 in renderers)
|
||||
{
|
||||
if (!((Object)(object)renderer2 == (Object)null) && !((Object)(object)renderer2.sharedMesh == (Object)null))
|
||||
{
|
||||
val.Clear();
|
||||
renderer2.BakeMesh(val);
|
||||
Vector3[] vertices = val.vertices;
|
||||
int[] array = renderer2.sharedMesh.triangles;
|
||||
BoneWeight[] boneWeights = renderer2.sharedMesh.boneWeights;
|
||||
int[] boneToBodyIndex = BuildBoneToBodyIndexMap(renderer2, animator, humanBones);
|
||||
int num3 = array.Length / 3;
|
||||
Transform transform = ((Component)renderer2).transform;
|
||||
Vector3 lossyScale = transform.lossyScale;
|
||||
((Vector3)(ref val2))._002Ector(1f / Mathf.Max(lossyScale.x, 1E-08f), 1f / Mathf.Max(lossyScale.y, 1E-08f), 1f / Mathf.Max(lossyScale.z, 1E-08f));
|
||||
Matrix4x4 val3 = transform.localToWorldMatrix * Matrix4x4.Scale(val2);
|
||||
for (int i = 0; i < num3; i++)
|
||||
{
|
||||
int num4 = array[i * 3];
|
||||
int num5 = array[i * 3 + 1];
|
||||
int num6 = array[i * 3 + 2];
|
||||
Vector3 val4 = ((Matrix4x4)(ref val3)).MultiplyPoint3x4(vertices[num4]);
|
||||
Vector3 val5 = ((Matrix4x4)(ref val3)).MultiplyPoint3x4(vertices[num5]);
|
||||
Vector3 val6 = ((Matrix4x4)(ref val3)).MultiplyPoint3x4(vertices[num6]);
|
||||
Vector3 val7 = Vector3.Cross(val5 - val4, val6 - val4);
|
||||
float magnitude = ((Vector3)(ref val7)).magnitude;
|
||||
val7 = ((!(magnitude > 1E-08f)) ? Vector3.up : (val7 / magnitude));
|
||||
int num7 = ComputeTriangleMainHumanBoneIndex(num4, num5, num6, boneWeights, boneToBodyIndex, humanBones.Length);
|
||||
HumanBodyBones mainHumanBone = (HumanBodyBones)((num7 >= 0) ? ((int)humanBones[num7]) : 55);
|
||||
bvhTriangleMesh.triangles[num2++] = new BvhTriangle
|
||||
{
|
||||
a = val4,
|
||||
b = val5,
|
||||
c = val6,
|
||||
normal = val7,
|
||||
mainHumanBone = mainHumanBone
|
||||
};
|
||||
val.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
int num8 = num;
|
||||
int[] array2 = new int[num8];
|
||||
for (int j = 0; j < num8; j++)
|
||||
{
|
||||
array2[j] = j;
|
||||
}
|
||||
bvhTriangleMesh.triIndices = array2;
|
||||
List<BvhNode> list = new List<BvhNode>();
|
||||
BuildRecursive(bvhTriangleMesh.triangles, array2, 0, num8, list);
|
||||
bvhTriangleMesh.nodes = list.ToArray();
|
||||
return bvhTriangleMesh;
|
||||
}
|
||||
|
||||
private int[] BuildBoneToBodyIndexMap(SkinnedMeshRenderer smr, Animator animator, HumanBodyBones[] bodyBones)
|
||||
{
|
||||
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
|
||||
Transform[] bones = smr.bones;
|
||||
int[] array = new int[bones.Length];
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
{
|
||||
array[i] = -1;
|
||||
}
|
||||
if ((Object)(object)animator == (Object)null || bodyBones == null || bones == null)
|
||||
{
|
||||
return array;
|
||||
}
|
||||
Dictionary<Transform, int> dictionary = new Dictionary<Transform, int>();
|
||||
for (int j = 0; j < bones.Length; j++)
|
||||
{
|
||||
if (!((Object)(object)bones[j] == (Object)null) && !dictionary.ContainsKey(bones[j]))
|
||||
{
|
||||
dictionary.Add(bones[j], j);
|
||||
}
|
||||
}
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> dictionary2 = new MeshClassifier().MeshHumanoidBoneMatcher(animator, (IReadOnlyList<SkinnedMeshRenderer>)(object)new SkinnedMeshRenderer[1] { smr });
|
||||
for (int k = 0; k < bodyBones.Length; k++)
|
||||
{
|
||||
HumanBodyBones key = bodyBones[k];
|
||||
if (!dictionary2.TryGetValue(key, out var value) || value == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null) && dictionary.TryGetValue(item, out var value2))
|
||||
{
|
||||
array[value2] = k;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int l = 0; l < bones.Length; l++)
|
||||
{
|
||||
if (array[l] != -1)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform val = bones[l];
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Transform parent = val.parent;
|
||||
if (!((Object)(object)parent == (Object)null) && dictionary.TryGetValue(parent, out var value3))
|
||||
{
|
||||
int num = array[value3];
|
||||
if (num != -1)
|
||||
{
|
||||
array[l] = num;
|
||||
}
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
private int ComputeTriangleMainHumanBoneIndex(int vi0, int vi1, int vi2, BoneWeight[] weights, int[] boneToBodyIndex, int bodyBonesCount)
|
||||
{
|
||||
if (weights == null || weights.Length == 0 || boneToBodyIndex == null || boneToBodyIndex.Length == 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
float[] scores = new float[bodyBonesCount];
|
||||
Accumulate(vi0);
|
||||
Accumulate(vi1);
|
||||
Accumulate(vi2);
|
||||
int result = -1;
|
||||
float num = 0f;
|
||||
for (int i = 0; i < scores.Length; i++)
|
||||
{
|
||||
if (scores[i] > num)
|
||||
{
|
||||
num = scores[i];
|
||||
result = i;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
void Accumulate(int v)
|
||||
{
|
||||
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (v >= 0 && v < weights.Length)
|
||||
{
|
||||
BoneWeight val = weights[v];
|
||||
Add(((BoneWeight)(ref val)).boneIndex0, ((BoneWeight)(ref val)).weight0);
|
||||
Add(((BoneWeight)(ref val)).boneIndex1, ((BoneWeight)(ref val)).weight1);
|
||||
Add(((BoneWeight)(ref val)).boneIndex2, ((BoneWeight)(ref val)).weight2);
|
||||
Add(((BoneWeight)(ref val)).boneIndex3, ((BoneWeight)(ref val)).weight3);
|
||||
}
|
||||
}
|
||||
void Add(int boneIdx, float w)
|
||||
{
|
||||
if (!(w <= 0f) && boneIdx >= 0 && boneIdx < boneToBodyIndex.Length)
|
||||
{
|
||||
int num2 = boneToBodyIndex[boneIdx];
|
||||
if (num2 >= 0)
|
||||
{
|
||||
scores[num2] += w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public BvhTriangleMesh BuildFromSkinnedMeshes(IList<SkinnedMeshRenderer> renderers)
|
||||
{
|
||||
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0146: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0168: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0171: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0191: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (renderers == null || renderers.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
BvhTriangleMesh bvhTriangleMesh = new BvhTriangleMesh();
|
||||
int num = 0;
|
||||
foreach (SkinnedMeshRenderer renderer in renderers)
|
||||
{
|
||||
if (!((Object)(object)renderer == (Object)null) && !((Object)(object)renderer.sharedMesh == (Object)null))
|
||||
{
|
||||
num += renderer.sharedMesh.triangles.Length / 3;
|
||||
}
|
||||
}
|
||||
if (num == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
bvhTriangleMesh.triangles = new BvhTriangle[num];
|
||||
int num2 = 0;
|
||||
foreach (SkinnedMeshRenderer renderer2 in renderers)
|
||||
{
|
||||
if (!((Object)(object)renderer2 == (Object)null) && !((Object)(object)renderer2.sharedMesh == (Object)null))
|
||||
{
|
||||
Mesh sharedMesh = renderer2.sharedMesh;
|
||||
Vector3[] vertices = sharedMesh.vertices;
|
||||
int[] array = sharedMesh.triangles;
|
||||
int num3 = array.Length / 3;
|
||||
for (int i = 0; i < num3; i++)
|
||||
{
|
||||
int num4 = array[i * 3];
|
||||
int num5 = array[i * 3 + 1];
|
||||
int num6 = array[i * 3 + 2];
|
||||
Vector3 val = ((Component)renderer2).transform.TransformPoint(vertices[num4]);
|
||||
Vector3 val2 = ((Component)renderer2).transform.TransformPoint(vertices[num5]);
|
||||
Vector3 val3 = ((Component)renderer2).transform.TransformPoint(vertices[num6]);
|
||||
Vector3 val4 = Vector3.Cross(val2 - val, val3 - val);
|
||||
float magnitude = ((Vector3)(ref val4)).magnitude;
|
||||
val4 = ((!(magnitude > 1E-08f)) ? Vector3.up : (val4 / magnitude));
|
||||
bvhTriangleMesh.triangles[num2++] = new BvhTriangle
|
||||
{
|
||||
a = val,
|
||||
b = val2,
|
||||
c = val3,
|
||||
normal = val4
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
int num7 = num;
|
||||
int[] array2 = new int[num7];
|
||||
for (int j = 0; j < num7; j++)
|
||||
{
|
||||
array2[j] = j;
|
||||
}
|
||||
bvhTriangleMesh.triIndices = array2;
|
||||
List<BvhNode> list = new List<BvhNode>();
|
||||
BuildRecursive(bvhTriangleMesh.triangles, array2, 0, num7, list);
|
||||
bvhTriangleMesh.nodes = list.ToArray();
|
||||
return bvhTriangleMesh;
|
||||
}
|
||||
|
||||
public BvhTriangleMesh BuildFromMesh(Mesh mesh, Transform transform)
|
||||
{
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
BvhTriangleMesh bvhTriangleMesh = new BvhTriangleMesh();
|
||||
Vector3[] vertices = mesh.vertices;
|
||||
int[] array = mesh.triangles;
|
||||
int num = array.Length / 3;
|
||||
bvhTriangleMesh.triangles = new BvhTriangle[num];
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
int num2 = array[i * 3];
|
||||
int num3 = array[i * 3 + 1];
|
||||
int num4 = array[i * 3 + 2];
|
||||
Vector3 val = transform.TransformPoint(vertices[num2]);
|
||||
Vector3 val2 = transform.TransformPoint(vertices[num3]);
|
||||
Vector3 val3 = transform.TransformPoint(vertices[num4]);
|
||||
Vector3 val4 = Vector3.Cross(val2 - val, val3 - val);
|
||||
float magnitude = ((Vector3)(ref val4)).magnitude;
|
||||
val4 = ((!(magnitude > 1E-08f)) ? Vector3.up : (val4 / magnitude));
|
||||
bvhTriangleMesh.triangles[i] = new BvhTriangle
|
||||
{
|
||||
a = val,
|
||||
b = val2,
|
||||
c = val3,
|
||||
normal = val4
|
||||
};
|
||||
}
|
||||
int[] array2 = new int[num];
|
||||
for (int j = 0; j < num; j++)
|
||||
{
|
||||
array2[j] = j;
|
||||
}
|
||||
bvhTriangleMesh.triIndices = array2;
|
||||
List<BvhNode> list = new List<BvhNode>();
|
||||
BuildRecursive(bvhTriangleMesh.triangles, array2, 0, num, list);
|
||||
bvhTriangleMesh.nodes = list.ToArray();
|
||||
return bvhTriangleMesh;
|
||||
}
|
||||
|
||||
private int BuildRecursive(BvhTriangle[] tris, int[] triIndices, int start, int count, List<BvhNode> outNodes)
|
||||
{
|
||||
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0153: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
|
||||
int count2 = outNodes.Count;
|
||||
BvhNode bvhNode = default(BvhNode);
|
||||
Bounds bounds = default(Bounds);
|
||||
bool flag = true;
|
||||
for (int i = start; i < start + count; i++)
|
||||
{
|
||||
BvhTriangle bvhTriangle = tris[triIndices[i]];
|
||||
if (flag)
|
||||
{
|
||||
((Bounds)(ref bounds))._002Ector(bvhTriangle.a, Vector3.zero);
|
||||
((Bounds)(ref bounds)).Encapsulate(bvhTriangle.b);
|
||||
((Bounds)(ref bounds)).Encapsulate(bvhTriangle.c);
|
||||
flag = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
((Bounds)(ref bounds)).Encapsulate(bvhTriangle.a);
|
||||
((Bounds)(ref bounds)).Encapsulate(bvhTriangle.b);
|
||||
((Bounds)(ref bounds)).Encapsulate(bvhTriangle.c);
|
||||
}
|
||||
}
|
||||
bvhNode.bounds = bounds;
|
||||
if (count <= 4)
|
||||
{
|
||||
bvhNode.isLeaf = true;
|
||||
bvhNode.start = start;
|
||||
bvhNode.count = count;
|
||||
bvhNode.leftChild = -1;
|
||||
bvhNode.rightChild = -1;
|
||||
outNodes.Add(bvhNode);
|
||||
return count2;
|
||||
}
|
||||
Vector3 size = ((Bounds)(ref bounds)).size;
|
||||
int num = 0;
|
||||
if (size.y > size.x && size.y > size.z)
|
||||
{
|
||||
num = 1;
|
||||
}
|
||||
else if (size.z > size.x && size.z > size.y)
|
||||
{
|
||||
num = 2;
|
||||
}
|
||||
float num2 = 0f;
|
||||
for (int j = start; j < start + count; j++)
|
||||
{
|
||||
BvhTriangle bvhTriangle2 = tris[triIndices[j]];
|
||||
Vector3 val = (bvhTriangle2.a + bvhTriangle2.b + bvhTriangle2.c) / 3f;
|
||||
num2 += ((Vector3)(ref val))[num];
|
||||
}
|
||||
num2 /= (float)count;
|
||||
int num3 = Partition(tris, triIndices, start, count, num, num2);
|
||||
if (num3 == start || num3 == start + count)
|
||||
{
|
||||
num3 = start + count / 2;
|
||||
}
|
||||
bvhNode.isLeaf = false;
|
||||
bvhNode.start = -1;
|
||||
bvhNode.count = 0;
|
||||
outNodes.Add(bvhNode);
|
||||
int leftChild = BuildRecursive(tris, triIndices, start, num3 - start, outNodes);
|
||||
int rightChild = BuildRecursive(tris, triIndices, num3, start + count - num3, outNodes);
|
||||
bvhNode.leftChild = leftChild;
|
||||
bvhNode.rightChild = rightChild;
|
||||
outNodes[count2] = bvhNode;
|
||||
return count2;
|
||||
}
|
||||
|
||||
private int Partition(BvhTriangle[] tris, int[] triIndices, int start, int count, int axis, float splitPos)
|
||||
{
|
||||
int num = start;
|
||||
int num2 = start + count - 1;
|
||||
while (num <= num2)
|
||||
{
|
||||
BvhTriangle bvhTriangle = tris[triIndices[num]];
|
||||
BvhTriangle bvhTriangle2 = tris[triIndices[num2]];
|
||||
float num3 = (((Vector3)(ref bvhTriangle.a))[axis] + ((Vector3)(ref bvhTriangle.b))[axis] + ((Vector3)(ref bvhTriangle.c))[axis]) / 3f;
|
||||
_ = (((Vector3)(ref bvhTriangle2.a))[axis] + ((Vector3)(ref bvhTriangle2.b))[axis] + ((Vector3)(ref bvhTriangle2.c))[axis]) / 3f;
|
||||
if (num3 < splitPos)
|
||||
{
|
||||
num++;
|
||||
continue;
|
||||
}
|
||||
int num4 = triIndices[num];
|
||||
triIndices[num] = triIndices[num2];
|
||||
triIndices[num2] = num4;
|
||||
num2--;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
public ClosestHit QueryClosest(Vector3 point)
|
||||
{
|
||||
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
|
||||
ClosestHit best = new ClosestHit
|
||||
{
|
||||
triangleIndex = -1,
|
||||
sqrDistance = float.MaxValue
|
||||
};
|
||||
if (nodes == null || nodes.Length == 0)
|
||||
{
|
||||
return best;
|
||||
}
|
||||
QueryClosestRecursive(0, point, ref best);
|
||||
return best;
|
||||
}
|
||||
|
||||
public ClosestHit QueryClosest(Vector3 point, HashSet<HumanBodyBones> allowedBones)
|
||||
{
|
||||
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
|
||||
ClosestHit best = new ClosestHit
|
||||
{
|
||||
triangleIndex = -1,
|
||||
sqrDistance = float.MaxValue
|
||||
};
|
||||
if (nodes == null || nodes.Length == 0)
|
||||
{
|
||||
return best;
|
||||
}
|
||||
if (allowedBones == null || allowedBones.Count == 0)
|
||||
{
|
||||
QueryClosestRecursive(0, point, ref best);
|
||||
}
|
||||
else
|
||||
{
|
||||
QueryClosestRecursiveFiltered(0, point, ref best, allowedBones);
|
||||
}
|
||||
return best;
|
||||
}
|
||||
|
||||
private void QueryClosestRecursiveFiltered(int nodeIndex, Vector3 p, ref ClosestHit best, HashSet<HumanBodyBones> allowedBones)
|
||||
{
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
|
||||
BvhNode bvhNode = nodes[nodeIndex];
|
||||
if (DistanceSqPointAABB(p, bvhNode.bounds) > best.sqrDistance)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (bvhNode.isLeaf)
|
||||
{
|
||||
int num = bvhNode.start + bvhNode.count;
|
||||
for (int i = bvhNode.start; i < num; i++)
|
||||
{
|
||||
int num2 = triIndices[i];
|
||||
BvhTriangle bvhTriangle = triangles[num2];
|
||||
if (allowedBones.Contains(bvhTriangle.mainHumanBone))
|
||||
{
|
||||
Vector3 val = triangleUtil.ClosestPointOnTriangle(p, bvhTriangle.a, bvhTriangle.b, bvhTriangle.c);
|
||||
Vector3 val2 = p - val;
|
||||
float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude;
|
||||
if (sqrMagnitude < best.sqrDistance)
|
||||
{
|
||||
best.sqrDistance = sqrMagnitude;
|
||||
best.triangleIndex = num2;
|
||||
best.closestPoint = val;
|
||||
best.normal = bvhTriangle.normal;
|
||||
best.mainHumanBone = bvhTriangle.mainHumanBone;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int leftChild = bvhNode.leftChild;
|
||||
int rightChild = bvhNode.rightChild;
|
||||
float num3 = DistanceSqPointAABB(p, nodes[leftChild].bounds);
|
||||
float num4 = DistanceSqPointAABB(p, nodes[rightChild].bounds);
|
||||
if (num3 < num4)
|
||||
{
|
||||
QueryClosestRecursiveFiltered(leftChild, p, ref best, allowedBones);
|
||||
QueryClosestRecursiveFiltered(rightChild, p, ref best, allowedBones);
|
||||
}
|
||||
else
|
||||
{
|
||||
QueryClosestRecursiveFiltered(rightChild, p, ref best, allowedBones);
|
||||
QueryClosestRecursiveFiltered(leftChild, p, ref best, allowedBones);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void QueryClosestRecursive(int nodeIndex, Vector3 p, ref ClosestHit best)
|
||||
{
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0146: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
|
||||
BvhNode bvhNode = nodes[nodeIndex];
|
||||
if (DistanceSqPointAABB(p, bvhNode.bounds) > best.sqrDistance)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (bvhNode.isLeaf)
|
||||
{
|
||||
int num = bvhNode.start + bvhNode.count;
|
||||
for (int i = bvhNode.start; i < num; i++)
|
||||
{
|
||||
int num2 = triIndices[i];
|
||||
BvhTriangle bvhTriangle = triangles[num2];
|
||||
Vector3 val = triangleUtil.ClosestPointOnTriangle(p, bvhTriangle.a, bvhTriangle.b, bvhTriangle.c);
|
||||
Vector3 val2 = p - val;
|
||||
float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude;
|
||||
if (sqrMagnitude < best.sqrDistance)
|
||||
{
|
||||
best.sqrDistance = sqrMagnitude;
|
||||
best.triangleIndex = num2;
|
||||
best.closestPoint = val;
|
||||
best.normal = bvhTriangle.normal;
|
||||
best.mainHumanBone = bvhTriangle.mainHumanBone;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int leftChild = bvhNode.leftChild;
|
||||
int rightChild = bvhNode.rightChild;
|
||||
float num3 = DistanceSqPointAABB(p, nodes[leftChild].bounds);
|
||||
float num4 = DistanceSqPointAABB(p, nodes[rightChild].bounds);
|
||||
if (num3 < num4)
|
||||
{
|
||||
QueryClosestRecursive(leftChild, p, ref best);
|
||||
QueryClosestRecursive(rightChild, p, ref best);
|
||||
}
|
||||
else
|
||||
{
|
||||
QueryClosestRecursive(rightChild, p, ref best);
|
||||
QueryClosestRecursive(leftChild, p, ref best);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float DistanceSqPointAABB(Vector3 p, Bounds b)
|
||||
{
|
||||
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
|
||||
float num = Mathf.Max(new float[3]
|
||||
{
|
||||
((Bounds)(ref b)).min.x - p.x,
|
||||
0f,
|
||||
p.x - ((Bounds)(ref b)).max.x
|
||||
});
|
||||
float num2 = Mathf.Max(new float[3]
|
||||
{
|
||||
((Bounds)(ref b)).min.y - p.y,
|
||||
0f,
|
||||
p.y - ((Bounds)(ref b)).max.y
|
||||
});
|
||||
float num3 = Mathf.Max(new float[3]
|
||||
{
|
||||
((Bounds)(ref b)).min.z - p.z,
|
||||
0f,
|
||||
p.z - ((Bounds)(ref b)).max.z
|
||||
});
|
||||
return num * num + num2 * num2 + num3 * num3;
|
||||
}
|
||||
|
||||
public int QueryClosestN(Vector3 point, int maxCount, float maxDistance, List<ClosestHit> results)
|
||||
{
|
||||
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
|
||||
results.Clear();
|
||||
if (nodes == null || nodes.Length == 0 || maxCount <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
float num = maxDistance * maxDistance;
|
||||
float currentMaxSq = num;
|
||||
QueryClosestNRecursive(0, point, maxCount, num, results, ref currentMaxSq);
|
||||
return results.Count;
|
||||
}
|
||||
|
||||
private void QueryClosestNRecursive(int nodeIndex, Vector3 p, int maxCount, float maxDistanceSq, List<ClosestHit> bestHits, ref float currentMaxSq)
|
||||
{
|
||||
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0223: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0233: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0202: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0212: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_017b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0184: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0189: Unknown result type (might be due to invalid IL or missing references)
|
||||
BvhNode bvhNode = nodes[nodeIndex];
|
||||
if (DistanceSqPointAABB(p, bvhNode.bounds) > currentMaxSq)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (bvhNode.isLeaf)
|
||||
{
|
||||
int num = bvhNode.start + bvhNode.count;
|
||||
for (int i = bvhNode.start; i < num; i++)
|
||||
{
|
||||
int num2 = triIndices[i];
|
||||
BvhTriangle bvhTriangle = triangles[num2];
|
||||
Vector3 val = triangleUtil.ClosestPointOnTriangle(p, bvhTriangle.a, bvhTriangle.b, bvhTriangle.c);
|
||||
Vector3 val2 = p - val;
|
||||
float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude;
|
||||
if (sqrMagnitude > maxDistanceSq)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (bestHits.Count < maxCount)
|
||||
{
|
||||
bestHits.Add(new ClosestHit
|
||||
{
|
||||
triangleIndex = num2,
|
||||
closestPoint = val,
|
||||
normal = bvhTriangle.normal,
|
||||
sqrDistance = sqrMagnitude,
|
||||
mainHumanBone = bvhTriangle.mainHumanBone
|
||||
});
|
||||
if (bestHits.Count == maxCount)
|
||||
{
|
||||
currentMaxSq = GetMaxSqrDistance(bestHits, maxDistanceSq);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (sqrMagnitude >= currentMaxSq)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int index = 0;
|
||||
float sqrDistance = bestHits[0].sqrDistance;
|
||||
for (int j = 1; j < bestHits.Count; j++)
|
||||
{
|
||||
if (bestHits[j].sqrDistance > sqrDistance)
|
||||
{
|
||||
sqrDistance = bestHits[j].sqrDistance;
|
||||
index = j;
|
||||
}
|
||||
}
|
||||
bestHits[index] = new ClosestHit
|
||||
{
|
||||
triangleIndex = num2,
|
||||
closestPoint = val,
|
||||
normal = bvhTriangle.normal,
|
||||
sqrDistance = sqrMagnitude
|
||||
};
|
||||
currentMaxSq = GetMaxSqrDistance(bestHits, maxDistanceSq);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int leftChild = bvhNode.leftChild;
|
||||
int rightChild = bvhNode.rightChild;
|
||||
float num3 = DistanceSqPointAABB(p, nodes[leftChild].bounds);
|
||||
float num4 = DistanceSqPointAABB(p, nodes[rightChild].bounds);
|
||||
if (num3 < num4)
|
||||
{
|
||||
QueryClosestNRecursive(leftChild, p, maxCount, maxDistanceSq, bestHits, ref currentMaxSq);
|
||||
QueryClosestNRecursive(rightChild, p, maxCount, maxDistanceSq, bestHits, ref currentMaxSq);
|
||||
}
|
||||
else
|
||||
{
|
||||
QueryClosestNRecursive(rightChild, p, maxCount, maxDistanceSq, bestHits, ref currentMaxSq);
|
||||
QueryClosestNRecursive(leftChild, p, maxCount, maxDistanceSq, bestHits, ref currentMaxSq);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float GetMaxSqrDistance(List<ClosestHit> bestHits, float maxDistanceSq)
|
||||
{
|
||||
if (bestHits.Count == 0)
|
||||
{
|
||||
return maxDistanceSq;
|
||||
}
|
||||
float sqrDistance = bestHits[0].sqrDistance;
|
||||
for (int i = 1; i < bestHits.Count; i++)
|
||||
{
|
||||
if (bestHits[i].sqrDistance > sqrDistance)
|
||||
{
|
||||
sqrDistance = bestHits[i].sqrDistance;
|
||||
}
|
||||
}
|
||||
return Mathf.Min(sqrDistance, maxDistanceSq);
|
||||
}
|
||||
|
||||
public Vector3 ComputeMoveVectorToSurface(Vector3 p, float targetGap = 0f)
|
||||
{
|
||||
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
|
||||
ClosestHit closestHit = QueryClosest(p);
|
||||
if (closestHit.triangleIndex < 0)
|
||||
{
|
||||
return Vector3.zero;
|
||||
}
|
||||
Vector3 val = closestHit.closestPoint - p;
|
||||
if (targetGap > 0f)
|
||||
{
|
||||
val += ((Vector3)(ref closestHit.normal)).normalized * targetGap;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.ClothBoneType
|
||||
public enum ClothBoneType
|
||||
{
|
||||
Body,
|
||||
Accessory
|
||||
Body,
|
||||
Accessory
|
||||
}
|
||||
@@ -0,0 +1,306 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.ClothHumanoidMaskUtil
|
||||
using System.Collections.Generic;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
public class ClothHumanoidMaskUtil
|
||||
{
|
||||
public void BuildExcludedVertexMaskForHandsAndHead(ClothInstance clothInstance, bool excludeHandRoot = false, bool excludeThumbRoot = false)
|
||||
{
|
||||
//IL_02ea: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothInstance == null || (Object)(object)clothInstance.smr == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] clothInstance / smr 가 null");
|
||||
return;
|
||||
}
|
||||
SkinnedMeshRenderer smr = clothInstance.smr;
|
||||
Mesh val = clothInstance.editableMesh ?? smr.sharedMesh;
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] mesh 가 null");
|
||||
return;
|
||||
}
|
||||
BoneWeight[] boneWeights = val.boneWeights;
|
||||
Transform[] bones = smr.bones;
|
||||
if (boneWeights == null || boneWeights.Length == 0 || bones == null || bones.Length == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] boneWeights 또는 bones 비어있음");
|
||||
return;
|
||||
}
|
||||
if (clothInstance.humanoidMatchedBones == null || clothInstance.humanoidMatchedBones.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] humanoidMatchedBones 가 비어있음 (BodyToClothPoseApplier에서 매칭 안 되었을 가능성)");
|
||||
return;
|
||||
}
|
||||
int num = val.vertexCount;
|
||||
if (boneWeights.Length != num)
|
||||
{
|
||||
num = Mathf.Min(num, boneWeights.Length);
|
||||
}
|
||||
HashSet<Transform> excludedBones = new HashSet<Transform>();
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> humanoidMatchedBones = clothInstance.humanoidMatchedBones;
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)10, out var value) && value != null)
|
||||
{
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
AddHierarchy(item, includeRoot: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)17, out var value2) && value2 != null)
|
||||
{
|
||||
foreach (Transform item2 in value2)
|
||||
{
|
||||
if (!((Object)(object)item2 == (Object)null))
|
||||
{
|
||||
AddHierarchy(item2, excludeHandRoot);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)18, out var value3) && value3 != null)
|
||||
{
|
||||
foreach (Transform item3 in value3)
|
||||
{
|
||||
if (!((Object)(object)item3 == (Object)null))
|
||||
{
|
||||
AddHierarchy(item3, excludeHandRoot);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)24, out var value4) && value4 != null)
|
||||
{
|
||||
foreach (Transform item4 in value4)
|
||||
{
|
||||
if (!((Object)(object)item4 == (Object)null))
|
||||
{
|
||||
if (excludeThumbRoot)
|
||||
{
|
||||
excludedBones.Add(item4);
|
||||
}
|
||||
else
|
||||
{
|
||||
excludedBones.Remove(item4);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)39, out var value5) && value5 != null)
|
||||
{
|
||||
foreach (Transform item5 in value5)
|
||||
{
|
||||
if (!((Object)(object)item5 == (Object)null))
|
||||
{
|
||||
if (excludeThumbRoot)
|
||||
{
|
||||
excludedBones.Add(item5);
|
||||
}
|
||||
else
|
||||
{
|
||||
excludedBones.Remove(item5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
bool[] boneIndexExcluded = new bool[bones.Length];
|
||||
for (int i = 0; i < bones.Length; i++)
|
||||
{
|
||||
Transform val2 = bones[i];
|
||||
if ((Object)(object)val2 != (Object)null && excludedBones.Contains(val2))
|
||||
{
|
||||
boneIndexExcluded[i] = true;
|
||||
}
|
||||
}
|
||||
bool[] array = new bool[num];
|
||||
for (int j = 0; j < num; j++)
|
||||
{
|
||||
BoneWeight val3 = boneWeights[j];
|
||||
float excludedWeightSum = 0f;
|
||||
AddExcludedWeight(((BoneWeight)(ref val3)).weight0, ((BoneWeight)(ref val3)).boneIndex0);
|
||||
AddExcludedWeight(((BoneWeight)(ref val3)).weight1, ((BoneWeight)(ref val3)).boneIndex1);
|
||||
AddExcludedWeight(((BoneWeight)(ref val3)).weight2, ((BoneWeight)(ref val3)).boneIndex2);
|
||||
AddExcludedWeight(((BoneWeight)(ref val3)).weight3, ((BoneWeight)(ref val3)).boneIndex3);
|
||||
array[j] = excludedWeightSum >= 0.8f;
|
||||
void AddExcludedWeight(float w, int bi)
|
||||
{
|
||||
if (!(w <= 0f) && bi >= 0 && bi < boneIndexExcluded.Length && boneIndexExcluded[bi])
|
||||
{
|
||||
excludedWeightSum += w;
|
||||
}
|
||||
}
|
||||
}
|
||||
clothInstance.excludedVertices = array;
|
||||
BuildLegVertexMasks(clothInstance);
|
||||
void AddHierarchy(Transform root, bool includeRoot)
|
||||
{
|
||||
if (!((Object)(object)root == (Object)null))
|
||||
{
|
||||
Stack<Transform> stack = new Stack<Transform>();
|
||||
if (includeRoot)
|
||||
{
|
||||
stack.Push(root);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int k = 0; k < root.childCount; k++)
|
||||
{
|
||||
stack.Push(root.GetChild(k));
|
||||
}
|
||||
}
|
||||
while (stack.Count > 0)
|
||||
{
|
||||
Transform val4 = stack.Pop();
|
||||
if (!((Object)(object)val4 == (Object)null) && excludedBones.Add(val4))
|
||||
{
|
||||
for (int l = 0; l < val4.childCount; l++)
|
||||
{
|
||||
stack.Push(val4.GetChild(l));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void BuildLegVertexMasks(ClothInstance clothInstance)
|
||||
{
|
||||
//IL_020b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0210: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (clothInstance == null || (Object)(object)clothInstance.smr == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] clothInstance / smr 가 null");
|
||||
return;
|
||||
}
|
||||
SkinnedMeshRenderer smr = clothInstance.smr;
|
||||
Mesh val = clothInstance.editableMesh ?? smr.sharedMesh;
|
||||
if ((Object)(object)val == (Object)null)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] mesh 가 null");
|
||||
return;
|
||||
}
|
||||
BoneWeight[] boneWeights = val.boneWeights;
|
||||
Transform[] bones = smr.bones;
|
||||
if (boneWeights == null || boneWeights.Length == 0 || bones == null || bones.Length == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] boneWeights 또는 bones 비어있음");
|
||||
return;
|
||||
}
|
||||
if (clothInstance.humanoidMatchedBones == null || clothInstance.humanoidMatchedBones.Count == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothHumanoidMaskUtil] humanoidMatchedBones 가 비어있음 (BodyToClothPoseApplier에서 매칭 필요)");
|
||||
return;
|
||||
}
|
||||
int num = val.vertexCount;
|
||||
if (boneWeights.Length != num)
|
||||
{
|
||||
num = Mathf.Min(num, boneWeights.Length);
|
||||
}
|
||||
Dictionary<HumanBodyBones, HashSet<Transform>> humanoidMatchedBones = clothInstance.humanoidMatchedBones;
|
||||
HashSet<Transform> hashSet = new HashSet<Transform>();
|
||||
HashSet<Transform> hashSet2 = new HashSet<Transform>();
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)1, out var value) && value != null)
|
||||
{
|
||||
foreach (Transform item in value)
|
||||
{
|
||||
if (!((Object)(object)item == (Object)null))
|
||||
{
|
||||
CollectHierarchy(item, hashSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (humanoidMatchedBones.TryGetValue((HumanBodyBones)2, out var value2) && value2 != null)
|
||||
{
|
||||
foreach (Transform item2 in value2)
|
||||
{
|
||||
if (!((Object)(object)item2 == (Object)null))
|
||||
{
|
||||
CollectHierarchy(item2, hashSet2);
|
||||
}
|
||||
}
|
||||
}
|
||||
bool[] boneIsLeftLeg = new bool[bones.Length];
|
||||
bool[] boneIsRightLeg = new bool[bones.Length];
|
||||
for (int i = 0; i < bones.Length; i++)
|
||||
{
|
||||
Transform val2 = bones[i];
|
||||
if (!((Object)(object)val2 == (Object)null))
|
||||
{
|
||||
if (hashSet.Contains(val2))
|
||||
{
|
||||
boneIsLeftLeg[i] = true;
|
||||
}
|
||||
if (hashSet2.Contains(val2))
|
||||
{
|
||||
boneIsRightLeg[i] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
bool[] array = new bool[num];
|
||||
bool[] array2 = new bool[num];
|
||||
for (int j = 0; j < num; j++)
|
||||
{
|
||||
BoneWeight val3 = boneWeights[j];
|
||||
float leftWeight = 0f;
|
||||
float rightWeight = 0f;
|
||||
Check(((BoneWeight)(ref val3)).boneIndex0, ((BoneWeight)(ref val3)).weight0);
|
||||
Check(((BoneWeight)(ref val3)).boneIndex1, ((BoneWeight)(ref val3)).weight1);
|
||||
Check(((BoneWeight)(ref val3)).boneIndex2, ((BoneWeight)(ref val3)).weight2);
|
||||
Check(((BoneWeight)(ref val3)).boneIndex3, ((BoneWeight)(ref val3)).weight3);
|
||||
if (leftWeight > 0.8f)
|
||||
{
|
||||
array[j] = true;
|
||||
array2[j] = false;
|
||||
}
|
||||
else if (rightWeight > 0.8f)
|
||||
{
|
||||
array[j] = false;
|
||||
array2[j] = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
array[j] = false;
|
||||
array2[j] = false;
|
||||
}
|
||||
void Check(int bi, float w)
|
||||
{
|
||||
if (bi >= 0 && bi < bones.Length && !(w <= 0f))
|
||||
{
|
||||
if (boneIsLeftLeg[bi])
|
||||
{
|
||||
leftWeight += w;
|
||||
}
|
||||
if (boneIsRightLeg[bi])
|
||||
{
|
||||
rightWeight += w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
clothInstance.isLeftLegVertex = array;
|
||||
clothInstance.isRightLegVertex = array2;
|
||||
void CollectHierarchy(Transform root, HashSet<Transform> set)
|
||||
{
|
||||
if (!((Object)(object)root == (Object)null))
|
||||
{
|
||||
Stack<Transform> stack = new Stack<Transform>();
|
||||
stack.Push(root);
|
||||
while (stack.Count > 0)
|
||||
{
|
||||
Transform val4 = stack.Pop();
|
||||
if (!((Object)(object)val4 == (Object)null) && set.Add(val4))
|
||||
{
|
||||
for (int k = 0; k < val4.childCount; k++)
|
||||
{
|
||||
stack.Push(val4.GetChild(k));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,702 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.ClothInstance
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
[Serializable]
|
||||
public class ClothInstance
|
||||
{
|
||||
public SkinnedMeshRenderer smr;
|
||||
|
||||
public Mesh editableMesh;
|
||||
|
||||
public Mesh bakedMesh;
|
||||
|
||||
public Matrix4x4 worldNoScale;
|
||||
|
||||
public Vector3[] worldVertices;
|
||||
|
||||
public Vector3[] minDistanceVector;
|
||||
|
||||
public float[] minDistance;
|
||||
|
||||
public Vector3[] deltas;
|
||||
|
||||
public Vector3[] deltasLocal;
|
||||
|
||||
public List<int>[] vertexAdjacency;
|
||||
|
||||
public List<List<int>> equivalentVertices;
|
||||
|
||||
public bool[] isInsideVertex;
|
||||
|
||||
public bool[] excludedVertices;
|
||||
|
||||
public bool[] isLeftLegVertex;
|
||||
|
||||
public bool[] isRightLegVertex;
|
||||
|
||||
public Vector3[] bakedWorldNormals;
|
||||
|
||||
public Vector4[] bakedWorldTangents;
|
||||
|
||||
public Dictionary<HumanBodyBones, HashSet<Transform>> humanoidMatchedBones;
|
||||
|
||||
public ClothInstance(SkinnedMeshRenderer clotheSMR, bool duplicateMesh = true)
|
||||
{
|
||||
smr = clotheSMR;
|
||||
if (duplicateMesh)
|
||||
{
|
||||
string name = ((Object)smr.sharedMesh).name;
|
||||
editableMesh = Object.Instantiate<Mesh>(clotheSMR.sharedMesh);
|
||||
((Object)editableMesh).name = name + "_EditableMesh";
|
||||
smr.sharedMesh = editableMesh;
|
||||
}
|
||||
else
|
||||
{
|
||||
editableMesh = smr.sharedMesh;
|
||||
}
|
||||
UpdateWorldVertices();
|
||||
int vertexCount = editableMesh.vertexCount;
|
||||
minDistanceVector = (Vector3[])(object)new Vector3[vertexCount];
|
||||
deltas = (Vector3[])(object)new Vector3[vertexCount];
|
||||
minDistance = new float[vertexCount];
|
||||
isInsideVertex = new bool[vertexCount];
|
||||
excludedVertices = new bool[vertexCount];
|
||||
isLeftLegVertex = new bool[vertexCount];
|
||||
isRightLegVertex = new bool[vertexCount];
|
||||
humanoidMatchedBones = new Dictionary<HumanBodyBones, HashSet<Transform>>();
|
||||
vertexAdjacency = BuildVertexAdjacency(editableMesh);
|
||||
BuildEquivalentVerticesFromWorld();
|
||||
}
|
||||
|
||||
public void UpdateWorldVertices()
|
||||
{
|
||||
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0019: Expected O, but got Unknown
|
||||
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0185: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_018f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0198: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01da: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0205: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_021a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_021f: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)bakedMesh == (Object)null)
|
||||
{
|
||||
bakedMesh = new Mesh();
|
||||
}
|
||||
else
|
||||
{
|
||||
bakedMesh.Clear();
|
||||
}
|
||||
smr.BakeMesh(bakedMesh);
|
||||
int vertexCount = editableMesh.vertexCount;
|
||||
Vector3 lossyScale = ((Component)smr).transform.lossyScale;
|
||||
Vector3 val = default(Vector3);
|
||||
((Vector3)(ref val))._002Ector(1f / Mathf.Max(lossyScale.x, 1E-08f), 1f / Mathf.Max(lossyScale.y, 1E-08f), 1f / Mathf.Max(lossyScale.z, 1E-08f));
|
||||
worldNoScale = ((Component)smr).transform.localToWorldMatrix * Matrix4x4.Scale(val);
|
||||
worldVertices = (Vector3[])(object)new Vector3[vertexCount];
|
||||
deltasLocal = (Vector3[])(object)new Vector3[vertexCount];
|
||||
for (int i = 0; i < vertexCount; i++)
|
||||
{
|
||||
worldVertices[i] = ((Matrix4x4)(ref worldNoScale)).MultiplyPoint3x4(bakedMesh.vertices[i]);
|
||||
deltasLocal[i] = Vector3.zero;
|
||||
}
|
||||
Vector3[] normals = bakedMesh.normals;
|
||||
Vector4[] tangents = bakedMesh.tangents;
|
||||
bakedWorldNormals = (Vector3[])(object)new Vector3[vertexCount];
|
||||
if (tangents != null && tangents.Length == vertexCount)
|
||||
{
|
||||
bakedWorldTangents = (Vector4[])(object)new Vector4[vertexCount];
|
||||
}
|
||||
else
|
||||
{
|
||||
bakedWorldTangents = null;
|
||||
}
|
||||
for (int j = 0; j < vertexCount; j++)
|
||||
{
|
||||
Vector3[] array = bakedWorldNormals;
|
||||
int num = j;
|
||||
Vector3 val2 = ((Component)smr).transform.TransformDirection(normals[j]);
|
||||
array[num] = ((Vector3)(ref val2)).normalized;
|
||||
if (bakedWorldTangents != null)
|
||||
{
|
||||
val2 = ((Component)smr).transform.TransformDirection(new Vector3(tangents[j].x, tangents[j].y, tangents[j].z));
|
||||
Vector3 normalized = ((Vector3)(ref val2)).normalized;
|
||||
bakedWorldTangents[j] = new Vector4(normalized.x, normalized.y, normalized.z, tangents[j].w);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<int>[] BuildVertexAdjacency(Mesh mesh, float seamThreshold = 0.0001f, float proximityThreshold = 0f)
|
||||
{
|
||||
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0367: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_036c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0370: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_037f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_038e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0461: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_046f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0471: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0290: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0295: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_020f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0511: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0516: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0490: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0495: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02af: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_022c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0231: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0233: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0238: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_052b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0530: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0532: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0537: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_04ad: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_04b2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_04b4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_04b9: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)mesh == (Object)null)
|
||||
{
|
||||
throw new AutoMorpherException("Mesh is Missing", "[VertexAdjacencyUtil] BuildVertexAdjacency\n - mesh is null");
|
||||
}
|
||||
int vertexCount = mesh.vertexCount;
|
||||
int[] triangles = mesh.triangles;
|
||||
Vector3[] vertices = mesh.vertices;
|
||||
List<int>[] array = new List<int>[vertexCount];
|
||||
for (int i = 0; i < vertexCount; i++)
|
||||
{
|
||||
array[i] = new List<int>();
|
||||
}
|
||||
int num = triangles.Length / 3;
|
||||
for (int j = 0; j < num; j++)
|
||||
{
|
||||
int num2 = triangles[j * 3];
|
||||
int num3 = triangles[j * 3 + 1];
|
||||
int num4 = triangles[j * 3 + 2];
|
||||
AddNeighbor(array, num2, num3);
|
||||
AddNeighbor(array, num3, num2);
|
||||
AddNeighbor(array, num3, num4);
|
||||
AddNeighbor(array, num4, num3);
|
||||
AddNeighbor(array, num4, num2);
|
||||
AddNeighbor(array, num2, num4);
|
||||
}
|
||||
Vector3 val4;
|
||||
if (seamThreshold > 0f)
|
||||
{
|
||||
float num5 = seamThreshold * 2f;
|
||||
float num6 = seamThreshold * seamThreshold;
|
||||
Dictionary<Vector3Int, List<int>> dictionary = new Dictionary<Vector3Int, List<int>>();
|
||||
Vector3Int key = default(Vector3Int);
|
||||
for (int k = 0; k < vertexCount; k++)
|
||||
{
|
||||
Vector3 val = vertices[k];
|
||||
((Vector3Int)(ref key))._002Ector(Mathf.FloorToInt(val.x / num5), Mathf.FloorToInt(val.y / num5), Mathf.FloorToInt(val.z / num5));
|
||||
if (!dictionary.TryGetValue(key, out var value))
|
||||
{
|
||||
value = (dictionary[key] = new List<int>());
|
||||
}
|
||||
value.Add(k);
|
||||
}
|
||||
Vector3Int val2 = default(Vector3Int);
|
||||
foreach (KeyValuePair<Vector3Int, List<int>> item in dictionary)
|
||||
{
|
||||
Vector3Int key2 = item.Key;
|
||||
List<int> value2 = item.Value;
|
||||
for (int l = -1; l <= 1; l++)
|
||||
{
|
||||
for (int m = -1; m <= 1; m++)
|
||||
{
|
||||
for (int n = -1; n <= 1; n++)
|
||||
{
|
||||
if (l < 0 || (l == 0 && m < 0) || (l == 0 && m == 0 && n < 0))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
((Vector3Int)(ref val2))._002Ector(((Vector3Int)(ref key2)).x + l, ((Vector3Int)(ref key2)).y + m, ((Vector3Int)(ref key2)).z + n);
|
||||
if (!dictionary.TryGetValue(val2, out var value3))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (val2 == key2)
|
||||
{
|
||||
for (int num7 = 0; num7 < value2.Count; num7++)
|
||||
{
|
||||
int num8 = value2[num7];
|
||||
Vector3 val3 = vertices[num8];
|
||||
for (int num9 = num7 + 1; num9 < value2.Count; num9++)
|
||||
{
|
||||
int num10 = value2[num9];
|
||||
val4 = vertices[num10] - val3;
|
||||
if (((Vector3)(ref val4)).sqrMagnitude <= num6)
|
||||
{
|
||||
AddNeighbor(array, num8, num10);
|
||||
AddNeighbor(array, num10, num8);
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
for (int num11 = 0; num11 < value2.Count; num11++)
|
||||
{
|
||||
int num12 = value2[num11];
|
||||
Vector3 val5 = vertices[num12];
|
||||
for (int num13 = 0; num13 < value3.Count; num13++)
|
||||
{
|
||||
int num14 = value3[num13];
|
||||
val4 = vertices[num14] - val5;
|
||||
if (((Vector3)(ref val4)).sqrMagnitude <= num6)
|
||||
{
|
||||
AddNeighbor(array, num12, num14);
|
||||
AddNeighbor(array, num14, num12);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (proximityThreshold > 0f)
|
||||
{
|
||||
float num15 = proximityThreshold * 2f;
|
||||
float num16 = proximityThreshold * proximityThreshold;
|
||||
Dictionary<Vector3Int, List<int>> dictionary2 = new Dictionary<Vector3Int, List<int>>();
|
||||
Vector3Int key3 = default(Vector3Int);
|
||||
for (int num17 = 0; num17 < vertexCount; num17++)
|
||||
{
|
||||
Vector3 val6 = vertices[num17];
|
||||
((Vector3Int)(ref key3))._002Ector(Mathf.FloorToInt(val6.x / num15), Mathf.FloorToInt(val6.y / num15), Mathf.FloorToInt(val6.z / num15));
|
||||
if (!dictionary2.TryGetValue(key3, out var value4))
|
||||
{
|
||||
value4 = (dictionary2[key3] = new List<int>());
|
||||
}
|
||||
value4.Add(num17);
|
||||
}
|
||||
Vector3Int val7 = default(Vector3Int);
|
||||
foreach (KeyValuePair<Vector3Int, List<int>> item2 in dictionary2)
|
||||
{
|
||||
Vector3Int key4 = item2.Key;
|
||||
List<int> value5 = item2.Value;
|
||||
for (int num18 = -1; num18 <= 1; num18++)
|
||||
{
|
||||
for (int num19 = -1; num19 <= 1; num19++)
|
||||
{
|
||||
for (int num20 = -1; num20 <= 1; num20++)
|
||||
{
|
||||
if (num18 < 0 || (num18 == 0 && num19 < 0) || (num18 == 0 && num19 == 0 && num20 < 0))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
((Vector3Int)(ref val7))._002Ector(((Vector3Int)(ref key4)).x + num18, ((Vector3Int)(ref key4)).y + num19, ((Vector3Int)(ref key4)).z + num20);
|
||||
if (!dictionary2.TryGetValue(val7, out var value6))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (val7 == key4)
|
||||
{
|
||||
for (int num21 = 0; num21 < value5.Count; num21++)
|
||||
{
|
||||
int num22 = value5[num21];
|
||||
Vector3 val8 = vertices[num22];
|
||||
for (int num23 = num21 + 1; num23 < value5.Count; num23++)
|
||||
{
|
||||
int num24 = value5[num23];
|
||||
val4 = vertices[num24] - val8;
|
||||
if (((Vector3)(ref val4)).sqrMagnitude <= num16)
|
||||
{
|
||||
AddNeighbor(array, num22, num24);
|
||||
AddNeighbor(array, num24, num22);
|
||||
}
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
for (int num25 = 0; num25 < value5.Count; num25++)
|
||||
{
|
||||
int num26 = value5[num25];
|
||||
Vector3 val9 = vertices[num26];
|
||||
for (int num27 = 0; num27 < value6.Count; num27++)
|
||||
{
|
||||
int num28 = value6[num27];
|
||||
val4 = vertices[num28] - val9;
|
||||
if (((Vector3)(ref val4)).sqrMagnitude <= num16)
|
||||
{
|
||||
AddNeighbor(array, num26, num28);
|
||||
AddNeighbor(array, num28, num26);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return array;
|
||||
void AddNeighbor(List<int>[] adj, int from, int to)
|
||||
{
|
||||
List<int> list3 = adj[from];
|
||||
if (!list3.Contains(to))
|
||||
{
|
||||
list3.Add(to);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyWorldVerticesToMesh()
|
||||
{
|
||||
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_014c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0151: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_02fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0303: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0308: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_023f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0248: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_024f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0254: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0259: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0268: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0271: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0278: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_027d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0282: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0326: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_032b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_030e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0314: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0319: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_031e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_037e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0380: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0385: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_039f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03d1: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_03d6: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_038b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0391: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0396: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_039b: Unknown result type (might be due to invalid IL or missing references)
|
||||
if ((Object)(object)editableMesh == (Object)null || (Object)(object)smr == (Object)null || worldVertices == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Mesh val = editableMesh;
|
||||
int vertexCount = val.vertexCount;
|
||||
Vector3[] vertices = val.vertices;
|
||||
SkinningUtil skinningUtil = new SkinningUtil();
|
||||
Vector3[] array = null;
|
||||
int blendShapeCount = val.blendShapeCount;
|
||||
if (blendShapeCount > 0)
|
||||
{
|
||||
array = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array2 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array3 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array4 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
for (int i = 0; i < blendShapeCount; i++)
|
||||
{
|
||||
float blendShapeWeight = smr.GetBlendShapeWeight(i);
|
||||
if (Mathf.Approximately(blendShapeWeight, 0f))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int num = val.GetBlendShapeFrameCount(i) - 1;
|
||||
float blendShapeFrameWeight = val.GetBlendShapeFrameWeight(i, num);
|
||||
val.GetBlendShapeFrameVertices(i, num, array2, array3, array4);
|
||||
float num2 = ((blendShapeFrameWeight != 0f) ? (blendShapeWeight / blendShapeFrameWeight) : 0f);
|
||||
if (!Mathf.Approximately(num2, 0f))
|
||||
{
|
||||
for (int j = 0; j < vertexCount; j++)
|
||||
{
|
||||
ref Vector3 reference = ref array[j];
|
||||
reference += array2[j] * num2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int k = 0; k < vertexCount; k++)
|
||||
{
|
||||
Vector3 val2 = skinningUtil.WorldPosToBindPos_Full(smr, val, k, worldVertices[k]);
|
||||
if (array != null)
|
||||
{
|
||||
val2 -= array[k];
|
||||
}
|
||||
vertices[k] = val2;
|
||||
}
|
||||
val.vertices = vertices;
|
||||
Vector3[] array5 = null;
|
||||
Vector3[] array6 = null;
|
||||
if (blendShapeCount > 0)
|
||||
{
|
||||
array5 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
array6 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array7 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array8 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
Vector3[] array9 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
for (int l = 0; l < blendShapeCount; l++)
|
||||
{
|
||||
float blendShapeWeight2 = smr.GetBlendShapeWeight(l);
|
||||
if (Mathf.Approximately(blendShapeWeight2, 0f))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int num3 = val.GetBlendShapeFrameCount(l) - 1;
|
||||
float blendShapeFrameWeight2 = val.GetBlendShapeFrameWeight(l, num3);
|
||||
val.GetBlendShapeFrameVertices(l, num3, array7, array8, array9);
|
||||
float num4 = ((blendShapeFrameWeight2 != 0f) ? (blendShapeWeight2 / blendShapeFrameWeight2) : 0f);
|
||||
if (!Mathf.Approximately(num4, 0f))
|
||||
{
|
||||
for (int m = 0; m < vertexCount; m++)
|
||||
{
|
||||
ref Vector3 reference2 = ref array5[m];
|
||||
reference2 += array8[m] * num4;
|
||||
ref Vector3 reference3 = ref array6[m];
|
||||
reference3 += array9[m] * num4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bakedWorldNormals == null || bakedWorldNormals.Length != vertexCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Vector3[] array10 = (Vector3[])(object)new Vector3[vertexCount];
|
||||
bool flag = bakedWorldTangents != null && bakedWorldTangents.Length == vertexCount;
|
||||
Vector4[] array11 = (Vector4[])(object)(flag ? new Vector4[vertexCount] : null);
|
||||
Vector3 targetWorldDir = default(Vector3);
|
||||
for (int n = 0; n < vertexCount; n++)
|
||||
{
|
||||
Vector3 val3 = skinningUtil.WorldDirToBindDir_Full(smr, val, n, bakedWorldNormals[n]);
|
||||
if (array5 != null)
|
||||
{
|
||||
val3 -= array5[n];
|
||||
}
|
||||
array10[n] = ((Vector3)(ref val3)).normalized;
|
||||
if (flag)
|
||||
{
|
||||
((Vector3)(ref targetWorldDir))._002Ector(bakedWorldTangents[n].x, bakedWorldTangents[n].y, bakedWorldTangents[n].z);
|
||||
Vector3 val4 = skinningUtil.WorldDirToBindDir_Full(smr, val, n, targetWorldDir);
|
||||
if (array6 != null)
|
||||
{
|
||||
val4 -= array6[n];
|
||||
}
|
||||
val4 = ((Vector3)(ref val4)).normalized;
|
||||
array11[n] = new Vector4(val4.x, val4.y, val4.z, bakedWorldTangents[n].w);
|
||||
}
|
||||
}
|
||||
val.normals = array10;
|
||||
if (array11 != null)
|
||||
{
|
||||
val.tangents = array11;
|
||||
}
|
||||
}
|
||||
|
||||
public void BuildEquivalentVerticesFromWorld(float maxDistance = 1E-05f)
|
||||
{
|
||||
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0161: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (worldVertices == null || worldVertices.Length == 0)
|
||||
{
|
||||
Debug.LogWarning((object)"[ClothInstance] BuildEquivalentVerticesFromWorld: worldVertices is null or empty. Call UpdateWorldVertices() first.");
|
||||
return;
|
||||
}
|
||||
int num = worldVertices.Length;
|
||||
if (equivalentVertices == null)
|
||||
{
|
||||
equivalentVertices = new List<List<int>>();
|
||||
}
|
||||
else
|
||||
{
|
||||
equivalentVertices.Clear();
|
||||
}
|
||||
float num2 = maxDistance * maxDistance;
|
||||
Dictionary<Vector3Int, List<int>> dictionary = new Dictionary<Vector3Int, List<int>>();
|
||||
Vector3Int key = default(Vector3Int);
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
Vector3 val = worldVertices[i];
|
||||
((Vector3Int)(ref key))._002Ector(Mathf.FloorToInt(val.x / maxDistance), Mathf.FloorToInt(val.y / maxDistance), Mathf.FloorToInt(val.z / maxDistance));
|
||||
if (!dictionary.TryGetValue(key, out var value))
|
||||
{
|
||||
value = (dictionary[key] = new List<int>());
|
||||
}
|
||||
value.Add(i);
|
||||
}
|
||||
foreach (KeyValuePair<Vector3Int, List<int>> item in dictionary)
|
||||
{
|
||||
List<int> value2 = item.Value;
|
||||
int count = value2.Count;
|
||||
if (count < 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int[] parent = new int[count];
|
||||
for (int j = 0; j < count; j++)
|
||||
{
|
||||
parent[j] = j;
|
||||
}
|
||||
for (int k = 0; k < count; k++)
|
||||
{
|
||||
int num3 = value2[k];
|
||||
Vector3 val2 = worldVertices[num3];
|
||||
for (int l = k + 1; l < count; l++)
|
||||
{
|
||||
int num4 = value2[l];
|
||||
Vector3 val3 = worldVertices[num4];
|
||||
Vector3 val4 = val2 - val3;
|
||||
if (((Vector3)(ref val4)).sqrMagnitude <= num2)
|
||||
{
|
||||
Union(k, l);
|
||||
}
|
||||
}
|
||||
}
|
||||
Dictionary<int, List<int>> dictionary2 = new Dictionary<int, List<int>>();
|
||||
for (int m = 0; m < count; m++)
|
||||
{
|
||||
int key2 = Find(m);
|
||||
if (!dictionary2.TryGetValue(key2, out var value3))
|
||||
{
|
||||
value3 = (dictionary2[key2] = new List<int>());
|
||||
}
|
||||
value3.Add(value2[m]);
|
||||
}
|
||||
foreach (List<int> value4 in dictionary2.Values)
|
||||
{
|
||||
if (value4.Count >= 2)
|
||||
{
|
||||
equivalentVertices.Add(value4);
|
||||
}
|
||||
}
|
||||
int Find(int x)
|
||||
{
|
||||
if (parent[x] != x)
|
||||
{
|
||||
parent[x] = Find(parent[x]);
|
||||
}
|
||||
return parent[x];
|
||||
}
|
||||
void Union(int a, int b)
|
||||
{
|
||||
int num5 = Find(a);
|
||||
int num6 = Find(b);
|
||||
if (num5 != num6)
|
||||
{
|
||||
parent[num6] = num5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
~ClothInstance()
|
||||
{
|
||||
Dispose();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if ((Object)(object)bakedMesh != (Object)null)
|
||||
{
|
||||
Object.DestroyImmediate((Object)(object)bakedMesh);
|
||||
bakedMesh = null;
|
||||
}
|
||||
worldVertices = null;
|
||||
minDistanceVector = null;
|
||||
minDistance = null;
|
||||
deltas = null;
|
||||
deltasLocal = null;
|
||||
isInsideVertex = null;
|
||||
excludedVertices = null;
|
||||
isLeftLegVertex = null;
|
||||
isRightLegVertex = null;
|
||||
vertexAdjacency = null;
|
||||
if (equivalentVertices != null)
|
||||
{
|
||||
for (int i = 0; i < equivalentVertices.Count; i++)
|
||||
{
|
||||
equivalentVertices[i]?.Clear();
|
||||
}
|
||||
equivalentVertices.Clear();
|
||||
equivalentVertices = null;
|
||||
}
|
||||
humanoidMatchedBones = null;
|
||||
smr = null;
|
||||
editableMesh = null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,342 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.ClothInstanceTotal
|
||||
using System.Collections.Generic;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
public class ClothInstanceTotal
|
||||
{
|
||||
private readonly List<ClothInstance> clothInstances;
|
||||
|
||||
public int TotalVertexCount { get; private set; }
|
||||
|
||||
public Vector3[] GlobalPositions { get; private set; }
|
||||
|
||||
public Vector3[] GlobalDeltas { get; private set; }
|
||||
|
||||
public List<int>[] GlobalAdjacencyTopology { get; private set; }
|
||||
|
||||
public List<int>[] GlobalAdjacencyDistance { get; private set; }
|
||||
|
||||
public List<int>[] GlobalAdjacencyMerged { get; private set; }
|
||||
|
||||
public int[] VertexOffsets { get; private set; }
|
||||
|
||||
public ClothInstanceTotal(List<ClothInstance> clothInstances, float distanceBuildRadius, int maxNeighborsPerVertex = 0)
|
||||
{
|
||||
if (clothInstances == null || clothInstances.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instances are Missing", "[ClothInstanceTotal] ClothInstanceTotal\n - clothInstances is null or empty");
|
||||
}
|
||||
if (distanceBuildRadius <= 0f)
|
||||
{
|
||||
throw new AutoMorpherException("Distance Build Radius is Invalid", "[ClothInstanceTotal] ClothInstanceTotal\n - distanceBuildRadius must be > 0");
|
||||
}
|
||||
this.clothInstances = clothInstances;
|
||||
BuildTopologyCache();
|
||||
BuildDistanceAdjacencyCandidates(distanceBuildRadius, maxNeighborsPerVertex);
|
||||
BuildMergedAdjacency();
|
||||
}
|
||||
|
||||
public void SetGlobalDeltas(Vector3[] globalDeltas)
|
||||
{
|
||||
if (globalDeltas == null || globalDeltas.Length != TotalVertexCount)
|
||||
{
|
||||
throw new AutoMorpherException("Global Deltas are Invalid", "[ClothInstanceTotal] SetGlobalDeltas\n - globalDeltas is null or length mismatch");
|
||||
}
|
||||
GlobalDeltas = globalDeltas;
|
||||
}
|
||||
|
||||
public void UpdateGlobalBuffersFromClothInstances()
|
||||
{
|
||||
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
|
||||
ValidateGlobalBufferReady("[ClothInstanceTotal] UpdateGlobalBuffersFromClothInstances");
|
||||
for (int i = 0; i < clothInstances.Count; i++)
|
||||
{
|
||||
ClothInstance clothInstance = clothInstances[i];
|
||||
if (clothInstance != null)
|
||||
{
|
||||
if (clothInstance.worldVertices == null || clothInstance.deltasLocal == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Data is Missing", "[ClothInstanceTotal] UpdateGlobalBuffersFromClothInstances\n - worldVertices or deltasLocal is null");
|
||||
}
|
||||
int num = VertexOffsets[i];
|
||||
int num2 = clothInstance.worldVertices.Length;
|
||||
if (num2 != clothInstance.deltasLocal.Length)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Array Length Mismatch", "[ClothInstanceTotal] UpdateGlobalBuffersFromClothInstances\n - worldVertices.Length != deltasLocal.Length");
|
||||
}
|
||||
for (int j = 0; j < num2; j++)
|
||||
{
|
||||
GlobalPositions[num + j] = clothInstance.worldVertices[j];
|
||||
GlobalDeltas[num + j] = clothInstance.deltasLocal[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ApplyGlobalDeltasToClothInstances()
|
||||
{
|
||||
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
|
||||
ValidateGlobalBufferReady("[ClothInstanceTotal] ApplyGlobalDeltasToClothInstances");
|
||||
for (int i = 0; i < clothInstances.Count; i++)
|
||||
{
|
||||
ClothInstance clothInstance = clothInstances[i];
|
||||
if (clothInstance != null)
|
||||
{
|
||||
if (clothInstance.deltasLocal == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Deltas are Missing", "[ClothInstanceTotal] ApplyGlobalDeltasToClothInstances\n - deltasLocal is null");
|
||||
}
|
||||
int num = VertexOffsets[i];
|
||||
int num2 = clothInstance.deltasLocal.Length;
|
||||
for (int j = 0; j < num2; j++)
|
||||
{
|
||||
clothInstance.deltasLocal[j] = GlobalDeltas[num + j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ValidateGlobalBufferReady(string functionContext)
|
||||
{
|
||||
if (clothInstances == null || clothInstances.Count == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instances are Missing", functionContext + "\n - clothInstances is null or empty");
|
||||
}
|
||||
if (TotalVertexCount <= 0 || GlobalPositions == null || GlobalDeltas == null || VertexOffsets == null || GlobalAdjacencyMerged == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Total Cache is Not Ready", functionContext + "\n - total/global buffers/merged adjacency are not initialized");
|
||||
}
|
||||
}
|
||||
|
||||
private void BuildTopologyCache()
|
||||
{
|
||||
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0128: Unknown result type (might be due to invalid IL or missing references)
|
||||
TotalVertexCount = CalculateTotalVertexCount(clothInstances);
|
||||
if (TotalVertexCount <= 0)
|
||||
{
|
||||
throw new AutoMorpherException("Total Vertex Count is Zero", "[ClothInstanceTotal] BuildTopologyCache\n - TotalVertexCount <= 0");
|
||||
}
|
||||
GlobalPositions = (Vector3[])(object)new Vector3[TotalVertexCount];
|
||||
GlobalDeltas = (Vector3[])(object)new Vector3[TotalVertexCount];
|
||||
GlobalAdjacencyTopology = new List<int>[TotalVertexCount];
|
||||
VertexOffsets = new int[clothInstances.Count];
|
||||
int num = 0;
|
||||
for (int i = 0; i < clothInstances.Count; i++)
|
||||
{
|
||||
ClothInstance clothInstance = clothInstances[i];
|
||||
VertexOffsets[i] = num;
|
||||
if (clothInstance == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (clothInstance.worldVertices == null || clothInstance.deltasLocal == null || clothInstance.vertexAdjacency == null)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Data is Missing", "[ClothInstanceTotal] BuildTopologyCache\n - worldVertices/deltasLocal/vertexAdjacency is null");
|
||||
}
|
||||
int num2 = clothInstance.worldVertices.Length;
|
||||
if (num2 != clothInstance.deltasLocal.Length || num2 != clothInstance.vertexAdjacency.Length)
|
||||
{
|
||||
throw new AutoMorpherException("Cloth Instance Array Length Mismatch", "[ClothInstanceTotal] BuildTopologyCache\n - worldVertices/deltasLocal/vertexAdjacency lengths differ");
|
||||
}
|
||||
for (int j = 0; j < num2; j++)
|
||||
{
|
||||
GlobalPositions[num + j] = clothInstance.worldVertices[j];
|
||||
GlobalDeltas[num + j] = clothInstance.deltasLocal[j];
|
||||
int capacity = clothInstance.vertexAdjacency[j]?.Count ?? 0;
|
||||
GlobalAdjacencyTopology[num + j] = new List<int>(capacity);
|
||||
}
|
||||
for (int k = 0; k < num2; k++)
|
||||
{
|
||||
List<int> list = clothInstance.vertexAdjacency[k];
|
||||
if (list == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
int num3 = num + k;
|
||||
List<int> list2 = GlobalAdjacencyTopology[num3];
|
||||
for (int l = 0; l < list.Count; l++)
|
||||
{
|
||||
int num4 = list[l];
|
||||
if ((uint)num4 >= (uint)num2)
|
||||
{
|
||||
throw new AutoMorpherException("Vertex Adjacency Index is Out of Range", "[ClothInstanceTotal] BuildTopologyCache\n - vertexAdjacency contains invalid neighbor index");
|
||||
}
|
||||
list2.Add(num + num4);
|
||||
}
|
||||
}
|
||||
num += num2;
|
||||
}
|
||||
}
|
||||
|
||||
private void BuildDistanceAdjacencyCandidates(float radius, int maxNeighborsPerVertex)
|
||||
{
|
||||
if (GlobalPositions == null || GlobalPositions.Length == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Reference Positions are Missing", "[ClothInstanceTotal] BuildDistanceAdjacencyCandidates\n - GlobalPositions is null or empty");
|
||||
}
|
||||
GlobalAdjacencyDistance = BuildDistanceAdjacencyCandidatesInternal(GlobalPositions, radius, maxNeighborsPerVertex);
|
||||
}
|
||||
|
||||
private void BuildMergedAdjacency()
|
||||
{
|
||||
if (GlobalAdjacencyTopology == null || GlobalAdjacencyDistance == null)
|
||||
{
|
||||
throw new AutoMorpherException("Adjacency Inputs are Missing", "[ClothInstanceTotal] BuildMergedAdjacency\n - GlobalAdjacencyTopology or GlobalAdjacencyDistance is null");
|
||||
}
|
||||
if (GlobalAdjacencyTopology.Length != GlobalAdjacencyDistance.Length)
|
||||
{
|
||||
throw new AutoMorpherException("Adjacency Length Mismatch", "[ClothInstanceTotal] BuildMergedAdjacency\n - topology and distance adjacency length differ");
|
||||
}
|
||||
int num = GlobalAdjacencyTopology.Length;
|
||||
GlobalAdjacencyMerged = new List<int>[num];
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
List<int> list = new List<int>((GlobalAdjacencyTopology[i]?.Count ?? 0) + (GlobalAdjacencyDistance[i]?.Count ?? 0));
|
||||
HashSet<int> hashSet = new HashSet<int>();
|
||||
List<int> list2 = GlobalAdjacencyTopology[i];
|
||||
if (list2 != null)
|
||||
{
|
||||
for (int j = 0; j < list2.Count; j++)
|
||||
{
|
||||
int num2 = list2[j];
|
||||
if (num2 != i && hashSet.Add(num2))
|
||||
{
|
||||
list.Add(num2);
|
||||
}
|
||||
}
|
||||
}
|
||||
List<int> list3 = GlobalAdjacencyDistance[i];
|
||||
if (list3 != null)
|
||||
{
|
||||
for (int k = 0; k < list3.Count; k++)
|
||||
{
|
||||
int num3 = list3[k];
|
||||
if (num3 != i && hashSet.Add(num3))
|
||||
{
|
||||
list.Add(num3);
|
||||
}
|
||||
}
|
||||
}
|
||||
GlobalAdjacencyMerged[i] = list;
|
||||
}
|
||||
}
|
||||
|
||||
private int CalculateTotalVertexCount(List<ClothInstance> clothInstances)
|
||||
{
|
||||
int num = 0;
|
||||
for (int i = 0; i < clothInstances.Count; i++)
|
||||
{
|
||||
ClothInstance clothInstance = clothInstances[i];
|
||||
if (clothInstance != null && clothInstance.worldVertices != null)
|
||||
{
|
||||
num += clothInstance.worldVertices.Length;
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
private List<int>[] BuildDistanceAdjacencyCandidatesInternal(Vector3[] referencePositions, float radius, int maxNeighborsPerVertex)
|
||||
{
|
||||
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0196: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_019d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
|
||||
if (referencePositions == null || referencePositions.Length == 0)
|
||||
{
|
||||
throw new AutoMorpherException("Reference Positions are Missing", "[ClothInstanceTotal] BuildDistanceAdjacencyCandidatesInternal\n - referencePositions is null or empty");
|
||||
}
|
||||
if (radius <= 0f)
|
||||
{
|
||||
throw new AutoMorpherException("Radius is Invalid", "[ClothInstanceTotal] BuildDistanceAdjacencyCandidatesInternal\n - radius must be > 0");
|
||||
}
|
||||
int num = referencePositions.Length;
|
||||
List<int>[] array = new List<int>[num];
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
array[i] = new List<int>(8);
|
||||
}
|
||||
float num2 = 1f / Mathf.Max(radius, 1E-12f);
|
||||
float num3 = radius * radius;
|
||||
Dictionary<Vector3Int, List<int>> dictionary = new Dictionary<Vector3Int, List<int>>(num);
|
||||
Vector3Int key = default(Vector3Int);
|
||||
for (int j = 0; j < num; j++)
|
||||
{
|
||||
Vector3 val = referencePositions[j];
|
||||
((Vector3Int)(ref key))._002Ector(Mathf.FloorToInt(val.x * num2), Mathf.FloorToInt(val.y * num2), Mathf.FloorToInt(val.z * num2));
|
||||
if (!dictionary.TryGetValue(key, out var value))
|
||||
{
|
||||
value = new List<int>(16);
|
||||
dictionary.Add(key, value);
|
||||
}
|
||||
value.Add(j);
|
||||
}
|
||||
Vector3Int val3 = default(Vector3Int);
|
||||
Vector3Int key2 = default(Vector3Int);
|
||||
for (int k = 0; k < num; k++)
|
||||
{
|
||||
Vector3 val2 = referencePositions[k];
|
||||
((Vector3Int)(ref val3))._002Ector(Mathf.FloorToInt(val2.x * num2), Mathf.FloorToInt(val2.y * num2), Mathf.FloorToInt(val2.z * num2));
|
||||
List<int> list = array[k];
|
||||
for (int l = -1; l <= 1; l++)
|
||||
{
|
||||
for (int m = -1; m <= 1; m++)
|
||||
{
|
||||
for (int n = -1; n <= 1; n++)
|
||||
{
|
||||
((Vector3Int)(ref key2))._002Ector(((Vector3Int)(ref val3)).x + l, ((Vector3Int)(ref val3)).y + m, ((Vector3Int)(ref val3)).z + n);
|
||||
if (!dictionary.TryGetValue(key2, out var value2))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
for (int num4 = 0; num4 < value2.Count; num4++)
|
||||
{
|
||||
int num5 = value2[num4];
|
||||
if (num5 == k)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Vector3 val4 = referencePositions[num5] - val2;
|
||||
if (!(((Vector3)(ref val4)).sqrMagnitude > num3))
|
||||
{
|
||||
list.Add(num5);
|
||||
if (maxNeighborsPerVertex > 0 && list.Count >= maxNeighborsPerVertex)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (maxNeighborsPerVertex > 0 && list.Count >= maxNeighborsPerVertex)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,602 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.EdenAutoMorpher
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
public class EdenAutoMorpher : MonoBehaviour
|
||||
{
|
||||
[SerializeField]
|
||||
public GameObject sourceAvatarObject;
|
||||
|
||||
[SerializeField]
|
||||
public GameObject sourceClothesObject;
|
||||
|
||||
[SerializeField]
|
||||
private List<SkinnedMeshRenderer> sourceBodyMeshes = new List<SkinnedMeshRenderer>();
|
||||
|
||||
[SerializeField]
|
||||
private IReadOnlyList<SkinnedMeshRenderer> sourceBodyMeshesReadOnly = new List<SkinnedMeshRenderer>();
|
||||
|
||||
[SerializeField]
|
||||
public string profileName;
|
||||
|
||||
[SerializeField]
|
||||
public GameObject targetAvatarObject;
|
||||
|
||||
[SerializeField]
|
||||
private GameObject targetClothesObject;
|
||||
|
||||
[SerializeField]
|
||||
private GameObject targetClothesObjectOriginal;
|
||||
|
||||
[SerializeField]
|
||||
private List<SkinnedMeshRenderer> targetBodyMeshes = new List<SkinnedMeshRenderer>();
|
||||
|
||||
[SerializeField]
|
||||
private IReadOnlyList<SkinnedMeshRenderer> targetBodyMeshesReadOnly = new List<SkinnedMeshRenderer>();
|
||||
|
||||
[SerializeField]
|
||||
private float minMargin = 0.003f;
|
||||
|
||||
[SerializeField]
|
||||
private float worldRadius = 0.1f;
|
||||
|
||||
[SerializeField]
|
||||
private float sigma = 0.85f;
|
||||
|
||||
[SerializeField]
|
||||
private int smoothingIteration = 1;
|
||||
|
||||
[SerializeField]
|
||||
private int fittingExpandIteration = 10;
|
||||
|
||||
[SerializeField]
|
||||
private int fittingShrinkIteration = 12;
|
||||
|
||||
[SerializeField]
|
||||
public bool isBodyAutoSetup = true;
|
||||
|
||||
[SerializeField]
|
||||
public bool isReparentAccessoryBonesToTargetAvatar = true;
|
||||
|
||||
[SerializeField]
|
||||
public bool skipFootFitting;
|
||||
|
||||
[SerializeField]
|
||||
public bool transferWeightToAvatar;
|
||||
|
||||
[SerializeField]
|
||||
public bool addAnchorBone = true;
|
||||
|
||||
[SerializeField]
|
||||
public bool armatureBoneScaleCopy;
|
||||
|
||||
[SerializeField]
|
||||
public bool isRemoveAutoMorphedClothes = true;
|
||||
|
||||
private Dictionary<HumanBodyBones, HashSet<Transform>> clothesHumanoidMatchedBones;
|
||||
|
||||
private Dictionary<Transform, ClothBoneType> clothBoneTypeMap;
|
||||
|
||||
private GameObject fittedTargetAvatar;
|
||||
|
||||
private GameObject fittedTargetClothes;
|
||||
|
||||
private const string EditedMeshRootFolder = "Assets/@Eden_Mesh";
|
||||
|
||||
private string tagEdenMorpehrCloth = "EDENAutoMorpher_EditedCloth";
|
||||
|
||||
private bool doProcess;
|
||||
|
||||
private MorpherMode morpherMode;
|
||||
|
||||
private MorpherState morpherState;
|
||||
|
||||
private ProcessInfo processInfo;
|
||||
|
||||
public ProcessInfo GetProcessInfo()
|
||||
{
|
||||
return processInfo;
|
||||
}
|
||||
|
||||
public void ChangeMode(MorpherMode newMode)
|
||||
{
|
||||
morpherMode = newMode;
|
||||
morpherState = MorpherState.Idle;
|
||||
}
|
||||
|
||||
public void StopProcess()
|
||||
{
|
||||
doProcess = false;
|
||||
switch (morpherState)
|
||||
{
|
||||
case MorpherState.Fitting_Doing:
|
||||
morpherState = MorpherState.Idle;
|
||||
break;
|
||||
case MorpherState.Weighting_Doing:
|
||||
morpherState = MorpherState.Fitting_End;
|
||||
break;
|
||||
default:
|
||||
morpherState = MorpherState.Idle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private EdenAutoMorpherConfig SetupConfigData(MorpherMode morpherMode)
|
||||
{
|
||||
EdenAutoMorpherConfig result = default(EdenAutoMorpherConfig);
|
||||
switch (morpherMode)
|
||||
{
|
||||
case MorpherMode.AutoMorpher:
|
||||
case MorpherMode.ManualMorpher:
|
||||
result.sourceAvatarObject = sourceAvatarObject;
|
||||
result.sourceClothesObject = sourceClothesObject;
|
||||
result.sourceBodyMeshes = sourceBodyMeshesReadOnly;
|
||||
result.profileName = string.Empty;
|
||||
break;
|
||||
case MorpherMode.ProfileMorpher:
|
||||
result.sourceAvatarObject = null;
|
||||
result.sourceClothesObject = sourceClothesObject;
|
||||
result.sourceBodyMeshes = null;
|
||||
result.profileName = profileName;
|
||||
break;
|
||||
default:
|
||||
result.sourceAvatarObject = null;
|
||||
result.sourceClothesObject = null;
|
||||
result.sourceBodyMeshes = null;
|
||||
result.profileName = string.Empty;
|
||||
break;
|
||||
}
|
||||
result.targetAvatarObject = targetAvatarObject;
|
||||
result.targetClothesObject = targetClothesObject;
|
||||
result.targetBodyMeshes = targetBodyMeshesReadOnly;
|
||||
result.minMargin = minMargin;
|
||||
result.worldRadius = worldRadius;
|
||||
result.sigma = sigma;
|
||||
result.smoothingIteration = smoothingIteration;
|
||||
result.fittingExpandIteration = fittingExpandIteration;
|
||||
result.fittingShrinkIteration = fittingShrinkIteration;
|
||||
result.isBodyAutoSetup = isBodyAutoSetup;
|
||||
result.isReparentAccessoryBonesToTargetAvatar = isReparentAccessoryBonesToTargetAvatar;
|
||||
result.skipFootFitting = skipFootFitting;
|
||||
result.clothesHumanoidMatchedBones = clothesHumanoidMatchedBones;
|
||||
result.clothBoneTypeMap = clothBoneTypeMap;
|
||||
result.tagEdenMorpehrCloth = tagEdenMorpehrCloth;
|
||||
result.transferWeightToAvatar = transferWeightToAvatar;
|
||||
result.addAnchorBone = addAnchorBone;
|
||||
result.armatureBoneScaleCopy = armatureBoneScaleCopy;
|
||||
result.isRemoveAutoMorphedClothes = isRemoveAutoMorphedClothes;
|
||||
return result;
|
||||
}
|
||||
|
||||
public void AutoPoseSetup(MorpherMode morpherMode)
|
||||
{
|
||||
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
|
||||
TransformInfo transformInfo = new TransformInfo(sourceAvatarObject.transform);
|
||||
TransformInfo transformInfo2 = new TransformInfo(targetAvatarObject.transform);
|
||||
try
|
||||
{
|
||||
EdenAutoMorpher_SetUpUtil edenAutoMorpher_SetUpUtil = new EdenAutoMorpher_SetUpUtil();
|
||||
sourceBodyMeshesReadOnly = edenAutoMorpher_SetUpUtil.SetupBodyMeshes(sourceAvatarObject, isBodyAutoSetup, sourceBodyMeshes, "Source ").AsReadOnly();
|
||||
targetBodyMeshesReadOnly = edenAutoMorpher_SetUpUtil.SetupBodyMeshes(targetAvatarObject, isBodyAutoSetup, targetBodyMeshes, "Target ").AsReadOnly();
|
||||
targetAvatarObject.transform.SetParent((Transform)null, true);
|
||||
targetAvatarObject.transform.localRotation = Quaternion.identity;
|
||||
sourceAvatarObject.transform.SetParent((Transform)null, true);
|
||||
sourceAvatarObject.transform.localRotation = Quaternion.identity;
|
||||
EdenAutoMorpherConfig config = SetupConfigData(morpherMode);
|
||||
new EdenAutoMorpher_SetUpUtil().AutoSetup(ref config, out clothesHumanoidMatchedBones, out clothBoneTypeMap);
|
||||
targetClothesObject = config.targetClothesObject;
|
||||
targetClothesObjectOriginal = targetClothesObject;
|
||||
}
|
||||
finally
|
||||
{
|
||||
transformInfo.ApplyToTransform(sourceAvatarObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
transformInfo2.ApplyToTransform(targetAvatarObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
}
|
||||
}
|
||||
|
||||
public void ProfileSetup(MorpherMode morpherMode)
|
||||
{
|
||||
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
|
||||
TransformInfo transformInfo = new TransformInfo(sourceClothesObject.transform);
|
||||
TransformInfo transformInfo2 = new TransformInfo(targetAvatarObject.transform);
|
||||
try
|
||||
{
|
||||
EdenAutoMorpher_SetUpUtil edenAutoMorpher_SetUpUtil = new EdenAutoMorpher_SetUpUtil();
|
||||
targetBodyMeshesReadOnly = edenAutoMorpher_SetUpUtil.SetupBodyMeshes(targetAvatarObject, isBodyAutoSetup, targetBodyMeshes, "Target ").AsReadOnly();
|
||||
targetAvatarObject.transform.SetParent((Transform)null, true);
|
||||
targetAvatarObject.transform.localRotation = Quaternion.identity;
|
||||
sourceClothesObject.transform.SetParent((Transform)null, true);
|
||||
sourceClothesObject.transform.localScale = Vector3.one;
|
||||
sourceClothesObject.transform.localRotation = Quaternion.identity;
|
||||
EdenAutoMorpherConfig config = SetupConfigData(morpherMode);
|
||||
new EdenAutoMorpher_SetUpUtil().ProfileAutoSetup(ref config, out clothesHumanoidMatchedBones, out clothBoneTypeMap);
|
||||
targetClothesObject = config.targetClothesObject;
|
||||
targetClothesObjectOriginal = targetClothesObject;
|
||||
}
|
||||
finally
|
||||
{
|
||||
transformInfo.ApplyToTransform(sourceClothesObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
transformInfo2.ApplyToTransform(targetAvatarObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerator AutoMorphingEnumerator(MorpherMode morpherMode)
|
||||
{
|
||||
doProcess = true;
|
||||
yield return null;
|
||||
ProcessInfoDebug(morpherMode, "Run ALL");
|
||||
morpherState = MorpherState.Fitting_Doing;
|
||||
IEnumerator fitEnum = null;
|
||||
this.morpherMode = morpherMode;
|
||||
yield return null;
|
||||
Debug.Log((object)"[Eden Auto Morpher] Run ALL - Start Fitting");
|
||||
switch (morpherMode)
|
||||
{
|
||||
case MorpherMode.AutoMorpher:
|
||||
fitEnum = AutoFitting(morpherMode);
|
||||
break;
|
||||
case MorpherMode.ManualMorpher:
|
||||
fitEnum = ManualFitting(morpherMode);
|
||||
break;
|
||||
case MorpherMode.ProfileMorpher:
|
||||
fitEnum = ProfileFitting(morpherMode);
|
||||
break;
|
||||
default:
|
||||
Debug.LogError((object)"Unknown Mode Index");
|
||||
break;
|
||||
}
|
||||
while (fitEnum != null && fitEnum.MoveNext() && doProcess)
|
||||
{
|
||||
yield return fitEnum.Current;
|
||||
}
|
||||
morpherState = MorpherState.Fitting_End;
|
||||
yield return null;
|
||||
morpherState = MorpherState.Weighting_Doing;
|
||||
yield return null;
|
||||
Debug.Log((object)"[Eden Auto Morpher] Run ALL - Start Weighting");
|
||||
using (EdenAutoMorpherManager eamManager = new EdenAutoMorpherManager())
|
||||
{
|
||||
EdenAutoMorpherConfig config = SetupConfigData(morpherMode);
|
||||
IEnumerator eamFitting = eamManager.WeightingEnumerator(config);
|
||||
while (eamFitting.MoveNext() && doProcess)
|
||||
{
|
||||
ref string title = ref processInfo.title;
|
||||
ref string text = ref processInfo.text;
|
||||
ref float progress = ref processInfo.progress;
|
||||
(title, text, progress) = eamManager.GetProgressInfo();
|
||||
yield return eamFitting.Current;
|
||||
}
|
||||
}
|
||||
yield return null;
|
||||
doProcess = false;
|
||||
morpherState = MorpherState.Idle;
|
||||
Debug.Log((object)"[Eden Auto Morpher] Ended Run ALL");
|
||||
yield return null;
|
||||
}
|
||||
|
||||
public IEnumerator FittingEnumerator(MorpherMode morpherMode)
|
||||
{
|
||||
doProcess = true;
|
||||
ref string title = ref processInfo.title;
|
||||
ref string text = ref processInfo.text;
|
||||
ref float progress = ref processInfo.progress;
|
||||
title = "Setup Avatar Pose";
|
||||
text = "Calculating avatar shape and skeletal data.";
|
||||
progress = 0f;
|
||||
yield return null;
|
||||
ProcessInfoDebug(morpherMode, "Fitting");
|
||||
yield return null;
|
||||
morpherState = MorpherState.Fitting_Doing;
|
||||
IEnumerator fitEnum = null;
|
||||
this.morpherMode = morpherMode;
|
||||
yield return null;
|
||||
switch (morpherMode)
|
||||
{
|
||||
case MorpherMode.AutoMorpher:
|
||||
fitEnum = AutoFitting(morpherMode);
|
||||
break;
|
||||
case MorpherMode.ManualMorpher:
|
||||
fitEnum = ManualFitting(morpherMode);
|
||||
break;
|
||||
case MorpherMode.ProfileMorpher:
|
||||
fitEnum = ProfileFitting(morpherMode);
|
||||
break;
|
||||
default:
|
||||
Debug.LogError((object)"Unknown Mode Index");
|
||||
break;
|
||||
}
|
||||
while (fitEnum != null && fitEnum.MoveNext() && doProcess)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
morpherState = MorpherState.Fitting_End;
|
||||
yield return null;
|
||||
doProcess = false;
|
||||
Debug.Log((object)"[Eden Auto Morpher] Ended Fitting");
|
||||
yield return null;
|
||||
}
|
||||
|
||||
public IEnumerator WeightingEnumerator()
|
||||
{
|
||||
morpherState = MorpherState.Weighting_Doing;
|
||||
doProcess = true;
|
||||
yield return null;
|
||||
ProcessInfoDebug(morpherMode, "Weighting");
|
||||
using (EdenAutoMorpherManager eamManager = new EdenAutoMorpherManager())
|
||||
{
|
||||
EdenAutoMorpherConfig config = SetupConfigData(MorpherMode.ETC);
|
||||
IEnumerator eamFitting = eamManager.WeightingEnumerator(config);
|
||||
while (eamFitting.MoveNext() && doProcess)
|
||||
{
|
||||
ref string title = ref processInfo.title;
|
||||
ref string text = ref processInfo.text;
|
||||
ref float progress = ref processInfo.progress;
|
||||
(title, text, progress) = eamManager.GetProgressInfo();
|
||||
yield return eamFitting.Current;
|
||||
}
|
||||
}
|
||||
yield return null;
|
||||
doProcess = false;
|
||||
morpherState = MorpherState.Idle;
|
||||
Debug.Log((object)"[Eden Auto Morpher] Ended Weighting");
|
||||
yield return null;
|
||||
}
|
||||
|
||||
public IEnumerator AutoFitting(MorpherMode morpherMode)
|
||||
{
|
||||
TransformInfo sourceAvatarInfo = new TransformInfo(sourceAvatarObject.transform);
|
||||
TransformInfo targetAvatarInfo = new TransformInfo(targetAvatarObject.transform);
|
||||
try
|
||||
{
|
||||
EdenAutoMorpher_SetUpUtil edenAutoMorpher_SetUpUtil = new EdenAutoMorpher_SetUpUtil();
|
||||
sourceBodyMeshesReadOnly = edenAutoMorpher_SetUpUtil.SetupBodyMeshes(sourceAvatarObject, isBodyAutoSetup, sourceBodyMeshes, "Source ").AsReadOnly();
|
||||
targetBodyMeshesReadOnly = edenAutoMorpher_SetUpUtil.SetupBodyMeshes(targetAvatarObject, isBodyAutoSetup, targetBodyMeshes, "Target ").AsReadOnly();
|
||||
targetAvatarObject.transform.SetParent((Transform)null, true);
|
||||
targetAvatarObject.transform.localRotation = Quaternion.identity;
|
||||
sourceAvatarObject.transform.SetParent((Transform)null, true);
|
||||
sourceAvatarObject.transform.localRotation = Quaternion.identity;
|
||||
EdenAutoMorpherConfig configData = SetupConfigData(morpherMode);
|
||||
new EdenAutoMorpher_SetUpUtil().AutoSetup(ref configData, out clothesHumanoidMatchedBones, out clothBoneTypeMap);
|
||||
targetClothesObject = configData.targetClothesObject;
|
||||
targetClothesObjectOriginal = targetClothesObject;
|
||||
yield return null;
|
||||
fittedTargetAvatar = null;
|
||||
fittedTargetClothes = null;
|
||||
yield return null;
|
||||
configData = SetupConfigData(morpherMode);
|
||||
using (EdenAutoMorpherManager eamManager = new EdenAutoMorpherManager())
|
||||
{
|
||||
IEnumerator eamFitting = eamManager.FittingIteration(configData, morpherMode);
|
||||
while (eamFitting.MoveNext() && doProcess)
|
||||
{
|
||||
ref string title = ref processInfo.title;
|
||||
ref string text = ref processInfo.text;
|
||||
ref float progress = ref processInfo.progress;
|
||||
(title, text, progress) = eamManager.GetProgressInfo();
|
||||
yield return eamFitting.Current;
|
||||
}
|
||||
}
|
||||
fittedTargetAvatar = configData.targetAvatarObject;
|
||||
fittedTargetClothes = configData.targetClothesObject;
|
||||
}
|
||||
finally
|
||||
{
|
||||
EdenAutoMorpher edenAutoMorpher = this;
|
||||
sourceAvatarInfo.ApplyToTransform(edenAutoMorpher.sourceAvatarObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
targetAvatarInfo.ApplyToTransform(edenAutoMorpher.targetAvatarObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
}
|
||||
yield return null;
|
||||
}
|
||||
|
||||
public IEnumerator ManualFitting(MorpherMode morpherMode)
|
||||
{
|
||||
TransformInfo sourceAvatarInfo = new TransformInfo(sourceAvatarObject.transform);
|
||||
TransformInfo targetAvatarInfo = new TransformInfo(targetAvatarObject.transform);
|
||||
try
|
||||
{
|
||||
EdenAutoMorpher_SetUpUtil edenAutoMorpher_SetUpUtil = new EdenAutoMorpher_SetUpUtil();
|
||||
sourceBodyMeshesReadOnly = edenAutoMorpher_SetUpUtil.SetupBodyMeshes(sourceAvatarObject, isBodyAutoSetup, sourceBodyMeshes, "Source ").AsReadOnly();
|
||||
targetBodyMeshesReadOnly = edenAutoMorpher_SetUpUtil.SetupBodyMeshes(targetAvatarObject, isBodyAutoSetup, targetBodyMeshes, "Target ").AsReadOnly();
|
||||
targetClothesObject = targetClothesObjectOriginal;
|
||||
EdenAutoMorpherConfig configData = SetupConfigData(morpherMode);
|
||||
new EdenAutoMorpher_SetUpUtil().ManulSetup(ref configData, out clothesHumanoidMatchedBones, out clothBoneTypeMap);
|
||||
yield return null;
|
||||
fittedTargetAvatar = null;
|
||||
fittedTargetClothes = null;
|
||||
configData = SetupConfigData(morpherMode);
|
||||
using (EdenAutoMorpherManager eamManager = new EdenAutoMorpherManager())
|
||||
{
|
||||
IEnumerator eamFitting = eamManager.FittingIteration(configData, morpherMode);
|
||||
while (eamFitting.MoveNext() && doProcess)
|
||||
{
|
||||
ref string title = ref processInfo.title;
|
||||
ref string text = ref processInfo.text;
|
||||
ref float progress = ref processInfo.progress;
|
||||
(title, text, progress) = eamManager.GetProgressInfo();
|
||||
yield return eamFitting.Current;
|
||||
}
|
||||
}
|
||||
fittedTargetAvatar = configData.targetAvatarObject;
|
||||
fittedTargetClothes = configData.targetClothesObject;
|
||||
}
|
||||
finally
|
||||
{
|
||||
EdenAutoMorpher edenAutoMorpher = this;
|
||||
sourceAvatarInfo.ApplyToTransform(edenAutoMorpher.sourceAvatarObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
targetAvatarInfo.ApplyToTransform(edenAutoMorpher.targetAvatarObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
}
|
||||
yield return null;
|
||||
}
|
||||
|
||||
public IEnumerator ProfileFitting(MorpherMode morpherMode)
|
||||
{
|
||||
TransformInfo sourceClothesInfo = new TransformInfo(sourceClothesObject.transform);
|
||||
TransformInfo targetAvatarInfo = new TransformInfo(targetAvatarObject.transform);
|
||||
try
|
||||
{
|
||||
EdenAutoMorpher_SetUpUtil edenAutoMorpher_SetUpUtil = new EdenAutoMorpher_SetUpUtil();
|
||||
targetBodyMeshesReadOnly = edenAutoMorpher_SetUpUtil.SetupBodyMeshes(targetAvatarObject, isBodyAutoSetup, targetBodyMeshes, "Target ").AsReadOnly();
|
||||
targetAvatarObject.transform.SetParent((Transform)null, true);
|
||||
targetAvatarObject.transform.localRotation = Quaternion.identity;
|
||||
sourceClothesObject.transform.SetParent((Transform)null, true);
|
||||
sourceClothesObject.transform.localScale = Vector3.one;
|
||||
sourceClothesObject.transform.localRotation = Quaternion.identity;
|
||||
EdenAutoMorpherConfig configData = SetupConfigData(morpherMode);
|
||||
new EdenAutoMorpher_SetUpUtil().ProfileAutoSetup(ref configData, out clothesHumanoidMatchedBones, out clothBoneTypeMap);
|
||||
targetClothesObject = configData.targetClothesObject;
|
||||
targetClothesObjectOriginal = targetClothesObject;
|
||||
yield return null;
|
||||
fittedTargetAvatar = null;
|
||||
fittedTargetClothes = null;
|
||||
yield return null;
|
||||
configData = SetupConfigData(morpherMode);
|
||||
using (EdenAutoMorpherManager eamManager = new EdenAutoMorpherManager())
|
||||
{
|
||||
IEnumerator eamFitting = eamManager.FittingIteration(configData, morpherMode);
|
||||
while (eamFitting.MoveNext() && doProcess)
|
||||
{
|
||||
ref string title = ref processInfo.title;
|
||||
ref string text = ref processInfo.text;
|
||||
ref float progress = ref processInfo.progress;
|
||||
(title, text, progress) = eamManager.GetProgressInfo();
|
||||
yield return eamFitting.Current;
|
||||
}
|
||||
}
|
||||
fittedTargetAvatar = configData.targetAvatarObject;
|
||||
fittedTargetClothes = configData.targetClothesObject;
|
||||
yield return null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
EdenAutoMorpher edenAutoMorpher = this;
|
||||
sourceClothesInfo.ApplyToTransform(edenAutoMorpher.sourceClothesObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
targetAvatarInfo.ApplyToTransform(edenAutoMorpher.targetAvatarObject.transform, applyParent: true, applyPosition: false, applyRotation: true, applyScale: true);
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsWeightingReady(bool isAutoMode)
|
||||
{
|
||||
bool flag = morpherState == MorpherState.Fitting_End && (Object)(object)fittedTargetAvatar != (Object)null && (Object)(object)fittedTargetAvatar == (Object)(object)targetAvatarObject;
|
||||
if (!isAutoMode)
|
||||
{
|
||||
flag = flag && (Object)(object)fittedTargetClothes == (Object)(object)targetClothesObjectOriginal;
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
private void ProcessInfoDebug(MorpherMode morpherMode, string processType)
|
||||
{
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.AppendLine($"Start Process [{processType} / {morpherMode}]");
|
||||
EdenAutoMorpherConfig edenAutoMorpherConfig = SetupConfigData(morpherMode);
|
||||
string text = (((Object)(object)edenAutoMorpherConfig.sourceAvatarObject != (Object)null) ? ((Object)edenAutoMorpherConfig.sourceAvatarObject).name : "null");
|
||||
string text2 = (((Object)(object)edenAutoMorpherConfig.sourceClothesObject != (Object)null) ? ((Object)edenAutoMorpherConfig.sourceClothesObject).name : "null");
|
||||
string text3 = (((Object)(object)edenAutoMorpherConfig.targetAvatarObject != (Object)null) ? ((Object)edenAutoMorpherConfig.targetAvatarObject).name : "null");
|
||||
string text4 = (((Object)(object)edenAutoMorpherConfig.targetClothesObject != (Object)null) ? ((Object)edenAutoMorpherConfig.targetClothesObject).name : "null");
|
||||
stringBuilder.AppendLine("[Objects]");
|
||||
if (morpherMode == MorpherMode.ProfileMorpher)
|
||||
{
|
||||
stringBuilder.AppendLine("- profileName: " + (string.IsNullOrEmpty(edenAutoMorpherConfig.profileName) ? "null/empty" : edenAutoMorpherConfig.profileName));
|
||||
}
|
||||
stringBuilder.AppendLine("- sourceAvatarObject: " + text);
|
||||
stringBuilder.AppendLine("- sourceClothesObject: " + text2);
|
||||
if ((Object)(object)edenAutoMorpherConfig.sourceClothesObject != (Object)null)
|
||||
{
|
||||
SkinnedMeshRenderer[] componentsInChildren = edenAutoMorpherConfig.sourceClothesObject.GetComponentsInChildren<SkinnedMeshRenderer>(true);
|
||||
stringBuilder.AppendLine($" - sourceClothes SkinnedMeshRenderers Count: {componentsInChildren.Length}");
|
||||
int num = Mathf.Min(componentsInChildren.Length, 10);
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
SkinnedMeshRenderer val = componentsInChildren[i];
|
||||
string text5 = (((Object)(object)val != (Object)null) ? ((Object)val).name : "null");
|
||||
string text6 = (((Object)(object)val != (Object)null && (Object)(object)val.rootBone != (Object)null) ? ((Object)val.rootBone).name : "null");
|
||||
string text7 = (((Object)(object)val != (Object)null && (Object)(object)val.sharedMesh != (Object)null) ? ((Object)val.sharedMesh).name : "null");
|
||||
stringBuilder.AppendLine($" - [{i}] SMR: {text5} / rootBone: {text6} / mesh: {text7}");
|
||||
}
|
||||
if (componentsInChildren.Length > num)
|
||||
{
|
||||
stringBuilder.AppendLine($" - ... ({componentsInChildren.Length - num} more)");
|
||||
}
|
||||
}
|
||||
stringBuilder.AppendLine("- targetAvatarObject: " + text3);
|
||||
stringBuilder.AppendLine("- targetClothesObject: " + text4);
|
||||
if ((Object)(object)edenAutoMorpherConfig.targetClothesObject != (Object)null)
|
||||
{
|
||||
SkinnedMeshRenderer[] componentsInChildren2 = edenAutoMorpherConfig.targetClothesObject.GetComponentsInChildren<SkinnedMeshRenderer>(true);
|
||||
stringBuilder.AppendLine($" - targetClothes SkinnedMeshRenderers Count: {componentsInChildren2.Length}");
|
||||
int num2 = Mathf.Min(componentsInChildren2.Length, 10);
|
||||
for (int j = 0; j < num2; j++)
|
||||
{
|
||||
SkinnedMeshRenderer val2 = componentsInChildren2[j];
|
||||
string text8 = (((Object)(object)val2 != (Object)null) ? ((Object)val2).name : "null");
|
||||
string text9 = (((Object)(object)val2 != (Object)null && (Object)(object)val2.rootBone != (Object)null) ? ((Object)val2.rootBone).name : "null");
|
||||
string text10 = (((Object)(object)val2 != (Object)null && (Object)(object)val2.sharedMesh != (Object)null) ? ((Object)val2.sharedMesh).name : "null");
|
||||
stringBuilder.AppendLine($" - [{j}] SMR: {text8} / rootBone: {text9} / mesh: {text10}");
|
||||
}
|
||||
if (componentsInChildren2.Length > num2)
|
||||
{
|
||||
stringBuilder.AppendLine($" - ... ({componentsInChildren2.Length - num2} more)");
|
||||
}
|
||||
}
|
||||
stringBuilder.AppendLine();
|
||||
stringBuilder.AppendLine("[Body Meshes]");
|
||||
stringBuilder.AppendLine($"- isBodyAutoSetup: {edenAutoMorpherConfig.isBodyAutoSetup}");
|
||||
if (!edenAutoMorpherConfig.isBodyAutoSetup)
|
||||
{
|
||||
if (edenAutoMorpherConfig.sourceBodyMeshes == null)
|
||||
{
|
||||
stringBuilder.AppendLine("- sourceBodyMeshes: null");
|
||||
}
|
||||
else
|
||||
{
|
||||
stringBuilder.AppendLine($"- sourceBodyMeshes Count: {sourceBodyMeshes.Count}");
|
||||
for (int k = 0; k < sourceBodyMeshes.Count; k++)
|
||||
{
|
||||
SkinnedMeshRenderer val3 = sourceBodyMeshes[k];
|
||||
string text11 = (((Object)(object)val3 != (Object)null) ? ((Object)val3).name : "null");
|
||||
string text12 = (((Object)(object)val3 != (Object)null && (Object)(object)val3.rootBone != (Object)null) ? ((Object)val3.rootBone).name : "null");
|
||||
string text13 = (((Object)(object)val3 != (Object)null && (Object)(object)val3.sharedMesh != (Object)null) ? ((Object)val3.sharedMesh).name : "null");
|
||||
stringBuilder.AppendLine($" - [{k}] SMR: {text11} / rootBone: {text12} / mesh: {text13}");
|
||||
}
|
||||
}
|
||||
if (targetBodyMeshes == null)
|
||||
{
|
||||
stringBuilder.AppendLine("- targetBodyMeshes: null");
|
||||
}
|
||||
else
|
||||
{
|
||||
stringBuilder.AppendLine($"- targetBodyMeshes Count: {targetBodyMeshes.Count}");
|
||||
for (int l = 0; l < targetBodyMeshes.Count; l++)
|
||||
{
|
||||
SkinnedMeshRenderer val4 = targetBodyMeshes[l];
|
||||
string text14 = (((Object)(object)val4 != (Object)null) ? ((Object)val4).name : "null");
|
||||
string text15 = (((Object)(object)val4 != (Object)null && (Object)(object)val4.rootBone != (Object)null) ? ((Object)val4.rootBone).name : "null");
|
||||
string text16 = (((Object)(object)val4 != (Object)null && (Object)(object)val4.sharedMesh != (Object)null) ? ((Object)val4.sharedMesh).name : "null");
|
||||
stringBuilder.AppendLine($" - [{l}] SMR: {text14} / rootBone: {text15} / mesh: {text16}");
|
||||
}
|
||||
}
|
||||
}
|
||||
stringBuilder.AppendLine();
|
||||
stringBuilder.AppendLine("[Parameters]");
|
||||
stringBuilder.AppendLine($"- minMargin: {edenAutoMorpherConfig.minMargin}");
|
||||
stringBuilder.AppendLine($"- worldRadius: {edenAutoMorpherConfig.worldRadius}");
|
||||
stringBuilder.AppendLine($"- sigma: {edenAutoMorpherConfig.sigma}");
|
||||
stringBuilder.AppendLine($"- smoothingIteration: {edenAutoMorpherConfig.smoothingIteration}");
|
||||
stringBuilder.AppendLine($"- fittingExpandIteration: {edenAutoMorpherConfig.fittingExpandIteration}");
|
||||
stringBuilder.AppendLine($"- fittingShrinkIteration: {edenAutoMorpherConfig.fittingShrinkIteration}");
|
||||
stringBuilder.AppendLine();
|
||||
stringBuilder.AppendLine("[Options]");
|
||||
stringBuilder.AppendLine($"- isReparentAccessoryBonesToTargetAvatar: {edenAutoMorpherConfig.isReparentAccessoryBonesToTargetAvatar}");
|
||||
stringBuilder.AppendLine($"- skipFootFitting: {edenAutoMorpherConfig.skipFootFitting}");
|
||||
Debug.Log((object)stringBuilder.ToString());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts,
|
||||
// for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies.
|
||||
// EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
// Eden.AutoMorpher.EdenAutoMorpherConfig
|
||||
using System.Collections.Generic;
|
||||
using Eden.AutoMorpher;
|
||||
using UnityEngine;
|
||||
|
||||
public struct EdenAutoMorpherConfig
|
||||
{
|
||||
public GameObject sourceAvatarObject;
|
||||
|
||||
public GameObject sourceClothesObject;
|
||||
|
||||
public IReadOnlyList<SkinnedMeshRenderer> sourceBodyMeshes;
|
||||
|
||||
public GameObject targetAvatarObject;
|
||||
|
||||
public GameObject targetClothesObject;
|
||||
|
||||
public IReadOnlyList<SkinnedMeshRenderer> targetBodyMeshes;
|
||||
|
||||
public string profileName;
|
||||
|
||||
public float minMargin;
|
||||
|
||||
public float worldRadius;
|
||||
|
||||
public float sigma;
|
||||
|
||||
public int smoothingIteration;
|
||||
|
||||
public int fittingExpandIteration;
|
||||
|
||||
public int fittingShrinkIteration;
|
||||
|
||||
public bool isBodyAutoSetup;
|
||||
|
||||
public bool isReparentAccessoryBonesToTargetAvatar;
|
||||
|
||||
public bool skipFootFitting;
|
||||
|
||||
public bool isRemoveAutoMorphedClothes;
|
||||
|
||||
public bool transferWeightToAvatar;
|
||||
|
||||
public bool addAnchorBone;
|
||||
|
||||
public bool armatureBoneScaleCopy;
|
||||
|
||||
public Dictionary<HumanBodyBones, HashSet<Transform>> clothesHumanoidMatchedBones;
|
||||
|
||||
public Dictionary<Transform, ClothBoneType> clothBoneTypeMap;
|
||||
|
||||
public string tagEdenMorpehrCloth;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user