74 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |