Добрый день.
Помогите пожалуйста с 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.
может что упустил?
|