function draw_circle_prec(x, y, r, border, precision = 32) {
	draw_set_circle_precision(precision);
	draw_circle(x, y, r, border);
}

function draw_polygon(x, y, r, sides, a = 0) {
	draw_primitive_begin(pr_trianglelist);
		for( var i = 0; i < sides; i++ ) {
			var a0 = (i + 0) / sides * 360 + a;
			var a1 = (i + 1) / sides * 360 + a;
			
			draw_vertex(x, y);
			draw_vertex(x + lengthdir_x(r, a0), y + lengthdir_y(r, a0));
			draw_vertex(x + lengthdir_x(r, a1), y + lengthdir_y(r, a1));
		}
	draw_primitive_end();
}

function draw_circle_color_alpha(_x, _y, _r, colI, colO, alpI, alpO) {
	var _step = 32;
	var angle_step = 360 / _step;
	
	draw_primitive_begin(pr_trianglestrip);
	for(var i = 0; i <= _step; i++) {
		var a0 = i * angle_step;
		var a1 = i * angle_step + angle_step;
		
		var p0x = _x + lengthdir_x(_r, a0);
		var p0y = _y + lengthdir_y(_r, a0);
		var p1x = _x + lengthdir_x(_r, a1);
		var p1y = _y + lengthdir_y(_r, a1);
		
		draw_vertex_color(_x, _y, colI, alpI);
		draw_vertex_color(p0x, p0y, colO, alpO);
		draw_vertex_color(p1x, p1y, colO, alpO);
	}
	draw_primitive_end();
}

function draw_circle_border(xx, yy, r, w) {
	var _step = 32;
	var angle_step = 360 / _step;
	
	draw_primitive_begin(pr_trianglestrip);
	for(var i = 0; i <= _step; i++){
		var p0x = xx + lengthdir_x(r - w / 2, i * angle_step);
		var p0y = yy + lengthdir_y(r - w / 2, i * angle_step);
		var p1x = xx + lengthdir_x(r + w / 2, i * angle_step);
		var p1y = yy + lengthdir_y(r + w / 2, i * angle_step);
		
		draw_vertex(p0x, p0y);
		draw_vertex(p1x, p1y);
	}
	draw_primitive_end();
}

function draw_ellipse_border(x0, y0, x1, y1, w) {
	var step = 32;
	var angle_step = 360 / step;
	
	var px, py, _px, _py;
	var cx = (x0 + x1) / 2;
	var cy = (y0 + y1) / 2;
	
	var ww = abs(x0 - x1) / 2;
	var hh = abs(y0 - y1) / 2;

	for(var i = 0; i <= step; i++){
		var px = cx + lengthdir_x(ww, i * angle_step);
		var py = cy + lengthdir_y(hh, i * angle_step);
	
		if(i)
			draw_line_round(_px, _py, px, py, w);
	
		_px = px;
		_py = py;
	}
}

function draw_ellipse_angle_color(cx, cy, rx, ry, ang, color0, color1) {
    var n    = ceil(max(cx, cy));
    var step = 360 / n;
    var ox, oy, nx, ny;
    
    draw_primitive_begin(pr_trianglelist);
    for (var i = 0; i <= n; i++) {
        var nx = cx + rx * dcos(i * step);
        var ny = cy + ry * dsin(i * step);
        
        var p0 = point_rotate(nx, ny, cx, cy, ang);
        nx = p0[0];
        ny = p0[1];
        
        if(i) {
	        draw_vertex_color(cx, cy, color0, 1);
	        draw_vertex_color(ox, oy, color1, 1);
	        draw_vertex_color(nx, ny, color1, 1);
        }
		
		ox = nx;
		oy = ny;
    }
    draw_primitive_end();
}

function draw_ellipse_width(x0, y0, x1, y1, th = 1) {
	var cx = (x0 + x1) / 2;
	var cy = (y0 + y1) / 2;
	var ww = abs(x0 - x1) / 2;
	var hh = abs(y0 - y1) / 2;
	
	var samp = 32;
	var ox, oy, nx, ny;
	
	for( var i = 0; i < samp; i++ ) {
		nx = cx + lengthdir_x(ww, i * 360 / samp);
		ny = cy + lengthdir_y(hh, i * 360 / samp);
		
		if(i)
			draw_line_width(ox, oy, nx, ny, th);
		
		ox = nx;
		oy = ny;
	}
}

function draw_ellipse_dash(cx, cy, ww, hh, th = 1, dash = 8, ang = 0) {
	var rd = max(ww, hh);
	
	var dash_dist = 0, is_dash = true;
	var samp = dash * max(cx, cy);
	var ox, oy, nx, ny;
	
	for( var i = 0; i < samp; i++ ) {
		nx = cx + lengthdir_x(ww, i * 360 / samp);
		ny = cy + lengthdir_y(hh, i * 360 / samp);
		
        var p0 = point_rotate(nx, ny, cx, cy, ang);
        nx = p0[0];
        ny = p0[1];
        
		if(i) {
			dash_dist += point_distance(ox, oy, nx, ny);
			if(dash_dist >= dash) {
				dash_dist -= dash;
				is_dash = !is_dash;
			}
			
			if(is_dash)
				draw_line_width(ox, oy, nx, ny, th);
		}
		
		ox = nx;
		oy = ny;
	}
}

function draw_circle_dash(_x, _y, rad, th = 1, dash = 8, ang = 0) { draw_ellipse_dash(_x, _y, rad, rad, th, dash, ang); }

function draw_circle_angle(_x, _y, _r, _angSt, _angEd, precision = 32) {
	var ox, oy, nx, ny, oa, na;
	
	draw_primitive_begin(pr_trianglelist);
	
	for( var i = 0; i <= precision; i++ ) {
		na = lerp(_angSt, _angEd, i / precision);
		nx = _x + lengthdir_x(_r, na);
		ny = _y + lengthdir_y(_r, na);
		
		if(i) {
			draw_vertex(_x, _y);
			draw_vertex(ox, oy);
			draw_vertex(nx, ny);
		}
		
		oa = na;
		ox = nx;
		oy = ny;
	}
	
	draw_primitive_end();
}

function draw_arc_width(_x, _y, _r, _th, _angSt, _angEd) {
	draw_primitive_begin(pr_trianglelist);
	var oxI, oyI, oxO, oyO;
	
	_angSt = _angSt % 360;
	_angEd = _angEd % 360;		
	var diff = _angEd >= _angSt? _angEd - _angSt : _angEd + 360 - _angSt;
	
	for(var i = 0; i <= abs(diff); i += 4) {
		var _as = _angSt + i * sign(diff);
		var nxI = _x + lengthdir_x(_r - _th / 2, _as);
		var nyI = _y + lengthdir_y(_r - _th / 2, _as);
		var nxO = _x + lengthdir_x(_r + _th / 2, _as);
		var nyO = _y + lengthdir_y(_r + _th / 2, _as);
		
		if(i) {
			draw_vertex(oxI, oyI);
			draw_vertex(oxO, oyO);
			draw_vertex(nxI, nyI);
			
			draw_vertex(oxO, oyO);
			draw_vertex(nxI, nyI);
			draw_vertex(nxO, nyO);
		}
		
		oxI = nxI;
		oyI = nyI;
		oxO = nxO;
		oyO = nyO;
	}
	
	draw_primitive_end();
}

function draw_arc_forward(_x, _y, _r, _th, _angSt, _angEd) {
	draw_primitive_begin(pr_trianglelist);
	var oxI, oyI, oxO, oyO;
	
	var _aSt = min(_angSt, _angEd);
	var _aEd = max(_angSt, _angEd);
	var diff = _aEd - _aSt;
	
	for(var i = 0; i <= abs(diff); i += 4) {
		var _as = _aSt + i * sign(diff);
		var nxI = _x + lengthdir_x(_r - _th / 2, _as);
		var nyI = _y + lengthdir_y(_r - _th / 2, _as);
		var nxO = _x + lengthdir_x(_r + _th / 2, _as);
		var nyO = _y + lengthdir_y(_r + _th / 2, _as);
		
		if(i) {
			draw_vertex(oxI, oyI);
			draw_vertex(oxO, oyO);
			draw_vertex(nxI, nyI);
			
			draw_vertex(oxO, oyO);
			draw_vertex(nxI, nyI);
			draw_vertex(nxO, nyO);
		}
		
		oxI = nxI;
		oyI = nyI;
		oxO = nxO;
		oyO = nyO;
	}
	
	draw_primitive_end();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function draw_circle_ui(_x, _y, _r, _th, _c = c_white, _a = 1) {
	shader_set(sh_node_circle);
		shader_set_color("color", _c, _a);
		shader_set_f("thickness", _th);
		shader_set_f("antialias", 1 / _r);
		shader_set_i("fill", _th == 0);
		
		draw_sprite_stretched(s_fx_pixel, 0, _x - _r, _y - _r, _r * 2, _r * 2);
	shader_reset();
}