Главная » Free Pascal » Списки изображений Free Pascal

0

Представьте себе, что нам потребовалось бы изобразить несколько "черных квадратов", отличающихся по размерам, расположенных в разных местах и даже повернутых относительно линии горизонта. Конечно, можно было бы растиражи- ровать несколько экземпляров тела процедуры Redraw, помещая перед каждой ко- пией несколько строк с формированием очередной текущей матрицы преобразова- ний. А если бы исходное изображение содержало описание не 8 вершин (как в нашем примере), а нескольких сотен точек? Объем исходной программы сразу бы распух до необозримых размеров.

Можно было бы каждый раз писать процедуру для отображения объектов, но, к счастью, в языке OpenGL предусмотрена возможность создания списка изображений, и вместо повторения стереотипных описаний мы можем обратиться к содержимому ранее созданного списка. Графические примитивы, составляющие элементы списка, заключаются в пару специальных операторных скобок: glNewList … glEndList:  const

Num_Lst=1;

glNewList(Num_Lst, mode);

glBegin(GL_QUADS); glColor3f(0.8, 0.75, 0.75);

glVertex2f(-1, -1);

glVertex2f(-1, 1);

glVertex2f( 1, 1);

glVertex2f( 1, -1); glColor3f(0.1,0.1,0.1);

glVertex2f(-0.9, -0.9);

glVertex2f(-0.9, 0.9);

glVertex2f( 0.9, 0.9);

glVertex2f( 0.9, -0.9); glEnd;

glEndList;

Первый параметр Num_Lst в открывающей операторной скобке принимает це- лочисленное значение и выполняет функцию номера создаваемого списка. Второй параметр mode может принимать одно из двух значений — GL_COMPILE или GL_COMPILE_AND_EXECUTE. В первом случае элементы списка просто заносятся в не- который служебный массив (регистрируются), во втором случае регистрируются и исполняются.

Если нам понадобится повторить действия, указанные в ранее созданном спи- ске, то достаточно обратиться к процедуре glCallList, указав в качестве единст- венного параметра номер нужного списка Num_Lst.

Так как каждый список входит в состав ресурсов приложения, то, завершая работу

программы, мы должны позаботиться об удалении созданных списков. Например, эту операцию можно выполнить в процедуре обработчика события клавиатуры:

procedure OnKey(Key:byte; X,Y:longint); cdecl; begin

if Key = 27 then             // если нажата клавиша <Esc> begin

glDeleteLists(Num_Lst, 1);// удаление списка с номером Num_Lst Halt(0);

end;

end;

Как правило, для создания группы списков используют последовательные но- мера — Num_Lst, Num_Lst+1, Num_Lst+2, … Поэтому в процедуре удаления второй параметр задает количество удаляемых списков. Для создания группы списков с последовательными номерами можно воспользоваться процедурой glGenList(Num_lst, k). Поначалу все эти списки пусты, но использование опера- торных скобок glBegList(Num_lst+2) означает, что к ранее сформированному спи- ску с указанным номером (или изначально пустому) мы добавляем новые строки.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии