commit c32d4b820c39773314cff2d347fa9d80836b72ed
parent 5765dab7fefe1381761cfbd8f25f285bb84221c0
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 1 Feb 2017 16:51:33 +0100
Keep in degrees the parsed fov/sun_dir arguments
Diffstat:
4 files changed, 62 insertions(+), 62 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -65,7 +65,7 @@ set(SOLSTICE_ARGS_DEFAULT_NREALISATIONS "10000")
set(SOLSTICE_ARGS_DEFAULT_CAMERA_POS "0,0,0")
set(SOLSTICE_ARGS_DEFAULT_CAMERA_TGT "0,0,-1")
set(SOLSTICE_ARGS_DEFAULT_CAMERA_UP "0,1,0")
-set(SOLSTICE_ARGS_DEFAULT_CAMERA_FOV "1.22173047639603070383") # In radians
+set(SOLSTICE_ARGS_DEFAULT_CAMERA_FOV "70") # In degrees
set(SOLSTICE_ARGS_DEFAULT_IMG_WIDTH "800")
set(SOLSTICE_ARGS_DEFAULT_IMG_HEIGHT "600")
diff --git a/src/solstice.c b/src/solstice.c
@@ -88,11 +88,10 @@ setup_camera(struct solstice* solstice, const struct solstice_args* args)
goto error;
}
- res = ssol_camera_set_fov(cam, args->camera.fov_x);
+ res = ssol_camera_set_fov(cam, MDEG2RAD(args->camera.fov_x));
if(res != RES_OK) {
- fprintf(stderr,
- "Invalid horizontal field of view '%g degrees' (%g radians).\n",
- MRAD2DEG(args->camera.fov_x), args->camera.fov_x);
+ fprintf(stderr, "Invalid horizontal field of view '%g' degrees.\n",
+ args->camera.fov_x);
goto error;
}
@@ -163,12 +162,17 @@ spherical_to_cartesian_sun_dir
double sin_azimuth;
double cos_elevation;
double sin_elevation;
+ double azimuth;
+ double elevation;
ASSERT(spherical && sun_dir);
- cos_azimuth = cos(spherical->azimuth);
- sin_azimuth = sin(spherical->azimuth);
- cos_elevation = cos(spherical->elevation);
- sin_elevation = sin(spherical->elevation);
+ azimuth = MDEG2RAD(spherical->azimuth);
+ elevation = MDEG2RAD(spherical->elevation);
+
+ cos_azimuth = cos(azimuth);
+ sin_azimuth = sin(azimuth);
+ cos_elevation = cos(elevation);
+ sin_elevation = sin(elevation);
sun_dir[0] = -(cos_elevation * cos_azimuth);
sun_dir[1] = -(cos_elevation * sin_azimuth);
diff --git a/src/solstice_args.c b/src/solstice_args.c
@@ -86,43 +86,18 @@ parse_fov(const char* str, double* out_fov)
fprintf(stderr, "The field of view %g is not in [30, 120].\n", fov);
return RES_BAD_ARG;
}
- *out_fov = MDEG2RAD(fov);
+ *out_fov = fov;
return RES_OK;
}
static res_T
-parse_doubleN(const char* str, double dbl[], const size_t N)
-{
- char buf[64];
- char* tk;
- char* ctx;
- size_t i;
- res_T res = RES_OK;
- ASSERT(str && dbl);
-
- if(strlen(str) >= sizeof(buf) - 1/*NULL char*/) {
- fprintf(stderr,
- "Could not duplicate the string `%s'.\n", str);
- return RES_MEM_ERR;
- }
- strncpy(buf, str, sizeof(buf));
-
- FOR_EACH(i, 0, N) {
- tk = strtok_r(i == 0 ? buf : NULL, i == N-1 ? "" : ",", &ctx);
- res = cstr_to_double(tk, dbl+i);
- if(res != RES_OK) return res;
- }
-
- return RES_OK;
-}
-
-static res_T
parse_sun_dir_list(const char* str, struct solstice_args* args)
{
char buf[512];
char* tk;
char* ctx;
+ size_t len;
res_T res = RES_OK;
ASSERT(str && args);
@@ -139,7 +114,8 @@ parse_sun_dir_list(const char* str, struct solstice_args* args)
struct solstice_args_spherical spherical;
double tmp[2];
- res = parse_doubleN(tk, tmp, 2);
+ res = cstr_to_list_double(tk, ',', tmp, &len, 2);
+ if(res == RES_OK && len != 2) res = RES_BAD_ARG;
if(res != RES_OK) {
fprintf(stderr, "Invalid sun direction `%s'.\n", tk);
goto error;
@@ -160,8 +136,8 @@ parse_sun_dir_list(const char* str, struct solstice_args* args)
goto error;
}
- spherical.azimuth = MDEG2RAD(tmp[0]);
- spherical.elevation = MDEG2RAD(tmp[1]);
+ spherical.azimuth = tmp[0];
+ spherical.elevation = tmp[1];
sa_push(args->sun_dirs, spherical);
tk = strtok_r(NULL, ":", &ctx);
@@ -223,6 +199,7 @@ parse_rendering_option(const char* str, struct solstice_args* args)
char* key;
char* val;
char* ctx;
+ size_t len;
res_T res;
ASSERT(str && args);
@@ -244,19 +221,22 @@ parse_rendering_option(const char* str, struct solstice_args* args)
res = parse_image_definition(val, &args->img.width, &args->img.height);
if(res != RES_OK) goto error;
} else if(!strcmp(key, "pos")) {
- res = parse_doubleN(val, args->camera.pos, 3);
- if(res != RES_OK) {
+ res = cstr_to_list_double(val, ',', args->camera.pos, &len, 3);
+ if(res == RES_OK && len != 3) res = RES_BAD_ARG;
+ if(res != RES_OK ) {
fprintf(stderr, "Invalid camera position `%s'.\n", val);
goto error;
}
} else if(!strcmp(key, "tgt")) {
- res = parse_doubleN(val, args->camera.tgt, 3);
+ res = cstr_to_list_double(val, ',', args->camera.tgt, &len, 3);
+ if(res == RES_OK && len != 3) res = RES_BAD_ARG;
if(res != RES_OK) {
fprintf(stderr, "Invalid camera target `%s'.\n", val);
goto error;
}
} else if(!strcmp(key, "up")) {
- res = parse_doubleN(val, args->camera.up, 3);
+ res = cstr_to_list_double(val, ',', args->camera.up, &len, 3);
+ if(res == RES_OK && len != 3) res = RES_BAD_ARG;
if(res != RES_OK) {
fprintf(stderr, "Invalid camera up vector `%s'.\n", val);
goto error;
@@ -316,7 +296,6 @@ error:
res_T
solstice_args_init(struct solstice_args* args, const int argc, char** argv)
{
- unsigned long ul = 0;
int opt;
res_T res = RES_OK;
ASSERT(args && argc && argv);
@@ -344,12 +323,8 @@ solstice_args_init(struct solstice_args* args, const int argc, char** argv)
case 'R': args->receivers_filename = optarg; break;
case 'r': res = parse_rendering_options(optarg, args); break;
case 't':
- res = cstr_to_ulong(optarg, &ul);
- if(res == RES_OK && !ul) {
- res = RES_BAD_ARG;
- } else {
- args->nthreads = (unsigned)MMIN(ul, UINT_MAX);
- }
+ res = cstr_to_uint(optarg, &args->nthreads);
+ if(res == RES_OK && !args->nthreads) res = RES_BAD_ARG;
break;
default: res = RES_BAD_ARG; break;
}
diff --git a/src/test_solstice_args.c b/src/test_solstice_args.c
@@ -96,7 +96,7 @@ test_rendering(void)
CHECK(args.img.width, 640);
CHECK(args.img.height, 480);
CHECK(args.quiet, 1);
- CHECK(eq_eps(args.camera.fov_x, MDEG2RAD(70), 1.e-6), 1);
+ CHECK(eq_eps(args.camera.fov_x, 70, 1.e-6), 1);
CHECK(args.output_filename, NULL);
solstice_args_release(&args);
cmd_delete(cmd);
@@ -169,29 +169,29 @@ test_sun_dirs(void)
CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK);
CHECK(args.nsun_dirs, 1);
CHECK(args.sun_dirs[0].azimuth, 0);
- CHECK(eq_eps(args.sun_dirs[0].elevation, MDEG2RAD(1), 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[0].elevation, 1, 1.e-6), 1);
solstice_args_release(&args);
cmd_delete(cmd);
cmd = cmd_create(0, "test", "-D", "1.2,3.4:3.14,0.123:", RES_OK);
CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK);
CHECK(args.nsun_dirs, 2);
- CHECK(eq_eps(args.sun_dirs[0].azimuth, MDEG2RAD(1.2), 1.e-6), 1);
- CHECK(eq_eps(args.sun_dirs[0].elevation, MDEG2RAD(3.4), 1.e-6), 1);
- CHECK(eq_eps(args.sun_dirs[1].azimuth, MDEG2RAD(3.14), 1.e-6), 1);
- CHECK(eq_eps(args.sun_dirs[1].elevation, MDEG2RAD(0.123), 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[0].azimuth, 1.2, 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[0].elevation, 3.4, 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[1].azimuth, 3.14, 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[1].elevation, 0.123, 1.e-6), 1);
solstice_args_release(&args);
cmd_delete(cmd);
cmd = cmd_create(0, "test", "-D", "1.2,3.4:3.14,0.123:2.01,23.1", RES_OK);
CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK);
CHECK(args.nsun_dirs, 3);
- CHECK(eq_eps(args.sun_dirs[0].azimuth, MDEG2RAD(1.2), 1.e-6), 1);
- CHECK(eq_eps(args.sun_dirs[0].elevation, MDEG2RAD(3.4), 1.e-6), 1);
- CHECK(eq_eps(args.sun_dirs[1].azimuth, MDEG2RAD(3.14), 1.e-6), 1);
- CHECK(eq_eps(args.sun_dirs[1].elevation, MDEG2RAD(0.123), 1.e-6), 1);
- CHECK(eq_eps(args.sun_dirs[2].azimuth, MDEG2RAD(2.01), 1.e-6), 1);
- CHECK(eq_eps(args.sun_dirs[2].elevation, MDEG2RAD(23.1), 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[0].azimuth, 1.2, 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[0].elevation, 3.4, 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[1].azimuth, 3.14, 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[1].elevation, 0.123, 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[2].azimuth, 2.01, 1.e-6), 1);
+ CHECK(eq_eps(args.sun_dirs[2].elevation, 23.1, 1.e-6), 1);
solstice_args_release(&args);
cmd_delete(cmd);
@@ -414,6 +414,26 @@ test_receivers(void)
cmd_delete(cmd);
}
+static void
+test_input(void)
+{
+ struct solstice_args args = SOLSTICE_ARGS_NULL;
+ char** cmd = NULL;
+
+ cmd = cmd_create(0, "test", "-D", "0,90", NULL);
+ CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK);
+ CHECK(args.input_filename, SOLSTICE_ARGS_DEFAULT.input_filename);
+ CHECK(args.input_filename, NULL);
+ solstice_args_release(&args);
+ cmd_delete(cmd);
+
+ cmd = cmd_create(0, "test", "-D", "0,90", "my_input", NULL);
+ CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK);
+ CHECK(strcmp(args.input_filename, "my_input"), 0);
+ solstice_args_release(&args);
+ cmd_delete(cmd);
+}
+
int
main(int argc, char** argv)
{
@@ -426,6 +446,7 @@ main(int argc, char** argv)
test_output();
test_quiet();
test_receivers();
+ test_input();
CHECK(mem_allocated_size(), 0);
return 0;
}