UI: Improve circle drawing of cursor for uv sculpting

Calculate segments based on radius.

Differential Revision: https://developer.blender.org/D15591
This commit is contained in:
Chris Blackbourn 2022-08-03 09:38:51 +12:00
parent 8081a05015
commit 18377c4f5e
2 changed files with 12 additions and 5 deletions

View File

@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-or-later
def draw_circle_2d(position, color, radius, *, segments=32):
def draw_circle_2d(position, color, radius, *, segments=None):
"""
Draw a circle.
@ -11,10 +11,11 @@ def draw_circle_2d(position, color, radius, *, segments=32):
:arg radius: Radius of the circle.
:type radius: float
:arg segments: How many segments will be used to draw the circle.
Higher values give besser results but the drawing will take longer.
:type segments: int
Higher values give better results but the drawing will take longer.
If None or not specified, an automatic value will be calculated.
:type segments: int or None
"""
from math import sin, cos, pi
from math import sin, cos, pi, ceil, acos
import gpu
from gpu.types import (
GPUBatch,
@ -22,6 +23,12 @@ def draw_circle_2d(position, color, radius, *, segments=32):
GPUVertFormat,
)
if segments is None:
max_pixel_error = 0.25 # TODO: multiply 0.5 by display dpi
segments = int(ceil(pi / acos(1.0 - max_pixel_error / radius)))
segments = max(segments, 8)
segments = min(segments, 1000)
if segments <= 0:
raise ValueError("Amount of segments must be greater than 0.")

View File

@ -1889,7 +1889,7 @@ class _defs_image_uv_sculpt:
if brush is None:
return
radius = brush.size
draw_circle_2d(xy, (1.0,) * 4, radius, segments=32)
draw_circle_2d(xy, (1.0,) * 4, radius)
return generate_from_enum_ex(
context,