43 const ::Camera *cam =
reinterpret_cast<const ::
Camera *
>(camera_eval->
data);
54 switch (cam->panorama_type) {
56 case CAM_PANO_EQUIRECTANGULAR:
59 case CAM_PANO_FISHEYE_EQUIDISTANT:
62 case CAM_PANO_FISHEYE_EQUISOLID:
65 case CAM_PANO_MIRRORBALL:
104 film_offset.x + film_extent.x,
106 film_offset.y + film_extent.y);
113 uv_region.
min = (-uv_bias *
float2(display_extent)) / uv_scale;
114 uv_region.
max = uv_region.
min + (
float2(display_extent) / uv_scale);
117 data.uv_scale =
float2(film_extent + film_overscan * 2) / uv_region.
size();
118 data.uv_bias = (
float2(film_offset - film_overscan) - uv_region.
min) / uv_region.
size();
124 data.viewinv = view.viewinv();
125 data.winmat = view.winmat();
129 data.clip_near = -view.far_clip();
130 data.clip_far = -view.near_clip();
131 data.fisheye_fov = data.fisheye_lens = -1.0f;
132 data.equirect_bias =
float2(0.0f);
133 data.equirect_scale =
float2(0.0f);
134 data.uv_scale =
float2(1.0f);
135 data.uv_bias =
float2(0.0f);
163 if (
params.lens == 0.0f) {
194 data.persmat = data.winmat * data.viewmat;
197 is_camera_object_ =
false;
199 const ::Camera *cam =
reinterpret_cast<const ::
Camera *
>(camera_eval->
data);
200 data.clip_near = cam->clip_start;
201 data.clip_far = cam->clip_end;
203 data.fisheye_fov = cam->fisheye_fov;
204 data.fisheye_lens = cam->fisheye_lens;
205 data.equirect_bias.x = -cam->longitude_min +
M_PI_2;
206 data.equirect_bias.y = -cam->latitude_min +
M_PI_2;
207 data.equirect_scale.x = cam->longitude_min - cam->longitude_max;
208 data.equirect_scale.y = cam->latitude_min - cam->latitude_max;
210 data.equirect_bias += data.uv_bias * data.equirect_scale;
211 data.equirect_scale *= data.uv_scale;
213 data.equirect_scale_inv = 1.0f / data.equirect_scale;
215 data.fisheye_fov = data.fisheye_lens = -1.0f;
216 data.equirect_bias =
float2(0.0f);
217 data.equirect_scale =
float2(0.0f);
219 is_camera_object_ =
true;
225 data.fisheye_fov = data.fisheye_lens = -1.0f;
226 data.equirect_bias =
float2(0.0f);
227 data.equirect_scale =
float2(0.0f);
235void Camera::update_bounds()
237 float left, right, bottom,
top, near, far;
241 bbox.
vec[0][2] = bbox.
vec[3][2] = bbox.
vec[7][2] = bbox.
vec[4][2] = -near;
243 bbox.
vec[4][0] = bbox.
vec[7][0] = right;
244 bbox.
vec[0][1] = bbox.
vec[4][1] = bottom;
249 float sca_far = far / near;
256 bbox.
vec[1][2] = bbox.
vec[2][2] = bbox.
vec[6][2] = bbox.
vec[5][2] = -far;
258 bbox.
vec[6][0] = bbox.
vec[5][0] = right;
259 bbox.
vec[1][1] = bbox.
vec[5][1] = bottom;
262 bound_sphere.center = {0.0f, 0.0f, 0.0f};
263 bound_sphere.radius = 0.0f;
265 for (
auto i : IndexRange(8)) {
266 bound_sphere.center +=
float3(bbox.
vec[i]);
268 bound_sphere.center /= 8.0f;
269 for (
auto i : IndexRange(8)) {
271 bound_sphere.radius =
max_ff(bound_sphere.radius, dist_sqr);
273 bound_sphere.radius =
sqrtf(bound_sphere.radius);
Camera data-block and utility functions.
void BKE_camera_params_init(CameraParams *params)
void BKE_camera_params_crop_viewplane(rctf *viewplane, int winx, int winy, const rcti *region)
void BKE_camera_params_from_view3d(CameraParams *params, const struct Depsgraph *depsgraph, const struct View3D *v3d, const struct RegionView3D *rv3d)
void BKE_camera_params_from_object(CameraParams *params, const struct Object *cam_ob)
void BKE_camera_params_compute_viewplane(CameraParams *params, int winx, int winy, float aspx, float aspy)
MINLINE float max_ff(float a, float b)
void projmat_dimensions(const float winmat[4][4], float *r_left, float *r_right, float *r_bottom, float *r_top, float *r_near, float *r_far)
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
const float4x4 & viewmat(int view_id=0) const
bool is_orthographic() const
bool is_perspective() const
int2 film_offset_get() const
int2 display_extent_get() const
int2 film_extent_get() const
static int overscan_pixels_get(float overscan, int2 extent)
VolumeProbeModule volume_probes
Object * camera_eval_object
const RegionView3D * rv3d
Object * camera_orig_object
bool DRW_state_is_viewport_image_render()
float DRW_view_near_distance_get(const DRWView *view)
bool DRW_view_is_persp_get(const DRWView *view)
void DRW_view_winmat_get(const DRWView *view, float mat[4][4], bool inverse)
float DRW_view_far_distance_get(const DRWView *view)
void DRW_view_viewmat_get(const DRWView *view, float mat[4][4], bool inverse)
void RE_GetCameraModelMatrix(const Render *re, const Object *camera, float r_modelmat[4][4])
void RE_GetCameraWindow(Render *re, const Object *camera, float r_winmat[4][4])
void RE_GetWindowMatrixWithOverscan(bool is_ortho, float clip_start, float clip_end, rctf viewplane, float overscan, float r_winmat[4][4])
@ CAMERA_PANO_EQUIDISTANT
MatBase< T, 4, 4 > perspective(T left, T right, T bottom, T top, T near_clip, T far_clip)
Create a perspective projection matrix using OpenGL coordinate convention: Maps each axis range to [-...
T distance(const T &a, const T &b)
CartesianBasis invert(const CartesianBasis &basis)
T distance_squared(const VecBase< T, Size > &a, const VecBase< T, Size > &b)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
bool assign_if_different(T &old_value, T new_value)
VecBase< float, 4 > float4
VecBase< float, 2 > float2
VecBase< float, 3 > float3
const c_style_mat & ptr() const
static MatBase identity()
VecBase< T, 2 > zw() const
VecBase< T, 2 > xy() const
float screen_diagonal_length