I'm using MSVC++ and freeglut in order to use openGL. Now, I have a class called Camera
, which is pretty simple, but it also holds the function for the reshaping of my window.
My question is: how can I set glutReshapeFunc(void (*callback)(int,int))
to my function in my camera?
I have the following code, which won't work, because of a compiler error:
int main(int argc, char **argv)
{
Camera *camera = new Camera();
glutReshapeFunc(camera->ReshapeCamera);
}
and my Camera class looks like this in Camera.h:
class Camera
{
public:
Camera(void);
~Camera(void);
void ReshapeCamera(int width, int height);
};
Maybe this is just a more general callback question, but the only thing I found on the internet was creating some wrapper class around the callback. But it doesn't look like this should be so hard. Thanks in advance.
There's no clean way to do this. C does not know about objects, so pointers-to-members don't work. C does not do templates, so functors don't work. The API does not even allow you to pass an arbitrary void *userData
to your callback, so you can't pass the object around in that way either.
So, indeed, you'll have to create a wrapper function that is not a member function, and you'll have to give it access to the Camera
object instance somehow, through a static and/or global variable.
If there can be multiple objects listening for this event, you could create a singleton class that allows you to register arbitrary listeners.