tags:

views:

270

answers:

3

Hi All

I know this is not a new problem and has been solved, but I still dont know about it :)

I have a class which has functionality to initialise opengl and run it in separate thread.

My problem is: openGL callbacks such as glutDisplayFunc, glutMotionFunc etc accepts void (*f) void, and I cannot pass class member function.

ways around. 1) I can declare member function as static, but in this case I need to declare all used member variables as static, and end up declaring a whole class as a static.

2) I can use some stand alone function and declare my object as global, but its too bad.

I wonder if there are some ways around so I dont need to make my opengl class static ?? (using c++)

Thanks a lot

+3  A: 

You'll need to create a "thunk" or "trampoline": http://stackoverflow.com/questions/2420346/c-api-function-callbacks-into-c-member-function-code/2420382#2420382

Fred Larson
A: 

A simple workaround is :

Declare a global pointer to your class and initialize it in main(), let the callback call a regular method on that instance

MyOGLClass *g_pOGL;

void oglDraw()
{
    if(g_pOGL)
        g_pOGL->oglDraw();
}

void main()
{
    // Init your class
    MyOGLClass o;

    g_pOGL = &o;

    //...

    glutMainLoop();

}

The limitation is you can have only one instance of your class, but for an OpenGL app that isn't so bad as you really need only one anyway...

rep_movsd
+1  A: 

Since the callbacks don't take any parameters, there is not much you can do. One possibility is to create a namespace with functions and a static data member which is your current class. The functions would just forward the function calls to the existing class. This is just basically a slightly cleaner version of your #2.

namespace GLForwader
{
    static MyGLClass* = new myGlClass();

    void glutDisplayFunc() {myGlClass->glutDisplayFunc();}
    void glutMotionFunc() {myGlClass->glutMotionFunc();}
}
KeithB