// прямая обработка мыши
void select(WPARAM wp,LPARAM lp,0INT msg)
{
double mx,my,mz; // координаты курсора мыши int viewport[4]; // область вывода в окно int гес; // число записей в буфере выбора double project[16]; // текущая проективная матрица double model[16]; // текущая видовая матрица /*
По нажатию левой клавиши мыши выбираем новую активную точку.
*/
if(msg==WM_LBDTTONDOWN)
{
// получаем текущую матрицу проекций glGetDoublev(GL_PROJECTION_MATRIX,proj ect);
// получаем текущие значения области вывода glGetlntegerv(GL_VIEWPORT,viewport);
// координаты нажатия мыши mx=LOWORD(1р);
my=viewport[3]-(double)HIWORD(lp);
// устанавливаем объем видимости вокруг курсора glMatrixMode(GL_PROJECTION); glPushMatrix() ; glLoadldentity() ;
gluPickMatrix(mx,my,4,4, viewport) ; glMultMatrixd(project) ;
// переходим в режим выбора glRenderMode (GL_SELECT) ; select_mode=l;
gllnitNames(); // инициализируем стек имен glPushName(0); // помещаем один элемент draw(); // вывод сцены // переходим в обычный режим rec=glRenderMode(GL_RENDER); select_mode=0;
glMatrixMode(GL_PROJECTION); glPopMatrix() ; if(rec) // если была запись {
if(activept) // если была активная точка {
с[(activept-І)*3]=0; с[(activept-І)* 3 + 2]=1;
}
// устанавливаем новую активную точку activept=gl.select[3]; с[(activept-1)*3]=1; с[(activept-1)*3+2]=0;
}
} // конец if(msg==WM_LBUTTONDOWN)
/*
По нажатию правой клавиши мыши изменяем положение активной точки */
if(msg==WM_RBUTTONDOWN) if(activept) // если была активная точка {
glGetDoublev(GL_PROJECTION_MATRIX, project) ; glGetDoublev(GL_MODELVIEW_MATRIX,model); glGetlntegerv(GL_VIEWPORT,viewport); mx=LOWORD(lp); mz=0; my=viewport[3]-(double)HIWORD(lp);
gluUnProject(mx,my,mz,model,
project,viewport,
&mx,&my,&mz); pt [ (activept-1)*3]=mx; pt[(activept-1)*3+1]=my; pt [ (activept-1)*3 + 2]=mz;
}
}
void example_init()
{
gl.set(1);
glClearColor(1,1,1,1);
// увеличиваем размер точек glPointSize(4); glEnable(GL_MAP1_VERTEX_3); in.user_input=select ;
}
void example_deinit()
{
gl.deinit();
}
// обработка ввода void input()
{
// перемещение активной точки клавиатурой if(activept)
{
if(in.vkeys[VK_LEFT]) pt[(activept-1)* 3]-=0 .1 ; if(in.vkeys[VK_RIGHT]) pt[(activept-1)*3]+=0.1; if(in.vkeys[VK_UP]) pt[(activept-1)*3+1]+=0.1; if(in.vkeys[VK_DOWN]) pt[(activept-1)*3+l]-=0.1; }
}
void draw() // вывод сцены {
input();
glClear(GL_COLOR_BUFFER_BIT) ; glMatrixMode(GL_MODELVIEW); glLoadldentity();
}
}
Расширения OpenGI
Похоже Microsoft, сосредоточив свои силы на DirectX, остановилась на OpenGL 1.1 и больше не обновляет ее. Но, возможно, ваш драйвер к видеокарте поддерживает более позднюю версию OpenGL. Для доступа к новым возможностям следует воспользоваться механизмом расширений OpenGL.
Различные заинтересованные компании, такие как разработчики видеокарт, создают дополнительные расширения. Существует список официальных имен расширений, которые используются в названии имен функций. Например, имя SGis_fname указывает на расширение OpenGI, предложенное Silicon Graphics. Ниже приведен список основных создателей расширений.