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:
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 # 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. Draw a circle.
@@ -11,10 +11,11 @@ def draw_circle_2d(position, color, radius, *, segments=32):
:arg radius: Radius of the circle. :arg radius: Radius of the circle.
:type radius: float :type radius: float
:arg segments: How many segments will be used to draw the circle. :arg segments: How many segments will be used to draw the circle.
Higher values give besser results but the drawing will take longer. Higher values give better results but the drawing will take longer.
:type segments: int 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 import gpu
from gpu.types import ( from gpu.types import (
GPUBatch, GPUBatch,
@@ -22,6 +23,12 @@ def draw_circle_2d(position, color, radius, *, segments=32):
GPUVertFormat, 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: if segments <= 0:
raise ValueError("Amount of segments must be greater than 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: if brush is None:
return return
radius = brush.size 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( return generate_from_enum_ex(
context, context,