完成矩形和圆形绘画

This commit is contained in:
shenjianxing 2025-02-24 11:11:14 +08:00
parent ef725203b5
commit 8cfeecd8e8
4 changed files with 223 additions and 68 deletions

View File

@ -185,6 +185,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: ec04d319ffe11bf449631785ba9df2ca, type: 3}
m_Name:
m_EditorClassIdentifier:
captureBGImg: {fileID: 1613795782999759057}
RawImg: {fileID: 3350589312635769069}
Content: {fileID: 6174875567737795578}
ClearBtn: {fileID: 2761790485595999517}
BackBtn: {fileID: 8433557736356431636}
@ -200,8 +202,8 @@ MonoBehaviour:
Pen: {fileID: 4450100727786627695}
Eraser: {fileID: 2941908847590949937}
Line: {fileID: 1266115251622546497}
Fang: {fileID: 5657928476508508069}
Yuan: {fileID: 1768255187776321352}
Rect: {fileID: 5657928476508508069}
Circle: {fileID: 1768255187776321352}
Arrow: {fileID: 626467036928040670}
Colors: {fileID: 2726755476368017795}
Black: {fileID: 8105826465705320577}
@ -213,8 +215,6 @@ MonoBehaviour:
Purple: {fileID: 944934755680367845}
White: {fileID: 8867501838096098682}
More: {fileID: 5620078665499499056}
captureBGImg: {fileID: 1613795782999759057}
RawImg: {fileID: 3350589312635769069}
--- !u!1 &572013391981846340
GameObject:
m_ObjectHideFlags: 0
@ -5177,7 +5177,7 @@ GameObject:
- component: {fileID: 815582870047914654}
- component: {fileID: 1768255187776321352}
m_Layer: 5
m_Name: Yuan
m_Name: Circle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@ -8097,7 +8097,7 @@ GameObject:
- component: {fileID: 8770634451895496709}
- component: {fileID: 5657928476508508069}
m_Layer: 5
m_Name: Fang
m_Name: Rect
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0

View File

@ -2,10 +2,12 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using static UnityEditor.Progress;
[RequireComponent(typeof(Camera))]
public class ScreenShotPainter : MonoBehaviour
@ -210,7 +212,8 @@ public class ScreenShotPainter : MonoBehaviour
Pen,
Eraser,
Line,
Rect,
Circle,
}
public EnterCaptureModeEvent EnterCaptureModeEvent
{
@ -605,12 +608,12 @@ public class ScreenShotPainter : MonoBehaviour
{
if (_enabled && _haveRegion)
{
Debug.LogError("OnPaintBeginDrag");
switch (status)
{
case Status.Pen:
break;
case Status.Line:
case Status.Rect:
if (Input.GetMouseButton(0))
{
@ -622,6 +625,20 @@ public class ScreenShotPainter : MonoBehaviour
LerpPaint(Input.mousePosition, _eraserFlag);
}
break;
case Status.Circle:
if (_currentLine == null)
{
if (_currentLine == null)
{
_currentLine = new LineSegment(_paintBrushMat.GetColor("_Color"), _brushSize, _eraserFlag);
}
_lastPoint = Input.mousePosition;
}
break;
}
}
@ -637,25 +654,45 @@ public class ScreenShotPainter : MonoBehaviour
private void PaintDragging(BaseEventData data)
{
if (_enabled && _haveRegion)
{
if (Input.GetMouseButton(0))
{
switch (status)
{
case Status.Pen:
case Status.Eraser:
if (Input.GetMouseButton(0))
{
if (_currentLine == null)
{
_currentLine = new LineSegment(_paintBrushMat.GetColor("_Color"), _brushSize, _eraserFlag);
}
_currentLine.Points.Add(Input.mousePosition);
LerpPaint(Input.mousePosition, _eraserFlag);
}
break;
case Status.Line:
break;
//case Status.Line:
// if (_currentLine != null)
// {
// if (_currentLine.Points.Count <= 0)
// {
// _currentLine.Points.Add(Input.mousePosition);
// LerpPaint(Input.mousePosition, false);
// }
// }
// break;
//case Status.Rect:
// if (_currentLine != null)
// {
// if (_currentLine.Points.Count <= 0)
// {
// _currentLine.Points.Add(Input.mousePosition);
// LerpPaint(Input.mousePosition, false);
// }
// }
// break;
}
}
}
}
@ -666,10 +703,124 @@ public class ScreenShotPainter : MonoBehaviour
switch (status)
{
case Status.Pen:
case Status.Line:
case Status.Eraser:
if (Input.GetMouseButtonUp(0))
{
FinishedRaw();
}
break;
case Status.Line:
if (_currentLine != null)
{
_currentLine.Points.Add(Input.mousePosition);
LerpPaint(Input.mousePosition, false);
FinishedRaw();
}
break;
case Status.Rect:
{
if (_currentLine != null)
{
var points = GenerateRectanglePoints(_lastPoint, Input.mousePosition);
_currentLine.Points.Add(points[1]);
LerpPaint(points[1], false);
_currentLine.Points.Add(Input.mousePosition);
LerpPaint(Input.mousePosition, false);
_currentLine.Points.Add(points[2]);
LerpPaint(points[2], false);
_currentLine.Points.Add(_lastPoint);
LerpPaint(points[0], false);
FinishedRaw();
}
}
break;
case Status.Circle:
{
float radius = Vector2.Distance(_lastPoint, Input.mousePosition);
var points = GenerateCirclePoints(_lastPoint, radius);
_lastPoint = default;
foreach (var item in points)
{
_currentLine.Points.Add(item);
LerpPaint(item, false);
}
_currentLine.Points.Add(points[0]);
LerpPaint(points[0], false);
FinishedRaw();
}
break;
default:
break;
}
}
}
List<Vector2> GenerateCirclePoints(Vector2 center, float r, int numPoints = 36)
{
List<Vector2> points = new List<Vector2>();
for (int i = 0; i < numPoints; i++)
{
// 计算每个点的角度
float angle = 2 * Mathf.PI * i / numPoints;
// 根据三角函数计算点的坐标
float x = center.x + r * Mathf.Cos(angle);
float y = center.y + r * Mathf.Sin(angle);
points.Add(new Vector2(x, y));
}
return points;
}
Vector2[] GenerateRectanglePoints(Vector2 start, Vector2 end)
{
Vector2[] points = new Vector2[4];
points[0] = start;
points[3] = end;
if (start.x < end.x)
{
if (start.y < end.y)
{
// 从左下方到右上方
points[1] = new Vector2(end.x, start.y);
points[2] = new Vector2(start.x, end.y);
}
else
{
// 从左上方到右下方
points[1] = new Vector2(end.x, start.y);
points[2] = new Vector2(start.x, end.y);
}
}
else
{
if (start.y < end.y)
{
// 从右下方到左上方
points[1] = new Vector2(start.x, end.y);
points[2] = new Vector2(end.x, start.y);
}
else
{
// 从右上方到左下方
points[1] = new Vector2(start.x, end.y);
points[2] = new Vector2(end.x, start.y);
}
}
return points;
}
public void FinishedRaw()
{
if (_currentLine != null)
{
_lineStack.Push(_currentLine);
@ -678,12 +829,8 @@ public class ScreenShotPainter : MonoBehaviour
_lastPoint = Vector2.zero;
}
break;
default:
break;
}
}
}
public void Undo()
{
if (_lineStack.Count > 0)
@ -712,35 +859,10 @@ public class ScreenShotPainter : MonoBehaviour
_tempRenderTexture = RenderTexture.GetTemporary(_screenWidth, _screenHeight, 24);
_paintCanvasImg.texture = _blitRenderTexture;
_lineStack.Clear();
}
private void DrawLineSegment(LineSegment line)
{
if (line.Points.Count < 2)
return;
for (int i = 1; i < line.Points.Count; i++)
{
Vector2 startPoint = line.Points[i - 1];
Vector2 endPoint = line.Points[i];
if (line.IsEraser)
{
_eraserBrushMat.SetVector("_UV", new Vector2(startPoint.x / _screenWidth, startPoint.y / _screenHeight));
Graphics.Blit(_blitRenderTexture, _tempRenderTexture, _eraserBrushMat);
Graphics.Blit(_tempRenderTexture, _blitRenderTexture);
}
else
{
_paintBrushMat.SetColor("_Color", line.Color);
_paintBrushMat.SetFloat("_Size", line.Width);
_paintBrushMat.SetVector("_UV", new Vector2(startPoint.x / _screenWidth, startPoint.y / _screenHeight));
Graphics.Blit(_blitRenderTexture, _tempRenderTexture, _paintBrushMat);
Graphics.Blit(_tempRenderTexture, _blitRenderTexture);
}
}
}
/// <summary>
/// 绘画进行插值
/// </summary>

View File

@ -5,11 +5,15 @@ using QFramework;
namespace QFramework.Example
{
// Generate Id:fa83cbd2-4e57-43de-97e7-b9a5b8e8da19
// Generate Id:4d840482-3ece-436e-9579-de5573072430
public partial class UIDraw
{
public const string Name = "UIDraw";
[SerializeField]
public UnityEngine.UI.RawImage captureBGImg;
[SerializeField]
public UnityEngine.UI.RawImage RawImg;
[SerializeField]
public RectTransform Content;
[SerializeField]
@ -41,9 +45,9 @@ namespace QFramework.Example
[SerializeField]
public UnityEngine.UI.Toggle Line;
[SerializeField]
public UnityEngine.UI.Toggle Fang;
public UnityEngine.UI.Toggle Rect;
[SerializeField]
public UnityEngine.UI.Toggle Yuan;
public UnityEngine.UI.Toggle Circle;
[SerializeField]
public UnityEngine.UI.Toggle Arrow;
[SerializeField]
@ -66,15 +70,13 @@ namespace QFramework.Example
public UnityEngine.UI.Toggle White;
[SerializeField]
public UnityEngine.UI.Image More;
[SerializeField]
public UnityEngine.UI.RawImage captureBGImg;
[SerializeField]
public UnityEngine.UI.RawImage RawImg;
private UIDrawData mPrivateData = null;
protected override void ClearUIComponents()
{
captureBGImg = null;
RawImg = null;
Content = null;
ClearBtn = null;
BackBtn = null;
@ -90,8 +92,8 @@ namespace QFramework.Example
Pen = null;
Eraser = null;
Line = null;
Fang = null;
Yuan = null;
Rect = null;
Circle = null;
Arrow = null;
Colors = null;
Black = null;
@ -103,8 +105,6 @@ namespace QFramework.Example
Purple = null;
White = null;
More = null;
captureBGImg = null;
RawImg = null;
mData = null;
}

View File

@ -96,6 +96,7 @@ namespace QFramework.Example
if (isOn)
{
ScreenShotPainter.instance.SetStatus(ScreenShotPainter.Status.Pen);
RefreshPenSize();
}
});
Eraser.onValueChanged.AddListener(isOn =>
@ -103,6 +104,7 @@ namespace QFramework.Example
if (isOn)
{
ScreenShotPainter.instance.SetStatus(ScreenShotPainter.Status.Eraser);
RefreshPenSize();
}
});
Line.onValueChanged.AddListener(isOn =>
@ -114,6 +116,21 @@ namespace QFramework.Example
});
Rect.onValueChanged.AddListener(isOn =>
{
if (isOn)
{
ScreenShotPainter.instance.SetStatus(ScreenShotPainter.Status.Rect);
}
});
Circle.onValueChanged.AddListener(isOn =>
{
if (isOn)
{
ScreenShotPainter.instance.SetStatus(ScreenShotPainter.Status.Circle);
}
});
}
public void ChangeColor(Color color)
@ -124,21 +141,37 @@ namespace QFramework.Example
public void RefreshPenSize()
{
var normalValue = PenSizeSlider.value / PenSizeSlider.maxValue;
float size = PaintingParams.BrushSizeMaxValue + (1 - normalValue) * PaintingParams.BrushSizeFactor;
//ScreenShotPainter.instance.SetPaintingSize(size);
if (Eraser.isOn)
{
//´óС
float size = PaintingParams.EraserSizeMaxValue + (1 - normalValue) * PaintingParams.EraserSizeFactor;
float sizeY = ((float)Screen.height / (float)Screen.width) * size;
ScreenShotPainter.instance.SetEraserSize(size, sizeY);
float width = Screen.width / size;
float height = Screen.width / size;//²»Ëõ·ÅyÖáÁË
Icon.transform.localScale = new Vector3(width / Icon.rectTransform.rect.width, height / Icon.rectTransform.rect.height, 1);
}
else
{
float size = PaintingParams.BrushSizeMaxValue + (1 - normalValue) * PaintingParams.BrushSizeFactor;
float sizeY = ((float)Screen.height / (float)Screen.width) * size;
ScreenShotPainter.instance.SetPaintingSize(size, sizeY);
float width = Screen.width / size;
float height = Screen.width / size;//²»Ëõ·ÅyÖáÁË
Icon.transform.localScale = new Vector3(width / Icon.rectTransform.rect.width, height / Icon.rectTransform.rect.height, 1);
}
Penvalue.text = PenSizeSlider.value.ToString();
}
public void RefreshAlphaSet()