OSG+Duilib显示osg

OSG+VS2015+Win10配置

OSG-Win32窗口显示osg

今天就分享一下duilib中如何显示osg。

duilib库这里不作过多的介绍,duilib的配置也很简单。

我们直接新建一个win32工程:

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 窗口的初始尺寸 -->
<Window size="1900,950" caption="0,0,0,32" roundcorner="2,2">
  <Font id="0" name="微软雅黑" size="12" bold="false"/>
  <Font id="1" name="微软雅黑" size="14" bold="false"/>
  <Font id="2" name="微软雅黑" size="13" bold="true"/>
  <!-- 整个窗口的背景 -->
  <VerticalLayout bkcolor="FFF6F6FA">
   <VerticalLayout name="BrowserClientLayout" bkcolor="FFF6F6F6"/> 
  </VerticalLayout >
</Window>

新建头文件
main_windows.h
用于定义我们的窗口类:

#include "UIlib.h"

class OsgWnd : public DuiLib::WindowImplBase {
public:

  OsgWnd() {}

  virtual ~OsgWnd() {}

protected:

  // Override --------------------------------------------------------

  virtual LPCTSTR GetWindowClassName() const override { return _T("OsgWnd"); }

  virtual DuiLib::CDuiString GetSkinFile() override { return _T("main.xml"); }

  virtual DuiLib::CDuiString GetSkinFolder() override { return _T(""); }

  virtual void InitWindow() override;

  virtual void OnFinalMessage(HWND hWnd) override;

  virtual LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) override;

  virtual void Notify(DuiLib::TNotifyUI& msg) override;

  virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) override;

private:

};

接下来实现OsgWnd :
新建源文件
main_window.cc

#include "main_window.h"

#include<map>

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/api/win32/GraphicsWindowWin32>
#include <osgUtil/Optimizer>
#include <osgGA/TrackballManipulator>
#include <osgDB/ReadFile>
#include <process.h>

osg::ref_ptr<osgViewer::Viewer> viewer;
osg::observer_ptr<osgViewer::GraphicsWindow> window;
osg::ref_ptr<osg::Group> root;
osg::ref_ptr<osg::Node> loadedModel;
osgUtil::Optimizer optimizer;
osg::ref_ptr<osg::GraphicsContext::Traits> traits;
osg::ref_ptr<osg::Referenced> windata;
osg::GraphicsContext* gc;
osg::ref_ptr<osg::Camera> camera;
bool renderok;



LRESULT OsgWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
  LRESULT res = __super::OnCreate(uMsg, wParam, lParam, bHandled);

  LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
  styleValue &= ~WS_CAPTION;
  ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);


  return res;
}

void render(void* ptr)
{
  while (!viewer->done())
  {
    viewer->frame();
  }
  renderok = true;
}

void OsgWnd::InitWindow() {
  root = new osg::Group;
  loadedModel = osgDB::readNodeFile("cessna.osg");
  optimizer.optimize(loadedModel.get());
  optimizer.reset();
  root->addChild(loadedModel.get());
  traits = new osg::GraphicsContext::Traits;
  windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);
  traits->x = 10;
  traits->y = 20;
  traits->width = 100;
  traits->height = 80;
  traits->windowDecoration = false;
  traits->doubleBuffer = true;
  traits->sharedContext = 0;
  traits->inheritedWindowData = windata;
  traits->setInheritedWindowPixelFormat = true;
  gc = osg::GraphicsContext::createGraphicsContext(traits.get());
  camera = new osg::Camera;
  camera->setGraphicsContext(gc);
  camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
  viewer = new osgViewer::Viewer;
  viewer->addSlave(camera.get());
  viewer->setSceneData(root.get());
  viewer->setCameraManipulator(new osgGA::TrackballManipulator);
  viewer->addEventHandler(new osgViewer::StatsHandler);
  viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
  viewer->realize();
  renderok = false;
  _beginthread(render, 0, NULL);
}

void OsgWnd::OnFinalMessage(HWND hWnd) {

}

void OsgWnd::Notify(DuiLib::TNotifyUI& msg) {

  __super::Notify(msg);
}

LRESULT OsgWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {
  return __super::HandleMessage(uMsg, wParam, lParam);
}

新建源文件
main.cc

#include "UIlib.h" 
#include "main_window.h"
using namespace DuiLib;
#ifdef _DEBUG 
# ifdef _UNICODE 
# pragma comment(lib, "DuiLib_ud.lib") 
# else 
# pragma comment(lib, "DuiLib_d.lib") 
# endif 
#else 
# ifdef _UNICODE 
# pragma comment(lib, "DuiLib_u.lib") 
# else 
# pragma comment(lib, "DuiLib.lib") 
# endif 
#endif 

using DuiLib::CPaintManagerUI;

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
  CPaintManagerUI::SetInstance(hInstance);
  CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());   

  OsgWnd duiFrame;
  duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
  duiFrame.CenterWindow();
  duiFrame.ShowModal();
  return 0;
}

运行结果:

notice
这个跟之前的win32程序下显示osg没有什么大的区别,注意这个:

windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);

如果注释上面的这句话,运行结果为
OSG+Duilib显示osg_第1张图片

可以看到osg与duilib没有了任何关系,osg显示为
traits->x = 10;
traits->y = 20;
traits->width = 100;
traits->height = 80;

你可能感兴趣的:(OSG)