Hi,
I define a manipulator for my project that rotates the scene using arrow keys
and view the scene in a control of windows form by using a thread. But my
manipulator does not work when I embed the scene into windows form. Here is my
code.
Viewer osgViewer;
void OSGProject::OSGThread()
{
MyManipulator* myManpltr = new MyManipulator();
osgViewer.setCameraManipulator(myManpltr);
osgViewer.getCamera()->setProjectionMatrixAsPerspective(90, 1, 1, 100);
Matrix initialTranslate;
initialTranslate.makeTranslate(0, 0, 0);
Matrix initialRotate;
initialRotate.makeRotate(180, Vec3(1, 1, 1));
osgViewer.getCamera()->setViewMatrix( initialRotate * initialTranslate
);
osgViewer.run();
}
void OSGProject::show(System::IntPtr controlToRender)
{
mapNode =
readNodeFile(msclr::interop::marshal_as<string>(mapPath->Copy(mapPath)));
Group* root = new Group();
root->addChild(mapNode);
osgViewer.setSceneData(root);
RECT rect;
HWND mHwnd=(HWND)controlToRender.ToPointer();
GetWindowRect(mHwnd, &rect);
osg::ref_ptr<osg::Referenced> windata = new
osgViewer::GraphicsWindowWin32::WindowData(mHwnd);
osg::ref_ptr<osg::GraphicsContext::Traits> traits=new
osg::GraphicsContext::Traits();
traits->x = 0;
traits->y = 0;
traits->width = rect.right - rect.left;
traits->height = rect.bottom - rect.top;
traits->windowDecoration = false;
traits->doubleBuffer = true;
traits->sharedContext = 0;
traits->supportsResize = true;
traits->inheritedWindowData = windata;
traits->setInheritedWindowPixelFormat = true;
PIXELFORMATDESCRIPTOR pixelFormat =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
24,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
HDC hdc = ::GetDC(mHwnd);
if (hdc==0)
{
::DestroyWindow(mHwnd);
return ;
}
int pixelFormatIndex = ::ChoosePixelFormat(hdc, &pixelFormat);
if (pixelFormatIndex==0)
{
::ReleaseDC(mHwnd, hdc);
::DestroyWindow(mHwnd);
return ;
}
if (!::SetPixelFormat(hdc, pixelFormatIndex, &pixelFormat))
{
::ReleaseDC(mHwnd, hdc);
::DestroyWindow(mHwnd);
return ;
}
osg::ref_ptr<osg::GraphicsContext>
gc=osg::GraphicsContext::createGraphicsContext(traits.get());
osg::ref_ptr<osg::Camera> camera=new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(0,0,traits->width,traits->height));
camera->setDrawBuffer(GL_BACK);
camera->setReadBuffer(GL_BACK);
osgViewer.addSlave(camera.get());
System::Threading::Thread^ OSGthread;
OSGthread=gcnew System::Threading::Thread(gcnew
System::Threading::ThreadStart(this, &OSGProject::OSGThread));
OSGthread->Priority=Threading::ThreadPriority::BelowNormal;
OSGthread->Start();
}
Thank you!
Cheers,
Tufan
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=22486#22486
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org