GLES drivers adapted, but only did make compile-tests. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@6038 dfc29bdd-3216-0410-991c-e03cc46cb475
		
			
				
	
	
		
			248 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <html>
 | |
| <head>
 | |
| <title>Irrlicht Engine Tutorial</title>
 | |
| <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | |
| </head>
 | |
| 
 | |
| <body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
 | |
| <br>
 | |
| <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center">
 | |
|   <tr> 
 | |
|     <td bgcolor="#666699" width="10"><b><a href="http://irrlicht.sourceforge.net" target="_blank"><img src="../../media/irrlichtlogo.jpg" width="88" height="31" border="0"></a></b></td>
 | |
|     <td bgcolor="#666699" width="100%">
 | |
| <div align="center">
 | |
|         <div align="left"><b><font color="#FFFFFF">Tutorial 14. Win32 Window</font></b></div>
 | |
|       </div>
 | |
|       </td>
 | |
|   </tr>
 | |
|   <tr bgcolor="#eeeeff"> 
 | |
|     <td height="90" colspan="2"> 
 | |
|       <div align="left"> 
 | |
|         <p> This example only runs in Windows and demonstrates that Irrlicht can 
 | |
|           run inside a win32 window. MFC and .NET Windows.Forms windows are possible 
 | |
|           too. </p>
 | |
|         <p>The program which is described here will look like this:</p>
 | |
|         <p align="center"><img src="../../media/014shot.jpg" width="256" height="200"><br>
 | |
|         </p>
 | |
|       </div>
 | |
|     </td>
 | |
|   </tr>
 | |
| </table>
 | |
| <br>
 | |
| <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center">
 | |
|   <tr> 
 | |
|     <td bgcolor="#666699"> <b><font color="#FFFFFF">Lets start!</font></b></td>
 | |
|   </tr>
 | |
|   <tr> 
 | |
|     <td height="90" bgcolor="#eeeeff" valign="top"> <div align="left"> 
 | |
|         <div align="left"> 
 | |
|           <p> In the begining, we create a windows window using the windows API. 
 | |
|             I'm not going to explain this code, because it is windows specific. 
 | |
|             See the MSDN or a windows book for details.</p>
 | |
|           <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
 | |
|             <tr> 
 | |
|               <td><pre>#include <irrlicht.h>
 | |
| #include <windows.h> <font color="#006600">// this example only runs with windows</font>
 | |
| 
 | |
| using namespace irr;
 | |
| 
 | |
| #pragma comment(lib, "irrlicht.lib")
 | |
| 
 | |
| HWND hOKButton;
 | |
| HWND hWnd;
 | |
| 
 | |
| static LRESULT CALLBACK CustomWndProc(HWND hWnd, UINT message,
 | |
|     WPARAM wParam, LPARAM lParam)
 | |
| {
 | |
| 	switch (message) 
 | |
| 	{
 | |
| 	case WM_COMMAND:
 | |
| 		{
 | |
| 			HWND hwndCtl = (HWND)lParam;
 | |
| 			int code = HIWORD(wParam);
 | |
| 
 | |
| 			if (hwndCtl == hOKButton)
 | |
| 			{
 | |
| 				DestroyWindow(hWnd);
 | |
| 				PostQuitMessage(0);
 | |
| 				return 0;
 | |
| 			}		
 | |
| 		}
 | |
| 		break;
 | |
| 	case WM_DESTROY:
 | |
| 		PostQuitMessage(0);
 | |
| 		return 0;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	return DefWindowProc(hWnd, message, wParam, lParam);
 | |
| }
 | |
| 
 | |
| int main()
 | |
| <font color="#006600">//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hpre, LPSTR cmd, int cc)</font>
 | |
| {
 | |
| 	HINSTANCE hInstance = 0;
 | |
| <font color="#006600">	// create dialog</font>
 | |
| 
 | |
| 	const char* Win32ClassName = "CIrrlichtWindowsTestDialog";
 | |
| 
 | |
| 	WNDCLASSEX wcex;
 | |
| 	wcex.cbSize			= sizeof(WNDCLASSEX); 
 | |
| 	wcex.style			= CS_HREDRAW | CS_VREDRAW;
 | |
| 	wcex.lpfnWndProc	= (WNDPROC)CustomWndProc;
 | |
| 	wcex.cbClsExtra		= 0;
 | |
| 	wcex.cbWndExtra		= DLGWINDOWEXTRA; 
 | |
| 	wcex.hInstance		= hInstance;
 | |
| 	wcex.hIcon			= NULL;
 | |
| 	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
 | |
| 	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW);
 | |
| 	wcex.lpszMenuName	= 0;
 | |
| 	wcex.lpszClassName	= Win32ClassName;
 | |
| 	wcex.hIconSm		= 0;
 | |
| 
 | |
| 	RegisterClassEx(&wcex);
 | |
| 
 | |
| 	DWORD style = WS_SYSMENU | WS_BORDER | WS_CAPTION | 
 | |
| 		WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_MAXIMIZEBOX
 | |
| 		| WS_MINIMIZEBOX | WS_SIZEBOX;
 | |
| 
 | |
| 	int windowWidth = 440;
 | |
| 	int windowHeight = 380;
 | |
| 
 | |
| 	hWnd = CreateWindow( Win32ClassName, "Irrlicht Win32 window example",
 | |
| 		style, 100, 100, windowWidth, windowHeight,
 | |
| 		NULL, NULL, hInstance, NULL);
 | |
| 
 | |
| 	RECT clientRect;
 | |
| 	GetClientRect(hWnd, &clientRect);
 | |
| 	windowWidth = clientRect.right;
 | |
| 	windowHeight = clientRect.bottom;
 | |
| 
 | |
| <font color="#006600">	// create ok butt</font>on
 | |
| 
 | |
| 	hOKButton = CreateWindow(
 | |
| 	    "BUTTON", "OK - Close", WS_CHILD | WS_VISIBLE | BS_TEXT, 
 | |
| 		windowWidth - 160, windowHeight - 40, 150, 30, hWnd, NULL, 
 | |
| 		hInstance, NULL);
 | |
| 
 | |
| <font color="#006600">	// create some text</font>
 | |
| 	
 | |
| 	CreateWindow("STATIC", 
 | |
|         "This is Irrlicht running inside a standard Win32 window.\n"\
 | |
| 		"Also mixing with MFC and .NET Windows.Forms is possible.",
 | |
| 		WS_CHILD | WS_VISIBLE, 20, 20, 400, 40, hWnd, NULL, hInstance, NULL);
 | |
| 
 | |
| <font color="#006600">	// create window to put irrlicht in</font>
 | |
| 
 | |
| 	HWND hIrrlichtWindow =<br />    CreateWindow("BUTTON", "", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 
 | |
| 			50, 80, 320, 220, hWnd, NULL, hInstance, NULL);
 | |
| 
 | |
| </pre></td>
 | |
|             </tr>
 | |
|           </table>
 | |
|           <p>So now that we have some window, we can create an Irrlicht device 
 | |
|             inside of it. We use Irrlicht createEx() function for this. We only 
 | |
|             need the handle (HWND) to that window, set it as windowsID parameter 
 | |
|             and start up the engine as usual. That's it.</p>
 | |
|           <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
 | |
|             <tr> 
 | |
|               <td><pre><font color="#006600">	// create irrlicht device in the button window</font>
 | |
| 
 | |
| 	irr::SIrrlichtCreationParameters param;
 | |
| 	param.WindowId = reinterpret_cast<s32>(hIrrlichtWindow); // hColorButton
 | |
| 	param.DriverType = video::EDT_OPENGL;
 | |
| 
 | |
| 	irr::IrrlichtDevice* device = irr::createDeviceEx(param);
 | |
| 	
 | |
| <font color="#006600">	// setup a simple 3d scene</font>
 | |
| 
 | |
| 	irr::scene::ISceneManager* smgr = device->getSceneManager();
 | |
| 	video::IVideoDriver* driver = device->getVideoDriver();
 | |
| 
 | |
| 	scene::ICameraSceneNode* cam = smgr->addCameraSceneNode();
 | |
| 	cam->setTarget(core::vector3df(0,0,0));
 | |
| 
 | |
| 	scene::ISceneNodeAnimator* anim =
 | |
| 	   smgr->createFlyCircleAnimator(core::vector3df(0,10,0), 30.0f);
 | |
| 	cam->addAnimator(anim);
 | |
| 	anim->drop();
 | |
| 
 | |
| 	scene::ISceneNode* cube = smgr->addCubeSceneNode(25);
 | |
| 	cube->setMaterialFlag(video::EMF_LIGHTING, false);
 | |
| 	
 | |
| 	cube->setMaterialTexture(0, driver->getTexture("../../media/rockwall.bmp"));
 | |
| 
 | |
| 	smgr->addSkyBoxSceneNode(
 | |
| 	driver->getTexture("../../media/irrlicht2_up.jpg"),
 | |
| 	driver->getTexture("../../media/irrlicht2_dn.jpg"),
 | |
| 	driver->getTexture("../../media/irrlicht2_lf.jpg"),
 | |
| 	driver->getTexture("../../media/irrlicht2_rt.jpg"),
 | |
| 	driver->getTexture("../../media/irrlicht2_ft.jpg"),
 | |
| 	driver->getTexture("../../media/irrlicht2_bk.jpg"));
 | |
| 
 | |
| <font color="#006600">	// show and execute dialog</font>
 | |
| 
 | |
| 	ShowWindow(hWnd , SW_SHOW);
 | |
| 	UpdateWindow(hWnd);
 | |
| </pre></td>
 | |
|             </tr>
 | |
|           </table>
 | |
|           <p>Now the only thing missing is the drawing loop using IrrlichtDevice::run(). 
 | |
|             We do this as usual. But instead of this, there is another possibility: 
 | |
|             You can also simply use your own message loop using GetMessage, DispatchMessage 
 | |
|             and whatever. Calling<br />
 | |
|             Device->run() will cause Irrlicht to dispatch messages internally 
 | |
|             too. You need not call Device->run() if you want to do your own 
 | |
|             message dispatching loop, but Irrlicht will not be able to fetch user 
 | |
|             input then and you have to do it on your own using the window messages, 
 | |
|             DirectInput, or whatever.</p>
 | |
|           <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
 | |
|             <tr> 
 | |
|               <td><pre>	while (device->run())
 | |
| 	{
 | |
| 		driver->beginScene(true, true, 0);
 | |
| 		smgr->drawAll();
 | |
| 		driver->endScene();
 | |
| 	}
 | |
| 
 | |
| <font color="#006600">	// the alternative, own message dispatching loop without Device->run() would
 | |
| 	// look like this:</font>
 | |
| 
 | |
| 	<font color="#006600">/*MSG msg;
 | |
| 	while (true)
 | |
| 	{
 | |
| 		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 | |
| 		{
 | |
| 			TranslateMessage(&msg);
 | |
| 			DispatchMessage(&msg);
 | |
| 
 | |
| 			if (msg.message == WM_QUIT)
 | |
| 				break;
 | |
| 		}
 | |
| 		
 | |
| 		// advance virtual time
 | |
| 		device->getTimer()->tick();
 | |
| 
 | |
| 		// draw engine picture
 | |
| 		driver->beginScene(true, true, 0);
 | |
| 		smgr->drawAll();
 | |
| 		driver->endScene();
 | |
| 	}*/</font>
 | |
| 
 | |
| 	device->closeDevice();
 | |
| 	device->drop();
 | |
| 
 | |
| 	return 0;
 | |
| }</pre></td>
 | |
|             </tr>
 | |
|           </table>
 | |
|           <p> That's it, Irrlicht now runs in your own windows window.</p>
 | |
|         </div>
 | |
|       </div>
 | |
|       </td>
 | |
|   </tr>
 | |
| </table>
 | |
| <p> </p>
 | |
|       </body>
 | |
| </html>
 |