示例#1
0
        public override void Apply(CharacterData characterData)
        {
            Vector3 pivot = CastleTools.CenterOfVectors(characterData.vertexPos.modifiedPositions);

            for (int i = 0; i < 4; i++)
            {
                characterData.vertexPos.modifiedPositions[i] = CastleTools.RotatePointAroundPivot(characterData.vertexPos.modifiedPositions[i], pivot, Quaternion.Euler(0, 0, curve.Evaluate(characterData.Progress)));
            }
        }
示例#2
0
    // Updated OnPopulateMesh to user VertexHelper instead of mesh
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        var pivot   = rectTransform.pivot;
        var outer   = -pivot.x * radius;
        var inner   = -pivot.x * radius - thickness;
        var corners = new Vector2[4];
        var rect    = rectTransform.rect;

        corners[0] = new Vector2(rect.xMin, rect.yMin);
        corners[1] = new Vector2(rect.xMax, rect.yMin);
        corners[2] = new Vector2(rect.xMin, rect.yMax);
        corners[3] = new Vector2(rect.xMax, rect.yMax);

        var degrees = 360f / segments;
        var fa      = (int)((segments + 1) * this.fillAmount);

        // Updated to new vertexhelper
        vh.Clear();
        if (radius <= 0)
        {
            return;
        }
        // Changed initial values so the first polygon is correct when circle isn't filled
        var x     = outer * Mathf.Cos(0);
        var y     = outer * Mathf.Sin(0);
        var prevX = new Vector2(x, y) + offset;

        // Changed initial values so the first polygon is correct when circle isn't filled
        x = inner * Mathf.Cos(0);
        y = inner * Mathf.Sin(0);
        var prevY = new Vector2(x, y) + offset;

        var ifInvert = invert ? 3 : 0;

        for (var i = 0; i < fa - 1 + ifInvert; i++)
        {
            // Changed so there isn't a stray polygon at the beginning of the arc
            var rad = Mathf.Deg2Rad * ((i + 1) * degrees);
            var c   = Mathf.Cos(rad);
            var s   = Mathf.Sin(rad);
            //float x = outer * c;
            //float y = inner * c;
            if (!invert)
            {
                pos[0] = prevX;
                pos[1] = new Vector2(outer * c, outer * s) + offset;

                if (fill)
                {
                    pos[2] = offset;
                    pos[3] = offset;
                }
                else
                {
                    pos[2] = new Vector2(inner * c, inner * s) + offset;
                    pos[3] = prevY;
                }

                // Set values for uiVertices
                for (var j = 0; j < 4; j++)
                {
                    uiVertices[j].color    = color;
                    uiVertices[j].position = pos[j];
                    uiVertices[j].uv0      = uvs[j];
                }

                // Get the current vertex count
                var vCount = vh.currentVertCount;

                // If filled, we only need to create one triangle
                vh.AddVert(uiVertices[0]);
                vh.AddVert(uiVertices[1]);
                vh.AddVert(uiVertices[2]);

                // Create triangle from added vertices
                vh.AddTriangle(vCount, vCount + 2, vCount + 1);

                // If not filled we need to add the 4th vertex and another triangle
                if (!fill)
                {
                    vh.AddVert(uiVertices[3]);
                    vh.AddTriangle(vCount, vCount + 3, vCount + 2);
                }

                prevX = pos[1];
                prevY = pos[2];

                // Removed so we can just use a single triangle when not filled
                //vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));
            }
            else
            {
                if (i /*SEGMENTS*/ < step)
                {
                    pos[0] = prevX;
                    pos[1] = new Vector2(outer * c, outer * s);
                    var distVec = prevX - pos[1];
                    if (pos[0].x < rectTransform.rect.xMin)
                    {
                        if (distVec.x != 0)
                        {
                            distVec = distVec / distVec.x;
                        }
                        pos[0] = pos[1] + distVec * (rectTransform.rect.xMin - pos[1].x);
                    }
                    else if (pos[0].x > rectTransform.rect.xMax)
                    {
                        if (distVec.x != 0)
                        {
                            distVec = distVec / distVec.x;
                        }
                        pos[0] = pos[1] + distVec * (rectTransform.rect.xMax - pos[1].x);
                    }
                    else if (pos[0].y < rectTransform.rect.yMin)
                    {
                        if (distVec.y != 0)
                        {
                            distVec = distVec / distVec.y;
                        }
                        pos[0] = pos[1] + distVec * (rectTransform.rect.yMin - pos[1].y);
                    }
                    else if (pos[0].y > rectTransform.rect.yMax)
                    {
                        if (distVec.y != 0)
                        {
                            distVec = distVec / distVec.y;
                        }
                        pos[0] = pos[1] + distVec * (rectTransform.rect.yMax - pos[1].y);
                    }
                    distVec = pos[1] - prevX;
                    if (pos[1].x < rectTransform.rect.xMin)
                    {
                        if (distVec.x != 0)
                        {
                            distVec = distVec / distVec.x;
                        }
                        pos[1] = pos[0] + distVec * (rectTransform.rect.xMin - pos[0].x);
                    }
                    else if (pos[1].x > rectTransform.rect.xMax)
                    {
                        if (distVec.x != 0)
                        {
                            distVec = distVec / distVec.x;
                        }
                        pos[1] = pos[0] + distVec * (rectTransform.rect.xMax - pos[0].x);
                    }
                    else if (pos[1].y < rectTransform.rect.yMin)
                    {
                        if (distVec.y != 0)
                        {
                            distVec = distVec / distVec.y;
                        }
                        pos[1] = pos[0] + distVec * (rectTransform.rect.yMin - pos[0].y);
                    }
                    else if (pos[1].y > rectTransform.rect.yMax)
                    {
                        if (distVec.y != 0)
                        {
                            distVec = distVec / distVec.y;
                        }
                        pos[1] = pos[0] + distVec * (rectTransform.rect.yMax - pos[0].y);
                    }
                    if (VectorOutOfBounds(pos[0]) || VectorOutOfBounds(pos[1]))
                    {
                    }
                    else
                    {
                        pos[2] = CastleTools.CenterOfVectors(pos[0], pos[1]).ClosestVector(corners);
                        for (var j = 0; j < 3; j++)
                        {
                            uiVertices[j].color    = color;
                            uiVertices[j].position = pos[j];
                            uiVertices[j].uv0      = uvs[j];
                            if (j < 2)
                            {
                                uiVertices[j].position += (Vector3)offset;
                            }
                        }
                        var vCount = vh.currentVertCount;
                        // If filled, we only need to create one triangle
                        vh.AddVert(uiVertices[0]);
                        vh.AddVert(uiVertices[1]);
                        vh.AddVert(uiVertices[2]);

                        // Create triangle from added vertices
                        vh.AddTriangle(vCount, vCount + 2, vCount + 1);
                        if (prevY != pos[2] && !VectorOutOfBounds(prevX))
                        {
                            pos[0] = prevY;
                            pos[1] = prevX;

                            for (var j = 0; j < 3; j++)
                            {
                                uiVertices[j].color    = color;
                                uiVertices[j].position = pos[j];
                                uiVertices[j].uv0      = uvs[j];
                                if (j == 1 && i < (fa - 3))
                                {
                                    uiVertices[j].position += (Vector3)offset;
                                }
                            }
                            vCount = vh.currentVertCount;

                            // If filled, we only need to create one triangle
                            vh.AddVert(uiVertices[0]);
                            vh.AddVert(uiVertices[1]);
                            vh.AddVert(uiVertices[2]);

                            // Create triangle from added vertices
                            vh.AddTriangle(vCount, vCount + 2, vCount + 1);
                        }
                    }

                    prevX = new Vector2(outer * c, outer * s);
                    prevY = pos[2];
                }
            }
        }
    }