paysages: Improved CLI and double serialization.
git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@272 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
parent
fabcec1cfd
commit
58605687e2
3 changed files with 92 additions and 4 deletions
1
TODO
1
TODO
|
@ -1,4 +1,3 @@
|
||||||
- ColorGradation dialog.
|
|
||||||
- All noises should use the same entropy pool (saved separately), and avoid reallocs.
|
- All noises should use the same entropy pool (saved separately), and avoid reallocs.
|
||||||
- Implement scaling and scrolling on previews.
|
- Implement scaling and scrolling on previews.
|
||||||
- Water and terrain LOD moves with the camera, fix it like in the wanderer.
|
- Water and terrain LOD moves with the camera, fix it like in the wanderer.
|
||||||
|
|
24
cli/main.c
24
cli/main.c
|
@ -18,7 +18,16 @@ void startRender(Renderer* renderer, char* outputpath, int width, int height, in
|
||||||
|
|
||||||
void displayHelp()
|
void displayHelp()
|
||||||
{
|
{
|
||||||
printf("Usage : TODO\n");
|
printf("Usage : paysages-cli [options]\n");
|
||||||
|
printf("Options :\n");
|
||||||
|
printf(" -h Show this help\n");
|
||||||
|
printf(" -f x Saved file to load (str)\n");
|
||||||
|
printf(" -n Number of pictures in the sequence\n");
|
||||||
|
printf(" -rw x Render width (int)\n");
|
||||||
|
printf(" -rh x Render height (int)\n");
|
||||||
|
printf(" -rq x Render quality (int, 1 to 10)\n");
|
||||||
|
printf(" -di x Day start time (float, 0.0 to 1.0)\n");
|
||||||
|
printf(" -ds x Day step time (float)\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void _previewUpdate(double progress)
|
void _previewUpdate(double progress)
|
||||||
|
@ -30,6 +39,7 @@ void _previewUpdate(double progress)
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
Renderer renderer;
|
Renderer renderer;
|
||||||
|
char* conf_file_path = NULL;
|
||||||
int conf_render_width = 800;
|
int conf_render_width = 800;
|
||||||
int conf_render_height = 600;
|
int conf_render_height = 600;
|
||||||
int conf_render_quality = 5;
|
int conf_render_quality = 5;
|
||||||
|
@ -49,6 +59,13 @@ int main(int argc, char** argv)
|
||||||
displayHelp();
|
displayHelp();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
else if (strcmp(*argv, "-f") == 0 || strcmp(*argv, "--file") == 0)
|
||||||
|
{
|
||||||
|
if (argc--)
|
||||||
|
{
|
||||||
|
conf_file_path = *(++argv);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (strcmp(*argv, "-n") == 0 || strcmp(*argv, "--count") == 0)
|
else if (strcmp(*argv, "-n") == 0 || strcmp(*argv, "--count") == 0)
|
||||||
{
|
{
|
||||||
if (argc--)
|
if (argc--)
|
||||||
|
@ -98,6 +115,11 @@ int main(int argc, char** argv)
|
||||||
printf("Initializing ...\n");
|
printf("Initializing ...\n");
|
||||||
paysagesInit();
|
paysagesInit();
|
||||||
|
|
||||||
|
if (conf_file_path)
|
||||||
|
{
|
||||||
|
paysagesLoad(conf_file_path);
|
||||||
|
}
|
||||||
|
|
||||||
renderer = sceneryCreateStandardRenderer();
|
renderer = sceneryCreateStandardRenderer();
|
||||||
rendererSetPreviewCallbacks(&renderer, NULL, NULL, _previewUpdate);
|
rendererSetPreviewCallbacks(&renderer, NULL, NULL, _previewUpdate);
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,71 @@
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
#include "euclid.h"
|
#include "euclid.h"
|
||||||
|
|
||||||
|
#define pack754_32(f) (pack754((f), 32, 8))
|
||||||
|
#define pack754_64(f) (pack754((f), 64, 11))
|
||||||
|
#define unpack754_32(i) (unpack754((i), 32, 8))
|
||||||
|
#define unpack754_64(i) (unpack754((i), 64, 11))
|
||||||
|
|
||||||
|
static uint64_t pack754(double f, unsigned bits, unsigned expbits)
|
||||||
|
{
|
||||||
|
double fnorm;
|
||||||
|
int shift;
|
||||||
|
long long sign, exp, significand;
|
||||||
|
unsigned significandbits = bits - expbits - 1; // -1 for sign bit
|
||||||
|
|
||||||
|
if (f == 0.0) return 0; // get this special case out of the way
|
||||||
|
|
||||||
|
// check sign and begin normalization
|
||||||
|
if (f < 0) { sign = 1; fnorm = -f; }
|
||||||
|
else { sign = 0; fnorm = f; }
|
||||||
|
|
||||||
|
// get the normalized form of f and track the exponent
|
||||||
|
shift = 0;
|
||||||
|
while(fnorm >= 2.0) { fnorm /= 2.0; shift++; }
|
||||||
|
while(fnorm < 1.0) { fnorm *= 2.0; shift--; }
|
||||||
|
fnorm = fnorm - 1.0;
|
||||||
|
|
||||||
|
// calculate the binary form (non-float) of the significand data
|
||||||
|
significand = fnorm * ((1LL<<significandbits) + 0.5f);
|
||||||
|
|
||||||
|
// get the biased exponent
|
||||||
|
exp = shift + ((1<<(expbits-1)) - 1); // shift + bias
|
||||||
|
|
||||||
|
// return the final answer
|
||||||
|
return (sign<<(bits-1)) | (exp<<(bits-expbits-1)) | significand;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double unpack754(uint64_t i, unsigned bits, unsigned expbits)
|
||||||
|
{
|
||||||
|
double result;
|
||||||
|
long long shift;
|
||||||
|
unsigned bias;
|
||||||
|
unsigned significandbits = bits - expbits - 1; // -1 for sign bit
|
||||||
|
|
||||||
|
if (i == 0) return 0.0;
|
||||||
|
|
||||||
|
// pull the significand
|
||||||
|
result = (i&((1LL<<significandbits)-1)); // mask
|
||||||
|
result /= (1LL<<significandbits); // convert back to float
|
||||||
|
result += 1.0f; // add the one back on
|
||||||
|
|
||||||
|
// deal with the exponent
|
||||||
|
bias = (1<<(expbits-1)) - 1;
|
||||||
|
shift = ((i>>significandbits)&((1LL<<expbits)-1)) - bias;
|
||||||
|
while(shift > 0) { result *= 2.0; shift--; }
|
||||||
|
while(shift < 0) { result /= 2.0; shift++; }
|
||||||
|
|
||||||
|
// sign it
|
||||||
|
result *= (i>>(bits-1))&1? -1.0: 1.0;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
double toolsRandom()
|
double toolsRandom()
|
||||||
{
|
{
|
||||||
return (double)rand() / (double)RAND_MAX;
|
return (double)rand() / (double)RAND_MAX;
|
||||||
|
@ -60,15 +121,21 @@ Vector3 toolsGetNormalFromTriangle(Vector3 center, Vector3 bottom, Vector3 right
|
||||||
|
|
||||||
void toolsSaveDouble(FILE* f, double* value)
|
void toolsSaveDouble(FILE* f, double* value)
|
||||||
{
|
{
|
||||||
fprintf(f, "%.20le;", *value);
|
uint64_t servalue;
|
||||||
|
|
||||||
|
servalue = pack754_64(*value);
|
||||||
|
fwrite(&servalue, sizeof(uint64_t), 1, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void toolsLoadDouble(FILE* f, double* value)
|
void toolsLoadDouble(FILE* f, double* value)
|
||||||
{
|
{
|
||||||
int read;
|
int read;
|
||||||
|
uint64_t servalue;
|
||||||
|
|
||||||
read = fscanf(f, "%le;", value);
|
read = fread(&servalue, sizeof(uint64_t), 1, f);
|
||||||
assert(read == 1);
|
assert(read == 1);
|
||||||
|
|
||||||
|
*value = unpack754_64(servalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
void toolsSaveInt(FILE* f, int* value)
|
void toolsSaveInt(FILE* f, int* value)
|
||||||
|
|
Loading…
Reference in a new issue