2014-12-09 6 views
0

Итак, у меня есть простой класс, ведьма инициализирует GLFW и создает окно:функции обратного вызова REFERENCING GLFW от класса

namespace ALT { 

    struct InputInformation { 
    GLfloat lastX; 
    GLfloat lastY; 
    bool keyboard[1024]; 
    }; 

    class Window { 
    public: 
     Window(GLuint width, GLuint height, std::string title); 
     ~Window(); 

     int run(); 

    private: 
     void setUp(); 
     void mainLoop(); 

     GLuint _width; 
     GLuint _height; 

     GLFWwindow* _window; 
     std::vector<Shader> _shaders; 

     std::unique_ptr<ALT::Heightmap> _heightmap; 
     std::unique_ptr<Model>   _nanosuit; 
     std::unique_ptr<ALT::Camera> _camera; 

     void executeKeyboardInput(); 

     void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode); 
     void mouse_callback(GLFWwindow* window, double xpos, double ypos); 
     ALT::InputInformation _input; 

    }; 

} 

Теперь я хочу, чтобы установить Мыши и клавиатуры Обратный вызов из конструктора:

ALT::Window::Window(GLuint width, GLuint height, std::string title) 
    : _width(width), _height(height) 
{ 
    glfwInit(); 

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_SAMPLES, 4); 
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 

    _window = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr); 
    glfwMakeContextCurrent(_window); 

    glfwSetInputMode(_window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); 

    glfwSetKeyCallback(_window, ALT::Window::key_callback); 
    glfwSetCursorPosCallback(_window, ALT::Window::mouse_callback); 

    glewExperimental = GL_TRUE; 
    glewInit(); 

} 

Это ошибка, я получаю:

cannot convert ‘ALT::Window::mouse_callback’ from type ‘void (ALT::Window::)(GLFWwindow*, double, double)’ to type ‘GLFWcursorposfun {aka void (*)(GLFWwindow*, double, double)}’ 
    glfwSetCursorPosCallback(_window, ALT::Window::mouse_callback); 

Эта ошибка одинакова для обеих функций обратного вызова. Возможно ли выполнить эту функцию обратного вызова так, как я это делаю?

Я использовал это на main(), поэтому мне было намного проще.

Я мог бы также объявить функции обратного вызова вне класса, но тогда я не смог получить доступ к членам класса Window.

ответ

2

Вы можете использовать glfwSetWindowUserPointer и передать this указатель на него, а затем он просто литье во внешней функции:

ALT::Window::Window(GLuint width, GLuint height, std::string title) 
    : _width(width), _height(height) 
{ 
    glfwInit(); 

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_SAMPLES, 4); 
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 

    _window = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr); 

    glfwMakeContextCurrent(_window); 

    glfwSetWindowUserPointer(_window, reinterpret_cast<void*>(this));//<--- right here 

    glfwSetInputMode(_window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); 

    glfwSetKeyCallback(_window, ALT::key_callback); 
    glfwSetCursorPosCallback(_window, ALT::mouse_callback); 

    glewExperimental = GL_TRUE; 
    glewInit(); 

} 

void mouse_callback(GLFWwindow *window, double xpos, double ypos){ 
    Window wind = reinterpret_cast<Window*>(glfwGetWindowUserPointer(window)); 
    wind->mouse_callback(xpos, ypos); 
} 

Повторите для других обратных вызовов.

+0

Вам даже не нужен первый 'reinterpret_cast'. – elmindreda

+0

@elmindreda это во всяком случае во время выполнения, и я хотел бы убедиться, что семантика, которую я хочу (отбрасывание дает мне правильный указатель), есть. –

Смежные вопросы