Как создать класс для упаковки GLUT? - PullRequest
3 голосов
/ 25 января 2010

Я пишу игру для школы в OpenGL. Поскольку будет еще несколько подобных заданий, я хочу создать небольшую структуру для выполнения общих задач в OpenGL. Я уже делал несколько простых игр и обычно делю их на классы ввода-вывода для обработки ввода и рисования на экране, класс Game для основной игровой петли / логики и классы для любых объектов, присутствующих в игре.

До того, как я использовал SDL, у меня такой вопрос: правильно ли это делать в OpenGL? Я уже столкнулся с некоторыми проблемами. Я хочу, чтобы мой класс ввода-вывода обрабатывал инициализацию окна, рисование сцены и щелчки мышью. Итак, конструктор выглядел так:

IO::IO()
{
    currWindowSize[0] = DEF_WIDTH;
    currWindowSize[1] = DEF_HEIGHT;

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
    glutInitWindowPosition( INIT_WINDOW_POSITION[0], INIT_WINDOW_POSITION[1] );
    glutInitWindowSize( currWindowSize[0], currWindowSize[1] );
    glutCreateWindow( "TEST" );

    setUp();

    glutDisplayFunc(drawScene);
    glutMainLoop();
}

Однако drawScene - это метод класса. Есть ли способ передать метод класса в glutDisplayFunc(), не делая его статичным?

Ответы [ 3 ]

3 голосов
/ 25 января 2010

К сожалению, glutDisplayFunc() не принимает указатель void*, так что вы могли бы подделать контекст объекта. Вам придется создать статическую функцию, которая может вызывать правильный экземпляр ввода-вывода, используя статическую переменную.

Впрочем, я вижу и небольшие проблемы с твоим рисунком. Насколько я знаю, glutMainLoop() никогда не возвращается, пока вы не завершите контекст GLUT, поэтому у вас есть конструктор, который практически никогда не возвращается, поэтому ваш программный поток неоправдан. Вы должны переместить этот вызов в отдельный run() метод в вашем классе.

(Лично я бы использовал GLFW, что позволяет избежать всей путаницы с обратным вызовом с GLUT, хотя вы должны написать свой основной цикл.)

2 голосов
/ 26 января 2010

две точки,

Во-первых, glutMainLoop никогда не возвращается и начинает отправлять сообщения. Поскольку вы вызвали его из своего конструктора, ваш класс потенциально еще не сконструирован должным образом. Кроме того, glut поддерживает более одного окна, и glutModalLoop нужно вызывать только один раз.

Во-вторых, как вы заметили, метод, передаваемый glutDisplayFunc, должен быть статическим. Вам понадобится статический массив, связывающий идентификаторы окон перенасыщения с указателями ввода-вывода. Когда glutCreateWindow вызывается экземпляром ввода-вывода, сохраните возвращенный идентификатор и экземпляр ввода-вывода в массиве. Каждый раз, когда вызывается статический drawScene, вы вызываете glutGetWindow, чтобы получить идентификатор текущего окна, ищите связанный указатель ввода-вывода и вызываете нестатическую реализацию drawScene.

0 голосов
/ 25 января 2010

До того, как я использовал SDL, мой вопрос это правильный путь об этом в OpenGL?

Я бы предпочел полностью обойти GLUT (если вы хотите изучить внутреннюю сущность OpenGL и интерфейс оконной системы вашей ОС). Плюс GLUT не поддерживается на iPhone (если вы хотите использовать эту платформу в будущем).

Таким образом, идея состоит в том, чтобы использовать WGL в Windows, GLX в Linux и CGL в OS X.

...