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;
	}
Example #2
0
// `使用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();
}