Exemplo n.º 1
0
        public SimpleCanvas(int view_width, int view_height)
        {
            FillColor   = Color.Black;
            StrokeColor = Color.Black;

            //dimension
            _view_width  = view_width;
            _view_height = view_height;
            _max         = Math.Max(view_width, view_height);
            //------------
            //matrix
            ////square viewport
            _orthoView        = MyMat4.ortho(0, _max, 0, _max, 0, 1);
            _flipVerticalView = MyMat4.scale(1, -1) * MyMat4.translate(new OpenTK.Vector3(0, -_max, 0));
            _orthoAndFlip     = _orthoView * _flipVerticalView;
            //-----------------------------------------------------------------------
            //shader
            _shaderRes           = new CanvasToShaderSharedResource();
            _shaderRes.OrthoView = _orthoView;
            //
            _fillShader = new GlyphFillShader(_shaderRes);
            //------------
            //tools
            Tesselate.Tesselator tt = new Tesselate.Tesselator();
            _tessTool       = new TessTool(tt);
            _curveFlattener = new SimpleCurveFlattener();
            ClearColor      = Color.White;
            //--------
            //set blend mode
            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
        }
Exemplo n.º 2
0
        private void button7_Click(object sender, EventArgs e)
        {
            var builder = new PixelFarm.CpuBlit.VertexProcessing.SimpleRectBorderBuilder();

            builder.SetBorderWidth(6);
            builder.RightBorderWidth   = 14;
            builder.BottomBorderHeight = 3;
            float[] coords = new float[16];

            builder.BuildAroundInnerRefBounds(0, 0, 30, 30, coords);
            //builder.BuildAroundOuterRefBounds(10, 10, 30, 30, coords);
            //builder.BuildOverRefBounds(10, 10, 30, 30, coords);

            //
            TessTest.TessListener t01      = new TessTest.TessListener();
            Tesselate.Tesselator  tess     = new Tesselate.Tesselator();
            List <Vertex>         vertexts = new List <Vertex>();

            for (int i = 0; i < coords.Length;)
            {
                vertexts.Add(new Vertex(coords[i], coords[i + 1]));
                i += 2;
            }
            //------------------

            t01.Connect(vertexts, tess, Tesselate.Tesselator.WindingRuleType.Odd, true);

            //polygon1
            tess.BeginPolygon();
            //------------------------------------
            //contour1
            tess.BeginContour();
            int start_at  = 0;
            int endBefore = start_at + 4;

            for (int i = start_at; i < endBefore; ++i)
            {
                Vertex v = vertexts[i];
                tess.AddVertex(v.m_X, v.m_Y, 0, i);
            }
            tess.EndContour();
            //------------------------------------
            //contour 2
            tess.BeginContour();
            start_at  = 4;
            endBefore = vertexts.Count;
            for (int i = start_at; i < endBefore; ++i)
            {
                Vertex v = vertexts[i];
                tess.AddVertex(v.m_X, v.m_Y, 0, i);
            }
            tess.EndContour();
            tess.EndPolygon();
            //---------------------------
            //save final images
            SaveToImage(null, t01.resultVertexList, 1, 0, 0);
            //---------------------------
        }
Exemplo n.º 3
0
 public TessTool(Tesselate.Tesselator tess)
 {
     this.tess         = tess;
     this.tessListener = new TessListener2();
     tessListener.Connect(tess, true);
 }
Exemplo n.º 4
0
        private void button5_Click(object sender, EventArgs e)
        {
            //ref: http://www.songho.ca/opengl/gl_tessellation.html
            //==============================================================================
            //song ho's tessellation examples 2
            //==============================================================================
            //          // define self-intersecting star shape (with color)
            ////      0
            ////     / \
            ////3---+---+---2
            ////  \ |   | /
            ////   \|   |/
            ////    +   +
            ////    |\ /|
            ////    | + |
            ////    |/ \|
            ////    1   4
            //GLdouble star[5][6] = { { 0.0, 3.0, 0,  1, 0, 0},       // 0: x,y,z,r,g,b
            //                        {-1.0, 0.0, 0,  0, 1, 0},       // 1:
            //                        { 1.6, 1.9, 0,  1, 0, 1},       // 2:
            //                        {-1.6, 1.9, 0,  1, 1, 0},       // 3:
            //                        { 1.0, 0.0, 0,  0, 0, 1} };     // 4:

            //// register callback functions
            //// This polygon is self-intersecting, so GLU_TESS_COMBINE callback function
            //// must be registered. The combine callback will process the intersecting vertices.
            //gluTessCallback(tess, GLU_TESS_BEGIN, (void (__stdcall*)(void))tessBeginCB);
            //gluTessCallback(tess, GLU_TESS_END, (void (__stdcall*)(void))tessEndCB);
            //gluTessCallback(tess, GLU_TESS_ERROR, (void (__stdcall*)(void))tessErrorCB);
            //gluTessCallback(tess, GLU_TESS_VERTEX, (void (__stdcall*)(void))tessVertexCB2);
            //gluTessCallback(tess, GLU_TESS_COMBINE, (void (__stdcall*)(void))tessCombineCB);

            //// tessellate and compile a concave quad into display list
            //// Pay attention to winding rules if multiple contours are overlapped.
            //// The winding rules determine which parts of polygon will be filled(interior)
            //// or not filled(exterior). For each enclosed region partitioned by multiple
            //// contours, tessellator assigns a winding number to the region by using
            //// given winding rule. The default winding rule is GLU_TESS_WINDING_ODD,
            //// but, here we are using non-zero winding rule to fill the middle area.
            //// BTW, the middle region will not be filled with the odd winding rule.
            //gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO);
            //glNewList(id, GL_COMPILE);
            //gluTessBeginPolygon(tess, 0);                   // with NULL data
            //    gluTessBeginContour(tess);
            //        gluTessVertex(tess, star[0], star[0]);
            //        gluTessVertex(tess, star[1], star[1]);
            //        gluTessVertex(tess, star[2], star[2]);
            //        gluTessVertex(tess, star[3], star[3]);
            //        gluTessVertex(tess, star[4], star[4]);
            //    gluTessEndContour(tess);
            //gluTessEndPolygon(tess);
            //glEndList();
            //gluDeleteTess(tess);        // safe to delete after tessellation

            //======================================================
            //GLdouble star[5][6] = { { 0.0, 3.0, 0,  1, 0, 0},       // 0: x,y,z,r,g,b
            //                        {-1.0, 0.0, 0,  0, 1, 0},       // 1:
            //                        { 1.6, 1.9, 0,  1, 0, 1},       // 2:
            //                        {-1.6, 1.9, 0,  1, 1, 0},       // 3:
            //                        { 1.0, 0.0, 0,  0, 0, 1} };     // 4:

            TessTest.TessListener t01      = new TessTest.TessListener();
            Tesselate.Tesselator  tess     = new Tesselate.Tesselator();
            List <Vertex>         vertexts = new List <Vertex>()
            {
                //use only coord (not include rgb color)
                new Vertex(0, 3),
                new Vertex(-1, 0),
                new Vertex(1.6, 1.9),
                new Vertex(-1.6, 1.9),
                new Vertex(1, 0)
            };

            //------------------

            t01.Connect(vertexts, tess, Tesselate.Tesselator.WindingRuleType.NonZero, true);

            //polygon1
            tess.BeginPolygon();
            //------------------------------------
            //contour1
            tess.BeginContour();
            int start_at  = 0;
            int endBefore = vertexts.Count;

            for (int i = start_at; i < endBefore; ++i)
            {
                Vertex v = vertexts[i];
                tess.AddVertex(v.m_X, v.m_Y, 0, i);
            }
            tess.EndContour();
            //------------------------------------

            tess.EndPolygon();
            //---------------------------
            //save final images
            SaveToImage(null, t01.resultVertexList);
            //---------------------------
        }
Exemplo n.º 5
0
        private void button4_Click(object sender, EventArgs e)
        {
            //ref: http://www.songho.ca/opengl/gl_tessellation.html
            //==============================================================================
            //song ho's tessellation examples 2
            //==============================================================================
            // define concave quad with a hole
            //  0--------3
            //  | 4----7 |
            //  | |    | |
            //  | 5----6 |
            //  1--------2
            //GLdouble quad2[8][3] = { {-2,3,0}, {-2,0,0}, {2,0,0}, { 2,3,0},
            //                         {-1,2,0}, {-1,1,0}, {1,1,0}, { 1,2,0} };
            //gluTessCallback(tess, GLU_TESS_BEGIN, (void (__stdcall*)(void))tessBeginCB);
            //gluTessCallback(tess, GLU_TESS_END, (void (__stdcall*)(void))tessEndCB);
            //gluTessCallback(tess, GLU_TESS_ERROR, (void (__stdcall*)(void))tessErrorCB);
            //gluTessCallback(tess, GLU_TESS_VERTEX, (void (__stdcall*)())tessVertexCB);

            //// tessellate and compile a concave quad into display list
            //glNewList(id, GL_COMPILE);
            //glColor3f(1,1,1);
            //gluTessBeginPolygon(tess, 0);                       // with NULL data
            //    gluTessBeginContour(tess);                      // outer quad
            //        gluTessVertex(tess, quad2[0], quad2[0]);
            //        gluTessVertex(tess, quad2[1], quad2[1]);
            //        gluTessVertex(tess, quad2[2], quad2[2]);
            //        gluTessVertex(tess, quad2[3], quad2[3]);
            //    gluTessEndContour(tess);
            //    gluTessBeginContour(tess);                      // inner quad (hole)
            //        gluTessVertex(tess, quad2[4], quad2[4]);
            //        gluTessVertex(tess, quad2[5], quad2[5]);
            //        gluTessVertex(tess, quad2[6], quad2[6]);
            //        gluTessVertex(tess, quad2[7], quad2[7]);
            //    gluTessEndContour(tess);
            //gluTessEndPolygon(tess);
            //glEndList();
            //==============================================================================

            TessTest.TessListener t01      = new TessTest.TessListener();
            Tesselate.Tesselator  tess     = new Tesselate.Tesselator();
            List <Vertex>         vertexts = new List <Vertex>()
            {
                new Vertex(-2, 3),
                new Vertex(-2, 0),
                new Vertex(2, 0),
                new Vertex(2, 3),
                //------------------
                new Vertex(-1, 2),
                new Vertex(-1, 1),
                new Vertex(1, 1),
                new Vertex(1, 2),
            };

            //------------------

            t01.Connect(vertexts, tess, Tesselate.Tesselator.WindingRuleType.Odd, true);

            //polygon1
            tess.BeginPolygon();
            //------------------------------------
            //contour1
            tess.BeginContour();
            int start_at  = 0;
            int endBefore = start_at + 4;

            for (int i = start_at; i < endBefore; ++i)
            {
                Vertex v = vertexts[i];
                tess.AddVertex(v.m_X, v.m_Y, 0, i);
            }
            tess.EndContour();
            //------------------------------------
            //contour 2
            tess.BeginContour();
            start_at  = 4;
            endBefore = vertexts.Count;
            for (int i = start_at; i < endBefore; ++i)
            {
                Vertex v = vertexts[i];
                tess.AddVertex(v.m_X, v.m_Y, 0, i);
            }
            tess.EndContour();


            tess.EndPolygon();
            //---------------------------
            //save final images
            SaveToImage(null, t01.resultVertexList);
            //---------------------------
        }
Exemplo n.º 6
0
        private void button3_Click(object sender, EventArgs e)
        {
            //ref: http://www.songho.ca/opengl/gl_tessellation.html
            //==============================================================================
            //song ho's tessellation examples 1
            //==============================================================================

            // // define concave quad data (vertices only)
            ////  0    2
            ////  \ \/ /
            ////   \3 /
            ////    \/
            ////    1
            //GLdouble quad1[4][3] = { {-1,3,0}, {0,0,0}, {1,3,0}, {0,2,0} };

            //// register callback functions
            //gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK *)())tessBeginCB);
            //gluTessCallback(tess, GLU_TESS_END, (void (CALLBACK *)())tessEndCB);
            //gluTessCallback(tess, GLU_TESS_ERROR, (void (CALLBACK *)())tessErrorCB);
            //gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK *)())tessVertexCB);

            //// tessellate and compile a concave quad into display list
            //// gluTessVertex() takes 3 params: tess object, pointer to vertex coords,
            //// and pointer to vertex data to be passed to vertex callback.
            //// The second param is used only to perform tessellation, and the third
            //// param is the actual vertex data to draw. It is usually same as the second
            //// param, but It can be more than vertex coord, for example, color, normal
            //// and UV coords which are needed for actual drawing.
            //// Here, we are looking at only vertex coods, so the 2nd and 3rd params are
            //// pointing same address.
            //glNewList(id, GL_COMPILE);
            //glColor3f(1,1,1);
            //gluTessBeginPolygon(tess, 0);                   // with NULL data
            //    gluTessBeginContour(tess);
            //        gluTessVertex(tess, quad1[0], quad1[0]);
            //        gluTessVertex(tess, quad1[1], quad1[1]);
            //        gluTessVertex(tess, quad1[2], quad1[2]);
            //        gluTessVertex(tess, quad1[3], quad1[3]);
            //    gluTessEndContour(tess);
            //gluTessEndPolygon(tess);
            //glEndList();

            TessTest.TessListener t01  = new TessTest.TessListener();
            Tesselate.Tesselator  tess = new Tesselate.Tesselator();

            List <Vertex> vertexts = new List <Vertex>()
            {
                new Vertex(-1, 3),
                new Vertex(0, 0),
                new Vertex(1, 3),
                new Vertex(0, 2),
            };

            t01.Connect(vertexts, tess, Tesselate.Tesselator.WindingRuleType.Odd, true);


            tess.BeginPolygon();
            tess.BeginContour();

            int j = vertexts.Count;

            for (int i = 0; i < j; ++i)
            {
                Vertex v = vertexts[i];
                tess.AddVertex(v.m_X, v.m_Y, 0, i);
            }
            tess.EndContour();
            tess.EndPolygon();

            //---------------------------
            //save final images
            SaveToImage(null, t01.resultVertexList);
            //---------------------------
        }
Exemplo n.º 7
0
 public TessTool(Tesselate.Tesselator tess)
 {
     this.tess = tess;
     this.tessListener = new TessListener2();
     tessListener.Connect(tess, true);
 }