Blender  V3.3
eevee_camera.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2021 Blender Foundation.
3  */
4 
9 #include <array>
10 
11 #include "DRW_render.h"
12 
13 #include "DNA_camera_types.h"
14 #include "DNA_view3d_types.h"
15 
16 #include "BKE_camera.h"
17 #include "DEG_depsgraph_query.h"
18 #include "RE_pipeline.h"
19 
20 #include "eevee_camera.hh"
21 #include "eevee_instance.hh"
22 
23 namespace blender::eevee {
24 
25 /* -------------------------------------------------------------------- */
30 {
31  const Object *camera_eval = inst_.camera_eval_object;
32 
33  CameraData &data = data_;
34 
35  if (camera_eval) {
36  const ::Camera *cam = reinterpret_cast<const ::Camera *>(camera_eval->data);
37  switch (cam->type) {
38  default:
39  case CAM_PERSP:
40  data.type = CAMERA_PERSP;
41  break;
42  case CAM_ORTHO:
43  data.type = CAMERA_ORTHO;
44  break;
45 #if 0 /* TODO(fclem): Make fisheye properties inside blender. */
46  case CAM_PANO: {
47  switch (cam->panorama_type) {
48  default:
49  case CAM_PANO_EQUIRECTANGULAR:
50  data.type = CAMERA_PANO_EQUIRECT;
51  break;
52  case CAM_PANO_FISHEYE_EQUIDISTANT:
53  data.type = CAMERA_PANO_EQUIDISTANT;
54  break;
55  case CAM_PANO_FISHEYE_EQUISOLID:
56  data.type = CAMERA_PANO_EQUISOLID;
57  break;
58  case CAM_PANO_MIRRORBALL:
59  data.type = CAMERA_PANO_MIRROR;
60  break;
61  }
62  }
63 #endif
64  }
65  }
66  else if (inst_.drw_view) {
67  data.type = DRW_view_is_persp_get(inst_.drw_view) ? CAMERA_PERSP : CAMERA_ORTHO;
68  }
69  else {
70  /* Light-probe baking. */
71  data.type = CAMERA_PERSP;
72  }
73 }
74 
76 {
77  const Object *camera_eval = inst_.camera_eval_object;
78 
79  CameraData &data = data_;
80 
81  if (inst_.drw_view) {
82  DRW_view_viewmat_get(inst_.drw_view, data.viewmat.ptr(), false);
83  DRW_view_viewmat_get(inst_.drw_view, data.viewinv.ptr(), true);
84  DRW_view_winmat_get(inst_.drw_view, data.winmat.ptr(), false);
85  DRW_view_winmat_get(inst_.drw_view, data.wininv.ptr(), true);
86  DRW_view_persmat_get(inst_.drw_view, data.persmat.ptr(), false);
87  DRW_view_persmat_get(inst_.drw_view, data.persinv.ptr(), true);
88  DRW_view_camtexco_get(inst_.drw_view, data.uv_scale);
89  }
90  else if (inst_.render) {
91  /* TODO(@fclem): Over-scan. */
92  // RE_GetCameraWindowWithOverscan(inst_.render->re, g_data->overscan, data.winmat);
93  RE_GetCameraWindow(inst_.render->re, camera_eval, data.winmat.ptr());
94  RE_GetCameraModelMatrix(inst_.render->re, camera_eval, data.viewinv.ptr());
95  invert_m4_m4(data.viewmat.ptr(), data.viewinv.ptr());
96  invert_m4_m4(data.wininv.ptr(), data.winmat.ptr());
97  mul_m4_m4m4(data.persmat.ptr(), data.winmat.ptr(), data.viewmat.ptr());
98  invert_m4_m4(data.persinv.ptr(), data.persmat.ptr());
99  data.uv_scale = float2(1.0f);
100  data.uv_bias = float2(0.0f);
101  }
102  else {
103  data.viewmat = float4x4::identity();
104  data.viewinv = float4x4::identity();
105  perspective_m4(data.winmat.ptr(), -0.1f, 0.1f, -0.1f, 0.1f, 0.1f, 1.0f);
106  data.wininv = data.winmat.inverted();
107  data.persmat = data.winmat * data.viewmat;
108  data.persinv = data.persmat.inverted();
109  }
110 
111  if (camera_eval) {
112  const ::Camera *cam = reinterpret_cast<const ::Camera *>(camera_eval->data);
113  data.clip_near = cam->clip_start;
114  data.clip_far = cam->clip_end;
115 #if 0 /* TODO(fclem): Make fisheye properties inside blender. */
116  data.fisheye_fov = cam->fisheye_fov;
117  data.fisheye_lens = cam->fisheye_lens;
118  data.equirect_bias.x = -cam->longitude_min + M_PI_2;
119  data.equirect_bias.y = -cam->latitude_min + M_PI_2;
120  data.equirect_scale.x = cam->longitude_min - cam->longitude_max;
121  data.equirect_scale.y = cam->latitude_min - cam->latitude_max;
122  /* Combine with uv_scale/bias to avoid doing extra computation. */
123  data.equirect_bias += data.uv_bias * data.equirect_scale;
124  data.equirect_scale *= data.uv_scale;
125 
126  data.equirect_scale_inv = 1.0f / data.equirect_scale;
127 #else
128  data.fisheye_fov = data.fisheye_lens = -1.0f;
129  data.equirect_bias = float2(0.0f);
130  data.equirect_scale = float2(0.0f);
131 #endif
132  }
133  else if (inst_.drw_view) {
134  data.clip_near = DRW_view_near_distance_get(inst_.drw_view);
135  data.clip_far = DRW_view_far_distance_get(inst_.drw_view);
136  data.fisheye_fov = data.fisheye_lens = -1.0f;
137  data.equirect_bias = float2(0.0f);
138  data.equirect_scale = float2(0.0f);
139  }
140 
141  data_.initialized = true;
142  data_.push_update();
143 }
144 
147 } // namespace blender::eevee
Camera data-block and utility functions.
#define M_PI_2
Definition: BLI_math_base.h:23
void perspective_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
Definition: math_geom.c:4542
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
Definition: math_matrix.c:259
bool invert_m4_m4(float R[4][4], const float A[4][4])
Definition: math_matrix.c:1287
struct Camera Camera
@ CAM_PERSP
@ CAM_PANO
@ CAM_ORTHO
const DRWView * drw_view
float DRW_view_near_distance_get(const DRWView *view)
void DRW_view_persmat_get(const DRWView *view, float mat[4][4], bool inverse)
void DRW_view_camtexco_get(const DRWView *view, float r_texco[4])
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)
smooth(Type::VEC3, "prev") .smooth(Type CameraData
void RE_GetCameraModelMatrix(const Render *re, const struct Object *camera, float r_modelmat[4][4])
Definition: initrender.c:205
void RE_GetCameraWindow(struct Render *re, const struct Object *camera, float r_winmat[4][4])
Definition: initrender.c:181
vec_base< float, 2 > float2
void * data
struct Render * re
Definition: RE_engine.h:135
static float4x4 identity()
Definition: BLI_float4x4.hh:80