test/testgl.c
changeset 233 5b42a7f5fab3
parent 221 50620ec9c86a
child 234 1af4be6a73cd
equal deleted inserted replaced
232:678e3ed01019 233:5b42a7f5fab3
     8 #ifdef HAVE_OPENGL
     8 #ifdef HAVE_OPENGL
     9 #include "SDL_opengl.h"
     9 #include "SDL_opengl.h"
    10 
    10 
    11 #define SHADED_CUBE
    11 #define SHADED_CUBE
    12 
    12 
       
    13 static SDL_bool USE_DEPRECATED_OPENGLBLIT = SDL_FALSE;
    13 
    14 
    14 void HotKey_ToggleFullScreen(void)
    15 void HotKey_ToggleFullScreen(void)
    15 {
    16 {
    16 	SDL_Surface *screen;
    17 	SDL_Surface *screen;
    17 
    18 
    93 		break;
    94 		break;
    94 	}
    95 	}
    95 	return(done);
    96 	return(done);
    96 }
    97 }
    97 
    98 
       
    99 void SDL_GL_Enter2DMode()
       
   100 {
       
   101 	SDL_Surface *screen = SDL_GetVideoSurface();
       
   102 
       
   103 	/* Note, there may be other things you need to change,
       
   104 	   depending on how you have your OpenGL state set up.
       
   105 	*/
       
   106 	glPushAttrib(GL_ENABLE_BIT);
       
   107 	glDisable(GL_DEPTH_TEST);
       
   108 	glDisable(GL_CULL_FACE);
       
   109 	glEnable(GL_TEXTURE_2D);
       
   110 
       
   111 	glViewport(0, 0, screen->w, screen->h);
       
   112 
       
   113 	glMatrixMode(GL_PROJECTION);
       
   114 	glPushMatrix();
       
   115 	glLoadIdentity();
       
   116 
       
   117 	glOrtho(0.0, (GLdouble)screen->w, (GLdouble)screen->h, 0.0, 0.0, 1.0);
       
   118 
       
   119 	glMatrixMode(GL_MODELVIEW);
       
   120 	glPushMatrix();
       
   121 	glLoadIdentity();
       
   122 
       
   123 	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
       
   124 }
       
   125 
       
   126 void SDL_GL_Leave2DMode()
       
   127 {
       
   128 	glMatrixMode(GL_MODELVIEW);
       
   129 	glPopMatrix();
       
   130 
       
   131 	glMatrixMode(GL_PROJECTION);
       
   132 	glPopMatrix();
       
   133 
       
   134 	glPopAttrib();
       
   135 }
       
   136 
    98 void DrawSDLLogo(void)
   137 void DrawSDLLogo(void)
    99 {
   138 {
   100 	static SDL_Surface *image = NULL;
   139 	static SDL_Surface *image = NULL;
       
   140 	static GLuint texture;
   101 	static int x = 0;
   141 	static int x = 0;
   102 	static int y = 0;
   142 	static int y = 0;
       
   143 	static int w, h;
   103 	static int delta_x = 1;
   144 	static int delta_x = 1;
   104 	static int delta_y = 1;
   145 	static int delta_y = 1;
   105 	static Uint32 last_moved = 0;
   146 	static Uint32 last_moved = 0;
   106 
   147 
   107 	SDL_Rect dst;
   148 	SDL_Rect dst;
   116 		}
   157 		}
   117 		image = SDL_CreateRGBSurface(
   158 		image = SDL_CreateRGBSurface(
   118 				SDL_SWSURFACE,
   159 				SDL_SWSURFACE,
   119 				temp->w, temp->h,
   160 				temp->w, temp->h,
   120 				32,
   161 				32,
   121 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
   162 #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */
   122 				0x000000FF, 
   163 				0x000000FF, 
   123 				0x0000FF00, 
   164 				0x0000FF00, 
   124 				0x00FF0000, 
   165 				0x00FF0000, 
   125  			       0xFF000000
   166 				0xFF000000
   126 #else
   167 #else
   127  			       0xFF000000,
   168 				0xFF000000,
   128  			       0x00FF0000, 
   169 				0x00FF0000, 
   129  			       0x0000FF00, 
   170 				0x0000FF00, 
   130  			       0x000000FF
   171 				0x000000FF
   131 #endif
   172 #endif
   132  			       );
   173  			       );
   133 		if ( image != NULL ) {
   174 		if ( image != NULL ) {
   134 			SDL_BlitSurface(temp, NULL, image, NULL);
   175 			SDL_BlitSurface(temp, NULL, image, NULL);
   135 		}
   176 		}
   136 		SDL_FreeSurface(temp);
   177 		SDL_FreeSurface(temp);
   137 		if ( image == NULL ) {
   178 		if ( image == NULL ) {
   138 			return;
   179 			return;
   139 		}
   180 		}
       
   181 		w = image->w;
       
   182 		h = image->h;
       
   183 
       
   184 		/* Create an OpenGL texture for the image */
       
   185 		if ( ! USE_DEPRECATED_OPENGLBLIT ) {
       
   186 			glGenTextures(1, &texture);
       
   187 			glBindTexture(GL_TEXTURE_2D, texture);
       
   188 			glTexParameteri(GL_TEXTURE_2D,
       
   189 			                GL_TEXTURE_MAG_FILTER,
       
   190 			                GL_NEAREST);
       
   191 			glTexParameteri(GL_TEXTURE_2D,
       
   192 			                GL_TEXTURE_MIN_FILTER,
       
   193 			                GL_NEAREST);
       
   194 			glTexImage2D(GL_TEXTURE_2D,
       
   195 			             0,
       
   196 			             GL_RGBA,
       
   197 			             w, h,
       
   198 			             0,
       
   199 			             GL_RGBA,
       
   200 			             GL_UNSIGNED_BYTE,
       
   201 			             image->pixels);
       
   202 			SDL_FreeSurface(image); /* No longer needed */
       
   203 		}
   140 	}
   204 	}
   141 
   205 
   142 	screen = SDL_GetVideoSurface();
   206 	screen = SDL_GetVideoSurface();
   143 
   207 
   144 	/* Show the image on the screen */
   208 	/* Show the image on the screen */
   145 	dst.x = x;
   209 	dst.x = x;
   146 	dst.y = y;
   210 	dst.y = y;
   147 	dst.w = image->w;
   211 	dst.w = w;
   148 	dst.h = image->h;
   212 	dst.h = h;
   149 
   213 
   150 	/* Move it around
   214 	/* Move it around
   151            Note that we do not clear the old position.  This is because we
   215            Note that we do not clear the old position.  This is because we
   152            perform a glClear() which clears the framebuffer and then only
   216            perform a glClear() which clears the framebuffer and then only
   153            update the new area.
   217            update the new area.
   158 		x += delta_x;
   222 		x += delta_x;
   159 		if ( x < 0 ) {
   223 		if ( x < 0 ) {
   160 			x = 0;
   224 			x = 0;
   161 			delta_x = -delta_x;
   225 			delta_x = -delta_x;
   162 		} else
   226 		} else
   163 		if ( (x+image->w) > screen->w ) {
   227 		if ( (x+w) > screen->w ) {
   164 			x = screen->w-image->w;
   228 			x = screen->w-w;
   165 			delta_x = -delta_x;
   229 			delta_x = -delta_x;
   166 		}
   230 		}
   167 		y += delta_y;
   231 		y += delta_y;
   168 		if ( y < 0 ) {
   232 		if ( y < 0 ) {
   169 			y = 0;
   233 			y = 0;
   170 			delta_y = -delta_y;
   234 			delta_y = -delta_y;
   171 		} else
   235 		} else
   172 		if ( (y+image->h) > screen->h ) {
   236 		if ( (y+h) > screen->h ) {
   173 			y = screen->h-image->h;
   237 			y = screen->h-h;
   174 			delta_y = -delta_y;
   238 			delta_y = -delta_y;
   175 		}
   239 		}
   176 		SDL_BlitSurface(image, NULL, screen, &dst);
   240 		if ( USE_DEPRECATED_OPENGLBLIT ) {
   177 	}
   241 			SDL_BlitSurface(image, NULL, screen, &dst);
   178 	SDL_UpdateRects(screen, 1, &dst);
   242 		} else {
       
   243 			SDL_GL_Enter2DMode();
       
   244 			glBindTexture(GL_TEXTURE_2D, texture);
       
   245 			glBegin(GL_TRIANGLE_STRIP);
       
   246 			glTexCoord2f(0.0, 0.0); glVertex2i(x,   y  );
       
   247 			glTexCoord2f(1.0, 0.0); glVertex2i(x+w, y  );
       
   248 			glTexCoord2f(0.0, 1.0); glVertex2i(x,   y+h);
       
   249 			glTexCoord2f(1.0, 1.0); glVertex2i(x+w, y+h);
       
   250 			glEnd();
       
   251 			SDL_GL_Leave2DMode();
       
   252 		}
       
   253 	}
       
   254 	if ( USE_DEPRECATED_OPENGLBLIT ) {
       
   255 		SDL_UpdateRects(screen, 1, &dst);
       
   256 	}
   179 }
   257 }
   180 
   258 
   181 int RunGLTest( int argc, char* argv[],
   259 int RunGLTest( int argc, char* argv[],
   182                int logo, int slowly, int bpp, float gamma )
   260                int logo, int slowly, int bpp, float gamma )
   183 {
   261 {
   220 			bpp = 16;  /* More doesn't seem to work */
   298 			bpp = 16;  /* More doesn't seem to work */
   221 		}
   299 		}
   222 	}
   300 	}
   223 
   301 
   224 	/* Set the flags we want to use for setting the video mode */
   302 	/* Set the flags we want to use for setting the video mode */
   225 	if ( logo ) {
   303 	if ( logo && USE_DEPRECATED_OPENGLBLIT ) {
   226 		video_flags = SDL_OPENGLBLIT;
   304 		video_flags = SDL_OPENGLBLIT;
   227 	} else {
   305 	} else {
   228 		video_flags = SDL_OPENGL;
   306 		video_flags = SDL_OPENGL;
   229 	}
   307 	}
   230 	for ( i=1; argv[i]; ++i ) {
   308 	for ( i=1; argv[i]; ++i ) {
   476 		if ( strcmp(argv[i], "-twice") == 0 ) {
   554 		if ( strcmp(argv[i], "-twice") == 0 ) {
   477 			++numtests;
   555 			++numtests;
   478 		}
   556 		}
   479 		if ( strcmp(argv[i], "-logo") == 0 ) {
   557 		if ( strcmp(argv[i], "-logo") == 0 ) {
   480 			logo = 1;
   558 			logo = 1;
       
   559 			USE_DEPRECATED_OPENGLBLIT = SDL_FALSE;
       
   560 		}
       
   561 		if ( strcmp(argv[i], "-logoblit") == 0 ) {
       
   562 			logo = 1;
       
   563 			USE_DEPRECATED_OPENGLBLIT = SDL_TRUE;
   481 		}
   564 		}
   482 		if ( strcmp(argv[i], "-slow") == 0 ) {
   565 		if ( strcmp(argv[i], "-slow") == 0 ) {
   483 			slowly = 1;
   566 			slowly = 1;
   484 		}
   567 		}
   485 		if ( strcmp(argv[i], "-bpp") == 0 ) {
   568 		if ( strcmp(argv[i], "-bpp") == 0 ) {