From 497081b3ed0b48cbee3573b64efdafd68c8e4f37 Mon Sep 17 00:00:00 2001 From: Allanis <allanis@saracraft.net> Date: Mon, 22 Jul 2013 17:21:28 +0100 Subject: [PATCH] [Change] Split player rendering properly into GUI and player. --- src/lephisto.c | 3 +- src/nebulae.c | 89 ++++++++++++++++++++++++++++++++------------------ src/nebulae.h | 2 +- src/player.c | 11 ++++--- src/player.h | 3 +- src/space.c | 2 +- 6 files changed, 69 insertions(+), 41 deletions(-) diff --git a/src/lephisto.c b/src/lephisto.c index f1ecf44..88e480c 100644 --- a/src/lephisto.c +++ b/src/lephisto.c @@ -356,10 +356,11 @@ static void render_all(void) { pilots_render(); weapons_render(WEAPON_LAYER_FG); spfx_render(SPFX_LAYER_BACK); - space_renderOverlay(cur_dt); /* FG. */ player_render(); spfx_render(SPFX_LAYER_FRONT); + space_renderOverlay(cur_dt); + player_renderGUI(); display_fps(cur_dt); } diff --git a/src/nebulae.c b/src/nebulae.c index c140733..cdbf550 100644 --- a/src/nebulae.c +++ b/src/nebulae.c @@ -10,12 +10,14 @@ #include "rng.h" #include "menu.h" #include "player.h" +#include "pause.h" #include "perlin.h" #define NEBULAE_Z 16 /* Z plane. */ #define NEBULAE_PUFFS 32 /* Amount of puffs to generate. */ #define NEBULAE_PATH_BG "gen/nebu_bg_%dx%d_%02d.png" -#define NEBULAE_PATH_PUFF "gen/nebu_puff_%02d.png" + +#define NEBULAE_PUFF_BUFFER 300 /* Nebulae buffer. */ /* Extern. */ extern double gui_xoff, gui_yoff; @@ -36,19 +38,14 @@ static double nebu_view = 0.; static double nebu_dt = 0.; /* Puff textures. */ -typedef struct NebulaePuffTex_ { - GLuint tex; /* Actualy texture. */ - double w, h; /* Real dimensions. */ - double pw, ph; /* Padding. */ -} NebulaePuffTex; -static NebulaePuffTex nebu_pufftexs[NEBULAE_PUFFS]; +static glTexture* nebu_pufftexs[NEBULAE_PUFFS]; /* Puff handling. */ typedef struct NebulaePuff_ { double x, y; /* Position. */ double a, va; /* Alpha, alpha velocity. */ double height; /* Height vs player. */ - NebulaePuffTex* tex; /* Texture. */ + int tex; /* Texture. */ } NebulaePuff; static NebulaePuff* nebu_puffs = NULL; static int nebu_npuffs = 0; @@ -142,21 +139,21 @@ void nebu_exit(void) { glDeleteTextures(NEBULAE_Z, nebu_textures); for(i = 0; i < NEBULAE_PUFFS; i++) - glDeleteTextures(1, &nebu_pufftexs[i].tex); + gl_freeTexture(nebu_pufftexs[i]); } /* Render the nebulae. */ -void nebu_render(void) { +void nebu_render(const double dt) { unsigned int t; - double dt; + double ndt; double tw, th; GLfloat col[4]; int tmp; /* Calculate frame to draw. */ t = SDL_GetTicks(); - dt = (t - last_render) / 1000.; - if(dt > nebu_dt) { /* Time to change. */ + ndt = (t - last_render) / 1000.; + if(ndt > nebu_dt) { /* Time to change. */ tmp = cur_nebu[0]; cur_nebu[0] += cur_nebu[0] - cur_nebu[1]; cur_nebu[1] = tmp; @@ -166,13 +163,14 @@ void nebu_render(void) { cur_nebu[0] = 1; last_render = t; - dt = 0.; + ndt = 0.; } + /* Set colour. */ col[0] = cPurple.r; col[1] = cPurple.g; col[2] = cPurple.b; - col[3] = dt / nebu_dt; + col[3] = ndt / nebu_dt; tw = (double)nebu_w / (double)nebu_pw; th = (double)nebu_h / (double)nebu_ph; @@ -240,6 +238,7 @@ void nebu_render(void) { glPopMatrix(); /* GL_PROJECTION */ + /* Set values to defaults. */ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); @@ -248,6 +247,9 @@ void nebu_render(void) { /* Did anything fail? */ gl_checkErr(); + + /* Now render the puffs. */ + nebu_renderPuffs(dt, 1); } void nebu_renderOverlay(const double dt) { @@ -343,27 +345,39 @@ void nebu_renderOverlay(const double dt) { /* Render the puffs. */ void nebu_renderPuffs(const double dt, int below_player) { int i; + glColour cPuff; - glPushMatrix(); /* GL_PROJECTION */ - glTranslated(-(double)SCREEN_W/2., -(double)SCREEN_H/2., 0.); + cPuff.r = cPurple.r; + cPuff.g = cPurple.g; + cPuff.b = cPurple.b; for(i = 0; i < nebu_npuffs; i++) { if((below_player && (nebu_puffs[i].height < 1.)) || (!below_player && (nebu_puffs[i].height > 1.))) { /* Calculate new position. */ - nebu_puffs[i].x -= player->solid->vel.x * nebu_puffs[i].height * dt; - nebu_puffs[i].y -= player->solid->vel.y * nebu_puffs[i].height * dt; + if(!paused) { + nebu_puffs[i].x -= player->solid->vel.x * nebu_puffs[i].height * dt; + nebu_puffs[i].y -= player->solid->vel.y * nebu_puffs[i].height * dt; + } /* Calculate new alpha. */ /*nebu_puffs[i].a += nebu_puffs[i].va * dt;*/ + cPuff.a = nebu_puffs[i].a; /* Check boundaries. */ + if(nebu_puffs[i].x > SCREEN_W + NEBULAE_PUFF_BUFFER) + nebu_puffs[i].x = -NEBULAE_PUFF_BUFFER; + else if(nebu_puffs[i].y > SCREEN_H + NEBULAE_PUFF_BUFFER) + nebu_puffs[i].y = -NEBULAE_PUFF_BUFFER; + else if(nebu_puffs[i].x < -NEBULAE_PUFF_BUFFER) + nebu_puffs[i].x = SCREEN_W + NEBULAE_PUFF_BUFFER; + else if(nebu_puffs[i].y < -NEBULAE_PUFF_BUFFER) + nebu_puffs[i].y = SCREEN_H + NEBULAE_PUFF_BUFFER; /* Render. */ - ACOLOUR(cPurple, nebu_puffs[i].a); - glBegin(GL_QUADS); - glEnd(); /* GL_QUADS */ + gl_blitStatic(nebu_pufftexs[nebu_puffs[i].tex], + nebu_puffs[i].x, nebu_puffs[i].y, &cPuff); } } } @@ -371,8 +385,22 @@ void nebu_renderPuffs(const double dt, int below_player) { /* Prepare the nebulae. */ void nebu_prep(double density, double volatility) { (void)volatility; + int i; + nebu_view = 1000. - density; /* At density 1000 you're blind. */ nebu_dt = 2000. / (density + 100.); /* Faster at higher density. */ + + nebu_npuffs = density/4.; + nebu_puffs = realloc(nebu_puffs, sizeof(NebulaePuff)*nebu_npuffs); + for(i = 0; i < nebu_npuffs; i++) { + nebu_puffs[i].tex = RNG(0, NEBULAE_PUFFS-1); + nebu_puffs[i].x = (double)RNG(-NEBULAE_PUFF_BUFFER, + SCREEN_W + NEBULAE_PUFF_BUFFER); + nebu_puffs[i].y = (double)RNG(-NEBULAE_PUFF_BUFFER, + SCREEN_H + NEBULAE_PUFF_BUFFER); + nebu_puffs[i].a = (double)RNG(20,100)/100.; + nebu_puffs[i].height = RNGF()*2.; + } } /* Force generation of new nebulae. */ @@ -419,15 +447,8 @@ static void nebu_generatePuffs(void) { sur = nebu_surfaceFromNebulaeMap(nebu, w, h); free(nebu); - /* Set dimensions. */ - nebu_pufftexs[i].w = w; - nebu_pufftexs[i].h = h; - nebu_pufftexs[i].pw = gl_pot(w); - nebu_pufftexs[i].ph = gl_pot(h); - - /* Actually create the texture. */ - glGenTextures(1, &nebu_pufftexs[i].tex); - nebu_loadTexture(sur, 0, 0, nebu_pufftexs[i].tex); + /* Load the textures. */ + nebu_pufftexs[i] = gl_loadImage(sur); } } @@ -445,12 +466,14 @@ static void saveNebulae(float* map, const uint32_t w, const uint32_t h, char file_path[PATH_MAX]; SDL_Surface* sur; + /* Fix surface. */ sur = nebu_surfaceFromNebulaeMap(map, w, h); + /* Save. */ snprintf(file_path, PATH_MAX, "%s%s", lfile_basePath(), file); - SDL_savePNG(sur, file_path); + /* Cleanup. */ SDL_FreeSurface(sur); } @@ -459,6 +482,7 @@ static SDL_Surface* loadNebulae(const char* file) { char file_path[PATH_MAX]; SDL_Surface* sur; + /* Load the file. */ snprintf(file_path, PATH_MAX, "%s%s", lfile_basePath(), file); sur = IMG_Load(file_path); @@ -477,6 +501,7 @@ SDL_Surface* nebu_surfaceFromNebulaeMap(float* map, const int w, const int h) { uint32_t* pix; double c; + /* The good surface. */ sur = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, RGBAMASK); pix = sur->pixels; diff --git a/src/nebulae.h b/src/nebulae.h index 65256ef..c752db4 100644 --- a/src/nebulae.h +++ b/src/nebulae.h @@ -5,7 +5,7 @@ void nebu_init(void); void nebu_exit(void); /* Render. */ -void nebu_render(void); +void nebu_render(const double dt); void nebu_renderOverlay(const double dt); void nebu_renderPuffs(const double dt, int below_player); diff --git a/src/player.c b/src/player.c index 71bb44d..2f2ac9b 100644 --- a/src/player.c +++ b/src/player.c @@ -567,6 +567,12 @@ void player_renderBG(void) { /* Render the player. */ void player_render(void) { + if((player != NULL) && !player_isFlag(PLAYER_CREATING)) + pilot_render(player); +} + +/* Render the player's GUI. */ +void player_renderGUI(void) { int i, j; double x, y; char str[10]; @@ -585,9 +591,6 @@ void player_render(void) { menu_death(); } } - else if(!player_isFlag(PLAYER_CREATING)) - pilot_render(player); - /* Fancy cinematic scene borders. */ spfx_cinematic(); @@ -619,8 +622,6 @@ void player_render(void) { x -= p->ship->gfx_space->sw * PILOT_SIZE_APROX; gl_blitSprite(gui.gfx_targetPilot, x, y, 0, 1, c); /* Bottom left. */ } - /* Render the player. */ - pilot_render(player); /* Lockon warning. */ if(player->lockons > 0) diff --git a/src/player.h b/src/player.h index 0152832..7aaf817 100644 --- a/src/player.h +++ b/src/player.h @@ -40,7 +40,8 @@ int gui_load(const char* name); int gui_init(void); void gui_free(void); void player_render(void); -void player_renderBG(void); /* Render BG layer. */ +void player_renderBG(void); /* Render BG layer. */ +void player_renderGUI(void); /* Render the GUI stuff. */ /* Misc. */ void player_message(const char* fmt, ...); diff --git a/src/space.c b/src/space.c index f1fba39..96bbace 100644 --- a/src/space.c +++ b/src/space.c @@ -809,7 +809,7 @@ void space_render(const double dt) { if(cur_system == NULL) return; if(cur_system->nebu_density > 0.) - nebu_render(); + nebu_render(dt); else space_renderStars(dt); }