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()); }
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); }
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); }