예제 #1
0
        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;
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
 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;
     }
 }
예제 #5
0
        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));
            }
        }
예제 #6
0
        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));
            }
        }
예제 #7
0
        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));
            }
        }
예제 #8
0
        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));
        }