Подокна OpenGL не отвечают одновременно

У меня проблема, я использую перенасыщение (набор утилит openGL). Я делаю подокно в главном окне. Главное окно отображает простую фигуру, а подокно отображает фигуру из другого вида. Фигура поворачивается, поэтому главное окно и подокно всегда должны отображаться заново.

Но только один из двух отображает вращающуюся фигуру. Поэтому, когда я запускаю программу, фигура в главном окне вращается, но в подокне она не вращается, она просто стоит на месте.

Когда я перемещаю свою мышь в подокне и нажимаю любую клавишу, роли меняются, поэтому фигура вращается в подокне и останавливается в главном окне.

Как я могу позволить им отображаться одновременно. Я следовал за учебником от Маяка, но он не дал мне ответа.
Нужно ли что-то делать с моим окном просмотра?

 * GLUT Shapes Demo
*
* Written by Nigel Stewart November 2003
*
* This program is test harness for the sphere, cone
* and torus shapes in GLUT.
*
* Spinning wireframe and smooth shaded shapes are
* displayed until the ESC or q key is pressed.  The
* number of geometry stacks and slices can be adjusted
* using the + and - keys.
*/
#include <windows.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <math.h>
#include <stdlib.h>

static int slices = 16;
static int stacks = 16;
int m=0;int mainWindow,SubWindow, SubWindow2;

/* GLUT callback Handlers */

static void resize(int width, int height)
{
const float ar = (float) width / (float) height;

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-10,10,-10,10,-10,10);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
}

static void key(unsigned char key, int x, int y)
{
switch (key)
{
case 27 :
case 'q':
exit(0);
break;

case '+':
slices++;
stacks++;
break;

case '-':
if (slices>3 && stacks>3)
{
slices--;
stacks--;
}
break;
}//glutPostRedisplay();
}
void keyp(int key, int xx, int yy) {glutSetWindow(mainWindow);
glutPostRedisplay();

}

void displaysub()
{const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double a = t*90.0;

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glClearColor(20,1,1,1);
glLoadIdentity();
glOrtho(-5,5,-5,5,-5,5);
glColor3f(0,0,0);
glRotated(a,0,0,10);
glPushMatrix();
glTranslated(0,0,0);
glutSolidSphere(2,10,10);
glPopMatrix();

glutSwapBuffers();
}

void display()
{const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double a = t*90.0;
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glClearColor(3,0,0,1);
glLoadIdentity();
glOrtho(-10,10,-10,10,-10,10);
glRotated(a,10,10,0);displaysub();}

static void idle(void)
{
glutPostRedisplay();
}

/* Program entry point */
void init()
{glClearColor(3,0,0,1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

// register callbacks
glutIgnoreKeyRepeat(1);
glutKeyboardFunc(key);
glutSpecialFunc(keyp);

}int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);mainWindow = glutCreateWindow("GLUT Shapes");
glutSetWindow(mainWindow);
glClearColor(3,0,0,1);
glutDisplayFunc(display);
init();SubWindow = glutCreateSubWindow(mainWindow,0,0,50,50);
glutSetWindow(SubWindow);
glClearColor(3,0,0,1);
glutDisplayFunc(displaysub);
init();glutIdleFunc(idle);
glutMainLoop();

return 1;
}

0

Решение

Документация по glutPostRedisplay указывает, что будет вызываться только функция отображения текущего окна. В этом случае есть два окна. Я не эксперт, использующий перенасыщение, но я бы предложил два изменения

Удалить displaysub() от display() функционировать и переписать idle()

static void idle()
{
int currentWindow = glutGetWindow();
glutSetWindw(mainWindow);
glutPostRedisplay();
glutSetWindw(subWindow);
glutPostRedisplay();
glutSetWindow(currentWindow);
}

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

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]