Передача 1 аргумента (указателя) в glutDisplayFunc?

Я создал виртуальный класс с базовым методом draw (), который ничего не делает. Цель этого состоит в том, что другие классы, фигуры и другие вещи, которые смогут рисовать себя в OpenGL, будут наследовать этот виртуальный класс, что позволяет мне создавать массив указателей на множество различных классов. Идея заключалась в том, что я надеялся, что смогу передать указатель на этот массив в мой обратный вызов glutDisplayFunc. (Это называется drawScene (). К сожалению, я не могу ничего передать ему, так как glutDisplayFunc предназначен для использования метода, который не принимает параметров и ничего не возвращает.

Есть ли способ передачи аргументов в функции обратного вызова, а затем любой способ передачи указателя в мою функцию drawScene?

(TLDR? См. Ниже.)

По сути, я хочу быть в состоянии сделать это:

class a{ ... };
void drawScene( a** a_array_pointer){ ... }
glutDisplayFunc(drawScene); // <-- How do I pass an argument into this?

3

Решение

Вы должны параметризовать ваш drawScene указателем.

#include <GL/glut.h>

template <void *T>
void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (T == (void *)0) {
/* handle no array */
} else {
/* handle array */
}
glutSwapBuffers();
}

int main(int argc, char **argv)
{
glutDisplayFunc(drawScene<(void *)0>);

return 0;
}

Это будет работать только во время компиляции. Если вам нужно изменить поведение drawScene во время выполнения, вы должны либо перекомпилировать другой модуль, загрузить его с помощью LoadLibrary / GetProcAddress и изменить указатель, либо вы должны использовать локальное хранилище потока и, возможно, блокировки.

Это один из главных недостатков переизбытка, поскольку отсутствие аргумента для отображения делает изменение поведения отображения во время выполнения в нескольких потоках очень дорогостоящим, потому что вам нужны блокировки или сложные альтернативы.

1

Другие решения

К сожалению, это невозможно. glutDisplayFunc хочет указатель на функцию, которая не имеет аргументов. Увидеть страница руководства.

0

Это один из тех случаев, когда вы должны использовать глобальную переменную.

Также см: Как передать метод класса в качестве аргумента для другой функции в C ++ и openGL?

0

Есть ли способ передачи аргументов в функции обратного вызова, а затем любой способ передачи указателя в мою функцию drawScene?

Нет, перенасыщение — это действительно библиотека C, а glutDisplayFunc ожидает указатель на функцию в качестве параметра. Единственный способ использовать переменные в этом обратном вызове, это сделать их глобальными или статическими переменными класса.

0
По вопросам рекламы [email protected]