您的位置:首页 > 产品设计 > UI/UE

OSG+Duilib显示osg

2016-06-13 23:35 232 查看
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显示为

traits->x = 10;

traits->y = 20;

traits->width = 100;

traits->height = 80;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: