[Fix] Nebulae is now fully working.
This commit is contained in:
parent
cd158e5102
commit
06fec494a5
@ -264,7 +264,7 @@ void conf_parseCLI(int argc, char** argv) {
|
|||||||
sound_volume(atof(optarg));
|
sound_volume(atof(optarg));
|
||||||
break;
|
break;
|
||||||
case 'G':
|
case 'G':
|
||||||
nebu_generate(SCREEN_W, SCREEN_H);
|
nebu_forceGenerate();
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
/* By now it has already displayed the version. */
|
/* By now it has already displayed the version. */
|
||||||
|
@ -5,29 +5,24 @@
|
|||||||
|
|
||||||
#include "lephisto.h"
|
#include "lephisto.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "opengl.h"
|
||||||
#include "lfile.h"
|
#include "lfile.h"
|
||||||
#include "perlin.h"
|
#include "perlin.h"
|
||||||
|
|
||||||
/* -- CUSTOM NEBULAE FORMAT. --
|
#define NEBULAE_Z 16 /* Z plane. */
|
||||||
* Header (16 byte string).
|
|
||||||
* Dimesnions (4 byte w and 4 byte h).
|
|
||||||
* Body (1 byte per pixel).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define NEBU_FORMAT_HEADER 16 /* Size of header. */
|
|
||||||
#define NEBU_VERSION "1" /* Will be used for version checking. */
|
|
||||||
|
|
||||||
#define NEBULAE_Z 32 /* Z plane. */
|
|
||||||
#define NEBULAE_PATH "gen/nebu_%02d.png"
|
#define NEBULAE_PATH "gen/nebu_%02d.png"
|
||||||
|
|
||||||
/* The nebulae textures. */
|
/* The nebulae textures. */
|
||||||
static GLuint nebu_textures[NEBULAE_Z];
|
static GLuint nebu_textures[NEBULAE_Z];
|
||||||
static int nebu_w, nebu_h, nebu_pw, nebu_ph;
|
static int nebu_w = 0;
|
||||||
|
static int nebu_h = 0;
|
||||||
|
static int nebu_pw, nebu_ph;
|
||||||
|
|
||||||
static int nebu_checkCompat(const char* file);
|
static int nebu_checkCompat(const char* file);
|
||||||
static void saveNebulae(float* map, const uint32_t w, const uint32_t h,
|
static void saveNebulae(float* map, const uint32_t w, const uint32_t h,
|
||||||
const char* file);
|
const char* file);
|
||||||
static SDL_Surface* loadNebulae(const char* file);
|
static SDL_Surface* loadNebulae(const char* file);
|
||||||
|
static void nebu_generate(void);
|
||||||
|
|
||||||
/* Initialize the nebulae. */
|
/* Initialize the nebulae. */
|
||||||
void nebu_init(void) {
|
void nebu_init(void) {
|
||||||
@ -35,6 +30,10 @@ void nebu_init(void) {
|
|||||||
char nebu_file[PATH_MAX];
|
char nebu_file[PATH_MAX];
|
||||||
SDL_Surface* nebu_sur;
|
SDL_Surface* nebu_sur;
|
||||||
|
|
||||||
|
/* Special code to regenerate the nebulae. */
|
||||||
|
if((nebu_w == -9) && (nebu_h == -9))
|
||||||
|
nebu_generate();
|
||||||
|
|
||||||
/* Set expected sizes. */
|
/* Set expected sizes. */
|
||||||
nebu_w = SCREEN_W;
|
nebu_w = SCREEN_W;
|
||||||
nebu_h = SCREEN_H;
|
nebu_h = SCREEN_H;
|
||||||
@ -50,7 +49,7 @@ void nebu_init(void) {
|
|||||||
LOG("No nebulae found, generating (this may take a while).");
|
LOG("No nebulae found, generating (this may take a while).");
|
||||||
|
|
||||||
/* So we generate and reload. */
|
/* So we generate and reload. */
|
||||||
nebu_generate(nebu_w, nebu_h);
|
nebu_generate();
|
||||||
nebu_init();
|
nebu_init();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -104,8 +103,8 @@ void nebu_render(void) {
|
|||||||
tx = 0.;
|
tx = 0.;
|
||||||
ty = 0.;
|
ty = 0.;
|
||||||
|
|
||||||
tw = nebu_w / nebu_pw;
|
tw = (double)nebu_w / (double)nebu_pw;
|
||||||
th = nebu_h / nebu_ph;
|
th = (double)nebu_h / (double)nebu_ph;
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
/*glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);*/
|
/*glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);*/
|
||||||
@ -131,13 +130,22 @@ void nebu_render(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Force generation of new nebulae. */
|
/* Force generation of new nebulae. */
|
||||||
void nebu_generate(const int w, const int h) {
|
void nebu_forceGenerate(void) {
|
||||||
|
nebu_w = nebu_h = -9;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Generate the nebulae. */
|
||||||
|
static void nebu_generate(void) {
|
||||||
int i;
|
int i;
|
||||||
float* nebu;
|
float* nebu;
|
||||||
char nebu_file[PATH_MAX];
|
char nebu_file[PATH_MAX];
|
||||||
|
int w, h;
|
||||||
|
|
||||||
|
w = SCREEN_W;
|
||||||
|
h = SCREEN_H;
|
||||||
|
|
||||||
/* Generate all the nebulae. */
|
/* Generate all the nebulae. */
|
||||||
nebu = noise_genNebulaeMap(w, h, NEBULAE_Z, 15.);
|
nebu = noise_genNebulaeMap(w, h, NEBULAE_Z, 5.);
|
||||||
lfile_dirMakeExist("gen");
|
lfile_dirMakeExist("gen");
|
||||||
|
|
||||||
/* Save each nebulae as an image. */
|
/* Save each nebulae as an image. */
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "opengl.h"
|
|
||||||
|
|
||||||
/* Try to find nebulae to load, or generate if there isn't any. */
|
/* Try to find nebulae to load, or generate if there isn't any. */
|
||||||
void nebu_init(void);
|
void nebu_init(void);
|
||||||
@ -7,5 +6,6 @@ void nebu_init(void);
|
|||||||
void nebu_exit(void);
|
void nebu_exit(void);
|
||||||
|
|
||||||
void nebu_render(void);
|
void nebu_render(void);
|
||||||
void nebu_generate(const int w, const int h);
|
|
||||||
|
void nebu_forceGenerate(void);
|
||||||
|
|
||||||
|
23
src/perlin.c
23
src/perlin.c
@ -160,7 +160,7 @@ static float noise_turbulence(perlin_data_t* noise, float* f, float octaves) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void noise_delete(perlin_data_t* noise) {
|
void noise_delete(perlin_data_t* noise) {
|
||||||
free((perlin_data_t*)noise);
|
free(noise);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate a 3d nebulae map of dimensions w,h,n with ruggedness rig. */
|
/* Generate a 3d nebulae map of dimensions w,h,n with ruggedness rig. */
|
||||||
@ -173,12 +173,15 @@ float* noise_genNebulaeMap(const int w, const int h, const int n, float rug) {
|
|||||||
perlin_data_t* noise;
|
perlin_data_t* noise;
|
||||||
float* nebulae;;
|
float* nebulae;;
|
||||||
float value;
|
float value;
|
||||||
|
float zoom;
|
||||||
|
float max;
|
||||||
unsigned int* t, s;
|
unsigned int* t, s;
|
||||||
|
|
||||||
/* Pretty default values. */
|
/* Pretty default values. */
|
||||||
octaves = 3;
|
octaves = 3;
|
||||||
hurst = NOISE_DEFAULT_HURST;
|
hurst = NOISE_DEFAULT_HURST;
|
||||||
lacunarity = NOISE_DEFAULT_LACUNARITY;
|
lacunarity = NOISE_DEFAULT_LACUNARITY;
|
||||||
|
zoom = rug * ((float)h/768.)*((float)w/1024.);
|
||||||
|
|
||||||
/* Create noiuse and data. */
|
/* Create noiuse and data. */
|
||||||
noise = noise_new(hurst, lacunarity);
|
noise = noise_new(hurst, lacunarity);
|
||||||
@ -195,20 +198,21 @@ float* noise_genNebulaeMap(const int w, const int h, const int n, float rug) {
|
|||||||
DEBUG("Generating Nebulae of size %dx%dx%d", w, h, n);
|
DEBUG("Generating Nebulae of size %dx%dx%d", w, h, n);
|
||||||
|
|
||||||
/* Start to create the nebulae. */
|
/* Start to create the nebulae. */
|
||||||
|
max = 0.;
|
||||||
f[2] = 0.;
|
f[2] = 0.;
|
||||||
for(z = 0; z < n; z++) {
|
for(z = 0; z < n; z++) {
|
||||||
for(y = 0; y < h; y++) {
|
for(y = 0; y < h; y++) {
|
||||||
|
|
||||||
f[1] = rug * (float)y / (float)h;
|
f[1] = zoom * (float)y / (float)h;
|
||||||
|
|
||||||
for(x = 0; x < w; x++) {
|
for(x = 0; x < w; x++) {
|
||||||
|
|
||||||
f[0] = rug * (float)x / (float)w;
|
f[0] = zoom * (float)x / (float)w;
|
||||||
|
|
||||||
value = noise_turbulence(noise, f, octaves);
|
value = noise_turbulence(noise, f, octaves);
|
||||||
|
if(max < value) max = value;
|
||||||
|
|
||||||
value = value + 0.3;
|
nebulae[z*w*h + y*w+x] = value;
|
||||||
nebulae[z*w*h + y*w+x] = (value < 1.) ? value : 1.;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f[2] += 0.01;
|
f[2] += 0.01;
|
||||||
@ -219,6 +223,13 @@ float* noise_genNebulaeMap(const int w, const int h, const int n, float rug) {
|
|||||||
(z>0) ? t[z] - t[z-1] : t[z] - s);
|
(z>0) ? t[z] - t[z-1] : t[z] - s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Post filtering. */
|
||||||
|
value = 1. - max;
|
||||||
|
for(z = 0; x < n; z++)
|
||||||
|
for(y = 0; y < h; y++)
|
||||||
|
for(x = 0; x < w; x++)
|
||||||
|
nebulae[z*w*h + y*w + x] += value;
|
||||||
|
|
||||||
/* Cleanup. */
|
/* Cleanup. */
|
||||||
noise_delete(noise);
|
noise_delete(noise);
|
||||||
|
|
||||||
@ -241,7 +252,7 @@ SDL_Surface* noise_surfaceFromNebulaeMap(float* map, const int w, const int h) {
|
|||||||
SDL_LockSurface(sur);
|
SDL_LockSurface(sur);
|
||||||
for(i = 0; i < h*w; i++) {
|
for(i = 0; i < h*w; i++) {
|
||||||
c = map[i];
|
c = map[i];
|
||||||
pix[i] = RMASK + BMASK + GMASK + (AMASK & (uint32_t)(AMASK*c));
|
pix[i] = RMASK + BMASK + GMASK + (AMASK & (uint32_t)((double)AMASK*c));
|
||||||
}
|
}
|
||||||
SDL_UnlockSurface(sur);
|
SDL_UnlockSurface(sur);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user