예제 #1
0
        IEnumerable <UIVertex> getFillVeritces()
        {
            if (mLines == null)
            {
                yield break;
            }
            float z = 0f;

            for (int i = 0; i < mLines.Count; ++i)
            {
                LineSegement seg        = mLines[i];
                int          totalLines = seg.LineCount;
                for (int j = mMinModifyIndex; j < totalLines; ++j)
                {
                    Vector3 from;
                    Vector3 to;
                    seg.GetLine(j, out from, out to);

                    Vector2 toTrim   = to;
                    Vector2 fromTrim = from;
                    TrimItem(mFillRect.xMin, mFillRect.yMin, mFillRect.xMax, mFillRect.yMin, true, false, ref fromTrim, ref toTrim);
                    to   = new Vector3(toTrim.x, toTrim.y, to.z);
                    from = new Vector3(fromTrim.x, fromTrim.y, from.z);
                    Vector3 fromBottom = from;
                    Vector3 toBottom   = to;

                    fromBottom.y = mFillRect.yMin;
                    toBottom.y   = mFillRect.yMin;

                    float fromV = 1f;
                    float toV   = 1f;

                    if (mStretchY == false)
                    {
                        fromV = Mathf.Abs((from.y - mFillRect.yMin) / mFillRect.height);
                        toV   = Mathf.Abs((to.y - mFillRect.yMin) / mFillRect.height);
                    }

                    float   fromU = ((from.x - mFillRect.xMin) / mFillRect.width);
                    float   toU   = ((to.x - mFillRect.xMin) / mFillRect.width);
                    Vector2 uv1   = TransformUv(new Vector2(fromU, fromV));
                    Vector2 uv2   = TransformUv(new Vector2(toU, toV));
                    Vector2 uv3   = TransformUv(new Vector2(fromU, 0f));
                    Vector2 uv4   = TransformUv(new Vector2(toU, 0f));

                    UIVertex v1 = ChartCommon.CreateVertex(from, uv1, z);
                    UIVertex v2 = ChartCommon.CreateVertex(to, uv2, z);
                    UIVertex v3 = ChartCommon.CreateVertex(fromBottom, uv3, z);
                    UIVertex v4 = ChartCommon.CreateVertex(toBottom, uv4, z);

                    yield return(v1);

                    yield return(v2);

                    yield return(v3);

                    yield return(v4);
                }
            }
        }
예제 #2
0
        public static void Generate2dMesh(IChartMesh mesh, float startAngle, float angleSpan, float radius, float innerRadius, int segments)
        {
            float segmentAngle = angleSpan / segments;
            float currentAngle = startAngle;
            float segmenUv     = 1f / segments;
            float currentUv    = 0f;
            float cos          = Mathf.Cos(currentAngle);
            float sin          = Mathf.Sin(currentAngle);

            UIVertex prevInnerVertex = ChartCommon.CreateVertex(new Vector3(cos * innerRadius, sin * innerRadius, 0f), new Vector2(currentUv, 0f));
            UIVertex prevOuterVertex = ChartCommon.CreateVertex(new Vector3(cos * radius, sin * radius, 0f), new Vector2(currentUv, 1f));

            for (int i = 1; i < segments + 1; i++)
            {
                currentUv    += segmenUv;
                currentAngle += segmentAngle;
                cos           = Mathf.Cos(currentAngle);
                sin           = Mathf.Sin(currentAngle);

                UIVertex innerVertex = ChartCommon.CreateVertex(new Vector3(cos * innerRadius, sin * innerRadius, 0f), new Vector2(currentUv, 0f));
                UIVertex outerVertex = ChartCommon.CreateVertex(new Vector3(cos * radius, sin * radius, 0f), new Vector2(currentUv, 1f));
                mesh.AddQuad(prevInnerVertex, innerVertex, prevOuterVertex, outerVertex);
                prevInnerVertex = innerVertex;
                prevOuterVertex = outerVertex;
            }
        }
예제 #3
0
        public override void AddXYRect(Rect rect, int subMeshGroup, float depth)
        {
            Vector2[] uvs         = GetUvs(rect);
            UIVertex  leftTop     = ChartCommon.CreateVertex(new Vector3(rect.xMin, rect.yMin, depth), uvs[0]);
            UIVertex  rightTop    = ChartCommon.CreateVertex(new Vector3(rect.xMax, rect.yMin, depth), uvs[1]);
            UIVertex  leftBottom  = ChartCommon.CreateVertex(new Vector3(rect.xMin, rect.yMax, depth), uvs[2]);
            UIVertex  rightBottom = ChartCommon.CreateVertex(new Vector3(rect.xMax, rect.yMax, depth), uvs[3]);

            AddQuad(leftTop, rightTop, leftBottom, rightBottom);
        }
        IEnumerable <UIVertex> getDotVeritces()
        {
            if (mLines == null)
            {
                yield break;
            }
            float z        = 0f;
            float halfSize = mPointSize * 0.5f;

            for (int i = 0; i < mLines.Count; ++i)
            {
                LineSegement seg   = mLines[i];
                int          total = seg.PointCount;
                for (int j = mMinModifyIndex; j < total; ++j)
                {
                    Vector4 magPoint = seg.getPoint(j);
                    if (magPoint.w == 0f)
                    {
                        continue;
                    }

                    Vector3 point = (Vector3)magPoint;
                    halfSize = mPointSize * 0.5f;
                    ProcesssPoint(ref magPoint, ref halfSize);
                    Vector3 p1  = point + new Vector3(-halfSize, -halfSize, 0f);
                    Vector3 p2  = point + new Vector3(halfSize, -halfSize, 0f);
                    Vector3 p3  = point + new Vector3(-halfSize, halfSize, 0f);
                    Vector3 p4  = point + new Vector3(halfSize, halfSize, 0f);
                    Vector2 uv1 = new Vector2(0f, 0f);
                    Vector2 uv2 = new Vector2(1f, 0f);
                    Vector2 uv3 = new Vector2(0f, 1f);
                    Vector2 uv4 = new Vector2(1f, 1f);

                    UIVertex v1 = ChartCommon.CreateVertex(p1, uv1, z);
                    UIVertex v2 = ChartCommon.CreateVertex(p2, uv2, z);
                    UIVertex v3 = ChartCommon.CreateVertex(p3, uv3, z);
                    UIVertex v4 = ChartCommon.CreateVertex(p4, uv4, z);

                    if (ClipRect.HasValue == false || ClipRect.Value.Contains(p1) || ClipRect.Value.Contains(p2) || ClipRect.Value.Contains(p3) ||
                        ClipRect.Value.Contains(p4))
                    {
                        yield return(v1);

                        yield return(v2);

                        yield return(v3);

                        yield return(v4);
                    }
                }
            }
        }
예제 #5
0
        IEnumerable <UIVertex> getDotVeritces()
        {
            if (mLines == null)
            {
                yield break;
            }
            float z        = 0f;
            float halfSize = mPointSize * 0.5f;

            for (int i = 0; i < mLines.Count; ++i)
            {
                LineSegement seg   = mLines[i];
                int          total = seg.PointCount;
                for (int j = 0; j < total; ++j)
                {
                    Vector4 magPoint = seg.getPoint(j);
                    if (magPoint.w == 0f)
                    {
                        continue;
                    }

                    Vector3 point = (Vector3)magPoint;
                    halfSize = mPointSize * 0.5f;
                    if (magPoint.w >= 0f)
                    {
                        halfSize = magPoint.w * 0.5f;
                    }
                    Vector3 p1  = point + new Vector3(-halfSize, -halfSize, 0f);
                    Vector3 p2  = point + new Vector3(halfSize, -halfSize, 0f);
                    Vector3 p3  = point + new Vector3(-halfSize, halfSize, 0f);
                    Vector3 p4  = point + new Vector3(halfSize, halfSize, 0f);
                    Vector2 uv1 = new Vector2(0f, 0f);
                    Vector2 uv2 = new Vector2(1f, 0f);
                    Vector2 uv3 = new Vector2(0f, 1f);
                    Vector2 uv4 = new Vector2(1f, 1f);

                    UIVertex v1 = ChartCommon.CreateVertex(p1, uv1, z);
                    UIVertex v2 = ChartCommon.CreateVertex(p2, uv2, z);
                    UIVertex v3 = ChartCommon.CreateVertex(p3, uv3, z);
                    UIVertex v4 = ChartCommon.CreateVertex(p4, uv4, z);

                    yield return(v1);

                    yield return(v2);

                    yield return(v3);

                    yield return(v4);
                }
            }
        }
예제 #6
0
        public static void Generate2dMesh(UIVertex[] mesh, Vector2[] normals, float baseX1, float baseX2, float baseSize, float slopLeft, float slopeRight, float height, float startV, float endV)
        {
            float halfHeight = height * 0.5f;
            float halfWidth  = baseSize * 0.5f;

            slopLeft   = -Mathf.Clamp(slopLeft, -90, 90) + 90;
            slopeRight = Mathf.Clamp(slopeRight, -90, 90) + 90;

            float tanLeft  = (1f / Mathf.Tan(slopLeft * Mathf.Deg2Rad)) * height;
            float tanRight = (1f / Mathf.Tan(slopeRight * Mathf.Deg2Rad)) * height;

            float leftPos  = baseX1 + tanLeft;
            float rightPos = baseX2 + tanRight;

            leftPos  = Mathf.Clamp(leftPos, 0, baseSize);
            rightPos = Mathf.Clamp(rightPos, 0, baseSize);


            if (leftPos > rightPos)
            {
                leftPos = rightPos = Mathf.Clamp(Mathf.Lerp(leftPos, rightPos, 0.5f), 0, baseSize);
            }

            UIVertex v1 = ChartCommon.CreateVertex(new Vector3(baseX1 - halfWidth, -halfHeight), new Vector2(0f, startV));
            UIVertex v2 = ChartCommon.CreateVertex(new Vector3(baseX2 - halfWidth, -halfHeight), new Vector2(1f, startV));
            UIVertex v3 = ChartCommon.CreateVertex(new Vector3(leftPos - halfWidth, halfHeight), new Vector2(0f, endV));
            UIVertex v4 = ChartCommon.CreateVertex(new Vector3(rightPos - halfWidth, halfHeight), new Vector2(1f, endV));

            normals[0] = ((Vector2.up + ChartCommon.Perpendicular(v3.position - v1.position).normalized) * 0.5f).normalized;
            normals[1] = ((Vector2.up + ChartCommon.Perpendicular(v2.position - v4.position).normalized) * 0.5f).normalized;
            normals[2] = ((Vector2.down + ChartCommon.Perpendicular(v3.position - v1.position).normalized) * 0.5f).normalized;
            normals[3] = ((Vector2.down + ChartCommon.Perpendicular(v2.position - v4.position).normalized) * 0.5f).normalized;

            mesh[0] = v1;
            mesh[1] = v2;
            mesh[2] = v3;
            mesh[3] = v4;
        }
예제 #7
0
        public static void Generate3dMesh(WorldSpaceChartMesh mesh, float startAngle, float angleSpan, float radius, float innerRadius, int segments, float outerDepth, float innerDepth)
        {
            float maxDepth = Mathf.Max(outerDepth, innerDepth);
            float bottom   = maxDepth * 0.5f;
            float innerUp  = bottom - innerDepth;
            float outerUp  = bottom - outerDepth;
            //float halfDepth = maxDepth * 0.5f;
            float segmentAngle = angleSpan / segments;
            float currentAngle = startAngle;
            float segmenUv     = 1f / segments;
            float currentUv    = 0f;
            float cos          = Mathf.Cos(currentAngle);
            float sin          = Mathf.Sin(currentAngle);

            UIVertex innerV = ChartCommon.CreateVertex(new Vector3(cos * innerRadius, sin * innerRadius, innerUp), new Vector2(currentUv, 0f));
            UIVertex outerV = ChartCommon.CreateVertex(new Vector3(cos * radius, sin * radius, outerUp), new Vector2(currentUv, 1f));

            int currentInner      = mesh.AddVertex(innerV);
            int currentOuter      = mesh.AddVertex(outerV);
            int prevInnerVertex   = mesh.AddVertex(innerV);
            int prevOuterVertex   = mesh.AddVertex(outerV);
            int prevOpeningVertex = mesh.AddVertex(innerV);
            int prevClosingVertex = mesh.AddVertex(outerV);

            innerV.position.z = bottom;
            outerV.position.z = bottom;

            int currentInnerDeep    = mesh.AddVertex(innerV);
            int currentOuterDeep    = mesh.AddVertex(outerV);
            int prevInnerVertexDeep = mesh.AddVertex(innerV);
            int prevOuterVertexDeep = mesh.AddVertex(outerV);

            mesh.AddTringle(currentInner, currentOuter, currentOuterDeep);
            mesh.AddTringle(currentOuterDeep, currentInnerDeep, currentInner);

            int prevOpeningVertexDeep = mesh.AddVertex(innerV);
            int prevClosingVertexDeep = mesh.AddVertex(outerV);

            for (int i = 1; i <= segments; i++)
            {
                currentUv    += segmenUv;
                currentAngle += segmentAngle;
                cos           = Mathf.Cos(currentAngle);
                sin           = Mathf.Sin(currentAngle);

                UIVertex innerVertex = ChartCommon.CreateVertex(new Vector3(cos * innerRadius, sin * innerRadius, innerUp), new Vector2(currentUv, 0f));
                UIVertex outerVertex = ChartCommon.CreateVertex(new Vector3(cos * radius, sin * radius, outerUp), new Vector2(currentUv, 1f));

                int leftBottom       = -1;
                int rightBottomAdded = -1;
                if (innerRadius > 0f)
                {
                    rightBottomAdded = mesh.AddVertex(innerVertex);
                    leftBottom       = prevInnerVertex;
                }

                int leftTop       = prevOuterVertex;
                int rightTop      = mesh.AddVertex(outerVertex);
                int rightBottom   = mesh.AddVertex(innerVertex);
                int rightTopAdded = mesh.AddVertex(outerVertex);

                innerVertex.position.z = bottom;
                outerVertex.position.z = bottom;

                int leftBottomDeep = -1;
                if (innerRadius > 0f)
                {
                    leftBottomDeep = prevInnerVertexDeep;
                }

                int leftTopDeep       = prevOuterVertexDeep;
                int rightTopDeep      = mesh.AddVertex(outerVertex);
                int rightBottomDeep   = mesh.AddVertex(innerVertex);
                int rightTopAddedDeep = mesh.AddVertex(outerVertex);

                mesh.AddTringle(rightBottom, rightTop, leftTop);
                mesh.AddTringle(leftTopDeep, rightTopDeep, rightBottomDeep);

                mesh.AddTringle(prevClosingVertexDeep, prevClosingVertex, rightTopAdded);
                mesh.AddTringle(rightTopAdded, rightTopAddedDeep, prevClosingVertexDeep);

                prevClosingVertex     = rightTopAdded;
                prevClosingVertexDeep = rightTopAddedDeep;

                if (innerRadius > 0f)
                {
                    int rightBottomAddedDeep = mesh.AddVertex(innerVertex);
                    mesh.AddTringle(leftTop, leftBottom, rightBottom);
                    mesh.AddTringle(rightBottomDeep, leftBottomDeep, leftTopDeep);

                    mesh.AddTringle(rightBottomAdded, prevOpeningVertex, prevOpeningVertexDeep);
                    mesh.AddTringle(prevOpeningVertexDeep, rightBottomAddedDeep, rightBottomAdded);
                    prevOpeningVertexDeep = rightBottomAddedDeep;
                    prevOpeningVertex     = rightBottomAdded;
                }
                prevInnerVertex     = rightBottom;
                prevOuterVertex     = rightTop;
                prevInnerVertexDeep = rightBottomDeep;
                prevOuterVertexDeep = rightTopDeep;

                if (i == segments)
                {
                    rightTopDeep           = mesh.AddVertex(outerVertex);
                    rightBottomDeep        = mesh.AddVertex(innerVertex);
                    innerVertex.position.z = innerUp;
                    outerVertex.position.z = outerUp;
                    rightTop    = mesh.AddVertex(outerVertex);
                    rightBottom = mesh.AddVertex(innerVertex);
                    mesh.AddTringle(rightTopDeep, rightTop, rightBottom);
                    mesh.AddTringle(rightBottom, rightBottomDeep, rightTopDeep);
                }
            }
        }
예제 #8
0
        IEnumerable <UIVertex> getLineVertices()
        {
            if (mLines == null)
            {
                yield break;
            }
            float halfThickness = Thickness * 0.5f;
            float z             = 0f;

            for (int i = 0; i < mLines.Count; ++i)
            {
                LineSegement seg        = mLines[i];
                int          totalLines = seg.LineCount;
                Line?        peek       = null;
                Line?        prev       = null;
                float        tileUv     = 0f;
                float        totalUv    = 0f;
                for (int j = mMinModifyIndex; j < totalLines; ++j)
                {
                    totalUv += (float)seg.GetLineMag(j);
                }
                for (int j = mMinModifyIndex; j < totalLines; ++j)
                {
                    Line line;
                    bool hasNext = j + 1 < totalLines;
                    if (peek.HasValue)
                    {
                        line = peek.Value;
                    }
                    else
                    {
                        line = seg.GetLine(j, halfThickness, prev.HasValue, hasNext);
                    }
                    peek = null;
                    if (j + 1 < totalLines)
                    {
                        peek = seg.GetLine(j + 1, halfThickness, true, j + 2 < totalLines);
                    }

                    Vector3 p1 = line.P1;
                    Vector3 p2 = line.P2;
                    Vector3 p3 = line.P3;
                    Vector3 p4 = line.P4;

                    Vector2 uv1 = new Vector2(tileUv * Tiling, 0f);
                    Vector2 uv2 = new Vector2(tileUv * Tiling, 1f);
                    tileUv += line.Mag / totalUv;

                    Vector2 uv3 = new Vector2(tileUv * Tiling, 0f);
                    Vector2 uv4 = new Vector2(tileUv * Tiling, 1f);

                    UIVertex v1 = ChartCommon.CreateVertex(p1, uv1, z);
                    UIVertex v2 = ChartCommon.CreateVertex(p2, uv2, z);
                    UIVertex v3 = ChartCommon.CreateVertex(p3, uv3, z);
                    UIVertex v4 = ChartCommon.CreateVertex(p4, uv4, z);

                    yield return(v1);

                    yield return(v2);

                    yield return(v3);

                    yield return(v4);

                    if (peek.HasValue)
                    {
                        float   myZ = z + 0.2f;
                        Vector3 a1, a2;
                        GetSide(line.To, line.Dir, line.Normal, halfThickness * 0.5f, halfThickness * 0.6f, v3.position.z, out a1, out a2);
                        yield return(v3);

                        yield return(v4);

                        yield return(ChartCommon.CreateVertex(a1, v3.uv0, myZ));

                        yield return(ChartCommon.CreateVertex(a2, v4.uv0, myZ));
                    }
                    if (prev.HasValue)
                    {
                        float   myZ = z + 0.2f;
                        Vector3 a1, a2;
                        GetSide(line.From, -line.Dir, line.Normal, halfThickness * 0.5f, halfThickness * 0.6f, v1.position.z, out a1, out a2);
                        yield return(ChartCommon.CreateVertex(a1, v1.uv0, myZ));

                        yield return(ChartCommon.CreateVertex(a2, v2.uv0, myZ));

                        yield return(v1);

                        yield return(v2);
                    }
                    //z -= 0.05f;
                    prev = line;
                }
            }
        }