new Opengl Window

Started by
14 comments, last by Brother Bob 12 years, 8 months ago
hi, just wanted to ask if it was possible to have two opengl windows.....something of this nature......run program first window displays click button in the first window and the second window displays covering the first one...close the second window the first window dislays again...

if this is possible can anyone please tell me how i could achieve that......
working with opengl and glut

thank you.
Advertisement
Of course you can have as many windows as you like. What is the problem you're having?
http://docs.google.com/viewer?a=v&q=cache:o0oeSgPKnqIJ:www.cs.uml.edu/~hmasterm/Charts/Managing_Multiple_Windows.ppt+glut+multiple+windows+demo&hl=sv&gl=se&pid=bl&srcid=ADGEESihxzk1y3TDCXn6d5irTvT0eoQWFZmh6L-rLJo0UKQNO5WLd7tjoe8DxW6_wOzOu1F6U7VqTnFtTkhbGkd-gyJn6TpPkbNUcjAtHqDgSsGSZ-keOGkPA16TRsnBflwj8NMrIshN&sig=AHIEtbQDybhldTyKsm014-eghrMqGlOgHQ

or if you have powerpoint:

http://www.cs.uml.edu/~hmasterm/Charts/Managing_Multiple_Windows.ppt
[size="1"]I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!
I don't think GLUT can get you multiple windows. It's really intended as a simple framework for abstracting some of the OS interaction, but that simplification comes at a cost and the cost is flexibility.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

thanks guys for your reply....

@Brother Bob ..i have a window already with 2D buttons rendered...but i want to also add animations into my program..but i want the animations to run in another opengl window after the animation button has been clicked....then return back to the first window after the animation is finished...

@SimonForsman...thanks for the link ..i'll take a look at it...
All you need to do is create the second window as you need it, draw as usual, and destroy it when you're done. As I said in my first post, I'm not sure what specific part, or if it's the whole concept of having multiple window, you're having problem with.

From your vague description of your program, it sounds like you just need to do the following:
  • When clicking the button, create a new window and register the callbacks for that window.
  • The new window's display callback displays the animation.
  • The new window's idle callback drives the animation forward.
  • When the animation is finished, destroy it.

All you need to do is create the second window as you need it, draw as usual, and destroy it when you're done. As I said in my first post, I'm not sure what specific part, or if it's the whole concept of having multiple window, you're having problem with.

From your vague description of your program, it sounds like you just need to do the following:
  • When clicking the button, create a new window and register the callbacks for that window.
  • The new window's display callback displays the animation.
  • The new window's idle callback drives the animation forward.
  • When the animation is finished, destroy it.



thanks Brother Bob for your reply.......i am still having issues creating the second window.....the first window creates alright but when i click the button for the animation window to be created nothing happens..
any idea why this might be happening??




void main(int argc, char** argv) {
atexit(OnShutdown);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(width, height);
//glutCreateWindow("GLUT Picking Demo [using selection buffer]");

// Make Main outer window
window1 = glutCreateWindow("Satellite Assembly");
glutDisplayFunc(OnRender);
glutReshapeFunc(OnReshape);
glutIdleFunc(OnIdle);


if(animate){
// Create First subwindow
window2 = glutCreateWindow("Animation");
glutDisplayFunc(display2);
glutReshapeFunc(animation_Reshape);
glutIdleFunc(OnIdle1);

}


glutKeyboardFunc(OnKey);
glutSpecialFunc (keyboard_s);
glutMouseFunc(Mouse);
glutMotionFunc(Motion);
glutPassiveMotionFunc(MousePassiveMotion);

InitGL();

glutMainLoop();
}



static void TheButtonCallback8()
{
animate=true;
loadMast = true;
loadReflector = true;
loadReceiver = true;
loadConnector = true;
loadStand = true;
printf("Run Animation");
}



thanks alot for your help
Think about your code; under what conditions will the second window be created?

I will be created when main executes and animate is true. The variable animate is not true when you start the program, so it won't be created when the program starts. Is the function main executed again, at any time, after animate is set to true? If not, then that code is never going to be reached again. But if it is called again, so the second window can be created, you have other problems as well; you will completely reinitialize everything, including creating another primary window. Not to mention that in a well-formed program, you are not allowed to call main yourself.

You need to create the window in some piece of code that is actually executed when you press your button. If it's not executed, well, then nothing happens. Take a look at this quick example.
[source]
#include <GL/glut.h>

int primaryWindow = 0;
int secondaryWindow = 0;
GLfloat angle = 0;

void idleFunc();

void redisplaySecondaryFunc()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, -5);
glRotatef(angle, 0, 1, 0);
glutWireTeapot(2);
glutSwapBuffers();
}

void reshapeSecondaryFunc(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 1, 10);
glMatrixMode(GL_MODELVIEW);
}

void redisplayFunc()
{
glClearColor(0.75, 0.75, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
}

void reshapeFunc(int w, int h)
{
glViewport(0, 0, w, h);
}

void mouseFunc(int button, int state, int, int)
{
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && secondaryWindow == 0)
{
secondaryWindow = glutCreateWindow("animation");
glutDisplayFunc(redisplaySecondaryFunc);
glutReshapeFunc(reshapeSecondaryFunc);
glutIdleFunc(idleFunc);

angle = 0;
}
}


void idleFunc()
{
if(secondaryWindow != 0)
{
angle += 1;
if(angle < 360)
{
glutPostWindowRedisplay(secondaryWindow);
}
else
{
glutIdleFunc(0);
glutDestroyWindow(secondaryWindow);

secondaryWindow = 0;
angle = 0;
}
}
}

void main (int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
glutInitWindowSize(400,400);
primaryWindow = glutCreateWindow(argv[0]);
glutDisplayFunc(redisplayFunc);
glutMouseFunc(mouseFunc);
glutReshapeFunc(reshapeFunc);
glutMainLoop();
}
[/source]
It creates secondary window with some animation when you click inside the primary window. Keep in mind though that the idle callback is global and not tied to any particular window.
<br>
solved the errors but its having serious effects on my animations ....cant explain why.....models don't display properly(look like shadows)...some timing orientations were also affected......any ideas on how i could solve this problem...





static void TheButtonCallback8()
{

if(window2==0){
window2 = glutCreateWindow("animation");
glutDisplayFunc(display2); //animation display
glutReshapeFunc(OnReshape);
glutIdleFunc(onIdle1);
}


printf("Run Animation");
}

void OnIdle1()
{
if(window2 != 0)
{
rY += 0.05;

glutPostWindowRedisplay(window2);
}
else
{
glutIdleFunc(0);
glutDestroyWindow(window2);
glutPostWindowRedisplay(window1);

window2 = 0;
rY = 0;
}

}

void main(int argc, char** argv) {
atexit(OnShutdown);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(width, height);
//glutCreateWindow("GLUT Picking Demo [using selection buffer]");

// Make Main outer window
window1 = glutCreateWindow("Satellite Assembly");
glutDisplayFunc(OnRender);
glutReshapeFunc(OnReshape);
glutIdleFunc(onIdle);

glutKeyboardFunc(OnKey);
glutSpecialFunc (keyboard_s);
glutMouseFunc(Mouse);
glutMotionFunc(Motion);
glutPassiveMotionFunc(MousePassiveMotion);

InitGL();

glutMainLoop();

This topic is closed to new replies.

Advertisement