Singularity/Library/PackageCache/com.unity.timeline@1.6.4/Editor/Utilities/AnimatedPropertyUtility.cs
2024-05-06 11:45:45 -07:00

74 lines
2.7 KiB
C#

using System;
using UnityEngine;
namespace UnityEditor.Timeline
{
// Helper methods for animated properties
internal static class AnimatedPropertyUtility
{
public static bool IsMaterialProperty(string propertyName)
{
return propertyName.StartsWith("material.");
}
/// <summary>
/// Given a propertyName (from an EditorCurveBinding), and the gameObject it refers to,
/// remaps the path to include the exposed name of the shader parameter
/// </summary>
/// <param name="gameObject">The gameObject being referenced.</param>
/// <param name="propertyName">The propertyName to remap.</param>
/// <returns>The remapped propertyName, or the original propertyName if it cannot be remapped</returns>
public static string RemapMaterialName(GameObject gameObject, string propertyName)
{
if (!IsMaterialProperty(propertyName) || gameObject == null)
return propertyName;
var renderers = gameObject.GetComponents<Renderer>();
if (renderers == null || renderers.Length == 0)
return propertyName;
var propertySplits = propertyName.Split('.');
if (propertySplits.Length <= 1)
return propertyName;
// handles post fixes for texture properties
var exposedParameter = HandleTextureProperties(propertySplits[1], out var postFix);
foreach (var renderer in renderers)
{
foreach (var material in renderer.sharedMaterials)
{
if (material.shader == null)
continue;
var index = material.shader.FindPropertyIndex(exposedParameter);
if (index >= 0)
{
propertySplits[1] = material.shader.GetPropertyDescription(index) + postFix;
return String.Join(".", propertySplits);
}
}
}
return propertyName;
}
private static string HandleTextureProperties(string exposedParameter, out string postFix)
{
postFix = String.Empty;
RemoveEnding(ref exposedParameter, ref postFix, "_ST");
RemoveEnding(ref exposedParameter, ref postFix, "_TexelSize");
RemoveEnding(ref exposedParameter, ref postFix, "_HDR");
return exposedParameter;
}
private static void RemoveEnding(ref string name, ref string postFix, string ending)
{
if (name.EndsWith(ending))
{
name = name.Substring(0, name.Length - ending.Length);
postFix = ending;
}
}
}
}