#if VRC_SDK_VRCSDK3 #if !VRWT_DISABLE_EDITORS using VRC.SDKBase; using UnityEditor; using UnityEngine; namespace VRWorldToolkit.Editor { /// /// Custom editor for VRC_MirrorReflection with added quick actions /// [CustomEditor(typeof(VRC_MirrorReflection), true, isFallback = false)] [CanEditMultipleObjects] public class CustomMirrorEditor : UnityEditor.Editor { private bool showExplanations; private SerializedProperty mirrorMask; private void OnEnable() { mirrorMask = serializedObject.FindProperty("m_ReflectLayers"); } public override void OnInspectorGUI() { DrawDefaultInspector(); serializedObject.Update(); EditorGUILayout.Space(); EditorGUILayout.LabelField("VRWorld Toolkit Additions", EditorStyles.boldLabel); EditorGUILayout.LabelField("Quick set Reflect Layers:"); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Show only Players")) MirrorLayerChange(262656); if (GUILayout.Button("Show Players/World")) MirrorLayerChange(264705); EditorGUILayout.EndHorizontal(); if (Selection.gameObjects.Length == 1) { var currentMirror = (VRC_MirrorReflection) target; if ((LightmapSettings.lightProbes != null && LightmapSettings.lightProbes.positions.Length == 0 && currentMirror.m_DisablePixelLights) || (LightmapSettings.lightProbes is null && currentMirror.m_DisablePixelLights)) EditorGUILayout.HelpBox("No baked light probes were found in lighting data. Dynamic objects such as players and pickups will not appear lit in mirrors without baked light probes.", MessageType.Warning); if (mirrorMask.intValue == -1025) EditorGUILayout.HelpBox("This mirror has default layers set. Unnecessary layers should be disabled to save on performance.", MessageType.Info); if (Helper.LayerIncludedInMask(LayerMask.NameToLayer("UiMenu"), mirrorMask.intValue)) EditorGUILayout.HelpBox("Having UiMenu enabled on mirrors causes VRChat UI elements to be rendered twice, causing a noticeable performance drop in populated instances.", MessageType.Warning); if (!Helper.LayerIncludedInMask(LayerMask.NameToLayer("MirrorReflection"), mirrorMask.intValue)) EditorGUILayout.HelpBox("Having the MirrorReflection layer disabled will stop the player from seeing themselves in the mirror.", MessageType.Warning); if (Helper.LayerIncludedInMask(LayerMask.NameToLayer("PlayerLocal"), mirrorMask.intValue)) EditorGUILayout.HelpBox("PlayerLocal is only meant to be seen in first-person view and should not be enabled on mirrors.", MessageType.Error); } showExplanations = EditorGUILayout.Foldout(showExplanations, "VRChat Specific Layer Descriptions"); if (showExplanations) { GUILayout.Label("Player:\nThis layer is used to show players other than yourself.", Styles.RichTextWrap); GUILayout.Label("PlayerLocal:\nThis layer is only used for first-person view and should not be enabled in mirrors.", Styles.RichTextWrap); GUILayout.Label("Environment:\nThis layer is used for static meshes and objects in the world. Shares the same properties as the Default layer.", Styles.RichTextWrap); GUILayout.Label("MirrorReflection:\nThis layer is used to fully show your own self in the mirror.", Styles.RichTextWrap); } serializedObject.ApplyModifiedProperties(); } /// /// Change selected Reflect Layers on selected VRC_MirrorReflections to the supplied LayerMask value /// /// New LayerMask value to set for Reflect Layers private void MirrorLayerChange(int layerMask) { mirrorMask.intValue = layerMask; } } } #endif #endif