Esempio n. 1
0
        public static void DrawComponent(Rect rect, WindowComponent component, int customKey)
        {
            var key = UnityEngine.UI.Windows.Utilities.UIWSMath.GetKey(component.GetHashCode(), customKey);

            if (Event.current.type == EventType.MouseUp ||
                Event.current.type == EventType.MouseDown ||
                Event.current.type == EventType.MouseMove)
            {
                if (WindowLayoutUtilities.tempPreviewTimers.ContainsKey(key) == true)
                {
                    WindowLayoutUtilities.tempPreviewTimers[key] = 0d;
                }
            }

            if (Event.current.type == EventType.Repaint)
            {
                if (WindowLayoutUtilities.tempPreviewTimers.TryGetValue(key, out var timer) == true)
                {
                    if (EditorApplication.timeSinceStartup - timer > 100d)
                    {
                        if (WindowLayoutUtilities.tempPreviewRects.TryGetValue(key, out var bufferRect) == true)
                        {
                            if (Mathf.Abs(rect.width - bufferRect.width) > 1f ||
                                Mathf.Abs(rect.height - bufferRect.height) > 1f)
                            {
                                WindowLayoutUtilities.tempPreviewRects.Remove(key);
                                if (WindowLayoutUtilities.tempPreviewBuffer.TryGetValue(key, out var t) == true)
                                {
                                    Object.DestroyImmediate(t);
                                }

                                WindowLayoutUtilities.tempPreviewBuffer.Remove(key);
                                WindowLayoutUtilities.tempPreviewTimers.Remove(key);
                            }
                        }
                    }
                }
            }

            if (WindowLayoutUtilities.tempPreviewBuffer.TryGetValue(key, out var buffer) == true)
            {
                EditorGUI.DrawTextureTransparent(rect, buffer, ScaleMode.ScaleToFit);
            }
            else if (Event.current.type == EventType.Repaint)
            {
                var camera = new GameObject("Camera", typeof(Camera));
                camera.hideFlags = HideFlags.HideAndDontSave;

                var cameraInstance = camera.GetComponent <Camera>();
                var canvas         = new GameObject("Canvas", typeof(Canvas), typeof(UnityEngine.UI.CanvasScaler));
                canvas.hideFlags = HideFlags.HideAndDontSave;

                var instance = Object.Instantiate(component, canvas.transform);
                instance.gameObject.hideFlags = HideFlags.HideAndDontSave;
                instance.SetTransformAs(component.transform as RectTransform);

                var canvasInstance = canvas.GetComponent <Canvas>();
                canvasInstance.renderMode  = RenderMode.ScreenSpaceCamera;
                canvasInstance.worldCamera = cameraInstance;
                cameraInstance.clearFlags  = CameraClearFlags.Depth;
                var canvases = canvas.GetComponentsInChildren <Canvas>();
                foreach (var c in canvases)
                {
                    c.enabled = false;
                }

                var canvasScaler = canvas.GetComponent <UnityEngine.UI.CanvasScaler>();
                canvasScaler.uiScaleMode         = UnityEngine.UI.CanvasScaler.ScaleMode.ScaleWithScreenSize;
                canvasScaler.referenceResolution = new Vector2(rect.width, 0f);
                canvasScaler.screenMatchMode     = UnityEngine.UI.CanvasScaler.ScreenMatchMode.MatchWidthOrHeight;
                canvasScaler.matchWidthOrHeight  = 0f;

                var type  = canvasScaler.GetType();
                var binds = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;
                type.GetField("m_Canvas", binds).SetValue(canvasScaler, canvasInstance);
                type.GetMethod("Handle", binds).Invoke(canvasScaler, null);
                Canvas.ForceUpdateCanvases();

                var rt = new RenderTexture((int)rect.width, (int)rect.height, 32, RenderTextureFormat.ARGB32);
                WindowLayoutUtilities.tempPreviewBuffer.Add(key, rt);
                WindowLayoutUtilities.tempPreviewRects.Add(key, rect);
                WindowLayoutUtilities.tempPreviewTimers.Add(key, EditorApplication.timeSinceStartup);

                cameraInstance.Render();
                EditorApplication.delayCall += () => {
                    foreach (var c in canvases)
                    {
                        c.enabled = true;
                    }

                    cameraInstance.targetTexture = rt;
                    cameraInstance.Render();
                    cameraInstance.targetTexture = null;

                    foreach (var c in canvases)
                    {
                        c.enabled = false;
                    }

                    EditorApplication.delayCall += () => {
                        GameObject.DestroyImmediate(camera);
                        GameObject.DestroyImmediate(canvas);
                    };
                };
            }
        }