Ejemplo n.º 1
0
    /// <summary>
    /// 創造角色的函式(會出現在場上)
    /// </summary>
    /// <param name="_builder"></param>
    /// <returns></returns>
    public Figure CreateFigure(FigureBuilder _builder)
    {
        Figure newFigure = null;

        if (_builder.Name.Contains("MeatBall"))
        {
            newFigure = new MeatBall(_builder);
        }
        else
        {
            newFigure = new Figure(_builder);
        };


        if (figurePool.ContainsKey(_builder.Name))
        {
            return(figurePool[_builder.Name][0]);
        }
        else
        {
            List <Figure> figureList = new List <Figure>();
            figureList.Add(newFigure);
            figurePool.Add(_builder.Name, figureList);
            OnCreateFigure(newFigure);
            return(newFigure);
        }
    }
Ejemplo n.º 2
0
 /// <summary>Construct the builder</summary>
 public PathBuilder()
 {
     data     = new List <float>();
     segments = new List <sPathSegment>();
     figures  = new List <sPathFigure>();
     fb       = new FigureBuilder(this);
 }
Ejemplo n.º 3
0
 internal PathBuilder(int expectedFloats, int expectedSegments)
 {
     data     = new List <float>(expectedFloats);
     segments = new List <sPathSegment>(expectedSegments);
     figures  = new List <sPathFigure>(1);
     fb       = new FigureBuilder(this);
 }
Ejemplo n.º 4
0
        /// <summary>
        /// Действия по двойному клику на фигурах
        /// Обычно, это действие по умолчанию
        /// </summary>
        /// <param name="location"></param>
        /// <param name="modifierKeys"></param>
        public void OnDblClick(Point location, Keys modifierKeys)
        {
            var point = Point.Ceiling(new PointF(location.X / ScaleFactor, location.Y / ScaleFactor));

            if (RibbonLineUpdated(point))
            {
                // добавляем полилинию
                var line         = new Figure();
                var lineGeometry = _selection.Geometry as AddLineGeometry;
                if (lineGeometry != null)
                {
                    if (lineGeometry.IsSmoothed)
                    {
                        var points = lineGeometry.Path.Path.PathPoints;
                        var types  = lineGeometry.Path.Path.PathTypes;
                        Helper.CutLastBezierPoints(ref points, ref types);
                        FigureBuilder.BuildBezierGeometry(line, points, types);
                    }
                    else
                    {
                        var points = lineGeometry.Points.ToArray();
                        FigureBuilder.BuildPolyGeometry(line, lineGeometry.IsClosed, points);
                    }
                    OnLayerStartChanging();
                    _layer.Figures.Add(line);
                    OnLayerChanged();
                }
                return;
            }
        }
Ejemplo n.º 5
0
 public Figure2 create(FigureBuilder figureBuilder)
 {
     figureBuilder.CreateFigure();
     figureBuilder.SetColor();
     figureBuilder.SetArea();
     return(figureBuilder.figure2);
 }
        /// <summary>
        /// Создаём новую фигуру
        /// </summary>
        /// <param name="location">Позиция мышки</param>
        private void CreateFigure(Point location)
        {
            //создаем новую фигуру
            var newFig = CreateFigureRequest();

            if (newFig == null)
            {
                return;
            }
            var pg = newFig.Geometry as PolygoneGeometry;

            if (pg != null)
            {
                if (!(_selection.Geometry is AddLineGeometry))
                {
                    FigureBuilder.BuildAddLineGeometry(_selection, location, pg.IsClosed);
                }
                EditorMode          = EditorMode.AddLine;
                CreateFigureRequest = null;
                return;
            }
            // сразу смещаем на половину размера, чтобы левый верхний угол был в точке мышки
            newFig.Transform.Matrix.Translate(location.X + 0.5f, location.Y + 0.5f);
            _layer.Figures.Add(newFig);
            _selection.Add(newFig);
            CreateFigureRequest = null;
            OnSelectedFigureChanged();
        }
Ejemplo n.º 7
0
    public Figure(FigureBuilder _builder)
    {
        Behavior      = _builder.GameObjectOnScene.GetComponent <FigureBehavior>();
        myValue       = _builder.Value;
        Behavior.name = _builder.Name;
        InputType     = _builder.Type;
        AttackNumber  = _builder.AttackNumber;

        Initial();
    }
Ejemplo n.º 8
0
        public void SelectionFigureTestMethod()
        {
            //создаем первую фигуру
            var fig1 = new Figure();

            fig1.Transform.Matrix.Translate(50, 50);
            fig1.Transform.Matrix.Scale(100, 100);
            FigureBuilder.BuildEllipseGeometry(fig1);

            //создаем вторую фигуру
            var fig2 = new Figure();

            fig2.Transform.Matrix.Translate(150, 150);
            fig2.Transform.Matrix.Scale(100, 100);
            FigureBuilder.BuildRectangleGeometry(fig2);

            //рисуем до выделения
            Draw("1_1.png", fig1, fig2);

            //создаем selection
            var selection = new Selection();

            selection.Style.BorderStyle.Width = 1;
            selection.Style.BorderStyle.Color = Color.Magenta;

            //выделяем фигуры
            selection.Add(fig1);
            selection.Add(fig2);

            //рисуем после выделения
            Draw("1_2.png", fig1, fig2, selection);

            //вращаем и выделенные фигуры
            Matrix m = selection.Transform;

            m.RotateAt(45, new PointF(100, 100));
            selection.PushTransformToSelectedFigures();

            //рисуем после вращения выделенных фигур
            Draw("1_3.png", fig1, fig2, selection);

            //перемещаем выделенные фигуры
            m = selection.Transform;
            m.Translate(0, 100);
            selection.PushTransformToSelectedFigures();

            //рисуем после перемещения выделенных фигур
            Draw("1_4.png", fig1, fig2, selection);

            //снимаем выделение, отрисовываем результат
            selection.Clear();
            Draw("1_5.png", fig1, fig2, selection);
        }
Ejemplo n.º 9
0
        /// <summary>Clear everything built. This way you can reuse the builder to build multiple paths, saves non-trivial amount of CPU time wasted on GC.</summary>
        public void clear()
        {
            if (fb.isOpen)
            {
                throw new ApplicationException("You must dispose the current figure before calling PathBuilder.clear()");
            }

            data.Clear();
            segments.Clear();
            figures.Clear();
            fillMode = eFillMode.Winding;
            fb       = new FigureBuilder(this);
        }
Ejemplo n.º 10
0
        public GLPainter()
        {
            CurrentFont = PixelFarm.Drawing.GLES2.GLES2Platform.DefaultFont;
            UseVertexBufferObjectForRenderVx = true;
            //tools
            _pathRenderVxBuilder  = new FigureBuilder();
            _defaultBrush         = _currentBrush = new SolidBrush(Color.Black); //default brush
            _pathRenderVxBuilder2 = new PathRenderVxBuilder2();


            //default
            _mySimpleGLBitmapAtlas = new CpuBlit.BitmapAtlas.MySimpleGLBitmapAtlasManager(CpuBlit.BitmapAtlas.TextureKind.Bitmap);
            SetBitmapAtlasManager(_mySimpleGLBitmapAtlas);
        }
Ejemplo n.º 11
0
    public MeatBall(FigureBuilder _builder) : base(_builder)
    {
        MeatBallBuilder builder = _builder as MeatBallBuilder;

        myBehavior = _builder.GameObjectOnScene.GetComponent <MeatBallBehavior>();
        myBehavior.myMeatBallFigure = this;

        if (builder == null || !(builder is MeatBallBuilder))
        {
            SetSet(MeatBallSetFactory.Instance.GetSetObject(MeatBallSetFactory.SetType.Orgin));
        }
        else
        {
            SetSet(MeatBallSetFactory.Instance.GetSetObject(builder.Set));
        }
    }
Ejemplo n.º 12
0
        public void EllipseFigureTestMethod()
        {
            var oval = new Figure();

            oval.Transform.Matrix.Translate(100, 50);
            oval.Transform.Matrix.Scale(160, 80);
            // настраиваем геометрию на круг
            FigureBuilder.BuildEllipseGeometry(oval);
            // проверим, что все внутренние классы были подключены
            CheckInternalClassesConnection(oval);
            oval = SerializeDeserialize(oval);
            // пробуем отрисовывать
            using (var bmp = new Bitmap(200, 100))
            {
                using (var canvas = Graphics.FromImage(bmp))
                    oval.Renderer.Render(canvas, oval);
                bmp.Save("EllipseFigure.png");
            }
        }
Ejemplo n.º 13
0
        public void RectangleFigureTestMethod()
        {
            var rect = new Figure();

            rect.Transform.Matrix.Translate(100, 50);
            rect.Transform.Matrix.Scale(160, 80);
            // настраиваем геометрию на квадрат
            FigureBuilder.BuildRectangleGeometry(rect);
            // проверим, что все внутренние классы были подключены
            CheckInternalClassesConnection(rect);
            rect = SerializeDeserialize(rect);
            // пробуем отрисовывать
            using (var bmp = new Bitmap(200, 100))
            {
                using (var canvas = Graphics.FromImage(bmp))
                    rect.Renderer.Render(canvas, rect);
                bmp.Save("RectangleFigure.png");
            }
        }
Ejemplo n.º 14
0
        public void TextFigureTestMethod()
        {
            var textfigure = new Figure();

            textfigure.Transform.Matrix.Translate(10, 10);
            // настраиваем геометрию на текст
            FigureBuilder.BuildTextGeometry(textfigure,
                                            "The test for text string rendering complete.");
            // проверим, что все внутренние классы были подключены
            CheckInternalClassesConnection(textfigure);
            textfigure = SerializeDeserialize(textfigure);
            // пробуем отрисовывать
            using (var bmp = new Bitmap(200, 100))
            {
                using (var canvas = Graphics.FromImage(bmp))
                    textfigure.Renderer.Render(canvas, textfigure);
                bmp.Save("TextFigure.png");
            }
        }
Ejemplo n.º 15
0
        /// <summary>
        /// Выбор фигур для последующего создания
        /// </summary>
        private void btnCreateFigure_Click(object sender, EventArgs e)
        {
            _selectionController.Clear();
            Func <Figure> figureCreator       = null;
            Cursor        figureCreatorCursor = CursorFactory.GetCursor(UserCursor.SelectByRibbonRect);

            if (sender == tsbPointer)
            {
                figureCreatorCursor = Cursors.Default;
                Cursor             = Cursors.Default;
                tsbPointer.Enabled = false;

                _selectionController.CreateFigureCursor  = figureCreatorCursor;
                _selectionController.CreateFigureRequest = figureCreator;
                return;
            }
            tsbPointer.Enabled = true;
            //
            if (sender == btnRectangle || sender == tsbRect)
            {
                figureCreatorCursor = Cursor = CursorFactory.GetCursor(UserCursor.CreateRect);
                figureCreator       = () =>
                {
                    var fig = new Figure();
                    FigureBuilder.BuildRectangleGeometry(fig);
                    return(fig);
                };
            }
            else if (sender == btnRoundedRectangle)
            {
                figureCreatorCursor = Cursor = CursorFactory.GetCursor(UserCursor.CreateRect);
                figureCreator       = () =>
                {
                    var fig = new Figure();
                    FigureBuilder.BuildRoundedRectangleGeometry(fig, 0.25f);
                    return(fig);
                };
            }
            //
            _selectionController.CreateFigureCursor  = figureCreatorCursor;
            _selectionController.CreateFigureRequest = figureCreator;
        }
        /// <summary>
        /// Действия по двойному клику на фигурах
        /// Обычно, это действие по умолчанию
        /// </summary>
        /// <param name="location"></param>
        /// <param name="modifierKeys"></param>
        public void OnDblClick(Point location, Keys modifierKeys)
        {
            var point = Point.Ceiling(new PointF(location.X / ScaleFactor, location.Y / ScaleFactor));

            if (RibbonLineUpdated(point))
            {
                // добавляем полилинию
                var line         = new Figure();
                var lineGeometry = _selection.Geometry as AddLineGeometry;
                if (lineGeometry != null)
                {
                    var points = lineGeometry.Points.ToArray();
                    FigureBuilder.BuildPolyGeometry(line, lineGeometry.IsClosed, points);
                    OnLayerStartChanging();
                    _layer.Figures.Add(line);
                    OnLayerChanged();
                }
                return;
            }
        }
Ejemplo n.º 17
0
        void DrawOutput(Painter painter, Typeface typeface, char selectedChar)
        {
#if DEBUG
            painter.Clear(Color.White);

            //this is a demo.
            //
            float fontSizeInPts = 300;
            _glyphPathBuilder.BuildFromGlyphIndex(typeface.GetGlyphIndex(selectedChar), fontSizeInPts);

            var prevColor = painter.StrokeColor;
            painter.StrokeColor = Color.Black;
            using (Tools.BorrowVxs(out var v1))
            {
                _glyphPathBuilder.ReadShapes(_tovxs);
                _tovxs.WriteOutput(v1); //write content from GlyphTranslator to v1

                painter.Fill(v1, KnownColors.Gray);
                _tovxs.Reset();

                //tess the vxs

                FigureBuilder         figBuilder    = new FigureBuilder();
                FigureContainer       container     = figBuilder.Build(v1);
                TessTriangleTechnique tessTechnique = TessTriangleTechnique.DrawElement;

                if (container.IsSingleFigure)
                {
                    Figure figure = container._figure;
                    if (Tess == GlyphDemo_TessTech.SgiTess)
                    {
                        //coords of tess triangles
                        switch (tessTechnique)
                        {
                        case TessTriangleTechnique.DrawArray:
                        {
                            painter.dbugDrawTessTriangles(figure.GetAreaTess(_tessTool, _tessTool.WindingRuleType, TessTriangleTechnique.DrawArray));
                        }
                        break;

                        case TessTriangleTechnique.DrawElement:
                        {
                            float[]  tessArea = figure.GetAreaTess(_tessTool, _tessTool.WindingRuleType, TessTriangleTechnique.DrawElement);
                            ushort[] index    = figure.GetAreaIndexList();
                            painter.dbugDrawTessTriangles(tessArea, index);
                        }
                        break;
                        }
                    }
                    else
                    {
                        if (ContourAnalysis)
                        {
                            ContourAnalyzer     analyzer1 = new ContourAnalyzer();
                            IntermediateOutline outline   = analyzer1.CreateIntermediateOutline(v1);

                            GlyphDebugContourVisualizer dbugVisualizer = new GlyphDebugContourVisualizer();
                            dbugVisualizer.SetPainter(painter);
                            dbugVisualizer.Scale = _typeface.CalculateScaleToPixelFromPointSize(fontSizeInPts);
                            dbugVisualizer.WalkCentroidLine(outline);
                        }
                        else
                        {
                            //Poly2Tri
                            List <Poly2Tri.Polygon> polygons = figure.GetTrianglulatedArea(false);
                            //draw polygon
                            painter.StrokeColor = Color.Red;
                            painter.dbugDrawPoly2TriPolygon(polygons);
                        }
                    }
                }
                else
                {
                    MultiFigures multiFig = container._multiFig;
                    if (Tess == GlyphDemo_TessTech.SgiTess)
                    {
                        switch (tessTechnique)
                        {
                        case TessTriangleTechnique.DrawArray:
                        {
                            painter.dbugDrawTessTriangles(multiFig.GetAreaTess(_tessTool, _tessTool.WindingRuleType, TessTriangleTechnique.DrawArray));
                        }
                        break;

                        case TessTriangleTechnique.DrawElement:
                        {
                            float[]  tessArea = multiFig.GetAreaTess(_tessTool, _tessTool.WindingRuleType, TessTriangleTechnique.DrawElement);
                            ushort[] index    = multiFig.GetAreaIndexList();
                            painter.dbugDrawTessTriangles(tessArea, index);
                        }
                        break;
                        }
                    }
                    else
                    {
                        if (ContourAnalysis)
                        {
                            ContourAnalyzer     analyzer1 = new ContourAnalyzer();
                            IntermediateOutline outline   = analyzer1.CreateIntermediateOutline(v1);

                            GlyphDebugContourVisualizer dbugVisualizer = new GlyphDebugContourVisualizer();
                            dbugVisualizer.SetPainter(painter);
                            dbugVisualizer.Scale = _typeface.CalculateScaleToPixelFromPointSize(fontSizeInPts);
                            dbugVisualizer.WalkCentroidLine(outline);
                        }
                        else
                        {
                            List <Poly2Tri.Polygon> polygons = multiFig.GetTrianglulatedArea(false);
                            painter.StrokeColor = Color.Red;
                            painter.dbugDrawPoly2TriPolygon(polygons);
                        }
                    }
                }
            }
            painter.StrokeColor = prevColor;
            //-------------



            //tess
            //if (rdoTessSGI.Checked)
            //{

            //    //SGI Tess Lib

            //    if (!_tessTool.TessPolygon(polygon1, _contourEnds))
            //    {
            //        return;
            //    }
            //    //1.
            //    List<ushort> indexList = _tessTool.TessIndexList;
            //    //2.
            //    List<TessVertex2d> tempVertexList = _tessTool.TempVertexList;
            //    //3.
            //    int vertexCount = indexList.Count;
            //    //-----------------------------
            //    int orgVertexCount = polygon1.Length / 2;
            //    float[] vtx = new float[vertexCount * 2];//***
            //    int n = 0;

            //    for (int p = 0; p < vertexCount; ++p)
            //    {
            //        ushort index = indexList[p];
            //        if (index >= orgVertexCount)
            //        {
            //            //extra coord (newly created)
            //            TessVertex2d extraVertex = tempVertexList[index - orgVertexCount];
            //            vtx[n] = (float)extraVertex.x;
            //            vtx[n + 1] = (float)extraVertex.y;
            //        }
            //        else
            //        {
            //            //original corrd
            //            vtx[n] = (float)polygon1[index * 2];
            //            vtx[n + 1] = (float)polygon1[(index * 2) + 1];
            //        }
            //        n += 2;
            //    }
            //    //-----------------------------
            //    //draw tess result
            //    int j = vtx.Length;
            //    for (int i = 0; i < j;)
            //    {
            //        var p0 = new PointF(vtx[i], vtx[i + 1]);
            //        var p1 = new PointF(vtx[i + 2], vtx[i + 3]);
            //        var p2 = new PointF(vtx[i + 4], vtx[i + 5]);

            //        _g.DrawLine(Pens.Red, p0, p1);
            //        _g.DrawLine(Pens.Red, p1, p2);
            //        _g.DrawLine(Pens.Red, p2, p0);

            //        i += 6;
            //    }
            //}
            //else
            //{

            //    List<Poly2Tri.Polygon> outputPolygons = new List<Poly2Tri.Polygon>();
            //    Poly2TriExampleHelper.Triangulate(polygon1, contourEndIndices, flipYAxis, outputPolygons);
            //    foreach (Poly2Tri.Polygon polygon in outputPolygons)
            //    {
            //        foreach (Poly2Tri.DelaunayTriangle tri in polygon.Triangles)
            //        {
            //            Poly2Tri.TriangulationPoint p0 = tri.P0;
            //            Poly2Tri.TriangulationPoint p1 = tri.P1;
            //            Poly2Tri.TriangulationPoint p2 = tri.P2;

            //            _g.DrawLine(Pens.Red, (float)p0.X, (float)p0.Y, (float)p1.X, (float)p1.Y);
            //            _g.DrawLine(Pens.Red, (float)p1.X, (float)p1.Y, (float)p2.X, (float)p2.Y);
            //            _g.DrawLine(Pens.Red, (float)p2.X, (float)p2.Y, (float)p0.X, (float)p0.Y);
            //        }
            //    }
            //}
#endif
        }
Ejemplo n.º 18
0
 public abstract void SetNewFigureBuilder(FigureBuilder builder);
Ejemplo n.º 19
0
 public Controller(View viewToDisplay, FigureBuilder figureCreater)
 {
     ViewToDisplay = viewToDisplay;
     FigureCreater = figureCreater;
 }
Ejemplo n.º 20
0
        public void SelectionTest2()
        {
            //создаем первую фигуру
            var fig1 = new Figure();

            fig1.Transform.Matrix.Translate(150, 150);
            fig1.Transform.Matrix.Scale(30, 30);
            FigureBuilder.BuildEllipseGeometry(fig1);

            //создаем вторую фигуру
            var fig2 = new Figure();

            fig2.Transform.Matrix.Translate(200, 200);
            fig2.Transform.Matrix.Scale(30, 30);
            FigureBuilder.BuildRectangleGeometry(fig2);

            //рисуем до выделения
            Draw("2_1.png", fig1, fig2);

            //создаем selection
            var selection = new Selection();

            selection.Style.BorderStyle.Width = 1;
            selection.Style.BorderStyle.Color = Color.Magenta;

            //выделяем фигуры
            selection.Add(fig1);
            selection.Add(fig2);

            //ресайз по X относительно левого края
            selection.Scale(2, 1, selection.ToWorldCoordinates(new PointF(0, 0.5f)));
            selection.PushTransformToSelectedFigures();
            //рисуем
            Draw("2_2.png", fig1, fig2, selection);

            //ресайз по Y относительно нижнего края
            selection.Scale(1, 2, selection.ToWorldCoordinates(new PointF(0.5f, 1)));
            selection.PushTransformToSelectedFigures();
            //рисуем
            Draw("2_3.png", fig1, fig2, selection);

            //вращение относительно центра
            selection.Rotate(45, selection.ToWorldCoordinates(new PointF(0.5f, 0.5f)));
            selection.PushTransformToSelectedFigures();
            //рисуем
            Draw("2_4.png", fig1, fig2, selection);

            //сдвиг
            selection.Translate(100, 100);
            selection.PushTransformToSelectedFigures();
            //рисуем
            Draw("2_5.png", fig1, fig2, selection);

            //skew по X относительно нижней границы
            selection.Skew(0.5f, 0, selection.ToWorldCoordinates(new PointF(0.5f, 1)));
            selection.PushTransformToSelectedFigures();
            //рисуем
            Draw("2_6.png", fig1, fig2, selection);

            //результат
            selection.Clear();
            Draw("2_7.png", fig1, fig2, selection);
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Обработчик нажатия левой кнопки мышки
        /// </summary>
        /// <param name="location">Координаты курсора</param>
        /// <param name="modifierKeys">Какие клавиши были ещё нажаты в этот момент</param>
        public void OnMouseDown(Point location, Keys modifierKeys)
        {
            _wasMouseMoving  = false;
            _wasVertexMoving = false;
            _isMouseDown     = true;
            _movedMarker     = null;
            // запоминаем точку нажатия мышкой
            var point = Point.Ceiling(new PointF(location.X / ScaleFactor, location.Y / ScaleFactor));

            _firstMouseDown = point;

            if (CreateFigureRequest != null)
            {
                //создаем новую фигуру
                EditorMode = EditorMode.CreateFigure;
                OnLayerStartChanging();
                CreateFigure(point);
                _isFigureCreated = true;
                return;
            }

            if (RibbonLineUpdated(point, true))
            {
                return;
            }

            if (EditorMode != EditorMode.Select &&
                EditorMode != EditorMode.Skew &&
                EditorMode != EditorMode.Warp &&
                EditorMode != EditorMode.Verticies)
            {
                Clear();   // очищаем список выбранных
            }
            //перебираем фигуры, выделяем/снимаем выделение
            FindMarkerAt(point, out _movedMarker);
            if (_movedMarker == null)   // маркера под курсором не встретилось...
            {
                Figure fig;
                if ((EditorMode == EditorMode.Select ||
                     EditorMode == EditorMode.Skew ||
                     EditorMode == EditorMode.Warp ||
                     EditorMode == EditorMode.Verticies) &&
                    _selection.FindFigureAt(_layer, point, out fig)) // попробуем найти фигуру...
                {
                    // фигура найдена.
                    // если этой фигуры не было в списке
                    if (!_selection.Contains(fig))
                    {
                        // если не нажата управляющая клавиша Shift
                        // в режиме изменения вершим может быть выбрана только одна фигура
                        if (!modifierKeys.HasFlag(Keys.Shift))
                        {
                            _selection.Clear(); // очистим список выбранных
                        }
                        // то добавим её в список
                        _selection.Add(fig);
                        OnSelectedFigureChanged();
                    }
                    else
                    {
                        if (EditorMode == EditorMode.Verticies && modifierKeys.HasFlag(Keys.Control))
                        {
                            OnLayerStartChanging();
                            // вставка новой вершины при нажатом Ctrl
                            _selection.InsertVertex(fig, point);
                            OnLayerChanged();
                        }
                        // при нажатой клавише Shift удаляем эту фигуру из списка выбора
                        // если она не последняя
                        else
                        if (_selection.Count > 1 && modifierKeys.HasFlag(Keys.Shift))
                        {
                            _selection.Remove(fig);
                            OnSelectedFigureChanged();
                        }
                    }
                    //строим маркеры
                    UpdateMarkers();
                    // что-то выбрано, тогда "тянем"
                    if (_selection.Count > 0)
                    {
                        EditorMode = EditorMode.Drag;
                    }
                }
                else
                {
                    // в точке мышки ничего нет
                    Clear(); // очищаем список выбранных
                    OnSelectedFigureChanged();

                    if (CreateFigureRequest == null)
                    {
                        // создаём "резиновую" рамку
                        FigureBuilder.BuildFrameGeometry(_selection, point);
                        EditorMode = EditorMode.FrameSelect;
                    }
                }
            }
            else
            {
                if (EditorMode == EditorMode.Verticies)
                {
                    if (modifierKeys.HasFlag(Keys.Control))
                    {
                        if (_movedMarker.MarkerType == MarkerType.Vertex)
                        {
                            // удаляем только вершины, а не контрольные точки
                            OnLayerStartChanging();
                            _selection.RemoveVertex(((VertexMarker)_movedMarker).Owner,
                                                    ((VertexMarker)_movedMarker).Index);
                            OnLayerChanged();
                            //строим маркеры
                            UpdateMarkers();
                            OnSelectedFigureChanged();
                        }
                    }
                }
                else
                {
                    EditorMode = EditorMode.ChangeGeometry;
                }
            }
        }
Ejemplo n.º 22
0
        public override void SetNewFigureBuilder(FigureBuilder builder)
        {
            FigureCreater = builder;

            _logger.Info(LoggerMessage.SET_NEW_FIGURE_BUILDER);
        }
Ejemplo n.º 23
0
 public FigureController(View viewToDisplay, FigureBuilder figureCreater) :
     base(viewToDisplay, figureCreater)
 {
     _logger = LogManager.GetCurrentClassLogger();
 }
        /// <summary>
        /// Метод строит маркеры у объекта Selection
        /// </summary>
        private void BuildMarkers()
        {
            // стираем предыдущие маркеры
            Markers.Clear();
            // если ничего не выбрано, выходим
            if (Selection.Count == 0)
            {
                return;
            }
            switch (_editorMode)
            {
            case EditorMode.Skew:
                //создаём маркеры скоса по горизонтали и по вертикали
                if (_selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Skew))     //если разрешён скос
                {
                    Markers.Add(CreateMarker(MarkerType.SkewX, 0.5f, 0, UserCursor.SkewHorizontal, 1, 1));
                    Markers.Add(CreateMarker(MarkerType.SkewY, 0, 0.5f, UserCursor.SkewVertical, 1, 1));
                    Markers.Add(CreateMarker(MarkerType.SkewY, 1, 0.5f, UserCursor.SkewVertical, 0, 0));
                    Markers.Add(CreateMarker(MarkerType.SkewX, 0.5f, 1, UserCursor.SkewHorizontal, 0, 0));
                }
                break;

            case EditorMode.Verticies:
                // создаём маркеры на вершинах фигур
                if (_selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Vertex))     //если разрешено редактирование вершин
                {
                    foreach (var fig in _selection.Where(figure => figure.Geometry is PolygoneGeometry))
                    {
                        var polygone = fig.Geometry as PolygoneGeometry;
                        //get transformed points
                        if (polygone == null)
                        {
                            continue;
                        }
                        var points = polygone.GetTransformedPoints(fig);
                        for (var i = 0; i < points.Length; i++)
                        {
                            Markers.Add(CreateMarker(MarkerType.Vertex, points[i], i, fig));
                        }
                    }
                }
                // создаём маркеры градиента
                foreach (var fig in _selection.Where(figure => figure.Style.FillStyle is IGradientFill))
                {
                    var gradient = fig.Style.FillStyle as IGradientFill;
                    //get transformed points
                    if (gradient == null)
                    {
                        continue;
                    }
                    var points = gradient.GetGradientPoints(fig);
                    for (var i = 0; i < points.Length; i++)
                    {
                        Markers.Add(CreateMarker(MarkerType.Grafient, points[i], i, fig));
                    }
                }
                break;

            case EditorMode.Select:
                // создаём маркеры масштаба
                if (Selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Scale))     //если разрешено масштабирование
                {
                    Markers.Add(CreateMarker(MarkerType.Scale, 0, 0, UserCursor.SizeNWSE, 1, 1));
                    Markers.Add(CreateMarker(MarkerType.Scale, 1, 0, UserCursor.SizeNESW, 0, 1));
                    Markers.Add(CreateMarker(MarkerType.Scale, 1, 1, UserCursor.SizeNWSE, 0, 0));
                    Markers.Add(CreateMarker(MarkerType.Scale, 0, 1, UserCursor.SizeNESW, 1, 0));
                }

                // создаём маркеры ресайза по вертикали и горизонтали
                if (Selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Size))     //если разрешено изменение размера
                {
                    Markers.Add(CreateMarker(MarkerType.SizeY, 0.5f, 0, UserCursor.SizeNS, 0.5f, 1));
                    Markers.Add(CreateMarker(MarkerType.SizeX, 1, 0.5f, UserCursor.SizeWE, 0, 0.5f));
                    Markers.Add(CreateMarker(MarkerType.SizeY, 0.5f, 1, UserCursor.SizeNS, 0.5f, 0));
                    Markers.Add(CreateMarker(MarkerType.SizeX, 0, 0.5f, UserCursor.SizeWE, 1, 0.5f));
                }

                // создаём маркер вращения
                if (Selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Rotate))     //если разрешено вращение
                {
                    var sf           = ScaleFactor;
                    var rotateMarker = CreateMarker(MarkerType.Rotate, 1, 0, UserCursor.Rotate, 0.5f, 0.5f, 15 / sf, -15 / sf);
                    Markers.Add(rotateMarker);
                }
                break;
            }

            // задаём геометрию маркеров по умолчанию
            foreach (var marker in Markers)
            {
                FigureBuilder.BuildMarkerGeometry(marker);
            }
        }
Ejemplo n.º 25
0
        /// <summary>
        /// Метод строит маркеры у объекта Selection
        /// </summary>
        private void BuildMarkers()
        {
            // стираем предыдущие маркеры
            Markers.Clear();
            // если ничего не выбрано, выходим
            if (Selection.Count == 0)
            {
                return;
            }
            switch (_editorMode)
            {
            case EditorMode.Warp:
                //создаём маркеры искажения по горизонтали и по вертикали
                if (_selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Warp))     //если разрешёно искажение
                {
                    // создаём маркеры искажения
                    foreach (var fig in RendererDecorator.WhereContainsDecorator(_selection, typeof(WarpRendererDecorator)))
                    {
                        var warped = fig.Renderer as WarpRendererDecorator;
                        //get transformed points
                        if (warped == null)
                        {
                            continue;
                        }
                        var points = warped.GetWarpPoints(fig);
                        for (var i = 0; i < points.Length; i++)
                        {
                            Markers.Add(CreateMarker(MarkerType.Warp, points[i], i, fig));
                        }
                    }
                }
                break;

            case EditorMode.Skew:
                //создаём маркеры скоса по горизонтали и по вертикали
                if (_selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Skew))     //если разрешён скос
                {
                    Markers.Add(CreateMarker(MarkerType.SkewX, 0.5f, 0, UserCursor.SkewHorizontal, 1, 1));
                    Markers.Add(CreateMarker(MarkerType.SkewY, 0, 0.5f, UserCursor.SkewVertical, 1, 1));
                    Markers.Add(CreateMarker(MarkerType.SkewY, 1, 0.5f, UserCursor.SkewVertical, 0, 0));
                    Markers.Add(CreateMarker(MarkerType.SkewX, 0.5f, 1, UserCursor.SkewHorizontal, 0, 0));
                }
                break;

            case EditorMode.Verticies:
                // создаём маркеры на вершинах фигур
                if (_selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Vertex))     //если разрешено редактирование вершин
                {
                    foreach (var fig in _selection.Where(figure => figure.Geometry is ITransformedGeometry))
                    {
                        var transformed = fig.Geometry as ITransformedGeometry;
                        //get transformed points
                        if (transformed == null)
                        {
                            continue;
                        }
                        var points = transformed.GetTransformedPoints(fig);
                        var types  = transformed.GetTransformedPointTypes(fig);
                        Markers.Add(CreateMarker(MarkerType.Vertex, points[0], 0, fig));
                        var        nt = 0;
                        MarkerType mt;
                        for (var i = 1; i < points.Length; i++)
                        {
                            var typ = types[i];
                            if ((typ & 0x07) == 3)
                            {
                                mt = nt % 3 == 2 ? MarkerType.Vertex : MarkerType.ControlBezier;
                                nt++;
                            }
                            else
                            {
                                mt = MarkerType.Vertex;
                                nt = 0;
                            }
                            Markers.Add(CreateMarker(mt, points[i], i, fig));
                        }
                    }
                }
                // создаём маркеры градиента
                foreach (var fig in _selection.Where(figure => figure.Style.FillStyle is IGradientFill))
                {
                    var gradient = fig.Style.FillStyle as IGradientFill;
                    //get transformed points
                    if (gradient == null)
                    {
                        continue;
                    }
                    var points = gradient.GetGradientPoints(fig);
                    for (var i = 0; i < points.Length; i++)
                    {
                        Markers.Add(CreateMarker(MarkerType.Gradient, points[i], i, fig));
                    }
                }
                break;

            case EditorMode.Select:
                // создаём маркеры масштаба
                if (Selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Scale))     //если разрешено масштабирование
                {
                    Markers.Add(CreateMarker(MarkerType.Scale, 0, 0, UserCursor.SizeNWSE, 1, 1));
                    Markers.Add(CreateMarker(MarkerType.Scale, 1, 0, UserCursor.SizeNESW, 0, 1));
                    Markers.Add(CreateMarker(MarkerType.Scale, 1, 1, UserCursor.SizeNWSE, 0, 0));
                    Markers.Add(CreateMarker(MarkerType.Scale, 0, 1, UserCursor.SizeNESW, 1, 0));
                }

                // создаём маркеры ресайза по вертикали и горизонтали
                if (Selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Size))     //если разрешено изменение размера
                {
                    Markers.Add(CreateMarker(MarkerType.SizeY, 0.5f, 0, UserCursor.SizeNS, 0.5f, 1));
                    Markers.Add(CreateMarker(MarkerType.SizeX, 1, 0.5f, UserCursor.SizeWE, 0, 0.5f));
                    Markers.Add(CreateMarker(MarkerType.SizeY, 0.5f, 1, UserCursor.SizeNS, 0.5f, 0));
                    Markers.Add(CreateMarker(MarkerType.SizeX, 0, 0.5f, UserCursor.SizeWE, 1, 0.5f));
                }

                // создаём маркер вращения
                if (Selection.Geometry.AllowedOperations.HasFlag(AllowedOperations.Rotate))     //если разрешено вращение
                {
                    var sf           = ScaleFactor;
                    var rotateMarker = CreateMarker(MarkerType.Rotate, 1, 0, UserCursor.Rotate, 0.5f, 0.5f, 15 / sf, -15 / sf);
                    Markers.Add(rotateMarker);
                }
                break;
            }

            // задаём геометрию маркеров по умолчанию
            foreach (var marker in Markers)
            {
                FigureBuilder.BuildMarkerGeometry(marker);
            }
        }
Ejemplo n.º 26
0
        void DrawOutput(Painter painter, Typeface typeface, char selectedChar)
        {
            painter.Clear(Color.White);

            //this is a demo.
            //
            float fontSizeInPts = 300;

            _glyphPathBuilder.BuildFromGlyphIndex(typeface.GetGlyphIndex(selectedChar), fontSizeInPts);

            var prevColor = painter.StrokeColor;

            painter.StrokeColor = Color.Black;
            using (Tools.BorrowVxs(out var v1))
                using (Tools.BorrowCurveFlattener(out var flattener))
                {
                    _glyphPathBuilder.ReadShapes(_tovxs);

                    //config
                    if (rdoSimpleIncCurveFlattener.Checked)
                    {
                        flattener.ApproximationMethod = CurveApproximationMethod.Inc;
                        if (int.TryParse(txtIncrementalTessStep.Text, out int stepCount))
                        {
                            if (stepCount < 0)
                            {
                                //auto calculate inc step count
                                flattener.IncUseFixedStep = false;
                            }
                            else
                            {
                                //fix manual inc step count
                                flattener.IncUseFixedStep = true;
                                flattener.IncStepCount    = stepCount;
                            }
                        }
                    }
                    else
                    {
                        flattener.ApproximationMethod = CurveApproximationMethod.Div;

                        if (double.TryParse(txtDivAngleTolerenceEpsilon.Text, out double angleTolerance))
                        {
                            flattener.AngleTolerance = angleTolerance;
                        }

                        if (byte.TryParse(txtDivCurveRecursiveLimit.Text, out byte recursiveLim))
                        {
                            flattener.RecursiveLimit = recursiveLim;
                        }
                    }


                    _tovxs.WriteOutput(v1, flattener); //write content from GlyphTranslator to v1

                    painter.Fill(v1, PixelFarm.Drawing.KnownColors.Gray);
                    _tovxs.Reset();

                    //tess the vxs

                    FigureBuilder         figBuilder    = new FigureBuilder();
                    FigureContainer       container     = figBuilder.Build(v1);
                    TessTriangleTechnique tessTechnique = TessTriangleTechnique.DrawElement;

                    if (container.IsSingleFigure)
                    {
                        Figure figure = container._figure;
                        if (rdoTessSGI.Checked)
                        {
                            //coords of tess triangles
                            switch (tessTechnique)
                            {
                            case TessTriangleTechnique.DrawArray:
                            {
                                DrawTessTriangles(painter, figure.GetAreaTess(_tessTool, _tessTool.WindingRuleType, TessTriangleTechnique.DrawArray));
                            }
                            break;

                            case TessTriangleTechnique.DrawElement:
                            {
                                float[]  tessArea = figure.GetAreaTess(_tessTool, _tessTool.WindingRuleType, TessTriangleTechnique.DrawElement);
                                ushort[] index    = figure.GetAreaIndexList();
                                DrawTessTriangles(painter, tessArea, index);
                            }
                            break;
                            }
                        }
                        else
                        {
                            if (chkShowContourAnalysis.Checked)
                            {
                                ContourAnalyzer     analyzer1 = new ContourAnalyzer();
                                IntermediateOutline outline   = analyzer1.CreateIntermediateOutline(v1);

                                var dbugVisualizer = new PixelFarm.GlyphDebugContourVisualizer();

                                dbugVisualizer.SetPainter(painter);
                                dbugVisualizer.Scale = _typeface.CalculateScaleToPixelFromPointSize(fontSizeInPts);
                                dbugVisualizer.WalkCentroidLine(outline);
                            }
                            else
                            {
                                //Poly2Tri
                                List <Poly2Tri.Polygon> polygons = figure.GetTrianglulatedArea(false);
                                //draw polygon
                                painter.StrokeColor = Color.Red;
                                DrawPoly2TriPolygon(painter, polygons);
                            }
                        }
                    }
                    else
                    {
                        MultiFigures multiFig = container._multiFig;
                        if (rdoTessSGI.Checked)
                        {
                            switch (tessTechnique)
                            {
                            case TessTriangleTechnique.DrawArray:
                            {
                                DrawTessTriangles(painter, multiFig.GetAreaTess(_tessTool, _tessTool.WindingRuleType, TessTriangleTechnique.DrawArray));
                            }
                            break;

                            case TessTriangleTechnique.DrawElement:
                            {
                                float[]  tessArea = multiFig.GetAreaTess(_tessTool, _tessTool.WindingRuleType, TessTriangleTechnique.DrawElement);
                                ushort[] index    = multiFig.GetAreaIndexList();
                                DrawTessTriangles(painter, tessArea, index);
                            }
                            break;
                            }
                        }
                        else
                        {
                            if (chkShowContourAnalysis.Checked)
                            {
                                ContourAnalyzer     analyzer1 = new ContourAnalyzer();
                                IntermediateOutline outline   = analyzer1.CreateIntermediateOutline(v1);

                                var dbugVisualizer = new PixelFarm.GlyphDebugContourVisualizer();
                                dbugVisualizer.SetPainter(painter);
                                dbugVisualizer.Scale = _typeface.CalculateScaleToPixelFromPointSize(fontSizeInPts);
                                dbugVisualizer.WalkCentroidLine(outline);
                            }
                            else
                            {
                                List <Poly2Tri.Polygon> polygons = multiFig.GetTrianglulatedArea(false);
                                painter.StrokeColor = Color.Red;
                                DrawPoly2TriPolygon(painter, polygons);
                            }
                        }
                    }
                }
            painter.StrokeColor = prevColor;
            //-------------



            //tess
            //if (rdoTessSGI.Checked)
            //{

            //    //SGI Tess Lib

            //    if (!_tessTool.TessPolygon(polygon1, _contourEnds))
            //    {
            //        return;
            //    }
            //    //1.
            //    List<ushort> indexList = _tessTool.TessIndexList;
            //    //2.
            //    List<TessVertex2d> tempVertexList = _tessTool.TempVertexList;
            //    //3.
            //    int vertexCount = indexList.Count;
            //    //-----------------------------
            //    int orgVertexCount = polygon1.Length / 2;
            //    float[] vtx = new float[vertexCount * 2];//***
            //    int n = 0;

            //    for (int p = 0; p < vertexCount; ++p)
            //    {
            //        ushort index = indexList[p];
            //        if (index >= orgVertexCount)
            //        {
            //            //extra coord (newly created)
            //            TessVertex2d extraVertex = tempVertexList[index - orgVertexCount];
            //            vtx[n] = (float)extraVertex.x;
            //            vtx[n + 1] = (float)extraVertex.y;
            //        }
            //        else
            //        {
            //            //original corrd
            //            vtx[n] = (float)polygon1[index * 2];
            //            vtx[n + 1] = (float)polygon1[(index * 2) + 1];
            //        }
            //        n += 2;
            //    }
            //    //-----------------------------
            //    //draw tess result
            //    int j = vtx.Length;
            //    for (int i = 0; i < j;)
            //    {
            //        var p0 = new PointF(vtx[i], vtx[i + 1]);
            //        var p1 = new PointF(vtx[i + 2], vtx[i + 3]);
            //        var p2 = new PointF(vtx[i + 4], vtx[i + 5]);

            //        _g.DrawLine(Pens.Red, p0, p1);
            //        _g.DrawLine(Pens.Red, p1, p2);
            //        _g.DrawLine(Pens.Red, p2, p0);

            //        i += 6;
            //    }
            //}
            //else
            //{

            //    List<Poly2Tri.Polygon> outputPolygons = new List<Poly2Tri.Polygon>();
            //    Poly2TriExampleHelper.Triangulate(polygon1, contourEndIndices, flipYAxis, outputPolygons);
            //    foreach (Poly2Tri.Polygon polygon in outputPolygons)
            //    {
            //        foreach (Poly2Tri.DelaunayTriangle tri in polygon.Triangles)
            //        {
            //            Poly2Tri.TriangulationPoint p0 = tri.P0;
            //            Poly2Tri.TriangulationPoint p1 = tri.P1;
            //            Poly2Tri.TriangulationPoint p2 = tri.P2;

            //            _g.DrawLine(Pens.Red, (float)p0.X, (float)p0.Y, (float)p1.X, (float)p1.Y);
            //            _g.DrawLine(Pens.Red, (float)p1.X, (float)p1.Y, (float)p2.X, (float)p2.Y);
            //            _g.DrawLine(Pens.Red, (float)p2.X, (float)p2.Y, (float)p0.X, (float)p0.Y);
            //        }
            //    }
            //}
        }