Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > [OpenGL] Ожидание прорисовки


Автор: Gryphon 8.5.2008, 18:39
Такая проблема вот: есть программа, рисующая сцену на OpenGL. В определённый момент начинает прорисоваваться анимация определённого действия. В коде это выглядит примерно так:
Код

double    param; //Это счётчик, от которого пляшет анимация
bool    doing = false; //Это флаг прорисовки в настоящий момент

int main ( int argc, char *argv[] )
{
    //Всё, что нужно для инициализации OpenGL, в частности:
    glutDisplayFunc    ( Display );
    glutIdleFunc    ( Idle );

    action(1.0); //Это наше действие

    glutMainLoop ();
    return 0;
}

void action ( double a )
{
    param = a;
    doing = true; //Поехали!
}

void Display ()
{
    //Тут стандартная лабуда, затем:

    if ( doing )
        draw_action ();
    else
        draw_static_scene ();
        
    glutSwapBuffers ();
}

void Idle ()
{
    if ( doing )
        param += 0.05;
    if ( param == 3.1415 )
        doing = false; //Типа закончили

    glutPostRedisplay();
}

Теперь вот в чём проблема. Если я вдруг захочу подряд прорисовать 2 действия, вот так, например:
action(1.0);
action(2.0);
то буду послан, так как прорисуется только последнее, что видно из кода. Вопрос: как быть? Тут надо либо как-то по-другому всё это организовывать (только я не понимаю как), либо заставить прогу ждать прорисовки первого действия, а уж только потом приступать к прорисовке следующего. Опять же вопрос: КАК? Помогите, люди добрые 8)

Автор: Solomon 8.5.2008, 19:47
Как то странновато у тебя построена архитектура...
ну впринципе можно очередью сделать... впринципе тем же вектором из STL (я c STL плохо знаком.. так что может там что то более удобное есть для организации очереди. Помоему там есть тип даных типа Очередь.. поищи в гугле если не знаком) т.е. в конец вектора забиваешь номер действия которое требуеться сделать.. дальше 

цикл
1. проверяешь не выполняеться ли у нас в данный моменит какая либо анимация
2. если не выполняеться, то можем выполнять следующую, далее
3. есть ли у нас в векторе какое либо значение...
4. если есть, то вытягиваешь его и запускаем соответствующую анимацию

ну и естественно не забывать в конец запихивать номер(или что там у тебя) требуемой анимации


Надеюсь все понятно...


Автор: mes 8.5.2008, 21:46
Цитата(Gryphon @  8.5.2008,  18:39 Найти цитируемый пост)
Если я вдруг захочу подряд прорисовать 2 действия, вот так, например:

постановка вопроса неправильная.. Кол-во прорисовок не зависит от того что будет изображено.
Отдели логически просрисовку сцены от воздействия  на нее и посади расчет (не просрисовку) показа нужного кадра на несушую (например таймер)

Автор: vinter 8.5.2008, 21:48
Цитата(Solomon @  8.5.2008,  20:47 Найти цитируемый пост)
ну впринципе можно очередью сделать... впринципе тем же вектором из STL

std::queue

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)