htrdr

Solving radiative transfer in heterogeneous media
git clone git://git.meso-star.fr/htrdr.git
Log | Files | Refs | README | LICENSE

commit 7259298582ab56de48e9481ff3b4608284e88741
parent 665b15420bffc5117a5817681aa48d6bc8af1e66
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri, 28 Oct 2022 12:11:26 +0200

htrdr-camera: configure the perspective camera

Diffstat:
Msrc/planeto/htrdr_planeto.c | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/planeto/htrdr_planeto_c.h | 3+++
2 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/src/planeto/htrdr_planeto.c b/src/planeto/htrdr_planeto.c @@ -28,7 +28,10 @@ #include <rad-net/rnatm.h> #include <rad-net/rngrd.h> +#include <star/scam.h> + #include <rsys/cstr.h> +#include <rsys/double3.h> #include <rsys/mem_allocator.h> #include <fcntl.h> /* open */ @@ -135,6 +138,9 @@ setup_ground res_T res = RES_OK; ASSERT(cmd && args); + if(cmd->output_type == HTRDR_PLANETO_ARGS_OUTPUT_OCTREES) + goto exit; + rngrd_args.smsh_filename = args->ground.smsh_filename; rngrd_args.props_filename = args->ground.props_filename; rngrd_args.mtllst_filename = args->ground.mtllst_filename; @@ -218,8 +224,58 @@ setup_source (struct htrdr_planeto* cmd, const struct htrdr_planeto_args* args) { + res_T res = RES_OK; ASSERT(cmd && args); - return htrdr_planeto_source_create(cmd, &args->source, &cmd->source); + + if(cmd->output_type == HTRDR_PLANETO_ARGS_OUTPUT_OCTREES) + goto exit; + + res = htrdr_planeto_source_create(cmd, &args->source, &cmd->source); + if(res != RES_OK) goto error; + +exit: + return res; +error: + goto exit; +} + +static res_T +setup_camera + (struct htrdr_planeto* cmd, + const struct htrdr_planeto_args* args) +{ + struct scam_perspective_args cam_args = SCAM_PERSPECTIVE_ARGS_DEFAULT; + res_T res = RES_OK; + ASSERT(cmd && args); + + if(cmd->output_type == HTRDR_PLANETO_ARGS_OUTPUT_IMAGE) + goto exit; + + ASSERT(htrdr_args_camera_perspective_check(&args->cam_persp) == RES_OK); + ASSERT(htrdr_args_image_check(&args->image) == RES_OK); + + d3_set(cam_args.position, args->cam_persp.position); + d3_set(cam_args.target, args->cam_persp.target); + d3_set(cam_args.up, args->cam_persp.up); + cam_args.field_of_view = MDEG2RAD(args->cam_persp.fov_y); + cam_args.lens_radius = args->cam_persp.lens_radius; + cam_args.focal_distance = args->cam_persp.focal_dst; + cam_args.aspect_ratio = + (double)args->image.definition[0] + / (double)args->image.definition[1]; + + res = scam_create_perspective + (htrdr_get_logger(cmd->htrdr), + htrdr_get_allocator(cmd->htrdr), + htrdr_get_verbosity_level(cmd->htrdr), + &cam_args, + &cmd->camera); + if(res != RES_OK) goto error; + +exit: + return res; +error: + goto exit; } static res_T @@ -231,7 +287,7 @@ setup_buffer res_T res = RES_OK; ASSERT(cmd && args); - if(cmd->output != HTRDR_PLANETO_ARGS_OUTPUT_IMAGE) + if(cmd->output_type != HTRDR_PLANETO_ARGS_OUTPUT_IMAGE) goto exit; planeto_get_pixel_format(cmd, &pixfmt); @@ -296,6 +352,7 @@ planeto_release(ref_T* ref) if(cmd->octrees_storage) CHK(fclose(cmd->octrees_storage) == 0); if(cmd->output && cmd->output != stdout) CHK(fclose(cmd->output) == 0); if(cmd->buf) htrdr_buffer_ref_put(cmd->buf); + if(cmd->camera) SCAM(ref_put(cmd->camera)); str_release(&cmd->output_name); htrdr = cmd->htrdr; @@ -340,6 +397,8 @@ htrdr_planeto_create if(res != RES_OK) goto error; res = setup_source(cmd, args); if(res != RES_OK) goto error; + res = setup_camera(cmd, args); + if(res != RES_OK) goto error; res = setup_buffer(cmd, args); if(res != RES_OK) goto error; res = setup_ground(cmd, args); diff --git a/src/planeto/htrdr_planeto_c.h b/src/planeto/htrdr_planeto_c.h @@ -32,6 +32,7 @@ struct htrdr; struct htrdr_pixel_format; struct rnatm; struct rngrd; +struct scam; struct planeto_pixel_xwave { struct htrdr_estimate radiance; /* In W/m²/sr */ @@ -74,6 +75,8 @@ struct htrdr_planeto { struct str output_name; enum htrdr_planeto_args_output_type output_type; + struct scam* camera; + struct htrdr_buffer_layout buf_layout; struct htrdr_buffer* buf; /* NULL on non master processes */ size_t spp; /* Samples per pixel */