在wxWidgets的简单openGL显示循环中不完整的场景重绘



我正在努力在wxwidents openGl应用程序中获得一个简单的动画循环。我有一个问题,循环迭代在每次迭代上显示之前没有完全绘制屏幕。看起来0.1 s足以完全绘制出简单的场景....谁能告诉我为什么不可能?

谢谢!

#include <wx/wx.h>
#include <wx/glcanvas.h>
#ifdef __WXMAC__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#ifndef WIN32
#include <unistd.h> // FIXME: ¿This work/necessary in Windows?
                    //Not necessary, but if it was, it needs to be replaced by process.h AND io.h
#endif
//#include "GlBox.cpp"
#include <iostream>
using namespace std;

class wxGLCanvasSubClass: public wxGLCanvas {
public:
    wxGLCanvasSubClass(wxFrame* parent);
    void Paintit(wxPaintEvent& event);
    void Render();
protected:
    DECLARE_EVENT_TABLE()
    //GlBox myBox; 
};
wxGLCanvasSubClass *thing;
static void timerRender(int count)
{
    thing->Render();
    cout << "render timeout was called n";
    glutTimerFunc(25, timerRender, 0);
}
static void myIdleFunc()
{
     cout << "idleing n";
     cout.flush();
}
static void setRender(wxGLCanvasSubClass *thing2)
{
    thing = thing2;
    cout << "global thing was set n";
     glutTimerFunc(1100, timerRender, 0);
}
BEGIN_EVENT_TABLE(wxGLCanvasSubClass, wxGLCanvas)
    EVT_PAINT    (wxGLCanvasSubClass::Paintit)
END_EVENT_TABLE()
wxGLCanvasSubClass::wxGLCanvasSubClass(wxFrame *parent)
:wxGLCanvas(parent, wxID_ANY,  wxDefaultPosition, wxDefaultSize, 0, wxT("GLCanvas")){
    int argc = 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);
    glutIdleFunc(myIdleFunc);
}

void wxGLCanvasSubClass::Paintit(wxPaintEvent& WXUNUSED(event)){
    Render();
}
void wxGLCanvasSubClass::Render()
{
    SetCurrent();
    wxPaintDC(this);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glViewport(0, 0, (GLint)GetSize().x, (GLint)GetSize().y);
    glBegin(GL_POLYGON);
        glColor3f(1.0, 1.0, 1.0);
        glVertex2f(-0.5, -0.5);
        glVertex2f(-0.5, 0.5);
        glVertex2f(0.5, 0.5);
        glVertex2f(0.5, -0.5);
        glColor3f(0.4, 0.5, 0.4);
        glVertex2f(0.0, -0.8);
    glEnd();

// using a little of glut
    glColor4f(0,0,1,1);
    glutWireTeapot(0.4);
    glLoadIdentity();
    glColor4f(2,0,1,1);
    glutWireTeapot(0.6);
    //myBox.getIt();

    SwapBuffers();
    glFlush();
    //
}


class MyApp: public wxApp
{
    virtual bool OnInit();
    void onIdle(wxIdleEvent& evt);
    time_t lastEvent;  
    bool slept ;
    wxGLCanvas * MyGLCanvas;
    wxGLCanvasSubClass * myCanvas;
};

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    slept = false;
    lastEvent = time( &lastEvent);
    wxFrame *frame = new wxFrame((wxFrame *)NULL, -1,  wxT("Hello GL World"), wxPoint(50,50), wxSize(200,200));
    myCanvas = new wxGLCanvasSubClass(frame);
    frame->Show(TRUE);
    Connect( wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(MyApp::onIdle) );
    return TRUE;
}
void MyApp::onIdle(wxIdleEvent& evt)
{
    if(slept)
    {
        slept = false;
        cout << "event hit " << lastEvent;
        myCanvas->Render();
        evt.RequestMore();
    } else {
        cout << "idleing n " << lastEvent;
        usleep(100000);
        slept = true;
        evt.RequestMore();  
    }
}

当涉及到OpenGL时,GLUT不是强制性的。GLUT是一个第三方框架,wxWidgets是一个第三方框架。并且都实现了一个事件循环。

你不应该把这些混合在一起。只需使用wxWidgets,它提供了一个非常好的OpenGL小部件。

最新更新