inline void __track_move(GutMouseInfo mouse) { int px, py, buttonState[3]; GutGetMouseState(px, py, buttonState); m_fTouchX = (px / (m_iCanvasWidth / 2.0)) - 0.98; m_fTouchY = (-1 * (py / (m_iCanvasHeight / 2.0))) + 0.95; }
// `使用OpenGL來繪圖` void RenderFrameOpenGL(void) { // `取得視窗大小` int w, h; GutGetWindowSize(w, h); // `清除畫面` glClearColor(0.4f, 0.4f, 0.4f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // `在螢幕上畫出行星運動` RenderSolarSystemOpenGL(false); /* `啟動Selection Buffer, 硬體會試著去重畫一次3D物件,` `但不會更新畫面, 只會記錄下落在畫面中某個范圍內所有3D物件.` */ int x,y,buttons[3]; GutGetMouseState(x, y, buttons); if ( buttons[0] ) { GLint viewport[4]; glSelectBuffer(BUFSIZE,selectBuf); glRenderMode(GL_SELECT); glInitNames(); glGetIntegerv(GL_VIEWPORT,viewport); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); // `設定Selection Buffer的檢查范圍` gluPickMatrix(x, viewport[3]-y, 3, 3, viewport); float fRatio = (viewport[2]+0.0) / viewport[3]; glMultMatrixf( (float *)&g_projection_matrix ); // `在Selection Buffer中畫出3D物件` RenderSolarSystemOpenGL(true); int hits = glRenderMode(GL_RENDER); GLuint *ptr = selectBuf; GLuint Zmin = 0xffffffff; GLuint SelectedObject = 0; // `找出檢查范圍中, 距離鏡頭最近的物體.` for ( int i=0; i<hits; i++, ptr+=4 ) { if ( ptr[1] < Zmin ) { Zmin = ptr[1]; SelectedObject = ptr[3]; } } switch(SelectedObject) { default: case 0: printf("Nothing\r"); break; case 1: printf("Sun \r"); break; case 2: printf("Earth \r"); break; } glMatrixMode(GL_PROJECTION); glPopMatrix(); } // `把背景backbuffer的畫面呈現出來` GutSwapBuffersOpenGL(); }