OSG嵌入Win32窗口的例子

来源:互联网 发布:舒尔特表软件下载 编辑:程序博客网 时间:2024/06/05 18:13

-----由ARRAY创作,,自由传播~~~~
下面是一个OSG嵌入Win32 API窗口的例子,我自己没事琢磨的~~应该有不少冗余和没用的地方,不过保证是可以用的~~在家里的豪华配置的电脑上(Intel Core 1.78G,Geforce7600GS)偶尔遇到帧速变得很慢的情形,不过在实验室的破机器上(AMD2600,Radeon7500)运行很流畅,呵呵,不知道是什么原因,还请大家指正~~

这个Win32API窗口的例子中,OSG的部分是参考MFC和其它GUI库的嵌入方法设计的,使用了Windows的多线程函数来执行osgViewer的渲染,这一点和MFC的例子相同。
Win32窗口的部分可以参照Win32窗口编程的任意一本书籍,架构都是基本一样的~~事实上研究Win32 API编程对于学习Windows本身极其有好处,而且像MiniGUI这样的GUI库也是模仿Win32 API窗口的函数来构建的,方便学习代码的移植~~
(虽然现在还不可能移植~~MiniGUI不支持OpenGL -______-)

下周可能还会有些事情,然后我打算对2.0版本的一些例子程序作注释,以利自己和大家学习;还有正在做一个OSG加工仿真相关的项目。
另外还有就是OSGQSG翻译的事:其实第三章已经翻译完成了,我和作者Paul Martz联系并获得CGSD的翻译授权之后,已经决定将中文版放在lulu.com(也就是大家下载英文版的地方)上供免费下载,这一工作预计将在数周后完成,主要是文字校对和排版的工作,到时候可能也有纸质的版本可供购买,呵呵,谢谢大家支持。(我不从中获益的,所以这个不算广告,呵呵~~)
-------------------------------------------------------

  1. #include <windows.h>
  2. #include <osgViewer/Viewer>
  3. #include <osgViewer/ViewerEventHandlers>
  4. #include <osgViewer/api/win32/GraphicsWindowWin32>
  5. #include <osgUtil/Optimizer>
  6. #include <osgGA/TrackballManipulator>
  7. #include <osgDB/ReadFile>
  8. #include <process.h>
  9. osg::ref_ptr<osgViewer::Viewer> viewer;
  10. osg::observer_ptr<osgViewer::GraphicsWindow> window;
  11. osg::ref_ptr<osg::Group> root;
  12. osg::ref_ptr<osg::Node> loadedModel;
  13. osgUtil::Optimizer optimizer;
  14. osg::ref_ptr<osg::GraphicsContext::Traits> traits;
  15. osg::ref_ptr<osg::Referenced> windata;
  16. osg::GraphicsContext* gc;
  17. osg::ref_ptr<osg::Camera> camera;
  18. bool renderok;
  19. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  20. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  21. {
  22. static TCHAR szAppName[] = TEXT("HelloWin");
  23. HWND hwnd;
  24. MSG msg;
  25. WNDCLASS wndclass;
  26. wndclass.style = CS_HREDRAW | CS_VREDRAW;
  27. wndclass.lpfnWndProc = WndProc;
  28. wndclass.cbClsExtra = 0;
  29. wndclass.cbWndExtra = 0;
  30. wndclass.hInstance = hInstance;
  31. wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  32. wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  33. wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  34. wndclass.lpszMenuName = NULL;
  35. wndclass.lpszClassName = szAppName;
  36. if (!RegisterClass(&wndclass))
  37. {
  38. MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
  39. return 0;
  40. }
  41. hwnd = CreateWindow( szAppName, // window class name
  42. TEXT ("The Hello Program"), // window caption
  43. WS_OVERLAPPEDWINDOW, // window style
  44. 100, // initial x position
  45. 100, // initial y position
  46. 800, // initial x size
  47. 600, // initial y size
  48. NULL, // parent window handle
  49. NULL, // window menu handle
  50. hInstance, // program instance handle
  51. NULL); // creation parameters
  52. ShowWindow(hwnd, iCmdShow);
  53. UpdateWindow(hwnd);
  54. while (GetMessage(&msg, NULL, 0, 0))
  55. {
  56. TranslateMessage(&msg);
  57. DispatchMessage(&msg);
  58. }
  59. return (int)msg.wParam;
  60. }
  61. void render(void* ptr)
  62. {
  63. while (!viewer->done())
  64. {
  65. viewer->frame();
  66. }
  67. renderok = true;
  68. }
  69. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  70. {
  71. switch (message)
  72. {
  73. case WM_CREATE:
  74. root = new osg::Group;
  75. loadedModel = osgDB::readNodeFile("D:/OpenSceneGraph/bin/exe/cessna.osg");
  76. if (!loadedModel)
  77. return 1;
  78. optimizer.optimize(loadedModel.get());
  79. optimizer.reset();
  80. root->addChild(loadedModel.get());
  81. traits = new osg::GraphicsContext::Traits;
  82. windata = new osgViewer::GraphicsWindowWin32::WindowData(hwnd);
  83. traits->x = 0;
  84. traits->y = 0;
  85. traits->width = 800;
  86. traits->height = 600;
  87. traits->windowDecoration = false;
  88. traits->doubleBuffer = true;
  89. traits->sharedContext = 0;
  90. traits->inheritedWindowData = windata;
  91. traits->setInheritedWindowPixelFormat = true;
  92. gc = osg::GraphicsContext::createGraphicsContext(traits.get());
  93. camera = new osg::Camera;
  94. camera->setGraphicsContext(gc);
  95. camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
  96. viewer = new osgViewer::Viewer;
  97. viewer->addSlave(camera.get());
  98. viewer->setSceneData(root.get());
  99. viewer->setCameraManipulator(new osgGA::TrackballManipulator);
  100. viewer->addEventHandler(new osgViewer::StatsHandler);
  101. viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
  102. viewer->realize();
  103. renderok = false;
  104. _beginthread(render, 0, NULL);
  105. return 0;
  106. case WM_PAINT:
  107. return 0;
  108. case WM_DESTROY:
  109. viewer->setDone(true);
  110. while (!renderok)
  111. {
  112. Sleep(10);
  113. }
  114. PostQuitMessage(0);
  115. return 0;
  116. }
  117. return DefWindowProc(hwnd, message, wParam, lParam);
  118. }
原创粉丝点击