123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- using UnityEngine;
- using UnityEditor;
- using System.Collections.Generic;
- //-----------------------------------------------------------------------------
- // Copyright 2015-2021 RenderHeads Ltd. All rights reserved.
- //-----------------------------------------------------------------------------
- namespace RenderHeads.Media.AVProVideo.Editor
- {
- /// <summary>
- /// Editor for the ApplyToMesh component
- /// </summary>
- [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<Material> nonNullMaterials = new List<Material>(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<GUIContent> items = new List<GUIContent>(16);
- List<string> textureNames = new List<string>(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();
- }
- }
- }
- }
- }
|