Exemplo n.º 1
0
        override protected void Update()
        {
            PixelColor stitchcolor = General.Colors.Highlight;
            PixelColor losecolor   = General.Colors.Selection;

            // We WANT snaptogrid and DON'T WANT snaptonearest when lock to grid is enabled
            snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState;             //mxd
            snaptogrid    = (snaptocardinaldirection || gridlockmode != GridLockMode.NONE || (General.Interface.ShiftState ^ General.Interface.SnapToGrid));
            snaptonearest = (gridlockmode == GridLockMode.NONE && (General.Interface.CtrlState ^ General.Interface.AutoMerge));

            DrawnVertex curp = GetCurrentPosition();

            Vector2D curvertexpos = curp.pos;
            float    vsize        = (renderer.VertexSize + 1.0f) / renderer.Scale;

            curp.pos = curp.pos.GetRotated(-General.Map.Grid.GridRotate);

            // Render drawing lines
            if (renderer.StartOverlay(true))
            {
                PixelColor color = snaptonearest ? stitchcolor : losecolor;

                if (points.Count == 1)
                {
                    UpdateReferencePoints(points[0], curp);
                    List <Vector2D[]> shapes = GetShapes(start, end);

                    Vector2D startrotated = start.GetRotated(General.Map.Grid.GridRotate);
                    Vector2D endrotated   = end.GetRotated(General.Map.Grid.GridRotate);

                    // Rotate the shape to fit the grid rotation
                    foreach (Vector2D[] shape in shapes)
                    {
                        for (int i = 0; i < shape.Length; i++)
                        {
                            shape[i] = shape[i].GetRotated(General.Map.Grid.GridRotate);
                        }
                    }

                    // Render guidelines
                    if (showguidelines)
                    {
                        RenderGuidelines(startrotated, endrotated, General.Colors.Guideline.WithAlpha(80), -General.Map.Grid.GridRotate);
                    }

                    //render shape
                    foreach (Vector2D[] shape in shapes)
                    {
                        for (int i = 1; i < shape.Length; i++)
                        {
                            renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true);
                        }
                    }

                    //vertices
                    foreach (Vector2D[] shape in shapes)
                    {
                        for (int i = 0; i < shape.Length; i++)
                        {
                            renderer.RenderRectangleFilled(new RectangleF((float)(shape[i].x - vsize), (float)(shape[i].y - vsize), vsize * 2.0f, vsize * 2.0f), color, true);
                        }
                    }

                    //and labels
                    if (width == 0 || height == 0)
                    {
                        // Render label for line
                        labels[0].Move(startrotated, endrotated);
                        renderer.RenderText(labels[0].TextLabel);
                    }
                    else
                    {
                        // Render labels for grid
                        Vector2D[] labelCoords = { startrotated, new Vector2D(end.x, start.y).GetRotated(General.Map.Grid.GridRotate), endrotated, new Vector2D(start.x, end.y).GetRotated(General.Map.Grid.GridRotate), startrotated };

                        for (int i = 1; i < 5; i++)
                        {
                            labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]);
                            renderer.RenderText(labels[i - 1].TextLabel);
                        }
                    }

                    //render hint
                    if (horizontalslices > 1 || verticalslices > 1)
                    {
                        string text = "H: " + (slicesH - 1) + "; V: " + (slicesV - 1);
                        if (Math.Abs(width) > text.Length * vsize && Math.Abs(height) > 16 * vsize)
                        {
                            hintlabel.Text = text;
                            hintlabel.Move(startrotated, endrotated);
                            renderer.RenderText(hintlabel.TextLabel);
                        }
                    }
                }
                else
                {
                    // Render vertex at cursor
                    renderer.RenderRectangleFilled(new RectangleF((float)(curvertexpos.x - vsize), (float)(curvertexpos.y - vsize), vsize * 2.0f, vsize * 2.0f), color, true);
                }

                // Done
                renderer.Finish();
            }

            // Done
            renderer.Present();
        }
Exemplo n.º 2
0
        override protected void Update()
        {
            PixelColor stitchcolor = General.Colors.Highlight;
            PixelColor losecolor   = General.Colors.Selection;

            snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState;             //mxd
            snaptogrid    = (snaptocardinaldirection || General.Interface.ShiftState ^ General.Interface.SnapToGrid);
            snaptonearest = General.Interface.CtrlState ^ General.Interface.AutoMerge;

            DrawnVertex curp  = GetCurrentPosition();
            float       vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;

            // Render drawing lines
            if (renderer.StartOverlay(true))
            {
                PixelColor color = snaptonearest ? stitchcolor : losecolor;

                if (points.Count == 1)
                {
                    UpdateReferencePoints(points[0], curp);
                    Vector2D[] shape = GetShape(start, end);

                    //render shape
                    for (int i = 1; i < shape.Length; i++)
                    {
                        renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true);
                    }

                    //vertices
                    for (int i = 0; i < shape.Length; i++)
                    {
                        renderer.RenderRectangleFilled(new RectangleF(shape[i].x - vsize, shape[i].y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);
                    }

                    //and labels
                    Vector2D[] labelCoords = new[] { start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start };
                    for (int i = 1; i < 5; i++)
                    {
                        labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]);
                        renderer.RenderText(labels[i - 1].TextLabel);
                    }

                    //got beveled corners?
                    if (alwaysrendershapehints || shape.Length > minpointscount + 1)
                    {
                        //render hint
                        if (width > 64 * vsize && height > 16 * vsize)
                        {
                            hintlabel.Move(start, end);
                            hintlabel.Text = GetHintText();
                            renderer.RenderText(hintlabel.TextLabel);
                        }

                        //and shape corners
                        for (int i = 0; i < 4; i++)
                        {
                            renderer.RenderRectangleFilled(new RectangleF(labelCoords[i].x - vsize, labelCoords[i].y - vsize, vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine, true);
                        }
                    }
                }
                else
                {
                    // Render vertex at cursor
                    renderer.RenderRectangleFilled(new RectangleF(curp.pos.x - vsize, curp.pos.y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);
                }

                // Done
                renderer.Finish();
            }

            // Done
            renderer.Present();
        }
        override protected void Update()
        {
            if (blockupdate)
            {
                return;
            }

            PixelColor stitchcolor = General.Colors.Highlight;
            PixelColor losecolor   = General.Colors.Selection;

            snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState;             //mxd
            snaptogrid    = (snaptocardinaldirection || General.Interface.ShiftState ^ General.Interface.SnapToGrid);
            snaptonearest = General.Interface.CtrlState ^ General.Interface.AutoMerge;

            DrawnVertex curp         = GetCurrentPosition();
            Vector2D    curvertexpos = curp.pos;
            float       vsize        = (renderer.VertexSize + 1.0f) / renderer.Scale;

            curp.pos = curp.pos.GetRotated(-General.Map.Grid.GridRotate);

            // Render drawing lines
            if (renderer.StartOverlay(true))
            {
                PixelColor color = snaptonearest ? stitchcolor : losecolor;

                if (points.Count == 1)
                {
                    UpdateReferencePoints(points[0], curp);

                    Vector2D[] shape = GetShape(start, end);

                    Vector2D startrotated = start.GetRotated(General.Map.Grid.GridRotate);
                    Vector2D endrotated   = end.GetRotated(General.Map.Grid.GridRotate);

                    // Rotate the shape to fit the grid rotation
                    for (int i = 0; i < shape.Length; i++)
                    {
                        shape[i] = shape[i].GetRotated(General.Map.Grid.GridRotate);
                    }

                    // Render guidelines
                    if (showguidelines)
                    {
                        RenderGuidelines(startrotated, endrotated, General.Colors.Guideline.WithAlpha(80), -General.Map.Grid.GridRotate);
                    }

                    //render shape
                    for (int i = 1; i < shape.Length; i++)
                    {
                        renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true);
                    }

                    //vertices
                    for (int i = 0; i < shape.Length; i++)
                    {
                        renderer.RenderRectangleFilled(new RectangleF((float)(shape[i].x - vsize), (float)(shape[i].y - vsize), vsize * 2.0f, vsize * 2.0f), color, true);
                    }

                    //and labels
                    if (shape.Length == 2)
                    {
                        // Render label for line
                        labels[0].Move(startrotated, endrotated);
                        renderer.RenderText(labels[0].TextLabel);
                    }
                    else if (shape.Length > 3)
                    {
                        // Render labels for rectangle
                        Vector2D[] labelCoords = { startrotated, new Vector2D(end.x, start.y).GetRotated(General.Map.Grid.GridRotate), endrotated, new Vector2D(start.x, end.y).GetRotated(General.Map.Grid.GridRotate), startrotated };

                        for (int i = 1; i < 5; i++)
                        {
                            labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]);
                            renderer.RenderText(labels[i - 1].TextLabel);
                        }

                        //got beveled corners?
                        if (alwaysrendershapehints || shape.Length > minpointscount + 1)
                        {
                            //render hint
                            if (width > 64 * vsize && height > 16 * vsize)
                            {
                                hintlabel.Move(startrotated, endrotated);
                                hintlabel.Text = GetHintText();
                                renderer.RenderText(hintlabel.TextLabel);
                            }

                            //and shape corners
                            for (int i = 0; i < 4; i++)
                            {
                                renderer.RenderRectangleFilled(new RectangleF((float)(labelCoords[i].x - vsize), (float)(labelCoords[i].y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine, true);
                            }
                        }
                    }
                    else
                    {
                        // Render vertex at points[0]
                        renderer.RenderRectangleFilled(new RectangleF((float)(start.x - vsize), (float)(start.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine, true);
                    }
                }
                else
                {
                    // Render vertex at cursor
                    renderer.RenderRectangleFilled(new RectangleF((float)(curvertexpos.x - vsize), (float)(curvertexpos.y - vsize), vsize * 2.0f, vsize * 2.0f), color, true);
                }

                // Done
                renderer.Finish();
            }

            // Done
            renderer.Present();
        }
Exemplo n.º 4
0
        //mxd
        public override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            // Anything to do?
            if ((!selectpressed && !editpressed) || closestline == null)
            {
                hintlabel.Text = string.Empty;
                return;
            }

            // Do something...
            Vector2D perpendicular = closestline.Line.GetPerpendicular().GetNormal();

            if (panel.Distance != 0)
            {
                perpendicular *= panel.Distance;                                 // Special cases...
            }
            Vector2D center         = closestline.GetCenterPoint();
            Line2D   radius         = new Line2D(center, center - perpendicular);
            float    u              = radius.GetNearestOnLine(mousemappos - mousedownoffset);
            int      dist           = (panel.Distance == 0 ? 1 : panel.Distance); // Special cases...
            int      offset         = (int)Math.Round(dist * u - dist);
            bool     updaterequired = false;

            // Clamp values?
            bool clampvalue = !General.Interface.ShiftState;

            // Change verts amount
            if (selectpressed && editpressed)
            {
                if (prevoffset != 0)
                {
                    // Set new verts count without triggering the update...
                    panel.SetValues(panel.Vertices + Math.Sign(prevoffset - offset), panel.Distance, panel.Angle, panel.FixedCurve);

                    // Update hint text
                    hintlabel.Text = "Vertices: " + panel.Vertices;
                    updaterequired = true;
                }
            }
            // Change distance
            else if (selectpressed && !panel.FixedCurve)
            {
                if (float.IsNaN(u))
                {
                    // Set new distance without triggering the update...
                    panel.SetValues(panel.Vertices, 0, panel.Angle, panel.FixedCurve);                     // Special cases...
                }
                else
                {
                    int newoffset;
                    if (clampvalue)
                    {
                        newoffset = (panel.Distance + offset) / panel.DistanceIncrement * panel.DistanceIncrement;                         // Clamp to 8 mu increments
                    }
                    else
                    {
                        newoffset = panel.Distance + offset;
                    }

                    // Set new distance without triggering the update...
                    panel.SetValues(panel.Vertices, newoffset, panel.Angle, panel.FixedCurve);
                }

                // Update hint text
                hintlabel.Text = "Distance: " + panel.Distance;
                updaterequired = true;
            }
            // Change angle
            else if (editpressed && prevoffset != 0)
            {
                int newangle = 0;
                if (panel.FixedCurve)
                {
                    // Flip required?
                    if (panel.Angle == 0 && (Math.Sign(offset - prevoffset) != Math.Sign(panel.Distance)))
                    {
                        // Set new distance without triggering the update...
                        panel.SetValues(panel.Vertices, -panel.Distance, panel.Angle, panel.FixedCurve);

                        // Recalculate affected values...
                        perpendicular *= -1;
                        radius.v2      = center - perpendicular;
                        u              = radius.GetNearestOnLine(mousemappos - mousedownoffset);
                    }

                    //TODO: there surely is a way to get new angle without iteration...
                    float targetoffset = radius.GetLength() * u;
                    float prevdiff     = float.MaxValue;
                    int   increment    = (clampvalue ? panel.AngleIncrement : 1);
                    for (int i = 1; i < panel.MaximumAngle; i += increment)
                    {
                        // Calculate diameter for current angle...
                        float ma = Angle2D.DegToRad(i);
                        float d  = (closestline.Length / (float)Math.Tan(ma / 2f)) / 2;
                        float D  = d / (float)Math.Cos(ma / 2f);
                        float h  = D - d;

                        float curdiff = Math.Abs(h - targetoffset);

                        // This one matches better...
                        if (curdiff < prevdiff)
                        {
                            newangle = i;
                        }
                        prevdiff = curdiff;
                    }

                    // Clamp to 5 deg increments
                    if (clampvalue)
                    {
                        newangle = (newangle / panel.AngleIncrement) * panel.AngleIncrement;
                    }
                }
                else
                {
                    int diff = (int)Math.Round((offset - prevoffset) * renderer.Scale);
                    if (panel.Angle + diff > 0)
                    {
                        if (clampvalue)
                        {
                            newangle = (panel.Angle / panel.AngleIncrement + Math.Sign(diff)) * panel.AngleIncrement;                                    // Clamp to 5 deg increments
                        }
                        else
                        {
                            newangle = panel.Angle + diff;
                        }
                    }
                }

                // Set new angle without triggering the update...
                panel.SetValues(panel.Vertices, panel.Distance, newangle, panel.FixedCurve);

                // Update hint text
                hintlabel.Text = "Angle: " + panel.Angle;
                updaterequired = true;
            }

            // Update UI
            if (updaterequired)
            {
                // Update label position
                float labeldistance;

                if (panel.Angle == 0)
                {
                    labeldistance = 0;                     // Special cases!
                }
                else if (panel.FixedCurve)
                {
                    float ma = Angle2D.DegToRad(panel.Angle);
                    float d  = (closestline.Length / (float)Math.Tan(ma / 2f)) / 2;
                    float D  = d / (float)Math.Cos(ma / 2f);
                    labeldistance = D - d;
                }
                else
                {
                    labeldistance = Math.Abs(panel.Distance);
                }

                labeldistance += 16 / renderer.Scale;
                Vector2D labelpos = radius.GetCoordinatesAt(labeldistance / radius.GetLength());
                hintlabel.Move(labelpos, labelpos);

                // Trigger update
                OnValuesChanged(null, EventArgs.Empty);
            }

            // Store current offset
            prevoffset = offset;
        }
Exemplo n.º 5
0
        protected override void Update()
        {
            PixelColor stitchcolor = General.Colors.Highlight;
            PixelColor losecolor   = General.Colors.Selection;

            snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState;
            snaptogrid    = snaptocardinaldirection || General.Interface.ShiftState ^ General.Interface.SnapToGrid;
            snaptonearest = General.Interface.CtrlState ^ General.Interface.AutoMerge;

            DrawnVertex curp  = GetCurrentPosition();
            float       vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;

            // Update label positions (mxd)
            if (labels.Count > 0)
            {
                // Update labels for already drawn lines
                for (int i = 0; i < labels.Count - 1; i++)
                {
                    labels[i].Move(points[i].pos, points[i + 1].pos);
                }

                // Update label for active line
                labels[labels.Count - 1].Move(points[points.Count - 1].pos, curp.pos);
            }

            // Render drawing lines
            if (renderer.StartOverlay(true))
            {
                // Go for all points to draw lines
                if (points.Count > 0)
                {
                    //update curve
                    List <Vector2D> verts = new List <Vector2D>();
                    for (int i = 0; i < points.Count; i++)
                    {
                        verts.Add(points[i].pos);
                    }
                    if (curp.pos != verts[verts.Count - 1])
                    {
                        verts.Add(curp.pos);
                    }
                    curve = CurveTools.CurveThroughPoints(verts, 0.5f, 0.75f, segmentlength);

                    // Render lines
                    for (int i = 1; i < curve.Shape.Count; i++)
                    {
                        // Determine line color
                        PixelColor c = snaptonearest ? stitchcolor : losecolor;

                        // Render line
                        renderer.RenderLine(curve.Shape[i - 1], curve.Shape[i], LINE_THICKNESS, c, true);
                    }

                    //render "inactive" vertices
                    for (int i = 1; i < curve.Shape.Count - 1; i++)
                    {
                        // Determine vertex color
                        PixelColor c = !snaptonearest ? stitchcolor : losecolor;

                        // Render vertex
                        renderer.RenderRectangleFilled(new RectangleF(curve.Shape[i].x - vsize, curve.Shape[i].y - vsize, vsize * 2.0f, vsize * 2.0f), c, true);
                    }
                }

                if (points.Count > 0)
                {
                    // Render vertices
                    for (int i = 0; i < points.Count; i++)
                    {
                        // Determine vertex color
                        PixelColor c = points[i].stitch ? stitchcolor : losecolor;

                        // Render vertex
                        renderer.RenderRectangleFilled(new RectangleF(points[i].pos.x - vsize, points[i].pos.y - vsize, vsize * 2.0f, vsize * 2.0f), c, true);
                    }
                }

                // Determine point color
                PixelColor color = snaptonearest ? stitchcolor : losecolor;

                // Render vertex at cursor
                renderer.RenderRectangleFilled(new RectangleF(curp.pos.x - vsize, curp.pos.y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);

                // Render labels
                renderer.RenderText(labels.ToArray());

                //Render info label
                Vector2D start = new Vector2D(mousemappos.x + (32 / renderer.Scale), mousemappos.y - (16 / renderer.Scale));
                Vector2D end   = new Vector2D(mousemappos.x + (96 / renderer.Scale), mousemappos.y);
                hintlabel.Move(start, end);
                hintlabel.Text = "SEG LEN: " + segmentlength;
                renderer.RenderText(hintlabel.TextLabel);

                // Done
                renderer.Finish();
            }

            // Done
            renderer.Present();
        }
Exemplo n.º 6
0
        override protected void Update()
        {
            PixelColor stitchcolor = General.Colors.Highlight;
            PixelColor losecolor   = General.Colors.Selection;

            // We WANT snaptogrid and DON'T WANT snaptonearest when lock to grid is enabled
            snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState;             //mxd
            snaptogrid    = (snaptocardinaldirection || gridlockmode != GridLockMode.NONE || (General.Interface.ShiftState ^ General.Interface.SnapToGrid));
            snaptonearest = (gridlockmode == GridLockMode.NONE && (General.Interface.CtrlState ^ General.Interface.AutoMerge));

            DrawnVertex curp;

            if (points.Count == 1)
            {
                // Handle the case when start point is not on current grid.
                Vector2D gridoffset = General.Map.Grid.SnappedToGrid(points[0].pos) - points[0].pos;
                curp      = GetCurrentPosition(mousemappos + gridoffset, snaptonearest, snaptogrid, snaptocardinaldirection, usefourcardinaldirections, renderer, points);
                curp.pos -= gridoffset;
            }
            else
            {
                curp = GetCurrentPosition();
            }

            float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;

            // Render drawing lines
            if (renderer.StartOverlay(true))
            {
                PixelColor color = snaptonearest ? stitchcolor : losecolor;

                if (points.Count == 1)
                {
                    UpdateReferencePoints(points[0], curp);
                    List <Vector2D[]> shapes = GetShapes(start, end);

                    //render shape
                    foreach (Vector2D[] shape in shapes)
                    {
                        for (int i = 1; i < shape.Length; i++)
                        {
                            renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true);
                        }
                    }

                    //vertices
                    foreach (Vector2D[] shape in shapes)
                    {
                        for (int i = 0; i < shape.Length; i++)
                        {
                            renderer.RenderRectangleFilled(new RectangleF(shape[i].x - vsize, shape[i].y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);
                        }
                    }

                    //and labels
                    Vector2D[] labelCoords = new[] { start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start };
                    for (int i = 1; i < 5; i++)
                    {
                        labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]);
                        renderer.RenderText(labels[i - 1].TextLabel);
                    }

                    //render hint
                    if (horizontalslices > 1 || verticalslices > 1)
                    {
                        string text = "H: " + (slicesH - 1) + "; V: " + (slicesV - 1);
                        if (width > text.Length * vsize && height > 16 * vsize)
                        {
                            hintlabel.Text = text;
                            hintlabel.Move(start, end);
                            renderer.RenderText(hintlabel.TextLabel);
                        }
                    }
                }
                else
                {
                    // Render vertex at cursor
                    renderer.RenderRectangleFilled(new RectangleF(curp.pos.x - vsize, curp.pos.y - vsize, vsize * 2.0f, vsize * 2.0f), color, true);
                }

                // Done
                renderer.Finish();
            }

            // Done
            renderer.Present();
        }