I have a class which has functionality to initialise opengl and run it in separate thread开发者_JAVA百科.
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++)
You'll need to create a "thunk" or "trampoline": C API function callbacks into C++ member function code
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();}
}
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...
I've just searched around for this, since I had the same problem when cleaning up and OOP'ing our code. Turns out that the nice stuff like std::bind doesn't work here, but if you're compiling on C++11 anyway you can actually define an anonymous function to wrap your member function.
class Renderer {
void Start();
void Render();
}
// ...
void Renderer::Start() {
// ...
glutDisplayFunc([](){ Render(); });
}
精彩评论