public override void ModifyMesh(VertexHelper vh)
        {
            if (!IsActive())
            {
                return;
            }

            if (!softMaskRect.orientedRect2D.Overlaps(orientedRect2D))
            {
                vh.Clear();
                return;
            }

            var vertices = new List <UIVertex>();

            vh.GetUIVertexStream(vertices);
            vh.Clear();
            var indices = Enumerable.Range(0, vertices.Count).ToList();

            for (int i = 0, iMax = vertices.Count; i < iMax; ++i)
            {
                vertices[i] = SetPosition(vertices[i], rectTransform.TransformPoint(vertices[i].position));
            }
            VertexUtility.Intersect(vertices, indices, softMaskRect.Vertices);
            for (int i = 0, iMax = vertices.Count; i < iMax; ++i)
            {
                vertices[i] = SetPosition(vertices[i], rectTransform.InverseTransformPoint(vertices[i].position));
            }
            vh.AddUIVertexStream(vertices, indices);
        }
        public void T100_IntersectInSquare()
        {
            var triangle = new List <UIVertex>(3);

            triangle.Add(CreateUIVertex(new Vector3(0.0f, 0.0f, 0.0f)));
            triangle.Add(CreateUIVertex(new Vector3(4.0f, 0.0f, 0.0f)));
            triangle.Add(CreateUIVertex(new Vector3(4.0f, 4.0f, 0.0f)));
            triangle.Add(CreateUIVertex(new Vector3(0.0f, 4.0f, 0.0f)));
            triangle = (new[] { 0, 1, 2, 2, 0, 3 }).Select(x => triangle[x]).ToList();

            var mask = new List <UIVertex>(3);

            mask.Add(CreateUIVertex(new Vector3(1.0f, 1.0f, 0.0f)));
            mask.Add(CreateUIVertex(new Vector3(3.0f, 1.0f, 0.0f)));
            mask.Add(CreateUIVertex(new Vector3(3.0f, 3.0f, 0.0f)));
            mask.Add(CreateUIVertex(new Vector3(1.0f, 3.0f, 0.0f)));
            mask = (new[] { 0, 1, 2, 2, 0, 3 }).Select(x => mask[x]).ToList();

            VertexUtility.Intersect(triangle, mask);
            Assert.AreEqual(6, triangle.Count);
            Assert.AreEqual(4, triangle.Select(x => x.position).Distinct().Count());

            var vertices = new List <Vector3>(3);

            vertices.Add(new Vector3(1.0f, 1.0f, 0.0f));
            vertices.Add(new Vector3(3.0f, 1.0f, 0.0f));
            vertices.Add(new Vector3(3.0f, 3.0f, 0.0f));
            vertices.Add(new Vector3(3.0f, 1.0f, 0.0f));
            Assert.AreEqual(4, triangle.Select(x => x.position).Concat(vertices).Distinct().Count());
        }
        public void T000_IntersectInTriangle()
        {
            var triangle = new List <UIVertex>(3);

            triangle.Add(CreateUIVertex(new Vector3(0.0f, 0.0f, 0.0f)));
            triangle.Add(CreateUIVertex(new Vector3(4.0f, 0.0f, 0.0f)));
            triangle.Add(CreateUIVertex(new Vector3(0.0f, 4.0f, 0.0f)));

            var mask = new List <UIVertex>(3);

            mask.Add(CreateUIVertex(new Vector3(1.0f, 1.0f, 0.0f)));
            mask.Add(CreateUIVertex(new Vector3(3.0f, 1.0f, 0.0f)));
            mask.Add(CreateUIVertex(new Vector3(1.0f, 3.0f, 0.0f)));

            VertexUtility.Intersect(triangle, mask);
            Assert.AreEqual(3, triangle.Count);
            Assert.AreEqual(3, triangle.Select(x => x.position).Distinct().Count());

            var vertices = new List <Vector3>(3);

            vertices.Add(new Vector3(1.0f, 1.0f, 0.0f));
            vertices.Add(new Vector3(3.0f, 1.0f, 0.0f));
            vertices.Add(new Vector3(1.0f, 3.0f, 0.0f));
            Assert.AreEqual(3, triangle.Select(x => x.position).Concat(vertices).Distinct().Count());
        }
Example #4
0
        private void CharacterIntersect(List <UIVertex> vertices, List <int> indices, List <UIVertex> mask, System.Func <UIVertex, UIVertex, UIVertex> blend, Text text)
        {
            var originalVerticesCount = vertices.Count;
            var originalIndicesCount  = indices.Count;
            var rectVertices          = new List <UIVertex>(mask.Count * 2);
            var rectIndices           = new List <int>(mask.Count * 2);

            var rectTransformRect = rectTransform.rect;

            var srcIndex = 0;
            var dstIndex = 0;

            for (int i = 0, iMax = text.text.Length; i < iMax; ++i)
            {
                var           ch = text.text[i];
                CharacterInfo info;
                if (!text.font.GetCharacterInfo(ch, out info))
                {
                    info = text.font.characterInfo.Where(x => x.index == ch).FirstOrDefault();
                }

                var boundingBox = new Rect(0.0f
                                           , (text.font.ascent - ((text.font.lineHeight - text.font.fontSize) * 0.5f)) * text.fontSize / (float)text.font.fontSize - text.fontSize
                                           , text.fontSize
                                           , text.fontSize
                                           );
                var charGlyph = new Rect(info.minX * text.fontSize / (float)info.size
                                         , info.minY * text.fontSize / (float)info.size
                                         , (info.maxX - info.minX) * text.fontSize / (float)info.size
                                         , (info.maxY - info.minY) * text.fontSize / (float)info.size
                                         );
                var upperRightPosition = vertices[indices[srcIndex + 1]].position;
                var lowerLeftPosition  = vertices[indices[srcIndex + 4]].position;
                var charDraw           = new Rect(lowerLeftPosition.x
                                                  , lowerLeftPosition.y
                                                  , upperRightPosition.x - lowerLeftPosition.x
                                                  , upperRightPosition.y - lowerLeftPosition.y
                                                  );

                var scale = new Vector2(rectTransformRect.size.x / boundingBox.size.x
                                        , rectTransformRect.size.y / boundingBox.size.y
                                        );

                var srcStartIndex = indices[srcIndex];
                for (var k = 0; k < 4; ++k)
                {
                    var vertex = vertices[srcStartIndex + k];
                    var pos2d  = Vector2.Scale((Vector2)vertex.position - charDraw.min + (charGlyph.min - boundingBox.min), scale) + rectTransformRect.min;
                    vertex.position = new Vector3(pos2d.x, pos2d.y, vertex.position.z);
                    rectVertices.Add(vertex);
                }
                for (var k = 0; k < 6; ++k)
                {
                    rectIndices.Add(indices[srcIndex] - srcStartIndex);
                    ++srcIndex;
                }

                VertexUtility.Intersect(rectVertices, rectIndices, mask, blend);

                var scaleInverse = new Vector2(boundingBox.size.x / rectTransformRect.size.x
                                               , boundingBox.size.y / rectTransformRect.size.y
                                               );

                vertices.AddRange(rectVertices.Select(x => {
                    var pos2d  = Vector2.Scale((Vector2)x.position - rectTransformRect.min, scaleInverse) - (charGlyph.min - boundingBox.min) + charDraw.min;
                    x.position = new Vector3(pos2d.x, pos2d.y, x.position.z);
                    return(x);
                }));
                indices.AddRange(rectIndices.Select(x => x + dstIndex));
                dstIndex += rectVertices.Count;

                rectVertices.RemoveRange(0, rectVertices.Count);
                rectIndices.RemoveRange(0, rectIndices.Count);
            }
            vertices.RemoveRange(0, originalVerticesCount);
            indices.RemoveRange(0, originalIndicesCount);
        }
Example #5
0
 private static void RectTransformIntersect(List <UIVertex> vertices, List <int> indices, List <UIVertex> mask, System.Func <UIVertex, UIVertex, UIVertex> blend)
 {
     VertexUtility.Intersect(vertices, indices, mask, blend);
 }