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:
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 */ \
\