using System; using System.Collections.Generic; using System.Linq; using Unity.UIWidgets.editor; using Unity.UIWidgets.painting; using Unity.UIWidgets.ui; using UnityEditor; using UnityEditor.Experimental.UIElements; using UnityEngine; using UnityEngine.Rendering; using BlendMode = Unity.UIWidgets.ui.BlendMode; using Color = Unity.UIWidgets.ui.Color; using Gradient = Unity.UIWidgets.ui.Gradient; using Random = System.Random; using Rect = Unity.UIWidgets.ui.Rect; namespace UIWidgets.Tests { public class CanvasAndLayers : EditorWindow { static Material _guiTextureMat; internal static Material _getGUITextureMat() { if (_guiTextureMat) { return _guiTextureMat; } var guiTextureShader = Shader.Find("UIWidgets/GUITexture"); if (guiTextureShader == null) { throw new Exception("UIWidgets/GUITexture not found"); } _guiTextureMat = new Material(guiTextureShader); return _guiTextureMat; } private readonly Action[] _options; private readonly string[] _optionStrings; private int _selected; private PaintingBinding _paintingBinding; private ImageStream _stream; private RenderTexture _renderTexture; private WindowAdapter _windowAdapter; CanvasAndLayers() { this._options = new Action[] { this.drawPloygon4, this.drawRect, this.drawRectShadow, this.drawImageRect, this.drawPicture, this.clipRect, this.clipRRect, this.saveLayer, this.drawLine, }; this._optionStrings = this._options.Select(x => x.Method.Name).ToArray(); this._selected = 0; this.titleContent = new GUIContent("CanvasAndLayers"); this.SetAntiAliasing(4); } void OnGUI() { this._selected = EditorGUILayout.Popup("test case", this._selected, this._optionStrings); if (_selected == 3) { if (GUI.Button(new UnityEngine.Rect(20, 50, 100, 20), "Image 1")) { LoadImage( "http://a.hiphotos.baidu.com/image/h%3D300/sign=10b374237f0e0cf3bff748fb3a47f23d/adaf2edda3cc7cd90df1ede83401213fb80e9127.jpg"); } if (GUI.Button(new UnityEngine.Rect(20, 150, 100, 20), "Image 2")) { LoadImage( "http://a.hiphotos.baidu.com/image/pic/item/cf1b9d16fdfaaf519b4aa960875494eef11f7a47.jpg"); } if (GUI.Button(new UnityEngine.Rect(20, 250, 100, 20), "Image 3")) { LoadImage( "http://a.hiphotos.baidu.com/image/pic/item/2f738bd4b31c8701c1e721dd2a7f9e2f0708ffbc.jpg"); } } this._windowAdapter.OnGUI(); if (Event.current.type == EventType.Repaint) { this.createRenderTexture(); Window.instance = this._windowAdapter; this._options[this._selected](); Window.instance = null; Graphics.DrawTexture(new UnityEngine.Rect(0, 0, this.position.width, this.position.height), this._renderTexture, _getGUITextureMat()); } } void Update() { this._windowAdapter.Update(); } private void OnEnable() { this._windowAdapter = new EditorWindowAdapter(this); this._windowAdapter.OnEnable(); this._paintingBinding = new PaintingBinding(this._windowAdapter); this._paintingBinding.initInstances(); } void createRenderTexture() { var width = (int) (this.position.width * EditorGUIUtility.pixelsPerPoint); var height = (int) (this.position.height * EditorGUIUtility.pixelsPerPoint); if (this._renderTexture == null || this._renderTexture.width != width || this._renderTexture.height != height) { var desc = new RenderTextureDescriptor( width, height, RenderTextureFormat.Default, 24) { msaaSamples = QualitySettings.antiAliasing, useMipMap = false, autoGenerateMips = false, }; this._renderTexture = RenderTexture.GetTemporary(desc); } } private void LoadImage(string url) { Dictionary headers = new Dictionary(); NetworkImage networkImage = new NetworkImage(url, headers); ImageConfiguration imageConfig = new ImageConfiguration(); _stream = networkImage.resolve(imageConfig); } void drawPloygon4() { var canvas = new CommandBufferCanvas(this._renderTexture, (float) Window.instance.devicePixelRatio); var paint = new Paint { color = new Color(0xFFFF0000), }; canvas.drawRect( Rect.fromLTRB(10, 10, 110, 110), paint); var path = new Path(); path.moveTo(10, 150); path.lineTo(10, 160); path.lineTo(140, 120); path.lineTo(110, 180); path.close(); canvas.drawPath(path, paint); canvas.flush(); } void drawLine() { var canvas = new CommandBufferCanvas(this._renderTexture, (float) Window.instance.devicePixelRatio); var paint = new Paint { color = new Color(0xFFFF0000), style = PaintingStyle.stroke, strokeWidth = 10, }; canvas.drawLine( new Offset(10, 20), new Offset(50, 20), paint); canvas.drawLine( new Offset(10, 10), new Offset(100, 100), paint); canvas.drawLine( new Offset(10, 10), new Offset(10, 50), paint); canvas.drawLine( new Offset(40, 10), new Offset(90, 10), paint); var widthPaint = new Paint { color = new Color(0xFFFF0000), strokeWidth = 4, }; canvas.drawLine( new Offset(40, 20), new Offset(120, 190), widthPaint); canvas.flush(); } void drawRect() { var canvas = new CommandBufferCanvas(this._renderTexture, (float) Window.instance.devicePixelRatio); var paint = new Paint { color = new Color(0xFFFF0000), }; canvas.rotate(15 * Mathf.PI / 180); var rect = Rect.fromLTWH(10, 10, 100, 100); var rrect = RRect.fromRectAndCorners(rect, 0, 4, 8, 16); canvas.drawRRect(rrect, paint); paint = new Paint { color = new Color(0xFF00FF00), }; rect = Rect.fromLTWH(10, 150, 100, 100); rrect = RRect.fromRectAndCorners(rect, 0, 4, 8, 16); canvas.drawRRect(rrect, paint); rect = Rect.fromLTWH(150, 150, 100, 100); rrect = RRect.fromRectAndCorners(rect, 10, 12, 14, 16); var rect1 = Rect.fromLTWH(160, 160, 80, 80); var rrect1 = RRect.fromRectAndCorners(rect1, 5, 6, 7, 8); canvas.drawDRRect(rrect, rrect1, paint); canvas.flush(); } void drawRectShadow() { // var canvas = new CanvasImpl(); // // var paint = new Paint { // color = new Color(0xFF00FF00), // blurSigma = 3.0, // }; // // canvas.drawRectShadow( // Rect.fromLTWH(10, 10, 100, 100), // paint); // // paint = new Paint { // color = new Color(0xFFFFFF00), // blurSigma = 2.0, // }; // // canvas.drawRectShadow( // Rect.fromLTWH(10, 150, 100, 100), // paint); } void drawPicture() { var pictureRecorder = new PictureRecorder(); var canvas = new RecorderCanvas(pictureRecorder); var paint = new Paint { color = new Color(0xFFFF0000), }; var path = new Path(); path.moveTo(10, 10); path.lineTo(10, 110); path.lineTo(90, 110); path.lineTo(100, 10); path.close(); canvas.drawPath(path, paint); paint = new Paint { color = new Color(0xFFFFFF00), }; var rect = Rect.fromLTWH(10, 150, 100, 100); var rrect = RRect.fromRectAndCorners(rect, 0, 4, 8, 16); var rect1 = Rect.fromLTWH(18, 152, 88, 92); var rrect1 = RRect.fromRectAndCorners(rect1, 0, 4, 8, 16); canvas.drawDRRect(rrect, rrect1, paint); canvas.rotate(-45 * Mathf.PI / 180, new Offset(150, 150)); paint = new Paint { color = new Color(0xFF00FFFF), blurSigma = 3, }; canvas.drawRect( Rect.fromLTWH(150, 150, 110, 120), paint); var picture = pictureRecorder.endRecording(); Debug.Log("picture.paintBounds: " + picture.paintBounds); var editorCanvas = new CommandBufferCanvas(this._renderTexture, (float) Window.instance.devicePixelRatio); editorCanvas.drawPicture(picture); editorCanvas.rotate(-15 * Mathf.PI / 180); editorCanvas.translate(100, 100); editorCanvas.drawPicture(picture); editorCanvas.flush(); } void drawImageRect() { if (_stream == null || _stream.completer == null || _stream.completer._currentImgae == null) { return; } var canvas = new CommandBufferCanvas(this._renderTexture, (float) Window.instance.devicePixelRatio); var paint = new Paint { color = new Color(0x7FFF0000), }; canvas.drawImageRect( _stream.completer._currentImgae.image.texture, Rect.fromLTWH(100, 50, 250, 250), paint ); canvas.flush(); } void clipRect() { var pictureRecorder = new PictureRecorder(); var canvas = new RecorderCanvas(pictureRecorder); var paint = new Paint { color = new Color(0xFFFF0000), }; var path = new Path(); path.moveTo(10, 10); path.lineTo(10, 110); path.lineTo(90, 110); path.lineTo(110, 10); path.close(); canvas.drawPath(path, paint); paint = new Paint { color = new Color(0xFFFFFF00), }; var rect = Rect.fromLTWH(10, 150, 100, 100); var rrect = RRect.fromRectAndCorners(rect, 0, 4, 8, 16); var rect1 = Rect.fromLTWH(18, 152, 88, 92); var rrect1 = RRect.fromRectAndCorners(rect1, 0, 4, 8, 16); canvas.drawDRRect(rrect, rrect1, paint); canvas.rotate(-45 * Mathf.PI / 180.0, new Offset(150, 150)); // paint = new Paint { // color = new Color(0xFF00FFFF), // blurSigma = 3, // }; // canvas.drawRectShadow( // Rect.fromLTWH(150, 150, 110, 120), // paint); var picture = pictureRecorder.endRecording(); Debug.Log("picture.paintBounds: " + picture.paintBounds); var editorCanvas = new CommandBufferCanvas(this._renderTexture, (float) Window.instance.devicePixelRatio); editorCanvas.rotate(-5 * Mathf.PI / 180); editorCanvas.clipRect(Rect.fromLTWH(25, 15, 250, 250)); editorCanvas.rotate(5 * Mathf.PI / 180); editorCanvas.drawPicture(picture); editorCanvas.rotate(-15 * Mathf.PI / 180); editorCanvas.translate(100, 100); editorCanvas.drawPicture(picture); editorCanvas.flush(); } void clipRRect() { var pictureRecorder = new PictureRecorder(); var canvas = new RecorderCanvas(pictureRecorder); var paint = new Paint { color = new Color(0xFFFF0000), }; var path = new Path(); path.moveTo(10, 10); path.lineTo(10, 110); path.lineTo(90, 110); path.lineTo(110, 10); path.close(); canvas.drawPath(path, paint); paint = new Paint { color = new Color(0xFFFFFF00), }; var rect = Rect.fromLTWH(10, 150, 100, 100); var rrect = RRect.fromRectAndCorners(rect, 0, 4, 8, 16); var rect1 = Rect.fromLTWH(18, 152, 88, 92); var rrect1 = RRect.fromRectAndCorners(rect1, 0, 4, 8, 16); canvas.drawDRRect(rrect, rrect1, paint); canvas.rotate(-45 * Mathf.PI / 180.0, new Offset(150, 150)); // paint = new Paint { // color = new Color(0xFF00FFFF), // blurSigma = 3, // }; // canvas.drawRectShadow( // Rect.fromLTWH(150, 150, 110, 120), // paint); var picture = pictureRecorder.endRecording(); Debug.Log("picture.paintBounds: " + picture.paintBounds); var editorCanvas = new CommandBufferCanvas(this._renderTexture, (float) Window.instance.devicePixelRatio); editorCanvas.rotate(-5 * Mathf.PI / 180); editorCanvas.clipRRect(RRect.fromRectAndRadius(Rect.fromLTWH(25, 15, 250, 250), 50)); editorCanvas.rotate(5 * Mathf.PI / 180); editorCanvas.drawPicture(picture); editorCanvas.rotate(-15 * Mathf.PI / 180); editorCanvas.translate(100, 100); editorCanvas.drawPicture(picture); editorCanvas.flush(); } void saveLayer() { var pictureRecorder = new PictureRecorder(); var canvas = new RecorderCanvas(pictureRecorder); var paint = new Paint { color = new Color(0xFFFF0000), }; var path = new Path(); path.moveTo(10, 10); path.lineTo(10, 110); path.lineTo(90, 110); path.lineTo(110, 10); path.close(); canvas.drawPath(path, paint); paint = new Paint { color = new Color(0xFFFFFF00), }; var rect = Rect.fromLTWH(10, 150, 100, 100); var rrect = RRect.fromRectAndCorners(rect, 0, 4, 8, 16); var rect1 = Rect.fromLTWH(18, 152, 88, 92); var rrect1 = RRect.fromRectAndCorners(rect1, 0, 4, 8, 16); canvas.drawDRRect(rrect, rrect1, paint); canvas.rotate(-45 * Mathf.PI / 180.0, new Offset(150, 150)); // paint = new Paint { // color = new Color(0xFF00FFFF), // blurSigma = 3, // }; // canvas.drawRectShadow( // Rect.fromLTWH(150, 150, 110, 120), // paint); var picture = pictureRecorder.endRecording(); Debug.Log("picture.paintBounds: " + picture.paintBounds); var editorCanvas = new CommandBufferCanvas(this._renderTexture, (float) Window.instance.devicePixelRatio); editorCanvas.saveLayer(picture.paintBounds, new Paint {color = new Color(0x7FFFFFFF)}); editorCanvas.drawPicture(picture); editorCanvas.restore(); editorCanvas.translate(150, 0); editorCanvas.saveLayer(picture.paintBounds, new Paint {color = new Color(0xFFFFFFFF)}); editorCanvas.drawPicture(picture); editorCanvas.restore(); editorCanvas.flush(); } } }