void _addPoint(uiPathPoint point) { if (this._paths.Count == 0) { this.addPath(); this.addPoint(0, 0, uiPointFlags.corner); } var path = this._paths[this._paths.Count - 1]; if (path.count > 0) { var pt = this._points[this._points.Count - 1]; if (uiPathUtils.ptEquals(pt.x, pt.y, point.x, point.y, this._distTol)) { pt.flags |= point.flags; this._points[this._points.Count - 1] = pt; return; } } this._points.Add(point); path.count++; this._paths[this._paths.Count - 1] = path; }
public static void buttCapEnd(this uiList <Vector3> dst, uiPathPoint p, float dx, float dy, float w, float d) { float px = p.x + dx * d; float py = p.y + dy * d; float dlx = dy; float dly = -dx; dst.Add(new Vector2(px + dlx * w, py + dly * w)); dst.Add(new Vector2(px - dlx * w, py - dly * w)); }
public static uiPathPoint create(float x = 0, float y = 0, float dx = 0, float dy = 0, float len = 0, float dmx = 0, float dmy = 0, uiPointFlags flags = uiPointFlags.corner) { uiPathPoint newPoint = new uiPathPoint(); newPoint.x = x; newPoint.y = y; newPoint.dx = dx; newPoint.dy = dy; newPoint.len = len; newPoint.dmx = dmx; newPoint.dmy = dmy; newPoint.flags = flags; return(newPoint); }
public static void chooseBevel(bool bevel, uiPathPoint p0, uiPathPoint p1, float w, out float x0, out float y0, out float x1, out float y1) { if (bevel) { x0 = p1.x + p0.dy * w; y0 = p1.y - p0.dx * w; x1 = p1.x + p1.dy * w; y1 = p1.y - p1.dx * w; } else { x0 = p1.x + p1.dmx * w; y0 = p1.y + p1.dmy * w; x1 = p1.x + p1.dmx * w; y1 = p1.y + p1.dmy * w; } }
public static void roundCapEnd(this uiList <Vector3> dst, uiPathPoint p, float dx, float dy, float w, int ncap) { float px = p.x; float py = p.y; float dlx = dy; float dly = -dx; dst.Add(new Vector2(px + dlx * w, py + dly * w)); dst.Add(new Vector2(px - dlx * w, py - dly * w)); for (var i = 0; i < ncap; i++) { float a = (float)i / (ncap - 1) * Mathf.PI; float ax = Mathf.Cos(a) * w, ay = Mathf.Sin(a) * w; dst.Add(new Vector2(px, py)); dst.Add(new Vector2(px - dlx * ax + dx * ay, py - dly * ax + dy * ay)); } }
public static void bevelJoin(this uiList <Vector3> dst, uiList <Vector2> uv, uiPathPoint p0, uiPathPoint p1, float lw, float rw, float lu, float ru, float fringe) { float rx0, ry0, rx1, ry1; float lx0, ly0, lx1, ly1; float dlx0 = p0.dy; float dly0 = -p0.dx; float dlx1 = p1.dy; float dly1 = -p1.dx; if ((p1.flags & uiPointFlags.left) != 0) { chooseBevel((p1.flags & uiPointFlags.innerBevel) != 0, p0, p1, lw, out lx0, out ly0, out lx1, out ly1); dst.Add(new Vector2 { x = lx0, y = ly0 }); dst.Add(new Vector2 { x = p1.x - dlx0 * rw, y = p1.y - dly0 * rw }); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); if ((p1.flags & uiPointFlags.bevel) != 0) { dst.Add(new Vector2(lx0, ly0)); dst.Add(new Vector2(p1.x - dlx0 * rw, p1.y - dly0 * rw)); dst.Add(new Vector2(lx1, ly1)); dst.Add(new Vector2(p1.x - dlx1 * rw, p1.y - dly1 * rw)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); } else { rx0 = p1.x - p1.dmx * rw; ry0 = p1.y - p1.dmy * rw; dst.Add(new Vector2(p1.x, p1.y)); dst.Add(new Vector2(p1.x - dlx0 * rw, p1.y - dly0 * rw)); dst.Add(new Vector2(rx0, ry0)); dst.Add(new Vector2(rx0, ry0)); dst.Add(new Vector2(p1.x, p1.y)); dst.Add(new Vector2(p1.x - dlx1 * rw, p1.y - dly1 * rw)); uv.Add(new Vector2(0.5f, 1)); uv.Add(new Vector2(ru, 1)); uv.Add(new Vector2(ru, 1)); uv.Add(new Vector2(ru, 1)); uv.Add(new Vector2(0.5f, 1)); uv.Add(new Vector2(ru, 1)); } dst.Add(new Vector2(lx1, ly1)); dst.Add(new Vector2(p1.x - dlx1 * rw, p1.y - dly1 * rw)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); } else { chooseBevel((p1.flags & uiPointFlags.innerBevel) != 0, p0, p1, -rw, out rx0, out ry0, out rx1, out ry1); dst.Add(new Vector2(p1.x + dlx0 * lw, p1.y + dly0 * lw)); dst.Add(new Vector2(rx0, ry0)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); if ((p1.flags & uiPointFlags.bevel) != 0) { dst.Add(new Vector2(p1.x + dlx0 * lw, p1.y + dly0 * lw)); dst.Add(new Vector2(rx0, ry0)); dst.Add(new Vector2(p1.x + dlx1 * lw, p1.y + dly1 * lw)); dst.Add(new Vector2(rx1, ry1)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); } else { lx0 = p1.x + p1.dmx * lw; ly0 = p1.y + p1.dmy * lw; dst.Add(new Vector2(p1.x + dlx0 * lw, p1.y + dly0 * lw)); dst.Add(new Vector2(p1.x, p1.y)); dst.Add(new Vector2(lx0, ly0)); dst.Add(new Vector2(lx0, ly0)); dst.Add(new Vector2(p1.x + dlx1 * lw, p1.y + dly1 * lw)); dst.Add(new Vector2(p1.x, p1.y)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(0.5f, 1)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(0.5f, 1)); } dst.Add(new Vector2(p1.x + dlx1 * lw, p1.y + dly1 * lw)); dst.Add(new Vector2(rx1, ry1)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); } }
public static void roundJoin(this uiList <Vector3> dst, uiList <Vector2> uv, uiPathPoint p0, uiPathPoint p1, float lw, float rw, int ncap, float lu, float ru, float fringe) { float dlx0 = p0.dy; float dly0 = -p0.dx; float dlx1 = p1.dy; float dly1 = -p1.dx; if ((p1.flags & uiPointFlags.left) != 0) { float lx0, ly0, lx1, ly1; chooseBevel((p1.flags & uiPointFlags.innerBevel) != 0, p0, p1, lw, out lx0, out ly0, out lx1, out ly1); float a0 = Mathf.Atan2(-dly0, -dlx0); float a1 = Mathf.Atan2(-dly1, -dlx1); if (a1 > a0) { a1 -= Mathf.PI * 2; } dst.Add(new Vector2(lx0, ly0)); dst.Add(new Vector2(p1.x - dlx0 * rw, p1.y - dly0 * rw)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); var n = Mathf.CeilToInt((a0 - a1) / Mathf.PI * ncap).clamp(2, ncap); for (var i = 0; i < n; i++) { float u = (float)i / (n - 1); float a = a0 + u * (a1 - a0); float rx = p1.x + Mathf.Cos(a) * rw; float ry = p1.y + Mathf.Sin(a) * rw; dst.Add(new Vector2(p1.x, p1.y)); dst.Add(new Vector2(rx, ry)); uv.Add(new Vector2(0.5f, 1)); uv.Add(new Vector2(ru, 1)); } dst.Add(new Vector2(lx1, ly1)); dst.Add(new Vector2(p1.x - dlx1 * rw, p1.y - dly1 * rw)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); } else { float rx0, ry0, rx1, ry1; chooseBevel((p1.flags & uiPointFlags.innerBevel) != 0, p0, p1, -rw, out rx0, out ry0, out rx1, out ry1); float a0 = Mathf.Atan2(dly0, dlx0); float a1 = Mathf.Atan2(dly1, dlx1); if (a1 < a0) { a1 += Mathf.PI * 2; } dst.Add(new Vector2(p1.x + dlx0 * lw, p1.y + dly0 * lw)); dst.Add(new Vector2(rx0, ry0)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); var n = Mathf.CeilToInt((a1 - a0) / Mathf.PI * ncap).clamp(2, ncap); for (var i = 0; i < n; i++) { float u = (float)i / (n - 1); float a = a0 + u * (a1 - a0); float lx = p1.x + Mathf.Cos(a) * lw; float ly = p1.y + Mathf.Sin(a) * lw; dst.Add(new Vector2(lx, ly)); dst.Add(new Vector2(p1.x, p1.y)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(0.5f, 1)); } dst.Add(new Vector2(p1.x + dlx1 * lw, p1.y + dly1 * lw)); dst.Add(new Vector2(rx1, ry1)); uv.Add(new Vector2(lu, 1)); uv.Add(new Vector2(ru, 1)); } }
public static void buttCapEnd(this uiList <Vector3> dst, uiList <Vector2> uv, uiPathPoint p, float dx, float dy, float w, float d, float aa, float u0, float u1) { float px = p.x + dx * d; float py = p.y + dy * d; float dlx = dy; float dly = -dx; dst.Add(new Vector2(px + dlx * w, py + dly * w)); dst.Add(new Vector2(px - dlx * w, py - dly * w)); dst.Add(new Vector2(px + dlx * w + dx * aa, py + dly * w + dy * aa)); dst.Add(new Vector2(px - dlx * w + dx * aa, py - dly * w + dy * aa)); uv.Add(new Vector2(u0, 1)); uv.Add(new Vector2(u1, 1)); uv.Add(new Vector2(u0, 0)); uv.Add(new Vector2(u1, 0)); }