Поделиться через


Функция gluTessCallback

Функция gluTessCallback определяет обратный вызов для объекта тесселяции.

Синтаксис

void WINAPI gluTessCallback(
   GLUtesselator *tess,
   GLenum        which,
   void (CALLBACK *fn)()
);

Параметры

Тесс

Объект тесселяции (созданный с помощью gluNewTess).

Который

Определяемый обратный вызов. Допустимы следующие значения: GLU_TESS_BEGIN, GLU_TESS_BEGIN_DATA, GLU_TESS_EDGE_FLAG, GLU_TESS_EDGE_FLAG_DATA, GLU_TESS_VERTEX, GLU_TESS_VERTEX_DATA, GLU_TESS_END, GLU_TESS_END_DATA, GLU_TESS_COMBINE, GLU_TESS_COMBINE_DATA, GLU_TESS_ERROR и GLU_TESS_ERROR_DATA.

Дополнительные сведения об этих обратных вызовах см. в следующем разделе Примечаний.

Fn

Вызываемая функция.

Возвращаемое значение

Эта функция не возвращает значение.

Комментарии

Используйте gluTessCallback , чтобы указать обратный вызов, используемый объектом тесселяции. Если указанный обратный вызов уже определен, он заменяется. Если fn имеет значение NULL, существующий обратный вызов становится неопределенным.

Объект тесселяции использует эти обратные вызовы, чтобы описать, как указанный многоугольник разбивается на треугольники.

Существует две версии каждого обратного вызова: одна с данными многоугольников, которые можно определить, а другая — без. Если указаны обе версии определенного обратного вызова, будет использоваться обратный вызов с указанными данными многоугольников. Параметр polygon_datagluTessBeginPolygon является копией указателя, указанного при вызове gluTessBeginPolygon .

Ниже приведены допустимые обратные вызовы.

Обратный вызов Описание
GLU_TESS_BEGIN Обратный вызов GLU_TESS_BEGIN вызывается как glBegin , чтобы указать начало примитива (треугольника). Функция принимает один аргумент типа GLenum. Если для свойства GLU_TESS_BOUNDARY_ONLY задано значение GL_FALSE, аргументу присваивается значение GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP или GL_TRIANGLES. Если для свойства GLU_TESS_BOUNDARY_ONLY задано значение GL_TRUE, аргументу присваивается значение GL_LINE_LOOP. Прототип функции для этого обратного вызова выглядит следующим образом: voidbegin (типGLenum);
GLU_TESS_BEGIN_DATA GLU_TESS_BEGIN_DATA совпадает с обратным вызовом GLU_TESS_BEGIN, за исключением того, что он принимает дополнительный аргумент указателя. Этот указатель идентичен непрозрачным указателю, который предоставляется при вызове gluTessBeginPolygon. Прототипом функции для этого обратного вызова является voidbeginData (типGLenum, void * polygon_data);
GLU_TESS_EDGE_FLAG Обратный вызов GLU_TESS_EDGE_FLAG похож на glEdgeFlag. Функция принимает один логический флаг, указывающий, какие края находятся на границе многоугольника. Если флаг GL_TRUE, то каждая вершина, следующая за ней, начинается ребро, лежащее на границе многоугольника; то есть ребро, отделяющее внутреннюю область от внешней. Если флаг GL_FALSE, то каждая следующая вершина начинается с края, лежащего внутри многоугольника. Обратный вызов GLU_TESS_EDGE_FLAG (если он определен) вызывается перед первым обратным вызовом вершины. Так как треугольные вентиляторы и треугольные полосы не поддерживают флаги ребер, обратный вызов начала не вызывается с GL_TRIANGLE_FAN или GL_TRIANGLE_STRIP, если предоставляется обратный вызов флага края. Вместо этого вентиляторы и полосы преобразуются в независимые треугольники. Прототип функции для этого обратного вызова:
voidedgeFlag (флаг GLboolean);
GLU_TESS_EDGE_FLAG_DATA Обратный вызов GLU_TESS_EDGE_FLAG_DATA совпадает с обратным вызовом GLU_TESS_EDGE_FLAG, за исключением того, что он принимает дополнительный аргумент указателя. Этот указатель идентичен непрозрачным указателю, который предоставляется при вызове gluTessBeginPolygon. Прототип функции для этого обратного вызова: voidedgeFlagData (флаг GLboolean, void * polygon_data);
GLU_TESS_VERTEX Обратный вызов GLU_TESS_VERTEX вызывается между начальным и конечным обратными вызовами. Он похож на glVertex и определяет вершины треугольников, созданных процессом тесселяции. Функция принимает указатель в качестве единственного аргумента. Этот указатель идентичен непрозрачный указатель, указанный при определении вершины (см . раздел gluTessVertex). Прототип функции для этого обратного вызова: voidvertex (void * vertex_data);
GLU_TESS_VERTEX_DATA GLU_TESS_VERTEX_DATA совпадает с обратным вызовом GLU_TESS_VERTEX, за исключением того, что для него требуется дополнительный аргумент указателя. Этот указатель идентичен непрозрачным указателю, который предоставляется при вызове gluTessBeginPolygon. Прототипом функции для этого обратного вызова является voidvertexData (void * vertex_data, void * polygon_data);
GLU_TESS_END Обратный вызов GLU_TESS_END служит той же цели, что и glEnd. Он указывает конец примитива и не принимает аргументов. Прототип функции для этого обратного вызова: voidend (void);
GLU_TESS_END_DATA Обратный вызов GLU_TESS_END_DATA совпадает с обратным вызовом GLU_TESS_END, за исключением того, что он принимает дополнительный аргумент указателя. Этот указатель идентичен непрозрачным указателю, который предоставляется при вызове gluTessBeginPolygon. Прототип функции для этого обратного вызова: voidendData (void * polygon_data);
GLU_TESS_COMBINE Вызовите обратный вызов GLU_TESS_COMBINE, чтобы создать новую вершину, когда тесселяция обнаруживает пересечение, или для объединения признаков. Функция принимает четыре аргумента: массив из трех элементов, каждый из которых имеет тип Gldouble.
Массив из четырех указателей.
Массив из четырех элементов, каждый из которых имеет тип GLfloat.
Указатель на указатель.
Прототип функции для этого обратного вызова:
voidcombine(GLdoublecoords[3], void * vertex_data[4], GLfloatweight[4], void **outData);
Вершина определяется как линейная комбинация до четырех существующих вершин, хранящихся в vertex_data. Коэффициенты линейной комбинации задаются по весу; эти весовые коэффициенты всегда суммарны до 1,0. Все указатели вершин допустимы, даже если некоторые весовые коэффициенты равны нулю. Параметр coords указывает расположение новой вершины.
Выделите другую вершину, интерполируйте параметры с помощью vertex_data и веса и верните новый указатель вершины в 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[1]*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[1]*d[1]->b + w[2]*d[2]->b +                    w[3]*d[3]->b;     newVertex->a = w[0]*d[0]->a + w[1]*d[1]->a + w[2]*d[2]->a +                    w[3]*d[3]->a;     *dataOut = newVertex; }
Когда тесселяция обнаруживает пересечение, необходимо определить обратный вызов GLU_TESS_COMBINE или GLU_TESS_COMBINE_DATA (см. ниже) и записать в dataOut указатель, отличный от NULL . В противном случае возникает ошибка GLU_TESS_NEED_COMBINE_CALLBACK, и выходные данные не создаются. (Это единственная ошибка, которая может возникнуть во время тесселяции и отрисовки.)
GLU_TESS_COMBINE_DATA Обратный вызов GLU_TESS_COMBINE_DATA совпадает с обратным вызовом GLU_TESS_COMBINE, за исключением того, что он принимает дополнительный аргумент указателя. Этот указатель идентичен непрозрачным указателю, который предоставляется при вызове gluTessBeginPolygon. Прототип функции для этого обратного вызова: voidcombineData (GLdoublecoords[3], void *vertex_data[4], GLfloatweight[4], void **outData, void * polygon_data);
GLU_TESS_ERROR Обратный вызов GLU_TESS_ERROR вызывается при обнаружении ошибки. Один аргумент имеет тип GLenum; он указывает на конкретную ошибку, которая произошла и имеет значение одного из следующих: GLU_TESS_MISSING_BEGIN_POLYGON
GLU_TESS_MISSING_END_POLYGON
GLU_TESS_MISSING_BEGIN_CONTOUR
GLU_TESS_MISSING_END_CONTOUR
GLU_TESS_COORD_TOO_LARGE
GLU_TESS_NEED_COMBINE_CALLBACK
Вызовите gluErrorString, чтобы получить символьные строки, описывающие эти ошибки. Прототип функции для этого обратного вызова выглядит следующим образом:
ошибка void (GLenumerrno);
Библиотека GLU восстанавливает первые четыре ошибки путем вставки отсутствующих вызовов или вызовов. GLU_TESS_COORD_TOO_LARGE указывает, что координата некоторой вершины превысила предопределенную константную GLU_TESS_MAX_COORD в абсолютном значении и что значение было зажато. (Значения координат должны быть достаточно маленькими, чтобы два значения можно было умножить вместе без переполнения.) GLU_TESS_NEED_COMBINE_CALLBACK указывает, что тесселяция обнаружила пересечение между двумя ребрами входных данных, а обратный вызов GLU_TESS_COMBINE или GLU_TESS_COMBINE_DATA не был предоставлен. Выходные данные создаваться не будут.
GLU_TESS_ERROR_DATA Обратный вызов GLU_TESS_ERROR_DATA совпадает с обратным вызовом GLU_TESS_ERROR, за исключением того, что он принимает дополнительный аргумент указателя. Этот указатель идентичен непрозрачным указателю, который предоставляется при вызове gluTessBeginPolygon. Прототипом функции для этого обратного вызова является voiderrorData (GLenumerrno, void * polygon_data);

Требования

Требование Значение
Минимальная версия клиента
Windows 2000 Professional [только классические приложения]
Минимальная версия сервера
Windows 2000 Server [только классические приложения]
Заголовок
Glu.h
Библиотека
Glu32.lib
DLL
Glu32.dll

См. также раздел

glBegin

glEdgeFlag

glEnd

glVertex

gluDeleteTess

gluErrorString

gluNewTess

gluTessBeginPolygon

gluTessEndPolygon

gluTessVertex