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:
@@ -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.")
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user