Exemple #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);
                }
            }
        }
    protected void GenerateKoch(Vector3[] positions, bool outwards, float generatorMultiplier)
    {
        lineSegements.Clear();

        for (int i = 0; i < positions.Length - 1; i++)
        {
            LineSegement line = new LineSegement();
            line.StartPosition = positions[i];
            if (i == positions.Length - 1)
            {
                line.EndPosition = positions[0];
            }
            else
            {
                line.EndPosition = positions[i + 1];
            }
            line.Direction = Vector3.Normalize(line.EndPosition - line.StartPosition);
            line.Length    = Vector3.Distance(line.EndPosition, line.StartPosition);
            lineSegements.Add(line);
        }

        List <Vector3> newPos    = new List <Vector3>();
        List <Vector3> targetPos = new List <Vector3>();

        for (int i = 0; i < lineSegements.Count; i++)
        {
            newPos.Add(lineSegements[i].StartPosition);
            targetPos.Add(lineSegements[i].StartPosition);

            for (int j = 1; j < keys.Length - 1; j++)
            {
                float   moveAmount   = lineSegements[i].Length * keys[j].time;
                float   heightAmount = (lineSegements[i].Length * keys[j].value) * generatorMultiplier;
                Vector3 movePos      = lineSegements[i].StartPosition + (lineSegements[i].Direction * moveAmount);
                Vector3 d;
                if (outwards)
                {
                    d = Quaternion.AngleAxis(-90, rotateAxis) * lineSegements[i].Direction;
                }
                else
                {
                    d = Quaternion.AngleAxis(90, rotateAxis) * lineSegements[i].Direction;
                }
                newPos.Add(movePos);
                targetPos.Add(movePos + (d * heightAmount));
            }
        }
        newPos.Add(lineSegements[0].StartPosition);
        targetPos.Add(lineSegements[0].StartPosition);
        position       = new Vector3[newPos.Count];
        targetPosition = new Vector3[targetPos.Count];
        position       = newPos.ToArray();
        targetPosition = targetPos.ToArray();
        bezierPosition = BezierCurve(targetPosition, bezierVertexCount);
        generationCount++;
    }
Exemple #3
0
        void PickDot(Vector3 mouse, out int segment, out int point)
        {
            float minDist = Mathf.Infinity;

            segment = -1;
            point   = -1;
            if (mLines == null)
            {
                return;
            }
            float mag = mPointSize;

            for (int i = 0; i < mLines.Count; ++i)
            {
                LineSegement seg   = mLines[i];
                int          total = seg.PointCount;
                for (int j = 0; j < total; ++j)
                {
                    Vector4 p = seg.getPoint(j);
                    if (p.w == 0f)
                    {
                        continue;
                    }
                    float dist = (mouse - ((Vector3)p)).sqrMagnitude;
                    if (dist < minDist)
                    {
                        mag = p.w;
                        if (mag < 0f)
                        {
                            mag = mPointSize;
                        }
                        minDist = dist;
                        segment = i;
                        point   = j;
                    }
                }
            }

            float sensitivity = 10f;

            if (mControl != null)
            {
                sensitivity = mControl.Sensitivity;
            }

            float thresh = mag + sensitivity;

            if ((ViewRect.HasValue && !ViewRect.Value.Contains(mouse)) || minDist > thresh * thresh)
            {
                segment = -1;
                point   = -1;
            }
        }
        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);
                    }
                }
            }
        }
Exemple #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);
                }
            }
        }
Exemple #6
0
        /// <summary>
        /// sets the lines for this renderer
        /// </summary>
        /// <param name="lines"></param>
        internal void SetLines(List <LineSegement> lines)
        {
            //    mUseCache = false;
            mLines   = lines;
            mMinX    = float.PositiveInfinity;
            mMinY    = float.PositiveInfinity;
            mMaxX    = float.NegativeInfinity;
            mMaxY    = float.NegativeInfinity;
            mControl = GetComponentInParent <SensitivityControl>();

            if (mLines != null)
            {
                for (int i = 0; i < mLines.Count; i++)
                {
                    LineSegement seg         = mLines[i];
                    int          totalPoints = seg.PointCount;
                    for (int j = 0; j < totalPoints; j++)
                    {
                        Vector3 point = seg.getPoint(j);
                        mMinX = Mathf.Min(mMinX, point.x);
                        mMinY = Mathf.Min(mMinY, point.y);
                        mMaxX = Mathf.Max(mMaxX, point.x);
                        mMaxY = Mathf.Max(mMaxY, point.y);
                    }
                }
            }

            SetAllDirty();
            mIsMouseIn = false;
            for (int i = 0; i < mHoverObjectes.Count; i++)
            {
                mHoverObjectes[i].gameObject.SetActive(false);
                mHoverFreeObjects.Add(mHoverObjectes[i]);
            }
            mHoverObjectes.Clear();

            if (mCurrentHover != null)
            {
                mCurrentHover.gameObject.SetActive(false);
                mHoverFreeObjects.Add(mCurrentHover);
                mCurrentHover = null;
            }
            mPickedI = mPickedJ = -1;
            Rebuild(CanvasUpdate.PreRender);
        }
Exemple #7
0
        void PickLine(Vector3 mouse, out int segment, out int line)
        {
            float minDist = Mathf.Infinity;

            segment = -1;
            line    = -1;

            if (mLines == null)
            {
                return;
            }
            for (int i = 0; i < mLines.Count; ++i)
            {
                LineSegement seg   = mLines[i];
                int          total = seg.LineCount;
                for (int j = 0; j < total; ++j)
                {
                    Vector3 from;
                    Vector3 to;
                    seg.GetLine(j, out from, out to);
                    float dist = ChartCommon.SegmentPointSqrDistance(from, to, mouse);
                    if (dist < minDist)
                    {
                        minDist = dist;
                        segment = i;
                        line    = j;
                    }
                }
            }
            float sensitivity = 10f;

            if (mControl != null)
            {
                sensitivity = mControl.Sensitivity;
            }
            float thresh = (Thickness + sensitivity);

            if ((ViewRect.HasValue && !ViewRect.Value.Contains(mouse)) || minDist > thresh * thresh)
            {
                segment = -1;
                line    = -1;
            }
        }
Exemple #8
0
        internal void ModifyLines(List <Vector4> lines)
        {
            //mUseCache = false;
            if (mLines.Count == 0)
            {
                mLines.Add(new LineSegement(lines.ToArray()));
                return;
            }
            //bool regenerate = false;
            //if(mLines[0].)
            mLines[0].ModifiyLines(lines);
            mMinX    = float.PositiveInfinity;
            mMinY    = float.PositiveInfinity;
            mMaxX    = float.NegativeInfinity;
            mMaxY    = float.NegativeInfinity;
            mControl = GetComponentInParent <SensitivityControl>();

            if (mLines != null)
            {
                for (int i = 0; i < mLines.Count; i++)
                {
                    LineSegement seg         = mLines[i];
                    int          totalPoints = seg.PointCount;
                    for (int j = 0; j < totalPoints; j++)
                    {
                        Vector3 point = seg.getPoint(j);
                        mMinX = Mathf.Min(mMinX, point.x);
                        mMinY = Mathf.Min(mMinY, point.y);
                        mMaxX = Mathf.Max(mMaxX, point.x);
                        mMaxY = Mathf.Max(mMaxY, point.y);
                    }
                }
                //   lines.Add()
            }
            SetVerticesDirty();
            Rebuild(CanvasUpdate.PostLayout);
            mForceMouseMove = true;
        }
Exemple #9
0
 /// <summary>
 /// finds the minimum and maximum values of the currently set data
 /// </summary>
 void FindBoundingValues()
 {
     mMinX = float.PositiveInfinity;
     mMinY = float.PositiveInfinity;
     mMaxX = float.NegativeInfinity;
     mMaxY = float.NegativeInfinity;
     // this part finds the bounding box of the lines
     if (mLines != null)
     {
         for (int i = 0; i < mLines.Count; i++)
         {
             LineSegement seg         = mLines[i];
             int          totalPoints = seg.PointCount;
             for (int j = 0; j < totalPoints; j++)
             {
                 Vector3 point = seg.getPoint(j);
                 mMinX = Mathf.Min(mMinX, point.x);
                 mMinY = Mathf.Min(mMinY, point.y);
                 mMaxX = Mathf.Max(mMaxX, point.x);
                 mMaxY = Mathf.Max(mMaxY, point.y);
             }
         }
     }
 }
Exemple #10
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;
                }
            }
        }