Yes I'm on windows platform Win8.1 x64 - minGW 4.7.1
Rendering loop is from graphic engine namely OpenSceneGraph 3.4 version, here is the code :
After your post I noticed that I've created the OnIdle event handler of WxWidgetFrame(derived from wxFrame) not the intended one wxApp as aritcle instructs. I'll change that but, for the time being app has some nuisance global variables which I have to sort out, beforehand.
For sake consitency I 'll attach the unmodified source code, later on I'll report the progress.
Code: Select all
void WidgetInitializeOSG(HWND win_handle)
{
root_node = new osg::Group;
// RUBBER LINE DEFINITIONS
rubber_line = new osg::Geometry;
rubber_line->setName("Rubber Line");
osg::Vec3Array *vers = new osg::Vec3Array(2);
(*vers)[0] = osg::Vec3d(0,0,0);
(*vers)[1] = osg::Vec3d(0,10,0);
rubber_line->setVertexArray(vers);
rubber_line->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,0,2));
osg::ref_ptr<osg::Geode> gode= new osg::Geode;
gode->addDrawable(rubber_line);
root_node->addChild(gode);
draw_rubber = true;
hud_text = new osgText::Text;
PAT = new osg::PositionAttitudeTransform;
// CREATE DEVICE CONTEXT
HWND frame_wnd = win_handle; //HWND( wxWidgets_ToolbarFrame::GetHandle() ); ORIGINAL CODE
osg::ref_ptr<osgFX::Outline> outline = new osgFX::Outline;
outline->setWidth( 8 );
outline->setColor( osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) );
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;
traits->width = 800;
traits->height = 600;
traits->windowDecoration = false;
traits->doubleBuffer = true;
//traits->inheritedWindowData = windata;
traits->inheritedWindowData = new osgViewer::GraphicsWindowWin32::WindowData(win_handle);
traits->setInheritedWindowPixelFormat = true;
traits->sharedContext = NULL;
traits->supportsResize = true;
RECT rect;
::GetWindowRect(frame_wnd,&rect );
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext( traits.get() );
g_viewer->getCamera()->setGraphicsContext( gc.get());
g_viewer->getCamera()->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );
g_viewer->getCamera()->setProjectionMatrixAsPerspective( 60.0f,(double)traits->width/(double)traits->height,1.0,10000.0 );
root = new osg::Geode;
osg::ref_ptr<osg::ShapeDrawable> shape1 = new osg::ShapeDrawable;
shape1->setShape( new osg::Box(osg::Vec3(-3.0f, 0.0f, 0.0f), 2.0f, 2.0f, 1.0f) );
g_viewer->getCamera()->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("D:/../OpenSceneGraph-Data-3.0.0/cessna.osgt");
root_node->addChild(loadedModel);
int num_child = root_node->getNumChildren();
g_viewer->setSceneData( root_node);
//g_viewer->setKeyEventSetsDone( 0 );
g_viewer->setCameraManipulator( new osgGA::OrbitManipulator );
g_viewer->setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
osgViewer::CompositeViewer::Windows wins;
g_viewer->getWindows(wins);
}
//////////////////
BasicDrawPane::BasicDrawPane(wxFrame* parent) :wxPanel(parent)
{
}
void BasicDrawPane::OnSize(wxSizeEvent& event)
{
Refresh();
event.Skip();
}
void BasicDrawPane::paintEvent(wxPaintEvent& evt)
{
wxPaintDC dc(this);
//render(dc);
while ( !g_viewer->done() )
{
g_viewer->frame();
wxYield();
}
}
void BasicDrawPane::paintNow()
{
wxClientDC dc(this);
render(dc);
}
void BasicDrawPane::render( wxDC& dc )
{
static int y = 0;
static int y_speed = 2;
y += y_speed;
if(y<0) y_speed = 2;
if(y>200) y_speed = -2;
dc.SetBackground( *wxWHITE_BRUSH );
dc.Clear();
dc.DrawText(wxT("Testing"), 40, y);
}
wxWidgets_ToolbarFrame::wxWidgets_ToolbarFrame(wxWindow* parent,wxWindowID id)
{
........
......
... Code Omitted here
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
drawPane = new BasicDrawPane( this );
sizer->Add(drawPane, 1, wxEXPAND);
WidgetInitializeOSG(drawPane->GetHandle());
this->SetSizer(sizer);
this->Show();
}