GLUT и C ++ классы - PullRequest
       16

GLUT и C ++ классы

4 голосов
/ 27 августа 2011

Я начал использовать OpenGL некоторое время назад, используя GLUT.Вы не можете передавать функции-члены функциям GLUT.(или указатели на участников в этом отношении, хотя я не изучал этот вариант действительно далеко).

Мне было интересно, есть ли «приличный» способ или каков «самый приличный» способ решить это?Я знаю, что вы можете использовать статические функции-члены, но разве нет лучшего способа?

Я знаю, что есть другие библиотеки, такие как SFML, которые написаны на C ++ и предоставляют интерфейс на основе классов C ++, но я былинтересно, каковы возможности относительно GLUT (точнее, freeglut).

Ответы [ 2 ]

7 голосов
/ 27 августа 2011

Во-первых, GLUT не для серьезной прикладной работы.Это для простых графических демонстраций.И для этой цели это хорошо.Если вы обнаружите, что пытаетесь сделать серьезную работу в GLUT, вы обнаружите, что проводите много времени, обходя его ограничения.Это ограничение - только одно из многих, с которыми вы в конечном итоге столкнетесь.GLFW, хотя и имеет это ограничение (хотя в следующей версии его не будет), как правило, лучше подходит для серьезной работы с приложениями.

Во-вторых, «самый достойный» способ решения этой проблемы зависит от того, что вы делаете.Если у вас есть только одно окно, то правильным решением будет простая статическая функция, которая может глобальные указатели (или функции, возвращающие глобальные указатели) на любой интересующий вас класс.

Если у вас несколько оконто, что вам нужно, это глобальный std::map, который отображает из идентификаторов окна GLUT на указатели на некоторый объект.Затем вы можете узнать, из какого окна была вызвана определенная функция, и использовать карту для переадресации этого вызова конкретному объекту, который представляет это окно.

0 голосов
/ 22 января 2016

Передача функций-членов в glut или любую другую библиотеку достаточно проста.GLUT ищет указатель на функцию.

Пусть Controller будет классом с функцией-членом OnKeyPress, которую мы хотим отправить в glutKeyboardFunc.Сначала вы можете попробовать что-то вроде

glutKeyboardFunc(&Controller::OnKeyPress);

Здесь мы передаем указатель на функцию, однако это неверно, так как вы хотите отправить функцию-член этого объекта класса.В C ++ 11 вы можете использовать новый std :: bind , или, если вы используете более старый компилятор, я бы порекомендовал boost :: bind .В любом случае синтаксис примерно одинаков.

using namespace std::placeholders; // for the _1, _2 placeholders
glutKeyboardFunc(std::bind(&Controller::OnKeyPress, &GLInput, _1, _2, _3));

Из документации видно, что glutKeyboardFunc требует 3 параметра.Сначала мы фиксируем адрес памяти первого аргумента вашего объекта, поскольку он является функцией-членом, а затем предоставляем 3 заполнителя.

Для новичков в std :: bind это кажется странным, но для всех, кто делал объектно-ориентированный код на C, это очевидно.Функция на самом деле является просто функцией C и нуждается в указателе this для класса.Связывание не было бы необходимым, если бы обратный вызов был простой функцией.

...