htrdr

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

commit 01ea31eca2fc95558df60be9a052c1c4a6bf9d35
parent e888b1f0ffb1fe526b51086faeaa25d44f7e4e2f
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri,  9 May 2025 09:40:52 +0200

planets: add support of orthographic camera

Add -P option to define its arguments.

Diffstat:
Mdoc/htrdr-planets.1.in | 23++++++++++++++++++++++-
Msrc/planets/htrdr_planets.c | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
Msrc/planets/htrdr_planets_args.c | 7++++++-
Msrc/planets/htrdr_planets_args.h.in | 4++++
4 files changed, 94 insertions(+), 6 deletions(-)

diff --git a/doc/htrdr-planets.1.in b/doc/htrdr-planets.1.in @@ -20,7 +20,7 @@ .\" .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see <http://www.gnu.org/licenses/>. -.Dd March 17, 2025 +.Dd May 9, 2025 .Dt HTRDR-PLANETS 1 .Os .\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -41,6 +41,7 @@ .Op Fl G Ar ground_opt Ns Op : Ns Ar ground_opt No ... .Op Fl i Ar image_opt Ns Op : Ns Ar image_opt No ... .Op Fl o Ar output +.Op Fl P Ar ortho_camera_opt Ns Op : Ns Ar ortho_camera_opt No ... .Op Fl r Ar volrad_budget_opt Ns Op : Ns Ar volrad_budget_opt No ... .Op Fl S Ar source_opt Ns Op : Ns Ar source_opt No ... .Op Fl s Ar spectral_opt Ns Op : Ns Ar spectral_opt No ... @@ -385,6 +386,26 @@ footprint. .It Fl o Ar output Output file. If not defined, data is written to standard output. +.It Fl P Ar ortho_camera_opt Ns Op : Ns Ar ortho_camera_opt No ... +Set up an orthographic camera. +.Pp +The options for an orthographic camera are as follows: +.Bl -tag -width Ds +.It Cm height= Ns Ar lenght +Image plane height. +Its width is calculated from this length and the image ratio +to guarantee square pixels +.Pq see Fl i No option . +.It Cm pos= Ns Ar x , Ns Ar y , Ns Ar z +Camera position. +Default is @HTRDR_ARGS_DEFAULT_CAMERA_POS@. +.It Cm tgt= Ns Ar x , Ns Ar y , Ns Ar z +Targeted position. +Default is @HTRDR_ARGS_DEFAULT_CAMERA_TGT@. +.It Cm up= Ns Ar x , Ns Ar y , Ns Ar z +Upward vector that the top of the camera is pointing towards. +Default is @HTRDR_ARGS_DEFAULT_CAMERA_UP@. +.El .It Fl r Ar volrad_budget_opt Ns Op : Ns Ar volrad_budget_opt No ... Define the calculation of the volumic radiative budget. Calculation is no longer a rendering: diff --git a/src/planets/htrdr_planets.c b/src/planets/htrdr_planets.c @@ -414,17 +414,54 @@ error: } static res_T -setup_camera +setup_camera_orthographic (struct htrdr_planets* cmd, const struct htrdr_planets_args* args) { - struct scam_perspective_args cam_args = SCAM_PERSPECTIVE_ARGS_DEFAULT; + struct scam_orthographic_args cam_args = SCAM_ORTHOGRAPHIC_ARGS_DEFAULT; res_T res = RES_OK; + + /* Check pre-conditions */ ASSERT(cmd && args); + ASSERT(cmd->output_type == HTRDR_ATMOSPHERE_ARGS_OUTPUT_IMAGE); + ASSERT(args->cam_type == HTRDR_ARGS_CAMERA_ORTHOGRAPHIC); + ASSERT(htrdr_args_camera_orthographic_check(&args->cam_ortho) == RES_OK); + ASSERT(htrdr_args_image_check(&args->image) == RES_OK); - if(cmd->output_type != HTRDR_PLANETS_ARGS_OUTPUT_IMAGE) - goto exit; + d3_set(cam_args.position, args->cam_ortho.position); + d3_set(cam_args.target, args->cam_ortho.target); + d3_set(cam_args.up, args->cam_ortho.up); + cam_args.height = args->cam_ortho.height; + cam_args.aspect_ratio = + (double)args->image.definition[0] + / (double)args->image.definition[1]; + + res = scam_create_orthographic + (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 +setup_camera_perspective + (struct htrdr_planets* cmd, + const struct htrdr_planets_args* args) +{ + struct scam_perspective_args cam_args = SCAM_PERSPECTIVE_ARGS_DEFAULT; + res_T res = RES_OK; + /* Check pre-conditions */ + ASSERT(cmd && args); + ASSERT(args->output_type == HTRDR_PLANETS_ARGS_OUTPUT_IMAGE); + ASSERT(args->cam_type == HTRDR_ARGS_CAMERA_PERSPECTIVE); ASSERT(htrdr_args_camera_perspective_check(&args->cam_persp) == RES_OK); ASSERT(htrdr_args_image_check(&args->image) == RES_OK); @@ -453,6 +490,27 @@ error: } static res_T +setup_camera + (struct htrdr_planets* cmd, + const struct htrdr_planets_args* args) +{ + res_T res = RES_OK; + ASSERT(cmd->output_type == HTRDR_PLANETS_ARGS_OUTPUT_IMAGE); + + switch(args->cam_type) { + case HTRDR_ARGS_CAMERA_ORTHOGRAPHIC: + res = setup_camera_orthographic(cmd, args); + break; + case HTRDR_ARGS_CAMERA_PERSPECTIVE: + res = setup_camera_perspective(cmd, args); + break; + default: FATAL("Unreachable code.\n"); break; + } + + return res; +} + +static res_T setup_buffer_image (struct htrdr_planets* cmd, const struct htrdr_planets_args* args) diff --git a/src/planets/htrdr_planets_args.c b/src/planets/htrdr_planets_args.c @@ -140,6 +140,7 @@ usage(void) printf(" [-C persp_camera_opt[:persp_camera_opt ...]]\n"); printf(" [-G ground_opt[:ground_opt ...]]\n"); printf(" [-i image_opt[:image_opt ...]] [-o output]\n"); + printf(" [-P ortho_camera_opt[:ortho_camera_opt ...]]\n"); printf(" [-r volrad_budget_opt[:volrad_budget_opt ...]]\n"); printf(" [-S source_opt[:source_opt ...]]\n"); printf(" [-s spectral_opt[:spectral_opt ...]] [-t threads_count]\n"); @@ -696,7 +697,7 @@ htrdr_planets_args_init(struct htrdr_planets_args* args, int argc, char** argv) *args = HTRDR_PLANETS_ARGS_DEFAULT; - while((opt = getopt(argc, argv, "a:b:C:dfG:g:hi:No:r:S:s:t:v")) != -1) { + while((opt = getopt(argc, argv, "a:b:C:dfG:g:hi:No:P:r:S:s:t:v")) != -1) { switch(opt) { case 'a': (void)sa_add(args->aerosols, 1); @@ -742,6 +743,10 @@ htrdr_planets_args_init(struct htrdr_planets_args* args, int argc, char** argv) break; case 'N': args->precompute_normals = 1; break; case 'o': args->output = optarg; break; + case 'P': + res = htrdr_args_camera_orthographic_parse(&args->cam_ortho, optarg); + args->output_type = HTRDR_PLANETS_ARGS_OUTPUT_IMAGE; + break; case 'r': res = cstr_parse_list(optarg, ':', parse_volrad_budget_parameters, args); args->output_type = HTRDR_PLANETS_ARGS_OUTPUT_VOLUMIC_RADIATIVE_BUDGET; diff --git a/src/planets/htrdr_planets_args.h.in b/src/planets/htrdr_planets_args.h.in @@ -117,6 +117,8 @@ struct htrdr_planets_args { struct htrdr_args_image image; struct htrdr_args_camera_perspective cam_persp; /* Perspective camera */ + struct htrdr_args_camera_orthographic cam_ortho; /* Orthographic camera */ + enum htrdr_args_camera_type cam_type; /* Input parameters for volumic radiative budget calculation */ struct htrdr_planets_volrad_budget_args volrad_budget; @@ -143,6 +145,8 @@ struct htrdr_planets_args { HTRDR_ARGS_IMAGE_DEFAULT__, /* Image */ \ \ HTRDR_ARGS_CAMERA_PERSPECTIVE_DEFAULT__, /* Perspective camera */ \ + HTRDR_ARGS_CAMERA_ORTHOGRAPHIC_DEFAULT__, /* Orthographic camera */ \ + HTRDR_ARGS_CAMERA_PERSPECTIVE, \ \ HTRDR_PLANETS_VOLRAD_BUDGET_ARGS_NULL__, /* Volumic radiative budget */ \ \