diff --git a/src/nebulae.c b/src/nebulae.c index e2e42b4..a00533f 100644 --- a/src/nebulae.c +++ b/src/nebulae.c @@ -33,8 +33,9 @@ static void saveNebulae(float* map, const uint32_t w, const uint32_t h, const char* file); static unsigned char* loadNebulae(const char* file, int* w, int* h); +/* Initialize the nebulae. */ void nebu_init(void) { - int i; + int i, y; char nebu_file[PATH_MAX]; unsigned char* nebu_padded; int w, h; @@ -64,7 +65,14 @@ void nebu_init(void) { /* Load the file. */ nebu_data = loadNebulae(nebu_file, &w, &h); - memcpy(nebu_padded, nebu_data, w*h); + for(y = 0; y < nebu_h; y++) { /* Copy lines over. */ + /* nebu_padded = [ nebu_data 0000000000000 ] */ + memmove(&nebu_padded[y*nebu_pw], &nebu_data[y*nebu_w], nebu_w); + memset(&nebu_padded[y*nebu_pw+nebu_w], 0, nebu_pw-nebu_w); /* Pad the end. */ + } + /* End it with 0's. */ + memset(&nebu_padded[nebu_h*nebu_pw+nebu_w], 0, + nebu_ph*nebu_w - nebu_h*nebu_pw); /* Load the textures. */ glBindTexture(GL_TEXTURE_2D, nebu_textures[i]); @@ -77,6 +85,8 @@ void nebu_init(void) { free(nebu_data); /* No longer need the data. */ } free(nebu_padded); + + DEBUG("Loaded %d Nebulae Layers", NEBULAE_Z); } /* Clean up the nebu subsystem. */ @@ -84,6 +94,39 @@ void nebu_exit(void) { glDeleteTextures(NEBULAE_Z, nebu_textures); } +/* Render the nebulae. */ +void nebu_render(void) { + int n; + double tw, th; + + n = 0; + + tw = nebu_w / nebu_pw; + th = nebu_h / nebu_ph; + + glEnable(GL_TEXTURE_2D); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glBindTexture(GL_TEXTURE_2D, nebu_textures[n]); + glColor4d(1., 1., 1., 1.); + glBegin(GL_QUADS); + glTexCoord2d(0., 0.); + glVertex2d(-SCREEN_W/2., -SCREEN_H/2.); + + glTexCoord2d(tw, th); + glVertex2d(SCREEN_W/2., -SCREEN_H/2.); + + glTexCoord2d(tw, th); + glVertex2d(SCREEN_W/2., SCREEN_H/2.); + + glTexCoord2d(0., th); + glVertex2d(-SCREEN_W/2., SCREEN_H/2.); + glEnd(); + glDisable(GL_TEXTURE_2D); + + /* Did anything fail? */ + gl_checkErr(); +} + /* Force generation of new nebulae. */ void nebu_generate(const int w, const int h) { int i; @@ -130,8 +173,9 @@ static void saveNebulae(float* map, const uint32_t w, const uint32_t h, snprintf(buf, NEBU_FORMAT_HEADER, "LEPHISTO NEBU v" NEBU_VERSION); cur = 16; memcpy(&buf[cur], &w, 4); + cur += 4; memcpy(&buf[cur], &h, 4); - cur += 8; + cur += 4; /* The Body. */ for(y = 0; y < (int)h; y++) @@ -178,8 +222,9 @@ static unsigned char* loadNebulae(const char* file, int* w, int* h) { } int fd; + int cur; snprintf(file_path, PATH_MAX, "%s%s", lfile_basePath(), file); - fd = open(file, O_RDONLY); + fd = open(file_path, O_RDONLY); if(fd < 0) { ERR("Unable to open file %s: %s", file_path, strerror(errno)); return NULL; @@ -188,7 +233,9 @@ static unsigned char* loadNebulae(const char* file, int* w, int* h) { READ(&tw, 4); READ(&th, 4); buf = malloc(tw*th); - READ(buf, tw*th); + cur = 0; + while((len = read(fd, &buf[cur], tw*th - cur)) != 0) + cur += len; #else #error "Needs implementation." #endif diff --git a/src/nebulae.h b/src/nebulae.h index f992062..508560d 100644 --- a/src/nebulae.h +++ b/src/nebulae.h @@ -6,5 +6,6 @@ void nebu_init(void); void nebu_exit(void); +void nebu_render(void); void nebu_generate(const int w, const int h);