您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
214 行
6.6 KiB
214 行
6.6 KiB
//#define _SNAPPERS_TEXTURE_ARRAYS
|
|
|
|
using UnityEngine;
|
|
using Unity.DemoTeam.Attributes;
|
|
|
|
namespace Unity.DemoTeam.DigitalHuman
|
|
{
|
|
[ExecuteAlways]
|
|
[RequireComponent(typeof(SkinnedMeshRenderer))]
|
|
public class SnappersHeadRenderer : MonoBehaviour
|
|
{
|
|
private SkinnedMeshRenderer smr;
|
|
private MaterialPropertyBlock smrProps;
|
|
|
|
[Header("Facial Rig")]
|
|
public SnappersHeadDefinition.InstanceData headInstance;
|
|
public SnappersHeadDefinition headDefinition;
|
|
public Transform headController;
|
|
[EnumFlag]
|
|
public SnappersHeadDefinition.Warnings warnings;
|
|
|
|
[Header("Activation masks")]
|
|
public Texture2D mask1;
|
|
public Texture2D mask2;
|
|
public Texture2D mask3;
|
|
public Texture2D mask4;
|
|
public Texture2D mask5;
|
|
public Texture2D mask6;
|
|
public Texture2D mask7;
|
|
public Texture2D mask8;
|
|
public Texture2D mask9;
|
|
public Texture2D mask10;
|
|
public Texture2D mask11;
|
|
public Texture2D mask12;
|
|
|
|
[Header("Activation maps")]
|
|
public Texture2D albedo1;
|
|
public Texture2D albedo2;
|
|
public Texture2D albedo3;
|
|
public Texture2D albedo4;
|
|
[Space]
|
|
public Texture2D normal1;
|
|
public Texture2D normal2;
|
|
public Texture2D normal3;
|
|
public Texture2D normal4;
|
|
[Space]
|
|
public Texture2D cavity1;
|
|
public Texture2D cavity2;
|
|
public Texture2D cavity3;
|
|
public Texture2D cavity4;
|
|
|
|
#if _SNAPPERS_TEXTURE_ARRAYS
|
|
public string arrayAssetPath = "Assets/Characters/Gawain/Face/Snappers";
|
|
public Texture2DArray arrayMask;
|
|
public Texture2DArray arrayAlbedo;
|
|
public Texture2DArray arrayNormal;
|
|
public Texture2DArray arrayCavity;
|
|
#endif
|
|
|
|
[Header("-> SkinDeformationRenderer (if avail.)")]
|
|
public bool injectFittedWeights;
|
|
[Range(1.0f, 10.0f)]
|
|
public float injectFittedWeightsScale = 1.0f;
|
|
|
|
void OnEnable()
|
|
{
|
|
smr = GetComponent<SkinnedMeshRenderer>();
|
|
smrProps = new MaterialPropertyBlock();
|
|
}
|
|
|
|
void OnDisable()
|
|
{
|
|
if (smrProps == null)
|
|
smrProps = new MaterialPropertyBlock();
|
|
|
|
smr.GetPropertyBlock(smrProps);
|
|
{
|
|
if (headInstance.shaderParamFloats != null)//PACKAGETODO introduce IsCreated() or similar?
|
|
{
|
|
SnappersHeadDefinition.ResetShaderParam(ref headInstance);
|
|
SnappersHeadDefinition.ApplyShaderParam(ref headInstance, smrProps);
|
|
}
|
|
}
|
|
smr.SetPropertyBlock(smrProps);
|
|
}
|
|
|
|
void LateUpdate()
|
|
{
|
|
if (smrProps == null)
|
|
smrProps = new MaterialPropertyBlock();
|
|
|
|
smr.GetPropertyBlock(smrProps);
|
|
{
|
|
if (headDefinition != null)
|
|
{
|
|
headDefinition.PrepareInstance(ref headInstance, smr, headController, warnings);
|
|
headDefinition.ResolveControllers(ref headInstance);
|
|
headDefinition.ResolveBlendShapes(ref headInstance, smr);
|
|
|
|
if (injectFittedWeights)
|
|
{
|
|
var skinDeform = GetComponent<SkinDeformationRenderer>();
|
|
if (skinDeform != null && skinDeform.fittedWeightsAvailable)
|
|
{
|
|
var fittedWeights = skinDeform.fittedWeights;
|
|
var inputIndices = headInstance.blendShapeIndices;
|
|
var inputWeights = headInstance.blendShapeWeights;
|
|
for (int i = 0; i != headInstance.blendShapeIndices.Length; i++)
|
|
{
|
|
inputWeights[i] = Mathf.Clamp01(Mathf.Max(injectFittedWeightsScale * fittedWeights[inputIndices[i]], inputWeights[i]));
|
|
}
|
|
}
|
|
|
|
headDefinition.ResolveShaderParam(ref headInstance);
|
|
headDefinition.ResolveBlendShapes(ref headInstance, smr);// done again to avoid factoring in fitted weights
|
|
}
|
|
else
|
|
{
|
|
headDefinition.ResolveShaderParam(ref headInstance);
|
|
}
|
|
|
|
SnappersHeadDefinition.ApplyControllers(ref headInstance);
|
|
SnappersHeadDefinition.ApplyBlendShapes(ref headInstance, smr);
|
|
SnappersHeadDefinition.ApplyShaderParam(ref headInstance, smrProps);
|
|
}
|
|
else
|
|
{
|
|
SnappersHeadDefinition.ResetShaderParam(ref headInstance);
|
|
SnappersHeadDefinition.ApplyShaderParam(ref headInstance, smrProps);
|
|
}
|
|
|
|
#if _SNAPPERS_TEXTURE_ARRAYS
|
|
SetTextureChecked(smrProps, "_SnappersMask", arrayMask);
|
|
SetTextureChecked(smrProps, "_SnappersAlbedo", arrayAlbedo);
|
|
SetTextureChecked(smrProps, "_SnappersNormal", arrayNormal);
|
|
SetTextureChecked(smrProps, "_SnappersCavity", arrayCavity);
|
|
#else
|
|
SetTextureChecked(smrProps, "_SnappersMask1", mask1);
|
|
SetTextureChecked(smrProps, "_SnappersMask2", mask2);
|
|
SetTextureChecked(smrProps, "_SnappersMask3", mask3);
|
|
SetTextureChecked(smrProps, "_SnappersMask4", mask4);
|
|
SetTextureChecked(smrProps, "_SnappersMask5", mask5);
|
|
SetTextureChecked(smrProps, "_SnappersMask6", mask6);
|
|
SetTextureChecked(smrProps, "_SnappersMask7", mask7);
|
|
SetTextureChecked(smrProps, "_SnappersMask8", mask8);
|
|
SetTextureChecked(smrProps, "_SnappersMask9", mask9);
|
|
SetTextureChecked(smrProps, "_SnappersMask10", mask10);
|
|
SetTextureChecked(smrProps, "_SnappersMask11", mask11);
|
|
SetTextureChecked(smrProps, "_SnappersMask12", mask12);
|
|
|
|
SetTextureChecked(smrProps, "_SnappersAlbedo1", albedo1);
|
|
SetTextureChecked(smrProps, "_SnappersAlbedo2", albedo2);
|
|
SetTextureChecked(smrProps, "_SnappersAlbedo3", albedo3);
|
|
SetTextureChecked(smrProps, "_SnappersAlbedo4", albedo4);
|
|
|
|
SetTextureChecked(smrProps, "_SnappersNormal1", normal1);
|
|
SetTextureChecked(smrProps, "_SnappersNormal2", normal2);
|
|
SetTextureChecked(smrProps, "_SnappersNormal3", normal3);
|
|
SetTextureChecked(smrProps, "_SnappersNormal4", normal4);
|
|
|
|
SetTextureChecked(smrProps, "_SnappersCavity1", cavity1);
|
|
SetTextureChecked(smrProps, "_SnappersCavity2", cavity2);
|
|
SetTextureChecked(smrProps, "_SnappersCavity3", cavity3);
|
|
SetTextureChecked(smrProps, "_SnappersCavity4", cavity4);
|
|
#endif
|
|
}
|
|
smr.SetPropertyBlock(smrProps);
|
|
}
|
|
|
|
static void SetTextureChecked(MaterialPropertyBlock props, string textureId, Texture texture)
|
|
{
|
|
if (texture != null)
|
|
props.SetTexture(textureId, texture);
|
|
else
|
|
props.SetTexture(textureId, Texture2D.blackTexture);
|
|
}
|
|
|
|
#if _SNAPPERS_TEXTURE_ARRAYS
|
|
static void UpdateTextureArray(ref Texture2DArray array, Texture2D[] slices, bool linear)
|
|
{
|
|
if (array != null && array.depth != slices.Length)
|
|
{
|
|
Texture2DArray.Destroy(array);
|
|
array = null;
|
|
}
|
|
|
|
if (array == null)
|
|
{
|
|
array = new Texture2DArray(slices[0].width, slices[0].height, slices.Length, slices[0].format, true, linear);
|
|
array.hideFlags |= HideFlags.HideAndDontSave;
|
|
}
|
|
|
|
if (slices.Length > 0 && slices[0] != null)
|
|
{
|
|
array.wrapMode = slices[0].wrapMode;
|
|
array.anisoLevel = slices[0].anisoLevel;
|
|
array.filterMode = slices[0].filterMode;
|
|
}
|
|
|
|
for (int i = 0; i != slices.Length; i++)
|
|
{
|
|
if (slices[i] != null)
|
|
{
|
|
int mipCount = slices[i].mipmapCount;
|
|
for (int mip = 0; mip != mipCount; mip++)
|
|
{
|
|
Graphics.CopyTexture(slices[i], 0, mip, array, i, mip);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|