Files
2025-05-29 22:31:40 +03:00

62 lines
2.0 KiB
C#

using UnityEngine;
using UnityEditor;
using System;
using System.Collections;
using System.Collections.Generic;
namespace Obi
{
public class ObiScreenSpaceBrush : ObiBrushBase
{
public ObiScreenSpaceBrush(Action onStrokeStart, Action onStrokeUpdate, Action onStrokeEnd) : base(onStrokeStart, onStrokeUpdate, onStrokeEnd)
{
radius = 32;
}
protected override float WeightFromDistance(float distance)
{
// anything outside the brush should have zero weight:
if (distance > radius)
return 0;
return 1;
}
protected override void GenerateWeights(Vector3[] positions)
{
for (int i = 0; i < positions.Length; i++)
{
// get particle position in gui space:
Vector2 pos = HandleUtility.WorldToGUIPoint(positions[i]);
// get distance from mouse position to particle position:
weights[i] = WeightFromDistance(Vector3.Distance(Event.current.mousePosition, pos));
}
}
protected override void OnRepaint()
{
base.OnRepaint();
Camera cam = Camera.current;
float depth = (cam.nearClipPlane + cam.farClipPlane) * 0.5f;
float ppp = EditorGUIUtility.pixelsPerPoint;
Vector2 mousePos = new Vector2(Event.current.mousePosition.x * ppp,
cam.pixelHeight - Event.current.mousePosition.y * ppp);
Handles.color = ObiEditorSettings.GetOrCreateSettings().brushColor;
Vector3 point = new Vector3(mousePos.x, mousePos.y, depth);
Vector3 wsPoint = cam.ScreenToWorldPoint(point);
var p1 = cam.ScreenToWorldPoint(new Vector3(1, 0, depth));
var p2 = cam.ScreenToWorldPoint(new Vector3(0, 0, depth));
float units = Vector3.Distance(p1, p2);
Handles.DrawWireDisc(wsPoint, cam.transform.forward, radius * units);
}
}
}