using QFramework;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.Rendering;
using UnityEngine.UI;
using static UnityEditor.Progress;
[RequireComponent(typeof(Camera))]
public class ScreenShotPainter : MonoBehaviour
{
public class LineSegment
{
public RenderTexture Texture { get; set; }
public Color Color { get; set; }
public float Width { get; set; }
public bool IsEraser { get; set; }
public LineSegment(Color color, float width, bool isEraser)
{
Texture = RenderTexture.GetTemporary(Screen.width, Screen.height, 24);
Color = color;
Width = width;
IsEraser = isEraser;
}
}
public static ScreenShotPainter instance;
#region private numbers
//[SerializeField]
private string _captureSavePath;
//private Canvas _paintCanvas;
//[SerializeField]
private Texture _defaultBrushRawImage;
///
/// 涂鸦的RenderTexture图片
///
private RenderTexture _currentRenderTexture;
///
/// 涂鸦的RenderTexture图片
///
//private RenderTexture _historyRenderTexture;
///
/// 截图灰化背景图
///
//[SerializeField]
private RawImage _bgRawImage;
//绘图shader&material
//[SerializeField]
private Shader _paintBrushShader;
private Material _paintBrushMat;
//清理renderTexture的shader&material
//[SerializeField]
private Shader _clearBrushShader;
private Material _clearBrushMat;
//[SerializeField]
private Shader _eraserBrushShader;
private Material _eraserBrushMat;
//笔刷的默认颜色
[SerializeField]
private Color _defaultColor = Color.black;
//涂鸦的画布
[SerializeField]
private RawImage _paintCanvasImg;
///
/// 笔刷的大小
///
[SerializeField]
private float _brushSize = 300f;
///
/// 橡皮擦的大小
///
[SerializeField]
private float _eraserSize = 300f;
///
/// 笔刷间隔
///
private float _brushLerpSize;
///
/// 默认上一次点的位置
///
private Vector2 _lastPoint;
///
/// 截图框选左下角点坐标
///
private Vector2 _leftDownConnerPoint;
///
/// 截图框选右上角点坐标
///
private Vector2 _rightUpConnerPoint;
///
/// 截图框选左上角点坐标
///
private Vector2 _leftUpConnerPoint;
///
/// 截图框选右下角点坐标
///
private Vector2 _rightDownConnerPoint;
//屏幕的宽高
private int _screenWidth;
private int _screenHeight;
#region 框选截图区域
//框选截图起始点
private Vector2 _startPoint;
private Vector2 _endPoint;
//框的颜色
[SerializeField]
private Color _rectColor = Color.red;
private bool _haveCirmformRectStarPoint;
#endregion
///
/// 组件开关
///
private bool _enabled;
private bool _eraserFlag;
private CaptureType _defaultCaptureType;
///
/// 是否已经选了区域
///
private bool _haveRegion;
private bool _drawRegionRect;
///
/// 截图标记位
///
private bool _captureFlag;
///
/// 是否要截取UI
///
[SerializeField]
private bool _captureWithUI;
private Material _lineMaterial;
#region 一些外部注册事件
///
/// 画完区域后要做的事情(其实就是处理UI面板,给外部调用)
///
private FinishedRegionEvent _finishedRegionEvent = new FinishedRegionEvent();
///
/// 取消选择区域后要做的事情(其实就是处理UI面板,给外部调用)
///
private CannelRegionEvent _cannelRegionEvent = new CannelRegionEvent();
private FinishedCaptureEvent _finishedCapture = new FinishedCaptureEvent();
private EscapeCaptureEvent _escapeCaptureEvent = new EscapeCaptureEvent();
private EnterCaptureModeEvent _enterCaptureModeEvent = new EnterCaptureModeEvent();
private EraserModeUpdateEvent _eraserModeUpdateEvent = new EraserModeUpdateEvent();
#endregion
#endregion
#region public properties
public FinishedRegionEvent FinishedRegionEvent
{
get { return _finishedRegionEvent; }
}
public CannelRegionEvent CannelRegionEvent
{
get { return _cannelRegionEvent; }
}
public FinishedCaptureEvent FinishedCapture
{
get { return _finishedCapture; }
}
public EscapeCaptureEvent EscapeCaptureEvent
{
get { return _escapeCaptureEvent; }
}
#endregion
private Stack _lineStack = new Stack();
private LineSegment _currentLine;
public enum Status
{
Pen,
Eraser,
Line,
Rect,
Circle,
}
public EnterCaptureModeEvent EnterCaptureModeEvent
{
get { return _enterCaptureModeEvent; }
}
public EraserModeUpdateEvent EraserModeUpdateEvent
{
get { return _eraserModeUpdateEvent; }
}
#region life circle
bool isInited = false;
Status status = Status.Pen;
private CommandBuffer _commandBuffer;
private float _lastPaintTime;
private float _paintInterval = 0.02f; // 每0.02秒绘制一次
Image circleImg;
Image rectImg;
void Awake()
{
instance = this;
}
public void Init(RawImage drawImg, RawImage bgRawImg, Image circleImg, Image rectImg)
{
if (isInited == false)
{
isInited = true;
this.circleImg = circleImg;
this.rectImg = rectImg;
_commandBuffer = new CommandBuffer();
_commandBuffer.name = "PaintCommandBuffer";
_bgRawImage = bgRawImg;
_paintCanvasImg = drawImg;
_captureWithUI = true;
_captureSavePath = Application.dataPath;
_defaultCaptureType = CaptureType.FreeRegion;
//_paintCanvasImg = GameObject.FindObjectOfType