116 lines
3.1 KiB
C++
116 lines
3.1 KiB
C++
/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup render
|
|
*/
|
|
|
|
/* Global includes */
|
|
|
|
#include <cmath>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
|
|
#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
|