2
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')

enter image description here

How to remove aliasing or lines?

zeronofreya
  • 359
  • 1
  • 8
  • Related https://blender.stackexchange.com/questions/230545/rounded-corners-for-2d-rectangle/231170#231170 – batFINGER Sep 05 '21 at 04:08

0 Answers0