void OnGUI() { TimelineWindow.loadSkin(ref skin, ref cachedSkinName, position); if (aData == null) { TimelineWindow.MessageBox("Animator requires an Animate component in your scene. Launch Animator to add the component.", TimelineWindow.MessageBoxType.Warning); return; } if (mTrack == null) { return; } Renderer render = mTrack.GetTarget(aData.target) as Renderer; if (!render) { TimelineWindow.MessageBox("Assign a Renderer to the track first.", TimelineWindow.MessageBoxType.Warning); return; } //select material Material[] mats = render.sharedMaterials; string[] matNames = new string[mats.Length]; int[] matInds = new int[mats.Length]; for (int i = 0; i < mats.Length; i++) { matNames[i] = mats[i].name; matInds[i] = i; } //grab track info int matInd = Mathf.Clamp(mTrack.materialIndex, 0, mats.Length - 1); Material matOverride = mTrack.materialOverride; string shaderProperty = mTrack.property; //material select matInd = EditorGUILayout.IntPopup("Material", matInd, matNames, matInds); //material override select matOverride = EditorGUILayout.ObjectField("Material Override", matOverride, typeof(Material), false) as Material; Material mat = matOverride ? matOverride : mats[matInd]; //grab material info string[] shaderPropertyNames, shaderPropertyDetails; MaterialTrack.ValueType[] shaderPropertyTypes; int[] shaderPropertyInds; GetPropertyInfos(mat, out shaderPropertyNames, out shaderPropertyDetails, out shaderPropertyTypes, out shaderPropertyInds); int shaderPropertyInd = -1; MaterialTrack.ValueType shaderPropertyType = mTrack.propertyType; for (int i = 0; i < shaderPropertyNames.Length; i++) { if (shaderProperty == shaderPropertyNames[i]) { shaderPropertyInd = i; //special case for texture offset and scale if (shaderPropertyTypes[i] == MaterialTrack.ValueType.TexEnv && i + 2 < shaderPropertyNames.Length) { if (shaderPropertyType == shaderPropertyTypes[i + 1]) { shaderPropertyInd += 1; } else if (shaderPropertyType == shaderPropertyTypes[i + 2]) { shaderPropertyInd += 2; } } break; } } if (shaderPropertyInd == -1) { shaderPropertyInd = 0; } EditorUtility.DrawSeparator(); //shader property select shaderPropertyInd = EditorGUILayout.IntPopup("Property", shaderPropertyInd, shaderPropertyDetails, shaderPropertyInds); shaderProperty = shaderPropertyNames[shaderPropertyInd]; shaderPropertyType = shaderPropertyTypes[shaderPropertyInd]; //check for change if (mTrack.materialIndex != matInd || mTrack.materialOverride != matOverride || mTrack.property != shaderProperty || mTrack.propertyType != shaderPropertyType) { aData.RegisterTakesUndo("Material Track Property Change", false); mTrack.materialIndex = matInd; mTrack.materialOverride = matOverride; mTrack.property = shaderProperty; mTrack.propertyType = shaderPropertyType; } }
void OnGUI() { TimelineWindow.loadSkin(ref skin, ref cachedSkinName, position); if (aData == null) { TimelineWindow.MessageBox("Animator requires an Animate component in your scene. Launch Animator to add the component.", TimelineWindow.MessageBoxType.Warning); return; } if (mTrack == null) { return; } Renderer render = mTrack.GetTarget(aData.target) as Renderer; if (!render) { TimelineWindow.MessageBox("Assign a Renderer to the track first.", TimelineWindow.MessageBoxType.Warning); return; } //select material Material[] mats = render.sharedMaterials; string[] matNames = new string[mats.Length]; int[] matInds = new int[mats.Length]; for (int i = 0; i < mats.Length; i++) { matNames[i] = mats[i].name; matInds[i] = i; } //grab track info int matInd = Mathf.Clamp(mTrack.materialIndex, 0, mats.Length - 1); Material matOverride = mTrack.materialOverride; string shaderProperty = mTrack.property; //material select matInd = EditorGUILayout.IntPopup("Material", matInd, matNames, matInds); //material override select matOverride = EditorGUILayout.ObjectField("Material Override", matOverride, typeof(Material), false) as Material; Material mat = matOverride ? matOverride : mats[matInd]; //grab material info string[] shaderPropertyNames, shaderPropertyDetails; MaterialTrack.ValueType[] shaderPropertyTypes; int[] shaderPropertyInds; GetPropertyInfos(mat, out shaderPropertyNames, out shaderPropertyDetails, out shaderPropertyTypes, out shaderPropertyInds); int shaderPropertyInd = -1; MaterialTrack.ValueType shaderPropertyType = mTrack.propertyType; for (int i = 0; i < shaderPropertyNames.Length; i++) { if (shaderProperty == shaderPropertyNames[i]) { shaderPropertyInd = i; //special case for texture offset and scale if (shaderPropertyTypes[i] == MaterialTrack.ValueType.TexEnv && i + 2 < shaderPropertyNames.Length) { if (shaderPropertyType == shaderPropertyTypes[i + 1]) { shaderPropertyInd += 1; } else if (shaderPropertyType == shaderPropertyTypes[i + 2]) { shaderPropertyInd += 2; } } break; } } if (shaderPropertyInd == -1) { shaderPropertyInd = 0; } EditorUtility.DrawSeparator(); //shader property select shaderPropertyInd = EditorGUILayout.IntPopup("Property", shaderPropertyInd, shaderPropertyDetails, shaderPropertyInds); shaderProperty = shaderPropertyNames[shaderPropertyInd]; shaderPropertyType = shaderPropertyTypes[shaderPropertyInd]; //check for change if (mTrack.materialIndex != matInd || mTrack.materialOverride != matOverride || mTrack.property != shaderProperty || mTrack.propertyType != shaderPropertyType) { bool applyChanges = true; bool deleteKeys = false; //delete if changing type if (mTrack.keys.Count > 0 && !MaterialTrack.IsValueTypeCompatible(mTrack.propertyType, shaderPropertyType)) { if (UnityEditor.EditorUtility.DisplayDialog("Data Will Be Lost", "You will lose all of the keyframes on track '" + mTrack.name + "' if you continue.", "Continue Anway", "Cancel")) { deleteKeys = true; } else { applyChanges = false; } } if (applyChanges) { aData.RegisterTakesUndo("Material Track Property Change"); mTrack.materialIndex = matInd; mTrack.materialOverride = matOverride; mTrack.property = shaderProperty; mTrack.propertyType = shaderPropertyType; if (deleteKeys) { mTrack.keys = new List <Key>(); } aData.RecordTakesChanged(); } } }