// прямая обработка мыши

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. Ниже приведен список основных создателей расширений.


⇐ вернуться назад | | далее ⇒