You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.7 KiB
73 lines
2.7 KiB
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; |
|
} |
|
} |
|
} |
|
}
|
|
|