/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved. * * SPDX-License-Identifier: GPL-2.0-or-later */ /** \file * \ingroup render */ /* Global includes */ #include #include #include #include "BLI_math_base.h" #include "BLI_math_matrix.h" #include "BLI_rect.h" #include "DNA_scene_types.h" #include "BKE_camera.h" /* this module */ #include "RE_pipeline.h" #include "render_types.h" namespace blender { /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ Object *RE_GetCamera(Render *re) { Object *camera = re->camera_override ? re->camera_override : re->scene->camera; return BKE_camera_multiview_render(*re->main, re->scene, camera, re->viewname); } void RE_SetOverrideCamera(Render *re, Object *cam_ob) { re->camera_override = cam_ob; } void RE_SetCamera(Render *re, const Object *cam_ob) { CameraParams params; /* setup parameters */ BKE_camera_params_init(¶ms); BKE_camera_params_from_object(¶ms, cam_ob); BKE_camera_multiview_params(&re->r, ¶ms, cam_ob, re->viewname); /* Compute matrix, view-plane, etc. */ BKE_camera_params_compute_viewplane(¶ms, re->winx, re->winy, re->r.xasp, re->r.yasp); BKE_camera_params_compute_matrix(¶ms); /* extract results */ copy_m4_m4(re->winmat, params.winmat); re->clip_start = params.clip_start; re->clip_end = params.clip_end; re->viewplane = params.viewplane; } void RE_GetCameraWindow(Render *re, const Object *camera, float r_winmat[4][4]) { RE_SetCamera(re, camera); copy_m4_m4(r_winmat, re->winmat); } void RE_GetCameraWindowWithOverscan(const Render *re, float overscan, float r_winmat[4][4]) { RE_GetWindowMatrixWithOverscan( re->winmat[3][3] != 0.0f, re->clip_start, re->clip_end, re->viewplane, overscan, r_winmat); } void RE_GetCameraModelMatrix(const Render *re, const Object *camera, float r_modelmat[4][4]) { BKE_camera_multiview_model_matrix(&re->r, camera, re->viewname, r_modelmat); } void RE_GetWindowMatrixWithOverscan(bool is_ortho, float clip_start, float clip_end, rctf viewplane, float overscan, float r_winmat[4][4]) { CameraParams params; params.is_ortho = is_ortho; params.clip_start = clip_start; params.clip_end = clip_end; params.viewplane = viewplane; overscan *= max_ff(BLI_rctf_size_x(¶ms.viewplane), BLI_rctf_size_y(¶ms.viewplane)); params.viewplane.xmin -= overscan; params.viewplane.xmax += overscan; params.viewplane.ymin -= overscan; params.viewplane.ymax += overscan; BKE_camera_params_compute_matrix(¶ms); copy_m4_m4(r_winmat, params.winmat); } void RE_GetViewPlane(Render *re, rctf *r_viewplane, rcti *r_disprect) { *r_viewplane = re->viewplane; /* make disprect zero when no border render, is needed to detect changes in 3d view render */ if (re->r.mode & R_BORDER) { *r_disprect = re->disprect; } else { BLI_rcti_init(r_disprect, 0, 0, 0, 0); } } } // namespace blender