Воть :3
DrawPoly вызывается 1 раз!
Единственное косинусов/синусов много :C
Function DrawRoundedRect(x:Float, y:Float, width:Float, height:Float, r:Float = 30, segs:Int = 4)
segs = Max(segs, 1)
r = Max(r, 1)
Local xy:Float[] = New Float[((segs * 4) + 8) * 2]
Local fstep:Float = 90 / segs ' one step for draw corners
Local wpos:Int = 0 ' writing position in xy:Float[] array
' lt corner
xy[wpos] = x
xy[wpos + 1] = y + r
wpos:+2
For Local i:Int = 0 Until segs
Local fang:Float = 180 + i * fstep
xy[wpos] = (x + r) + Cos(fang) * r
xy[wpos + 1] = (y + r) + Sin(fang) * r
wpos:+2
Next
xy[wpos] = x + r
xy[wpos + 1] = y
wpos:+2
' rt corner
xy[wpos] = x + width - r
xy[wpos + 1] = y
wpos:+2
For Local i:Int = 0 Until segs
Local fang:Float = 270 + i * fstep
xy[wpos] = (x + width - r) + Cos(fang) * r
xy[wpos + 1] = (y + r) + Sin(fang) * r
wpos:+2
Next
xy[wpos] = x + width
xy[wpos + 1] = y + r
wpos:+2
' rb corner
xy[wpos] = x + width
xy[wpos + 1] = y + height - r
wpos:+2
For Local i:Int = 0 Until segs
Local fang:Float = 0 + i * fstep
xy[wpos] = (x + width - r) + Cos(fang) * r
xy[wpos + 1] = (y + height - r) + Sin(fang) * r
wpos:+2
Next
xy[wpos] = x + width - r
xy[wpos + 1] = y + height
wpos:+2
' lb corner
xy[wpos] = x + r
xy[wpos + 1] = y + height
wpos:+2
For Local i:Int = 0 Until segs
Local fang:Float = 90 + i * fstep
xy[wpos] = (x + r) + Cos(fang) * r
xy[wpos + 1] = (y + height - r) + Sin(fang) * r
wpos:+2
Next
xy[wpos] = x
xy[wpos + 1] = y + height - r
wpos:+2
DrawPoly(xy)
EndFunction
Семпл в аттаче