public static int AddUIVertexQuad(IntPtr l)
    {
        int result;

        try
        {
            VertexHelper vertexHelper = (VertexHelper)LuaObject.checkSelf(l);
            UIVertex[]   verts;
            LuaObject.checkArray <UIVertex>(l, 2, out verts);
            vertexHelper.AddUIVertexQuad(verts);
            LuaObject.pushValue(l, true);
            result = 1;
        }
        catch (Exception e)
        {
            result = LuaObject.error(l, e);
        }
        return(result);
    }
Ejemplo n.º 2
0
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        // This is glue that uses <=5.1 OnFillVBO code with >=5.2 OnPopulatedMesh
        // http://docs.unity3d.com/ScriptReference/UI.Graphic.OnPopulateMesh.html

        var vbo = new List <UIVertex>();

        _OnFillVBO(vbo);

        vh.Clear();

        var quad = new UIVertex[4];

        for (int i = 0; i < vbo.Count; i += 4)
        {
            vbo.CopyTo(i, quad, 0, 4);
            vh.AddUIVertexQuad(quad);
        }
    }
Ejemplo n.º 3
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            base.OnPopulateMesh(vh);
            vh.Clear();
            int vPos = 0;

            foreach (UIVertex v in getVerices())
            {
                mTmpVerts[vPos++] = v;
                if (vPos == 4)
                {
                    UIVertex tmp = mTmpVerts[2];
                    mTmpVerts[2] = mTmpVerts[3];
                    mTmpVerts[3] = tmp;
                    vPos         = 0;
                    vh.AddUIVertexQuad(mTmpVerts);
                }
            }
        }
Ejemplo n.º 4
0
 protected override void OnPopulateMesh(VertexHelper vh)
 {
     vh.Clear();
     //在这里可以做一个数据判断,如果数据一样 就不再刷新
     if (_meshInfo != null)
     {
         for (int i = 0; i < _meshInfo.Vertices.Count; i++)
         {
             int tempVertsIndex = i & 3;
             _tempVerts[tempVertsIndex].position = _meshInfo.Vertices[i];                    // Utility.TransformWorld2Point(transform, _meshInfo.Vertices[i]);
             _tempVerts[tempVertsIndex].uv0      = _meshInfo.UVs[i];
             _tempVerts[tempVertsIndex].color    = color;
             if (tempVertsIndex == 3)
             {
                 vh.AddUIVertexQuad(_tempVerts);
             }
         }
     }
 }
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            vh.Clear();

            if (Points.Length < 2)
            {
                return;
            }

            Vector2 prevTop    = points[0];
            Vector2 prevBottom = new Vector2(points[0].x, 0f);

            float maxX = 0f;
            float maxY = 0f;

            foreach (Vector2 point in points)
            {
                if (point.x > maxX)
                {
                    maxX = point.x;
                }
                if (point.y > maxY)
                {
                    maxY = point.y;
                }
            }

            for (int i = 1; i < Points.Length; i++)
            {
                Vector2 currentTop    = points[i];
                Vector2 currentBottom = new Vector2(points[i].x, 0f);

                vh.AddUIVertexQuad(CreateUIVertices(
                                       new[] { prevBottom, prevTop, currentTop, currentBottom },
                                       new[] { GetCorrectUV(prevBottom, maxX, maxY),
                                               GetCorrectUV(prevTop, maxX, maxY),
                                               GetCorrectUV(currentTop, maxX, maxY),
                                               GetCorrectUV(currentBottom, maxX, maxY) }));

                prevTop    = currentTop;
                prevBottom = currentBottom;
            }
        }
Ejemplo n.º 6
0
        public static void DrawLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color)
        {
            if (p1 == p2)
            {
                return;
            }
            Vector3 v = Vector3.Cross(p2 - p1, Vector3.forward).normalized *size;

            vertex[0].position = p1 - v;
            vertex[1].position = p2 - v;
            vertex[2].position = p2 + v;
            vertex[3].position = p1 + v;

            for (int j = 0; j < 4; j++)
            {
                vertex[j].color = color;
                vertex[j].uv0   = Vector2.zero;
            }
            vh.AddUIVertexQuad(vertex);
        }
Ejemplo n.º 7
0
    //添加下划线
    private void AddUnderlineQuad(IList <UIVertex> underlineVerts, Vector3 startBoxPos, Vector3 endBoxPos)
    {
        Vector3[] underlinePos = new Vector3[4];
        underlinePos[0] = startBoxPos + new Vector3(0, fontSize * -0.1f, 0);
        underlinePos[1] = endBoxPos + new Vector3(0, fontSize * -0.1f, 0);;
        underlinePos[2] = endBoxPos + new Vector3(0, fontSize * 0f, 0);
        underlinePos[3] = startBoxPos + new Vector3(0, fontSize * 0f, 0);

        for (int i = 0; i < 4; ++i)
        {
            int tempVertsIndex = i & 3;
            m_TempVerts[tempVertsIndex]          = underlineVerts[i % 4];
            m_TempVerts[tempVertsIndex].color    = Color.blue;
            m_TempVerts[tempVertsIndex].position = underlinePos[i];
            if (tempVertsIndex == 3)
            {
                mVertexHelperRef.AddUIVertexQuad(m_TempVerts);
            }
        }
    }
Ejemplo n.º 8
0
        protected void DrawRectang(VertexHelper vh, Vector2 point1st, Vector2 point2nd, Vector2 point3rd, Vector2 point4th, Color color)
        {
            UIVertex[] verts = new UIVertex[4];
            verts[0].position = point1st;
            verts[0].color    = color;
            verts[0].uv0      = Vector2.zero;

            verts[1].position = point2nd;
            verts[1].color    = color;
            verts[1].uv0      = Vector2.zero;

            verts[2].position = point3rd;
            verts[2].color    = color;
            verts[2].uv0      = Vector2.zero;

            verts[3].position = point4th;
            verts[3].color    = color;
            verts[3].uv0      = Vector2.zero;
            vh.AddUIVertexQuad(verts);
        }
Ejemplo n.º 9
0
    private void DrawRect(VertexHelper vh, Vector2 min, Vector2 max, Color color)
    {
        // We assume that pivot is bottom left for us, to ease our calculations

        RectTransform rc = this.transform as RectTransform;

        Vector2 start = new Vector2(min.x * rc.rect.width, min.y * rc.rect.height);
        Vector2 end   = new Vector2(max.x * rc.rect.width, max.y * rc.rect.height);

        Vector2 pos0 = new Vector2(start.x, start.y);
        Vector2 pos1 = new Vector2(start.x, end.y);
        Vector2 pos2 = new Vector2(end.x, end.y);
        Vector2 pos3 = new Vector2(end.x, start.y);
        Vector2 pos4 = new Vector2(start.x, start.y);


        // Draw the rectangle

        vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3, pos4 }, new[] { uv0, uv1, uv2, uv3, uv4 }, 5, color));
    }
Ejemplo n.º 10
0
        public override void AddQuad(UIVertex vLeftTop, UIVertex vRightTop, UIVertex vLeftBottom, UIVertex vRightBottom)
        {
            if (mListWrapAround != null)
            {
                mListWrapAround.Add(vLeftTop);
                mListWrapAround.Add(vRightTop);
                mListWrapAround.Add(vRightBottom);
                mListWrapAround.Add(vLeftBottom);
                return;
            }

            if (mVHWrapAround != null)
            {
                mTmpQuad[0] = vLeftTop;
                mTmpQuad[1] = vRightTop;
                mTmpQuad[2] = vRightBottom;
                mTmpQuad[3] = vLeftBottom;
                mVHWrapAround.AddUIVertexQuad(mTmpQuad);
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// OnPopulateMesh.
        /// </summary>
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            vh.Clear();

            float outer = -mRadius;
            float inner = outer + mThickness;

            Vector2 prevPos1 = Vector2.zero;
            Vector2 prevPos2 = Vector2.zero;

            int segment = (int)(3.6f * mDensity) + 1;

            for (int i = 0; i <= segment; i++)
            {
                float degrees = Mathf.Clamp(i * 100f / mDensity, 0, mDegrees);

                float rad = Mathf.Deg2Rad * (270 - degrees - mRotation);
                float cos = Mathf.Cos(rad);
                float sin = Mathf.Sin(rad);

                Vector2 pos0 = prevPos1;
                Vector2 pos1 = new Vector2(outer * cos, outer * sin);
                Vector2 pos2 = mIsFill ? Vector2.zero : new Vector2(inner * cos, inner * sin);
                Vector2 pos3 = mIsFill ? Vector2.zero : prevPos2;

                prevPos1 = pos1;
                prevPos2 = pos2;

                Vector2 uv0 = new Vector2(0, 1);
                Vector2 uv1 = new Vector2(1, 1);
                Vector2 uv2 = new Vector2(1, 0);
                Vector2 uv3 = new Vector2(0, 0);

                vh.AddUIVertexQuad(_GetVBOs(new Vector2[] { pos0, pos1, pos2, pos3 }, new Vector2[] { uv0, uv1, uv2, uv3 }));

                if (degrees >= mDegrees)
                {
                    break;
                }
            }
        }
Ejemplo n.º 12
0
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        float outer = -rectTransform.pivot.x * rectTransform.rect.width;
        float inner = -rectTransform.pivot.x * rectTransform.rect.width + this.thickness;

        vh.Clear();

        Vector2 prevX = Vector2.zero;
        Vector2 prevY = Vector2.zero;
        Vector2 uv0   = new Vector2(0, 0);
        Vector2 uv1   = new Vector2(0, 1);
        Vector2 uv2   = new Vector2(1, 1);
        Vector2 uv3   = new Vector2(1, 0);
        Vector2 pos0;
        Vector2 pos1;
        Vector2 pos2;
        Vector2 pos3;

        float tw = rectTransform.rect.width;
        float th = rectTransform.rect.height;

        float angleByStep  = (FILL_PERCENT / 100f * (Mathf.PI * 2f)) / segments;
        float currentAngle = 0f;

        for (int i = 0; i < segments + 1; i++)
        {
            float c = Mathf.Cos(currentAngle);
            float s = Mathf.Sin(currentAngle);

            StepThroughPointsAndFill(outer, inner, ref prevX, ref prevY, out pos0, out pos1, out pos2, out pos3, c, s);

            uv0 = new Vector2(pos0.x / tw + 0.5f, pos0.y / th + 0.5f);
            uv1 = new Vector2(pos1.x / tw + 0.5f, pos1.y / th + 0.5f);
            uv2 = new Vector2(pos2.x / tw + 0.5f, pos2.y / th + 0.5f);
            uv3 = new Vector2(pos3.x / tw + 0.5f, pos3.y / th + 0.5f);

            vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));

            currentAngle += angleByStep;
        }
    }
Ejemplo n.º 13
0
    protected override void OnPopulateMesh(VertexHelper _VertexHelper)
    {
        _VertexHelper.Clear();

        if (Characters == null)
        {
            return;
        }

        foreach (BitmapCharacter character in Characters)
        {
            if (character == null || !character.Enabled || !character.Visible)
            {
                continue;
            }

            character.Fill(ref m_Buffer);

            _VertexHelper.AddUIVertexQuad(m_Buffer);
        }
    }
Ejemplo n.º 14
0
    /// <summary>
    /// 添加下划线
    /// </summary>
    /// <param name="toFill">模型</param>
    /// <param name="vertexs">顶点</param>
    /// <param name="starPos">开始坐标</param>
    /// <param name="endPos">结束坐标</param>
    void AddUnderlineQuad(VertexHelper toFill, IList <UIVertex> vertexs, Vector3 starPos, Vector3 endPos, Color32 color)
    {
        //厚度 0.1f * fontSize
        _underlinePos[0] = new Vector3(starPos.x, starPos.y - 1f, 0);;
        _underlinePos[1] = new Vector3(endPos.x, starPos.y - 1f, 0);;
        _underlinePos[2] = new Vector3(endPos.x, starPos.y + fontSize * -0.15f - 1f, 0);
        _underlinePos[3] = new Vector3(starPos.x, starPos.y + fontSize * -0.15f - 1f, 0);

        for (int i = 0; i < 4; ++i)
        {
            int tempVertsIndex = i & 3;
            m_TempVerts[tempVertsIndex]          = vertexs[i % 4];
            m_TempVerts[tempVertsIndex].color    = color;
            m_TempVerts[tempVertsIndex].position = _underlinePos[i];

            if (tempVertsIndex == 3)
            {
                toFill.AddUIVertexQuad(m_TempVerts);
            }
        }
    }
Ejemplo n.º 15
0
 private void AddUIVertexQuad(VertexHelper vh, ref float xMin, float xMax, float yMin, float yMax, Color left, Color right, CharacterInfo underline)
 {
     s_TempUIVertexs[0] = new UIVertex()
     {
         position = new Vector3(xMin, yMin), color = left, uv0 = underline.uvTopLeft
     };
     s_TempUIVertexs[1] = new UIVertex()
     {
         position = new Vector3(xMax, yMin), color = right, uv0 = underline.uvTopRight
     };
     s_TempUIVertexs[2] = new UIVertex()
     {
         position = new Vector3(xMax, yMax), color = right, uv0 = underline.uvBottomRight
     };
     s_TempUIVertexs[3] = new UIVertex()
     {
         position = new Vector3(xMin, yMax), color = left, uv0 = underline.uvBottomLeft
     };
     vh.AddUIVertexQuad(s_TempUIVertexs);
     xMin = xMax;
 }
Ejemplo n.º 16
0
        protected override void OnPopulateMesh(VertexHelper toFill)
        {
            if (font == null)
            {
                return;
            }

            int     maxHeight = GetMaxHeight();;
            Rect    rect      = rectTransform.rect;
            Vector2 anchor    = Anchor();
            Vector2 refPoint  = Vector2.zero;

            refPoint.x = (anchor.x == 1 ? rect.xMax : rect.xMin);
            refPoint.y = (anchor.y == 0 ? rect.yMin : rect.yMax);
            Vector2          roundingOffset = PixelAdjustPoint(refPoint) - refPoint;
            IList <UIVertex> verts          = CreateVertices(rect, anchor, maxHeight);
            int vertCount = verts.Count;

            UIVertex[] tempVerts = new UIVertex[4];
            // float unitsPerPixel = 1 / pixelsPerUnit;
            toFill.Clear();

            for (int i = 0; i < vertCount; ++i)
            {
                int tempVertsIndex = i & 3;
                tempVerts[tempVertsIndex] = verts[i];
                // tempVerts[tempVertsIndex].position *= unitsPerPixel;

                if (roundingOffset != Vector2.zero)
                {
                    tempVerts[tempVertsIndex].position.x += roundingOffset.x;
                    tempVerts[tempVertsIndex].position.y -= roundingOffset.y;
                }

                if (tempVertsIndex == 3)
                {
                    toFill.AddUIVertexQuad(tempVerts);
                }
            }
        }
Ejemplo n.º 17
0
        public void PopulateMesh(VertexHelper toFill)
        {
            Vector3 vec_00 = rectTransform.anchoredPosition;
            Vector3 vec_01 = rectTransform.anchoredPosition + new Vector2(0, rectTransform.sizeDelta.y);
            Vector3 vec_11 = rectTransform.anchoredPosition + new Vector2(Mathf.Lerp(0f, rectTransform.sizeDelta.x, time / timeMax), rectTransform.sizeDelta.y);
            Vector3 vec_10 = rectTransform.anchoredPosition + new Vector2(Mathf.Lerp(0f, rectTransform.sizeDelta.x, time / timeMax), 0);

            toFill.AddUIVertexQuad(new UIVertex[] {
                new UIVertex {
                    position = vec_00, color = Color.green
                },
                new UIVertex {
                    position = vec_01, color = Color.green
                },
                new UIVertex {
                    position = vec_11, color = Color.green
                },
                new UIVertex {
                    position = vec_10, color = Color.green
                },
            });
        }
Ejemplo n.º 18
0
    void AddUnderlineQuad(VertexHelper _VToFill, IList <UIVertex> _VTUT, Vector3 _VStartPos, Vector3 _VEndPos)
    {
        Vector3[] _TUnderlinePos = new Vector3[4];
        _TUnderlinePos[0] = _VStartPos;
        _TUnderlinePos[1] = _VEndPos;
        _TUnderlinePos[2] = _VEndPos + new Vector3(0, fontSize * 0.2f, 0);
        _TUnderlinePos[3] = _VStartPos + new Vector3(0, fontSize * 0.2f, 0);

        for (int i = 0; i < 4; ++i)
        {
            int tempVertsIndex = i & 3;
            m_TempVerts[tempVertsIndex]       = _VTUT[i % 4];
            m_TempVerts[tempVertsIndex].color = Color.blue;

            m_TempVerts[tempVertsIndex].position = _TUnderlinePos[i];

            if (tempVertsIndex == 3)
            {
                _VToFill.AddUIVertexQuad(m_TempVerts);
            }
        }
    }
Ejemplo n.º 19
0
    public override void ModifyMesh(VertexHelper toFill)
    {
        if (!IsActive())
        {
            return;
        }

        if (m_NumberOfLetters == -1)
        {
            return;
        }

        int vertCount = toFill.currentVertCount;

        for (int i = 0; i < vertCount; i++)
        {
            if (tmpVertices.Count < (i + 1))
            {
                tmpVertices.Add(new UIVertex());
            }
            UIVertex vert = tmpVertices[i];
            toFill.PopulateUIVertex(ref vert, i);
            tmpVertices[i] = vert;
        }

        int numberOfVertices = m_NumberOfLetters * 4;

        toFill.Clear();

        for (int i = 0; i < numberOfVertices && i < tmpVertices.Count; i++)
        {
            int tempVertsIndex = i & 3;
            tmpVerticesQuad[tempVertsIndex] = tmpVertices[i];
            if (tempVertsIndex == 3)
            {
                toFill.AddUIVertexQuad(tmpVerticesQuad);
            }
        }
    }
Ejemplo n.º 20
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            vh.Clear();
            UIVertex[] verts = new UIVertex[4];
            verts[0].position = new Vector3(leftTran.localPosition.x, -height / 2);
            verts[0].color    = color;
            verts[0].uv0      = Vector2.zero;

            verts[1].position = new Vector3(leftTran.localPosition.x, height / 2);
            verts[1].color    = color;
            verts[1].uv0      = Vector2.zero;

            verts[2].position = new Vector3(rightTran.localPosition.x, height / 2);
            verts[2].color    = color;
            verts[2].uv0      = Vector2.zero;

            verts[3].position = new Vector3(rightTran.localPosition.x, -height / 2);
            verts[3].color    = color;
            verts[3].uv0      = Vector2.zero;

            vh.AddUIVertexQuad(verts);
        }
 protected override void OnPopulateMesh(VertexHelper vh)
 {
     if ((base.get_font() != null) && !this.TextGenerator.IsRequestingCharactersInTexture)
     {
         if (!this.isDirtyVerts)
         {
             this.TextGenerator.IsRebuidFont = true;
         }
         IList <UIVertex> list = this.TextGenerator.CreateVertex();
         vh.Clear();
         for (int i = 0; i < list.Count; i++)
         {
             int index = i & 3;
             this.m_TempVerts[index] = list[i];
             if (index == 3)
             {
                 vh.AddUIVertexQuad(this.m_TempVerts);
             }
         }
         this.isDirtyVerts = false;
     }
 }
Ejemplo n.º 22
0
        public static void DrawLine(this VertexHelper vh, IList <Vector2> points, float thickness, Color color)
        {
            for (var i = 1; i < points.Count; i++)
            {
                var prev  = points[i - 1];
                var curr  = points[i];
                var angle = Mathf.Atan2(curr.y - prev.y, curr.x - prev.x) * Mathf.Rad2Deg;

                var v1 = prev + new Vector2(0, -thickness / 2);
                var v2 = prev + new Vector2(0, +thickness / 2);
                var v3 = curr + new Vector2(0, +thickness / 2);
                var v4 = curr + new Vector2(0, -thickness / 2);

                v1 = RotatePointAroundPivot(v1, prev, angle);
                v2 = RotatePointAroundPivot(v2, prev, angle);
                v3 = RotatePointAroundPivot(v3, curr, angle);
                v4 = RotatePointAroundPivot(v4, curr, angle);

                vh.AddUIVertexQuad(CreateVBO(color, v1, v2, v3, v4));
                // vh.AddUIVertexQuad(CreateVBO(new Color(Random.Range(0, 1), Random.Range(0, 1f), Random.Range(0, 1)), new[] { v1, v2, v3, v4 }));
            }
        }
Ejemplo n.º 23
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            //todo  Debug.Log("刷新显示");
            CurColor = color0;
            vh.Clear();
            Vector2 size = this.GetPixelAdjustedRect().size;

            float xPerCell = size.x / yCount;
            float yPerCell = size.y / xCount;

            perLenght = xPerCell;
            if (yPerCell < xPerCell)
            {
                perLenght = yPerCell;
            }

            // calc lefttop start point
            origin = new Vector2(-yCount / 2.0f * perLenght, xCount / 2.0f * perLenght);
            for (int y = 0; y < xCount; y++)
            {
                var index = CurColor;
                for (int x = 0; x < yCount; x++)
                {
                    var   leftTop     = origin + new Vector3(x * perLenght, -y * perLenght, 0);
                    var   rightTop    = origin + new Vector3((x + 1) * perLenght, -y * perLenght, 0);
                    var   rightBottom = origin + new Vector3((x + 1) * perLenght, -(y + 1) * perLenght, 0);
                    var   leftBottom  = origin + new Vector3(x * perLenght, -(y + 1) * perLenght, 0);
                    Color col         = CurColor;
                    vh.AddUIVertexQuad(new UIVertex[]
                    {
                        GetUIVertex(leftTop, col),
                        GetUIVertex(rightTop, col),
                        GetUIVertex(rightBottom, col),
                        GetUIVertex(leftBottom, col)
                    });
                }
            }
        }
Ejemplo n.º 24
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            vh.Clear();

            if (Points.Length < 2)
            {
                return;
            }

            var sizeX   = rectTransform.rect.width;
            var sizeY   = rectTransform.rect.height;
            var offsetX = -rectTransform.pivot.x * rectTransform.rect.width;
            var offsetY = -rectTransform.pivot.y * rectTransform.rect.height;

            var sizeVector   = new Vector2(sizeX, sizeY);
            var offsetVector = new Vector2(offsetX, offsetY);

            for (var i = 0; i < Points.Length - 1; i++)
            {
                var current = new Vector2(Points[i].x * sizeVector.x, Points[i].y * sizeVector.y) + offsetVector;
                var next    = new Vector2(Points[i + 1].x * sizeVector.x, Points[i + 1].y * sizeVector.y) + offsetVector;

                var line       = next - current;
                var normalized = line.normalized;
                var up         = normalized.Rotate(-90) * LineThickness / 2;

                var vertices = new Vector2[4];
                vertices[0] = current + up;
                vertices[1] = next + up;
                vertices[2] = next - up;
                vertices[3] = current - up;

                var uvs = new Vector2[4] {
                    Vector2.zero, new Vector2(1, 0), Vector2.one, new Vector2(0, 1)
                };
                vh.AddUIVertexQuad(CreateUIVertexQuad(vertices, uvs));
            }
        }
        private void DrawHorizontal(VertexHelper vh)
        {
            float   halfWidth = Setting.BarWidth / 2.0f;
            Vector2 leftStart = origin + new Vector2(0, Setting.BarSpacing / 2.0f);

            foreach (var bars in Data.BarDic)
            {
                foreach (var bar in bars.Value)
                {
                    Vector2 startPos = leftStart + new Vector2(0, halfWidth);
                    for (int m = 0; m < bar.bars.Count; m++)
                    {
                        Color   barColor = BarColor(m);
                        float   height   = bar.bars[m].value * size.x;
                        Vector2 endPos   = startPos + new Vector2(height, 0);
                        vh.AddUIVertexQuad(GetQuad(startPos, endPos, barColor, Setting.BarWidth));
                        startPos = startPos + new Vector2(0, Setting.BarInterval + Setting.BarWidth);
                    }
                    leftStart = leftStart + new Vector2(0, Setting.BarSpacing) + new Vector2(0, Setting.BarWidth * bar.bars.Count)
                                + new Vector2(0, Setting.BarInterval * (bar.bars.Count - 1));
                }
            }
        }
Ejemplo n.º 26
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            vh.Clear();
            var perRadian = Mathf.PI * 2 / m_smoothDegree;
            var outRadius = m_radius + m_loopWidth;

            for (int i = 0; i < m_smoothDegree; i++)
            {
                var startRadian = perRadian * i;
                var endRadian   = perRadian * (i + 1);
                var outStartPos = new Vector2(Mathf.Cos(startRadian), Mathf.Sin(startRadian)) * outRadius;
                var inStartPos  = new Vector2(Mathf.Cos(startRadian), Mathf.Sin(startRadian)) * m_radius;
                var outEndPos   = new Vector2(Mathf.Cos(endRadian), Mathf.Sin(endRadian)) * outRadius;
                var inEndPos    = new Vector2(Mathf.Cos(endRadian), Mathf.Sin(endRadian)) * m_radius;
                vh.AddUIVertexQuad(new UIVertex[]
                {
                    GetUIVertex(outStartPos, Color.black),
                    GetUIVertex(inStartPos, Color.black),
                    GetUIVertex(inEndPos, Color.black),
                    GetUIVertex(outEndPos, Color.black)
                });
            }
        }
        public static GameObject CreateUnityWater(this WaterFile water)
        {
            using (var helper = new VertexHelper()) {
                foreach (var plane in water.Planes)
                {
                    var p1 = new UIVertex {
                        position = plane.P1
                    };
                    var p2 = new UIVertex {
                        position = plane.P2
                    };
                    var p3 = new UIVertex {
                        position = plane.P3
                    };
                    var p4 = new UIVertex {
                        position = plane.P4
                    };

                    helper.AddUIVertexQuad(new UIVertex[] { p1, p2, p3, p4 });
                }

                var go   = new GameObject("Water");
                var mesh = new Mesh();

                helper.FillMesh(mesh);

                mesh.name = "Water";
                mesh.RecalculateNormals();
                mesh.RecalculateBounds();

                go.AddComponent <MeshRenderer>().material = ResourcesHelper.WaterMaterial;
                go.AddComponent <MeshFilter>().sharedMesh = mesh;
                go.layer = LayerMask.NameToLayer("Water");

                return(go);
            }
        }
Ejemplo n.º 28
0
        /// <summary>
        /// Gets the quad dottedline.
        /// </summary>
        /// <returns>The quad dottedline.</returns>
        /// <param name="vh"></param>
        /// <param name="startpos">Startpos.</param>
        /// <param name="endPos">End position.</param>
        /// <param name="color0">Color0.</param>
        /// <param name="lineWidth">Line width.</param>
        public virtual VertexHelper GetQuadDottedline(VertexHelper vh, Vector2 startpos, Vector2 endPos, Color color0, float lineWidth = 2.0f)
        {
            Vector2 dir       = (endPos - startpos).normalized;
            float   lenght    = Vector3.Distance(startpos, endPos);
            float   perLenght = 7;
            float   perSpace  = 2;

            for (float total = 0; total < lenght; total += perLenght + perSpace)
            {
                float addLenght = perLenght;
                if (total + perSpace >= lenght)
                {
                    return(vh);
                }
                if (total + perSpace + perLenght >= lenght)
                {
                    addLenght = lenght - total;
                }
                Vector2 tempEnd = startpos + dir * addLenght;
                vh.AddUIVertexQuad(GetQuad(startpos, tempEnd, color0, lineWidth));
                startpos = tempEnd + dir * perSpace;
            }
            return(vh);
        }
Ejemplo n.º 29
0
        private void AddUIVertexQuad(VertexHelper toFill, float unitsPerPixel)
        {
            toFill.Clear();
            var verts = cachedTextGenerator.verts;

            UIVertex[] verTemp = new UIVertex[4];

            Vector2 offset = new Vector2(verts[0].position.x, verts[0].position.y) * unitsPerPixel;

            offset = PixelAdjustPoint(offset) - offset;
            bool needOffset = offset != Vector2.zero;
            int  index      = 0;

            for (int i = 0; i < _filterText.Length; i++)
            {
                if (index < _sproteItemStartIndex.Count && _sproteItemStartIndex[index].StartIndex == i)
                {
                    i += _sproteItemStartIndex[index].Length - 1;
                    index++;
                    continue;
                }

                for (int j = 0; j < 4; j++)
                {
                    verTemp[j]           = verts[i * 4 + j];
                    verTemp[j].position *= unitsPerPixel;
                    if (needOffset)
                    {
                        verTemp[j].position.x += offset.x;
                        verTemp[j].position.y += offset.y;
                    }
                }

                toFill.AddUIVertexQuad(verTemp);
            }
        }
Ejemplo n.º 30
0
        void FillOutWire(VertexHelper vh)
        {
            if (m_OutWireSize > 0)
            {
                Quaternion nor = Quaternion.AngleAxis(90, Vector3.forward);
                for (int i = 0; i < m_Sides; i++)
                {
                    Vector3 dir = tempVerts[i + 2].position - tempVerts[i + 1].position;
                    dir = nor * (dir.normalized * m_OutWireSize * 0.5f);
                    UIVertex vert = new UIVertex();
                    vert.position = tempVerts[i + 1].position + dir;
                    vert.color    = m_WireColor;
                    vert.uv0      = new Vector2(0, 1);
                    wireQuad[0]   = vert;

                    vert          = new UIVertex();
                    vert.position = tempVerts[i + 2].position + dir;
                    vert.color    = m_WireColor;
                    vert.uv0      = Vector2.one;
                    wireQuad[1]   = vert;

                    vert          = new UIVertex();
                    vert.position = tempVerts[i + 2].position - dir;
                    vert.color    = m_WireColor;
                    vert.uv0      = new Vector2(1, 0);
                    wireQuad[2]   = vert;

                    vert          = new UIVertex();
                    vert.position = tempVerts[i + 1].position - dir;
                    vert.color    = m_WireColor;
                    vert.uv0      = Vector2.zero;
                    wireQuad[3]   = vert;
                    vh.AddUIVertexQuad(wireQuad);
                }
            }
        }
Ejemplo n.º 31
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            if (m_points == null)
                return;
            Vector2[] pointsToDraw = m_points;
            //If Bezier is desired, pick the implementation
            if (BezierMode != BezierType.None && m_points.Length > 3)
            {
                BezierPath bezierPath = new BezierPath();

                bezierPath.SetControlPoints(pointsToDraw);
                bezierPath.SegmentsPerCurve = BezierSegmentsPerCurve;
                List<Vector2> drawingPoints;
                switch (BezierMode)
                {
                    case BezierType.Basic:
                        drawingPoints = bezierPath.GetDrawingPoints0();
                        break;
                    case BezierType.Improved:
                        drawingPoints = bezierPath.GetDrawingPoints1();
                        break;
                    default:
                        drawingPoints = bezierPath.GetDrawingPoints2();
                        break;
                }
                pointsToDraw = drawingPoints.ToArray();
            }

            var sizeX = rectTransform.rect.width;
            var sizeY = rectTransform.rect.height;
            var offsetX = -rectTransform.pivot.x * rectTransform.rect.width;
            var offsetY = -rectTransform.pivot.y * rectTransform.rect.height;

            // don't want to scale based on the size of the rect, so this is switchable now
            if (!relativeSize)
            {
                sizeX = 1;
                sizeY = 1;
            }

            if (UseMargins)
            {
                sizeX -= Margin.x;
                sizeY -= Margin.y;
                offsetX += Margin.x / 2f;
                offsetY += Margin.y / 2f;
            }

            vh.Clear();

            // Generate the quads that make up the wide line
            var segments = new List<UIVertex[]>();
            if (LineList)
            {
                for (var i = 1; i < pointsToDraw.Length; i += 2)
                {
                    var start = pointsToDraw[i - 1];
                    var end = pointsToDraw[i];
                    start = new Vector2(start.x * sizeX + offsetX, start.y * sizeY + offsetY);
                    end = new Vector2(end.x * sizeX + offsetX, end.y * sizeY + offsetY);

                    if (LineCaps)
                    {
                        segments.Add(CreateLineCap(start, end, SegmentType.Start));
                    }

                    segments.Add(CreateLineSegment(start, end, SegmentType.Middle));

                    if (LineCaps)
                    {
                        segments.Add(CreateLineCap(start, end, SegmentType.End));
                    }
                }
            }
            else
            {
                for (var i = 1; i < pointsToDraw.Length; i++)
                {
                    var start = pointsToDraw[i - 1];
                    var end = pointsToDraw[i];
                    start = new Vector2(start.x * sizeX + offsetX, start.y * sizeY + offsetY);
                    end = new Vector2(end.x * sizeX + offsetX, end.y * sizeY + offsetY);

                    if (LineCaps && i == 1)
                    {
                        segments.Add(CreateLineCap(start, end, SegmentType.Start));
                    }

                    segments.Add(CreateLineSegment(start, end, SegmentType.Middle));

                    if (LineCaps && i == pointsToDraw.Length - 1)
                    {
                        segments.Add(CreateLineCap(start, end, SegmentType.End));
                    }
                }
            }

            // Add the line segments to the vertex helper, creating any joins as needed
            for (var i = 0; i < segments.Count; i++)
            {
                if (!LineList && i < segments.Count - 1)
                {
                    var vec1 = segments[i][1].position - segments[i][2].position;
                    var vec2 = segments[i + 1][2].position - segments[i + 1][1].position;
                    var angle = Vector2.Angle(vec1, vec2) * Mathf.Deg2Rad;

                    // Positive sign means the line is turning in a 'clockwise' direction
                    var sign = Mathf.Sign(Vector3.Cross(vec1.normalized, vec2.normalized).z);

                    // Calculate the miter point
                    var miterDistance = LineThickness / (2 * Mathf.Tan(angle / 2));
                    var miterPointA = segments[i][2].position - vec1.normalized * miterDistance * sign;
                    var miterPointB = segments[i][3].position + vec1.normalized * miterDistance * sign;

                    var joinType = LineJoins;
                    if (joinType == JoinType.Miter)
                    {
                        // Make sure we can make a miter join without too many artifacts.
                        if (miterDistance < vec1.magnitude / 2 && miterDistance < vec2.magnitude / 2 && angle > MIN_MITER_JOIN)
                        {
                            segments[i][2].position = miterPointA;
                            segments[i][3].position = miterPointB;
                            segments[i + 1][0].position = miterPointB;
                            segments[i + 1][1].position = miterPointA;
                        }
                        else
                        {
                            joinType = JoinType.Bevel;
                        }
                    }

                    if (joinType == JoinType.Bevel)
                    {
                        if (miterDistance < vec1.magnitude / 2 && miterDistance < vec2.magnitude / 2 && angle > MIN_BEVEL_NICE_JOIN)
                        {
                            if (sign < 0)
                            {
                                segments[i][2].position = miterPointA;
                                segments[i + 1][1].position = miterPointA;
                            }
                            else
                            {
                                segments[i][3].position = miterPointB;
                                segments[i + 1][0].position = miterPointB;
                            }
                        }

                        var join = new UIVertex[] { segments[i][2], segments[i][3], segments[i + 1][0], segments[i + 1][1] };
                        vh.AddUIVertexQuad(join);
                    }
                }
                vh.AddUIVertexQuad(segments[i]);
            }
        }
Ejemplo n.º 32
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            vh.Clear();

            Vector2 prevX = Vector2.zero;
            Vector2 prevY = Vector2.zero;
            Vector2 uv0 = new Vector2(0, 0);
            Vector2 uv1 = new Vector2(0, 1);
            Vector2 uv2 = new Vector2(1, 1);
            Vector2 uv3 = new Vector2(1, 0);
            Vector2 pos0;
            Vector2 pos1;
            Vector2 pos2;
            Vector2 pos3;
            float degrees = 360f / sides;
            int vertices = sides + 1;
            if (VerticesDistances.Length != vertices)
            {
                VerticesDistances = new float[vertices];
                for (int i = 0; i < vertices - 1; i++) VerticesDistances[i] = 1;
            }
            // last vertex is also the first!
            VerticesDistances[vertices - 1] = VerticesDistances[0];
            for (int i = 0; i < vertices; i++)
            {
                float outer = -rectTransform.pivot.x * size * VerticesDistances[i];
                float inner = -rectTransform.pivot.x * size * VerticesDistances[i] + thickness;
                float rad = Mathf.Deg2Rad * (i * degrees + rotation);
                float c = Mathf.Cos(rad);
                float s = Mathf.Sin(rad);
                uv0 = new Vector2(0, 1);
                uv1 = new Vector2(1, 1);
                uv2 = new Vector2(1, 0);
                uv3 = new Vector2(0, 0);
                pos0 = prevX;
                pos1 = new Vector2(outer * c, outer * s);
                if (fill)
                {
                    pos2 = Vector2.zero;
                    pos3 = Vector2.zero;
                }
                else
                {
                    pos2 = new Vector2(inner * c, inner * s);
                    pos3 = prevY;
                }
                prevX = pos1;
                prevY = pos2;
                vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));
            }
        }
        protected override void OnPopulateMesh(Mesh toFill)
        {
            // requires sets of quads
            if (Points == null || Points.Length < 2)
                Points = new[] { new Vector2(0, 0), new Vector2(1, 1) };
            var capSize = 24;
            var sizeX = rectTransform.rect.width;
            var sizeY = rectTransform.rect.height;
            var offsetX = -rectTransform.pivot.x * rectTransform.rect.width;
            var offsetY = -rectTransform.pivot.y * rectTransform.rect.height;

            // don't want to scale based on the size of the rect, so this is switchable now
            if (!relativeSize)
            {
                sizeX = 1;
                sizeY = 1;
            }
            // build a new set of points taking into account the cap sizes.
            // would be cool to support corners too, but that might be a bit tough :)
            var pointList = new List<Vector2>();
            pointList.Add(Points[0]);
            var capPoint = Points[0] + (Points[1] - Points[0]).normalized * capSize;
            pointList.Add(capPoint);

            // should bail before the last point to add another cap point
            for (int i = 1; i < Points.Length - 1; i++)
            {
                pointList.Add(Points[i]);
            }
            capPoint = Points[Points.Length - 1] - (Points[Points.Length - 1] - Points[Points.Length - 2]).normalized * capSize;
            pointList.Add(capPoint);
            pointList.Add(Points[Points.Length - 1]);

            var TempPoints = pointList.ToArray();
            if (UseMargins)
            {
                sizeX -= Margin.x;
                sizeY -= Margin.y;
                offsetX += Margin.x / 2f;
                offsetY += Margin.y / 2f;
            }

            toFill.Clear();
            var vbo = new VertexHelper(toFill);

            Vector2 prevV1 = Vector2.zero;
            Vector2 prevV2 = Vector2.zero;

            for (int i = 1; i < TempPoints.Length; i++)
            {
                var prev = TempPoints[i - 1];
                var cur = TempPoints[i];
                prev = new Vector2(prev.x * sizeX + offsetX, prev.y * sizeY + offsetY);
                cur = new Vector2(cur.x * sizeX + offsetX, cur.y * sizeY + offsetY);

                float angle = Mathf.Atan2(cur.y - prev.y, cur.x - prev.x) * 180f / Mathf.PI;

                var v1 = prev + new Vector2(0, -LineThickness / 2);
                var v2 = prev + new Vector2(0, +LineThickness / 2);
                var v3 = cur + new Vector2(0, +LineThickness / 2);
                var v4 = cur + new Vector2(0, -LineThickness / 2);

                v1 = RotatePointAroundPivot(v1, prev, new Vector3(0, 0, angle));
                v2 = RotatePointAroundPivot(v2, prev, new Vector3(0, 0, angle));
                v3 = RotatePointAroundPivot(v3, cur, new Vector3(0, 0, angle));
                v4 = RotatePointAroundPivot(v4, cur, new Vector3(0, 0, angle));

                Vector2 uvTopLeft = Vector2.zero;
                Vector2 uvBottomLeft = new Vector2(0, 1);

                Vector2 uvTopCenter = new Vector2(0.5f, 0);
                Vector2 uvBottomCenter = new Vector2(0.5f, 1);

                Vector2 uvTopRight = new Vector2(1, 0);
                Vector2 uvBottomRight = new Vector2(1, 1);

                Vector2[] uvs = new[] { uvTopCenter, uvBottomCenter, uvBottomCenter, uvTopCenter };

                if (i > 1)
                    vbo.AddUIVertexQuad(SetVbo(new[] { prevV1, prevV2, v1, v2 }, uvs));

                if (i == 1)
                    uvs = new[] { uvTopLeft, uvBottomLeft, uvBottomCenter, uvTopCenter };
                else if (i == TempPoints.Length - 1)
                    uvs = new[] { uvTopCenter, uvBottomCenter, uvBottomRight, uvTopRight };

                vbo.AddUIVertexQuad(SetVbo(new[] { v1, v2, v3, v4 }, uvs));

                prevV1 = v3;
                prevV2 = v4;
            }

            if (vbo.currentVertCount > 3)
            {
                vbo.FillMesh(toFill);
            }
        }
Ejemplo n.º 34
0
        protected override void OnPopulateMesh(VertexHelper toFill)
        {
            if (font == null)
                return;

            // We don't care if we the font Texture changes while we are doing our Update.
            // The end result of cachedTextGenerator will be valid for this instance.
            // Otherwise we can get issues like Case 619238.
            m_DisableFontTextureRebuiltCallback = true;

            Vector2 extents = rectTransform.rect.size;

            var settings = GetGenerationSettings(extents);
            cachedTextGenerator.Populate(text, settings);

            Rect inputRect = rectTransform.rect;

            // get the text alignment anchor point for the text in local space
            Vector2 textAnchorPivot = GetTextAnchorPivot(alignment);
            Vector2 refPoint = Vector2.zero;
            refPoint.x = (textAnchorPivot.x == 1 ? inputRect.xMax : inputRect.xMin);
            refPoint.y = (textAnchorPivot.y == 0 ? inputRect.yMin : inputRect.yMax);

            // Determine fraction of pixel to offset text mesh.
            Vector2 roundingOffset = PixelAdjustPoint(refPoint) - refPoint;

            // --- Changes ----

            // Not really good place to put it, need to find somewhere else.
            univTextGroup = new UnivTextGroup(m_Text);
            alignment = univTextGroup.IsGroupRTL ? TextAnchor.MiddleRight : TextAnchor.MiddleLeft;
            cachedTextGenerator.Populate(univTextGroup.CorrectedString(), settings);

            // ---- End of changes ----

            // Apply the offset to the vertices
            IList<UIVertex> verts = cachedTextGenerator.verts;

            float unitsPerPixel = 1/pixelsPerUnit;
            //Last 4 verts are always a new line...
            int vertCount = verts.Count - 4;

            toFill.Clear();
            if (roundingOffset != Vector2.zero)
            {
                for (int i = 0; i < vertCount; ++i)
                {
                    int tempVertsIndex = i & 3;
                    m_TempVerts[tempVertsIndex] = verts[i];
                    m_TempVerts[tempVertsIndex].position *= unitsPerPixel;
                    m_TempVerts[tempVertsIndex].position.x += roundingOffset.x;
                    m_TempVerts[tempVertsIndex].position.y += roundingOffset.y;
                    if (tempVertsIndex == 3)
                        toFill.AddUIVertexQuad(m_TempVerts);
                }
            }
            else
            {
                for (int i = 0; i < vertCount; ++i)
                {
                    int tempVertsIndex = i & 3;
                    m_TempVerts[tempVertsIndex] = verts[i];
                    m_TempVerts[tempVertsIndex].position *= unitsPerPixel;
                    if (tempVertsIndex == 3)
                        toFill.AddUIVertexQuad(m_TempVerts);
                }
            }
            m_DisableFontTextureRebuiltCallback = false;
        }
Ejemplo n.º 35
0
		protected override void OnPopulateMesh(VertexHelper vh) {
#if UNITY_EDITOR
			if (!Application.isPlaying) {
				if (!Initialize()) {
					return;
				}
			}
#endif
	 
			// prepare vertices
			vh.Clear();
	 
			if (!gameObject.activeInHierarchy) {
				return;
			}
	 
			// iterate through current particles
			int count = _particleSystem.GetParticles(_particles);
	 
			for (int i = 0; i < count; ++i) {
				ParticleSystem.Particle particle = _particles[i];
	 
				// get particle properties
				Vector2 position = (_particleSystem.simulationSpace == ParticleSystemSimulationSpace.Local ? particle.position : _transform.InverseTransformPoint(particle.position));
				float rotation = -particle.rotation * Mathf.Deg2Rad;
				float rotation90 = rotation + Mathf.PI / 2;
				Color32 color = particle.GetCurrentColor(_particleSystem);
				float size = particle.GetCurrentSize(_particleSystem) * 0.5f;
	 
				// apply scale
				if (_particleSystem.scalingMode == ParticleSystemScalingMode.Shape) {
					position /= canvas.scaleFactor;
				}
	 
				// apply texture sheet animation
				Vector4 particleUV = _uv;
				if (_textureSheetAnimation.enabled) {
					float frameProgress = 1 - (particle.remainingLifetime / particle.startLifetime);
	//                float frameProgress = textureSheetAnimation.frameOverTime.curveMin.Evaluate(1 - (particle.lifetime / particle.startLifetime)); // TODO - once Unity allows MinMaxCurve reading
					frameProgress = Mathf.Repeat(frameProgress * _textureSheetAnimation.cycleCount, 1);
					int frame = 0;
	 
					switch (_textureSheetAnimation.animation) {
	 
					case ParticleSystemAnimationType.WholeSheet:
						frame = Mathf.FloorToInt(frameProgress * _textureSheetAnimationFrames);
						break;
	 
					case ParticleSystemAnimationType.SingleRow:
						frame = Mathf.FloorToInt(frameProgress * _textureSheetAnimation.numTilesX);
	 
						int row = _textureSheetAnimation.rowIndex;
	//                    if (textureSheetAnimation.useRandomRow) { // FIXME - is this handled internally by rowIndex?
	//                        row = Random.Range(0, textureSheetAnimation.numTilesY, using: particle.randomSeed);
	//                    }
						frame += row * _textureSheetAnimation.numTilesX;
						break;
	 
					}
	 
					frame %= _textureSheetAnimationFrames;
	 
					particleUV.x = (frame % _textureSheetAnimation.numTilesX) * _textureSheedAnimationFrameSize.x;
					particleUV.y = Mathf.FloorToInt(frame / _textureSheetAnimation.numTilesX) * _textureSheedAnimationFrameSize.y;
					particleUV.z = particleUV.x + _textureSheedAnimationFrameSize.x;
					particleUV.w = particleUV.y + _textureSheedAnimationFrameSize.y;
				}
	 
				_quad[0] = UIVertex.simpleVert;
				_quad[0].color = color;
				_quad[0].uv0 = new Vector2(particleUV.x, particleUV.y);
	 
				_quad[1] = UIVertex.simpleVert;
				_quad[1].color = color;
				_quad[1].uv0 = new Vector2(particleUV.x, particleUV.w);
	 
				_quad[2] = UIVertex.simpleVert;
				_quad[2].color = color;
				_quad[2].uv0 = new Vector2(particleUV.z, particleUV.w);
	 
				_quad[3] = UIVertex.simpleVert;
				_quad[3].color = color;
				_quad[3].uv0 = new Vector2(particleUV.z, particleUV.y);
	 
				if (rotation == 0) {
					// no rotation
					Vector2 corner1 = new Vector2(position.x - size, position.y - size);
					Vector2 corner2 = new Vector2(position.x + size, position.y + size);
	 
					_quad[0].position = new Vector2(corner1.x, corner1.y);
					_quad[1].position = new Vector2(corner1.x, corner2.y);
					_quad[2].position = new Vector2(corner2.x, corner2.y);
					_quad[3].position = new Vector2(corner2.x, corner1.y);
				} else {
					// apply rotation
					Vector2 right = new Vector2(Mathf.Cos(rotation), Mathf.Sin(rotation)) * size;
					Vector2 up = new Vector2(Mathf.Cos(rotation90), Mathf.Sin(rotation90)) * size;
	 
					_quad[0].position = position - right - up;
					_quad[1].position = position - right + up;
					_quad[2].position = position + right + up;
					_quad[3].position = position + right - up;
				}
	 
				vh.AddUIVertexQuad(_quad);
			}
		}
Ejemplo n.º 36
0
		protected override void OnPopulateMesh(VertexHelper vh)
		{
			float outer = -rectTransform.pivot.x * rectTransform.rect.width;
			float inner = -rectTransform.pivot.x * rectTransform.rect.width + this.thickness;
			
			vh.Clear();
			
			Vector2 prevX = Vector2.zero;
			Vector2 prevY = Vector2.zero;
			Vector2 uv0 = new Vector2(0, 0);
			Vector2 uv1 = new Vector2(0, 1);
			Vector2 uv2 = new Vector2(1, 1);
			Vector2 uv3 = new Vector2(1, 0);
			Vector2 pos0;
			Vector2 pos1;
			Vector2 pos2;
			Vector2 pos3;
			
			float f = (this.fillPercent / 100f);
			float degrees = 360f / segments;
			int fa = (int)((segments + 1) * f);
			
			
			for (int i = 0; i < fa; i++)
			{
				float rad = Mathf.Deg2Rad * (i * degrees);
				float c = Mathf.Cos(rad);
				float s = Mathf.Sin(rad);
				
				uv0 = new Vector2(0, 1);
				uv1 = new Vector2(1, 1);
				uv2 = new Vector2(1, 0);
				uv3 = new Vector2(0, 0);
				
				pos0 = prevX;
				pos1 = new Vector2(outer * c, outer * s);
				
				if (fill)
				{
					pos2 = Vector2.zero;
					pos3 = Vector2.zero;
				}
				else
				{
					pos2 = new Vector2(inner * c, inner * s);
					pos3 = prevY;
				}
				
				prevX = pos1;
				prevY = pos2;
				
				vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));
				
			}
		}
Ejemplo n.º 37
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            float outer = -rectTransform.pivot.x * rectTransform.rect.width;
            float inner = -rectTransform.pivot.x * rectTransform.rect.width + this.thickness;
     
            vh.Clear();
     
            Vector2 prevX = Vector2.zero;
            Vector2 prevY = Vector2.zero;
            Vector2 uv0 = new Vector2(0, 0);
            Vector2 uv1 = new Vector2(0, 1);
            Vector2 uv2 = new Vector2(1, 1);
            Vector2 uv3 = new Vector2(1, 0);
            Vector2 pos0;
            Vector2 pos1;
            Vector2 pos2;
            Vector2 pos3;

            if (FixedToSegments)
            {
                float f = (this.fillPercent / 100f);
                float degrees = 360f / segments;
                int fa = (int)((segments + 1) * f);


                for (int i = 0; i < fa; i++)
                {
                    float rad = Mathf.Deg2Rad * (i * degrees);
                    float c = Mathf.Cos(rad);
                    float s = Mathf.Sin(rad);

                    uv0 = new Vector2(0, 1);
                    uv1 = new Vector2(1, 1);
                    uv2 = new Vector2(1, 0);
                    uv3 = new Vector2(0, 0);

                    StepThroughPointsAndFill(outer, inner, ref prevX, ref prevY, out pos0, out pos1, out pos2, out pos3, c, s);

                    vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));
                }
            }
            else
            {
                float tw = rectTransform.rect.width;
                float th = rectTransform.rect.height;

                float angleByStep = (fillPercent / 100f * (Mathf.PI * 2f)) / segments;
                float currentAngle = 0f;
                for (int i = 0; i < segments + 1; i++)
                {

                    float c = Mathf.Cos(currentAngle);
                    float s = Mathf.Sin(currentAngle);

                    StepThroughPointsAndFill(outer, inner, ref prevX, ref prevY, out pos0, out pos1, out pos2, out pos3, c, s);

                    uv0 = new Vector2(pos0.x / tw + 0.5f, pos0.y / th + 0.5f);
                    uv1 = new Vector2(pos1.x / tw + 0.5f, pos1.y / th + 0.5f);
                    uv2 = new Vector2(pos2.x / tw + 0.5f, pos2.y / th + 0.5f);
                    uv3 = new Vector2(pos3.x / tw + 0.5f, pos3.y / th + 0.5f);

                    vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));

                    currentAngle += angleByStep;
                }
            }
        }
Ejemplo n.º 38
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
			vh.Clear();

			if (Points.Length < 2)
				return;

            var sizeX = rectTransform.rect.width;
            var sizeY = rectTransform.rect.height;
            var offsetX = -rectTransform.pivot.x * rectTransform.rect.width;
            var offsetY = -rectTransform.pivot.y * rectTransform.rect.height;

			var sizeVector = new Vector2(sizeX, sizeY);
			var offsetVector = new Vector2(offsetX, offsetY);

			for (var i = 0; i < Points.Length - 1; i++)
			{
				var current = new Vector2(Points[i].x * sizeVector.x, Points[i].y * sizeVector.y) + offsetVector;
				var next = new Vector2(Points[i + 1].x * sizeVector.x, Points[i + 1].y * sizeVector.y) + offsetVector;

				var line = next - current;
				var normalized = line.normalized;
				var up = normalized.Rotate(-90) * LineThickness / 2;

				var vertices = new Vector2[4];
				vertices[0] = current + up;
				vertices[1] = next + up;
				vertices[2] = next - up;
				vertices[3] = current - up;

				var uvs = new Vector2[4] { Vector2.zero, new Vector2(1, 0), Vector2.one, new Vector2(0, 1) };
				vh.AddUIVertexQuad(CreateUIVertexQuad(vertices, uvs));
			}
        }