您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

492 行
16 KiB

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<string, string> headers = new Dictionary<string, string>();
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();
}
}
}