Beispiel #1
0
        //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);
        }
Beispiel #2
0
        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 }));
				
			}
		}
Beispiel #4
0
        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);
        }
Beispiel #6
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);
        }
Beispiel #7
0
        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]);
            }
        }
Beispiel #8
0
    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);
    }
Beispiel #11
0
        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);
            }
        }
Beispiel #12
0
    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);
                }
            }
        }
    }
Beispiel #13
0
        // 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);
        }
Beispiel #14
0
        // 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);
        }
Beispiel #15
0
        // 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;
 }
Beispiel #17
0
    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 }));
        }
    }
Beispiel #18
0
    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;
    }
Beispiel #19
0
    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);
            }
        }
    }
Beispiel #20
0
    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);
        }
    }
Beispiel #21
0
        // 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);
        }
Beispiel #22
0
        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]);
            }
        }
Beispiel #23
0
        // 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);
        }
Beispiel #24
0
 protected override void OnPopulateMesh(VertexHelper toFill)
 {
     toFill.Clear();
 }
Beispiel #25
0
        // 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);
        }
Beispiel #26
0
    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));
        }
    }
Beispiel #27
0
        // 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);
        }
Beispiel #28
0
        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]);
            }
        }
Beispiel #29
0
        // 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);
        }
Beispiel #30
0
        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));
			}
        }
Beispiel #31
0
        // 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);
        }
Beispiel #32
0
		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);
			}
		}
Beispiel #33
0
        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);
        }
Beispiel #34
0
        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;
                }
            }
        }
Beispiel #35
0
        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;
        }
Beispiel #36
0
        // 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);
        }
Beispiel #37
0
    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);
        }
Beispiel #39
0
    /// <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;
            }
        }
Beispiel #41
0
    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;
    }
Beispiel #42
0
    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;
    }
Beispiel #43
0
    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);
    }
Beispiel #44
0
        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);

            }
        }
Beispiel #45
0
        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);
        }