virtual protected void AddBorders(Vector2 leftPoint, Color leftColor, Vector2 leftDirectionNormalized, Vector2 rightPoint, Color rightColor, Vector2 rightDirectionNormalized, bool top)
    {
        if ((borders != null) && (borders.Count > 0))
        {
            int n = borders.Count;
            for (int i = 0; i < n; i++)
            {
                FDrawingBorder border = borders[i];
                if ((border.top && top) || (border.bottom && !top))
                {
                    FDrawingQuad quad = new FDrawingQuad(border.color);
                    quad.tlVertice = leftPoint + leftDirectionNormalized * border.thickness;
                    quad.blVertice = leftPoint;
                    quad.brVertice = rightPoint;
                    quad.trVertice = rightPoint + rightDirectionNormalized * border.thickness;
                    if (border.gradient)
                    {
                        quad.blColor = leftColor;
                        quad.brColor = rightColor;
                    }
                    _quads.AddLast(quad);

                    leftPoint  = quad.tlVertice;
                    leftColor  = quad.tlColor;
                    rightPoint = quad.trVertice;
                    rightColor = quad.trColor;
                }
            }
        }
    }
 public void Copy(FDrawingCursor model)
 {
     _quads           = model.GetQuads();
     lineFromValid    = model.lineFromValid;
     thickness        = model.thickness;
     jointType        = model.jointType;
     capType          = model.capType;
     color            = model.color;
     position         = model.position;
     lineFromPosition = model.lineFromPosition;
     direction        = model.direction;
     //topQuad=model.topQuad;
     //bottomQuad=model.bottomQuad;
     lineQuad = model.lineQuad;
     if (model.borders != null)
     {
         borders = new List <FDrawingBorder>(model.borders.Count);
         int n = model.borders.Count;
         for (int i = 0; i < n; i++)
         {
             FDrawingBorder border = model.borders[i];
             borders.Add(border.Clone());
         }
     }
     else
     {
         borders = null;
     }
 }
 public void Copy(FDrawingBorder model)
 {
     thickness  = model.thickness;
     gradient   = model.gradient;
     color      = model.color;
     top        = model.top;
     bottom     = model.bottom;
     topQuad    = model.topQuad;
     bottomQuad = model.bottomQuad;
 }
    virtual protected void AddLineSideBorders(FDrawingQuad topBaseQuad, FDrawingQuad bottomBaseQuad)
    {
        if (borders != null)
        {
            Vector2      ortho = new Vector2(-direction.y, direction.x);
            FDrawingQuad quad;
            int          n = borders.Count;
            for (int i = 0; i < n; i++)
            {
                FDrawingBorder border = borders[i];
                //top
                if (border.top)
                {
                    quad           = new FDrawingQuad(border.color);
                    quad.tlVertice = topBaseQuad.tlVertice + ortho * border.thickness;
                    quad.trVertice = topBaseQuad.trVertice + ortho * border.thickness;
                    quad.blVertice = topBaseQuad.tlVertice;
                    quad.brVertice = topBaseQuad.trVertice;
                    if (border.gradient)
                    {
                        quad.blColor = topBaseQuad.tlColor;
                        quad.brColor = topBaseQuad.trColor;
                    }
                    _quads.AddLast(quad);
                    border.topQuad = quad;
                    topBaseQuad    = quad;
                }

                //bottom
                if (border.bottom)
                {
                    quad           = new FDrawingQuad(border.color);
                    quad.blVertice = bottomBaseQuad.blVertice - ortho * border.thickness;
                    quad.brVertice = bottomBaseQuad.brVertice - ortho * border.thickness;
                    quad.tlVertice = bottomBaseQuad.blVertice;
                    quad.trVertice = bottomBaseQuad.brVertice;
                    if (border.gradient)
                    {
                        quad.tlColor = bottomBaseQuad.blColor;
                        quad.trColor = bottomBaseQuad.brColor;
                    }
                    _quads.AddLast(quad);
                    border.bottomQuad = quad;
                    bottomBaseQuad    = quad;
                }
            }
        }
    }
Пример #5
0
 public FDrawingBorder(FDrawingBorder model)
     : base()
 {
     Copy(model);
 }
Пример #6
0
 public void Copy(FDrawingBorder model)
 {
     thickness=model.thickness;
     gradient=model.gradient;
     color=model.color;
     topQuad=model.topQuad;
     bottomQuad=model.bottomQuad;
 }
 public FDrawingBorder(FDrawingBorder model) : base()
 {
     Copy(model);
 }
    virtual public void DrawJoint(FDrawingCursor previousCursor)
    {
        Vector2 prevOrtho = new Vector2(-previousCursor.direction.y, previousCursor.direction.x);
        Vector2 ortho     = new Vector2(-direction.y, direction.x);
        float   dot       = Vector2.Dot(prevOrtho, direction);


        //Cut inside of the turn
        bool    medianDone = false;
        Vector2 median     = Vector2.zero;

        if (borders != null)
        {
            if (borders.Count > 0)
            {
                median = prevOrtho + ortho;
                median.Normalize();
                medianDone = true;
                if (median == Vector2.zero)
                {
                    //???
                }
                else
                {
                    Vector2 A = lineFromPosition;
                    Vector2 B = lineFromPosition + median;
                    float   S, T;
                    bool    ret;
                    if (dot < 0)                     //bottomQuad
                    {
                        int n = borders.Count;
                        for (int i = 0; i < n; i++)
                        {
                            FDrawingBorder border = borders[i];
                            if (border.bottom)
                            {
                                FDrawingBorder previousBorder = previousCursor.borders[i];

                                //Previous line
                                //bottom line
                                ret = VectorUtils.LinesIntersect(A, B, previousBorder.bottomQuad.blVertice, previousBorder.bottomQuad.brVertice, out S, out T);
                                if ((ret) && (T >= 0) && (T <= 1))
                                {
                                    previousBorder.bottomQuad.brVertice = A + S * (B - A);
                                }
                                else
                                {
                                    ret = VectorUtils.LinesIntersect(A, B, previousBorder.bottomQuad.tlVertice, previousBorder.bottomQuad.blVertice, out S, out T);
                                    if ((ret) && (T >= 0) && (T <= 1))
                                    {
                                        previousBorder.bottomQuad.brVertice = A + S * (B - A);
                                        previousBorder.bottomQuad.blVertice = previousBorder.bottomQuad.brVertice;
                                    }
                                }
                                //topline
                                ret = VectorUtils.LinesIntersect(A, B, previousBorder.bottomQuad.tlVertice, previousBorder.bottomQuad.trVertice, out S, out T);
                                if ((ret) && (T >= 0) && (T <= 1))
                                {
                                    previousBorder.bottomQuad.trVertice = A + S * (B - A);
                                }

                                //Current line
                                //bottom line
                                ret = VectorUtils.LinesIntersect(A, B, border.bottomQuad.blVertice, border.bottomQuad.brVertice, out S, out T);
                                if ((ret) && (T >= 0) && (T <= 1))
                                {
                                    border.bottomQuad.blVertice = A + S * (B - A);
                                }
                                else
                                {
                                    ret = VectorUtils.LinesIntersect(A, B, border.bottomQuad.trVertice, border.bottomQuad.brVertice, out S, out T);
                                    if ((ret) && (T >= 0) && (T <= 1))
                                    {
                                        border.bottomQuad.brVertice = A + S * (B - A);
                                        border.bottomQuad.blVertice = border.bottomQuad.brVertice;
                                    }
                                }
                                //topline
                                ret = VectorUtils.LinesIntersect(A, B, border.bottomQuad.tlVertice, border.bottomQuad.trVertice, out S, out T);
                                if ((ret) && (T >= 0) && (T <= 1))
                                {
                                    border.bottomQuad.tlVertice = A + S * (B - A);
                                }
                            }
                            //i++;
                        }
                    }
                    else if (dot > 0)                       //topQuad
                    {
                        int n = borders.Count;
                        for (int i = 0; i < n; i++)
                        {
                            FDrawingBorder border = borders[i];
                            if (border.top)
                            {
                                FDrawingBorder previousBorder = previousCursor.borders[i];
                                //Previous line
                                //top line
                                ret = VectorUtils.LinesIntersect(A, B, previousBorder.topQuad.tlVertice, previousBorder.topQuad.trVertice, out S, out T);
                                if ((ret) && (T >= 0) && (T <= 1))
                                {
                                    previousBorder.topQuad.trVertice = A + S * (B - A);
                                }
                                else
                                {
                                    ret = VectorUtils.LinesIntersect(A, B, previousBorder.topQuad.tlVertice, previousBorder.topQuad.blVertice, out S, out T);
                                    if ((ret) && (T >= 0) && (T <= 1))
                                    {
                                        previousBorder.topQuad.trVertice = A + S * (B - A);
                                        previousBorder.topQuad.tlVertice = previousBorder.topQuad.trVertice;
                                    }
                                }
                                //bottom line
                                ret = VectorUtils.LinesIntersect(A, B, previousBorder.topQuad.blVertice, previousBorder.topQuad.brVertice, out S, out T);
                                if ((ret) && (T >= 0) && (T <= 1))
                                {
                                    previousBorder.topQuad.brVertice = A + S * (B - A);
                                }

                                //Current line
                                //top line
                                ret = VectorUtils.LinesIntersect(A, B, border.topQuad.tlVertice, border.topQuad.trVertice, out S, out T);
                                if ((ret) && (T >= 0) && (T <= 1))
                                {
                                    border.topQuad.tlVertice = A + S * (B - A);
                                }
                                else
                                {
                                    ret = VectorUtils.LinesIntersect(A, B, border.topQuad.trVertice, border.topQuad.trVertice, out S, out T);
                                    if ((ret) && (T >= 0) && (T <= 1))
                                    {
                                        border.topQuad.trVertice = A + S * (B - A);
                                        border.topQuad.tlVertice = border.topQuad.trVertice;
                                    }
                                }
                                //bottom line
                                ret = VectorUtils.LinesIntersect(A, B, border.topQuad.blVertice, border.topQuad.brVertice, out S, out T);
                                if ((ret) && (T >= 0) && (T <= 1))
                                {
                                    border.topQuad.blVertice = A + S * (B - A);
                                }
                            }
                            //i++;
                        }
                    }
                }
            }
        }

        Vector2 center = lineFromPosition;

        //if ((color.a<1)&&(previousCursor.color.a<1)) { //not necessary for solid colors but removing overlapping mught help performances anyway
        if (!medianDone)
        {
            median = prevOrtho + ortho;
            median.Normalize();
            medianDone = true;
        }
        if (median == Vector2.zero)
        {
            //???
        }
        else
        {
            Vector2 A = lineFromPosition;
            Vector2 B = lineFromPosition + median;
            float   S, T;
            bool    ret;
            if (dot < 0)             //bottomQuad
            //Previous line
            {
                ret = VectorUtils.LinesIntersect(A, B, previousCursor.lineQuad.blVertice, previousCursor.lineQuad.brVertice, out S, out T);
                if ((ret) && (T >= 0) && (T <= 1))
                {
                    center = previousCursor.lineQuad.brVertice = A + S * (B - A);
                }
                //Current line
                ret = VectorUtils.LinesIntersect(A, B, lineQuad.blVertice, lineQuad.brVertice, out S, out T);
                if ((ret) && (T >= 0) && (T <= 1))
                {
                    center = lineQuad.blVertice = A + S * (B - A);
                }
            }
            else if (dot > 0)               //topQuad
            //Previous line
            {
                ret = VectorUtils.LinesIntersect(A, B, previousCursor.lineQuad.tlVertice, previousCursor.lineQuad.trVertice, out S, out T);
                if ((ret) && (T >= 0) && (T <= 1))
                {
                    center = previousCursor.lineQuad.trVertice = A + S * (B - A);
                }
                //Current line
                ret = VectorUtils.LinesIntersect(A, B, lineQuad.tlVertice, lineQuad.trVertice, out S, out T);
                if ((ret) && (T >= 0) && (T <= 1))
                {
                    center = lineQuad.tlVertice = A + S * (B - A);
                }
            }
        }
        //}

        //Draw joint
        if (jointType == FTDrawingJointStyle.BEVEL)
        {
            if (dot < 0)
            {
                FDrawingQuad quad = new FDrawingQuad(this.color);
                quad.tlVertice = previousCursor.position + prevOrtho * previousCursor.thickness * 0.5f;
                quad.blVertice = center;
                quad.brVertice = center;
                quad.trVertice = lineFromPosition + ortho * thickness * 0.5f;
                _quads.AddLast(quad);

                AddBorders(quad.tlVertice, quad.tlColor, prevOrtho, quad.trVertice, quad.trColor, ortho, true);
            }
            else if (dot > 0)
            {
                FDrawingQuad quad = new FDrawingQuad(this.color);
                quad.blVertice = previousCursor.position - prevOrtho * previousCursor.thickness * 0.5f;
                quad.tlVertice = center;
                quad.trVertice = center;
                quad.brVertice = lineFromPosition - ortho * thickness * 0.5f;
                _quads.AddLast(quad);

                AddBorders(quad.blVertice, quad.blColor, -prevOrtho, quad.brVertice, quad.brColor, -ortho, false);
            }
            else
            {
                // What else?
                // Parallel lines, no joint necessary
            }
        }
        else if (jointType == FTDrawingJointStyle.ROUND)
        {
            if (dot < 0)
            {
                float angleDiff = Mathf.Abs(Mathf.Acos(Vector2.Dot(previousCursor.direction, direction)));
                int   nbQuads   = (int)(this.thickness * 0.5f * angleDiff * 0.5f * 0.5f * 0.5f) * 2 + 2;

                float angle = 0;
                //2 triangles by quads
                float deltaAngle = 0.5f * angleDiff / nbQuads;
                for (int i = 0; i < nbQuads; i++)
                {
                    FDrawingQuad quad = new FDrawingQuad(color);
                    //FDrawingQuad quad=new FDrawingQuad(new Color(1,(float)i/(float)nbQuads,(float)i/(float)nbQuads,1));
                    quad.trVertice = center;
                    quad.brVertice = previousCursor.position + prevOrtho * thickness * 0.5f * Mathf.Cos(angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(angle);
                    angle         += deltaAngle;
                    quad.blVertice = previousCursor.position + prevOrtho * thickness * 0.5f * Mathf.Cos(angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(angle);
                    angle         += deltaAngle;
                    quad.tlVertice = previousCursor.position + prevOrtho * thickness * 0.5f * Mathf.Cos(angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(angle);
                    _quads.AddLast(quad);
                }
            }
            else if (dot > 0)
            {
                float angleDiff = Mathf.Abs(Mathf.Acos(Vector2.Dot(previousCursor.direction, direction)));
                int   nbQuads   = (int)(this.thickness * 0.5f * angleDiff * 0.5f * 0.5f * 0.5f) * 2 + 2;

                float angle = 0;
                //2 triangles by quads
                float deltaAngle = 0.5f * angleDiff / nbQuads;
                for (int i = 0; i < nbQuads; i++)
                {
                    FDrawingQuad quad = new FDrawingQuad(color);
                    //FDrawingQuad quad=new FDrawingQuad(new Color(1,(float)i/(float)nbQuads,(float)i/(float)nbQuads,1));
                    quad.trVertice = center;
                    quad.brVertice = previousCursor.position - prevOrtho * thickness * 0.5f * Mathf.Cos(-angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(-angle);
                    angle         -= deltaAngle;
                    quad.blVertice = previousCursor.position - prevOrtho * thickness * 0.5f * Mathf.Cos(-angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(-angle);
                    angle         -= deltaAngle;
                    quad.tlVertice = previousCursor.position - prevOrtho * thickness * 0.5f * Mathf.Cos(-angle) + previousCursor.direction * thickness * 0.5f * Mathf.Sin(-angle);
                    _quads.AddLast(quad);
                }
            }
            else
            {
                // What else?
                // Parallel lines, no joint necessary
            }
            if ((borders != null) && (borders.Count > 0))
            {
                throw new FutileException("Joint type " + jointType + " not suported with borders. " + supportedJointTypesWithBorders);
            }
        }
        else if (jointType == FTDrawingJointStyle.MITER)
        {
            if (dot < 0)
            {
                FDrawingQuad quad = new FDrawingQuad(this.color);
                quad.tlVertice = previousCursor.position + prevOrtho * previousCursor.thickness * 0.5f;
                quad.blVertice = center;
                quad.brVertice = lineFromPosition + ortho * thickness * 0.5f;
                bool valid;
                quad.trVertice = VectorUtils.LinesIntersectPoint(quad.tlVertice, quad.tlVertice + previousCursor.direction, quad.brVertice, quad.brVertice - direction, out valid);
                if (!valid)
                {
                    quad.trVertice = quad.brVertice;
                }
                _quads.AddLast(quad);
            }
            else if (dot > 0)
            {
                FDrawingQuad quad = new FDrawingQuad(this.color);
                quad.blVertice = previousCursor.position - prevOrtho * previousCursor.thickness * 0.5f;
                quad.tlVertice = center;
                quad.trVertice = lineFromPosition - ortho * thickness * 0.5f;
                bool valid;
                quad.brVertice = VectorUtils.LinesIntersectPoint(quad.blVertice, quad.blVertice - previousCursor.direction, quad.trVertice, quad.trVertice + direction, out valid);
                if (!valid)
                {
                    quad.brVertice = quad.trVertice;
                }
                _quads.AddLast(quad);
            }
            else
            {
                // What else?
                // Parallel lines, no joint necessary
            }
            if ((borders != null) && (borders.Count > 0))
            {
                throw new FutileException("Joint type " + jointType + " not suported with borders. " + supportedJointTypesWithBorders);
            }
        }
    }