ПрограммированиеФорумГрафика

Проблемы с пониманием GLFW callback. Opengl

#0
13:27, 11 июня 2017

Пока я размещал различные инпуты в главном классе, проблем не было:

+ Показать

Когда же я перенёс этот код в др. класс, то он начал жаловаться, что они не совместимы, например:

Ошибка (активно) E0167  аргумент типа "void (Game::*)(GLFWwindow *window, double xoffset, double yoffset)" несовместим с параметром типа "GLFWscrollfun"

Помогите понять как правильно сделать.

#1
13:50, 11 июня 2017

в главном классе

Никакого "главного" класса в твоём 1-м коде нет.

В качестве коллбэка можно использовать указатель на функцию, но не указатель на метод класса - это разные вещи. Сделай что-то типа этого:

MyClass *myPtr;

//..где-нибудь инициализируем myPtr

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
    //....
    myPtr->doSomething();
    //...
}
#2
14:50, 11 июня 2017

UPD: можно также связать указатель с окном:

glfwSetWindowUserPointer(window, (void *)this);
//...
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
    MyClass *c = (MyClass)glfwGetWindowUserPointer(window);
    //...
}
#3
15:38, 13 июня 2017
static void mouse_callback(GLFWwindow* window, double xpos, double ypos) {  do something}
static void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)  {  do something}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)  {  do something}
#4
15:50, 14 июня 2017

Просто я исп. отдельный класс для камеры.  И если я исп. статик фук-ию, то мне пишет:
Ошибка (активно) E0245 нестатическая ссылка не член должна указываться относительно заданного объекта.
А насчёт glfwSetWindowUserPointer и glfwGetWindowUserPointer я не понял как их применять. Можно подробней?

#5
15:58, 14 июня 2017
  GLFWwindow* mWindow;

  Window::Window()
  {
    glfwSetWindowUserPointer(mWindow, this);

    glfwSetKeyCallback(mWindow, [](GLFWwindow *win, int key, int scancode, int action, int mods)
    {
      Window *window = static_cast<Window *>(glfwGetWindowUserPointer(win));
      window->KeyboardCallback(key, scancode, action, mods);
    });
  }
ПрограммированиеФорумГрафика

Тема в архиве.