首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在wxWidgets中执行简单openGL显示循环时场景重绘不完整

在wxWidgets中执行简单openGL显示循环时场景重绘不完整
EN

Stack Overflow用户
提问于 2011-11-12 07:23:57
回答 1查看 525关注 0票数 1

我正致力于在wxWidets openGl应用程序中实现一个简单的动画循环。我遇到了一个问题,循环迭代在每次迭代显示之前没有完全绘制屏幕。似乎.1s足以完全描绘出简单的场景……有谁能告诉我为什么它可能不会呢?

谢谢!

代码语言:javascript
复制
#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();  

    }

}
EN

回答 1

Stack Overflow用户

发布于 2011-11-12 09:11:53

当涉及到OpenGL时,GLUT并不是必须使用的东西。GLUT是第三方框架,wxWidgets是第三方框架。两者都实现了一个事件循环。

您不应该将它们混合在一起。只使用wxWidgets就可以了,它提供了一个非常好的OpenGL小部件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8101164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档