Exemplo n.º 1
0
        public uiMeshMesh transform(uiMatrix3?matrix)
        {
            var vertices = ObjectPool <uiList <Vector3> > .alloc();

            vertices.SetCapacity(this.vertices.Count);
            vertices.AddRange(this.vertices.data);

            var triangles = ObjectPool <uiList <int> > .alloc();

            triangles.SetCapacity(this.triangles.Count);
            triangles.AddRange(this.triangles.data);


            uiList <Vector2> uv = null;

            if (this.uv != null)
            {
                uv = ObjectPool <uiList <Vector2> > .alloc();

                uv.SetCapacity(this.uv.Count);
                uv.AddRange(this.uv.data);
            }


            var ret = create(matrix, vertices, triangles, uv, this.rawBounds);

            return(ret);
        }
Exemplo n.º 2
0
        public static uiTessellationInfo create(uiTessellationKey key, uiList <Vector2> points, int timeToLive = 5)
        {
            var newInfo = ObjectPool <uiTessellationInfo> .alloc();

            newInfo.points = points;
            newInfo.key    = key;
            newInfo.touch(timeToLive);

            return(newInfo);
        }
Exemplo n.º 3
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));
        }
Exemplo n.º 4
0
        public override void clear()
        {
            ObjectPool <uiList <float> > .release(this._commands);

            ObjectPool <uiPathCache> .release(this._cache);

            this._cache    = null;
            this._commands = null;

            this.needCache = false;
            this.pathKey   = 0;
        }
Exemplo n.º 5
0
        public static uiPicture create(List <uiDrawCmd> drawCmds,
                                       uiRect paintBounds,
                                       BBoxHierarchy <IndexedRect> bbh = null,
                                       uiList <int> stateUpdateIndices = null)
        {
            var picture = ObjectPool <uiPicture> .alloc();

            picture.drawCmds            = drawCmds;
            picture.paintBounds         = paintBounds;
            picture.bbh                 = bbh;
            picture.stateUpdatesIndices = stateUpdateIndices;
            return(picture);
        }
Exemplo n.º 6
0
        void _reset()
        {
            this._commands = ObjectPool <uiList <float> > .alloc();

            this._commandx = 0;
            this._commandy = 0;
            this._minX     = float.MaxValue;
            this._minY     = float.MaxValue;
            this._maxX     = float.MinValue;
            this._maxY     = float.MinValue;
            ObjectPool <uiPathCache> .release(this._cache);

            this._cache = null;
        }
Exemplo n.º 7
0
        public override void clear()
        {
            ObjectPool <uiList <Vector3> > .release(this.vertices);

            ObjectPool <uiList <int> > .release(this.triangles);

            ObjectPool <uiList <Vector2> > .release(this.uv);

            this.vertices  = null;
            this.triangles = null;
            this.uv        = null;
            this.matrix    = null;
            this._bounds   = null;
        }
Exemplo n.º 8
0
        public override void clear()
        {
            ObjectPool <uiList <float> > .release(this._commands);

            ObjectPool <uiPathCache> .release(this._cache);

            this._cache    = null;
            this._commands = null;

            this.needCache     = false;
            this.pathKey       = 0;
            this._isNaiveRRect = false;
            this._shapeHint    = uiPathShapeHint.Other;
            this._rRectCorner  = 0;
        }
Exemplo n.º 9
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));
        }
Exemplo n.º 10
0
        public uiPicture endRecording()
        {
            if (this._states.Count > 1)
            {
                throw new Exception("unmatched save/restore commands");
            }

            uiList <int> stateUpdateIndices = ObjectPool <uiList <int> > .alloc();

            stateUpdateIndices.AddRange(this._stateUpdateIndices);
            var state = this._getState();

            return(uiPicture.create(
                       this._drawCmds,
                       state.paintBounds,
                       bbh: this._bbh,
                       stateUpdateIndices: stateUpdateIndices));
        }
Exemplo n.º 11
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));
            }
        }
Exemplo n.º 12
0
        uiVertexUV _expandFill(float fringe)
        {
            float aa     = fringe;
            float woff   = aa * 0.5f;
            var   points = this._points;
            var   paths  = this._paths;

            this._calculateJoins(fringe, StrokeJoin.miter, 4.0f);

            var cvertices = 0;

            for (var i = 0; i < paths.Count; i++)
            {
                var path = paths[i];
                if (path.count <= 2)
                {
                    continue;
                }

                cvertices += path.count;
            }

            this._fillConvex = false;
            for (var i = 0; i < paths.Count; i++)
            {
                var path = paths[i];
                if (path.count <= 2)
                {
                    continue;
                }

                if (this._fillConvex)
                {
                    // if more than two paths, convex is false.
                    this._fillConvex = false;
                    break;
                }

                if (!path.convex)
                {
                    // if not convex, convex is false.
                    break;
                }

                this._fillConvex = true;
            }

            var _vertices = ObjectPool <uiList <Vector3> > .alloc();

            _vertices.SetCapacity(cvertices);
            var _uv = ObjectPool <uiList <Vector2> > .alloc();

            _uv.SetCapacity(cvertices);
            for (var i = 0; i < paths.Count; i++)
            {
                var path = paths[i];
                if (path.count <= 2)
                {
                    continue;
                }

                path.ifill = _vertices.Count;
                for (var j = 0; j < path.count; j++)
                {
                    var p = points[path.first + j];
                    if (aa > 0.0f)
                    {
                        _vertices.Add(new Vector2(p.x + p.dmx * woff, p.y + p.dmy * woff));
                    }
                    else
                    {
                        _vertices.Add(new Vector2(p.x, p.y));
                    }

                    _uv.Add(new Vector2(0.5f, 1.0f));
                }

                path.nfill = _vertices.Count - path.ifill;
                paths[i]   = path;
            }

            uiList <Vector3> _strokeVertices = null;
            uiList <Vector2> _strokeUV       = null;

            if (aa > 0.0f)
            {
                _strokeVertices = ObjectPool <uiList <Vector3> > .alloc();

                _strokeUV = ObjectPool <uiList <Vector2> > .alloc();

                cvertices = 0;
                for (var i = 0; i < paths.Count; i++)
                {
                    var path = paths[i];
                    if (path.count <= 2)
                    {
                        continue;
                    }

                    cvertices += path.count * 2;
                }
                _strokeVertices.SetCapacity(cvertices);
                _strokeUV.SetCapacity(cvertices);

                float lw = this._fillConvex ? woff : aa + woff;
                float rw = aa - woff;
                float lu = this._fillConvex ? 0.5f : 0.0f;
                float ru = 1.0f;

                for (var i = 0; i < paths.Count; i++)
                {
                    var path = paths[i];
                    if (path.count <= 2)
                    {
                        continue;
                    }

                    path.istroke = _strokeVertices.Count;
                    for (var j = 0; j < path.count; j++)
                    {
                        var p = points[path.first + j];
                        _strokeVertices.Add(new Vector2(p.x + p.dmx * lw, p.y + p.dmy * lw));
                        _strokeUV.Add(new Vector2(lu, 1.0f));
                        _strokeVertices.Add(new Vector2(p.x - p.dmx * rw, p.y - p.dmy * rw));
                        _strokeUV.Add(new Vector2(ru, 1.0f));
                    }

                    path.nstroke = _strokeVertices.Count - path.istroke;
                    paths[i]     = path;
                }
            }

            return(new uiVertexUV {
                fillVertices = _vertices,
                fillUV = _uv,
                strokeVertices = _strokeVertices,
                strokeUV = _strokeUV,
            });
        }
Exemplo n.º 13
0
        public static uiMeshMesh create(uiMatrix3?matrix, uiList <Vector3> vertices, uiList <int> triangles,
                                        uiList <Vector2> uv = null,
                                        uiRect?rawBounds    = null)
        {
            D.assert(vertices != null);
            D.assert(vertices.Count >= 0);
            D.assert(triangles != null);
            D.assert(triangles.Count >= 0);
            D.assert(uv == null || uv.Count == vertices.Count);

            uiMeshMesh newMesh = ObjectPool <uiMeshMesh> .alloc();

            newMesh.matrix    = matrix;
            newMesh.vertices  = vertices;
            newMesh.triangles = triangles;
            if (uv != null)
            {
                newMesh.uv = uv;
            }

            if (rawBounds == null)
            {
                if (vertices.Count > 0)
                {
                    float minX = vertices[0].x;
                    float maxX = vertices[0].x;
                    float minY = vertices[0].y;
                    float maxY = vertices[0].y;

                    for (int i = 1; i < vertices.Count; i++)
                    {
                        var vertex = vertices[i];
                        if (vertex.x < minX)
                        {
                            minX = vertex.x;
                        }

                        if (vertex.x > maxX)
                        {
                            maxX = vertex.x;
                        }

                        if (vertex.y < minY)
                        {
                            minY = vertex.y;
                        }

                        if (vertex.y > maxY)
                        {
                            maxY = vertex.y;
                        }
                    }

                    rawBounds = uiRectHelper.fromLTRB(minX, minY, maxX, maxY);
                }
                else
                {
                    rawBounds = uiRectHelper.zero;
                }
            }

            newMesh.rawBounds = rawBounds.Value;

            return(newMesh);
        }
Exemplo n.º 14
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));
            }
        }
Exemplo n.º 15
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));
            }
        }