using UnityEngine; using UnityEditor; using System.Collections.Generic; //----------------------------------------------------------------------------- // Copyright 2015-2021 RenderHeads Ltd. All rights reserved. //----------------------------------------------------------------------------- namespace RenderHeads.Media.AVProVideo.Editor { /// /// Editor for the ApplyToMesh component /// [CanEditMultipleObjects] [CustomEditor(typeof(ApplyToMesh))] public class ApplyToMeshEditor : UnityEditor.Editor { private static readonly GUIContent _guiTextTextureProperty = new GUIContent("Texture Property"); private SerializedProperty _propTextureOffset; private SerializedProperty _propTextureScale; private SerializedProperty _propMediaPlayer; private SerializedProperty _propRenderer; private SerializedProperty _propMaterialIndex; private SerializedProperty _propTexturePropertyName; private SerializedProperty _propDefaultTexture; private SerializedProperty _propAutomaticStereoPacking; private SerializedProperty _propOverrideStereoPacking; private SerializedProperty _propStereoRedGreenTint; private GUIContent[] _materialTextureProperties = new GUIContent[0]; void OnEnable() { _propTextureOffset = this.CheckFindProperty("_offset"); _propTextureScale = this.CheckFindProperty("_scale"); _propMediaPlayer = this.CheckFindProperty("_media"); _propRenderer = this.CheckFindProperty("_renderer"); _propMaterialIndex = this.CheckFindProperty("_materialIndex"); _propTexturePropertyName = this.CheckFindProperty("_texturePropertyName"); _propDefaultTexture = this.CheckFindProperty("_defaultTexture"); _propAutomaticStereoPacking = this.CheckFindProperty("_automaticStereoPacking"); _propOverrideStereoPacking = this.CheckFindProperty("_overrideStereoPacking"); _propStereoRedGreenTint = this.CheckFindProperty("_stereoRedGreenTint"); } public override void OnInspectorGUI() { serializedObject.Update(); if (_propRenderer == null) { return; } EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(_propMediaPlayer); EditorGUILayout.PropertyField(_propDefaultTexture); EditorGUILayout.PropertyField(_propRenderer); bool hasKeywords = false; int materialCount = 0; int texturePropertyIndex = 0; _materialTextureProperties = new GUIContent[0]; if (_propRenderer.objectReferenceValue != null) { Renderer r = (Renderer)(_propRenderer.objectReferenceValue); materialCount = r.sharedMaterials.Length; List nonNullMaterials = new List(r.sharedMaterials); // Remove any null materials (otherwise MaterialEditor.GetMaterialProperties() errors) for (int i = 0; i < nonNullMaterials.Count; i++) { if (nonNullMaterials[i] == null) { nonNullMaterials.RemoveAt(i); i--; } } if (nonNullMaterials.Count > 0) { // Detect if there are any keywords foreach (Material mat in nonNullMaterials) { if (mat.shaderKeywords.Length > 0) { hasKeywords = true; break; } } // Get unique list of texture property names List items = new List(16); List textureNames = new List(8); foreach (Material mat in nonNullMaterials) { // NOTE: we process each material separately instead of passing them all into MaterialEditor.GetMaterialProperties() as it errors if the materials have different properties MaterialProperty[] matProps = MaterialEditor.GetMaterialProperties(new Object[] { mat }); foreach (MaterialProperty matProp in matProps) { if (matProp.type == MaterialProperty.PropType.Texture) { if (!textureNames.Contains(matProp.name)) { if (matProp.name == _propTexturePropertyName.stringValue) { texturePropertyIndex = items.Count; } textureNames.Add(matProp.name); items.Add(new GUIContent(matProp.name)); } } } } _materialTextureProperties = items.ToArray(); } } if (materialCount > 0) { GUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("All Materials"); EditorGUI.BeginChangeCheck(); EditorGUILayout.Toggle(_propMaterialIndex.intValue < 0); if (EditorGUI.EndChangeCheck()) { if (_propMaterialIndex.intValue < 0) { _propMaterialIndex.intValue = 0; } else { _propMaterialIndex.intValue = -1; } } GUILayout.EndHorizontal(); if (_propMaterialIndex.intValue >= 0) { GUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Material Index"); _propMaterialIndex.intValue = EditorGUILayout.IntSlider(_propMaterialIndex.intValue, 0, materialCount - 1); GUILayout.EndHorizontal(); } } int newTexturePropertyIndex = EditorGUILayout.Popup(_guiTextTextureProperty, texturePropertyIndex, _materialTextureProperties); if (newTexturePropertyIndex >= 0 && newTexturePropertyIndex < _materialTextureProperties.Length) { _propTexturePropertyName.stringValue = _materialTextureProperties[newTexturePropertyIndex].text; } if (hasKeywords && _propTexturePropertyName.stringValue != Helper.UnityBaseTextureName) { EditorGUILayout.HelpBox("When using an uber shader you may need to enable the keywords on a material for certain texture slots to take effect. You can sometimes achieve this (eg with Standard shader) by putting a dummy texture into the texture slot.", MessageType.Info); } EditorGUILayout.PropertyField(_propTextureOffset); EditorGUILayout.PropertyField(_propTextureScale); EditorGUILayout.PropertyField(_propAutomaticStereoPacking); if (!_propAutomaticStereoPacking.boolValue) { EditorGUILayout.PropertyField(_propOverrideStereoPacking); } EditorGUILayout.PropertyField(_propStereoRedGreenTint); serializedObject.ApplyModifiedProperties(); bool wasModified = EditorGUI.EndChangeCheck(); if (Application.isPlaying && wasModified) { foreach (Object obj in this.targets) { ((ApplyToMesh)obj).ForceUpdate(); } } } } }