//private void ResetData() //{ // if (m_mesh && false) // { // Debug.Log("Drawing Mesh"); // var cr = GetComponent<CanvasRenderer>(); // cr.SetMesh(m_mesh); // if (m_materials != null && m_materials.Count > 0) // { // Debug.Log("Adding Materials"); // cr.materialCount = m_materials.Count; // for (int i = 0; i < m_materials.Count; i++) // cr.SetMaterial(m_materials[i], i); // } // } //} protected override void OnPopulateMesh(VertexHelper vh) { Debug.Log("Populate Mesh Data"); vh.Clear(); vh.FillMesh(m_mesh); base.OnPopulateMesh(vh); }
protected override void OnPopulateMesh(VertexHelper vh) { var r = GetPixelAdjustedRect(); var v = new Vector4(r.x, r.y, r.x + r.width, r.y + r.height); float dif = (v.w - v.y) * 2; Color32 color32 = color; vh.Clear(); color32.a = (byte)0; vh.AddVert(new Vector3(v.x - 50, width * v.y + yoffset * dif), color32, new Vector2(0f, 0f)); vh.AddVert(new Vector3(v.z + 50, width * v.y + yoffset * dif), color32, new Vector2(1f, 0f)); color32.a = (byte)(color.a * 255); vh.AddVert(new Vector3(v.x - 50, width * (v.y / 4) + yoffset * dif), color32, new Vector2(0f, 1f)); vh.AddVert(new Vector3(v.z + 50, width * (v.y / 4) + yoffset * dif), color32, new Vector2(1f, 1f)); color32.a = (byte)(color.a * 255); vh.AddVert(new Vector3(v.x - 50, width * (v.w / 4) + yoffset * dif), color32, new Vector2(0f, 1f)); vh.AddVert(new Vector3(v.z + 50, width * (v.w / 4) + yoffset * dif), color32, new Vector2(1f, 1f)); color32.a = (byte)(color.a * 255); color32.a = (byte)0; vh.AddVert(new Vector3(v.x - 50, width * v.w + yoffset * dif), color32, new Vector2(0f, 1f)); vh.AddVert(new Vector3(v.z + 50, width * v.w + yoffset * dif), color32, new Vector2(1f, 1f)); vh.AddTriangle(0, 1, 2); vh.AddTriangle(2, 3, 1); vh.AddTriangle(2, 3, 4); vh.AddTriangle(4, 5, 3); vh.AddTriangle(4, 5, 6); vh.AddTriangle(6, 7, 5); }
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 })); } }
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(VertexHelper vh) { vh.Clear(); float wHalf = rectTransform.rect.width / 2; //float hHalf = rectTransform.rect.height / 2; a = Math.Min(1, Math.Max(0, a)); b = Math.Min(1, Math.Max(0, b)); c = Math.Min(1, Math.Max(0, c)); d = Math.Min(1, Math.Max(0, d)); Color32 color32 = color; vh.AddVert(new Vector3(-wHalf * a, 0), color32, new Vector2(0f, 0f)); vh.AddVert(new Vector3(0, wHalf * b), color32, new Vector2(0f, 1f)); vh.AddVert(new Vector3(wHalf * c, 0), color32, new Vector2(1f, 1f)); vh.AddVert(new Vector3(0, -wHalf * d), color32, new Vector2(1f, 0f)); vh.AddTriangle(0, 1, 2); vh.AddTriangle(2, 3, 0); }
public override void ModifyMesh(VertexHelper vh) { if (!this.IsActive ()) { return; } List < UIVertex > verts = new List<UIVertex>(); vh.GetUIVertexStream(verts); Text foundtext = GetComponent<Text>(); float best_fit_adjustment = 1f; if (foundtext && foundtext.resizeTextForBestFit) { best_fit_adjustment = (float)foundtext.cachedTextGenerator.fontSizeUsedForBestFit / (foundtext.resizeTextMaxSize-1); //max size seems to be exclusive } float distanceX = this.effectDistance.x * best_fit_adjustment; float distanceY = this.effectDistance.y * best_fit_adjustment; int start = 0; int count = verts.Count; this.ApplyShadow (verts, this.effectColor, start, verts.Count, distanceX, distanceY); start = count; count = verts.Count; this.ApplyShadow (verts, this.effectColor, start, verts.Count, distanceX, -distanceY); start = count; count = verts.Count; this.ApplyShadow (verts, this.effectColor, start, verts.Count, -distanceX, distanceY); start = count; count = verts.Count; this.ApplyShadow (verts, this.effectColor, start, verts.Count, -distanceX, -distanceY); start = count; count = verts.Count; this.ApplyShadow (verts, this.effectColor, start, verts.Count, distanceX, 0); start = count; count = verts.Count; this.ApplyShadow (verts, this.effectColor, start, verts.Count, -distanceX, 0); start = count; count = verts.Count; this.ApplyShadow (verts, this.effectColor, start, verts.Count, 0, distanceY); start = count; count = verts.Count; this.ApplyShadow (verts, this.effectColor, start, verts.Count, 0, -distanceY); vh.Clear(); vh.AddUIVertexTriangleStream(verts); }
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]); } }
public override void ModifyMesh(VertexHelper vh) { if (IsDrawGradent) { if (!IsActive()) { return; } var vertexList = new List <UIVertex>(); vh.GetUIVertexStream(vertexList); int count = vertexList.Count; if (GradientType == TypeHV.Vertica) { ApplyGradientV(vertexList, 0, count); vh.Clear(); vh.AddUIVertexTriangleStream(vertexList); } if (GradientType == TypeHV.Horizontal) { ApplyGradientH(vertexList, 0, count); vh.Clear(); vh.AddUIVertexTriangleStream(vertexList); } if (GradientType == TypeHV.VerticaThreeColor) { ModifyVertices(vh); } } if (IsDrawOutline) { var verts = new List <UIVertex>(); vh.GetUIVertexStream(verts); var neededCpacity = verts.Count * 2; if (verts.Capacity < neededCpacity) { verts.Capacity = neededCpacity; } //4point var start = 0; var end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, Outline_effectDistance.x, Outline_effectDistance.y); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, Outline_effectDistance.x, -Outline_effectDistance.y); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, -Outline_effectDistance.x, Outline_effectDistance.y); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, -Outline_effectDistance.x, -Outline_effectDistance.y); //8point switch (ShadowType) { case OutLineVector.Shadow_4: break; case OutLineVector.Shadow_8: start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, -Outline_effectDistance.x, 0); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, Outline_effectDistance.x, 0); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, 0, Outline_effectDistance.y); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, 0, -Outline_effectDistance.y); break; //16point case OutLineVector.Shadow_16: start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, -Outline_effectDistance.x, Outline_effectDistance.y / 2); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, Outline_effectDistance.x, Outline_effectDistance.y / 2); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, -Outline_effectDistance.x, -Outline_effectDistance.y / 2); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, Outline_effectDistance.x, -Outline_effectDistance.y / 2); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, -Outline_effectDistance.x / 2, Outline_effectDistance.y); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, -Outline_effectDistance.x / 2, -Outline_effectDistance.y); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, Outline_effectDistance.x / 2, Outline_effectDistance.y); start = end; end = verts.Count; ApplyShadowZeroAlloc(verts, Outline_effectColor, start, verts.Count, Outline_effectDistance.x / 2, -Outline_effectDistance.y); break; } vh.Clear(); vh.AddUIVertexTriangleStream(verts); } if (IsDrawShadow) { var verts = new List <UIVertex>(); vh.GetUIVertexStream(verts); var neededCpacity = verts.Count * 2; if (verts.Capacity < neededCpacity) { verts.Capacity = neededCpacity; } //4点绘制 var start = 0; var end = verts.Count; ApplyShadowZeroAlloc(verts, Shadow_effectColor, start, verts.Count, Shadow_effectDistance.x, Shadow_effectDistance.y); vh.Clear(); vh.AddUIVertexTriangleStream(verts); } }
protected override void OnPopulateMesh(VertexHelper vh) { vh.Clear(); }
public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) { return; } var verts = new List <UIVertex>(); vh.GetUIVertexStream(verts); UIVertex vt; float s = 0.1f; for (int i = 0; i < verts.Count / 6; ++i) { int j = i * 6; Vector2 uv1 = Vector2.zero, uv2 = Vector2.zero; Vector2 uv11 = verts[j].uv0; Vector2 uv21 = verts[j + 2].uv0; Vector3 p1 = verts[j].position; Vector3 p2 = verts[j + 2].position; uv1.x = Mathf.Min(uv11.x, uv21.x); uv1.y = Mathf.Min(uv11.y, uv21.y); uv2.x = Mathf.Max(uv11.x, uv21.x); uv2.y = Mathf.Max(uv11.y, uv21.y); float uvw_x = uv2.x - uv1.x; float uvw_y = uv2.y - uv1.y; float pw_x = Mathf.Abs(p1.x - p2.x); float pw_y = Mathf.Abs(p1.y - p2.y); for (int k = 0; k < 6; k++) { vt = verts[j + k]; switch (k) { case 0: case 5: vt.position.x -= pw_x * s; vt.position.y += pw_y * s; break; case 1: vt.position.x += pw_x * s; vt.position.y += pw_y * s; break; case 2: case 3: vt.position.x += pw_x * s; vt.position.y -= pw_y * s; break; case 4: vt.position.x -= pw_x * s; vt.position.y -= pw_y * s; break; } if (vt.uv0.x == uv2.x) { vt.uv0.x += uvw_x * s; } else { vt.uv0.x -= uvw_x * s; } if (vt.uv0.y == uv2.y) { vt.uv0.y += uvw_y * s; } else { vt.uv0.y -= uvw_y * s; } vt.uv1 = uv1; vt.uv2 = uv2; verts[j + k] = vt; } } vh.Clear(); vh.AddUIVertexTriangleStream(verts); }
protected override void OnPopulateMesh(VertexHelper vh) { #if UNITY_EDITOR if (!Application.isPlaying) { if (!Initialize()) { return; } } #endif // prepare vertices vh.Clear(); if (!gameObject.activeInHierarchy) { return; } Vector2 temp = Vector2.zero; Vector2 corner1 = Vector2.zero; Vector2 corner2 = Vector2.zero; // iterate through current particles int count = pSystem.GetParticles(particles); for (int i = 0; i < count; ++i) { ParticleSystem.Particle particle = particles[i]; // get particle properties #if UNITY_5_5_OR_NEWER Vector2 position = (mainModule.simulationSpace == ParticleSystemSimulationSpace.Local ? particle.position : _transform.InverseTransformPoint(particle.position)); #else Vector2 position = (pSystem.simulationSpace == ParticleSystemSimulationSpace.Local ? particle.position : _transform.InverseTransformPoint(particle.position)); #endif float rotation = -particle.rotation * Mathf.Deg2Rad; float rotation90 = rotation + Mathf.PI / 2; Color32 color = particle.GetCurrentColor(pSystem); float size = particle.GetCurrentSize(pSystem) * 0.5f; // apply scale #if UNITY_5_5_OR_NEWER if (mainModule.scalingMode == ParticleSystemScalingMode.Shape) { position /= canvas.scaleFactor; } #else if (pSystem.scalingMode == ParticleSystemScalingMode.Shape) { position /= canvas.scaleFactor; } #endif // apply texture sheet animation Vector4 particleUV = imageUV; if (textureSheetAnimation.enabled) { #if UNITY_5_5_OR_NEWER float frameProgress = 1 - (particle.remainingLifetime / particle.startLifetime); if (textureSheetAnimation.frameOverTime.curveMin != null) { frameProgress = textureSheetAnimation.frameOverTime.curveMin.Evaluate(1 - (particle.remainingLifetime / particle.startLifetime)); } else if (textureSheetAnimation.frameOverTime.curve != null) { frameProgress = textureSheetAnimation.frameOverTime.curve.Evaluate(1 - (particle.remainingLifetime / particle.startLifetime)); } else if (textureSheetAnimation.frameOverTime.constant > 0) { frameProgress = textureSheetAnimation.frameOverTime.constant - (particle.remainingLifetime / particle.startLifetime); } #else float frameProgress = 1 - (particle.lifetime / particle.startLifetime); #endif 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) * textureSheetAnimationFrameSize.x; particleUV.y = Mathf.FloorToInt(frame / textureSheetAnimation.numTilesX) * textureSheetAnimationFrameSize.y; particleUV.z = particleUV.x + textureSheetAnimationFrameSize.x; particleUV.w = particleUV.y + textureSheetAnimationFrameSize.y; } temp.x = particleUV.x; temp.y = particleUV.y; _quad[0] = UIVertex.simpleVert; _quad[0].color = color; _quad[0].uv0 = temp; temp.x = particleUV.x; temp.y = particleUV.w; _quad[1] = UIVertex.simpleVert; _quad[1].color = color; _quad[1].uv0 = temp; temp.x = particleUV.z; temp.y = particleUV.w; _quad[2] = UIVertex.simpleVert; _quad[2].color = color; _quad[2].uv0 = temp; temp.x = particleUV.z; temp.y = particleUV.y; _quad[3] = UIVertex.simpleVert; _quad[3].color = color; _quad[3].uv0 = temp; if (rotation == 0) { // no rotation corner1.x = position.x - size; corner1.y = position.y - size; corner2.x = position.x + size; corner2.y = position.y + size; temp.x = corner1.x; temp.y = corner1.y; _quad[0].position = temp; temp.x = corner1.x; temp.y = corner2.y; _quad[1].position = temp; temp.x = corner2.x; temp.y = corner2.y; _quad[2].position = temp; temp.x = corner2.x; temp.y = corner1.y; _quad[3].position = temp; } else { if (use3dRotation) { // get particle properties #if UNITY_5_5_OR_NEWER Vector3 pos3d = (mainModule.simulationSpace == ParticleSystemSimulationSpace.Local ? particle.position : _transform.InverseTransformPoint(particle.position)); #else Vector3 pos3d = (pSystem.simulationSpace == ParticleSystemSimulationSpace.Local ? particle.position : _transform.InverseTransformPoint(particle.position)); #endif // apply scale #if UNITY_5_5_OR_NEWER if (mainModule.scalingMode == ParticleSystemScalingMode.Shape) { position /= canvas.scaleFactor; } #else if (pSystem.scalingMode == ParticleSystemScalingMode.Shape) { position /= canvas.scaleFactor; } #endif Vector3[] verts = new Vector3[4] { new Vector3(-size, -size, 0), new Vector3(-size, size, 0), new Vector3(size, size, 0), new Vector3(size, -size, 0) }; Quaternion particleRotation = Quaternion.Euler(particle.rotation3D); _quad[0].position = pos3d + particleRotation * verts[0]; _quad[1].position = pos3d + particleRotation * verts[1]; _quad[2].position = pos3d + particleRotation * verts[2]; _quad[3].position = pos3d + particleRotation * verts[3]; } 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); } }
protected void PopulateTilletRectMesh(VertexHelper vh) { vh.Clear(); m_outterVertices.Clear(); //rect float tw = rectTransform.rect.width; float th = rectTransform.rect.height; float halttw = rectTransform.pivot.x * tw; float haltth = rectTransform.pivot.y * th; //半径不能超过宽度的一般 float half = tw > th ? th * 0.5f : tw * 0.5f; FilletRadius = FilletRadius > half ? half : FilletRadius; if (FilletRadius <= 0) { FilletRadius = 0; } Vector4 uv = overrideSprite != null?DataUtility.GetOuterUV(overrideSprite) : Vector4.zero; m_UVCenter = new Vector2((uv.x + uv.z) * 0.5f, (uv.y + uv.w) * 0.5f); m_UVScale = new Vector2((uv.z - uv.x) / tw, (uv.w - uv.y) / th); Vector2 v1 = new Vector2(halttw - m_FilletRadius, haltth - m_FilletRadius); //右上角圆点 Vector2 v2 = new Vector2(m_FilletRadius - halttw, haltth - m_FilletRadius); //左上角圆点 Vector2 v3 = new Vector2(m_FilletRadius - halttw, m_FilletRadius - haltth); //左下角圆点 Vector2 v4 = new Vector2(halttw - m_FilletRadius, m_FilletRadius - haltth); //右下角圆点 int m_curSegment = m_FilletSegments * 4; float deltaDegree = Mathf.PI / 2 / (m_FilletSegments - 1); float curDegree = 0; for (int i = 0; i < m_curSegment; i += 4) { m_outterVertices.Add(CreateUIVertex(new Vector2(Mathf.Cos(curDegree) * m_FilletRadius + v1.x, Mathf.Sin(curDegree) * m_FilletRadius + v1.y), vh).position); //右上角 m_outterVertices.Add(CreateUIVertex(new Vector2(Mathf.Cos(curDegree + Mathf.PI / 2) * m_FilletRadius + v2.x, Mathf.Sin(curDegree + Mathf.PI / 2) * m_FilletRadius + v2.y), vh).position); //左上角 m_outterVertices.Add(CreateUIVertex(new Vector2(Mathf.Cos(curDegree + Mathf.PI) * m_FilletRadius + v3.x, Mathf.Sin(curDegree + Mathf.PI) * m_FilletRadius + v3.y), vh).position); //左下角 m_outterVertices.Add(CreateUIVertex(new Vector2(Mathf.Cos(curDegree + Mathf.PI * 3 / 2) * m_FilletRadius + v4.x, Mathf.Sin(curDegree + Mathf.PI * 3 / 2) * m_FilletRadius + v4.y), vh).position); //右下角 curDegree += deltaDegree; } vh.AddTriangle(0, 2, 1); vh.AddTriangle(0, 3, 2); for (int i = 0; i < 4; i++) { int maxIndex = (m_FilletSegments - 1) * 4 + i; //偶数个顶点 if (m_FilletSegments % 2 == 0) { //TODO:........ } else //奇数个顶点 { int bigTriangleCount = (int)((m_FilletSegments + 1) * 0.5); for (int vIdx = 0; vIdx < bigTriangleCount; vIdx++) { if (8 * vIdx + i == maxIndex) { int angle = i + 1 == 4 ? 0 : i + 1; vh.AddTriangle(i, angle, maxIndex); } else { vh.AddTriangle(i, 8 * (vIdx + 1) + i, vIdx == 0 ? (4 + i) : (vIdx * 8 + i)); } } for (int vIdx2 = 1; vIdx2 < m_FilletSegments - 1 - bigTriangleCount; vIdx2++) { vh.AddTriangle(8 * vIdx2 + i, 8 * (vIdx2 + 1) + i, 8 * (vIdx2 + 1) + i - 4); } } } }
// Token: 0x0600919A RID: 37274 RVA: 0x0032F9D0 File Offset: 0x0032DBD0 public virtual void IGIFECGGLAC(VertexHelper CBFPMKACAHH) { if (!this.IsActive()) { return; } List <UIVertex> list = new List <UIVertex>(); CBFPMKACAHH.GetUIVertexStream(list); Text component = base.GetComponent <Text>(); if (component == null) { Debug.LogWarning("_Value4"); return; } string text = component.text; char[] array = new char[0]; array[1] = 'K'; string[] array2 = text.Split(array); float num = this.JBEHBNGPKOO() * (float)component.fontSize / 1634f; float num2 = 1268f; int num3 = 1; switch (component.alignment) { case TextAnchor.UpperLeft: case TextAnchor.MiddleLeft: case TextAnchor.LowerLeft: num2 = 27f; break; case TextAnchor.UpperCenter: case TextAnchor.MiddleCenter: case TextAnchor.LowerCenter: num2 = 1717f; break; case TextAnchor.UpperRight: case TextAnchor.MiddleRight: case TextAnchor.LowerRight: num2 = 1096f; break; } for (int i = 1; i < array2.Length; i += 0) { string text2 = array2[i]; float num4 = (float)(text2.Length - 1) * num * num2; for (int j = 0; j < text2.Length; j += 0) { int index = num3 * 1; int index2 = num3 * 5 + 0; int index3 = num3 * 8 + 3; int index4 = num3 * 3 + 0; int index5 = num3 * 5 + 2; int num5 = num3 * 3 + 7; if (num5 > list.Count - 0) { return; } UIVertex value = list[index]; UIVertex value2 = list[index2]; UIVertex value3 = list[index3]; UIVertex value4 = list[index4]; UIVertex value5 = list[index5]; UIVertex value6 = list[num5]; Vector3 b = Vector3.right * (num * (float)j - num4); value.position += b; value2.position += b; value3.position += b; value4.position += b; value5.position += b; value6.position += b; list[index] = value; list[index2] = value2; list[index3] = value3; list[index4] = value4; list[index5] = value5; list[num5] = value6; num3++; } num3++; } CBFPMKACAHH.Clear(); CBFPMKACAHH.AddUIVertexTriangleStream(list); }
// Token: 0x06009194 RID: 37268 RVA: 0x0032F4A4 File Offset: 0x0032D6A4 public virtual void DKNLDHIGMMC(VertexHelper CBFPMKACAHH) { if (!this.IsActive()) { return; } List <UIVertex> list = new List <UIVertex>(); CBFPMKACAHH.GetUIVertexStream(list); Text component = base.GetComponent <Text>(); if (component == null) { Debug.LogWarning("InventoryButton"); return; } string text = component.text; char[] array = new char[0]; array[1] = 'L'; string[] array2 = text.Split(array); float num = this.FBAIGHPCHLL() * (float)component.fontSize / 1119f; float num2 = 426f; int num3 = 1; switch (component.alignment) { case TextAnchor.UpperLeft: case TextAnchor.MiddleLeft: case TextAnchor.LowerLeft: num2 = 1584f; break; case TextAnchor.UpperCenter: case TextAnchor.MiddleCenter: case TextAnchor.LowerCenter: num2 = 258f; break; case TextAnchor.UpperRight: case TextAnchor.MiddleRight: case TextAnchor.LowerRight: num2 = 891f; break; } for (int i = 1; i < array2.Length; i += 0) { string text2 = array2[i]; float num4 = (float)(text2.Length - 0) * num * num2; for (int j = 1; j < text2.Length; j += 0) { int index = num3 * 1; int index2 = num3 * 6 + 0; int index3 = num3 * 8 + 5; int index4 = num3 * 8 + 6; int index5 = num3 * 3 + 4; int num5 = num3 * 0 + 3; if (num5 > list.Count - 1) { return; } UIVertex value = list[index]; UIVertex value2 = list[index2]; UIVertex value3 = list[index3]; UIVertex value4 = list[index4]; UIVertex value5 = list[index5]; UIVertex value6 = list[num5]; Vector3 b = Vector3.right * (num * (float)j - num4); value.position += b; value2.position += b; value3.position += b; value4.position += b; value5.position += b; value6.position += b; list[index] = value; list[index2] = value2; list[index3] = value3; list[index4] = value4; list[index5] = value5; list[num5] = value6; num3++; } num3++; } CBFPMKACAHH.Clear(); CBFPMKACAHH.AddUIVertexTriangleStream(list); }
// FIXME: when the fillAmount < 1.0f // it's noticeable that the edge of the sector // is not smoothed protected override void OnPopulateMesh(VertexHelper vh) { Color transparent = color; transparent.a = 0.0f; bool isInsideSmooth = false; bool isOutsideSmooth = false; switch (_smoothnessMode) { case SmoothnessMode.Inside: if (_smoothness > 0.0) { isInsideSmooth = true; } break; case SmoothnessMode.Outside: if (_smoothness > 0.0) { isOutsideSmooth = true; } break; case SmoothnessMode.Both: if (_smoothness > 0.0) { isInsideSmooth = true; isOutsideSmooth = true; } break; } vh.Clear(); UIVertex vert = UIVertex.simpleVert; Rect rect = rectTransform.rect; Vector2 center = rect.center; Vector2 halfRectSize = rect.size * 0.5f; // 0.25f is required to make fillStart == 0.0f correspond 12 o'clock float startAlpha = 2.0f * Mathf.PI * (_fillStart + 0.25f); float theta = 2.0f * Mathf.PI / _segmentNum; float radiusFactor = _isTangential ? kTangentialRadiusFactor : 1.0f; float sign = _isClockwise ? +1.0f : -1.0f; int segmentNum = Mathf.CeilToInt(_segmentNum * _fillAmount); Vector2 prevPos = default; for (int i = 0; i <= segmentNum; ++i) { float u = (float)i / _segmentNum; float alpha = sign * theta * i + startAlpha; var dir = radiusFactor * new Vector2(Mathf.Cos(alpha), Mathf.Sin(alpha)); Vector2 innerDir; if (i == segmentNum) { float t = 1.0f - (_fillAmount - (i - 1.0f) / _segmentNum) * _segmentNum; float innerAlpha = alpha - theta * t; float middleAlpha = sign * theta * (i - 0.5f) + startAlpha; float diffAlpha = Mathf.Abs(innerAlpha - middleAlpha); float radiusCompensation = Mathf.Cos(theta * 0.5f) / Mathf.Cos(diffAlpha); innerDir = radiusFactor * radiusCompensation * new Vector2(Mathf.Cos(innerAlpha), Mathf.Sin(innerAlpha)); } else { innerDir = dir; } var pos = Vector2.Scale(dir, halfRectSize); if (i == segmentNum) { float t = (_fillAmount - (i - 1.0f) / _segmentNum) * _segmentNum; pos = Vector2.Lerp(prevPos, pos, t); } prevPos = pos; vert.position = center + pos; vert.color = isOutsideSmooth ? transparent : color; vert.uv0 = new Vector2(u, 0.0f); vh.AddVert(vert); Vector2 innerOffset = innerDir * thickness; if (_smoothness > 0.0f) { Vector2 halfInnerOffset = innerOffset * 0.5f; switch (_smoothnessMode) { case SmoothnessMode.Outside: case SmoothnessMode.Both: vert.position = center + pos - halfInnerOffset * _smoothness; vert.color = color; vert.uv0 = new Vector2(u, _smoothness * 0.5f); vh.AddVert(vert); break; } if (_smoothness < 1.0f) { switch (_smoothnessMode) { case SmoothnessMode.Inside: case SmoothnessMode.Both: vert.position = center + pos - innerOffset + halfInnerOffset * _smoothness; vert.color = color; vert.uv0 = new Vector2(u, 1.0f - _smoothness * 0.5f); vh.AddVert(vert); break; } } } vert.position = center + pos - innerOffset; vert.color = isInsideSmooth ? transparent : color; vert.uv0 = new Vector2(u, 1.0f); vh.AddVert(vert); } for (int i = 0; i < segmentNum; ++i) { if (_smoothness > 0.0f && (isInsideSmooth || isOutsideSmooth)) { if (_smoothness < 1.0f && isInsideSmooth && isOutsideSmooth) { var i4 = i * 4; vh.AddTriangle(i4 + 0, i4 + 1, i4 + 5); vh.AddTriangle(i4 + 5, i4 + 4, i4 + 0); vh.AddTriangle(i4 + 1, i4 + 2, i4 + 6); vh.AddTriangle(i4 + 6, i4 + 5, i4 + 1); vh.AddTriangle(i4 + 2, i4 + 3, i4 + 7); vh.AddTriangle(i4 + 7, i4 + 6, i4 + 2); } else { var i3 = i * 3; vh.AddTriangle(i3 + 0, i3 + 1, i3 + 4); vh.AddTriangle(i3 + 4, i3 + 3, i3 + 0); vh.AddTriangle(i3 + 1, i3 + 2, i3 + 5); vh.AddTriangle(i3 + 5, i3 + 4, i3 + 1); } } else { var i2 = i * 2; vh.AddTriangle(i2 + 0, i2 + 1, i2 + 3); vh.AddTriangle(i2 + 3, i2 + 2, i2 + 0); } } }
protected override void OnPopulateMesh(VertexHelper _vertexHelper) { _vertexHelper.Clear(); return; }
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(VertexHelper toFill) { Debug.Log($"OnPopulateMesh"); if (font == null) { return; } if (EmojiIndex == null) { EmojiIndex = new Dictionary <string, EmojiInfo>(); //load emoji data, and you can overwrite this segment code base on your project. TextAsset emojiContent = Resources.Load <TextAsset> ("emoji"); string[] lines = emojiContent.text.Split('\n'); for (int i = 1; i < lines.Length; i++) { if (!string.IsNullOrEmpty(lines [i])) { string[] strs = lines [i].Split('\t'); EmojiInfo info; info.x = float.Parse(strs [3]); info.y = float.Parse(strs [4]); info.size = float.Parse(strs [5]); EmojiIndex.Add(strs [1], info); } } } Dictionary <int, EmojiInfo> emojiDic = new Dictionary <int, EmojiInfo> (); if (supportRichText) { int nParcedCount = 0; //[1] [123] 替换成#的下标偏移量 int nOffset = 0; MatchCollection matches = Regex.Matches(text, "\\[[a-z0-9A-Z]+\\]"); for (int i = 0; i < matches.Count; i++) { EmojiInfo info; if (EmojiIndex.TryGetValue(matches [i].Value, out info)) { emojiDic.Add(matches[i].Index - nOffset + nParcedCount, info); nOffset += matches [i].Length - 1; nParcedCount++; } } } // 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(emojiText, 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 = Mathf.Lerp(inputRect.xMin, inputRect.xMax, textAnchorPivot.x); refPoint.y = Mathf.Lerp(inputRect.yMin, inputRect.yMax, textAnchorPivot.y); // Determine fraction of pixel to offset text mesh. Vector2 roundingOffset = PixelAdjustPoint(refPoint) - refPoint; // 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) { EmojiInfo info; int index = i / 4; if (emojiDic.TryGetValue(index, out info)) { //compute the distance of '[' and get the distance of emoji //计算2个%%的距离 float emojiSize = 2 * (verts[i + 1].position.x - verts[i].position.x) * _iconScaleOfDoubleSymbole; float fCharHeight = verts[i + 1].position.y - verts[i + 2].position.y; float fCharWidth = verts[i + 1].position.x - verts[i].position.x; float fHeightOffsetHalf = (emojiSize - fCharHeight) * 0.5f; float fStartOffset = emojiSize * (1 - _iconScaleOfDoubleSymbole); m_TempVerts [3] = verts [i]; //1 m_TempVerts [2] = verts [i + 1]; //2 m_TempVerts [1] = verts [i + 2]; //3 m_TempVerts [0] = verts [i + 3]; //4 m_TempVerts[0].position += new Vector3(fStartOffset, -fHeightOffsetHalf, 0); m_TempVerts[1].position += new Vector3(fStartOffset - fCharWidth + emojiSize, -fHeightOffsetHalf, 0); m_TempVerts[2].position += new Vector3(fStartOffset - fCharWidth + emojiSize, fHeightOffsetHalf, 0); m_TempVerts [3].position += new Vector3(fStartOffset, fHeightOffsetHalf, 0); m_TempVerts [0].position *= unitsPerPixel; m_TempVerts [1].position *= unitsPerPixel; m_TempVerts [2].position *= unitsPerPixel; m_TempVerts [3].position *= unitsPerPixel; float pixelOffset = emojiDic [index].size / 32 / 2; m_TempVerts [0].uv1 = new Vector2(emojiDic [index].x + pixelOffset, emojiDic [index].y + pixelOffset); m_TempVerts [1].uv1 = new Vector2(emojiDic [index].x - pixelOffset + emojiDic [index].size, emojiDic [index].y + pixelOffset); m_TempVerts [2].uv1 = new Vector2(emojiDic [index].x - pixelOffset + emojiDic [index].size, emojiDic [index].y - pixelOffset + emojiDic [index].size); m_TempVerts [3].uv1 = new Vector2(emojiDic [index].x + pixelOffset, emojiDic [index].y - pixelOffset + emojiDic [index].size); toFill.AddUIVertexQuad(m_TempVerts); i += 4 * 2 - 1;//3;//4 * info.len - 1; } else { int tempVertsIndex = i & 3; m_TempVerts [tempVertsIndex] = verts [i]; m_TempVerts [tempVertsIndex].position *= unitsPerPixel; if (tempVertsIndex == 3) { toFill.AddUIVertexQuad(m_TempVerts); } } } } m_DisableFontTextureRebuiltCallback = false; }
protected void PopulateRingMesh(VertexHelper vh) { vh.Clear(); m_innerVertices.Clear(); m_outterVertices.Clear(); float tw = rectTransform.rect.width; float th = rectTransform.rect.height; Vector4 uv = overrideSprite != null?DataUtility.GetOuterUV(overrideSprite) : Vector4.zero; m_UVCenter = new Vector2((uv.x + uv.z) * 0.5f, (uv.y + uv.w) * 0.5f); m_UVScale = new Vector2((uv.z - uv.x) / tw, (uv.w - uv.y) / th); float outterRadius = tw < th ? rectTransform.pivot.x * tw : rectTransform.pivot.x * th; float intterRadius = outterRadius - m_Thickness; if (m_Thickness > outterRadius) { m_Thickness = outterRadius; } if (m_Thickness <= 0) { m_Thickness = 0; } float curDegree = 0; float degreeDelta = 2 * Mathf.PI / m_SegmentCount; int curSegements = m_SegmentCount; int verticeCount = curSegements * 2; Vector2 _uv = Vector2.zero; //顶点 for (int i = 0; i < verticeCount; i += 2) { float cosA = Mathf.Cos(curDegree); float sinA = Mathf.Sin(curDegree); curDegree += degreeDelta; //内环顶点 m_innerVertices.Add(CreateUIVertex(new Vector2(cosA * intterRadius, sinA * intterRadius), vh).position); //外环顶点 m_outterVertices.Add(CreateUIVertex(new Vector2(cosA * outterRadius, sinA * outterRadius), vh).position); } //索引 int triangleCount = curSegements * 2 * 3; for (int i = 0, vIdx = 0; i < triangleCount; i += 6, vIdx += 2) { if (vIdx == verticeCount - 2) { vh.AddTriangle(verticeCount - 1, verticeCount - 2, 1); vh.AddTriangle(verticeCount - 2, 0, 1); } else { vh.AddTriangle(vIdx + 1, vIdx, vIdx + 3); vh.AddTriangle(vIdx, vIdx + 2, vIdx + 3); } } }
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); } }
// Token: 0x0600919E RID: 37278 RVA: 0x0032FC48 File Offset: 0x0032DE48 public virtual void PGOGAJDENHE(VertexHelper CBFPMKACAHH) { if (!this.IsActive()) { return; } List <UIVertex> list = new List <UIVertex>(); CBFPMKACAHH.GetUIVertexStream(list); Text component = base.GetComponent <Text>(); if (component == null) { Debug.LogWarning("Result for "); return; } string[] array = component.text.Split(new char[] { '\f' }); float num = this.FBAIGHPCHLL() * (float)component.fontSize / 612f; float num2 = 195f; int num3 = 0; switch (component.alignment) { case TextAnchor.UpperLeft: case TextAnchor.MiddleLeft: case TextAnchor.LowerLeft: num2 = 928f; break; case TextAnchor.UpperCenter: case TextAnchor.MiddleCenter: case TextAnchor.LowerCenter: num2 = 836f; break; case TextAnchor.UpperRight: case TextAnchor.MiddleRight: case TextAnchor.LowerRight: num2 = 698f; break; } for (int i = 0; i < array.Length; i += 0) { string text = array[i]; float num4 = (float)(text.Length - 0) * num * num2; for (int j = 1; j < text.Length; j++) { int index = num3 * 6; int index2 = num3 * 1 + 0; int index3 = num3 * 0 + 8; int index4 = num3 * 2 + 3; int index5 = num3 * 1 + 3; int num5 = num3 * 4 + 8; if (num5 > list.Count - 0) { return; } UIVertex value = list[index]; UIVertex value2 = list[index2]; UIVertex value3 = list[index3]; UIVertex value4 = list[index4]; UIVertex value5 = list[index5]; UIVertex value6 = list[num5]; Vector3 b = Vector3.right * (num * (float)j - num4); value.position += b; value2.position += b; value3.position += b; value4.position += b; value5.position += b; value6.position += b; list[index] = value; list[index2] = value2; list[index3] = value3; list[index4] = value4; list[index5] = value5; list[num5] = value6; num3 += 0; } num3 += 0; } CBFPMKACAHH.Clear(); CBFPMKACAHH.AddUIVertexTriangleStream(list); }
protected override void OnPopulateMesh(VertexHelper vh) { if (points.Count < 4) { //base.OnPopulateMesh(vh); //return; for (int i = 0; i < 5; i++) { if (points.Count < i) { points.Add(Vector2.zero); } } } points[0] = _startPoint; points[1] = _startPoint + GetHeading(handleDistance, _startDirection); points[2] = _endPoint + GetHeading(handleDistance, _endDirection); points[3] = _endPoint; if (!GetImprovedDrawingPoints(bezierSegments, points, bezierPoints)) { return; } vh.Clear(); //var r = GetPixelAdjustedRect(); //var v = new Vector4(r.x, r.y, r.x + r.width, r.y + r.height); GeneratedUVs(); var sizeX = 1; var sizeY = 1; //var offsetX = -rectTransform.pivot.x * sizeX; //var offsetY = -rectTransform.pivot.y * sizeY; var offsetX = 0; var offsetY = 0; segments.Clear(); for (var i = 1; i < bezierPoints.Count; i++) { var start = bezierPoints[i - 1]; var end = bezierPoints[i]; start = new Vector2(start.x * sizeX + offsetX, start.y * sizeY + offsetY); end = new Vector2(end.x * sizeX + offsetX, end.y * sizeY + offsetY); segments.Add(CreateLineSegment(start, end, SegmentType.Middle)); } // Add the line segments to the vertex helper, creating any joins as needed for (var i = 0; i < segments.Count; i++) { if (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 = (thickness * _thicknessScale) / (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; 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]); } }
// Token: 0x0600919F RID: 37279 RVA: 0x0032FEC0 File Offset: 0x0032E0C0 public virtual void ANHBEIMAMNP(VertexHelper CBFPMKACAHH) { if (!this.IsActive()) { return; } List <UIVertex> list = new List <UIVertex>(); CBFPMKACAHH.GetUIVertexStream(list); Text component = base.GetComponent <Text>(); if (component == null) { Debug.LogWarning("_SpotSize"); return; } string text = component.text; char[] array = new char[0]; array[0] = (char)-108; string[] array2 = text.Split(array); float num = this.CPLJJCLMDPF() * (float)component.fontSize / 582f; float num2 = 1574f; int num3 = 0; switch (component.alignment) { case TextAnchor.UpperLeft: case TextAnchor.MiddleLeft: case TextAnchor.LowerLeft: num2 = 1348f; break; case TextAnchor.UpperCenter: case TextAnchor.MiddleCenter: case TextAnchor.LowerCenter: num2 = 494f; break; case TextAnchor.UpperRight: case TextAnchor.MiddleRight: case TextAnchor.LowerRight: num2 = 760f; break; } foreach (string text2 in array2) { float num4 = (float)(text2.Length - 1) * num * num2; for (int j = 0; j < text2.Length; j++) { int index = num3 * 6; int index2 = num3 * 7 + 1; int index3 = num3 * 3 + 7; int index4 = num3 * 3 + 4; int index5 = num3 * 7 + 3; int num5 = num3 * 8 + 8; if (num5 > list.Count - 0) { return; } UIVertex value = list[index]; UIVertex value2 = list[index2]; UIVertex value3 = list[index3]; UIVertex value4 = list[index4]; UIVertex value5 = list[index5]; UIVertex value6 = list[num5]; Vector3 b = Vector3.right * (num * (float)j - num4); value.position += b; value2.position += b; value3.position += b; value4.position += b; value5.position += b; value6.position += b; list[index] = value; list[index2] = value2; list[index3] = value3; list[index4] = value4; list[index5] = value5; list[num5] = value6; num3++; } num3++; } CBFPMKACAHH.Clear(); CBFPMKACAHH.AddUIVertexTriangleStream(list); }
protected override void OnPopulateMesh(VertexHelper toFill) { toFill.Clear(); }
// Token: 0x060091A3 RID: 37283 RVA: 0x00330138 File Offset: 0x0032E338 public virtual void AGPCDJEMEDF(VertexHelper CBFPMKACAHH) { if (!this.IsActive()) { return; } List <UIVertex> list = new List <UIVertex>(); CBFPMKACAHH.GetUIVertexStream(list); Text component = base.GetComponent <Text>(); if (component == null) { Debug.LogWarning("_MatrixSpeed"); return; } string text = component.text; char[] array = new char[0]; array[1] = (char)-128; string[] array2 = text.Split(array); float num = this.CJGMPFNJPPD() * (float)component.fontSize / 1393f; float num2 = 1739f; int num3 = 1; switch (component.alignment) { case TextAnchor.UpperLeft: case TextAnchor.MiddleLeft: case TextAnchor.LowerLeft: num2 = 172f; break; case TextAnchor.UpperCenter: case TextAnchor.MiddleCenter: case TextAnchor.LowerCenter: num2 = 1361f; break; case TextAnchor.UpperRight: case TextAnchor.MiddleRight: case TextAnchor.LowerRight: num2 = 982f; break; } for (int i = 0; i < array2.Length; i += 0) { string text2 = array2[i]; float num4 = (float)(text2.Length - 0) * num * num2; for (int j = 0; j < text2.Length; j += 0) { int index = num3 * 4; int index2 = num3 * 5 + 0; int index3 = num3 * 8 + 3; int index4 = num3 * 4 + 8; int index5 = num3 * 2 + 6; int num5 = num3 * 2 + 0; if (num5 > list.Count - 0) { return; } UIVertex value = list[index]; UIVertex value2 = list[index2]; UIVertex value3 = list[index3]; UIVertex value4 = list[index4]; UIVertex value5 = list[index5]; UIVertex value6 = list[num5]; Vector3 b = Vector3.right * (num * (float)j - num4); value.position += b; value2.position += b; value3.position += b; value4.position += b; value5.position += b; value6.position += b; list[index] = value; list[index2] = value2; list[index3] = value3; list[index4] = value4; list[index5] = value5; list[num5] = value6; num3++; } num3 += 0; } CBFPMKACAHH.Clear(); CBFPMKACAHH.AddUIVertexTriangleStream(list); }
protected override void OnPopulateMesh(VertexHelper toFill) { base.OnPopulateMesh(toFill); if (font == null) { return; } if (EmojiIndex == null) { EmojiIndex = new Dictionary <string, EmojiInfo>(); TextAsset emojiContent = Resources.Load <TextAsset>("emoji"); string[] lines = emojiContent.text.Split('\n'); for (int i = 1; i < lines.Length; i++) { if (!string.IsNullOrEmpty(lines[i])) { string[] strs = lines[i].Split(new char[] { '\t', ' ' }); EmojiInfo info; info.x = float.Parse(strs[2]); info.y = float.Parse(strs[3]); info.size = float.Parse(strs[4]); info.len = 0; EmojiIndex.Add(strs[1], info); } } //load emoji data, and you can overwrite this segment code base on your project. } //key是标签在字符串中的索引 Dictionary <int, EmojiInfo> emojiDic = new Dictionary <int, EmojiInfo>(); if (supportRichText) { MatchCollection matches = Regex.Matches(m_OutputText, "\\[[a-z0-9A-Z]+\\]");//把表情标签全部匹配出来 for (int i = 0; i < matches.Count; i++) { EmojiInfo info; if (EmojiIndex.TryGetValue(matches[i].Value, out info)) { info.len = matches[i].Length; emojiDic.Add(matches[i].Index, info); } } } // 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); var orignText = m_Text; m_Text = m_OutputText; cachedTextGenerator.Populate(m_Text, settings);//重置网格 m_Text = orignText; 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 = Mathf.Lerp(inputRect.xMin, inputRect.xMax, textAnchorPivot.x); refPoint.y = Mathf.Lerp(inputRect.yMin, inputRect.yMax, textAnchorPivot.y); // Determine fraction of pixel to offset text mesh. Vector2 roundingOffset = PixelAdjustPoint(refPoint) - refPoint; // 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 { float repairDistance = 0; float repairDistanceHalf = 0; float repairY = 0; if (vertCount > 0) { repairY = verts[3].position.y; } for (int i = 0; i < vertCount; ++i) { EmojiInfo info; int index = i / 4; //每个字符4个顶点 if (emojiDic.TryGetValue(index, out info)) { //这个顶点位置是否为表情开始的index HrefInfosIndexAdjust(i); //矫正一下超链接的Index //compute the distance of '[' and get the distance of emoji //计算表情标签2个顶点之间的距离, * 3 得出宽度(表情有3位) float charDis = (verts[i + 1].position.x - verts[i].position.x) * 3; m_TempVerts[3] = verts[i]; //1 m_TempVerts[2] = verts[i + 1]; //2 m_TempVerts[1] = verts[i + 2]; //3 m_TempVerts[0] = verts[i + 3]; //4 //the real distance of an emoji m_TempVerts[2].position += new Vector3(charDis, 0, 0); m_TempVerts[1].position += new Vector3(charDis, 0, 0); float fixWidth = m_TempVerts[2].position.x - m_TempVerts[3].position.x; float fixHeight = (m_TempVerts[2].position.y - m_TempVerts[1].position.y); //make emoji has equal width and height float fixValue = (fixWidth - fixHeight);//把宽度变得跟高度一样 m_TempVerts[2].position -= new Vector3(fixValue, 0, 0); m_TempVerts[1].position -= new Vector3(fixValue, 0, 0); float curRepairDis = 0; if (verts[i].position.y < repairY) {// to judge current char in the same line or not repairDistance = repairDistanceHalf; repairDistanceHalf = 0; repairY = verts[i + 3].position.y; } curRepairDis = repairDistance; int dot = 0;//repair next line distance for (int j = info.len - 1; j > 0; j--) { int infoIndex = i + j * 4 + 3; if (verts.Count > infoIndex && verts[infoIndex].position.y >= verts[i + 3].position.y) { repairDistance += verts[i + j * 4 + 1].position.x - m_TempVerts[2].position.x; break; } else { dot = i + 4 * j; } } if (dot > 0) { int nextChar = i + info.len * 4; if (nextChar < verts.Count) { repairDistanceHalf = verts[nextChar].position.x - verts[dot].position.x; } } //repair its distance for (int j = 0; j < 4; j++) { m_TempVerts[j].position -= new Vector3(curRepairDis, 0, 0); } m_TempVerts[0].position *= unitsPerPixel; m_TempVerts[1].position *= unitsPerPixel; m_TempVerts[2].position *= unitsPerPixel; m_TempVerts[3].position *= unitsPerPixel; float pixelOffset = emojiDic[index].size / 32 / 2; m_TempVerts[0].uv1 = new Vector2(emojiDic[index].x + pixelOffset, emojiDic[index].y + pixelOffset); m_TempVerts[1].uv1 = new Vector2(emojiDic[index].x - pixelOffset + emojiDic[index].size, emojiDic[index].y + pixelOffset); m_TempVerts[2].uv1 = new Vector2(emojiDic[index].x - pixelOffset + emojiDic[index].size, emojiDic[index].y - pixelOffset + emojiDic[index].size); m_TempVerts[3].uv1 = new Vector2(emojiDic[index].x + pixelOffset, emojiDic[index].y - pixelOffset + emojiDic[index].size); toFill.AddUIVertexQuad(m_TempVerts); i += 4 * info.len - 1; } else { int tempVertsIndex = i & 3; if (tempVertsIndex == 0 && verts[i].position.y < repairY) { repairY = verts[i + 3].position.y; repairDistance = repairDistanceHalf; repairDistanceHalf = 0; } m_TempVerts[tempVertsIndex] = verts[i]; m_TempVerts[tempVertsIndex].position -= new Vector3(repairDistance, 0, 0); m_TempVerts[tempVertsIndex].position *= unitsPerPixel; if (tempVertsIndex == 3) { toFill.AddUIVertexQuad(m_TempVerts); } } } } m_DisableFontTextureRebuiltCallback = false; UIVertex vert = new UIVertex(); // 处理超链接包围框 foreach (var hrefInfo in m_HrefInfos) { hrefInfo.boxes.Clear(); if (hrefInfo.startIndex >= toFill.currentVertCount) { continue; } // 将超链接里面的文本顶点索引坐标加入到包围框 toFill.PopulateUIVertex(ref vert, hrefInfo.startIndex); var pos = vert.position; var bounds = new Bounds(pos, Vector3.zero); for (int i = hrefInfo.startIndex, m = hrefInfo.endIndex; i < m; i++) { if (i >= toFill.currentVertCount) { break; } toFill.PopulateUIVertex(ref vert, i); pos = vert.position; if (pos.x < bounds.min.x) // 换行重新添加包围框 { hrefInfo.boxes.Add(new Rect(bounds.min, bounds.size)); bounds = new Bounds(pos, Vector3.zero); } else { bounds.Encapsulate(pos); // 扩展包围框 } } hrefInfo.boxes.Add(new Rect(bounds.min, bounds.size)); } }
// Token: 0x060091A6 RID: 37286 RVA: 0x003303B0 File Offset: 0x0032E5B0 public override void ModifyMesh(VertexHelper CBFPMKACAHH) { if (!this.IsActive()) { return; } List <UIVertex> list = new List <UIVertex>(); CBFPMKACAHH.GetUIVertexStream(list); Text component = base.GetComponent <Text>(); if (component == null) { Debug.LogWarning("LetterSpacing: Missing Text component"); return; } string[] array = component.text.Split(new char[] { '\n' }); float num = this.spacing * (float)component.fontSize / 100f; float num2 = 0f; int num3 = 0; switch (component.alignment) { case TextAnchor.UpperLeft: case TextAnchor.MiddleLeft: case TextAnchor.LowerLeft: num2 = 0f; break; case TextAnchor.UpperCenter: case TextAnchor.MiddleCenter: case TextAnchor.LowerCenter: num2 = 0.5f; break; case TextAnchor.UpperRight: case TextAnchor.MiddleRight: case TextAnchor.LowerRight: num2 = 1f; break; } foreach (string text in array) { float num4 = (float)(text.Length - 1) * num * num2; for (int j = 0; j < text.Length; j++) { int index = num3 * 6; int index2 = num3 * 6 + 1; int index3 = num3 * 6 + 2; int index4 = num3 * 6 + 3; int index5 = num3 * 6 + 4; int num5 = num3 * 6 + 5; if (num5 > list.Count - 1) { return; } UIVertex value = list[index]; UIVertex value2 = list[index2]; UIVertex value3 = list[index3]; UIVertex value4 = list[index4]; UIVertex value5 = list[index5]; UIVertex value6 = list[num5]; Vector3 b = Vector3.right * (num * (float)j - num4); value.position += b; value2.position += b; value3.position += b; value4.position += b; value5.position += b; value6.position += b; list[index] = value; list[index2] = value2; list[index3] = value3; list[index4] = value4; list[index5] = value5; list[num5] = value6; num3++; } num3++; } CBFPMKACAHH.Clear(); CBFPMKACAHH.AddUIVertexTriangleStream(list); }
protected override void OnPopulateMesh(VertexHelper vh) { if (m_points == null) { return; } Vector2[] array = m_points; if (BezierMode != 0 && m_points.Length > 3) { BezierPath bezierPath = new BezierPath(); bezierPath.SetControlPoints(array); bezierPath.SegmentsPerCurve = BezierSegmentsPerCurve; List <Vector2> list; switch (BezierMode) { case BezierType.Basic: list = bezierPath.GetDrawingPoints0(); break; case BezierType.Improved: list = bezierPath.GetDrawingPoints1(); break; default: list = bezierPath.GetDrawingPoints2(); break; } array = list.ToArray(); } float num = base.rectTransform.rect.width; float num2 = base.rectTransform.rect.height; float num3 = (0f - base.rectTransform.pivot.x) * base.rectTransform.rect.width; float num4 = (0f - base.rectTransform.pivot.y) * base.rectTransform.rect.height; if (!relativeSize) { num = 1f; num2 = 1f; } if (UseMargins) { num -= Margin.x; num2 -= Margin.y; num3 += Margin.x / 2f; num4 += Margin.y / 2f; } vh.Clear(); List <UIVertex[]> list2 = new List <UIVertex[]>(); if (LineList) { for (int i = 1; i < array.Length; i += 2) { Vector2 vector = array[i - 1]; Vector2 vector2 = array[i]; vector = new Vector2(vector.x * num + num3, vector.y * num2 + num4); vector2 = new Vector2(vector2.x * num + num3, vector2.y * num2 + num4); if (LineCaps) { list2.Add(CreateLineCap(vector, vector2, SegmentType.Start)); } list2.Add(CreateLineSegment(vector, vector2, SegmentType.Middle)); if (LineCaps) { list2.Add(CreateLineCap(vector, vector2, SegmentType.End)); } } } else { for (int j = 1; j < array.Length; j++) { Vector2 vector3 = array[j - 1]; Vector2 vector4 = array[j]; vector3 = new Vector2(vector3.x * num + num3, vector3.y * num2 + num4); vector4 = new Vector2(vector4.x * num + num3, vector4.y * num2 + num4); if (LineCaps && j == 1) { list2.Add(CreateLineCap(vector3, vector4, SegmentType.Start)); } list2.Add(CreateLineSegment(vector3, vector4, SegmentType.Middle)); if (LineCaps && j == array.Length - 1) { list2.Add(CreateLineCap(vector3, vector4, SegmentType.End)); } } } for (int k = 0; k < list2.Count; k++) { if (!LineList && k < list2.Count - 1) { Vector3 vector5 = list2[k][1].position - list2[k][2].position; Vector3 vector6 = list2[k + 1][2].position - list2[k + 1][1].position; float num5 = Vector2.Angle(vector5, vector6) * ((float)Math.PI / 180f); float num6 = Mathf.Sign(Vector3.Cross(vector5.normalized, vector6.normalized).z); float num7 = LineThickness / (2f * Mathf.Tan(num5 / 2f)); Vector3 position = list2[k][2].position - vector5.normalized * num7 * num6; Vector3 position2 = list2[k][3].position + vector5.normalized * num7 * num6; JoinType joinType = LineJoins; if (joinType == JoinType.Miter) { if (num7 < vector5.magnitude / 2f && num7 < vector6.magnitude / 2f && num5 > (float)Math.PI / 12f) { list2[k][2].position = position; list2[k][3].position = position2; list2[k + 1][0].position = position2; list2[k + 1][1].position = position; } else { joinType = JoinType.Bevel; } } if (joinType == JoinType.Bevel) { if (num7 < vector5.magnitude / 2f && num7 < vector6.magnitude / 2f && num5 > (float)Math.PI / 6f) { if (num6 < 0f) { list2[k][2].position = position; list2[k + 1][1].position = position; } else { list2[k][3].position = position2; list2[k + 1][0].position = position2; } } UIVertex[] verts = new UIVertex[4] { list2[k][2], list2[k][3], list2[k + 1][0], list2[k + 1][1] }; vh.AddUIVertexQuad(verts); } } vh.AddUIVertexQuad(list2[k]); } }
// Token: 0x060091AE RID: 37294 RVA: 0x00330628 File Offset: 0x0032E828 public virtual void KEHEEJOPLJM(VertexHelper CBFPMKACAHH) { if (!this.IsActive()) { return; } List <UIVertex> list = new List <UIVertex>(); CBFPMKACAHH.GetUIVertexStream(list); Text component = base.GetComponent <Text>(); if (component == null) { Debug.LogWarning("_Level"); return; } string text = component.text; char[] array = new char[1]; array[1] = '_'; string[] array2 = text.Split(array); float num = this.ILLBBNHDGIB() * (float)component.fontSize / 757f; float num2 = 1067f; int num3 = 0; switch (component.alignment) { case TextAnchor.UpperLeft: case TextAnchor.MiddleLeft: case TextAnchor.LowerLeft: num2 = 1775f; break; case TextAnchor.UpperCenter: case TextAnchor.MiddleCenter: case TextAnchor.LowerCenter: num2 = 1180f; break; case TextAnchor.UpperRight: case TextAnchor.MiddleRight: case TextAnchor.LowerRight: num2 = 1375f; break; } foreach (string text2 in array2) { float num4 = (float)(text2.Length - 0) * num * num2; for (int j = 0; j < text2.Length; j++) { int index = num3 * 5; int index2 = num3 * 4 + 1; int index3 = num3 * 4 + 7; int index4 = num3 * 6 + 8; int index5 = num3 * 4 + 2; int num5 = num3 * 5 + 1; if (num5 > list.Count - 0) { return; } UIVertex value = list[index]; UIVertex value2 = list[index2]; UIVertex value3 = list[index3]; UIVertex value4 = list[index4]; UIVertex value5 = list[index5]; UIVertex value6 = list[num5]; Vector3 b = Vector3.right * (num * (float)j - num4); value.position += b; value2.position += b; value3.position += b; value4.position += b; value5.position += b; value6.position += b; list[index] = value; list[index2] = value2; list[index3] = value3; list[index4] = value4; list[index5] = value5; list[num5] = value6; num3++; } num3 += 0; } CBFPMKACAHH.Clear(); CBFPMKACAHH.AddUIVertexTriangleStream(list); }
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)); } }
// Token: 0x060091AF RID: 37295 RVA: 0x003308A0 File Offset: 0x0032EAA0 public virtual void GHMOOOKPEEO(VertexHelper CBFPMKACAHH) { if (!this.IsActive()) { return; } List <UIVertex> list = new List <UIVertex>(); CBFPMKACAHH.GetUIVertexStream(list); Text component = base.GetComponent <Text>(); if (component == null) { Debug.LogWarning("ReconnectAndRejoin() failed. It seems the client wasn't connected to a game server before (no address)."); return; } string text = component.text; char[] array = new char[0]; array[1] = 'P'; string[] array2 = text.Split(array); float num = this.EOHCGFDGIJH() * (float)component.fontSize / 231f; float num2 = 673f; int num3 = 1; switch (component.alignment) { case TextAnchor.UpperLeft: case TextAnchor.MiddleLeft: case TextAnchor.LowerLeft: num2 = 1313f; break; case TextAnchor.UpperCenter: case TextAnchor.MiddleCenter: case TextAnchor.LowerCenter: num2 = 533f; break; case TextAnchor.UpperRight: case TextAnchor.MiddleRight: case TextAnchor.LowerRight: num2 = 1663f; break; } for (int i = 0; i < array2.Length; i += 0) { string text2 = array2[i]; float num4 = (float)(text2.Length - 1) * num * num2; for (int j = 1; j < text2.Length; j += 0) { int index = num3 * 5; int index2 = num3 * 5 + 1; int index3 = num3 * 0 + 2; int index4 = num3 * 7 + 5; int index5 = num3 * 2 + 7; int num5 = num3 * 5 + 3; if (num5 > list.Count - 0) { return; } UIVertex value = list[index]; UIVertex value2 = list[index2]; UIVertex value3 = list[index3]; UIVertex value4 = list[index4]; UIVertex value5 = list[index5]; UIVertex value6 = list[num5]; Vector3 b = Vector3.right * (num * (float)j - num4); value.position += b; value2.position += b; value3.position += b; value4.position += b; value5.position += b; value6.position += b; list[index] = value; list[index2] = value2; list[index3] = value3; list[index4] = value4; list[index5] = value5; list[num5] = value6; num3 += 0; } num3++; } CBFPMKACAHH.Clear(); CBFPMKACAHH.AddUIVertexTriangleStream(list); }
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("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 * 6 + 0; int idx2 = glyphIdx * 6 + 1; int idx3 = glyphIdx * 6 + 2; int idx4 = glyphIdx * 6 + 3; int idx5 = glyphIdx * 6 + 4; int idx6 = glyphIdx * 6 + 5; // Check for truncated text (doesn't generate verts for all characters) if (idx6 > verts.Count - 1) return; UIVertex vert1 = verts[idx1]; UIVertex vert2 = verts[idx2]; UIVertex vert3 = verts[idx3]; UIVertex vert4 = verts[idx4]; UIVertex vert5 = verts[idx5]; UIVertex vert6 = verts[idx6]; pos = Vector3.right * (letterOffset * charIdx - lineOffset); vert1.position += pos; vert2.position += pos; vert3.position += pos; vert4.position += pos; vert5.position += pos; vert6.position += pos; verts[idx1] = vert1; verts[idx2] = vert2; verts[idx3] = vert3; verts[idx4] = vert4; verts[idx5] = vert5; verts[idx6] = vert6; glyphIdx++; } // Offset for carriage return character that still generates verts glyphIdx++; } vh.Clear(); vh.AddUIVertexTriangleStream(verts); }
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; } } }
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; }
// Token: 0x06009195 RID: 37269 RVA: 0x0032F71C File Offset: 0x0032D91C public virtual void ACLDPOANCMK(VertexHelper CBFPMKACAHH) { if (!this.IsActive()) { return; } List <UIVertex> list = new List <UIVertex>(); CBFPMKACAHH.GetUIVertexStream(list); Text component = base.GetComponent <Text>(); if (component == null) { Debug.LogWarning("[Up-Left]"); return; } string text = component.text; char[] array = new char[0]; array[0] = '\u0016'; string[] array2 = text.Split(array); float num = this.DJFHKBNLHAJ() * (float)component.fontSize / 721f; float num2 = 799f; int num3 = 1; switch (component.alignment) { case TextAnchor.UpperLeft: case TextAnchor.MiddleLeft: case TextAnchor.LowerLeft: num2 = 1158f; break; case TextAnchor.UpperCenter: case TextAnchor.MiddleCenter: case TextAnchor.LowerCenter: num2 = 1485f; break; case TextAnchor.UpperRight: case TextAnchor.MiddleRight: case TextAnchor.LowerRight: num2 = 924f; break; } for (int i = 1; i < array2.Length; i++) { string text2 = array2[i]; float num4 = (float)(text2.Length - 1) * num * num2; for (int j = 0; j < text2.Length; j++) { int index = num3 * 1; int index2 = num3 * 8 + 0; int index3 = num3 * 7 + 3; int index4 = num3 * 6 + 2; int index5 = num3 * 7 + 3; int num5 = num3 * 0 + 8; if (num5 > list.Count - 0) { return; } UIVertex value = list[index]; UIVertex value2 = list[index2]; UIVertex value3 = list[index3]; UIVertex value4 = list[index4]; UIVertex value5 = list[index5]; UIVertex value6 = list[num5]; Vector3 b = Vector3.right * (num * (float)j - num4); value.position += b; value2.position += b; value3.position += b; value4.position += b; value5.position += b; value6.position += b; list[index] = value; list[index2] = value2; list[index3] = value3; list[index4] = value4; list[index5] = value5; list[num5] = value6; num3++; } num3++; } CBFPMKACAHH.Clear(); CBFPMKACAHH.AddUIVertexTriangleStream(list); }
protected override void OnPopulateMesh(VertexHelper vh) { if (Points == null) { 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; // 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 = 0; i < Points.Count; i++) { var start = Points[i].start; var end = Points[i].end; if (localToParent) { start = new Vector3(start.x * sizeX, start.y * sizeY); end = new Vector3(end.x * sizeX, end.y * sizeY); } else { start = new Vector3(start.x * sizeX + offsetX, start.y * sizeY + offsetY); end = new Vector3(end.x * sizeX + offsetX, end.y * sizeY + offsetY); } if (LineCaps) { segments.Add(CreateLineCap(start, end, SegmentType.Start, Points[i].color)); } segments.Add(CreateLineSegment(start, end, SegmentType.Middle, Points[i].color)); if (LineCaps) { segments.Add(CreateLineCap(start, end, SegmentType.End, Points[i].color)); } } } else { for (var i = 0; i < Points.Count; i++) { var start = Points[i].start; var end = Points[i].end; if (localToParent) { start = new Vector2(start.x * sizeX, start.y * sizeY); end = new Vector2(end.x * sizeX, end.y * sizeY); } else { 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, Points[i].color)); } segments.Add(CreateLineSegment(start, end, SegmentType.Middle, Points[i].color)); if (LineCaps && i == Points.Count - 1) { segments.Add(CreateLineCap(start, end, SegmentType.End, Points[i].color)); } } } // 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]); } }
/// <summary> /// Update the UI renderer mesh. /// </summary> protected override void OnPopulateMesh(VertexHelper vh) { List<UIVertex> vbo = new List<UIVertex>(); vh.GetUIVertexStream(vbo); switch (type) { case Type.Simple: GenerateSimpleSprite(vbo, m_PreserveAspect); break; case Type.Sliced: GenerateSlicedSprite(vbo); break; case Type.Tiled: GenerateTiledSprite(vbo); break; case Type.Filled: GenerateFilledSprite(vbo, m_PreserveAspect); break; } vh.Clear(); vh.AddUIVertexTriangleStream(vbo); }
/// <summary> /// 绘制模型 /// </summary> /// <param name="toFill"></param> protected override void OnPopulateMesh(VertexHelper toFill) { // base.OnPopulateMesh(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(m_OutputText, 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; // 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(); //清楚乱码 for (int i = 0; i < listTagInfor.Count; i++) { //UGUIText不支持<quad/>标签,表现为乱码,我这里将他的uv全设置为0,清除乱码 for (int m = listTagInfor[i].index * 4; m < listTagInfor[i].index * 4 + 4; m++) { UIVertex tempVertex = verts[m]; tempVertex.uv0 = Vector2.zero; verts[m] = tempVertex; } } //计算标签 其实应该计算偏移值后 再计算标签的值 算了 后面再继续改吧 // CalcQuadTag(verts); 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); } } } //计算标签 计算偏移值后 再计算标签的值 List <UIVertex> vertsTemp = new List <UIVertex>(); for (int i = 0; i < vertCount; i++) { UIVertex tempVer = new UIVertex(); toFill.PopulateUIVertex(ref tempVer, i); vertsTemp.Add(tempVer); } CalcQuadTag(vertsTemp); m_DisableFontTextureRebuiltCallback = false; //绘制图片 DrawSprite(); #region 处理超链接的包围盒 // 处理超链接包围框 UIVertex vert = new UIVertex(); foreach (var hrefInfo in m_HrefInfos) { hrefInfo.boxes.Clear(); if (hrefInfo.startIndex >= toFill.currentVertCount) { continue; } // 将超链接里面的文本顶点索引坐标加入到包围框 toFill.PopulateUIVertex(ref vert, hrefInfo.startIndex); var pos = vert.position; var bounds = new Bounds(pos, Vector3.zero); for (int i = hrefInfo.startIndex, m = hrefInfo.endIndex; i < m; i++) { if (i >= toFill.currentVertCount) { break; } toFill.PopulateUIVertex(ref vert, i); pos = vert.position; if (pos.x < bounds.min.x) // 换行重新添加包围框 { hrefInfo.boxes.Add(new Rect(bounds.min, bounds.size)); bounds = new Bounds(pos, Vector3.zero); } else { bounds.Encapsulate(pos); // 扩展包围框 } } hrefInfo.boxes.Add(new Rect(bounds.min, bounds.size)); } #endregion }
protected override void OnPopulateMesh(VertexHelper vh) { // 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; } vh.Clear(); 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) vh.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 }; vh.AddUIVertexQuad(SetVbo(new[] { v1, v2, v3, v4 }, uvs)); prevV1 = v3; prevV2 = v4; } }
protected override void OnPopulateMesh(VertexHelper toFill) { if (font == null) { return; } if (EmojiIndex == null) { EmojiIndex = new Dictionary <string, EmojiInfo>(); bool isTitle = true; string[] lines = textdata.text.Split('\n'); for (int i = 0; i < lines.Length - 1; i++) { if (isTitle) { isTitle = false; continue; } string[] strs = lines[i].Split('\t'); EmojiInfo info; info.x = float.Parse(strs[3]); info.y = float.Parse(strs[4]); info.size = float.Parse(strs[5]); info.len = 0; EmojiIndex.Add(strs[1], info); } } Dictionary <int, EmojiInfo> emojiDic = new Dictionary <int, EmojiInfo> (); if (supportRichText) { MatchCollection matches = Regex.Matches(text, "\\[[a-z0-9A-Z]+\\]"); for (int i = 0; i < matches.Count; i++) { EmojiInfo info; if (EmojiIndex.TryGetValue(matches [i].Value, out info)) { info.len = matches [i].Length; emojiDic.Add(matches [i].Index, info); } } } // 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 = Mathf.Lerp(inputRect.xMin, inputRect.xMax, textAnchorPivot.x); refPoint.y = Mathf.Lerp(inputRect.yMin, inputRect.yMax, textAnchorPivot.y); // Determine fraction of pixel to offset text mesh. Vector2 roundingOffset = PixelAdjustPoint(refPoint) - refPoint; // 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 { float repairDistance = 0; float repairDistanceHalf = 0; float repairY = 0; if (vertCount > 0) { repairY = verts [3].position.y; } for (int i = 0; i < vertCount; ++i) { EmojiInfo info; int index = i / 4; if (emojiDic.TryGetValue(index, out info)) { //compute the distance of '[' and get the distance of emoji float charDis = (verts [i + 1].position.x - verts [i].position.x) * 2f; m_TempVerts [3] = verts [i]; //1 m_TempVerts [2] = verts [i + 1]; //2 m_TempVerts [1] = verts [i + 2]; //3 m_TempVerts [0] = verts [i + 3]; //4 //the real distance of an emoji //右边 m_TempVerts [2].position += new Vector3(charDis * sizeScale / 4, 0, 0); m_TempVerts [1].position += new Vector3(charDis * sizeScale / 4, 0, 0); //上边 m_TempVerts[2].position += new Vector3(0, charDis * sizeScale / 4, 0); m_TempVerts[3].position += new Vector3(0, charDis * sizeScale / 4, 0); //下边 m_TempVerts[0].position += new Vector3(0, -charDis * sizeScale / 4, 0); m_TempVerts[1].position += new Vector3(0, -charDis * sizeScale / 4, 0); //左边 m_TempVerts[0].position += new Vector3(-charDis * sizeScale / 4, 0, 0); m_TempVerts[3].position += new Vector3(-charDis * sizeScale / 4, 0, 0); //the real Height of an emoji float delty = font.fontSize * deltYscale; m_TempVerts[2].position += new Vector3(0, delty, 0); m_TempVerts[3].position += new Vector3(0, delty, 0); m_TempVerts[0].position += new Vector3(0, delty, 0); m_TempVerts[1].position += new Vector3(0, delty, 0); //make emoji has equal width and height float fixValue = (m_TempVerts [2].position.x - m_TempVerts [3].position.x - (m_TempVerts [2].position.y - m_TempVerts [1].position.y)); m_TempVerts [2].position -= new Vector3(fixValue, 0, 0); m_TempVerts [1].position -= new Vector3(fixValue, 0, 0); float curRepairDis = 0; if (verts [i].position.y < repairY) // to judge current char in the same line or not { repairDistance = repairDistanceHalf; repairDistanceHalf = 0; repairY = verts [i + 3].position.y; } curRepairDis = repairDistance; int dot = 0; //repair next line distance for (int j = info.len - 1; j > 0; j--) { if (verts [i + j * 4].position.y >= verts [i + 3].position.y) { repairDistance += verts [i + j * 4 + 1].position.x - m_TempVerts [2].position.x; break; } else { dot = i + 4 * j; } } if (dot > 0) { int nextChar = i + info.len * 4; if (nextChar < verts.Count) { repairDistanceHalf = verts [nextChar].position.x - verts [dot].position.x; } } //repair its distance for (int j = 0; j < 4; j++) { m_TempVerts [j].position -= new Vector3(curRepairDis, 0, 0); } m_TempVerts [0].position *= unitsPerPixel; m_TempVerts [1].position *= unitsPerPixel; m_TempVerts [2].position *= unitsPerPixel; m_TempVerts [3].position *= unitsPerPixel; float pixelOffset = emojiDic [index].size / 32 / 2; //float pixelOffset = 0; m_TempVerts [0].uv1 = new Vector2(emojiDic [index].x + pixelOffset, emojiDic [index].y + pixelOffset); m_TempVerts [1].uv1 = new Vector2(emojiDic [index].x - pixelOffset + emojiDic [index].size, emojiDic [index].y + pixelOffset); m_TempVerts [2].uv1 = new Vector2(emojiDic [index].x - pixelOffset + emojiDic [index].size, emojiDic [index].y - pixelOffset + emojiDic [index].size); m_TempVerts [3].uv1 = new Vector2(emojiDic [index].x + pixelOffset, emojiDic [index].y - pixelOffset + emojiDic [index].size); toFill.AddUIVertexQuad(m_TempVerts); i += 4 * info.len - 1; } else { int tempVertsIndex = i & 3; if (tempVertsIndex == 0 && verts [i].position.y < repairY) { repairY = verts [i + 3].position.y; repairDistance = repairDistanceHalf; repairDistanceHalf = 0; } m_TempVerts [tempVertsIndex] = verts [i]; m_TempVerts [tempVertsIndex].position -= new Vector3(repairDistance, 0, 0); m_TempVerts [tempVertsIndex].position *= unitsPerPixel; if (tempVertsIndex == 3) { toFill.AddUIVertexQuad(m_TempVerts); } } } } m_DisableFontTextureRebuiltCallback = false; }
public void PopulateMesh(VertexHelper vh, ref int vertIndexOffset) { if (Direction.x > 0) { rect_.xMin = 0; rect_.xMax = Length * Rate; rect_.yMin = -Width / 2; rect_.yMax = Width / 2; } else if (Direction.x < 0) { rect_.xMin = -Length * Rate; rect_.xMax = 0; rect_.yMin = -Width / 2; rect_.yMax = Width / 2; } else if (Direction.y > 0) { rect_.yMin = 0; rect_.yMax = Length * Rate; rect_.xMin = -Width / 2; rect_.xMax = Width / 2; } else if (Direction.y < 0) { rect_.yMin = -Length * Rate; rect_.yMax = 0; rect_.xMin = -Width / 2; rect_.xMax = Width / 2; } else if (Direction.x == 0) { rect_.xMin = -Length * Rate / 2; rect_.xMax = Length * Rate / 2; rect_.yMin = -Width / 2; rect_.yMax = Width / 2; } else { return; } // 左上 UIVertex lt = UIVertex.simpleVert; lt.position = new Vector3(rect_.xMin + Slide, rect_.yMax, 0); lt.color = color; // 右上 UIVertex rt = UIVertex.simpleVert; rt.position = new Vector3(rect_.xMax + Slide, rect_.yMax, 0); rt.color = color; // 右下 UIVertex rb = UIVertex.simpleVert; rb.position = new Vector3(rect_.xMax, rect_.yMin, 0); rb.color = color; // 左下 UIVertex lb = UIVertex.simpleVert; lb.position = new Vector3(rect_.xMin, rect_.yMin, 0); lb.color = color; if (incorporatedShape_ != null) { Vector3 offset = Vector3.zero; Transform parent = transform; do { offset += parent.localPosition; parent = parent.parent; } while(parent.gameObject != incorporatedShape_.gameObject); lb.position += offset; lt.position += offset; rb.position += offset; rt.position += offset; } if ((incorporatedShape_ != null && incorporatedShape_.IsVertexCountDirty) || vh.currentVertCount != 4) { if (incorporatedShape_ == null) { vh.Clear(); } vh.AddUIVertexQuad(new UIVertex[] { lb, rb, rt, lt }); } else { vh.SetUIVertex(lb, 0 + vertIndexOffset); vh.SetUIVertex(rb, 1 + vertIndexOffset); vh.SetUIVertex(rt, 2 + vertIndexOffset); vh.SetUIVertex(lt, 3 + vertIndexOffset); } vertIndexOffset += 4; }
protected override void OnPopulateMesh(VertexHelper toFill) { if (null == toFill) { return; } base.OnPopulateMesh(toFill); //获取所有的UIVertex,绘制一个字符对应6个UIVertex,绘制顺序为012 230 ,0在左上角 List <UIVertex> listUIVertex = new List <UIVertex>(); toFill.GetUIVertexStream(listUIVertex); var vertArray = listUIVertex.ToArray(); for (int i = 0; i < vertArray.Length; i += 6) { float halfOfheight = Mathf.Abs(vertArray[i + 1].position.y - vertArray[i + 2].position.y) / 2.0f; float halfOfwidth = Mathf.Abs(vertArray[i + 1].position.x - vertArray[i].position.x) / 2.0f; Vector3 centerPos = (vertArray[i].position + vertArray[i + 2].position) / 2.0f; float angleZ = Mathf.Deg2Rad * (90); Matrix4x4 rMatrixZ = new Matrix4x4(); rMatrixZ.SetRow(0, new Vector4(Mathf.Cos(angleZ), -Mathf.Sin(angleZ), 0, 0)); rMatrixZ.SetRow(1, new Vector4(Mathf.Sin(angleZ), Mathf.Cos(angleZ), 0, 0)); rMatrixZ.SetRow(2, new Vector4(0, 0, 1, 0)); rMatrixZ.SetRow(3, new Vector4(0, 0, 0, 1)); float angleY = Mathf.Deg2Rad * (-180); Matrix4x4 rMatrixY = new Matrix4x4(); rMatrixY.SetRow(0, new Vector4(Mathf.Cos(angleY), 0, Mathf.Sin(angleY), 0)); rMatrixY.SetRow(1, new Vector4(0, 1, 0, 0)); rMatrixY.SetRow(2, new Vector4(-Mathf.Sin(angleY), 0, Mathf.Cos(angleY), 0)); rMatrixY.SetRow(3, new Vector4(0, 0, 0, 1)); float angleX = Mathf.Deg2Rad * (-180); Matrix4x4 rMatrixX = new Matrix4x4(); rMatrixX.SetRow(0, new Vector4(1, 0, 0, 0)); rMatrixX.SetRow(1, new Vector4(0, Mathf.Cos(angleX), -Mathf.Sin(angleX), 0)); rMatrixX.SetRow(2, new Vector4(0, Mathf.Sin(angleX), Mathf.Cos(angleX), 0)); rMatrixX.SetRow(3, new Vector4(0, 0, 0, 1)); Matrix4x4 total = rMatrixZ * rMatrixY; //竖直排列从左往右读 //Matrix4x4 total = rMatrixZ;//竖直排列从右往左读 centerPos = total.MultiplyVector(centerPos); vertArray[i].position = centerPos + new Vector3(-halfOfwidth, halfOfheight, 0.0f); vertArray[i + 1].position = centerPos + new Vector3(halfOfwidth, halfOfheight, 0.0f); vertArray[i + 2].position = centerPos + new Vector3(halfOfwidth, -halfOfheight, 0.0f); vertArray[i + 3].position = centerPos + new Vector3(halfOfwidth, -halfOfheight, 0.0f); vertArray[i + 4].position = centerPos + new Vector3(-halfOfwidth, -halfOfheight, 0.0f); vertArray[i + 5].position = centerPos + new Vector3(-halfOfwidth, halfOfheight, 0.0f); listUIVertex[i] = vertArray[i]; listUIVertex[i + 1] = vertArray[i + 1]; listUIVertex[i + 2] = vertArray[i + 2]; listUIVertex[i + 3] = vertArray[i + 3]; listUIVertex[i + 4] = vertArray[i + 4]; listUIVertex[i + 5] = vertArray[i + 5]; } toFill.Clear(); toFill.AddUIVertexTriangleStream(listUIVertex); }
protected override void OnPopulateMesh(VertexHelper vh) { var rect = rectTransform.rect; var rectNew = rect; Color32 color32 = color; bool up = cutUL | cutUR; bool down = cutLL | cutLR; bool left = cutLL | cutUL; bool right = cutLR | cutUR; bool any = up | down; if (any && cornerSize.sqrMagnitude > 0) { //nibble off the sides vh.Clear(); if (left) rectNew.xMin += cornerSize.x; if (down) rectNew.yMin += cornerSize.y; if (up) rectNew.yMax -= cornerSize.y; if (right) rectNew.xMax -= cornerSize.x; //add two squares to the main square Vector2 ul, ur, ll, lr; if (makeColumns) { ul = new Vector2(rect.xMin, cutUL ? rectNew.yMax : rect.yMax); ur = new Vector2(rect.xMax, cutUR ? rectNew.yMax : rect.yMax); ll = new Vector2(rect.xMin, cutLL ? rectNew.yMin : rect.yMin); lr = new Vector2(rect.xMax, cutLR ? rectNew.yMin : rect.yMin); if (left) AddSquare( ll, ul, new Vector2(rectNew.xMin, rect.yMax), new Vector2(rectNew.xMin, rect.yMin), rect, useColorUp ? colorUp : color32, vh); if (right) AddSquare( ur, lr, new Vector2(rectNew.xMax, rect.yMin), new Vector2(rectNew.xMax, rect.yMax), rect, useColorDown ? colorDown : color32, vh); } else { ul = new Vector2(cutUL ? rectNew.xMin : rect.xMin, rect.yMax); ur = new Vector2(cutUR ? rectNew.xMax : rect.xMax, rect.yMax); ll = new Vector2(cutLL ? rectNew.xMin : rect.xMin, rect.yMin); lr = new Vector2(cutLR ? rectNew.xMax : rect.xMax, rect.yMin); if (down) AddSquare( lr, ll, new Vector2(rect.xMin, rectNew.yMin), new Vector2(rect.xMax, rectNew.yMin), rect, useColorDown ? colorDown : color32, vh); if (up) AddSquare( ul, ur, new Vector2(rect.xMax, rectNew.yMax), new Vector2(rect.xMin, rectNew.yMax), rect, useColorUp ? colorUp : color32, vh); } //center if (makeColumns) AddSquare(new Rect(rectNew.xMin, rect.yMin, rectNew.width, rect.height), rect, color32, vh); else AddSquare(new Rect(rect.xMin, rectNew.yMin, rect.width, rectNew.height), rect, color32, vh); } }
public override void ModifyMesh(VertexHelper vh) { if (!this.IsActive()) { return; } List <UIVertex> verts = new List <UIVertex>(); vh.GetUIVertexStream(verts); float min = float.MaxValue; float max = float.MinValue; float len = 0; var vertsCount = verts.Count; for (int i = 0; i < vertsCount; i++) { switch (fillDirection) { case FillDirection.BottomTop: case FillDirection.TopBottom: if (verts[i].position.y < min) { min = verts[i].position.y; } if (verts[i].position.y > max) { max = verts[i].position.y; } break; case FillDirection.LeftRight: case FillDirection.RightLeft: if (verts[i].position.x < min) { min = verts[i].position.x; } if (verts[i].position.x > max) { max = verts[i].position.x; } break; } } len = max - min; if (len == 0) { return; } for (int i = 0; i < vertsCount; i++) { UIVertex uiVertex = verts[i]; switch (fillDirection) { case FillDirection.BottomTop: uiVertex.uv1.y = (verts[i].position.y - min) / len; break; case FillDirection.TopBottom: uiVertex.uv1.y = (max - verts[i].position.y) / len; break; case FillDirection.LeftRight: uiVertex.uv1.y = (verts[i].position.x - min) / len; break; case FillDirection.RightLeft: uiVertex.uv1.y = (max - verts[i].position.x) / len; break; } verts[i] = uiVertex; } vh.Clear(); vh.AddUIVertexTriangleStream(verts); }