Switching between FS & Win in OpenGL

Hi List!
I’m in serious trouble, 'cause I cannot figure out how to switch from
windowed to fullscreen mode and backwards (many times!!!) doing
openGL. Using my attached code, the effect gets correctly initialized and
displayed in windowed mode (YEAH! look What I’m doing … but keep it for
yourself until the demo is released …), but when I switch to fullscreen
(pressing ‘f’), it correctly switches but then the screen stays gray. If I
switch back to window mode, it also stays gray. What am I doing wrong?

Thanks,
St0fF.
-------------- next part --------------
/*
St0fF 64 0f MeinRAMiSZugrOSs

erstes SDL-Fenster mit viel Schei? ...

*/

#include <stdlib.h>
#include <math.h>
#include <windows.h>
#include “GL\glu.h”
#include “GL\gl.h”
#include “SDL\SDL.h”

#define swirlX 64
#define swirlY 64
#define MAXRADS 48
#define PI 3.1415926535897932384626433832795
#define MX swirlX/2
#define MY swirlY/2

unsigned long startedat,frmcnt=0;
static float lookat[9] = {20,0,-20,-20,0,1,0,1,0};

static unsigned char rad[swirlX][swirlY], // Hier steht drin, welcher Radius,
wik[swirlX][swirlY], // und welcher Winkel [x][y] ist.
sind[MAXRADS],
sinp[256];
static float texen[MAXRADS][512][2], // Die Farben abh?ngig von rad und wik

	  		 clean[] = {-1.0f,-1.0f};

static GLuint bggrT;

void generate_my_stuff(void) {

// Farben l?schen ...
for(int r=0;r<MAXRADS;r++)for(int w=0;w<360;w++) {texen[r][w][0]=clean[0];
                                                  texen[r][w][1]=clean[1];}
printf("Baue Rad,Wik,Pict,colors: ");
for(int x=0;x<swirlX;x++){
	for(int y=0;y<swirlY;y++) {
	// Radien und Winkel berechnen ...
	float r = sqrt(((x-MX)*(x-MX)) + ((y-MY)*(y-MY))),
			w;
	if((x>MX)&&(y>MY))
		w = 128*asin( (y-MY) / r )/PI;	// rechts unten
	else if((x>MX)&&(y<MY))
		w = 192+128*asin( (x-MX) / r )/PI;	// rechts oben
	else if((x<MX)&&(y>MY))
		w = 128*acos( (x-MX) / r )/PI;		// links unten
	else if((y<MY)&&(x<MX))
		w = 64+128*acos( (y-MY) / r )/PI;		// links oben
	else if(y==MY)
			{if(x>=MX)w=0; else w=128;}
	else if((x==MX)&&(y>MY))w=64;else w=192;
	
	
	rad[x][y] = (unsigned char) r;
	wik[x][y] = (unsigned char) w;
	// Schleife beschreibt radien&winkel-tabelle vollst?ndig ... f?r display!!!
	// Texturkoordinatentabelle ...
	texen[rad[x][y]][wik[x][y]][0] = (float)x / (swirlX-1);
	texen[rad[x][y]][wik[x][y]][1] = (float)y / (swirlY-1);
	/*printf("x/y : %d/%d	...	Tx/Ty : %f/%f\n",x,y,
			texen[rad[x][y]][wik[x][y]][0],
			texen[rad[x][y]][wik[x][y]][1]);*/
	texen[rad[x][y]][wik[x][y]+256][0] = texen[rad[x][y]][wik[x][y]][0];
	texen[rad[x][y]][wik[x][y]+256][1] = texen[rad[x][y]][wik[x][y]][1];

}}
float lastex[]={0,0},mittex[]={0.5f,0.5f};
printf(" fertich...\n\nInterpoliere Bilddaten: ");
// Bilddaten interpolieren ...
for(int w=0;w<512;w++){texen[0][w][0]=mittex[0];texen[0][w][1]=mittex[1];}
lastex[0] = mittex[0];
lastex[1] = mittex[1];
for(/*int*/ r=1;r<MAXRADS;r++){
	int w=0;
	while(w < 256) {
		if(texen[r][w][0]<0) {
			int dst=2;
			while(texen[r][w-1+dst][0]<0)++dst;
			float xs= (lastex[0]-texen[r][w-1+dst][0])/dst,
					ys= (lastex[1]-texen[r][w-1+dst][1])/dst;
			for(int z=w;z<w-1+dst;z++) {
				lastex[0]+=xs;
				lastex[1]+=ys;
			texen[r][z][0]=lastex[0];
            texen[r][z][1]=lastex[1];}
		w+=dst;
		lastex[0]=texen[r][w-1][0];
		lastex[1]=texen[r][w-1][1];
		}else{ 
			lastex[0]=texen[r][w][0];
			lastex[1]=texen[r][w][1];
			++w;}
		}
	w=0;
	while(w<256){texen[r][w+256][0]=texen[r][w][0];texen[r][w+256][1]=texen[r][w++][1];}
	}
// blah ... sollte fertig sein ...
printf("geschafft!\n\nsintabs&tex ... ");

/*
HIER MAL MIT RUMSPIELEN ...
*/

for(int i=0;i<MAXRADS;i++) sind[i] = (unsigned char)(32*(1+sin(i*2*PI/MAXRADS)));
for(/*int*/ i=0;i<256;i++) sinp[i] = (unsigned char)(4*(1+sin(i*PI/64)));


GLubyte *bggr = new GLubyte[8*8*3];
for(/*int*/ i=0; i<8*8*3; i++) {
	/*if((i%4)==3) *(bggr+i)=0x10;
	else*/ *(bggr+i)=rand()%0xFF;
	}
glGenTextures(1, &bggrT);					// Generate OpenGL texture IDs
glBindTexture(GL_TEXTURE_2D, bggrT);			// Bind Our Texture
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);	// Linear Filtered
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);	// Linear Filtered
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, bggr);

printf("Hintergrund gebastelt ...\n");
printf("puh!\n\nInit beendet...\n");

}

void mach_schieb_sin(void) {
/*
UND HIER AUCH!!
*/
int h=sind[MAXRADS-1];
for(int r=MAXRADS-1;r>0;r–)sind[r]=sind[r-1];
sind[0]=h;
h = sinp[255];
for(/int/ r=255;r>0;r–)sinp[r]=sinp[r-1];
sinp[0]=h;
}

void dozeuch(void) {
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,bggrT);
glPushMatrix();
glTranslatef(0,0,11);
glColor4f(1,1,1,0.5f);
for(int y=1;y<swirlY;y++) {
glBegin(GL_TRIANGLE_STRIP);
for(int x=0;x<swirlX;x++)
{if(rad[x][y-1]+sinp[wik[x][y-1]]<MAXRADS)
glTexCoord2fv(texen[rad[x][y-1]+sinp[wik[x][y-1]]][wik[x][y-1]+sind[rad[x][y-1]]]);
else
glTexCoord2fv(texen[MAXRADS-1][wik[x][y-1]+sind[rad[x][y-1]]]);
glVertex2f(MX-x,MY-y+1);
if(rad[x][y]+sinp[wik[x][y]]<MAXRADS)
glTexCoord2fv(texen[rad[x][y]+sinp[wik[x][y]]][wik[x][y]+sind[rad[x][y]]]);
else
glTexCoord2fv(texen[MAXRADS-1][wik[x][y-1]+sind[rad[x][y-1]]]);
glVertex2f(MX-x,MY-y);
}
glEnd();}

glPopMatrix();
glDisable(GL_TEXTURE_2D);

mach_schieb_sin();

}

void reshape(int width, int height) {
/* gWidth = width;
gHeight = height;
*/
//float black[] = { 0, 0, 0, 0 };

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90, 1, 0.1, 1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(
		0, 0, -20,
		0, 0, 0,
		0, 1, 0
		);
 glEnable(GL_TEXTURE_2D);
//glFogfv(GL_FOG_COLOR, black);
//glFogf(GL_FOG_START, 2.5);
//glFogf(GL_FOG_END, 4);
//glEnable(GL_FOG);
//glFogi(GL_FOG_MODE, GL_LINEAR);
glPointSize(5);
//glEnable(GL_POINT_SMOOTH);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);

//glEnable(GL_COLOR_MATERIAL);
//glEnable(GL_DEPTH_TEST);
//glDepthFunc(GL_LEQUAL);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glPolygonMode (GL_FRONT, GL_FILL);
glCullFace(GL_BACK);
}

void finishit(bool * tun) {
unsigned long endedat = SDL_GetTicks();
printf(“Ended @%d\nFrameCount@%d\n\nActual FPS = %f\n\nThanks!”,
endedat,frmcnt,((double)frmcnt)/(double)(endedat - startedat));
*tun = false;
}

int main(int argc, char **argv) {

if(!SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO)){

    SDL_Surface *schgrien;
    SDL_Event wastun;

    SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
    schgrien = SDL_SetVideoMode(800,600,32,SDL_OPENGL);
    reshape(800,600);

    SDL_WM_SetCaption("St0fF baut M?ll!",NULL);
    SDL_SetCursor(SDL_DISABLE);

    generate_my_stuff();

    startedat = SDL_GetTicks();
    printf("Started @%d\n",startedat);
    SDL_EnableUNICODE(1);           // sonst wills vielleicht nicht ...
    bool mach = true;
    while( mach ) {
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        dozeuch();
        SDL_GL_SwapBuffers();
        ++frmcnt;

        while(SDL_PollEvent(&wastun))
            if(wastun.type)
            switch (wastun.type) {
            case SDL_KEYDOWN :
                switch(wastun.key.keysym.sym){		
                case SDLK_f: schgrien=SDL_SetVideoMode(800,600,32,SDL_OPENGL|SDL_FULLSCREEN);
                             reshape(800,600); break;
	            case SDLK_w: schgrien=SDL_SetVideoMode(800,600,32,SDL_OPENGL);
                             reshape(800,600); break;
	            case SDLK_l: glPolygonMode(GL_FRONT,GL_LINE); break;
	            case SDLK_p: glPolygonMode(GL_FRONT,GL_POINT); break;
	            case SDLK_g: glPolygonMode(GL_FRONT,GL_FILL); break;
	            case SDLK_b: break;
	            case SDLK_ESCAPE : finishit(&mach); break;}
                break;
            case SDL_MOUSEBUTTONDOWN: finishit(&mach); break;
            }
    }
    fprintf(stderr,"fehlerfrei ...\nmeinRAMiSZugrOSs!");
} else fprintf(stderr,"ging nicht!!!\n");
SDL_Quit();
return(0);    

}

On most graphics cards, you have to free and reload all textures between
display switches, or else you’ll get garbage on the display (in your
case gray textures).

-D

At 15:03 04.02.2002 -0500, you wrote:

On most graphics cards, you have to free and reload all textures between
display switches, or else you’ll get garbage on the display (in your
case gray textures).

Thanks alot! That was it …
St0fF 64>-D