Листинг 22.20
void GLOBE::RenderGridCGRIDBALL *Gr,bool Fill) {
for(int i - 0:i<Gr->Nl-l:i+ » 1) for(int j - 0;j<Gr->Nh-l;j+ - 1) {
if(Fill) glBegin(GL_QUADS): //Вывод закрашенных четырехугольников else glBegin(GL_LINE_STRIP): //Вывод ребер. glColor3ub(Gr->Grid[i][j].R.Gr->Grid[i][j].G.Gr->Grid[i][j].B): //Для расчета освещенности кроме координат вершины передаем ее нормаль g1Normal3d(Gr->Grid[i][j].Nx. Gr->Grid[i][j].Ny, Gr->Grid[i][j].Nz ): glVertex3d( Gr->Grid[i][j].x, Gr->Grid[i][j].y. Gr->Grid[1][j].z ): glNormal3d(Gr->Gr1d[1][j+l].Nx. Gr->Grid[i][j+l].Ny.
Gr->Grid[i][j+l].Nz); glVertex3d(Gr->Grid[i][j+l].x.Gr->Grid[i][j+l].y.Gr->Grid[i][j+l].z ); glNormal3d(Gr->Grid[i+l][j+l].Nx.Gr->Grid[i+l][j+l].Ny.
Gr->Grid[1+l][j+l].Nz): glVertex3d(Gr->Grid[i+l][j+l].x. Gr->Grid[i+l][j+l].y.
Gr->Grid[i+l][j+l].z); glNormal3d( Gr->Grid[i+l][j].Nx.Gr->Gnd[i+l][j].Ny,
Gr->Grid[i+l][j].Nz): glVertex3d( Gr->Grid[i+l][j].x.Gr->Grid[i+l][j].y.
Gr->Grid[i+l][j].z ):
glEndO:
}
}
Инициализация библиотек и вывод примитивов
Отображение глобуса производится двумя обращениями к методу RenderGri d( ), как это показано в листинге 22.21.
Листинг 22.21
void GLOBE::Render(void) {
if(pBall)
RenderGrid(pBall.true);//false if (pGrid&&fShowGrid)
{
glLineWidth(LineWidth); //Задание толщины линий (надо делать до glBegin)
RenderGrid(pGrid.false);
}
}
Чтобы не увеличивать объем текста, в класс GLOBE не включены поля задания масштаба и позиции шара в мировой системе координат. Эти изменения легко внести самостоятельно при необходимости заполнить сцену большим количеством шаров разного размера и цвета.
Признак необходимости отображения координатной сетки объявлен в разделе publ i с, поэтому включать и выключать вывод сетки основная программа может прямой записью в поле fShowGrid без дополнительных методов типа SetShowGrid( ) HGetShowGridO.
При использовании рассмотренных классов программе вывода изображения из модуля GLRender.cpp остается только очистить буферы, вызвать метод рисования объекта класса GLOBE и выполнить смену страниц, как это показано в листинге 22.22.