Этот вопрос довольно старый, но я наткнулся на этот ответ, пытаясь найти решение точно такой же проблемы.
Думаю, более элегантным подходом было бы использование указателей на функции.Сначала вы создаете указатель на функцию (может быть глобальным):
void (*foo)(void);
, после этого вы создаете различные функции рисования, например:
void draw_1()
{
/* Draw fancy stuff */
}
void draw_2()
{
/* Draw other fancy stuff */
}
Теперь вам нужен "mainloop-mainloop "-функция, которая вызывается glutMainLoop an и ссылается на ваш указатель:
void mainloop_mainloop()
{
(*foo)();
}
Как я уже сказал, эта функция должна быть вашей glutMainLoop, поэтому вы устанавливаете ее:
glutDisplayFunc(mainloop_mainloop);
glutIdleFunc(mainloop_mainloop);
Конечно, вам нужно где-то установить указатель вашей функции:
foo = &draw_1;
Если вы теперь хотите переключиться на другой контекст рисования, вам просто нужно изменить указатель.Вы можете реализовать это, например, в меню:
if (menuentry==1) foo = &draw_1;
if (menuentry==2) foo = &draw_2;
и т. Д. *
Это позволяет вам оставаться в главном цикле перенасыщения, не путая функции дисплея и выиграв производительностьЭто также не повредит, так как вы устанавливаете if / switch только один раз.У вас есть только один дополнительный вызов функции, который следует пренебречь, учитывая количество вызовов функций, используемых для прорисовки ваших кадров в каждом отдельном кадре ...