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:
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);