listID = glGenLists (1); Этот оператор присваивает переменной listID один незадействованный идентификатор (положительное целое число). Чтобы получить диапазон незадействован-ных целочисленных идентификаторов таблиц аргумент функции glGenLists (1) заменяется каким-то другим положительным числом. Например, если вызвать функцию glGenLists ( 6), то запишется последовательность из шести следующих друг за другом целых чисел, а первое значение из этого списка идентификаторов будет присвоено переменной listID. Если возникает ошибка, или система не может выдать запрошенный диапазон следующих друг за другом целых чисел, функция glGenLists возвращает значение 0. Таким образом, перед тем, как воспользоваться идентификатором, предложенным стандартной процедурой glGenLists, нужно убедиться в том, что это не 0.
Несмотря на то что список идентификаторов создается с помощью функции glGenList, можно сделать независимый запрос к системе, и она определит, использовалось ли данное целое число в качестве имени таблицы. Чтобы сделать это, вызывается следующая функция.
gllsList (listID); Значение GL_TRUE возвращается в том случае, если значение переменной listID - это целое число, которое уже использовалось в качестве названия таблицы отображения. В противном случае функция gllsList возвращает значение GL_FALSE.
РЕАЛИЗАЦИЯ ТАБЛИЦ ОТОБРАЖЕНИЙ В OpenGL
Чтобы реализовать одну таблицу отображения, следует воспользоваться оператором
glCallList (listID); В следующем фрагменте кода иллюстрируется создание и реализация таблицы отображения. Сначала создается таблица отображения, в которой содержится описание правильного шестиугольника, заданного в плоскости ху с помощью набора из шести равноудаленных друг от друга вершин, лежащих на окружности с центром в точке (200, 200) и радиусом 150. Затем вызывается функция glCallList, с помощью которой изображается шестиугольник.
const double TWO_PI = 6.2831853;
GLuint regHex;
GLdouble thêta; GLint x, y, k;
/* Создается таблица отображения для правильного шестиугольника.
* Вершинами шестиугольника являются шесть равноудаленных друг
* от друга точек, лежащих на окружности.
*/
regHex = glGenLists (1); // Таблице отображения
// присваивается идентификатор. glNewList (regHex, GL_COMPILE); glBegin (GL_POLYGON);
for (k = 0; k < 6; k++) { thêta = TWO_PI * k / 6.0; x = 200 + 150 * cos (thêta);
y = 200 + 150 * sin (thêta);
glVertex2i (x, y);
}
glEnd ( ); glEndList ( );
glCallList (regHex); Несколько таблиц отображений можно реализовать с помощью следующих двух операторов.
glListBase (offsetValue);
glCallLists (nLists, arrayDataType, Иэ^ОАггау); Целое число таблиц, которые мы хотим реализовать, присваивается параметру nLists, а параметр listlDArray - это массив, состоящий из идентификаторов таблиц отображений. В общем случае, массив listlDArray может содержать любое количество элементов, при этом недействительные идентификаторы таблиц отображений просто игнорируются. Кроме того, элементы массива listlDArray могут задаваться в различных форматах данных, а параметр arrayDataType используется для указания типа данных, например, GL_BYTE, GL_INT, GL_FLOAT, GL_3_BYTES или GL_4_BYTES. Чтобы определить идентификатор таблицы отображений, следует прибавить значение элемента массива listlDArray к целому значению параметра of fsetValue, которое задается в функции glListBase. По умолчанию значение параметра of fsetValue равно 0.