Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Как правильно пользоватся GLU_TESS_COMBINE


Автор: inkognitum 16.2.2009, 21:23
Добрый день.

Помогите пожалуйста с GLU_TESS_COMBINE, мне надо закрасить полигон у которого линии пересекаются.
Пишу на C#, использую Tao.
Вот как делаю:

Код

private void UserControl1_Load(object sender, EventArgs e)
        {
            this.InitializeContexts();
            this.SwapBuffers();


            Gl.glClearColor(255f, 255f, 0f, 0f);
            ClearControl();
        }

        private void UserControl1_SizeChanged(object sender, EventArgs e)
        {
            ClearControl();
        }

        public void ClearControl()
        {
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

            Gl.glViewport(0, 0, this.Width, this.Height);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            Glu.gluOrtho2D(0, this.Width, 0, this.Height);
        }

        void MyBegin(int mode) 
        {
            Gl.glBegin(mode);
        }

        void MyEnd() 
        {
            Gl.glEnd();
        }

        /*void MyVertex3dv(double[] v)
        {
            Gl.glVertex3dv(v);
            //Gl.glVertex2dv(v);
        }*/

        void MyVertex2f(double[] db)
        {
            Gl.glVertex2d(db[0], 0);
        }

        private void MyVertex3dv(System.IntPtr vertexData)
        {
            double[] v = new double[3];
            System.Runtime.InteropServices.Marshal.Copy(vertexData, v, 0, 3);
            Gl.glVertex3dv(v);
        }
        
public void DrawPolygon(Pen pen, PointF[] pt)
        {
            Glu.GLUtesselator t = Glu.gluNewTess();

            Glu.gluTessProperty(t, Glu.GLU_TESS_WINDING_RULE, Glu.GLU_TESS_WINDING_POSITIVE);
            Glu.gluTessProperty(t, Glu.GLU_TESS_WINDING_RULE, Glu.GLU_TESS_WINDING_NONZERO); 
            Glu.gluTessProperty(t, Glu.GLU_TESS_BOUNDARY_ONLY, Gl.GL_FALSE); // закрашивать полигон
            
           
            Glu.gluTessCallback(t, Glu.GLU_TESS_BEGIN, new Glu.TessBeginCallback(MyBegin)); 
            Glu.gluTessCallback(t, Glu.GLU_TESS_END, new Glu.TessEndCallback(MyEnd));  
            Glu.gluTessCallback(t, Glu.GLU_TESS_VERTEX, new Glu.TessVertexCallback(MyVertex3dv)); 
            Glu.gluTessCallback(t, Glu.GLU_TESS_COMBINE, new Glu.TessCombineCallback1(Combine));

            
            Glu.gluTessNormal(t, 0, 0, 1);
            Glu.gluTessBeginPolygon(t, IntPtr.Zero);
            Glu.gluTessBeginContour(t);

            for (int i = 0; i <= pt.Length - 1; i++)
            {
                double[] dbPoint = new double[3];
                dbPoint[0] = pt[i].X;
                dbPoint[1] = this.Height - pt[i].Y;
                dbPoint[2] = 0;
                Glu.gluTessVertex(t, dbPoint, dbPoint); 
            }
            Glu.gluTessEndContour(t); 
            Glu.gluTessEndPolygon(t);
            Glu.gluDeleteTess(t); 
        }

        private static void Combine(double[] coordinates, double[] vertexData, float[] weight, double[] dataOut)
        {
            double[] vertex = new double[6];
            int i;

            vertex[0] = coordinates[0];
            vertex[1] = coordinates[1];
            vertex[2] = coordinates[2];

            for (i = 3; i < 5; i++)
            {
                vertex[i] = weight[0] * vertexData[i] + weight[1] * vertexData[i] + weight[2] * vertexData[i] + weight[3] * vertexData[i];
            }

            dataOut = vertex;



выдает ошибку на строке:
Код

 Glu.gluTessCallback(t, Glu.GLU_TESS_COMBINE, new Glu.TessCombineCallback1(Combine));


текст ошибки:
Array size control parameter must be an integral type.

может что упустил?


Автор: arilou 17.2.2009, 00:09
Цитата(inkognitum @  16.2.2009,  21:23 Найти цитируемый пост)
может что упустил?


Цитата

The combine callback is called to create a new vertex when the tessellation detects an intersection, or wishes to merge features. The function takes four arguments: an array of three elements each of type Double, an array of four pointers, an array of four elements each of type Single, and a pointer to a pointer. The delegate prototype for this callback is Glu.TessCombineCallback. 


А у вас new Glu.TessCombineCallback1(Combine)

м.б. в этом проблема.

Автор: inkognitum 17.2.2009, 11:29
Цитата(arilou @ 17.2.2009,  00:09)
Цитата(inkognitum @  16.2.2009,  21:23 Найти цитируемый пост)
может что упустил?


Цитата

The combine callback is called to create a new vertex when the tessellation detects an intersection, or wishes to merge features. The function takes four arguments: an array of three elements each of type Double, an array of four pointers, an array of four elements each of type Single, and a pointer to a pointer. The delegate prototype for this callback is Glu.TessCombineCallback. 


А у вас new Glu.TessCombineCallback1(Combine)

м.б. в этом проблема.

Добрый день.
Нет там есть две перезагруженые функции.
Glu.TessCombineCallback - другие входные параметры
Glu.TessCombineCallback1 - классический входные параметры.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)