Я создал виртуальный класс с базовым методом 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?
Вы должны параметризовать ваш 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 и изменить указатель, либо вы должны использовать локальное хранилище потока и, возможно, блокировки.
Это один из главных недостатков переизбытка, поскольку отсутствие аргумента для отображения делает изменение поведения отображения во время выполнения в нескольких потоках очень дорогостоящим, потому что вам нужны блокировки или сложные альтернативы.
К сожалению, это невозможно. glutDisplayFunc
хочет указатель на функцию, которая не имеет аргументов. Увидеть страница руководства.
Это один из тех случаев, когда вы должны использовать глобальную переменную.
Также см: Как передать метод класса в качестве аргумента для другой функции в C ++ и openGL?
Есть ли способ передачи аргументов в функции обратного вызова, а затем любой способ передачи указателя в мою функцию drawScene?
Нет, перенасыщение — это действительно библиотека C, а glutDisplayFunc
ожидает указатель на функцию в качестве параметра. Единственный способ использовать переменные в этом обратном вызове, это сделать их глобальными или статическими переменными класса.