Beispiel #1
0
void keyPressed(KeySym key)
{
    switch (key) {
        case XK_Escape:
            done = True;
            break;
        case XK_F1:
            killGLWindow();
            GLWin.fs = !GLWin.fs;
            createGLWindow("NeHe's Texture Mapping Tutorial",
                640, 480, 24, GLWin.fs);
            break;
        case XK_Left:
	    rotz -= 0.8f;		/*  rotate left */
	    break;
        case XK_Right:
	    rotz += 0.8f;		/*  rotate left */
	    break;
        case XK_Up:
	    divs++;				/*  Update the patch */
	    mybezier.dlBPatch = genBezier(mybezier, divs);
	    keys[XK_Up%256] = False;
	    break;
        case XK_Down:
	    divs--;				/*  Update the patch */
	    mybezier.dlBPatch = genBezier(mybezier, divs);
	    keys[XK_Down%256] = False;
	    break;
        case XK_space:
	    showCPoints = !showCPoints;
	    keys[XK_space%256] = False;
	    break;
    }
}
bool OpenGLGame::update()
{
	if ( !isActive() )						// 程序激活的么?
	{
		return true;
	}

	if ( isKeyPressed( VK_ESCAPE ) )				// ESC 按下了么?
	{
		return false;				// ESC 发出退出信号
	}

	// 不是退出的时候,刷新屏幕
	drawGLScene();				// 绘制场景
	::SwapBuffers( m_hDC );			// 交换缓存 (双缓存)

	processKeyEvent();

	if ( isKeyPressed( VK_F1 ) )					// F1键按下了么?
	{
		onKeyReleased( VK_F1 );			// 若是,使对应的Key数组中的值为 FALSE
		killGLWindow();					// 销毁当前的窗口
		m_bFullScreen = !m_bFullScreen; // 切换 全屏 / 窗口 模式

		// 重建 OpenGL 窗口
		if ( !createGLWindow() )
		{
			return false;				// 如果窗口未能创建,程序退出
		}
	}

	return true;
}
Beispiel #3
0
void keyPressed(KeySym key)
{
    switch (key)
    {
        case XK_Escape:
            done = True;
            break;
        case XK_F1:
            killGLWindow();
            GLWin.fs = !GLWin.fs;
            createGLWindow("NeHe's Blending Tutorial",
                1920, 1280, 24, GLWin.fs);
            break;
        case XK_f:
            filter += 1;
            if (filter > 2)
                filter = 0;
            break;
        case XK_l:
            light = !light;
            if (!light)
                glDisable(GL_LIGHTING);
            else
                glEnable(GL_LIGHTING);
            break;
        case XK_b:
            blend = !blend;
            if (blend)
            {
                glEnable(GL_BLEND);         /* turn blending on */
                glDisable(GL_DEPTH_TEST);   /* turn depth testing off */
            }
            else
            {
                glDisable(GL_BLEND);        /* turn blending off */
                glEnable(GL_DEPTH_TEST);    /* turn depth testing on */
            }
            break;
        case XK_Page_Up:
            z -= 0.02f;
            break;
        case XK_Page_Down:
            z += 0.02f;
            break;
        case XK_Up:
            speedX -= 0.01f;
            break;
        case XK_Down:
            speedX += 0.01f;
            break;
        case XK_Right:
            speedY += 0.01f;
            break;
        case XK_Left:
            speedY -= 0.01f;
            break;
    }
}
Beispiel #4
0
int main(void)
{
	createGLWindow("NeHe's Lesson 36",640,480,24,False); 		/* Create our window*/

	run();														/* Start Event-Loop */

	killGLWindow();												/* shutdown window */

	return 0;
}
Beispiel #5
0
int main(void)
{
    createGLWindow("Nehe's Lesson 34", 1920, 1280,24,False); /* Create our window*/

    LoadRawFile("Data/Terrain.raw", MAP_SIZE * MAP_SIZE, g_HeightMap); /* Load raw data */

    run();												/* Start Event-Loop */

    killGLWindow();										/* shutdown window */

    return 0;
}
Beispiel #6
0
int main()
{
	windowProcess = (LRESULT CALLBACK)windowProcessN;
	WNDCLASS window = createGLWindow((LPCWSTR)L"Moon Walk Demo", 1280, 800, false);
	onResize(1280, 800);
	glEnable(GL_DEPTH_TEST);

	MSG msg;
	bool done = false;

	initExtendedGL();

	current_state = new main_game();
	current_state->initialize();

	int version = 0;
	printf("%s\n", glGetString(GL_VERSION));
	while(!done)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			if(msg.message == WM_QUIT)
			{
				done = true;
			}
			else
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}

		current_state->updateLogic();
	
		// Draw graphics here.
		{
			// Set color and depth clear value
			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
			glClearColor(0.f, 0.f, 0.f, 0.f);

			current_state->updateGraphics();
		}

		current_state->updateSound();

		updateWindow();
	}
	killGLWindow();

	return 0;
}
Beispiel #7
0
void keyPressed(KeySym key)
{
    switch (key)
    {
        case XK_Escape:
            done = True;
            break;
        case XK_F1:
            killGLWindow();
            GLWin.fs = !GLWin.fs;
            createGLWindow("NeHe's Rotation Tutorial", 1920, 1280, 24, GLWin.fs);
            break;
    }
}
Beispiel #8
0
int main(void)
{
	createGLWindow("Piotr Cieslak & NeHe's Morphing Points Tutorial",640,480,24,False); /* Create our window*/

	Initialize(); 										/* Init Opengl*/

	run();												/* Start Event-Loop */

 	Deinitialize();										/* Release memory */

	killGLWindow();										/* shutdown window */

	return 0;
}
Beispiel #9
0
int main(void)
{
	createGLWindow("NeHe's Lesson 37",640,480,24,False);

	Initialize();

	run();

	Deinitialize();

	killGLWindow();

	return 0;
}
Beispiel #10
0
void keyPressed(KeySym key)
{
    switch (key)
    {
        case XK_Escape:
            done = True;
            break;
        case XK_F1:
            killGLWindow();
            GLWin.fs = !GLWin.fs;
            createGLWindow((char*)"NeHe's Textures, Lighting & Keyboard Tutorial",
                640, 480, 24, GLWin.fs);
            break;
        case XK_f:
            filter += 1;
            if (filter > 2)
                filter = 0;
            break;
        case XK_l:
            light = !light;
            if (!light)
                glDisable(GL_LIGHTING);
            else
                glEnable(GL_LIGHTING);
            break;
        case XK_Page_Up:
            z -= 0.02f;
            break;
        case XK_Page_Down:
            z += 0.02f;
            break;
        case XK_Up:
            speedX -= 0.01f;
            break;
        case XK_Down:
            speedX += 0.01f;
            break;
        case XK_Right:
            speedY += 0.01f;
            break;
        case XK_Left:
            speedY -= 0.01f;
            break;
    }
}
Beispiel #11
0
void keyAction()
{
    if (keys[keyCodes[0]])
        done = True;
    if (keys[keyCodes[1]])
    {
        killGLWindow();
        GLWin.fs = !GLWin.fs;
        createGLWindow("NeHe's Particle Engine", 1920, 1280, 24, GLWin.fs);
        keys[keyCodes[1]] = False;
    }    
    if (keys[keyCodes[7]] && slowdown > 1.0f)
        slowdown -= 0.01f;
    if (keys[keyCodes[8]] && slowdown < 4.0f)
        slowdown += 0.01f;
    if (keys[keyCodes[9]])
        zoom += 0.1f;
    if (keys[keyCodes[10]])
        zoom -= 0.1f;
    if (keys[keyCodes[11]])
    {
        rainbow = !rainbow;
        keys[keyCodes[11]] = False;
    }
    if ((keys[keyCodes[12]]) || (rainbow && delay > 25))
    {
        if (keys[keyCodes[12]])
            rainbow = False;
        delay = 0;
        color++;
        if (color > 11)
            color = 0;
        keys[keyCodes[12]] = False;
    }
    if ((keys[keyCodes[13]]) && (ySpeed < 200.0f))
        ySpeed += 1.0f;
    if ((keys[keyCodes[14]]) && (ySpeed > -200.0f))
        ySpeed -= 1.0f;
    if ((keys[keyCodes[15]]) && (xSpeed < 200.0f))
        xSpeed += 1.0f;
    if ((keys[keyCodes[16]]) && (xSpeed > -200.0f))
        xSpeed -= 1.0f;
    delay++;
}
BOOL OpenGLGame::createGLWindow()
{
	GLuint		PixelFormat;						// 保存查找匹配的结果
	WNDCLASS	wc;							// 窗口类结构
	DWORD		dwExStyle;						// 扩展窗口风格
	DWORD		dwStyle;						// 窗口风格

	RECT WindowRect;							// 取得矩形的左上角和右下角的坐标值
	WindowRect.left = ( long )0;						// 将Left   设为 0
	WindowRect.right = ( long )m_nWidth;						// 将Right  设为要求的宽度
	WindowRect.top = ( long )0;							// 将Top    设为 0
	WindowRect.bottom = ( long )m_nHeight;						// 将Bottom 设为要求的高度

	m_hInstance		= GetModuleHandle( NULL );			// 取得我们窗口的实例
	wc.style		= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;		// 移动时重画,并为窗口取得DC
	wc.lpfnWndProc		= ( WNDPROC ) &OpenGLGame::wndProc;				// WndProc处理消息
	wc.cbClsExtra		= 0;						// 无额外窗口数据
	wc.cbWndExtra		= 0;						// 无额外窗口数据
	wc.hInstance		= m_hInstance;					// 设置实例
	wc.hIcon		= LoadIcon( NULL, IDI_WINLOGO );			// 装入缺省图标
	wc.hCursor		= LoadCursor( NULL, IDC_ARROW );			// 装入鼠标指针
	wc.hbrBackground	= NULL;						// GL不需要背景
	wc.lpszMenuName		= NULL;						// 不需要菜单
	wc.lpszClassName	= "OpenG";					// 设定类名字


	if ( !RegisterClass( &wc ) )						// 尝试注册窗口类
	{
		MessageBox( NULL, "注册窗口失败", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 退出并返回FALSE
	}

	if ( m_bFullScreen )								// 要尝试全屏模式吗?
	{
		DEVMODE dmScreenSettings;						// 设备模式
		memset( &dmScreenSettings, 0, sizeof( dmScreenSettings ) );			// 确保内存清空为零
		dmScreenSettings.dmSize = sizeof( dmScreenSettings );			// Devmode 结构的大小
		dmScreenSettings.dmPelsWidth	= m_nWidth;				// 所选屏幕宽度
		dmScreenSettings.dmPelsHeight	= m_nHeight;				// 所选屏幕高度
		dmScreenSettings.dmBitsPerPel	= m_nBitMode;					// 每象素所选的色彩深度
		dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;



		// 尝试设置显示模式并返回结果。注: CDS_FULLSCREEN 移去了状态条。
		if ( ChangeDisplaySettings( &dmScreenSettings, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL )
		{
			// 若模式失败,提供两个选项:退出或在窗口内运行。
			if ( MessageBox( NULL, "全屏模式在当前显卡上设置失败!\n使用窗口模式?", "G", MB_YESNO | MB_ICONEXCLAMATION ) == IDYES )
			{
				m_bFullScreen = FALSE;				// 选择窗口模式(Fullscreen=FALSE)
			}
			else
			{
				// 弹出一个对话框,告诉用户程序结束
				MessageBox( NULL, "程序将被关闭", "错误", MB_OK | MB_ICONSTOP );
				return FALSE;					//  退出并返回 FALSE
			}
		}
	}


	if ( m_bFullScreen )								// 仍处于全屏模式吗?
	{
		dwExStyle = WS_EX_APPWINDOW;					// 扩展窗体风格
		dwStyle = WS_POPUP;						// 窗体风格
		ShowCursor( FALSE );						// 隐藏鼠标指针
	}
	else
	{
		dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// 扩展窗体风格
		dwStyle = WS_OVERLAPPEDWINDOW;					//  窗体风格
	}

	AdjustWindowRectEx( &WindowRect, dwStyle, FALSE, dwExStyle );		// 调整窗口达到真正要求的大小

	if ( !( m_hWnd = CreateWindowEx(	dwExStyle,				// 扩展窗体风格
	                                    "OpenG",				// 类名字
	                                    m_szTitle,					// 窗口标题
	                                    WS_CLIPSIBLINGS |			// 必须的窗体风格属性
	                                    WS_CLIPCHILDREN |			// 必须的窗体风格属性
	                                    dwStyle,				// 选择的窗体属性
	                                    0, 0,					// 窗口位置
	                                    WindowRect.right - WindowRect.left,	// 计算调整好的窗口宽度
	                                    WindowRect.bottom - WindowRect.top,	// 计算调整好的窗口高度
	                                    NULL,					// 无父窗口
	                                    NULL,					// 无菜单
	                                    m_hInstance,				// 实例
	                                    NULL ) ) )					// 不向WM_CREATE传递任何东东
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能创建一个窗口设备描述表", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	static	PIXELFORMATDESCRIPTOR pfd =					// /pfd 告诉窗口我们所希望的东东,即窗口使用的像素格式
	{
		sizeof( PIXELFORMATDESCRIPTOR ),					// 上述格式描述符的大小
		1,								// 版本号
		PFD_DRAW_TO_WINDOW |						// 格式支持窗口
		PFD_SUPPORT_OPENGL |						// 格式必须支持OpenGL
		PFD_DOUBLEBUFFER,						// 必须支持双缓冲
		PFD_TYPE_RGBA,							// 申请 RGBA 格式
		m_nBitMode,								// 选定色彩深度
		0, 0, 0, 0, 0, 0,						// 忽略的色彩位
		0,								// 无Alpha缓存
		0,								// 忽略Shift Bit
		0,								// 无累加缓存
		0, 0, 0, 0,							// 忽略聚集位
		16,								// 16位 Z-缓存 (深度缓存)
		0,								// 无蒙板缓存
		0,								// 无辅助缓存
		PFD_MAIN_PLANE,							// 主绘图层
		0,								// Reserved
		0, 0, 0								// 忽略层遮罩
	};


	if ( !( m_hDC = GetDC( m_hWnd ) ) )							// 取得设备描述表了么?
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能创建一种相匹配的像素格式", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	if ( !( PixelFormat = ChoosePixelFormat( m_hDC, &pfd ) ) )				// Windows 找到相应的象素格式了吗?
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能设置像素格式", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	if( !SetPixelFormat( m_hDC, PixelFormat, &pfd ) )				// 能够设置象素格式么?
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能设置像素格式", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}


	if ( !( m_hRC = wglCreateContext( m_hDC ) ) )					// 能否取得着色描述表?
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能创建OpenGL渲染描述表", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	if( !wglMakeCurrent( m_hDC, m_hRC ) )						// 尝试激活着色描述表
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "不能激活当前的OpenGL渲然描述表", "错误", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}

	ShowWindow( m_hWnd, SW_SHOW );						// 显示窗口
	SetForegroundWindow( m_hWnd );						// 略略提高优先级
	SetFocus( m_hWnd );								// 设置键盘的焦点至此窗口
	resizeGLScene( m_nWidth, m_nHeight );						// 设置透视 GL 屏幕


	if ( !initGL() )								// 初始化新建的GL窗口
	{
		killGLWindow();							// 重置显示区
		MessageBox( NULL, "Initialization Failed.", "ERROR", MB_OK | MB_ICONEXCLAMATION );
		return FALSE;							// 返回 FALSE
	}


	return TRUE;								// 成功
}
Beispiel #13
0
int main(int argc, char **argv)
{
    XEvent event;
    KeySym key;
    
    done = False;
    /* default to fullscreen */
    GLWin.fs = True;
    createGLWindow("NeHe's Rotation Tutorial", 1920, 1280, 24, GLWin.fs);

    /* wait for events*/ 
    while (!done)
    {
        /* handle the events in the queue */
        while (XPending(GLWin.dpy) > 0)
        {
            XNextEvent(GLWin.dpy, &event);
            switch (event.type)
            {
                case Expose:
	                if (event.xexpose.count != 0)
	                    break;
                    drawGLScene();
         	        break;
	            case ConfigureNotify:
	            /* call resizeGLScene only if our window-size changed */
	                if ((event.xconfigure.width != GLWin.width) || 
	                    (event.xconfigure.height != GLWin.height))
	                {
	                    GLWin.width = event.xconfigure.width;
	                    GLWin.height = event.xconfigure.height;
                        printf("Resize event\n");
	                    resizeGLScene(event.xconfigure.width,
	                        event.xconfigure.height);
	                }
	                break;
                /* exit in case of a mouse button press */
                case ButtonPress:
                    done = True;
                    break;
                case KeyPress:
                    key = XLookupKeysym(&event.xkey, 0);
                    keyPressed(key);
                    break;
                case ClientMessage:
                    if (*XGetAtomName(GLWin.dpy, event.xclient.message_type) == 
                        *"WM_PROTOCOLS")
                    {
                        printf("Exiting sanely...\n");
                        done = True;
                    }
                    break;
                default:
                    break;
            }
        }
        drawGLScene();
    }
    killGLWindow();
    return 0;
}