2016-01-16 2 views
0

Я работал с проектом, который читает файл данных, выполняет некоторые вычисления и показывает результаты на стандартном выходе. Позже я хотел дать 3D-графическое представление результатов, поэтому я создал новый проект OpenGL, который показывает данные как 3D-объект.Интеграция проекта C++ OpenGL с другим проектом C++

Теперь проблема заключается в том, что я не могу понять, как интегрировать эти два независимых проекта, потому что main() в моем проекте OpenGL идет в бесконечном цикле glutMainLoop(), и я не могу определить, куда поместить цикл в main() моего первого проекта!

/**** Proj1 ****/ 
int main() 
{ 
    while(ESC key not pressed) 
    { 
     // read data file 
     // do some processing 
     // show results on standard output 
    } 
} 

/**** Proj2 ****/ 
int main() 
{ 
    glutInit(&argc, argv); 
    Init(); 
    glutDisplayFunc(Display); 
    glutKeyboardFunc(Keyboard); 
    glutMouseFunc(Mouse); 
    glutIdleFunc(Idle); 
    glutMainLoop(); 
} 

наименее смешение кодов между proj1 & proj2 запрашивается. Можно ли сделать что-то вроде:

/**** Proj1 ****/ 
#include <filesFromProj2> 
int main() 
{ 
    while(ESC key not pressed) 
    { 
      // read data file 
      // do some processing 
      proj2.showResult(result) // how to do this ? 
    } 
} 

ответ

0

Найден решение так ответив ему себя для справки каждой:

Я отчаянно нуждался в обходном пути без необходимости изменить существующий GLUT базового код в GLFW и SDF т.д.

Копают больше Интернет Я обнаружил, что freeglut поддерживает функцию glutMainLoopEvent() что «вызывает freeglut для обработки событий одной итерации в ее цикл событий. Это позволяет приложению контролировать свой собственный цикл обработки событий и по-прежнему использовать freeglut системы оконной.»

Кроме того, freeglut поддерживает все функции перенасыщения (или по крайней мере поддерживаются все функции GLUT, используемых в моей проге). Таким образом, я не должен изменить перенасыщение базовый код.

псевдо-код обходной путь, как показано ниже. Я приветствую ваши комментарии.

#include <gl/freeglut.h> 
#include <filesFromProj2> 
int main() 
{ 
    glutInit(&argc, argv); 
    Init(); 
    glutDisplayFunc(Display); 
    glutKeyboardFunc(Keyboard); 
    glutMouseFunc(Mouse); 
    glutIdleFunc(Idle); 
    // glutMainLoop();  // Do not use this 

    while(ESC key not pressed) 
    { 
     // read data file 
     // do some processing 
     proj2.showresults(results) 
     glutMainLoopEvent(); // One iteration only 
     Display();    // Call the func used with glutDisplayFunc() 
    } 
    glutLeaveMainLoop(); 
} 

Я также думал, что многопоточность, может также решить Эта проблема.Один поток для glutMainLoop() и другой для обработки данных!

1

Самым простым решением было бы угробить GLUT и использовать рамки OpenGL оконную, которая позволяет реализовать цикл обработки событий. GLFW станет непосредственным выбором. Затем вместо непрозрачного glutMainLoop, который никогда не возвращает вас, вместо этого вы вызываете glfwPollEvents рядом с вашей обработкой stdio.

+0

Большое спасибо за быстрый ответ. Я не знал о GLFW. Большинство учебников, которые я читал, использовали GLUT или FreeGLUT. будет изучать GLFW. Это помогло бы больше, если бы вы могли сказать, когда Proj1 воспроизводит видео с использованием OpenCV, а Proj2 - это регенерация объекта OpenGL, как я могу делать оба параллельно (где obj redering зависит от результата обработки img видеокадры). Пример псевдо-кода поможет больше. – kernelman

+0

Я сделал это, используя функцию glutMainLoopEvent() freeglut. Но спасибо за знакомство с GLFW. Будет использовать его для моего следующего проекта. – kernelman

1

GLUT отделяет ваш код обработки событий от вашего отображаемого кода. Странно, если вы привыкли к парадигме, где вы полностью контролируете цикл, но с этим не сложно справиться. В принципе, вам нужно поддерживать состояние, на которое ваш glutDisplayFunc будет реагировать, и обновить это состояние в вашем glutKeyboardFunc. Таким образом, в псевдокоде (похоже, у вас есть C++ вниз):

displayFunc: 
    if state.showProj1 
    proj1.showResult 
    else if state.showProj2 
    proj2.showResult 

keyboardFunc 
    if keyPressed(esc) 
    state.showProj1 = false 
    state.showProj2 = true 
    glutPostRedisplay() 

Ok, так что некоторые довольно наивный код, но он должен получить представление о том, как внести изменения в состояние в ответ на пользователя который, в свою очередь, влияет на то, что вы делаете.

Как уже упоминалось в предыдущем ответе, если вы хотите, чтобы явный контроль цикла программы (в отличие от основанной на событиях парадигмы), у вас есть хорошие варианты в GLFW и SDL, но, конечно же, так как GLUT делает все по-другому.

+0

Большое спасибо за быстрый ответ. я не уверен в этом методе интеграции, особенно когда Proj1 воспроизводит видео с использованием OpenCV, а Proj2 - это открытие объекта OpenGL. Как я могу делать оба параллельно (где obj redering зависит от результата img-обработки видео кадра). Псевдокод u shared, похоже, вызовет обработку данных proj1 изнутри функции func. эта зависимость находится в противоположном направлении. мое требование находится в этом seq: Данные процесса (видеокадр) -> render 3d obj -> repeat – kernelman

+0

Учитывая сложность того, что вы пытаетесь выполнить, я бы предложил объединить обе ваши усилия в приложение GLFW или SDL. Хотя я не сомневаюсь, что это может быть достигнуто с помощью GLUT, я лично хотел бы, чтобы контроль был предоставлен, написав мой собственный цикл. Таким образом, вы можете делать все, что вам подходит в плане обработки и рендеринга (даже если вы захотите) даже разделите их на разные потоки. Это должно быть относительно легко, потому что вы, вероятно, уже все, что написано вам уже нужно. – jbeck

+0

Я сделал это, используя функцию glutMainLoopEvent() freeglut. Но в любом случае спасибо за ознакомление с GLFW и SDL. Будет использовать его для моего следующего проекта. – kernelman

Смежные вопросы