import bpy
import gpu
import bgl
from gpu_extras.batch import batch_for_shader
from math import pi, cos, sin, ceil
if hasattr(bpy, 'test_handler'):
try:
bpy.types.SpaceView3D.draw_handler_remove(bpy.test_handler, 'WINDOW')
except: pass
def base_radius(segments):
radius = []
m = (1.0 / segments) * (pi * 2)
for p in range(segments):
radius.append((cos(m * p), sin(m * p)))
return radius
segments = 20
part = 1
if segments % 4 == 0:
part = int(segments / 4)
else:
part = int(ceil(segments / 4))
segments = part * 4
baseRadius = base_radius(segments)
baseRadius.append(baseRadius[0])
radius = []
for i in range(4):
start = part * i
end = part * (i + 1) + 1
radius.append(baseRadius[start:end])
def get_area_height():
height = 0
for area in bpy.context.screen.areas:
if area.type == 'VIEW_3D':
height = area.height
break
return height
def rounded_rectangle(x,y,w,h,r):
"""圆角矩形"""
if 2 * r > w:
r = int(w / 2)
if 2 * r > h:
r = int(h / 2)
coords = []
for index, item in enumerate(radius):
for m in item:
ox = x + w - r if index in [0,3] else x + r
oy = y - h + r if index in [0,1] else y - r
p1 = ox + m[0] * r
p2 = oy - m[1] * r
coords.append((p1, p2))
print(coords)
return coords
area_h = get_area_height()
x = 100
y = 100
cos = rounded_rectangle(x, area_h - y, 100, 100, 20)
shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
batch = batch_for_shader(shader, 'TRI_FAN', {"pos": cos})
def draw():
shader.bind()
shader.uniform_float("color", (0, 0, 0, 1.0))
bgl.glEnable(bgl.GL_BLEND)
# bgl.glEnable(bgl.GL_POLYGON_SMOOTH)
batch.draw(shader)
# bgl.glDisable(bgl.GL_POLYGON_SMOOTH)
bgl.glDisable(bgl.GL_BLEND)
bpy.test_handler = bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_PIXEL')
How to remove aliasing or lines?
