public override void OnInspectorGUI()
    {
        OVROverlay overlay = (OVROverlay)target;

        if (overlay == null)
        {
            return;
        }

        EditorGUILayout.LabelField("Display Order", EditorStyles.boldLabel);
        overlay.currentOverlayType   = (OVROverlay.OverlayType)EditorGUILayout.EnumPopup(new GUIContent("Current Overlay Type", "Whether this overlay should layer behind the scene or in front of it"), overlay.currentOverlayType);
        overlay.compositionDepth     = EditorGUILayout.IntField(new GUIContent("Composition Depth", "Depth value used to sort OVROverlays in the scene, smaller value appears in front"), overlay.compositionDepth);
        overlay.noDepthBufferTesting = EditorGUILayout.Toggle(new GUIContent("No Depth Buffer Testing", "The noDepthBufferTesting will stop layer's depth buffer compositing even if the engine has \"Shared Depth Buffer\" enabled"), overlay.noDepthBufferTesting);
        EditorGUILayout.Space();

        EditorGUILayout.LabelField(new GUIContent("Overlay Shape", "The shape of this overlay"), EditorStyles.boldLabel);
        overlay.currentOverlayShape = (OVROverlay.OverlayShape)EditorGUILayout.EnumPopup(new GUIContent("Overlay Shape", "The shape of this overlay"), overlay.currentOverlayShape);
        EditorGUILayout.Space();

        EditorGUILayout.Separator();
        EditorGUILayout.LabelField("Textures", EditorStyles.boldLabel);

#if UNITY_ANDROID
        bool lastIsExternalSurface = overlay.isExternalSurface;
        overlay.isExternalSurface = EditorGUILayout.Toggle(new GUIContent("Is External Surface", "On Android, retrieve an Android Surface object to render to (e.g., video playback)"), overlay.isExternalSurface);

        if (lastIsExternalSurface)
        {
            overlay.externalSurfaceWidth  = EditorGUILayout.IntField("External Surface Width", overlay.externalSurfaceWidth);
            overlay.externalSurfaceHeight = EditorGUILayout.IntField("External Surface Height", overlay.externalSurfaceHeight);
            overlay.isProtectedContent    = EditorGUILayout.Toggle(new GUIContent("Is Protected Content", "The external surface has L1 widevine protection."), overlay.isProtectedContent);
        }
        else
#endif
        {
            if (overlay.textures == null)
            {
                overlay.textures = new Texture[2];
            }
            if (overlay.textures.Length < 2)
            {
                Texture[] tmp = new Texture[2];
                for (int i = 0; i < overlay.textures.Length; i++)
                {
                    tmp[i] = overlay.textures[i];
                }
                overlay.textures = tmp;
            }

            var labelControlRect = EditorGUILayout.GetControlRect();
            EditorGUI.LabelField(new Rect(labelControlRect.x, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Left Texture", "Texture used for the left eye"));
            EditorGUI.LabelField(new Rect(labelControlRect.x + labelControlRect.width / 2, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Right Texture", "Texture used for the right eye"));


            var textureControlRect = EditorGUILayout.GetControlRect(GUILayout.Height(64));

            overlay.textures[0] = (Texture)EditorGUI.ObjectField(new Rect(textureControlRect.x, textureControlRect.y, 64, textureControlRect.height), overlay.textures[0], typeof(Texture), true);
            Texture right = (Texture)EditorGUI.ObjectField(new Rect(textureControlRect.x + textureControlRect.width / 2, textureControlRect.y, 64, textureControlRect.height), overlay.textures[1] != null ? overlay.textures[1] : overlay.textures[0], typeof(Texture), true);
            if (right == overlay.textures[0])
            {
                overlay.textures[1] = null;
            }
            else
            {
                overlay.textures[1] = right;
            }

            overlay.isDynamic = EditorGUILayout.Toggle(new GUIContent("Dynamic Texture", "This texture will be updated dynamically at runtime (e.g., Video)"), overlay.isDynamic);
#if !UNITY_ANDROID
            overlay.isProtectedContent = EditorGUILayout.Toggle(new GUIContent("Is Protected Content", "The texture has copy protection, e.g., HDCP"), overlay.isProtectedContent);
#endif
        }
        if (overlay.currentOverlayShape == OVROverlay.OverlayShape.Cylinder || overlay.currentOverlayShape == OVROverlay.OverlayShape.Equirect || overlay.currentOverlayShape == OVROverlay.OverlayShape.Quad)
        {
            EditorGUILayout.Separator();
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Texture Rects", EditorStyles.boldLabel);

            bool lastOverrideTextureRectMatrix = overlay.overrideTextureRectMatrix;
            overlay.overrideTextureRectMatrix = !EditorGUILayout.Toggle(new GUIContent("Use Default Rects", overlay.textures[1] == null ? "If you need to use a single texture as a stereo image, uncheck this box" : "Uncheck this box if you need to clip you textures or layer"), !overlay.overrideTextureRectMatrix);

            if (lastOverrideTextureRectMatrix)
            {
                sourceRectsVisible = EditorGUILayout.Foldout(sourceRectsVisible, new GUIContent("Source Rects", "What portion of the source texture will ultimately be shown in each eye."));

                if (sourceRectsVisible)
                {
                    var mat = SrcRectMaterial;

                    if (mat != null)
                    {
                        Rect drawRect = EditorGUILayout.GetControlRect(GUILayout.Height(128 + 8));
                        mat.SetVector("_SrcRectLeft", new Vector4(Mathf.Max(0.0f, overlay.srcRectLeft.x), Mathf.Max(0.0f, overlay.srcRectLeft.y), Mathf.Min(1.0f - overlay.srcRectLeft.x, overlay.srcRectLeft.width), Mathf.Min(1.0f - overlay.srcRectLeft.y, overlay.srcRectLeft.height)));
                        mat.SetVector("_SrcRectRight", new Vector4(Mathf.Max(0.0f, overlay.srcRectRight.x), Mathf.Max(0.0f, overlay.srcRectRight.y), Mathf.Min(1.0f - overlay.srcRectRight.x, overlay.srcRectRight.width), Mathf.Min(1.0f - overlay.srcRectRight.y, overlay.srcRectRight.height)));
                        // center our draw rect
                        var drawRectCentered = new Rect(drawRect.x + drawRect.width / 2 - 128 - 4, drawRect.y, 256 + 8, drawRect.height);
                        EditorGUI.DrawPreviewTexture(drawRectCentered, overlay.textures[0] ?? Texture2D.blackTexture, mat);

                        var drawRectInset = new Rect(drawRectCentered.x + 4, drawRectCentered.y + 4, drawRectCentered.width - 8, drawRectCentered.height - 8);
                        UpdateRectDragging(drawRectInset, drawRectInset, TextureRect.SrcLeft, TextureRect.SrcRight, ref overlay.srcRectLeft, ref overlay.srcRectRight);
                        CreateCursorRects(drawRectInset, overlay.srcRectLeft);
                        CreateCursorRects(drawRectInset, overlay.srcRectRight);
                    }

                    var labelControlRect = EditorGUILayout.GetControlRect();
                    EditorGUI.LabelField(new Rect(labelControlRect.x, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Left Source Rect", "The rect in the source image that will be displayed on the left eye layer"));
                    EditorGUI.LabelField(new Rect(labelControlRect.x + labelControlRect.width / 2, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Right Source Rect", "The rect in the source image that will be displayed on the right eye layer"));

                    var rectControlRect = EditorGUILayout.GetControlRect(GUILayout.Height(34));

                    overlay.srcRectLeft  = Clamp01(EditorGUI.RectField(new Rect(rectControlRect.x, rectControlRect.y, rectControlRect.width / 2 - 20, rectControlRect.height), overlay.srcRectLeft));
                    overlay.srcRectRight = Clamp01(EditorGUI.RectField(new Rect(rectControlRect.x + rectControlRect.width / 2, rectControlRect.y, rectControlRect.width / 2 - 20, rectControlRect.height), overlay.srcRectRight));


                    EditorGUILayout.BeginHorizontal();
                    if (overlay.textures[1] != null)
                    {
                        if (GUILayout.Button(new GUIContent("Reset To Default", "Reset Source Rects to default")))
                        {
                            SetRectsByVideoType(overlay, StereoType.Stereo, DisplayType.Custom);
                        }
                    }
                    else
                    {
                        if (GUILayout.Button(new GUIContent("Monoscopic", "Display the full Texture in both eyes")))
                        {
                            SetRectsByVideoType(overlay, StereoType.Mono, DisplayType.Custom);
                        }
                        if (GUILayout.Button(new GUIContent("Stereo Left/Right", "The left half of the texture is displayed in the left eye, and the right half in the right eye")))
                        {
                            SetRectsByVideoType(overlay, StereoType.StereoLeftRight, DisplayType.Custom);
                        }
                        if (GUILayout.Button(new GUIContent("Stereo Top/Bottom", "The top half of the texture is displayed in the left eye, and the bottom half in the right eye")))
                        {
                            SetRectsByVideoType(overlay, StereoType.StereoTopBottom, DisplayType.Custom);
                        }
                    }
                    EditorGUILayout.EndHorizontal();
                }
                destRectsVisible = EditorGUILayout.Foldout(destRectsVisible, new GUIContent("Destination Rects", "What portion of the destination texture that the source will be rendered into."));
                if (destRectsVisible)
                {
                    var mat = DestRectMaterial;

                    if (mat != null)
                    {
                        Rect drawRect = EditorGUILayout.GetControlRect(GUILayout.Height(128 + 8));
                        mat.SetVector("_SrcRectLeft", new Vector4(Mathf.Max(0.0f, overlay.srcRectLeft.x), Mathf.Max(0.0f, overlay.srcRectLeft.y), Mathf.Min(1.0f - overlay.srcRectLeft.x, overlay.srcRectLeft.width), Mathf.Min(1.0f - overlay.srcRectLeft.y, overlay.srcRectLeft.height)));
                        mat.SetVector("_SrcRectRight", new Vector4(Mathf.Max(0.0f, overlay.srcRectRight.x), Mathf.Max(0.0f, overlay.srcRectRight.y), Mathf.Min(1.0f - overlay.srcRectRight.x, overlay.srcRectRight.width), Mathf.Min(1.0f - overlay.srcRectRight.y, overlay.srcRectRight.height)));
                        mat.SetVector("_DestRectLeft", new Vector4(Mathf.Max(0.0f, overlay.destRectLeft.x), Mathf.Max(0.0f, overlay.destRectLeft.y), Mathf.Min(1.0f - overlay.destRectLeft.x, overlay.destRectLeft.width), Mathf.Min(1.0f - overlay.destRectLeft.y, overlay.destRectLeft.height)));
                        mat.SetVector("_DestRectRight", new Vector4(Mathf.Max(0.0f, overlay.destRectRight.x), Mathf.Max(0.0f, overlay.destRectRight.y), Mathf.Min(1.0f - overlay.destRectRight.x, overlay.destRectRight.width), Mathf.Min(1.0f - overlay.destRectRight.y, overlay.destRectRight.height)));
                        mat.SetColor("_BackgroundColor", EditorGUIUtility.isProSkin ? (Color) new Color32(56, 56, 56, 255) : (Color) new Color32(194, 194, 194, 255));

                        var drawRectCentered = new Rect(drawRect.x + drawRect.width / 2 - 128 - 16 - 4, drawRect.y, 256 + 32 + 8, drawRect.height);
                        // center our draw rect
                        EditorGUI.DrawPreviewTexture(drawRectCentered, overlay.textures[0] ?? Texture2D.blackTexture, mat);

                        var drawRectInsetLeft  = new Rect(drawRectCentered.x + 4, drawRectCentered.y + 4, drawRectCentered.width / 2 - 20, drawRectCentered.height - 8);
                        var drawRectInsetRight = new Rect(drawRectCentered.x + drawRectCentered.width / 2 + 16, drawRectCentered.y + 4, drawRectCentered.width / 2 - 20, drawRectCentered.height - 8);
                        UpdateRectDragging(drawRectInsetLeft, drawRectInsetRight, TextureRect.DestLeft, TextureRect.DestRight, ref overlay.destRectLeft, ref overlay.destRectRight);

                        CreateCursorRects(drawRectInsetLeft, overlay.destRectLeft);
                        CreateCursorRects(drawRectInsetRight, overlay.destRectRight);
                    }

                    var labelControlRect = EditorGUILayout.GetControlRect();
                    EditorGUI.LabelField(new Rect(labelControlRect.x, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Left Destination Rect", "The rect in the destination layer the left eye will display to"));
                    EditorGUI.LabelField(new Rect(labelControlRect.x + labelControlRect.width / 2, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Right Destination Rect", "The rect in the destination layer the right eye will display to"));

                    var rectControlRect = EditorGUILayout.GetControlRect(GUILayout.Height(34));

                    overlay.destRectLeft  = Clamp01(EditorGUI.RectField(new Rect(rectControlRect.x, rectControlRect.y, rectControlRect.width / 2 - 20, rectControlRect.height), overlay.destRectLeft));
                    overlay.destRectRight = Clamp01(EditorGUI.RectField(new Rect(rectControlRect.x + rectControlRect.width / 2, rectControlRect.y, rectControlRect.width / 2 - 20, rectControlRect.height), overlay.destRectRight));


                    if (overlay.currentOverlayShape == OVROverlay.OverlayShape.Equirect)
                    {
                        EditorGUILayout.BeginHorizontal();
                        if (GUILayout.Button(new GUIContent("360 Video", "Display the full 360 layer")))
                        {
                            SetRectsByVideoType(overlay, StereoType.Custom, DisplayType.Full);
                        }
                        if (GUILayout.Button(new GUIContent("180 Video", "Display the front 180 layer")))
                        {
                            SetRectsByVideoType(overlay, StereoType.Custom, DisplayType.Half);
                        }
                        EditorGUILayout.EndHorizontal();
                    }
                    else
                    {
                        if (GUILayout.Button(new GUIContent("Reset To Default", "Reset Source Rects to default")))
                        {
                            SetRectsByVideoType(overlay, StereoType.Custom, DisplayType.Full);
                        }
                    }
                }
            }
        }
        EditorGUILayout.Separator();
        EditorGUILayout.LabelField("Color Scale", EditorStyles.boldLabel);
        EditorGUILayout.Space();
        overlay.overridePerLayerColorScaleAndOffset = EditorGUILayout.Toggle(new GUIContent("Override Color Scale", "Manually set color scale and offset of this layer, regardless of what the global values are from OVRManager.SetColorScaleAndOffset()."), overlay.overridePerLayerColorScaleAndOffset);
        if (overlay.overridePerLayerColorScaleAndOffset)
        {
            Vector4 colorScale  = EditorGUILayout.Vector4Field(new GUIContent("Color Scale", "Scale that the color values for this overlay will be multiplied by."), overlay.colorScale);
            Vector4 colorOffset = EditorGUILayout.Vector4Field(new GUIContent("Color Offset", "Offset that the color values for this overlay will be added to."), overlay.colorOffset);
            overlay.SetPerLayerColorScaleAndOffset(colorScale, colorOffset);
        }

        EditorUtility.SetDirty(overlay);
    }