public override void ModifyMesh(VertexHelper helper) { if (!IsActive() || helper.currentVertCount == 0) return; List<UIVertex> vertices = new List<UIVertex>(); helper.GetUIVertexStream(vertices); float bottomY = vertices[0].position.y; float topY = vertices[0].position.y; for (int i = 1; i < vertices.Count; i++) { float y = vertices[i].position.y; if (y > topY) { topY = y; } else if (y < bottomY) { bottomY = y; } } float uiElementHeight = topY - bottomY; UIVertex v = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref v, i); v.color = Color32.Lerp(bottomColor, topColor, (v.position.y - bottomY) / uiElementHeight); helper.SetUIVertex(v, i); } }
static public int PopulateUIVertex(IntPtr l) { try { #if DEBUG var method = System.Reflection.MethodBase.GetCurrentMethod(); string methodName = GetMethodName(method); #if UNITY_5_5_OR_NEWER UnityEngine.Profiling.Profiler.BeginSample(methodName); #else Profiler.BeginSample(methodName); #endif #endif UnityEngine.UI.VertexHelper self = (UnityEngine.UI.VertexHelper)checkSelf(l); UnityEngine.UIVertex a1; checkValueType(l, 2, out a1); System.Int32 a2; checkType(l, 3, out a2); self.PopulateUIVertex(ref a1, a2); pushValue(l, true); pushValue(l, a1); return(2); } catch (Exception e) { return(error(l, e)); } #if DEBUG finally { #if UNITY_5_5_OR_NEWER UnityEngine.Profiling.Profiler.EndSample(); #else Profiler.EndSample(); #endif } #endif }
public override void ModifyMesh(VertexHelper vh) { UIVertex vertex = new UIVertex(); for (int i = 0; i < vh.currentVertCount; i++) { vh.PopulateUIVertex(ref vertex, i); vertex.uv1 = new Vector2(vertex.position.x, vertex.position.y); vh.SetUIVertex(vertex, i); } }
protected override void OnPopulateMesh(VertexHelper vh) { base.OnPopulateMesh(vh); //add underline vertex buffer fillUnderline(vh); positions.Clear(); int startVertexIndex; dataDirty = true; UIVertex vert0 = new UIVertex(); UIVertex vert2 = new UIVertex(); UIVertex vert3 = new UIVertex(); int currentVertCount = vh.currentVertCount; int count = indexes.Count; for (var k = 0; k < count; k++) { startVertexIndex = indexes[k] * 4 + 3; if (startVertexIndex >= currentVertCount) { continue; } vh.PopulateUIVertex(ref vert0, startVertexIndex); vh.PopulateUIVertex(ref vert2, startVertexIndex - 2); vh.PopulateUIVertex(ref vert3, startVertexIndex - 3); _fontHeight = Vector3.Distance(vert3.position, vert0.position); _fontWidth = Vector3.Distance(vert3.position, vert2.position); float height = heights[k]; float width = widths[k]; float heightDelta = heightDeltas[k]; positions.Add(new Vector3(vert0.position.x + width / 2, vert0.position.y + heightDelta, vert0.position.z)); } }
void modifyText(VertexHelper helper, int i, int charYPos, int charXPos) { UIVertex lb = new UIVertex(); helper.PopulateUIVertex(ref lb, i * 4); UIVertex lt = new UIVertex(); helper.PopulateUIVertex(ref lt, i * 4 + 1); UIVertex rt = new UIVertex(); helper.PopulateUIVertex(ref rt, i * 4 + 2); UIVertex rb = new UIVertex(); helper.PopulateUIVertex(ref rb, i * 4 + 3); Vector3 center = Vector3.Lerp(lb.position, rt.position, 0.5f); Matrix4x4 move = Matrix4x4.TRS(-center, Quaternion.identity, Vector3.one); float x = -charXPos * lineSpace + xOffset; float y = -charYPos * textSpace + yOffset; Vector3 pos = new Vector3(x, y, 0); Matrix4x4 place = Matrix4x4.TRS(pos, Quaternion.identity, Vector3.one); Matrix4x4 transform = place * move; lb.position = transform.MultiplyPoint(lb.position); lt.position = transform.MultiplyPoint(lt.position); rt.position = transform.MultiplyPoint(rt.position); rb.position = transform.MultiplyPoint(rb.position); helper.SetUIVertex(lb, i * 4); helper.SetUIVertex(lt, i * 4 + 1); helper.SetUIVertex(rt, i * 4 + 2); helper.SetUIVertex(rb, i * 4 + 3); }
public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) return; UIVertex vert = new UIVertex(); for (int i = 0; i < vh.currentVertCount; i++) { vh.PopulateUIVertex(ref vert, i); vert.uv1.x = (i >> 1); vert.uv1.y = ((i >> 1) ^ (i & 1)); vh.SetUIVertex(vert, i); } }
static public int PopulateUIVertex(IntPtr l) { try { UnityEngine.UI.VertexHelper self = (UnityEngine.UI.VertexHelper)checkSelf(l); UnityEngine.UIVertex a1; checkValueType(l, 2, out a1); System.Int32 a2; checkType(l, 3, out a2); self.PopulateUIVertex(ref a1, a2); pushValue(l, a1); return(1); } catch (Exception e) { return(error(l, e)); } }
private void GenerateSimpleSprite(VertexHelper toFill, RichTextSprite richSprite, Sprite sprite) { UIVertex v = UIVertex.simpleVert; var vertexIndex = richSprite.GetVertexIndex() * 4; var fetchIndex = vertexIndex + 3; if (fetchIndex >= toFill.currentVertCount) { return; } toFill.PopulateUIVertex(ref v, fetchIndex); Vector3 textPos = v.position; var tagSize = richSprite.GetSize(); var texture = sprite.texture; var textureWidthInv = 1.0f / texture.width; var textureHeightInv = 1.0f / texture.height; var uvRect = sprite.textureRect; uvRect = new Rect(uvRect.x * textureWidthInv, uvRect.y * textureHeightInv, uvRect.width * textureWidthInv, uvRect.height * textureHeightInv); // pos = (0, 0) var position = new Vector3(0, 0, 0) + textPos; var uv0 = new Vector2(uvRect.x, uvRect.y); setSpriteVertex(toFill, vertexIndex, position, uv0); var fillAmount = richSprite.GetFillAmount(); // pos = (1, 0) position = new Vector3(tagSize.x * fillAmount, 0, 0) + textPos; uv0 = new Vector2(uvRect.x + uvRect.width * fillAmount, uvRect.y); setSpriteVertex(toFill, ++vertexIndex, position, uv0); // pos = (1, 1) position = new Vector3(tagSize.x * fillAmount, tagSize.y, 0) + textPos; uv0 = new Vector2(uvRect.x + uvRect.width * fillAmount, uvRect.y + uvRect.height); setSpriteVertex(toFill, ++vertexIndex, position, uv0); // pos = (0, 1) position = new Vector3(0, tagSize.y, 0) + textPos; uv0 = new Vector2(uvRect.x, uvRect.y + uvRect.height); setSpriteVertex(toFill, ++vertexIndex, position, uv0); }
public override void ModifyMesh(VertexHelper verts) { RectTransform rt = this.transform as RectTransform; for (int i = 0; i < verts.currentVertCount; ++i) { UIVertex uiVertex = new UIVertex(); verts.PopulateUIVertex(ref uiVertex, i); // Modify positions uiVertex.position = new Vector3( (this.m_Horizontal ? (uiVertex.position.x + (rt.rect.center.x - uiVertex.position.x) * 2) : uiVertex.position.x), (this.m_Veritical ? (uiVertex.position.y + (rt.rect.center.y - uiVertex.position.y) * 2) : uiVertex.position.y), uiVertex.position.z ); // Apply verts.SetUIVertex(uiVertex, i); } }
public override void ModifyMesh(VertexHelper helper) { if (!IsActive() || helper.currentVertCount == 0) { return; } List <UIVertex> vertices = new List <UIVertex>(); helper.GetUIVertexStream(vertices); float bottomY = vertices[0].position.y; float topY = vertices[0].position.y; for (int i = 1; i < vertices.Count; i++) { float y = vertices[i].position.y; if (y > topY) { topY = y; } else if (y < bottomY) { bottomY = y; } } float uiElementHeight = topY - bottomY; UIVertex v = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref v, i); v.color = Color32.Lerp(bottomColor, topColor, (v.position.y - bottomY) / uiElementHeight); helper.SetUIVertex(v, i); } }
/// <summary> /// Modifies the mesh. /// </summary> public override void ModifyMesh(VertexHelper vh) { if (!isActiveAndEnabled) { return; } bool isText = graphic is Text; float normalizedIndex = ptex.GetNormalizedIndex(this); // rect. Rect rect = m_EffectArea.GetEffectArea(vh, ((RectTransform)transform).rect); // rotation. float rad = m_Rotation * Mathf.Deg2Rad; Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad)); dir.x *= rect.height / rect.width; dir = dir.normalized; // Calculate vertex position. UIVertex vertex = default(UIVertex); Vector2 nomalizedPos; Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix. for (int i = 0; i < vh.currentVertCount; i++) { vh.PopulateUIVertex(ref vertex, i); m_EffectArea.GetNormalizedFactor(i, localMatrix, vertex.position, isText, out nomalizedPos); vertex.uv0 = new Vector2( Packer.ToFloat(vertex.uv0.x, vertex.uv0.y), Packer.ToFloat(nomalizedPos.y, normalizedIndex) ); vh.SetUIVertex(vertex, i); } }
public override void ModifyMesh(VertexHelper vh) { int count = vh.currentVertCount; if (!IsActive() || count == 0) { return; } var vertexList = new List <UIVertex>(); vh.GetUIVertexStream(vertexList); UIVertex uiVertex = new UIVertex(); if (gradientMode == GradientMode.Global) { if (gradientDir == GradientDir.DiagonalLeftToRight || gradientDir == GradientDir.DiagonalRightToLeft) { #if UNITY_EDITOR if (UnityEngine.UI.Windows.Constants.LOGS_ENABLED == true) { UnityEngine.Debug.LogWarning("Diagonal dir is not supported in Global mode"); } #endif gradientDir = GradientDir.Vertical; } float bottomY = gradientDir == GradientDir.Vertical ? vertexList[vertexList.Count - 1].position.y : vertexList[vertexList.Count - 1].position.x; float topY = gradientDir == GradientDir.Vertical ? vertexList[0].position.y : vertexList[0].position.x; float uiElementHeight = topY - bottomY; for (int i = 0; i < count; i++) { vh.PopulateUIVertex(ref uiVertex, i); if (!overwriteAllColor && uiVertex.color != targetGraphic.color) { continue; } uiVertex.color *= Color.Lerp(vertex2, vertex1, ((gradientDir == GradientDir.Vertical ? uiVertex.position.y : uiVertex.position.x) - bottomY) / uiElementHeight); vh.SetUIVertex(uiVertex, i); } } else { for (int i = 0; i < count; i++) { vh.PopulateUIVertex(ref uiVertex, i); if (!overwriteAllColor && !CompareCarefully(uiVertex.color, targetGraphic.color)) { continue; } switch (gradientDir) { case GradientDir.Vertical: uiVertex.color *= (i % 4 == 0 || (i - 1) % 4 == 0) ? vertex1 : vertex2; break; case GradientDir.Horizontal: uiVertex.color *= (i % 4 == 0 || (i - 3) % 4 == 0) ? vertex1 : vertex2; break; case GradientDir.DiagonalLeftToRight: uiVertex.color *= (i % 4 == 0) ? vertex1 : ((i - 2) % 4 == 0 ? vertex2 : Color.Lerp(vertex2, vertex1, 0.5f)); break; case GradientDir.DiagonalRightToLeft: uiVertex.color *= ((i - 1) % 4 == 0) ? vertex1 : ((i - 3) % 4 == 0 ? vertex2 : Color.Lerp(vertex2, vertex1, 0.5f)); break; } vh.SetUIVertex(uiVertex, i); } } }
private void GenerateSlicedSprite(VertexHelper toFill, RichTextSprite richSprite, Sprite sprite) { UIVertex v = UIVertex.simpleVert; var vertexIndex = richSprite.GetVertexIndex() * 4; var fetchIndex = vertexIndex + 3; if (fetchIndex >= toFill.currentVertCount) { return; } toFill.PopulateUIVertex(ref v, fetchIndex); Vector3 textPos = v.position; var tagSize = richSprite.GetSize(); Vector4 border = sprite.border; Vector4 adjustedBorders = border; Vector4 outer, inner; outer = Sprites.DataUtility.GetOuterUV(sprite); inner = Sprites.DataUtility.GetInnerUV(sprite); s_VertScratch[0] = new Vector2(0, 0); s_VertScratch[3] = new Vector2(tagSize.x, tagSize.y); s_VertScratch[1].x = adjustedBorders.x; s_VertScratch[1].y = adjustedBorders.y; s_VertScratch[2].x = tagSize.x - adjustedBorders.z; s_VertScratch[2].y = tagSize.y - adjustedBorders.w; for (int i = 0; i < 4; ++i) { s_VertScratch[i].x += textPos.x; s_VertScratch[i].y += textPos.y; } s_UVScratch[0] = new Vector2(outer.x, outer.y); s_UVScratch[1] = new Vector2(inner.x, inner.y); s_UVScratch[2] = new Vector2(inner.z, inner.w); s_UVScratch[3] = new Vector2(outer.z, outer.w); int vertexCount = 0; for (int x = 0; x < 3; ++x) { int x2 = x + 1; for (int y = 0; y < 3; ++y) { int y2 = y + 1; addSpriteQuad(toFill, vertexIndex + vertexCount, new Vector2(s_VertScratch[x].x, s_VertScratch[y].y), new Vector2(s_VertScratch[x2].x, s_VertScratch[y2].y), new Vector2(s_UVScratch[x].x, s_UVScratch[y].y), new Vector2(s_UVScratch[x2].x, s_UVScratch[y2].y)); vertexCount += 4; } } }
public override void ModifyMesh(VertexHelper vh) { Image image = GetComponent <Image>(); if (image.type != Image.Type.Simple) { return; } Sprite sprite = image.overrideSprite; if (sprite == null || sprite.triangles.Length == 6) { return; } // Kanglai: at first I copy codes from Image.GetDrawingDimensions // to calculate Image's dimensions. But now for easy to read, I just take usage of corners. if (vh.currentVertCount != 4) { return; } UIVertex vertice = new UIVertex(); vh.PopulateUIVertex(ref vertice, 0); Vector2 lb = vertice.position; vh.PopulateUIVertex(ref vertice, 2); Vector2 rt = vertice.position; // Kanglai: recalculate vertices from Sprite! int len = sprite.vertices.Length; var vertices = new List <UIVertex>(len); Vector2 Center = sprite.bounds.center; Vector2 invExtend = new Vector2(1 / sprite.bounds.size.x, 1 / sprite.bounds.size.y); for (int i = 0; i < len; i++) { vertice = new UIVertex(); // normalize float x = (sprite.vertices[i].x - Center.x) * invExtend.x + 0.5f; float y = (sprite.vertices[i].y - Center.y) * invExtend.y + 0.5f; // lerp to position vertice.position = new Vector2(Mathf.Lerp(lb.x, rt.x, x), Mathf.Lerp(lb.y, rt.y, y)); vertice.color = image.color; vertice.uv0 = sprite.uv[i]; vertices.Add(vertice); } len = sprite.triangles.Length; var triangles = new List <int>(len); for (int i = 0; i < len; i++) { triangles.Add(sprite.triangles[i]); } vh.Clear(); vh.AddUIVertexStream(vertices, triangles); }
/// <summary> /// Call used to modify mesh. /// </summary> public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) { return; } // Gradient space. Rect rect = default(Rect); UIVertex vertex = default(UIVertex); if (!(graphic is Text) || m_GradientStyle == GradientStyle.Rect) { // RectTransform. rect = graphic.rectTransform.rect; } else if (m_GradientStyle == GradientStyle.Split) { // Each characters. rect.Set(0, 0, 1, 1); } else if (m_GradientStyle == GradientStyle.Fit) { // Fit to contents. rect.xMin = rect.yMin = float.MaxValue; rect.xMax = rect.yMax = float.MinValue; for (int i = 0; i < vh.currentVertCount; i++) { vh.PopulateUIVertex(ref vertex, i); rect.xMin = Mathf.Min(rect.xMin, vertex.position.x); rect.yMin = Mathf.Min(rect.yMin, vertex.position.y); rect.xMax = Mathf.Max(rect.xMax, vertex.position.x); rect.yMax = Mathf.Max(rect.yMax, vertex.position.y); } } // Gradient rotation. float rad = rotation * Mathf.Deg2Rad; Vector2 dir = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad)); if (!m_IgnoreAspectRatio && Direction.Angle <= m_Direction) { dir.x *= rect.height / rect.width; dir = dir.normalized; } // Calculate vertex color. Color color; Vector2 nomalizedPos; Matrix2x3 localMatrix = new Matrix2x3(rect, dir.x, dir.y); // Get local matrix. for (int i = 0; i < vh.currentVertCount; i++) { vh.PopulateUIVertex(ref vertex, i); // Normalize vertex position by local matrix. if (m_GradientStyle == GradientStyle.Split) { // Each characters. nomalizedPos = localMatrix * s_SplitedCharacterPosition[i % 4] + offset2; } else { nomalizedPos = localMatrix * vertex.position + offset2; } // Interpolate vertex color. if (direction == Direction.Diagonal) { color = Color.LerpUnclamped( Color.LerpUnclamped(m_Color1, m_Color2, nomalizedPos.x), Color.LerpUnclamped(m_Color3, m_Color4, nomalizedPos.x), nomalizedPos.y); } else { color = Color.LerpUnclamped(m_Color2, m_Color1, nomalizedPos.y); } // Correct color. vertex.color *= (m_ColorSpace == ColorSpace.Gamma) ? color.gamma : (m_ColorSpace == ColorSpace.Linear) ? color.linear : color; vh.SetUIVertex(vertex, i); } }
/// UNITY METHODS /// protected override void OnPopulateMesh(VertexHelper toFill) { originalText = m_Text; m_Text = GetOutputText(); base.OnPopulateMesh(toFill); m_DisableFontTextureRebuiltCallback = true; m_Text = originalText; positions.Clear(); vert = new UIVertex(); for (int i = 0; i < m_ImagesVertexIndex.Count; i++) { int endIndex = m_ImagesVertexIndex[i]; if (endIndex < toFill.currentVertCount) { toFill.PopulateUIVertex(ref vert, endIndex); positions.Add(new Vector2((vert.position.x + fontSize / 2), (vert.position.y + fontSize / 2)) + imageOffset); // Erase the lower left corner of the black specks toFill.PopulateUIVertex(ref vert, endIndex - 3); Vector3 pos = vert.position; for (int j = endIndex, m = endIndex - 3; j > m; j--) { toFill.PopulateUIVertex(ref vert, endIndex); vert.position = pos; toFill.SetUIVertex(vert, j); } } } // Hyperlinks surround processing box for (int h = 0; h < m_HrefInfos.Count; h++) { m_HrefInfos[h].boxes.Clear(); if (m_HrefInfos[h].startIndex >= toFill.currentVertCount) { continue; } // Hyperlink inside the text is added to surround the vertex index coordinate frame toFill.PopulateUIVertex(ref vert, m_HrefInfos[h].startIndex); Vector3 pos = vert.position; Bounds bounds = new Bounds(pos, Vector3.zero); for (int i = m_HrefInfos[h].startIndex, m = m_HrefInfos[h].endIndex; i < m; i++) { if (i >= toFill.currentVertCount) { break; } toFill.PopulateUIVertex(ref vert, i); pos = vert.position; // Wrap re-add surround frame if (pos.x < bounds.min.x) { m_HrefInfos[h].boxes.Add(new Rect(bounds.min, bounds.size)); bounds = new Bounds(pos, Vector3.zero); } else { bounds.Encapsulate(pos); // Extended enclosed box } } m_HrefInfos[h].boxes.Add(new Rect(bounds.min, bounds.size)); } // Update the quad images updateQuad = true; m_DisableFontTextureRebuiltCallback = false; }
public override void ModifyMesh(VertexHelper vh) { if (!enabled) { return; } var size = widthsize; if (size < text.fontSize) { size = text.fontSize; } var count = vh.currentVertCount / 4; var content = text.text; var richtext = text.supportRichText; if (string.IsNullOrEmpty(content)) { return; } int i = 0; if (richtext) { i = GetNextValidIndex(content, i); } float a = size / 2.0f * 1.30f; float b = size * 1.30f; float d = 0; float s = 0; float si = 0; UIVertex v1 = new UIVertex(); UIVertex v2 = new UIVertex(); vh.PopulateUIVertex(ref v1, i * 4); float x = 0; if (text.alignment != 0) { x = v1.position.x; } //float y = v1.position.y; char c = '\x0'; for (; i < count; ++i) { c = content[i]; if (c == '\n') { if (richtext) { i = GetNextValidIndex(content, i + 1); if (i >= count) { break; } } s = 0; continue; } else if (richtext && c == '<') { i = GetNextValidIndex(content, i); if (i >= count) { break; } c = content[i]; } vh.PopulateUIVertex(ref v1, i * 4 + 0); vh.PopulateUIVertex(ref v2, i * 4 + 2); d = v2.position.x - v1.position.x; if (d > b) { //字形大小超过文本尺寸时 //可能使用<size>富文本标记 si = d; } else if (uEmuera.Utils.CheckHalfSize(c)) { si = size / 2.0f; } //else if(c == ' ') // si = size; //else if(d < a) // si = size / 2.0f; else { si = size; } var o = s + (si - d) / 2; v1.position.x = x + o; v2.position.x = v1.position.x + d; vh.SetUIVertex(v1, i * 4 + 0); vh.SetUIVertex(v2, i * 4 + 2); vh.PopulateUIVertex(ref v1, i * 4 + 3); vh.PopulateUIVertex(ref v2, i * 4 + 1); v1.position.x = x + o; v2.position.x = v1.position.x + d; vh.SetUIVertex(v1, i * 4 + 3); vh.SetUIVertex(v2, i * 4 + 1); s += si; } }
public override void ModifyMesh(VertexHelper helper) { if (!IsActive() || helper.currentVertCount == 0) { return; } List <UIVertex> _vertexList = new List <UIVertex>(); helper.GetUIVertexStream(_vertexList); int nCount = _vertexList.Count; switch (GradientType) { case Type.Horizontal: { float left = _vertexList[0].position.x; float right = _vertexList[0].position.x; float x = 0f; for (int i = nCount - 1; i >= 1; --i) { x = _vertexList[i].position.x; if (x > right) { right = x; } else if (x < left) { left = x; } } float width = 1f / (right - left); UIVertex vertex = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref vertex, i); vertex.color = BlendColor(vertex.color, EffectGradient.Evaluate((vertex.position.x - left) * width - Offset)); helper.SetUIVertex(vertex, i); } } break; case Type.Vertical: { float bottom = _vertexList[0].position.y; float top = _vertexList[0].position.y; float y = 0f; for (int i = nCount - 1; i >= 1; --i) { y = _vertexList[i].position.y; if (y > top) { top = y; } else if (y < bottom) { bottom = y; } } float height = 1f / (top - bottom); UIVertex vertex = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref vertex, i); vertex.color = BlendColor(vertex.color, EffectGradient.Evaluate((vertex.position.y - bottom) * height - Offset)); helper.SetUIVertex(vertex, i); } } break; case Type.Diamond: { float bottom = _vertexList[0].position.y; float top = _vertexList[0].position.y; float y = 0f; for (int i = nCount - 1; i >= 1; --i) { y = _vertexList[i].position.y; if (y > top) { top = y; } else if (y < bottom) { bottom = y; } } float height = 1f / (top - bottom); helper.Clear(); for (int i = 0; i < nCount; i++) { helper.AddVert(_vertexList[i]); } float center = (bottom + top) / 2f; UIVertex centralVertex = new UIVertex(); centralVertex.position = (Vector3.right + Vector3.up) * center + Vector3.forward * _vertexList[0].position.z; centralVertex.normal = _vertexList[0].normal; centralVertex.color = Color.white; helper.AddVert(centralVertex); for (int i = 1; i < nCount; i++) { helper.AddTriangle(i - 1, i, nCount); } helper.AddTriangle(0, nCount - 1, nCount); UIVertex vertex = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref vertex, i); vertex.color = BlendColor(vertex.color, EffectGradient.Evaluate( Vector3.Distance(vertex.position, centralVertex.position) * height - Offset)); helper.SetUIVertex(vertex, i); } } break; case Type.Radial: { float left = _vertexList[0].position.x; float right = _vertexList[0].position.x; float bottom = _vertexList[0].position.y; float top = _vertexList[0].position.y; float x = 0f; float y = 0f; for (int i = nCount - 1; i >= 1; --i) { x = _vertexList[i].position.x; if (x > right) { right = x; } else if (x < left) { left = x; } y = _vertexList[i].position.y; if (y > top) { top = y; } else if (y < bottom) { bottom = y; } } float width = 1f / (right - left); float height = 1f / (top - bottom); helper.Clear(); float centerX = (right + left) / 2f; float centerY = (bottom + top) / 2f; float radiusX = (right - left) / 2f; float radiusY = (top - bottom) / 2f; UIVertex centralVertex = new UIVertex(); centralVertex.position = Vector3.right * centerX + Vector3.up * centerY + Vector3.forward * _vertexList[0].position.z; centralVertex.normal = _vertexList[0].normal; centralVertex.color = Color.white; int steps = 64; for (int i = 0; i < steps; i++) { UIVertex curVertex = new UIVertex(); float angle = (float)i * 360f / (float)steps; float curX = Mathf.Cos(Mathf.Deg2Rad * angle) * radiusX; float curY = Mathf.Sin(Mathf.Deg2Rad * angle) * radiusY; curVertex.position = Vector3.right * curX + Vector3.up * curY + Vector3.forward * _vertexList[0].position.z; curVertex.normal = _vertexList[0].normal; curVertex.color = Color.white; helper.AddVert(curVertex); } helper.AddVert(centralVertex); for (int i = 1; i < steps; i++) { helper.AddTriangle(i - 1, i, steps); } helper.AddTriangle(0, steps - 1, steps); UIVertex vertex = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref vertex, i); vertex.color = BlendColor(vertex.color, EffectGradient.Evaluate( Mathf.Sqrt( Mathf.Pow(Mathf.Abs(vertex.position.x - centerX) * width, 2f) + Mathf.Pow(Mathf.Abs(vertex.position.y - centerY) * height, 2f)) * 2f - Offset)); helper.SetUIVertex(vertex, i); } } break; } }
public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) { return; } if (vh.currentVertCount != 4) { return; } UIVertex vertice = new UIVertex(); vh.PopulateUIVertex(ref vertice, 0); Vector2 lbPos = vertice.position; Vector2 lbUV = vertice.uv0; vh.PopulateUIVertex(ref vertice, 2); Vector2 rtPos = vertice.position; Vector2 rtUV = vertice.uv0; Vector2 center = (lbPos + rtPos) * 0.5f; Vector2 halfSize = (rtPos - lbPos) * 0.5f; var vertexList = new UIVertex[CornerNum + CornerNum + 1]; var newList = new List <UIVertex>(); var centerVertex = new UIVertex(); centerVertex.position = new Vector3(center.x, center.y, 0); centerVertex.uv0 = (lbUV + rtUV) * 0.5f; centerVertex.color = Color.white; vertexList[0] = centerVertex; var anglePer = Mathf.PI / CornerNum; for (var i = 0; i < CornerNum + CornerNum; i++) { var angle = anglePer * i; var posX = Mathf.Cos(angle); var posY = Mathf.Sin(angle); var pixelPosX = posX * halfSize.x; var pixelPosY = posY * halfSize.y; var uvU = Mathf.Lerp(lbUV.x, rtUV.x, posX * 0.5f + 0.5f); var uvV = Mathf.Lerp(lbUV.y, rtUV.y, posY * 0.5f + 0.5f); var newVertex = new UIVertex(); newVertex.position = new Vector3(pixelPosX, pixelPosY, 0); newVertex.uv0 = new Vector2(uvU, uvV); newVertex.color = Color.white; vertexList[i + 1] = newVertex; } for (var i = 0; i < CornerNum + CornerNum - 1; i++) { newList.Add(vertexList[0]); newList.Add(vertexList[i + 1]); newList.Add(vertexList[i + 2]); } newList.Add(vertexList[0]); newList.Add(vertexList[CornerNum + CornerNum]); newList.Add(vertexList[1]); vh.Clear(); vh.AddUIVertexTriangleStream(newList); }
public override void ModifyMesh(VertexHelper vh) { Image image = GetComponent <Image>(); if (image.type != Image.Type.Simple) { return; } Sprite sprite = image.overrideSprite; if (sprite == null || sprite.triangles.Length == 6) { // only 2 triangles return; } if (vh.currentVertCount != 4) { return; } UIVertex vertice = new UIVertex(); vh.PopulateUIVertex(ref vertice, 0); Vector2 lb = vertice.position; vh.PopulateUIVertex(ref vertice, 2); Vector2 rt = vertice.position; int len = sprite.vertices.Length; var vertices = new List <UIVertex>(len); float minX = float.MaxValue; float maxX = float.MinValue; float minY = float.MaxValue; float maxY = float.MinValue; for (int i = 0; i < len; i++) { minX = Mathf.Min(minX, sprite.vertices[i].x); maxX = Mathf.Max(maxX, sprite.vertices[i].x); minY = Mathf.Min(minY, sprite.vertices[i].y); maxY = Mathf.Max(maxY, sprite.vertices[i].y); } Vector2 invExtend = new Vector2(1.0f / (maxX - minX), 1.0f / (maxY - minY)); for (int i = 0; i < len; i++) { vertice = new UIVertex(); float x = (sprite.vertices[i].x - minX) * invExtend.x; float y = (sprite.vertices[i].y - minY) * invExtend.y; vertice.position = new Vector2(Mathf.Lerp(lb.x, rt.x, x), Mathf.Lerp(lb.y, rt.y, y)); vertice.color = image.color; vertice.uv0 = sprite.uv[i]; vertices.Add(vertice); } len = sprite.triangles.Length; var triangles = new List <int>(len); for (int i = 0; i < len; i++) { triangles.Add(sprite.triangles[i]); } vh.Clear(); vh.AddUIVertexStream(vertices, triangles); }
public override void ModifyMesh(VertexHelper helper) { if (!IsActive() || helper.currentVertCount == 0) { return; } List <UIVertex> _vertexList = new List <UIVertex>(); helper.GetUIVertexStream(_vertexList); int nCount = _vertexList.Count; switch (GradientType) { case Type.Vertical: { float fBottomY = _vertexList[0].position.y; float fTopY = _vertexList[0].position.y; float fYPos = 0f; for (int i = nCount - 1; i >= 1; --i) { fYPos = _vertexList[i].position.y; if (fYPos > fTopY) { fTopY = fYPos; } else if (fYPos < fBottomY) { fBottomY = fYPos; } } float fUIElementHeight = 1f / (fTopY - fBottomY); UIVertex v = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref v, i); Byte alpha = v.color.a; v.color = Color32.Lerp(EndColor, StartColor, (v.position.y - fBottomY) * fUIElementHeight - Offset); v.color.a = (Byte)((v.color.a * alpha) / 255); helper.SetUIVertex(v, i); } } break; case Type.Horizontal: { float fLeftX = _vertexList[0].position.x; float fRightX = _vertexList[0].position.x; float fXPos = 0f; for (int i = nCount - 1; i >= 1; --i) { fXPos = _vertexList[i].position.x; if (fXPos > fRightX) { fRightX = fXPos; } else if (fXPos < fLeftX) { fLeftX = fXPos; } } float fUIElementWidth = 1f / (fRightX - fLeftX); UIVertex v = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref v, i); Byte alpha = v.color.a; v.color = Color32.Lerp(EndColor, StartColor, (v.position.x - fLeftX) * fUIElementWidth - Offset); v.color.a = (Byte)((v.color.a * alpha) / 255); helper.SetUIVertex(v, i); } } break; default: break; } }
public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) { return; } List <UIVertex> verts = new List <UIVertex> (); vh.GetUIVertexStream(verts); Text text = GetComponent <Text>(); if (text == null) { Debug.LogWarning("CenterGlyphs on Line: Missing Text component"); return; } string[] lines = text.text.Split('\n'); Vector3 pos = Vector3.zero; //float letterOffset = 0f * (float)text.fontSize / 100f; //float alignmentFactor = 0; int glyphIdx = 0; switch (text.alignment) { case TextAnchor.LowerLeft: case TextAnchor.MiddleLeft: case TextAnchor.UpperLeft: //alignmentFactor = 0f; break; case TextAnchor.LowerCenter: case TextAnchor.MiddleCenter: case TextAnchor.UpperCenter: //alignmentFactor = 0.5f; break; case TextAnchor.LowerRight: case TextAnchor.MiddleRight: case TextAnchor.UpperRight: //alignmentFactor = 1f; break; } for (int lineIdx = 0; lineIdx < lines.Length; lineIdx++) { string line = lines[lineIdx]; //float lineOffset = (line.Length -1) * letterOffset * alignmentFactor; for (int charIdx = 0; charIdx < line.Length; charIdx++) { int idx1 = glyphIdx * 4 + 0; int idx2 = glyphIdx * 4 + 1; int idx3 = glyphIdx * 4 + 2; int idx4 = glyphIdx * 4 + 3; // Check for truncated text (doesn't generate verts for all characters) if (idx4 > verts.Count - 1) { return; } var vert1 = verts[idx1]; var vert2 = verts[idx2]; var vert3 = verts[idx3]; var vert4 = verts[idx4]; vh.PopulateUIVertex(ref vert1, idx1); vh.PopulateUIVertex(ref vert2, idx2); vh.PopulateUIVertex(ref vert3, idx3); vh.PopulateUIVertex(ref vert4, idx4); var height = vert1.position - vert4.position; Vector3[] corners = new Vector3[4]; this.GetComponent <RectTransform> ().GetLocalCorners(corners); //var dimensions = corners[2] - corners[0]; //Debug.Log ("Rect size = " + dimensions); //Debug.Log ("Char height = " + height.magnitude ); //Debug.Log ("Lower char corner y value = " + vert4.position.y); //float off = ((dimensions.y / 2f) - (height.magnitude / 2f)); //Debug.Log ("Char Off = " + off ); // Diff to be in the center... var half_height = height.magnitude / 2f; //float diff_y = Mathf.Max( Mathf.Abs(half_height), Mathf.Abs(vert4.position.y) ) - Mathf.Min( Mathf.Abs(half_height), Mathf.Abs(vert4.position.y) ); //Debug.Log ("diff_y =" + diff_y); float off_y = -half_height - vert4.position.y; pos.y = off_y; //pos = new Vector3 (0f, +height.magnitude / 2f, 0f); // ; // Vector3.up * ((height)*lineOffset); //vert1.color = Color.red; vert1.position += pos; vh.SetUIVertex(vert1, idx1); vert2.position += pos; vh.SetUIVertex(vert2, idx2); //vert1.color = Color.red; //vert3.color = Color.green; vert3.position += pos; vh.SetUIVertex(vert3, idx3); //vert1.color = Color.red; vert4.position += pos; vh.SetUIVertex(vert4, idx4); //vh.SetUIVertex ( vert2, idx2 ); //vh.SetUIVertex ( vert3, idx3 ); //vh.SetUIVertex ( vert4, idx4 ); glyphIdx++; } // Offset for carriage return character that still generates verts glyphIdx++; } }
public override void ModifyMesh(VertexHelper helper) { if (this.IsActive() && (helper.currentVertCount != 0)) { List <UIVertex> stream = new List <UIVertex>(); helper.GetUIVertexStream(stream); int count = stream.Count; Type gradientType = this.GradientType; if (gradientType == Type.Horizontal) { float x = stream[0].position.x; float num3 = stream[0].position.x; float num4 = 0f; int num5 = count - 1; while (true) { if (num5 < 1) { float num6 = 1f / (num3 - x); UIVertex vertex = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref vertex, i); vertex.color = this.BlendColor((Color)vertex.color, this.EffectGradient.Evaluate(((vertex.position.x - x) * num6) - this.Offset)); helper.SetUIVertex(vertex, i); } break; } UIVertex vertex3 = stream[num5]; num4 = vertex3.position.x; if (num4 > num3) { num3 = num4; } else if (num4 < x) { x = num4; } num5--; } } else if (gradientType == Type.Vertical) { float y = stream[0].position.y; float num9 = stream[0].position.y; float num10 = 0f; int num11 = count - 1; while (true) { if (num11 < 1) { float num12 = 1f / (num9 - y); UIVertex vertex = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref vertex, i); vertex.color = this.BlendColor((Color)vertex.color, this.EffectGradient.Evaluate(((vertex.position.y - y) * num12) - this.Offset)); helper.SetUIVertex(vertex, i); } break; } UIVertex vertex7 = stream[num11]; num10 = vertex7.position.y; if (num10 > num9) { num9 = num10; } else if (num10 < y) { y = num10; } num11--; } } } }
public override void ModifyMesh(VertexHelper helper) { for (int i = 0; i < helper.currentVertCount; i++) { UIVertex vert = new UIVertex(); helper.PopulateUIVertex(ref vert, i); if (currentChar < 0) { vert.color = Color.clear; } else { if (i / 4 > currentChar) { vert.color = Color.clear; } } helper.SetUIVertex(vert, i); } }
public override void ModifyMesh(VertexHelper helper) { if (!IsActive() || helper.currentVertCount == 0) { return; } List <UIVertex> _vertexList = new List <UIVertex>(); helper.GetUIVertexStream(_vertexList); int nCount = _vertexList.Count; switch (GradientType) { case Type.Horizontal: { float left = _vertexList[0].position.x; float right = _vertexList[0].position.x; float x = 0f; for (int i = nCount - 1; i >= 1; --i) { x = _vertexList[i].position.x; if (x > right) { right = x; } else if (x < left) { left = x; } } float width = 1f / (right - left); UIVertex vertex = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref vertex, i); vertex.color = BlendColor(vertex.color, EffectGradient.Evaluate((vertex.position.x - left) * width - Offset)); helper.SetUIVertex(vertex, i); } } break; case Type.Vertical: { float bottom = _vertexList[0].position.y; float top = _vertexList[0].position.y; float y = 0f; for (int i = nCount - 1; i >= 1; --i) { y = _vertexList[i].position.y; if (y > top) { top = y; } else if (y < bottom) { bottom = y; } } float height = 1f / (top - bottom); UIVertex vertex = new UIVertex(); for (int i = 0; i < helper.currentVertCount; i++) { helper.PopulateUIVertex(ref vertex, i); vertex.color = BlendColor(vertex.color, EffectGradient.Evaluate((vertex.position.y - bottom) * height - Offset)); helper.SetUIVertex(vertex, i); } } break; } }
public override void ModifyMesh(VertexHelper vh) { if (!enabled) { return; } var size = widthsize; if (size < text.fontSize) { size = text.fontSize; } var count = vh.currentVertCount / 4; var content = text.text; var length = content.Length; var richtext = text.supportRichText; if (string.IsNullOrWhiteSpace(content)) { return; } int i = 0; if (richtext) { i = GetNextValidIndex(content, i); } float a = size / 2.0f * 1.30f; float b = size * 1.30f; float d = 0; float s = 0; float si = 0; UIVertex v1 = new UIVertex(); UIVertex v2 = new UIVertex(); float linestart = -rectTransform.sizeDelta.x * rectTransform.pivot.x; //顶点索引记录 int vi = 0; char c = '\x0'; for (; i < length && vi < count; ++i) { c = content[i]; if (c == '\n') { if (richtext) { var ni = i + 1; i = GetNextValidIndex(content, ni); if (i >= length) { break; } else if (i == ni) { //非特殊 i -= 1; } } s = 0; continue; } else if (c == ' ') { s += size / 2.0f; continue; } else if (richtext && c == '<') { var nexti = GetNextValidIndex(content, i); if (nexti > i) { i = nexti; if (i >= length) { break; } i -= 1; continue; } } vh.PopulateUIVertex(ref v1, vi * 4 + 0); vh.PopulateUIVertex(ref v2, vi * 4 + 2); d = v2.position.x - v1.position.x; if (d > b) { //字形大小超过文本尺寸时 //可能使用<size>富文本标记 si = d; } else if (uEmuera.Utils.CheckHalfSize(c)) { si = size / 2.0f; } else if (c == ' ') { si = size / 2.0f; } //else if(c == ' ') // si = size; //else if(d < a) // si = size / 2.0f; else { si = size; } var o = s + (si - d) / 2.0f; v1.position.x = linestart + o; v2.position.x = v1.position.x + d; vh.SetUIVertex(v1, vi * 4 + 0); vh.SetUIVertex(v2, vi * 4 + 2); vh.PopulateUIVertex(ref v1, vi * 4 + 3); vh.PopulateUIVertex(ref v2, vi * 4 + 1); v1.position.x = linestart + o; v2.position.x = v1.position.x + d; vh.SetUIVertex(v1, vi * 4 + 3); vh.SetUIVertex(v2, vi * 4 + 1); vi += 1; s += si; } }
public override void ModifyMesh(VertexHelper vh) { List <UIVertex> verts = new List <UIVertex> (); vh.GetUIVertexStream(verts); if (!IsActive()) { return; } Text text = GetComponent <Text>(); if (text == null) { Debug.LogWarning("LetterSpacing: Missing Text component"); return; } string[] lines = text.text.Split('\n'); Vector3 pos; float letterOffset = spacing * (float)text.fontSize / 100f; float alignmentFactor = 0; int glyphIdx = 0; switch (text.alignment) { case TextAnchor.LowerLeft: case TextAnchor.MiddleLeft: case TextAnchor.UpperLeft: alignmentFactor = 0f; break; case TextAnchor.LowerCenter: case TextAnchor.MiddleCenter: case TextAnchor.UpperCenter: alignmentFactor = 0.5f; break; case TextAnchor.LowerRight: case TextAnchor.MiddleRight: case TextAnchor.UpperRight: alignmentFactor = 1f; break; } for (int lineIdx = 0; lineIdx < lines.Length; lineIdx++) { string line = lines[lineIdx]; float lineOffset = (line.Length - 1) * letterOffset * alignmentFactor; for (int charIdx = 0; charIdx < line.Length; charIdx++) { int idx1 = glyphIdx * 4 + 0; int idx2 = glyphIdx * 4 + 1; int idx3 = glyphIdx * 4 + 2; int idx4 = glyphIdx * 4 + 3; // Check for truncated text (doesn't generate verts for all characters) if (idx4 > verts.Count - 1) { return; } var vert1 = verts[idx1]; var vert2 = verts[idx2]; var vert3 = verts[idx3]; var vert4 = verts[idx4]; pos = Vector3.right * (letterOffset * charIdx - lineOffset); //vert1.position += pos; //vert2.position += pos; //vert3.position += pos; //vert4.position += pos; //verts[idx1] = vert1; //verts[idx2] = vert2; //verts[idx3] = vert3; //verts[idx4] = vert4; //Debug.Log ("offset = " + idx1); vh.PopulateUIVertex(ref vert1, idx1); //vert1.color = Color.red; vert1.position += pos; vh.SetUIVertex(vert1, idx1); vh.PopulateUIVertex(ref vert2, idx2); //vert1.color = Color.red; vert2.position += pos; vh.SetUIVertex(vert2, idx2); vh.PopulateUIVertex(ref vert3, idx3); //vert1.color = Color.red; vert3.position += pos; vh.SetUIVertex(vert3, idx3); vh.PopulateUIVertex(ref vert4, idx4); //vert1.color = Color.red; vert4.position += pos; vh.SetUIVertex(vert4, idx4); //vh.SetUIVertex ( vert2, idx2 ); //vh.SetUIVertex ( vert3, idx3 ); //vh.SetUIVertex ( vert4, idx4 ); glyphIdx++; } // Offset for carriage return character that still generates verts glyphIdx++; } }