staticintattriblist[]={
WX_GL_RGBA, WX_GL_MIN_RED,1, WX_GL_MIN_GREEN,1,
WX_GL_MIN_BLUE,1, WX_GL_DEPTH_SIZE,1, WX_GL_DOUBLEBUFFER, None
};
BEGIN_EVENT_TABLE(UIOpenGLCanvas, wxGLCanvas)
EVT_SIZE(UIOpenGLCanvas::OnSize)
EVT_PAINT(UIOpenGLCanvas::OnPaint)
EVT_MOUSE_EVENTS(UIOpenGLCanvas::OnMouseEvent)
END_EVENT_TABLE()
UIOpenGLCanvas::UIOpenGLCanvas(wxWindow*parent,constwxString&caption)//:wxGLCanvas(parent, wxID_ANY, attriblist, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE, wxT("GLCanvas"), wxNullPalette)//:wxGLCanvas(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE, wxT("GLCanvas")):wxGLCanvas(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE, wxT("GLCanvas"), attriblist, wxNullPalette)
,m_caption(caption), count(0) {intargc=1;char*argv[1]={ wxString((wxTheApp->argv)[0]).char_str() };/*NOTE: this example uses GLUT in order to have a free teapot model
to display, to show 3D capabilities. GLUT, however, seems to cause problems
on some systems. If you meet problems, first try commenting out glutInit(),
then try comeenting out all glut code*/glutInit(&argc, argv);
}
UIOpenGLCanvas::~UIOpenGLCanvas() {
}voidUIOpenGLCanvas::OnSize(wxSizeEvent&event) {//this is also necessary to update the context on some platformswxGLCanvas::OnSize(event);//set GL viewport (not called by wxGLCanvas::OnSize on all platforms
)intw, h;
GetClientSize(&w,&h);if(GetContext()) {
SetCurrent();
glViewport(0,0, (GLint) w, (GLint) h);
}
}voidUIOpenGLCanvas::OnMouseEvent(wxMouseEvent&event) {staticintdragging=0;staticfloatlast_x, last_y;//printf("%f %f %d\n", event.GetX(), event.GetY(), (int)event.LeftIsDown());if(event.LeftIsDown()) {if(!dragging) {
dragging=1;
}else{
yrot+=(event.GetX()-last_x)*1.0;
xrot+=(event.GetY()-last_y)*1.0;
Refresh(false);
}
last_x=event.GetX();
last_y=event.GetY();
}elsedragging=0;
}voidUIOpenGLCanvas::OnPaint(wxPaintEvent&WXUNUSED(event)) {
Render();
}voidUIOpenGLCanvas::Render() {/*此处很关键*/wxPaintDC(this);if(!GetContext())return;
SetCurrent();
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glViewport(0,0, (GLint)GetSize().x, (GLint)GetSize().y);
glBegin(GL_POLYGON);
glColor3f(1.0,0.0,0.0);
glVertex2f(0.1,0.1);
glVertex2f(-0.1,0.1);
glVertex2f(-0.1,-0.1);
glVertex2f(0.1,-0.1);
glEnd();//using a little of glutglColor4f(0,0,1,1);
glutWireTeapot(0.4);
glPopMatrix();
glFlush();
SwapBuffers();
}