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; | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |