solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

commit 81b84a2d012892840aa5c9810ee07b1de38cf335
parent 3282dca54ced1757833e6a5dccb42c79f4ec1416
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  8 Mar 2017 17:14:49 +0100

Add and test the "rmode" rendering option

Define the rendering algorithm

Diffstat:
Mdoc/cli | 8+++++++-
Msrc/solstice.c | 9+++++++++
Msrc/solstice.h | 3++-
Msrc/solstice_args.c | 24++++++++++++++++++++++++
Msrc/solstice_args.h.in | 9+++++++++
Msrc/solstice_draw.c | 13+++++++++++--
Msrc/test_solstice_args.c | 17+++++++++++++++--
7 files changed, 77 insertions(+), 6 deletions(-)

diff --git a/doc/cli b/doc/cli @@ -37,7 +37,7 @@ solstice -g format=obj:split-group=1 <rendering-option>[:<rendering-option> ... ] <rendering-option> ::= - <fov> | <img> | <position> | <samples-per-pixel> | <target> | <up> + <fov> | <img> | <position> | <render-mode> | <samples-per-pixel> | <target> | <up> <dump> ::= format=<dump-format>[:split=<split-mode>] @@ -57,6 +57,12 @@ solstice -g format=obj:split-group=1 <position> ::= pos=<real3> +<render-mode> ::= + rmode=<render-algorithm> + +<render-algorithm> ::= + draft | pt # path tracing + <samples-per-pixel> ::= spp=<INTEGER> diff --git a/src/solstice.c b/src/solstice.c @@ -599,6 +599,7 @@ solstice_init if(res != RES_OK) goto error; res = setup_framebuffer(solstice, args); if(res != RES_OK) goto error; + solstice->render_mode = args->render_mode; solstice->spp = args->img.spp; } @@ -654,6 +655,14 @@ solstice_run(struct solstice* solstice) draw = solstice->framebuffer != NULL; if(!nsun_dirs) { + const double sun_dir[3] = {0, 0, -1}; + + res = ssol_sun_set_direction(solstice->sun, sun_dir); + if(res != RES_OK) { + fprintf(stderr, "Could not update the sun direction.\n"); + goto error; + } + if(dump) { res = solstice_dump(solstice); if(res != RES_OK) goto error; diff --git a/src/solstice.h b/src/solstice.h @@ -18,7 +18,7 @@ #include "parser/solparser_material.h" #include "receivers/srcvl.h" -#include "solstice_args.h" +#include "solstice_args.h" #include <rsys/dynamic_array_double.h> #include <rsys/hash_table.h> @@ -86,6 +86,7 @@ struct solstice { /* Rendering */ struct ssol_camera* camera; struct ssol_image* framebuffer; + enum solstice_args_render_mode render_mode; unsigned spp; /* #Samples per pixel */ /* Dump geometry */ diff --git a/src/solstice_args.c b/src/solstice_args.c @@ -200,6 +200,27 @@ parse_image_definition } static res_T +parse_render_mode(const char* str, enum solstice_args_render_mode* mode) +{ + res_T res = RES_OK; + ASSERT(str && mode); + + if(!strcmp(str, "draft")) { + *mode = SOLSTICE_ARGS_RENDER_DRAFT; + } else if(!strcmp(str, "pt")) { + *mode = SOLSTICE_ARGS_RENDER_PATH_TRACING; + } else { + fprintf(stderr, "Invalid render mode `%s'.\n", str); + res = RES_BAD_ARG; + goto error; + } +exit: + return res; +error: + goto exit; +} + +static res_T parse_rendering_option(const char* str, struct solstice_args* args) { char buf[128]; @@ -241,6 +262,9 @@ parse_rendering_option(const char* str, struct solstice_args* args) goto error; } args->camera.auto_look_at = 0; /* Disable auto look at */ + } else if(!strcmp(key, "rmode")) { /* Render mode */ + res = parse_render_mode(val, &args->render_mode); + if(res != RES_OK) goto error; } else if(!strcmp(key, "spp")) { /*# Samples per pixel */ res = cstr_to_uint(val, &args->img.spp); if(res == RES_OK && !args->img.spp) res = RES_BAD_ARG; diff --git a/src/solstice_args.h.in b/src/solstice_args.h.in @@ -35,6 +35,11 @@ enum solstice_args_dump_split_mode { SOLSTICE_ARGS_DUMP_SPLIT_OBJECT }; +enum solstice_args_render_mode { + SOLSTICE_ARGS_RENDER_DRAFT, + SOLSTICE_ARGS_RENDER_PATH_TRACING +}; + struct solstice_args { const char* output_filename; const char* input_filename; /* May be NULL <=> read data from stdin */ @@ -60,6 +65,8 @@ struct solstice_args { unsigned spp; /* Samples per pixel */ } img; + enum solstice_args_render_mode render_mode; + enum solstice_args_dump_format dump_format; enum solstice_args_dump_split_mode dump_split_mode; @@ -97,6 +104,8 @@ static const struct solstice_args SOLSTICE_ARGS_NULL = SOLSTICE_ARGS_NULL__; @SOLSTICE_ARGS_DEFAULT_IMG_SPP@ \ }, \ \ + SOLSTICE_ARGS_RENDER_DRAFT, /* Render mode */ \ + \ SOLSTICE_ARGS_DUMP_NONE, /* Dump format */ \ SOLSTICE_ARGS_DUMP_SPLIT_NONE, /* Dump split mode */ \ \ diff --git a/src/solstice_draw.c b/src/solstice_draw.c @@ -76,8 +76,17 @@ solstice_draw(struct solstice* solstice) goto error; } - res = ssol_draw_draft(solstice->scene, solstice->camera, layout.width, - layout.height, solstice->spp, ssol_image_write, solstice->framebuffer); + switch(solstice->render_mode) { + case SOLSTICE_ARGS_RENDER_DRAFT: + res = ssol_draw_draft(solstice->scene, solstice->camera, layout.width, + layout.height, solstice->spp, ssol_image_write, solstice->framebuffer); + break; + case SOLSTICE_ARGS_RENDER_PATH_TRACING: + res = ssol_draw_pt(solstice->scene, solstice->camera, layout.width, + layout.height, solstice->spp, ssol_image_write, solstice->framebuffer); + break; + default: FATAL("Unreachable code.\n"); + } if(res != RES_OK) { fprintf(stderr, "Rendering error\n"); goto error; diff --git a/src/test_solstice_args.c b/src/test_solstice_args.c @@ -91,6 +91,7 @@ test_rendering(void) CHECK(args.img.width, 1280); CHECK(args.img.height, 720); CHECK(args.img.spp, SOLSTICE_ARGS_DEFAULT.img.spp); + CHECK(args.render_mode, SOLSTICE_ARGS_DEFAULT.render_mode); CHECK(args.quiet, 0); CHECK(args.output_filename, NULL); solstice_args_release(&args); @@ -106,13 +107,14 @@ test_rendering(void) CHECK(args.img.width, 640); CHECK(args.img.height, 480); CHECK(args.img.spp, SOLSTICE_ARGS_DEFAULT.img.spp); + CHECK(args.render_mode, SOLSTICE_ARGS_DEFAULT.render_mode); CHECK(args.quiet, 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); - cmd = cmd_create(0, "test", "-r", "up=0,0,1:tgt=0,-10,0", NULL); + cmd = cmd_create(0, "test", "-r", "up=0,0,1:tgt=0,-10,0:rmode=draft", NULL); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); CHECK(args.nrealisations, SOLSTICE_ARGS_DEFAULT.nrealisations); CHECK(d3_eq(args.camera.pos, SOLSTICE_ARGS_DEFAULT.camera.pos), 1); @@ -121,13 +123,14 @@ test_rendering(void) CHECK(args.img.width, SOLSTICE_ARGS_DEFAULT.img.width); CHECK(args.img.height, SOLSTICE_ARGS_DEFAULT.img.height); CHECK(args.img.spp, SOLSTICE_ARGS_DEFAULT.img.spp); + CHECK(args.render_mode, SOLSTICE_ARGS_RENDER_DRAFT); CHECK(args.rendering, 1); CHECK(args.quiet, 0); CHECK(args.output_filename, NULL); solstice_args_release(&args); cmd_delete(cmd); - cmd = cmd_create(0, "test", "-r", "up=0,0,1:spp=4", NULL); + cmd = cmd_create(0, "test", "-r", "up=0,0,1:rmode=pt:spp=4", NULL); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_OK); CHECK(args.nrealisations, SOLSTICE_ARGS_DEFAULT.nrealisations); CHECK(d3_eq(args.camera.up, d3(tmp, 0, 0, 1)), 1); @@ -136,6 +139,7 @@ test_rendering(void) CHECK(args.rendering, 1); CHECK(args.output_filename, NULL); CHECK(args.img.spp, 4); + CHECK(args.render_mode, SOLSTICE_ARGS_RENDER_PATH_TRACING); solstice_args_release(&args); cmd_delete(cmd); @@ -154,6 +158,15 @@ test_rendering(void) solstice_args_release(&args); cmd_delete(cmd); + cmd = cmd_create(0, "test", "-r", "rmode=none", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-r", "rmode", NULL); + CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); + cmd_delete(cmd); + + cmd = cmd_create(0, "test", "-r", "up=0,1", NULL); CHECK(solstice_args_init(&args, cmd_size(cmd), cmd), RES_BAD_ARG); cmd_delete(cmd);