您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
91 行
2.2 KiB
91 行
2.2 KiB
using System;
|
|
using UnityEngine;
|
|
using Unity.Collections.LowLevel.Unsafe;
|
|
|
|
namespace Unity.DemoTeam.DigitalHuman
|
|
{
|
|
[CreateAssetMenu(menuName = "Digital Human/Skin Attachment Data")]
|
|
[PreferBinarySerialization]
|
|
public class SkinAttachmentData : ScriptableObject
|
|
{
|
|
//[HideInInspector]
|
|
//public int driverChecksum = -1;
|
|
[HideInInspector]
|
|
public int driverVertexCount = 0;
|
|
|
|
[HideInInspector]
|
|
public ulong checksum0 = 0;
|
|
[HideInInspector]
|
|
public ulong checksum1 = 0;
|
|
|
|
[HideInInspector]
|
|
public SkinAttachmentPose[] pose = new SkinAttachmentPose[131072];
|
|
public int poseCount = 0;
|
|
|
|
[HideInInspector]
|
|
public SkinAttachmentItem[] item = new SkinAttachmentItem[16384];
|
|
public int itemCount = 0;
|
|
|
|
[HideInInspector]
|
|
public int subjectCount = 0;
|
|
|
|
public Hash128 Checksum()
|
|
{
|
|
return new Hash128(checksum0, checksum1);
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
driverVertexCount = 0;
|
|
checksum0 = 0;
|
|
checksum1 = 0;
|
|
poseCount = 0;
|
|
itemCount = 0;
|
|
subjectCount = 0;
|
|
}
|
|
|
|
public void Persist()
|
|
{
|
|
unsafe
|
|
{
|
|
fixed (SkinAttachmentPose* ptrPose = pose)
|
|
fixed (SkinAttachmentItem* ptrItem = item)
|
|
fixed (ulong* ptrChecksum0 = &checksum0)
|
|
fixed (ulong* ptrChecksum1 = &checksum1)
|
|
{
|
|
HashUnsafeUtilities.ComputeHash128(ptrPose, (ulong)(sizeof(SkinAttachmentPose) * poseCount), ptrChecksum0, ptrChecksum1);
|
|
HashUnsafeUtilities.ComputeHash128(ptrItem, (ulong)(sizeof(SkinAttachmentItem) * itemCount), ptrChecksum0, ptrChecksum1);
|
|
Debug.LogFormat("SkinAttachmentData changed, new checksum = '{0}' ({1} poses, {2} items)", Checksum(), poseCount, itemCount);
|
|
}
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
UnityEditor.EditorUtility.SetDirty(this);
|
|
UnityEditor.AssetDatabase.SaveAssets();
|
|
UnityEditor.Undo.ClearUndo(this);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public struct SkinAttachmentPose
|
|
{
|
|
public int v0;
|
|
public int v1;
|
|
public int v2;
|
|
public float area;
|
|
public float targetDist;
|
|
public Barycentric targetCoord;
|
|
}
|
|
|
|
[Serializable]
|
|
public struct SkinAttachmentItem
|
|
{
|
|
public int poseIndex;
|
|
public int poseCount;
|
|
public int baseVertex;
|
|
public Vector3 baseNormal;
|
|
public Vector3 targetNormal;
|
|
public Vector3 targetOffset;//TODO split this into leaf type item that doesn't perform full resolve
|
|
}
|
|
}
|