Функция не вызывается для примитивов GL_TRIANGLE_FAN или GL_TRIANGLE_STRIP. Вместо этого треугольники преобразуются в независимые треугольники. Прототип функции имеет следующий вид:
void edgeFlag(GLboolean flag);
• GLU_TESS_EDGE_FLAG_DATA - аналогично предыдущему, но с дополнительным аргументом. Прототип функции имеет следующий вид:
void edgeFlagData(GLboolean flag,void* polygon_data);
• GLU_TESS_VERTEX - подобно функции glVertex определяет вершины треугольников, созданных процессом составления мозаики. Прототип функции имеет следующий вид:
void vertex(void*vertex_data);
• GLU_TESS_VERTEX_DATA - аналогично предыдущему, но с дополнительным аргументом. Прототип функции имеет следующий вид:
void vertexData(void*vertex_data,void*polygon_data);
• GLU_TESS_END - подобно функции glEnd указывает на конец примитива. Прототип функции имеет следующий вид:
void end();
• GLU_TESS_END_DATA - аналогично предыдущему, но с дополнительным аргументом. Прототип функции имеет следующий вид:
void endData(void*polygon_data);
• GLU_TESS_COMBINE - вызывается для создания новой вершины, когда обнаруживается пересечение или слияние.
Функция имеет четыре аргумента: массив из трех элементов типа GLdouble, массив из четырех элементов типа GLfloat и указатель на указатель. Прототип функции имеет следующий вид:
void combine(GLdouble coords[3], void*vertex_data[4],GLfloat weight[4], void**outData); Вершина определяется как линейная комбинация до четырех существующих вершин в vertex_data. Коэффициенты линейной комбинации даются как веса, сумма которых всегда 1.0. Аргумент coords дает местоположение новой вершины. Разместите другую вершину, интерполируйте параметры, используя vertex_data и weight, и возвратите новый указатель вершины в outData. Освободите память когда-нибудь после вызова gluTessEndPolygon.
Например, если многоугольник находится в произвольной плоскости в трехмерном пространстве и с каждой вершиной ассоциируется цвет, то GLU_TESS_COMBINE функция могла бы выглядеть следующим образом:
void myCombine(GLdouble coords[3],VERTEX*d[4], GLfloat w[4],VERTEX**dataOut)
{
VERTEX *newVertex=new_vertex(); newVertex->x=coords[0]; newVertex->y=coords[1] ; newVertex->z=coords[2] ;
newVertex->r=w[0]*d[0]->r+w[l]*d[1]->r+ w[2]*d[2]->r+w[3]*d[3]->r; newVertex->g=w[0]*d[0]->g+w[1]*d[1]->g+ w[2]*d[2]->g+w[3]*d[3]->g; newVertex->b=w[0]*d[0]->b+w[l]*d[1]->b+ w[2]* d[2 J->b+w[3]*d[3]->b; newVertex->a=w[0]*d[0]->a+w[l]*d[1]->a+ w[2] *d[2]->a+w[3]*d[3]->a;
*dataOut=newVertex;
)
Когда определяется пересечение GLU_TESS_COMBINE или GLU_TESS_COMBINE_DATA, функция обратного вызова должна быть определена и записывать в dataOut не нулевой указатель. Иначе произойдет ошибка.
• GLU_TESS_COMBINE_DATA - аналогично предыдущему, но с дополнительным параметром. Прототип функции имеет следующий вид:
void combineData(GLdouble coords[3], void*vertex_data[4],GLfloat weight[4], void**outData,void*polygon_data);