您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

131 行
3.4 KiB

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
namespace Unity.DemoTeam.DigitalHuman
{
public static class SkinDeformationClipRegions
{
private static bool active;
private static SkinDeformationClip clip;
private static TextAsset[] activeDenoiseIndices = null;
private static TextAsset[] activeTransplantIndices = null;
private static int[] pairedDenoiseIndices = new int[0];
private static int[] pairedTransplantIndices = new int[0];
static bool CompareTextAssetArrays(TextAsset[] a, TextAsset[] b)
{
if (a == null && b == null)
return true;
if (a != b)
return false;
if (a.Length != b.Length)
return false;
for (int i = 0; i != a.Length; i++)
{
if (a[i] != b[i])
return false;
}
return true;
}
static int[] BuildPairsFromIndices(MeshAdjacency meshAdjacency, int[] indices)
{
var pairs = new List<int>();
foreach (int i in indices)
{
foreach (int j in meshAdjacency.vertexVertices[i])
{
pairs.Add(i);
pairs.Add(j);
}
}
return pairs.ToArray();
}
static void OnSceneGUI(SceneView sceneView)
{
if (Event.current.type != EventType.Repaint)
return;
var mesh = clip.settings.transferTarget;
if (mesh == null)
return;
var updateDenoiseIndices = !CompareTextAssetArrays(activeDenoiseIndices, clip.settings.denoiseRegions);
var updateTransplantIndices = !CompareTextAssetArrays(activeTransplantIndices, clip.settings.transplantRegions);
foreach (var deformationRenderer in SkinDeformationRenderer.enabledInstances)
{
if (deformationRenderer.meshAsset != mesh)
continue;
var target = deformationRenderer.GetComponent<SkinAttachmentTarget>();
if (target == null)
continue;
var targetMeshInfo = target.GetCachedMeshInfo();
if (targetMeshInfo.valid == false)
continue;
if (updateDenoiseIndices)
{
updateDenoiseIndices = false;
activeDenoiseIndices = clip.settings.denoiseRegions.Clone() as TextAsset[];
pairedDenoiseIndices = BuildPairsFromIndices(targetMeshInfo.meshAdjacency, SkinDeformationClipEditor.ResolveIndexArrayFromVertexSelectionArray(activeDenoiseIndices));
}
if (updateTransplantIndices)
{
updateTransplantIndices = false;
activeTransplantIndices = clip.settings.transplantRegions.Clone() as TextAsset[];
pairedTransplantIndices = BuildPairsFromIndices(targetMeshInfo.meshAdjacency, SkinDeformationClipEditor.ResolveIndexArrayFromVertexSelectionArray(activeTransplantIndices));
}
var meshMatrix = deformationRenderer.transform.localToWorldMatrix;
var meshBuffers = targetMeshInfo.meshBuffers;
using (var scope = new Handles.DrawingScope(Color.Lerp(Color.clear, Color.magenta, 0.5f), meshMatrix))
{
Handles.DrawLines(meshBuffers.vertexPositions, pairedDenoiseIndices);
}
using (var scope = new Handles.DrawingScope(Color.Lerp(Color.clear, Color.green, 0.5f), meshMatrix))
{
Handles.DrawLines(meshBuffers.vertexPositions, pairedTransplantIndices);
}
}
}
public static void Enable(SkinDeformationClip clip)
{
SkinDeformationClipRegions.clip = clip;
if (active == false)
{
active = true;
SceneView.duringSceneGui += OnSceneGUI;
SceneView.RepaintAll();
}
}
public static void Disable()
{
SkinDeformationClipRegions.clip = null;
if (active)
{
active = false;
SceneView.duringSceneGui -= OnSceneGUI;
SceneView.RepaintAll();
}
}
}
}