kirbo
kirbo

Reputation: 1727

How to pass non static member function into glutDisplayFunc

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++)

Upvotes: 6

Views: 6242

Answers (4)

Michael Nett
Michael Nett

Reputation: 375

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(); });
}

Upvotes: 0

KeithB
KeithB

Reputation: 17007

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();}
}

Upvotes: 2

rep_movsd
rep_movsd

Reputation: 6895

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...

Upvotes: 0

Fred Larson
Fred Larson

Reputation: 62063

You'll need to create a "thunk" or "trampoline": C API function callbacks into C++ member function code

Upvotes: 4

Related Questions