paysages : Factorizing noise random pool, avoiding reallocs.

git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@274 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
Michaël Lemaire 2012-02-27 15:42:23 +00:00 committed by ThunderK
parent 418fe54b26
commit d3cf3912e7
2 changed files with 9 additions and 10 deletions

1
TODO
View file

@ -1,4 +1,3 @@
- All noises should use the same entropy pool (saved separately), and avoid reallocs.
- Implement scaling and scrolling on previews.
- Water and terrain LOD moves with the camera, fix it like in the wanderer.
- Restore render progress.

View file

@ -6,6 +6,8 @@
#include "tools.h"
#define MAX_LEVEL_COUNT 30
struct NoiseLevel;
struct NoiseGenerator
@ -15,7 +17,7 @@ struct NoiseGenerator
int size3;
double height_offset;
int level_count;
struct NoiseLevel* levels;
struct NoiseLevel levels[MAX_LEVEL_COUNT];
};
static int _noise_pool_size;
@ -77,7 +79,6 @@ NoiseGenerator* noiseCreateGenerator()
result->size2 = 1;
result->size3 = 1;
result->level_count = 0;
result->levels = malloc(sizeof(NoiseLevel));
result->height_offset = 0.0;
return result;
@ -85,7 +86,6 @@ NoiseGenerator* noiseCreateGenerator()
void noiseDeleteGenerator(NoiseGenerator* generator)
{
free(generator->levels);
free(generator);
}
@ -121,7 +121,6 @@ void noiseLoadGenerator(FILE* f, NoiseGenerator* perlin)
toolsLoadDouble(f, &perlin->height_offset);
toolsLoadInt(f, &perlin->level_count);
perlin->levels = realloc(perlin->levels, sizeof(NoiseLevel) * perlin->level_count);
for (x = 0; x < perlin->level_count; x++)
{
NoiseLevel* level = perlin->levels + x;
@ -142,14 +141,13 @@ void noiseCopy(NoiseGenerator* source, NoiseGenerator* destination)
destination->height_offset = source->height_offset;
destination->level_count = source->level_count;
destination->levels = realloc(destination->levels, sizeof(NoiseLevel) * destination->level_count);
memcpy(destination->levels, source->levels, sizeof(NoiseLevel) * destination->level_count);
}
void noiseGenerateBaseNoise(NoiseGenerator* generator, int size)
{
size = (size < 1) ? 1 : size;
size = (size > 4000000) ? 4000000 : size;
size = (size > _noise_pool_size) ? _noise_pool_size : size;
generator->size1 = size;
generator->size2 = (int)floor(sqrt((float)size));
@ -186,9 +184,11 @@ void noiseClearLevels(NoiseGenerator* generator)
void noiseAddLevel(NoiseGenerator* generator, NoiseLevel level)
{
generator->levels = realloc(generator->levels, sizeof(NoiseLevel) * (generator->level_count + 1));
generator->levels[generator->level_count] = level;
generator->level_count++;
if (generator->level_count < MAX_LEVEL_COUNT)
{
generator->levels[generator->level_count] = level;
generator->level_count++;
}
}
void noiseAddLevelSimple(NoiseGenerator* generator, double scaling, double height)