查看: 3650|回复: 1

wxWidget+osg

[复制链接]

该用户从未签到

发表于 2012-3-31 17:56:47 | 显示全部楼层 |阅读模式
  1. #include <iostream>
  2. #include <string>
  3. #include <wx/wx.h>
  4. #include <wx/glcanvas.h>
  5. #include <wx/cursor.h>
  6. #include <osgViewer/Viewer>
  7. #include <osg/GraphicsContext>
  8. #include <osgDB/ReadFile>
  9. #include <osgViewer/ViewerEventHandlers>
  10. #include <osgGA/TrackballManipulator>

  11. class MyGraphicsWindow;
  12. class MyCanvas : public wxGLCanvas
  13. {
  14. public:
  15.         MyCanvas(wxWindow * parent, wxWindowID id = wxID_ANY, int * attributeList = 0);
  16.         virtual ~MyCanvas();
  17. public:
  18.         DECLARE_EVENT_TABLE()

  19.     void OnPaint(wxPaintEvent& event);
  20.     void OnSize(wxSizeEvent& event);
  21.     void OnEraseBackground(wxEraseEvent& event);

  22.     void OnChar(wxKeyEvent &event);
  23.     void OnKeyUp(wxKeyEvent &event);

  24.     void OnMouseEnter(wxMouseEvent &event);
  25.     void OnMouseDown(wxMouseEvent &event);
  26.     void OnMouseUp(wxMouseEvent &event);
  27.     void OnMouseMotion(wxMouseEvent &event);
  28.     void OnMouseWheel(wxMouseEvent &event);
  29. public:
  30.         void SetGraphicsWindow(osgViewer::GraphicsWindow * gw);
  31.         void UseCursor(bool value);
  32. private:
  33.         osg::ref_ptr<osgViewer::GraphicsWindow> _graphics_window;
  34.         wxCursor _oldCursor;
  35. };

  36. MyCanvas::MyCanvas(wxWindow * parent, wxWindowID id, int * attributeList)
  37.         :wxGLCanvas(parent, id, attributeList)
  38. {
  39.         _oldCursor = *wxSTANDARD_CURSOR;
  40. }

  41. MyCanvas::~MyCanvas()
  42. {

  43. }
  44. BEGIN_EVENT_TABLE(MyCanvas, wxGLCanvas)
  45.         EVT_SIZE                (MyCanvas::OnSize)
  46.     EVT_PAINT               (MyCanvas::OnPaint)
  47.     EVT_ERASE_BACKGROUND    (MyCanvas::OnEraseBackground)

  48.     EVT_CHAR                (MyCanvas::OnChar)
  49.     EVT_KEY_UP              (MyCanvas::OnKeyUp)

  50.     EVT_ENTER_WINDOW        (MyCanvas::OnMouseEnter)
  51.     EVT_LEFT_DOWN           (MyCanvas::OnMouseDown)
  52.     EVT_MIDDLE_DOWN         (MyCanvas::OnMouseDown)
  53.     EVT_RIGHT_DOWN          (MyCanvas::OnMouseDown)
  54.     EVT_LEFT_UP             (MyCanvas::OnMouseUp)
  55.     EVT_MIDDLE_UP           (MyCanvas::OnMouseUp)
  56.     EVT_RIGHT_UP            (MyCanvas::OnMouseUp)
  57.     EVT_MOTION              (MyCanvas::OnMouseMotion)
  58.     EVT_MOUSEWHEEL          (MyCanvas::OnMouseWheel)
  59. END_EVENT_TABLE()

  60. void MyCanvas::OnPaint(wxPaintEvent & evnet)
  61. {
  62.         wxPaintDC dc(this);
  63. }

  64. void MyCanvas::OnSize(wxSizeEvent& event)
  65. {
  66.         wxGLCanvas::OnSize(event);
  67.     int width, height;
  68.     GetClientSize(&width, &height);

  69.     if (_graphics_window.valid())
  70.     {
  71.         _graphics_window->getEventQueue()->windowResize(0, 0, width, height);
  72.         _graphics_window->resized(0,0,width,height);
  73.     }
  74. }

  75. void MyCanvas::OnEraseBackground(wxEraseEvent& WXUNUSED(event))
  76. {
  77. }

  78. void MyCanvas::OnChar(wxKeyEvent &event)
  79. {
  80. #if wxUSE_UNICODE
  81.     int key = event.GetUnicodeKey();
  82. #else
  83.     int key = event.GetKeyCode();
  84. #endif

  85.     if (_graphics_window.valid())
  86.         _graphics_window->getEventQueue()->keyPress(key);
  87. }

  88. void MyCanvas::OnKeyUp(wxKeyEvent &event)
  89. {
  90. #if wxUSE_UNICODE
  91.     int key = event.GetUnicodeKey();
  92. #else
  93.     int key = event.GetKeyCode();
  94. #endif

  95.     if (_graphics_window.valid())
  96.         _graphics_window->getEventQueue()->keyRelease(key);
  97. }

  98. void MyCanvas::OnMouseEnter(wxMouseEvent &event)
  99. {
  100.     SetFocus();
  101. }

  102. void MyCanvas::OnMouseDown(wxMouseEvent &event)
  103. {
  104.     if (_graphics_window.valid())
  105.     {
  106.         _graphics_window->getEventQueue()->mouseButtonPress(event.GetX(), event.GetY(),
  107.             event.GetButton());
  108.     }
  109. }

  110. void MyCanvas::OnMouseUp(wxMouseEvent &event)
  111. {
  112.     if (_graphics_window.valid())
  113.     {
  114.         _graphics_window->getEventQueue()->mouseButtonRelease(event.GetX(), event.GetY(),
  115.             event.GetButton());
  116.     }
  117. }

  118. void MyCanvas::OnMouseMotion(wxMouseEvent &event)
  119. {
  120.     if (_graphics_window.valid())
  121.         _graphics_window->getEventQueue()->mouseMotion(event.GetX(), event.GetY());
  122. }

  123. void MyCanvas::OnMouseWheel(wxMouseEvent &event)
  124. {
  125.     int delta = event.GetWheelRotation() / event.GetWheelDelta() * event.GetLinesPerAction();

  126.     if (_graphics_window.valid()) {
  127.         _graphics_window->getEventQueue()->mouseScroll(
  128.             delta>0 ?
  129.             osgGA::GUIEventAdapter::SCROLL_UP :
  130.             osgGA::GUIEventAdapter::SCROLL_DOWN);
  131.     }
  132. }
  133. void MyCanvas::UseCursor(bool value)
  134. {
  135.         if (value) {
  136.                 SetCursor(_oldCursor);
  137.         } else {
  138.                 _oldCursor = GetCursor();

  139.                 wxImage image(1, 1);
  140.                 image.SetMask(true);
  141.                 image.SetMaskColour(0, 0, 0);
  142.                 wxCursor cursor(image);
  143.                 SetCursor(cursor);

  144.         }
  145. }

  146. void MyCanvas::SetGraphicsWindow(osgViewer::GraphicsWindow * gw)
  147. {
  148.         _graphics_window = gw;
  149. }

  150. class MyGraphicsWindow : public osgViewer::GraphicsWindow
  151. {

  152. public:
  153.         MyGraphicsWindow(MyCanvas * canvas);
  154.         virtual ~MyGraphicsWindow();
  155.         void init();

  156.         void grabFocus();
  157.         void grabFocusIfPointerInWindow();
  158.         void useCursor(bool cursorOn);

  159.         bool makeCurrentImplementation();
  160.         void swapBuffersImplementation();

  161.     virtual bool valid() const { return true; }
  162.     virtual bool realizeImplementation() { return true; }
  163.     virtual bool isRealizedImplementation() const  { return _canvas->IsShownOnScreen(); }
  164.     virtual void closeImplementation() {}
  165.     virtual bool releaseContextImplementation() { return true; }
  166. private:
  167.         MyCanvas * _canvas;
  168.         wxGLContext * _glContext;
  169. };

  170. MyGraphicsWindow::MyGraphicsWindow(MyCanvas * canvas)
  171. {
  172.     _canvas = canvas;

  173.     this->_traits = new GraphicsContext::Traits;
  174.         _glContext = new wxGLContext(_canvas);
  175.     wxPoint pos = _canvas->GetPosition();
  176.     wxSize  size = _canvas->GetSize();

  177.     this->_traits->x = pos.x;
  178.     this->_traits->y = pos.y;
  179.     this->_traits->width = size.x;
  180.     this->_traits->height = size.y;

  181.     init();
  182. }

  183. MyGraphicsWindow::~MyGraphicsWindow()
  184. {
  185.         delete _glContext;
  186. }

  187. void MyGraphicsWindow::init()
  188. {
  189.          if (valid())
  190.     {
  191.         setState( new osg::State );
  192.         getState()->setGraphicsContext(this);

  193.         if (_traits.valid() && _traits->sharedContext)
  194.         {
  195.             getState()->setContextID( _traits->sharedContext->getState()->getContextID() );
  196.             incrementContextIDUsageCount( getState()->getContextID() );
  197.         }
  198.         else
  199.         {
  200.             getState()->setContextID( osg::GraphicsContext::createNewContextID() );
  201.         }
  202.     }
  203. }

  204. void MyGraphicsWindow::grabFocus()
  205. {
  206.         _canvas->SetFocus();
  207. }

  208. void MyGraphicsWindow::grabFocusIfPointerInWindow()
  209. {
  210.         wxPoint pos = wxGetMousePosition();
  211.         if (wxFindWindowAtPoint(pos) == _canvas)
  212.                 _canvas->SetFocus();
  213. }

  214. void MyGraphicsWindow::useCursor(bool cursorOn)
  215. {
  216.         _canvas->UseCursor(cursorOn);
  217. }

  218. bool MyGraphicsWindow::makeCurrentImplementation()
  219. {
  220.         _canvas->SetCurrent(*_glContext);
  221.        
  222.         return true;
  223. }

  224. void MyGraphicsWindow::swapBuffersImplementation()
  225. {
  226.         _canvas->SwapBuffers();
  227. }

  228. class MyFrame : public wxFrame
  229. {

  230. public:
  231.         MyFrame(const wxString& title = wxT("我的窗口"));
  232.         virtual ~MyFrame();
  233. private:
  234.         DECLARE_EVENT_TABLE()
  235.         void OnIdle(wxIdleEvent &event);
  236. public:
  237.         osg::ref_ptr<osgViewer::Viewer> _viewer;
  238.         MyCanvas * _canvas;
  239.         MyGraphicsWindow * _myGraphicsWindow;
  240.         osg::ref_ptr<osg::Node> loadedModel;
  241. };

  242. MyFrame::MyFrame(const wxString & title)
  243.     :wxFrame(NULL, wxID_ANY, title, wxPoint(0, 0), wxSize(1024, 768))
  244. {
  245.        
  246.         _canvas = new MyCanvas(this);
  247.         _myGraphicsWindow = new MyGraphicsWindow(_canvas);
  248.         _canvas->SetGraphicsWindow(_myGraphicsWindow);
  249.        
  250.         _viewer = new osgViewer::Viewer;
  251.         _viewer->getCamera()->setGraphicsContext(_myGraphicsWindow);
  252.         _viewer->getCamera()->setViewport(0,0,1024,768);
  253.     _viewer->addEventHandler(new osgViewer::StatsHandler);
  254.     _viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
  255.         loadedModel= osgDB::readNodeFile(std::string("cow.osg"));
  256.        
  257.         _viewer->setSceneData(loadedModel.get());
  258.         _viewer->setCameraManipulator(new osgGA::TrackballManipulator);
  259. }

  260. MyFrame::~MyFrame()
  261. {
  262. }

  263. BEGIN_EVENT_TABLE(MyFrame, wxFrame)
  264.     EVT_IDLE(MyFrame::OnIdle)
  265. END_EVENT_TABLE()


  266. void MyFrame::OnIdle(wxIdleEvent &event)
  267. {
  268.     if (!_viewer->isRealized())
  269.         return;

  270.         _viewer->frame();
  271.     event.RequestMore();
  272. }

  273. class MyApp : public wxApp
  274. {
  275. private:
  276.         virtual bool OnInit()
  277.         {
  278.                 MyFrame * f = new MyFrame;
  279.                 f->Show(true);
  280.                 return true;
  281.         }
  282. };

  283. DECLARE_APP(MyApp)
  284. IMPLEMENT_APP(MyApp)
复制代码
wxWidgets-2.9.3对于OPENGL提供的接口略有改动,经过几天的研究终于弄好了。。。

该用户从未签到

 楼主| 发表于 2012-3-31 18:00:18 | 显示全部楼层
wxWidgets-2.9.3 中必须显式创建wxGLContext * _glContext;

在以前的版本中则不需要,详情看wxWidgets最新的API文档
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表