[Add] Moving stars.
[Change] optimized opengl.c a little.
This commit is contained in:
		
							parent
							
								
									b5a7ba8919
								
							
						
					
					
						commit
						c84a11e4a7
					
				| @ -18,6 +18,7 @@ | |||||||
| #include "ai.h" | #include "ai.h" | ||||||
| #include "pilot.h" | #include "pilot.h" | ||||||
| 
 | 
 | ||||||
|  | #define WINDOW_CAPTION "Lephisto" | ||||||
| #define CONF_FILE "conf" | #define CONF_FILE "conf" | ||||||
| 
 | 
 | ||||||
| static gl_font fdefault; | static gl_font fdefault; | ||||||
| @ -112,6 +113,9 @@ int main(int argc, char** argv) { | |||||||
|     exit(EXIT_FAILURE); |     exit(EXIT_FAILURE); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   // Window.
 | ||||||
|  |   SDL_WM_SetCaption(WINDOW_CAPTION, NULL); | ||||||
|  | 
 | ||||||
|   // Input.
 |   // Input.
 | ||||||
|   if(indjoystick >= 0 || namjoystick != NULL) { |   if(indjoystick >= 0 || namjoystick != NULL) { | ||||||
|     if(joystick_init()) |     if(joystick_init()) | ||||||
| @ -191,7 +195,7 @@ static void display_fps(const double dt) { | |||||||
|   fps_dt += dt; |   fps_dt += dt; | ||||||
|   fps_cur += 1.; |   fps_cur += 1.; | ||||||
|   if(fps_dt > 1.) { |   if(fps_dt > 1.) { | ||||||
|     fps = fps_cur; |     fps = fps_cur / fps_dt; | ||||||
|     fps_dt = fps_cur = 0.; |     fps_dt = fps_cur = 0.; | ||||||
|   } |   } | ||||||
|   Vec2 pos = { .x = 10., .y = (double)(gl_screen.h-20) }; |   Vec2 pos = { .x = 10., .y = (double)(gl_screen.h-20) }; | ||||||
|  | |||||||
							
								
								
									
										71
									
								
								src/opengl.c
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								src/opengl.c
									
									
									
									
									
								
							| @ -77,12 +77,15 @@ static GLuint gl_loadSurface(SDL_Surface* surface, int* rw, int* rh) { | |||||||
|   SDL_Surface* tmp; |   SDL_Surface* tmp; | ||||||
|   Uint32 saved_flags; |   Uint32 saved_flags; | ||||||
|   Uint8  saved_alpha; |   Uint8  saved_alpha; | ||||||
|  |   int potw, poth; | ||||||
|    |    | ||||||
|   // Make size power of two.
 |   // Make size power of two.
 | ||||||
|   if(rw)*rw = pot(surface->w); |   potw = pot(surface->w); | ||||||
|   if(rh)*rh = pot(surface->h); |   poth = pot(surface->h); | ||||||
|  |   if(rw)*rw = potw; | ||||||
|  |   if(rh)*rh = poth; | ||||||
| 
 | 
 | ||||||
|   if(surface->w != *rw || surface->h != *rh) { |   if(surface->w != potw || surface->h != poth) { | ||||||
|     // Size isn't original.
 |     // Size isn't original.
 | ||||||
|     SDL_Rect rtemp; |     SDL_Rect rtemp; | ||||||
|     rtemp.x = rtemp.y = 0; |     rtemp.x = rtemp.y = 0; | ||||||
| @ -97,7 +100,7 @@ static GLuint gl_loadSurface(SDL_Surface* surface, int* rw, int* rh) { | |||||||
| 
 | 
 | ||||||
|     // Create the temp POT surface.
 |     // Create the temp POT surface.
 | ||||||
|     tmp = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, |     tmp = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, | ||||||
|           *rw, *rh, surface->format->BytesPerPixel*8, RGBMASK); |           potw, poth, surface->format->BytesPerPixel*8, RGBMASK); | ||||||
|     if(tmp == NULL) { |     if(tmp == NULL) { | ||||||
|       WARN("Unable to create POT surface %s", SDL_GetError()); |       WARN("Unable to create POT surface %s", SDL_GetError()); | ||||||
|       return 0; |       return 0; | ||||||
| @ -118,7 +121,7 @@ static GLuint gl_loadSurface(SDL_Surface* surface, int* rw, int* rh) { | |||||||
| 
 | 
 | ||||||
|     // Create the temp POT surface.
 |     // Create the temp POT surface.
 | ||||||
|     tmp = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, |     tmp = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, | ||||||
|           *rw, *rh, surface->format->BytesPerPixel*8, RGBMASK); |           potw, poth, surface->format->BytesPerPixel*8, RGBMASK); | ||||||
|     if(tmp == NULL) { |     if(tmp == NULL) { | ||||||
|       WARN("Unable to create POT surface %s", SDL_GetError()); |       WARN("Unable to create POT surface %s", SDL_GetError()); | ||||||
|       return 0; |       return 0; | ||||||
| @ -230,6 +233,8 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, cons | |||||||
|   if(fabs(pos->x - gl_camera->x) > gl_screen.w / 2 + sprite->sw / 2 || |   if(fabs(pos->x - gl_camera->x) > gl_screen.w / 2 + sprite->sw / 2 || | ||||||
|         fabs(pos->y-gl_camera->y) > gl_screen.h / 2 + sprite->sh / 2) |         fabs(pos->y-gl_camera->y) > gl_screen.h / 2 + sprite->sh / 2) | ||||||
|     return; |     return; | ||||||
|  | 
 | ||||||
|  |   glEnable(GL_TEXTURE_2D); | ||||||
|   glMatrixMode(GL_TEXTURE); |   glMatrixMode(GL_TEXTURE); | ||||||
|   glPushMatrix(); |   glPushMatrix(); | ||||||
|   glTranslated(sprite->sw * (double)(sx)/sprite->rw, |   glTranslated(sprite->sw * (double)(sx)/sprite->rw, | ||||||
| @ -243,8 +248,8 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, cons | |||||||
| 
 | 
 | ||||||
|   // Actual blitting....
 |   // Actual blitting....
 | ||||||
|   glBindTexture(GL_TEXTURE_2D, sprite->texture); |   glBindTexture(GL_TEXTURE_2D, sprite->texture); | ||||||
|   glColor4ub(255, 255, 255, 255); |  | ||||||
|   glBegin(GL_TRIANGLE_STRIP); |   glBegin(GL_TRIANGLE_STRIP); | ||||||
|  |     glColor4d(1., 1., 1., 1.); | ||||||
|     glTexCoord2d(0., 0.); |     glTexCoord2d(0., 0.); | ||||||
|       glVertex2d(0., 0.); |       glVertex2d(0., 0.); | ||||||
|     glTexCoord2d(sprite->sw/sprite->rw, 0.); |     glTexCoord2d(sprite->sw/sprite->rw, 0.); | ||||||
| @ -259,10 +264,13 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, cons | |||||||
| 
 | 
 | ||||||
|   glMatrixMode(GL_TEXTURE); |   glMatrixMode(GL_TEXTURE); | ||||||
|   glPopMatrix(); // Sprite translation matrix.
 |   glPopMatrix(); // Sprite translation matrix.
 | ||||||
|  |    | ||||||
|  |   glDisable(GL_TEXTURE_2D); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Just straight out blit the thing at position.
 | // Just straight out blit the thing at position.
 | ||||||
| void gl_blitStatic(const gl_texture* texture, const Vec2* pos) { | void gl_blitStatic(const gl_texture* texture, const Vec2* pos) { | ||||||
|  |   glEnable(GL_TEXTURE_2D); | ||||||
|   glMatrixMode(GL_PROJECTION); |   glMatrixMode(GL_PROJECTION); | ||||||
|   glPushMatrix(); // Set up translation matrix.
 |   glPushMatrix(); // Set up translation matrix.
 | ||||||
|   glTranslated(pos->x - (double)gl_screen.w/2., pos->y - (double)gl_screen.h/2., 0); |   glTranslated(pos->x - (double)gl_screen.w/2., pos->y - (double)gl_screen.h/2., 0); | ||||||
| @ -270,8 +278,8 @@ void gl_blitStatic(const gl_texture* texture, const Vec2* pos) { | |||||||
|    |    | ||||||
|   // Actual blitting..
 |   // Actual blitting..
 | ||||||
|   glBindTexture(GL_TEXTURE_2D, texture->texture); |   glBindTexture(GL_TEXTURE_2D, texture->texture); | ||||||
|   glColor4ub(255, 255, 255, 255); |  | ||||||
|   glBegin(GL_TRIANGLE_STRIP); |   glBegin(GL_TRIANGLE_STRIP); | ||||||
|  |     glColor4ub(1., 1., 1., 1.); | ||||||
|     glTexCoord2d(0., 0.); |     glTexCoord2d(0., 0.); | ||||||
|       glVertex2d(0., 0.); |       glVertex2d(0., 0.); | ||||||
|     glTexCoord2d(texture->w/texture->rw, 0.); |     glTexCoord2d(texture->w/texture->rw, 0.); | ||||||
| @ -283,6 +291,8 @@ void gl_blitStatic(const gl_texture* texture, const Vec2* pos) { | |||||||
|   glEnd(); |   glEnd(); | ||||||
| 
 | 
 | ||||||
|   glPopMatrix(); // Pop the translation matrix.
 |   glPopMatrix(); // Pop the translation matrix.
 | ||||||
|  | 
 | ||||||
|  |   glDisable(GL_TEXTURE_2D); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Bind our precious camera to a vector.
 | // Bind our precious camera to a vector.
 | ||||||
| @ -291,14 +301,12 @@ void gl_bindCamera(const Vec2* pos) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Print text on screen! YES!!!! Just like printf! But different!
 | // Print text on screen! YES!!!! Just like printf! But different!
 | ||||||
| void gl_print(const gl_font* ft_font, Vec2* pos, const char* fmt, ...) { | void gl_print(const gl_font* ft_font, const Vec2* pos, const char* fmt, ...) { | ||||||
|   //float h = ft_font->h / .63; // Slightly increases font size.
 |   //float h = ft_font->h / .63; // Slightly increases font size.
 | ||||||
|   char text[256]; |   char text[256]; | ||||||
|   va_list ap; |   va_list ap; | ||||||
|   //int i;
 |  | ||||||
| 
 | 
 | ||||||
|   if(fmt == NULL) |   if(fmt == NULL) return; | ||||||
|     *text = 0; |  | ||||||
|   else { |   else { | ||||||
|     // convert the symbols to text.
 |     // convert the symbols to text.
 | ||||||
|     va_start(ap, fmt); |     va_start(ap, fmt); | ||||||
| @ -306,16 +314,20 @@ void gl_print(const gl_font* ft_font, Vec2* pos, const char* fmt, ...) { | |||||||
|     va_end(ap); |     va_end(ap); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   glEnable(GL_TEXTURE_2D); | ||||||
|  | 
 | ||||||
|   glListBase(ft_font->list_base); |   glListBase(ft_font->list_base); | ||||||
| 
 | 
 | ||||||
|   glMatrixMode(GL_PROJECTION); |   glMatrixMode(GL_PROJECTION); | ||||||
|   //for(i = 0; i < strlen(text); i++) {
 | 
 | ||||||
|     glPushMatrix(); |   glPushMatrix(); // Translation matrix.
 | ||||||
|   glTranslated(pos->x - (double)gl_screen.w/2., pos->y - (double)gl_screen.h/2., 0); |   glTranslated(pos->x - (double)gl_screen.w/2., pos->y - (double)gl_screen.h/2., 0); | ||||||
|     glColor4ub(255, 255, 255, 255); | 
 | ||||||
|  |   glColor4d(1., 1., 1., 1.); | ||||||
|   glCallLists(strlen(text), GL_UNSIGNED_BYTE, &text); |   glCallLists(strlen(text), GL_UNSIGNED_BYTE, &text); | ||||||
|     glPopMatrix(); | 
 | ||||||
|   //}
 |   glPopMatrix(); // Translation matrix.
 | ||||||
|  |   glDisable(GL_TEXTURE_2D); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ================
 | // ================
 | ||||||
| @ -364,30 +376,26 @@ static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* te | |||||||
|   // Create the display lists.
 |   // Create the display lists.
 | ||||||
|   glNewList(list_base+ch, GL_COMPILE); |   glNewList(list_base+ch, GL_COMPILE); | ||||||
| 
 | 
 | ||||||
|   glBindTexture(GL_TEXTURE_2D, tex_base[(int)ch]); |   // Corrects a spacing flaw between letters and
 | ||||||
| 
 |   // downwards correction for letters like g or y.
 | ||||||
|   glPushMatrix(); |   glPushMatrix(); | ||||||
| 
 |   glTranslated(bitmap_glyph->left, bitmap_glyph->top-bitmap.rows, 0); | ||||||
|   // Corrects a spacing flaw between letters.
 |  | ||||||
|   glTranslated(bitmap_glyph->left, 0,0); |  | ||||||
| 
 |  | ||||||
|   // Downwards correction for letters like g or y.
 |  | ||||||
|   glTranslated(0, bitmap_glyph->top-bitmap.rows,0); |  | ||||||
| 
 | 
 | ||||||
|   // Take the opengl POT wrapping into account.
 |   // Take the opengl POT wrapping into account.
 | ||||||
|   double x = (double)bitmap.width/(double)w; |   double x = (double)bitmap.width/(double)w; | ||||||
|   double y = (double)bitmap.rows/(double)h; |   double y = (double)bitmap.rows/(double)h; | ||||||
| 
 | 
 | ||||||
|   // Draw the texture mapped quad.
 |   // Draw the texture mapped quad.
 | ||||||
|   glBegin(GL_QUADS); |   glBindTexture(GL_TEXTURE_2D, tex_base[(int)ch]); | ||||||
|  |   glBegin(GL_TRIANGLE_STRIP); | ||||||
|     glTexCoord2d(0, 0); |     glTexCoord2d(0, 0); | ||||||
|       glVertex2d(0, bitmap.rows); |       glVertex2d(0, bitmap.rows); | ||||||
|  |     glTexCoord2d(x, 0); | ||||||
|  |       glVertex2d(bitmap.width, bitmap.rows); | ||||||
|     glTexCoord2d(0, y); |     glTexCoord2d(0, y); | ||||||
|       glVertex2d(0, 0); |       glVertex2d(0, 0); | ||||||
|     glTexCoord2d(x, y); |     glTexCoord2d(x, y); | ||||||
|       glVertex2d(bitmap.width, 0); |       glVertex2d(bitmap.width, 0); | ||||||
|     glTexCoord2d(x, 0); |  | ||||||
|       glVertex2d(bitmap.width, bitmap.rows); |  | ||||||
|   glEnd(); |   glEnd(); | ||||||
| 
 | 
 | ||||||
|   glPopMatrix(); |   glPopMatrix(); | ||||||
| @ -515,9 +523,11 @@ int gl_init(void) { | |||||||
|   DEBUG("Renderer: %s", glGetString(GL_RENDERER)); |   DEBUG("Renderer: %s", glGetString(GL_RENDERER)); | ||||||
| 
 | 
 | ||||||
|   // Some openGL options.
 |   // Some openGL options.
 | ||||||
|   glClearColor(0., 0., 0., 0.); |   glClearColor(0., 0., 0., 1.); | ||||||
|   glDisable(GL_DEPTH_TEST); // Set for doing 2D shidazles.
 |   glDisable(GL_DEPTH_TEST); // Set for doing 2D shidazles.
 | ||||||
|   glEnable(GL_TEXTURE_2D); |   //glEnable(GL_TEXTURE_2D);
 | ||||||
|  |   glDisable(GL_LIGHTING); // No lighting, it is done when rendered.
 | ||||||
|  |   glMatrixMode(GL_PROJECTION); | ||||||
|   glMatrixMode(GL_PROJECTION); |   glMatrixMode(GL_PROJECTION); | ||||||
|   glLoadIdentity(); |   glLoadIdentity(); | ||||||
|   glOrtho(-SCREEN_W /2,   // Left edge.
 |   glOrtho(-SCREEN_W /2,   // Left edge.
 | ||||||
| @ -529,10 +539,9 @@ int gl_init(void) { | |||||||
|   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Alpha.
 |   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Alpha.
 | ||||||
|   glEnable(GL_BLEND); |   glEnable(GL_BLEND); | ||||||
| 
 | 
 | ||||||
|  |   glPointSize(1.); // Default is 1.
 | ||||||
|   glClear(GL_COLOR_BUFFER_BIT); |   glClear(GL_COLOR_BUFFER_BIT); | ||||||
| 
 | 
 | ||||||
|   SDL_WM_SetCaption(WINDOW_CAPTION, NULL); |  | ||||||
| 
 |  | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -17,8 +17,6 @@ | |||||||
| #endif | #endif | ||||||
| #define RGBMASK RMASK,GMASK,BMASK,AMASK | #define RGBMASK RMASK,GMASK,BMASK,AMASK | ||||||
| 
 | 
 | ||||||
| #define WINDOW_CAPTION "Lephisto" |  | ||||||
| 
 |  | ||||||
| // Info about opengl screen.
 | // Info about opengl screen.
 | ||||||
| typedef struct { | typedef struct { | ||||||
|   int w, h;         // Window dimensions.
 |   int w, h;         // Window dimensions.
 | ||||||
| @ -60,7 +58,7 @@ void gl_freeTexture(gl_texture* texture); | |||||||
| void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, const int sy); | void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, const int sy); | ||||||
| void gl_blitStatic(const gl_texture* texture, const Vec2* pos); | void gl_blitStatic(const gl_texture* texture, const Vec2* pos); | ||||||
| void gl_bindCamera(const Vec2* pos); | void gl_bindCamera(const Vec2* pos); | ||||||
| void gl_print(const gl_font* ft_font, Vec2* pos, const char* fmt, ...); | void gl_print(const gl_font* ft_font, const Vec2* pos, const char* fmt, ...); | ||||||
| 
 | 
 | ||||||
| // Initialize/cleanup.
 | // Initialize/cleanup.
 | ||||||
| int gl_init(void); | int gl_init(void); | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| 
 | 
 | ||||||
| #define RNG(L,H) rand()%(H-L+1)+L | #define RNG(L,H) (rand()%(H-L+1)+L) | ||||||
| 
 | 
 | ||||||
| void rng_init(void); | void rng_init(void); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										175
									
								
								src/space.c
									
									
									
									
									
								
							
							
						
						
									
										175
									
								
								src/space.c
									
									
									
									
									
								
							| @ -1,3 +1,5 @@ | |||||||
|  | #include <SDL.h> | ||||||
|  | #include <SDL_opengl.h> | ||||||
| #include "log.h" | #include "log.h" | ||||||
| #include "physics.h" | #include "physics.h" | ||||||
| #include "opengl.h" | #include "opengl.h" | ||||||
| @ -5,183 +7,50 @@ | |||||||
| #include "pilot.h" | #include "pilot.h" | ||||||
| #include "space.h" | #include "space.h" | ||||||
| 
 | 
 | ||||||
| #define STAR_LAYERS 1 |  | ||||||
| 
 |  | ||||||
| static gl_texture* starBG[STAR_LAYERS]; |  | ||||||
| static Vec2 starPos[STAR_LAYERS]; |  | ||||||
| 
 |  | ||||||
| #define STAR_BUF 100 // Area to leave around screen.
 | #define STAR_BUF 100 // Area to leave around screen.
 | ||||||
| typedef struct { | typedef struct { | ||||||
|   Vec2 pos; |   Vec2 pos; | ||||||
|   Uint8 brightness; |   double brightness; | ||||||
| } Star; | } Star; | ||||||
| 
 | 
 | ||||||
| Star* stars; | Star* stars; | ||||||
| int nstars; | int nstars; | ||||||
| 
 | 
 | ||||||
| static gl_texture* starBG_create(const int density); |  | ||||||
| static void put_pixel(SDL_Surface* surface, const int x, const int y, |  | ||||||
|       const Uint8 R, const Uint8 G, const Uint8 B, const Uint8 A); |  | ||||||
| 
 |  | ||||||
| // Modify the pixel at (x,y) of the surface to be of color RGB.
 |  | ||||||
| static void put_pixel(SDL_Surface* surface, const int x, const int y, |  | ||||||
|       const Uint8 R, const Uint8 G, const Uint8 B, const Uint8 A) { |  | ||||||
|    |  | ||||||
|   Uint32 pixel = SDL_MapRGBA(surface->format, R, G, B, A); |  | ||||||
|   int bpp = surface->format->BytesPerPixel; |  | ||||||
|   // p is the address to the pixel we want to set.
 |  | ||||||
|   Uint8* p = (Uint8*)surface->pixels + y * surface->pitch + x * bpp; |  | ||||||
| 
 |  | ||||||
|   switch(bpp) { |  | ||||||
|     case 1:  |  | ||||||
|       *p = pixel; |  | ||||||
|       break; |  | ||||||
|     case 2: |  | ||||||
|       *(Uint16*)p = pixel; |  | ||||||
|       break; |  | ||||||
|     case 3: |  | ||||||
|       if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { |  | ||||||
|         p[0] = (pixel >> 16)  & 0xff; |  | ||||||
|         p[1] = (pixel >> 8)   & 0xff; |  | ||||||
|         p[2] = pixel & 0xff; |  | ||||||
|       } else { |  | ||||||
|         p[0] = pixel & 0xff; |  | ||||||
|         p[1] = (pixel >> 8)   & 0xff; |  | ||||||
|         p[2] = (pixel >> 16)  & 0xff; |  | ||||||
|       } |  | ||||||
|       break; |  | ||||||
|     case 4: |  | ||||||
|       *(Uint32*)p = pixel; |  | ||||||
|       break; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Create a background of stars to use.
 |  | ||||||
| // Background consists of four tiles together.
 |  | ||||||
| static gl_texture* starBG_create(const int density) { |  | ||||||
|   SDL_Surface* surface; |  | ||||||
|   int w, h; |  | ||||||
|   int i, d; |  | ||||||
| 
 |  | ||||||
|   w = (int)((float)gl_screen.w * 1.5); |  | ||||||
|   if((w & (w-1)) != 0) { |  | ||||||
|     w = 1; |  | ||||||
|     while(w < (int)((float)gl_screen.w*1.5)) |  | ||||||
|       w <<= 1; |  | ||||||
|   } |  | ||||||
|   h = (int)((float)gl_screen.h * 1.5); |  | ||||||
|   if((h & (h-1)) != 0) { |  | ||||||
|     h = 1; |  | ||||||
|     while(h < (int)((float)gl_screen.h * 1.5)) |  | ||||||
|       h <<= 1; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   surface = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, w, h, |  | ||||||
|         SDL_GetVideoSurface()->format->BytesPerPixel*8, RGBMASK); |  | ||||||
|    |  | ||||||
|   if(surface == NULL) { |  | ||||||
|     WARN("Unable to create RGB surface"); |  | ||||||
|     return NULL; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   SDL_LockSurface(surface); |  | ||||||
| 
 |  | ||||||
|   d = (int)((double)(density)*(double)(gl_screen.w)*(double)(gl_screen.h)/1000./1000.); |  | ||||||
|   for(i = 0; i < d; i++) |  | ||||||
|     put_pixel(surface, RNG(0,w-1), RNG(0,h-1), 255, 255, 255, RNG(50, 255)); |  | ||||||
| 
 |  | ||||||
|   SDL_UnlockSurface(surface); |  | ||||||
| 
 |  | ||||||
|   return gl_loadImage(surface); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void space_init(void) { | void space_init(void) { | ||||||
|   int i; |   int i; | ||||||
|   nstars = 2000; |   nstars = (500*gl_screen.w*gl_screen.h + STAR_BUF*STAR_BUF)/(800*640);; | ||||||
|   stars = malloc(sizeof(Star)*nstars); |   stars = malloc(sizeof(Star)*nstars); | ||||||
|   for(i = 0; i < nstars; i++) { |   for(i = 0; i < nstars; i++) { | ||||||
|     stars[i].brightness = RNG(50, 255); |     stars[i].brightness = (float)RNG(50, 200)/256.; | ||||||
|     stars[i].pos.x = RNG(STAR_BUF, gl_screen.w + STAR_BUF); |     stars[i].pos.x = (float)RNG(-STAR_BUF, gl_screen.w + STAR_BUF); | ||||||
|     stars[i].pos.y = RNG(-STAR_BUF, gl_screen.h + STAR_BUF); |     stars[i].pos.y = (float)RNG(-STAR_BUF, gl_screen.h + STAR_BUF); | ||||||
|   } |   } | ||||||
| #if 0 |  | ||||||
|   for(i = 0; i < STAR_LAYERS; i++) { |  | ||||||
|     starBG[i] = starBG_create(1000); |  | ||||||
|     starPos[i].x = 0.; |  | ||||||
|     starPos[i].y = 0.; |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void space_render(double dt) { | void space_render(double dt) { | ||||||
|   int i; |   int i; | ||||||
|   glMatrixMode(GL_PROJECTION); |   glMatrixMode(GL_PROJECTION); | ||||||
|   glPushMatrix(); |   glPushMatrix(); // Projection translation matrix.
 | ||||||
|  |   glTranslated(-(double)gl_screen.w/2., -(double)gl_screen.h/2., 0.); | ||||||
|   glBegin(GL_POINTS); |   glBegin(GL_POINTS); | ||||||
|     glColor4ub(255, 255, 255, stars[i].brightness); |   for(i = 0; i < nstars; i++) { | ||||||
|  |     // Update the position.
 | ||||||
|  |     stars[i].pos.x -= player->solid->vel.x/(15.-10.*stars[i].brightness)*dt; | ||||||
|  |     stars[i].pos.y -= player->solid->vel.y/(15.-10.*stars[i].brightness)*dt; | ||||||
|  |     // Scroll those stars bitch!
 | ||||||
|  |     if(stars[i].pos.x > gl_screen.w + STAR_BUF) stars[i].pos.x = -STAR_BUF; | ||||||
|  |     else if(stars[i].pos.x < -STAR_BUF) stars[i].pos.x = gl_screen.w + STAR_BUF; | ||||||
|  |     if(stars[i].pos.y > gl_screen.h + STAR_BUF) stars[i].pos.y = -STAR_BUF; | ||||||
|  |     else if(stars[i].pos.y < -STAR_BUF) stars[i].pos.y = gl_screen.h + STAR_BUF; | ||||||
|  |     // Render.
 | ||||||
|  |     glColor4d(1., 1., 1., stars[i].brightness); | ||||||
|     glVertex2d(stars[i].pos.x, stars[i].pos.y); |     glVertex2d(stars[i].pos.x, stars[i].pos.y); | ||||||
|  |   } | ||||||
|   glEnd(); |   glEnd(); | ||||||
|   glPopMatrix(); |   glPopMatrix(); // Projection translation matrix.
 | ||||||
| 
 |  | ||||||
| #if 0 |  | ||||||
|   Vec2 tmp; |  | ||||||
|   FP f; |  | ||||||
| 
 |  | ||||||
|   for(i = 0; i < STAR_LAYERS; i++) { |  | ||||||
|     // Movement.
 |  | ||||||
|     starPos[i].x -= player->solid->vel.x / (FP)(2*i+10)*dt; |  | ||||||
|     starPos[i].y -= player->solid->vel.y / (FP)(2*i+104)*dt; |  | ||||||
| 
 |  | ||||||
|     // Displaces x if reaches edge.
 |  | ||||||
|     if(starPos[i].x > 0) |  | ||||||
|       starPos[i].x -= starBG[i]->w; |  | ||||||
|     else if(starPos[i].x < -starBG[i]->w) |  | ||||||
|       starPos[i].x += starBG[i]->w; |  | ||||||
| 
 |  | ||||||
|     // Displaces y if reaches edge.
 |  | ||||||
|     if(starPos[i].y > 0) |  | ||||||
|       starPos[i].y -= starBG[i]->h; |  | ||||||
|     else if(starPos[i].y < -starBG[i]->h) |  | ||||||
|       starPos[i].y += starBG[i]->h; |  | ||||||
| 
 |  | ||||||
|     // Primary blit.
 |  | ||||||
|     gl_blitStatic(starBG[i], &starPos[i]); |  | ||||||
| 
 |  | ||||||
|     tmp.x = starPos[i].x; |  | ||||||
|     tmp.y = starPos[i].y; |  | ||||||
| 
 |  | ||||||
|     // More blits if part of the screen is blank.
 |  | ||||||
|     if(starPos[i].x < starBG[i]->w/4.) |  | ||||||
|       tmp.x += starBG[i]->w; |  | ||||||
|     else if(starPos[i].x < starBG[i]->w*3./4.) |  | ||||||
|       tmp.y -= starBG[i]->w; |  | ||||||
| 
 |  | ||||||
|     if(starPos[i].y < starBG[i]->h/4.) |  | ||||||
|       tmp.y += starBG[i]->h; |  | ||||||
|     else if(starPos[i].y < starBG[i]->h*3./4.) |  | ||||||
|       tmp.y -= starBG[i]->h; |  | ||||||
| 
 |  | ||||||
|     if(tmp.x != starPos[i].x && tmp.y != starPos[i].y) { |  | ||||||
|       gl_blitStatic(starBG[i], &tmp); |  | ||||||
|       f = tmp.x; |  | ||||||
|       tmp.x = starPos[i].x; |  | ||||||
|       gl_blitStatic(starBG[i], &tmp); |  | ||||||
|       tmp.x = f; |  | ||||||
|       tmp.y = starPos[i].y; |  | ||||||
|       gl_blitStatic(starBG[i], &tmp); |  | ||||||
|     } |  | ||||||
|     else if(tmp.x != starPos[i].x || tmp.y != starPos[i].y) |  | ||||||
|       gl_blitStatic(starBG[i], &tmp); |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void space_exit(void) { | void space_exit(void) { | ||||||
|   free(stars); |   free(stars); | ||||||
| #if 0 |  | ||||||
|   int i; |  | ||||||
|   for(i = 0; i < STAR_LAYERS; i++) |  | ||||||
|     gl_freeTexture(starBG[i]); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Allanis
						Allanis