void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; IrrlichtCreationParameters p = new IrrlichtCreationParameters(); p.DriverType = DriverType.Direct3D9; p.WindowID = (IntPtr)e.Argument; IrrlichtDevice device = IrrlichtDevice.CreateDevice(p); if (device == null) { // if device cannot be created by any reason - we just leave this thread, // after all IsRedering will report false, so it is all OK. return; } VideoDriver driver = device.VideoDriver; SceneManager smgr = device.SceneManager; GUIEnvironment gui = device.GUIEnvironment; // setup a simple 3d scene CameraSceneNode cam = smgr.AddCameraSceneNode(); cam.Target = new Vector3Df(0); SceneNodeAnimator anim = smgr.CreateFlyCircleAnimator(new Vector3Df(0, 15, 0), 30.0f); cam.AddAnimator(anim); anim.Drop(); SceneNode cube = smgr.AddCubeSceneNode(20); cube.SetMaterialTexture(0, driver.GetTexture("../../media/wall.bmp")); cube.SetMaterialTexture(1, driver.GetTexture("../../media/water.jpg")); cube.SetMaterialFlag(MaterialFlag.Lighting, false); cube.SetMaterialType(MaterialType.Reflection2Layer); smgr.AddSkyBoxSceneNode( "../../media/irrlicht2_up.jpg", "../../media/irrlicht2_dn.jpg", "../../media/irrlicht2_lf.jpg", "../../media/irrlicht2_rt.jpg", "../../media/irrlicht2_ft.jpg", "../../media/irrlicht2_bk.jpg"); gui.AddImage( driver.GetTexture("../../media/lime_logo_alpha.png"), new Vector2Di(30, 0)); // draw all while (device.Run()) { driver.BeginScene(false); smgr.DrawAll(); gui.DrawAll(); // draw stats int x = 20; int y = driver.ScreenSize.Height - 50; driver.Draw2DRectangle( new Recti(x, y, x + driver.ScreenSize.Width - 2 * x, y + 30), new IrrlichtLime.Video.Color(0, 0, 0, 128)); device.GUIEnvironment.BuiltInFont.Draw( "Driver: " + driver.Name, new Vector2Di(x + 5, y + 5), new IrrlichtLime.Video.Color(255, 255, 255)); device.GUIEnvironment.BuiltInFont.Draw( "FPS: " + driver.FPS.ToString(), new Vector2Di(x + 5, y + 15), new IrrlichtLime.Video.Color(255, 255, 255)); driver.EndScene(); // check for cancellation if (worker.CancellationPending) { device.Close(); } // check for new command lock (backgroundCommand) { switch (backgroundCommand.Type) { case Command.Kind.Resized: driver.ResizeNotify(backgroundCommand.Value as Dimension2Di); backgroundCommand.Clear(); break; } } } // drop the device device.Drop(); }