У меня проблема, я использую перенасыщение (набор утилит 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;
}
Документация по glutPostRedisplay
указывает, что будет вызываться только функция отображения текущего окна. В этом случае есть два окна. Я не эксперт, использующий перенасыщение, но я бы предложил два изменения
Удалить displaysub()
от display()
функционировать и переписать idle()
static void idle()
{
int currentWindow = glutGetWindow();
glutSetWindw(mainWindow);
glutPostRedisplay();
glutSetWindw(subWindow);
glutPostRedisplay();
glutSetWindow(currentWindow);
}
glutPostRedisplay
просто помечает окно для обновления в главном цикле, который, как мне кажется, с фокусом мыши. Делая сообщение для каждого окна независимо от текущего окна, все окна будут получать соответствующие вызовы дисплея
Других решений пока нет …