Blender  V3.3
camera.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2001-2002 NaN Holding BV. All rights reserved. */
3 
8 #include <stddef.h>
9 #include <stdlib.h>
10 
11 /* Allow using deprecated functionality for .blend file I/O. */
12 #define DNA_DEPRECATED_ALLOW
13 
14 #include "DNA_ID.h"
15 #include "DNA_camera_types.h"
16 #include "DNA_defaults.h"
17 #include "DNA_light_types.h"
18 #include "DNA_object_types.h"
19 #include "DNA_scene_types.h"
20 #include "DNA_view3d_types.h"
21 
22 #include "BLI_listbase.h"
23 #include "BLI_math.h"
24 #include "BLI_rect.h"
25 #include "BLI_string.h"
26 #include "BLI_utildefines.h"
27 
28 #include "BKE_action.h"
29 #include "BKE_anim_data.h"
30 #include "BKE_camera.h"
31 #include "BKE_idtype.h"
32 #include "BKE_layer.h"
33 #include "BKE_lib_id.h"
34 #include "BKE_lib_query.h"
35 #include "BKE_main.h"
36 #include "BKE_object.h"
37 #include "BKE_scene.h"
38 #include "BKE_screen.h"
39 
40 #include "BLT_translation.h"
41 
42 #include "DEG_depsgraph_query.h"
43 
44 #include "MEM_guardedalloc.h"
45 
46 #include "BLO_read_write.h"
47 
48 /* -------------------------------------------------------------------- */
52 static void camera_init_data(ID *id)
53 {
54  Camera *cam = (Camera *)id;
56 
58 }
59 
70 static void camera_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int flag)
71 {
72  Camera *cam_dst = (Camera *)id_dst;
73  const Camera *cam_src = (const Camera *)id_src;
74 
75  /* We never handle usercount here for own data. */
76  const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT;
77 
78  BLI_listbase_clear(&cam_dst->bg_images);
79  LISTBASE_FOREACH (CameraBGImage *, bgpic_src, &cam_src->bg_images) {
80  CameraBGImage *bgpic_dst = BKE_camera_background_image_copy(bgpic_src, flag_subdata);
81  BLI_addtail(&cam_dst->bg_images, bgpic_dst);
82  }
83 }
84 
86 static void camera_free_data(ID *id)
87 {
88  Camera *cam = (Camera *)id;
89  BLI_freelistN(&cam->bg_images);
90 }
91 
93 {
94  Camera *camera = (Camera *)id;
95 
97  LISTBASE_FOREACH (CameraBGImage *, bgpic, &camera->bg_images) {
98  if (bgpic->source == CAM_BGIMG_SOURCE_IMAGE) {
100  }
101  else if (bgpic->source == CAM_BGIMG_SOURCE_MOVIE) {
103  }
104  }
105 }
106 
107 static void camera_blend_write(BlendWriter *writer, ID *id, const void *id_address)
108 {
109  Camera *cam = (Camera *)id;
110 
111  /* write LibData */
112  BLO_write_id_struct(writer, Camera, id_address, &cam->id);
113  BKE_id_blend_write(writer, &cam->id);
114 
115  if (cam->adt) {
116  BKE_animdata_blend_write(writer, cam->adt);
117  }
118 
119  LISTBASE_FOREACH (CameraBGImage *, bgpic, &cam->bg_images) {
120  BLO_write_struct(writer, CameraBGImage, bgpic);
121  }
122 }
123 
124 static void camera_blend_read_data(BlendDataReader *reader, ID *id)
125 {
126  Camera *ca = (Camera *)id;
127  BLO_read_data_address(reader, &ca->adt);
128  BKE_animdata_blend_read_data(reader, ca->adt);
129 
130  BLO_read_list(reader, &ca->bg_images);
131 
132  LISTBASE_FOREACH (CameraBGImage *, bgpic, &ca->bg_images) {
133  bgpic->iuser.scene = NULL;
134 
135  /* If linking from a library, clear 'local' library override flag. */
136  if (ID_IS_LINKED(ca)) {
138  }
139  }
140 }
141 
142 static void camera_blend_read_lib(BlendLibReader *reader, ID *id)
143 {
144  Camera *ca = (Camera *)id;
145  BLO_read_id_address(reader, ca->id.lib, &ca->ipo); /* deprecated, for versioning */
146 
147  BLO_read_id_address(reader, ca->id.lib, &ca->dof_ob); /* deprecated, for versioning */
148  BLO_read_id_address(reader, ca->id.lib, &ca->dof.focus_object);
149 
150  LISTBASE_FOREACH (CameraBGImage *, bgpic, &ca->bg_images) {
151  BLO_read_id_address(reader, ca->id.lib, &bgpic->ima);
152  BLO_read_id_address(reader, ca->id.lib, &bgpic->clip);
153  }
154 }
155 
156 static void camera_blend_read_expand(BlendExpander *expander, ID *id)
157 {
158  Camera *ca = (Camera *)id;
159  BLO_expand(expander, ca->ipo); // XXX deprecated - old animation system
160 
161  LISTBASE_FOREACH (CameraBGImage *, bgpic, &ca->bg_images) {
162  BLO_expand(expander, bgpic->ima);
163  BLO_expand(expander, bgpic->clip);
164  }
165 }
166 
168  .id_code = ID_CA,
169  .id_filter = FILTER_ID_CA,
170  .main_listbase_index = INDEX_ID_CA,
171  .struct_size = sizeof(Camera),
172  .name = "Camera",
173  .name_plural = "cameras",
174  .translation_context = BLT_I18NCONTEXT_ID_CAMERA,
176  .asset_type_info = NULL,
177 
179  .copy_data = camera_copy_data,
180  .free_data = camera_free_data,
181  .make_local = NULL,
182  .foreach_id = camera_foreach_id,
183  .foreach_cache = NULL,
184  .foreach_path = NULL,
185  .owner_get = NULL,
186 
187  .blend_write = camera_blend_write,
188  .blend_read_data = camera_blend_read_data,
189  .blend_read_lib = camera_blend_read_lib,
190  .blend_read_expand = camera_blend_read_expand,
191 
192  .blend_read_undo_preserve = NULL,
193 
194  .lib_override_apply_post = NULL,
195 };
196 
199 /* -------------------------------------------------------------------- */
203 void *BKE_camera_add(Main *bmain, const char *name)
204 {
205  Camera *cam;
206 
207  cam = BKE_id_new(bmain, ID_CA, name);
208 
209  return cam;
210 }
211 
213 {
214  Camera *cam = (Camera *)ob->data;
215  if (ob->type != OB_CAMERA) {
216  return 0.0f;
217  }
218  if (cam->dof.focus_object) {
219  float view_dir[3], dof_dir[3];
220  normalize_v3_v3(view_dir, ob->obmat[2]);
222  cam->dof.focus_subtarget);
223  if (pchan) {
224  float posemat[4][4];
225  mul_m4_m4m4(posemat, cam->dof.focus_object->obmat, pchan->pose_mat);
226  sub_v3_v3v3(dof_dir, ob->obmat[3], posemat[3]);
227  }
228  else {
229  sub_v3_v3v3(dof_dir, ob->obmat[3], cam->dof.focus_object->obmat[3]);
230  }
231  return fabsf(dot_v3v3(view_dir, dof_dir));
232  }
233  return cam->dof.focus_distance;
234 }
235 
236 float BKE_camera_sensor_size(int sensor_fit, float sensor_x, float sensor_y)
237 {
238  /* sensor size used to fit to. for auto, sensor_x is both x and y. */
239  if (sensor_fit == CAMERA_SENSOR_FIT_VERT) {
240  return sensor_y;
241  }
242 
243  return sensor_x;
244 }
245 
246 int BKE_camera_sensor_fit(int sensor_fit, float sizex, float sizey)
247 {
248  if (sensor_fit == CAMERA_SENSOR_FIT_AUTO) {
249  if (sizex >= sizey) {
250  return CAMERA_SENSOR_FIT_HOR;
251  }
252 
253  return CAMERA_SENSOR_FIT_VERT;
254  }
255 
256  return sensor_fit;
257 }
258 
261 /* -------------------------------------------------------------------- */
266 {
267  memset(params, 0, sizeof(CameraParams));
268 
269  /* defaults */
270  params->sensor_x = DEFAULT_SENSOR_WIDTH;
271  params->sensor_y = DEFAULT_SENSOR_HEIGHT;
272  params->sensor_fit = CAMERA_SENSOR_FIT_AUTO;
273 
274  params->zoom = 1.0f;
275 
276  /* fallback for non camera objects */
277  params->clip_start = 0.1f;
278  params->clip_end = 100.0f;
279 }
280 
282 {
283  if (!cam_ob) {
284  return;
285  }
286 
287  if (cam_ob->type == OB_CAMERA) {
288  /* camera object */
289  Camera *cam = cam_ob->data;
290 
291  if (cam->type == CAM_ORTHO) {
292  params->is_ortho = true;
293  }
294  params->lens = cam->lens;
295  params->ortho_scale = cam->ortho_scale;
296 
297  params->shiftx = cam->shiftx;
298  params->shifty = cam->shifty;
299 
300  params->sensor_x = cam->sensor_x;
301  params->sensor_y = cam->sensor_y;
302  params->sensor_fit = cam->sensor_fit;
303 
304  params->clip_start = cam->clip_start;
305  params->clip_end = cam->clip_end;
306  }
307  else if (cam_ob->type == OB_LAMP) {
308  /* light object */
309  Light *la = cam_ob->data;
310  params->lens = 16.0f / tanf(la->spotsize * 0.5f);
311  if (params->lens == 0.0f) {
312  params->lens = 35.0f;
313  }
314  }
315  else {
316  params->lens = 35.0f;
317  }
318 }
319 
321  const Depsgraph *depsgraph,
322  const View3D *v3d,
323  const RegionView3D *rv3d)
324 {
325  /* common */
326  params->lens = v3d->lens;
327  params->clip_start = v3d->clip_start;
328  params->clip_end = v3d->clip_end;
329 
330  if (rv3d->persp == RV3D_CAMOB) {
331  /* camera view */
332  const Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, v3d->camera);
333  BKE_camera_params_from_object(params, ob_camera_eval);
334 
336 
337  params->offsetx = 2.0f * rv3d->camdx * params->zoom;
338  params->offsety = 2.0f * rv3d->camdy * params->zoom;
339 
340  params->shiftx *= params->zoom;
341  params->shifty *= params->zoom;
342 
344  }
345  else if (rv3d->persp == RV3D_ORTHO) {
346  /* orthographic view */
347  float sensor_size = BKE_camera_sensor_size(
348  params->sensor_fit, params->sensor_x, params->sensor_y);
349  /* Halve, otherwise too extreme low zbuffer quality. */
350  params->clip_end *= 0.5f;
351  params->clip_start = -params->clip_end;
352 
353  params->is_ortho = true;
354  /* make sure any changes to this match ED_view3d_radius_to_dist_ortho() */
355  params->ortho_scale = rv3d->dist * sensor_size / v3d->lens;
357  }
358  else {
359  /* perspective view */
361  }
362 }
363 
365  CameraParams *params, int winx, int winy, float aspx, float aspy)
366 {
367  rctf viewplane;
368  float pixsize, viewfac, sensor_size, dx, dy;
369  int sensor_fit;
370 
371  params->ycor = aspy / aspx;
372 
373  if (params->is_ortho) {
374  /* orthographic camera */
375  /* scale == 1.0 means exact 1 to 1 mapping */
376  pixsize = params->ortho_scale;
377  }
378  else {
379  /* perspective camera */
380  sensor_size = BKE_camera_sensor_size(params->sensor_fit, params->sensor_x, params->sensor_y);
381  pixsize = (sensor_size * params->clip_start) / params->lens;
382  }
383 
384  /* determine sensor fit */
385  sensor_fit = BKE_camera_sensor_fit(params->sensor_fit, aspx * winx, aspy * winy);
386 
387  if (sensor_fit == CAMERA_SENSOR_FIT_HOR) {
388  viewfac = winx;
389  }
390  else {
391  viewfac = params->ycor * winy;
392  }
393 
394  pixsize /= viewfac;
395 
396  /* extra zoom factor */
397  pixsize *= params->zoom;
398 
399  /* compute view plane:
400  * fully centered, zbuffer fills in jittered between -.5 and +.5 */
401  viewplane.xmin = -0.5f * (float)winx;
402  viewplane.ymin = -0.5f * params->ycor * (float)winy;
403  viewplane.xmax = 0.5f * (float)winx;
404  viewplane.ymax = 0.5f * params->ycor * (float)winy;
405 
406  /* lens shift and offset */
407  dx = params->shiftx * viewfac + winx * params->offsetx;
408  dy = params->shifty * viewfac + winy * params->offsety;
409 
410  viewplane.xmin += dx;
411  viewplane.ymin += dy;
412  viewplane.xmax += dx;
413  viewplane.ymax += dy;
414 
415  /* the window matrix is used for clipping, and not changed during OSA steps */
416  /* using an offset of +0.5 here would give clip errors on edges */
417  viewplane.xmin *= pixsize;
418  viewplane.xmax *= pixsize;
419  viewplane.ymin *= pixsize;
420  viewplane.ymax *= pixsize;
421 
422  /* Used for rendering (offset by near-clip with perspective views), passed to RE_SetPixelSize.
423  * For viewport drawing 'RegionView3D.pixsize'. */
424  params->viewdx = pixsize;
425  params->viewdy = params->ycor * pixsize;
426  params->viewplane = viewplane;
427 }
428 
430 {
431  rctf viewplane = params->viewplane;
432 
433  /* compute projection matrix */
434  if (params->is_ortho) {
435  orthographic_m4(params->winmat,
436  viewplane.xmin,
437  viewplane.xmax,
438  viewplane.ymin,
439  viewplane.ymax,
440  params->clip_start,
441  params->clip_end);
442  }
443  else {
444  perspective_m4(params->winmat,
445  viewplane.xmin,
446  viewplane.xmax,
447  viewplane.ymin,
448  viewplane.ymax,
449  params->clip_start,
450  params->clip_end);
451  }
452 }
453 
456 /* -------------------------------------------------------------------- */
461  const Camera *camera,
462  const float drawsize,
463  const bool do_clip,
464  const float scale[3],
465  float r_asp[2],
466  float r_shift[2],
467  float *r_drawsize,
468  float r_vec[4][3])
469 {
470  float facx, facy;
471  float depth;
472 
473  /* aspect correction */
474  if (scene) {
475  float aspx = (float)scene->r.xsch * scene->r.xasp;
476  float aspy = (float)scene->r.ysch * scene->r.yasp;
477  int sensor_fit = BKE_camera_sensor_fit(camera->sensor_fit, aspx, aspy);
478 
479  if (sensor_fit == CAMERA_SENSOR_FIT_HOR) {
480  r_asp[0] = 1.0;
481  r_asp[1] = aspy / aspx;
482  }
483  else {
484  r_asp[0] = aspx / aspy;
485  r_asp[1] = 1.0;
486  }
487  }
488  else {
489  r_asp[0] = 1.0f;
490  r_asp[1] = 1.0f;
491  }
492 
493  if (camera->type == CAM_ORTHO) {
494  facx = 0.5f * camera->ortho_scale * r_asp[0] * scale[0];
495  facy = 0.5f * camera->ortho_scale * r_asp[1] * scale[1];
496  r_shift[0] = camera->shiftx * camera->ortho_scale * scale[0];
497  r_shift[1] = camera->shifty * camera->ortho_scale * scale[1];
498  depth = -drawsize * scale[2];
499 
500  *r_drawsize = 0.5f * camera->ortho_scale;
501  }
502  else {
503  /* that way it's always visible - clip_start+0.1 */
504  float fac, scale_x, scale_y;
505  float half_sensor = 0.5f * ((camera->sensor_fit == CAMERA_SENSOR_FIT_VERT) ?
506  (camera->sensor_y) :
507  (camera->sensor_x));
508 
509  /* fixed size, variable depth (stays a reasonable size in the 3D view) */
510  *r_drawsize = (drawsize / 2.0f) / ((scale[0] + scale[1] + scale[2]) / 3.0f);
511  depth = *r_drawsize * camera->lens / (-half_sensor) * scale[2];
512  fac = *r_drawsize;
513  scale_x = scale[0];
514  scale_y = scale[1];
515 
516  facx = fac * r_asp[0] * scale_x;
517  facy = fac * r_asp[1] * scale_y;
518  r_shift[0] = camera->shiftx * fac * 2.0f * scale_x;
519  r_shift[1] = camera->shifty * fac * 2.0f * scale_y;
520  }
521 
522  r_vec[0][0] = r_shift[0] + facx;
523  r_vec[0][1] = r_shift[1] + facy;
524  r_vec[0][2] = depth;
525  r_vec[1][0] = r_shift[0] + facx;
526  r_vec[1][1] = r_shift[1] - facy;
527  r_vec[1][2] = depth;
528  r_vec[2][0] = r_shift[0] - facx;
529  r_vec[2][1] = r_shift[1] - facy;
530  r_vec[2][2] = depth;
531  r_vec[3][0] = r_shift[0] - facx;
532  r_vec[3][1] = r_shift[1] + facy;
533  r_vec[3][2] = depth;
534 
535  if (do_clip) {
536  /* Ensure the frame isn't behind the near clipping plane, T62814. */
537  float fac = ((camera->clip_start + 0.1f) / -r_vec[0][2]) * scale[2];
538  for (uint i = 0; i < 4; i++) {
539  if (camera->type == CAM_ORTHO) {
540  r_vec[i][2] *= fac;
541  }
542  else {
543  mul_v3_fl(r_vec[i], fac);
544  }
545  }
546  }
547 }
548 
549 void BKE_camera_view_frame(const Scene *scene, const Camera *camera, float r_vec[4][3])
550 {
551  float dummy_asp[2];
552  float dummy_shift[2];
553  float dummy_drawsize;
554  const float dummy_scale[3] = {1.0f, 1.0f, 1.0f};
555 
557  scene, camera, 1.0, false, dummy_scale, dummy_asp, dummy_shift, &dummy_drawsize, r_vec);
558 }
559 
562 /* -------------------------------------------------------------------- */
566 #define CAMERA_VIEWFRAME_NUM_PLANES 4
567 
568 #define Y_MIN 0
569 #define Y_MAX 1
570 #define Z_MIN 2
571 #define Z_MAX 3
572 
573 typedef struct CameraViewFrameData {
574  float plane_tx[CAMERA_VIEWFRAME_NUM_PLANES][4]; /* 4 planes normalized */
575  float dist_vals[CAMERA_VIEWFRAME_NUM_PLANES]; /* distance (signed) */
576  float camera_no[3];
577  float z_range[2];
578  unsigned int tot;
579 
580  bool do_zrange;
581 
582  /* Not used by callbacks... */
583  float camera_rotmat[3][3];
585 
586 static void camera_to_frame_view_cb(const float co[3], void *user_data)
587 {
589 
590  for (uint i = 0; i < CAMERA_VIEWFRAME_NUM_PLANES; i++) {
591  const float nd = plane_point_side_v3(data->plane_tx[i], co);
592  CLAMP_MAX(data->dist_vals[i], nd);
593  }
594 
595  if (data->do_zrange) {
596  const float d = dot_v3v3(data->camera_no, co);
597  CLAMP_MAX(data->z_range[0], d);
598  CLAMP_MIN(data->z_range[1], d);
599  }
600 
601  data->tot++;
602 }
603 
605  const Object *ob,
606  const bool do_clip_dists,
609 {
610  float camera_rotmat_transposed_inversed[4][4];
611 
612  /* setup parameters */
615 
616  /* Compute matrix, view-plane, etc. */
617  if (scene) {
620  }
621  else {
622  BKE_camera_params_compute_viewplane(params, 1, 1, 1.0f, 1.0f);
623  }
625 
626  /* initialize callback data */
627  copy_m3_m4(data->camera_rotmat, (float(*)[4])ob->obmat);
628  normalize_m3(data->camera_rotmat);
629  /* To transform a plane which is in its homogeneous representation (4d vector),
630  * we need the inverse of the transpose of the transform matrix... */
631  copy_m4_m3(camera_rotmat_transposed_inversed, data->camera_rotmat);
632  transpose_m4(camera_rotmat_transposed_inversed);
633  invert_m4(camera_rotmat_transposed_inversed);
634 
635  /* Extract frustum planes from projection matrix. */
636  planes_from_projmat(params->winmat,
637  data->plane_tx[Y_MIN],
638  data->plane_tx[Y_MAX],
639  data->plane_tx[Z_MIN],
640  data->plane_tx[Z_MAX],
641  NULL,
642  NULL);
643 
644  /* Rotate planes and get normals from them */
645  for (uint i = 0; i < CAMERA_VIEWFRAME_NUM_PLANES; i++) {
646  mul_m4_v4(camera_rotmat_transposed_inversed, data->plane_tx[i]);
647  /* Normalize. */
648  data->plane_tx[i][3] /= normalize_v3(data->plane_tx[i]);
649 
650  data->dist_vals[i] = FLT_MAX;
651  }
652 
653  data->tot = 0;
654  data->do_zrange = params->is_ortho || do_clip_dists;
655 
656  if (data->do_zrange) {
657  /* We want (0, 0, -1) transformed by camera_rotmat, this is a quicker shortcut. */
658  negate_v3_v3(data->camera_no, data->camera_rotmat[2]);
659  data->z_range[0] = FLT_MAX;
660  data->z_range[1] = -FLT_MAX;
661  }
662 }
663 
666  float r_co[3],
667  float *r_scale,
668  float *r_clip_start,
669  float *r_clip_end)
670 {
671  float plane_tx[CAMERA_VIEWFRAME_NUM_PLANES][4];
672 
673  if (data->tot <= 1) {
674  return false;
675  }
676 
677  if (params->is_ortho) {
678  const float *cam_axis_x = data->camera_rotmat[0];
679  const float *cam_axis_y = data->camera_rotmat[1];
680  const float *cam_axis_z = data->camera_rotmat[2];
681  const float *dists = data->dist_vals;
682  const float dist_span_y = dists[Y_MIN] + dists[Y_MAX];
683  const float dist_span_z = dists[Z_MIN] + dists[Z_MAX];
684  const float dist_mid_y = (dists[Y_MIN] - dists[Y_MAX]) * 0.5f;
685  const float dist_mid_z = (dists[Z_MIN] - dists[Z_MAX]) * 0.5f;
686  const float scale_diff = (dist_span_z < dist_span_y) ?
687  (dist_span_z * (BLI_rctf_size_x(&params->viewplane) /
688  BLI_rctf_size_y(&params->viewplane))) :
689  (dist_span_y * (BLI_rctf_size_y(&params->viewplane) /
690  BLI_rctf_size_x(&params->viewplane)));
691 
692  *r_scale = params->ortho_scale - scale_diff;
693 
694  zero_v3(r_co);
695  madd_v3_v3fl(r_co, cam_axis_x, dist_mid_y + (params->shiftx * scale_diff));
696  madd_v3_v3fl(r_co, cam_axis_y, dist_mid_z + (params->shifty * scale_diff));
697  madd_v3_v3fl(r_co, cam_axis_z, -(data->z_range[0] - 1.0f - params->clip_start));
698  }
699  else {
700  float plane_isect_1[3], plane_isect_1_no[3], plane_isect_1_other[3];
701  float plane_isect_2[3], plane_isect_2_no[3], plane_isect_2_other[3];
702 
703  float plane_isect_pt_1[3], plane_isect_pt_2[3];
704 
705  /* apply the dist-from-plane's to the transformed plane points */
706  for (int i = 0; i < CAMERA_VIEWFRAME_NUM_PLANES; i++) {
707  float co[3];
708  mul_v3_v3fl(co, data->plane_tx[i], data->dist_vals[i]);
709  plane_from_point_normal_v3(plane_tx[i], co, data->plane_tx[i]);
710  }
711 
712  if ((!isect_plane_plane_v3(
713  plane_tx[Y_MIN], plane_tx[Y_MAX], plane_isect_1, plane_isect_1_no)) ||
715  plane_tx[Z_MIN], plane_tx[Z_MAX], plane_isect_2, plane_isect_2_no))) {
716  return false;
717  }
718 
719  add_v3_v3v3(plane_isect_1_other, plane_isect_1, plane_isect_1_no);
720  add_v3_v3v3(plane_isect_2_other, plane_isect_2, plane_isect_2_no);
721 
722  if (!isect_line_line_v3(plane_isect_1,
723  plane_isect_1_other,
724  plane_isect_2,
725  plane_isect_2_other,
726  plane_isect_pt_1,
727  plane_isect_pt_2)) {
728  return false;
729  }
730 
731  float cam_plane_no[3];
732  float plane_isect_delta[3];
733 
734  const float shift_fac = BKE_camera_sensor_size(
735  params->sensor_fit, params->sensor_x, params->sensor_y) /
736  params->lens;
737 
738  /* we want (0, 0, -1) transformed by camera_rotmat, this is a quicker shortcut. */
739  negate_v3_v3(cam_plane_no, data->camera_rotmat[2]);
740 
741  sub_v3_v3v3(plane_isect_delta, plane_isect_pt_2, plane_isect_pt_1);
742  const float plane_isect_delta_len = len_v3(plane_isect_delta);
743 
744  if (dot_v3v3(plane_isect_delta, cam_plane_no) > 0.0f) {
745  copy_v3_v3(r_co, plane_isect_pt_1);
746 
747  /* offset shift */
748  normalize_v3(plane_isect_1_no);
749  madd_v3_v3fl(r_co, plane_isect_1_no, params->shifty * plane_isect_delta_len * shift_fac);
750  }
751  else {
752  copy_v3_v3(r_co, plane_isect_pt_2);
753 
754  /* offset shift */
755  normalize_v3(plane_isect_2_no);
756  madd_v3_v3fl(r_co, plane_isect_2_no, params->shiftx * plane_isect_delta_len * shift_fac);
757  }
758  }
759 
760  if (r_clip_start && r_clip_end) {
761  const float z_offs = dot_v3v3(r_co, data->camera_no);
762  *r_clip_start = data->z_range[0] - z_offs;
763  *r_clip_end = data->z_range[1] - z_offs;
764  }
765  return true;
766 }
767 
768 #undef Y_MIN
769 #undef Y_MAX
770 #undef Z_MIN
771 #undef Z_MAX
772 
774  const Scene *scene,
775  Object *camera_ob,
776  float r_co[3],
777  float *r_scale,
778  float *r_clip_start,
779  float *r_clip_end)
780 {
782  CameraViewFrameData data_cb;
783 
784  /* just in case */
785  *r_scale = 1.0f;
786 
787  camera_frame_fit_data_init(scene, camera_ob, r_clip_start && r_clip_end, &params, &data_cb);
788 
789  /* run callback on all visible points */
791 
793  &params, &data_cb, r_co, r_scale, r_clip_start, r_clip_end);
794 }
795 
797  const float (*cos)[3],
798  int num_cos,
799  Object *camera_ob,
800  float r_co[3],
801  float *r_scale)
802 {
803  Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
804  Object *camera_ob_eval = DEG_get_evaluated_object(depsgraph, camera_ob);
806  CameraViewFrameData data_cb;
807 
808  /* just in case */
809  *r_scale = 1.0f;
810 
811  camera_frame_fit_data_init(scene_eval, camera_ob_eval, false, &params, &data_cb);
812 
813  /* run callback on all given coordinates */
814  while (num_cos--) {
815  camera_to_frame_view_cb(cos[num_cos], &data_cb);
816  }
817 
818  return camera_frame_fit_calc_from_data(&params, &data_cb, r_co, r_scale, NULL, NULL);
819 }
820 
823 /* -------------------------------------------------------------------- */
827 static void camera_model_matrix(const Object *camera, float r_modelmat[4][4])
828 {
829  copy_m4_m4(r_modelmat, camera->obmat);
830 }
831 
833  const bool is_left,
834  float r_modelmat[4][4])
835 {
836  Camera *data = (Camera *)camera->data;
837  float interocular_distance, convergence_distance;
838  short convergence_mode, pivot;
839  float sizemat[4][4];
840 
841  float fac = 1.0f;
842  float fac_signed;
843 
844  interocular_distance = data->stereo.interocular_distance;
845  convergence_distance = data->stereo.convergence_distance;
846  convergence_mode = data->stereo.convergence_mode;
847  pivot = data->stereo.pivot;
848 
849  if (((pivot == CAM_S3D_PIVOT_LEFT) && is_left) || ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left)) {
850  camera_model_matrix(camera, r_modelmat);
851  return;
852  }
853 
854  float size[3];
855  mat4_to_size(size, camera->obmat);
856  size_to_mat4(sizemat, size);
857 
858  if (pivot == CAM_S3D_PIVOT_CENTER) {
859  fac = 0.5f;
860  }
861 
862  fac_signed = is_left ? fac : -fac;
863 
864  /* rotation */
865  if (convergence_mode == CAM_S3D_TOE) {
866  float angle;
867  float angle_sin, angle_cos;
868  float toeinmat[4][4];
869  float rotmat[4][4];
870 
871  unit_m4(rotmat);
872 
873  if (pivot == CAM_S3D_PIVOT_CENTER) {
874  fac = -fac;
875  fac_signed = -fac_signed;
876  }
877 
878  angle = atanf((interocular_distance * 0.5f) / convergence_distance) / fac;
879 
880  angle_cos = cosf(angle * fac_signed);
881  angle_sin = sinf(angle * fac_signed);
882 
883  rotmat[0][0] = angle_cos;
884  rotmat[2][0] = -angle_sin;
885  rotmat[0][2] = angle_sin;
886  rotmat[2][2] = angle_cos;
887 
888  if (pivot == CAM_S3D_PIVOT_CENTER) {
889  /* set the rotation */
890  copy_m4_m4(toeinmat, rotmat);
891  /* set the translation */
892  toeinmat[3][0] = interocular_distance * fac_signed;
893 
894  /* transform */
895  normalize_m4_m4(r_modelmat, camera->obmat);
896  mul_m4_m4m4(r_modelmat, r_modelmat, toeinmat);
897 
898  /* scale back to the original size */
899  mul_m4_m4m4(r_modelmat, r_modelmat, sizemat);
900  }
901  else { /* CAM_S3D_PIVOT_LEFT, CAM_S3D_PIVOT_RIGHT */
902  /* rotate perpendicular to the interocular line */
903  normalize_m4_m4(r_modelmat, camera->obmat);
904  mul_m4_m4m4(r_modelmat, r_modelmat, rotmat);
905 
906  /* translate along the interocular line */
907  unit_m4(toeinmat);
908  toeinmat[3][0] = -interocular_distance * fac_signed;
909  mul_m4_m4m4(r_modelmat, r_modelmat, toeinmat);
910 
911  /* rotate to toe-in angle */
912  mul_m4_m4m4(r_modelmat, r_modelmat, rotmat);
913 
914  /* scale back to the original size */
915  mul_m4_m4m4(r_modelmat, r_modelmat, sizemat);
916  }
917  }
918  else {
919  normalize_m4_m4(r_modelmat, camera->obmat);
920 
921  /* translate - no rotation in CAM_S3D_OFFAXIS, CAM_S3D_PARALLEL */
922  translate_m4(r_modelmat, -interocular_distance * fac_signed, 0.0f, 0.0f);
923 
924  /* scale back to the original size */
925  mul_m4_m4m4(r_modelmat, r_modelmat, sizemat);
926  }
927 }
928 
930  const Object *camera,
931  const bool is_left,
932  float r_viewmat[4][4])
933 {
935  rd, camera, is_left ? STEREO_LEFT_NAME : STEREO_RIGHT_NAME, r_viewmat);
936  invert_m4(r_viewmat);
937 }
938 
939 /* left is the default */
940 static bool camera_is_left(const char *viewname)
941 {
942  if (viewname && viewname[0] != '\0') {
943  return !STREQ(viewname, STEREO_RIGHT_NAME);
944  }
945  return true;
946 }
947 
949  const Object *camera,
950  const char *viewname,
951  float r_modelmat[4][4])
952 {
953  BKE_camera_multiview_model_matrix_scaled(rd, camera, viewname, r_modelmat);
954  normalize_m4(r_modelmat);
955 }
956 
958  const Object *camera,
959  const char *viewname,
960  float r_modelmat[4][4])
961 {
962  const bool is_multiview = (rd && rd->scemode & R_MULTIVIEW) != 0;
963 
964  if (!is_multiview) {
965  camera_model_matrix(camera, r_modelmat);
966  }
967  else if (rd->views_format == SCE_VIEWS_FORMAT_MULTIVIEW) {
968  camera_model_matrix(camera, r_modelmat);
969  }
970  else { /* SCE_VIEWS_SETUP_BASIC */
971  const bool is_left = camera_is_left(viewname);
973  }
974 }
975 
977  const Object *camera,
978  const char *viewname,
979  float r_winmat[4][4])
980 {
982 
983  /* Setup parameters */
986  BKE_camera_multiview_params(rd, &params, camera, viewname);
987 
988  /* Compute matrix, view-plane, etc. */
991 
992  copy_m4_m4(r_winmat, params.winmat);
993 }
994 
996 {
997  Camera *cam;
998  const bool is_multiview = (rd && rd->scemode & R_MULTIVIEW) != 0;
999 
1000  if (!is_multiview) {
1001  return false;
1002  }
1003 
1004  if (camera->type != OB_CAMERA) {
1005  return false;
1006  }
1007 
1008  cam = camera->data;
1009 
1011  ((cam->stereo.flag & CAM_S3D_SPHERICAL) != 0)) {
1012  return true;
1013  }
1014 
1015  return false;
1016 }
1017 
1018 static Object *camera_multiview_advanced(const Scene *scene, Object *camera, const char *suffix)
1019 {
1020  char name[MAX_NAME];
1021  const char *camera_name = camera->id.name + 2;
1022  const int len_name = strlen(camera_name);
1023  int len_suffix_max = -1;
1024 
1025  name[0] = '\0';
1026 
1027  /* we need to take the better match, thus the len_suffix_max test */
1028  LISTBASE_FOREACH (const SceneRenderView *, srv, &scene->r.views) {
1029  const int len_suffix = strlen(srv->suffix);
1030 
1031  if ((len_suffix < len_suffix_max) || (len_name < len_suffix)) {
1032  continue;
1033  }
1034 
1035  if (STREQ(camera_name + (len_name - len_suffix), srv->suffix)) {
1036  BLI_snprintf(name, sizeof(name), "%.*s%s", (len_name - len_suffix), camera_name, suffix);
1037  len_suffix_max = len_suffix;
1038  }
1039  }
1040 
1041  if (name[0] != '\0') {
1043  if (ob != NULL) {
1044  return ob;
1045  }
1046  }
1047 
1048  return camera;
1049 }
1050 
1051 Object *BKE_camera_multiview_render(const Scene *scene, Object *camera, const char *viewname)
1052 {
1053  const bool is_multiview = (camera != NULL) && (scene->r.scemode & R_MULTIVIEW) != 0;
1054 
1055  if (!is_multiview) {
1056  return camera;
1057  }
1059  return camera;
1060  }
1061  /* SCE_VIEWS_FORMAT_MULTIVIEW */
1062  const char *suffix = BKE_scene_multiview_view_suffix_get(&scene->r, viewname);
1063  return camera_multiview_advanced(scene, camera, suffix);
1064 }
1065 
1066 static float camera_stereo3d_shift_x(const Object *camera, const char *viewname)
1067 {
1068  Camera *data = camera->data;
1069  float shift = data->shiftx;
1070  float interocular_distance, convergence_distance;
1071  short convergence_mode, pivot;
1072  bool is_left = true;
1073 
1074  float fac = 1.0f;
1075  float fac_signed;
1076 
1077  if (viewname && viewname[0]) {
1078  is_left = STREQ(viewname, STEREO_LEFT_NAME);
1079  }
1080 
1081  interocular_distance = data->stereo.interocular_distance;
1082  convergence_distance = data->stereo.convergence_distance;
1083  convergence_mode = data->stereo.convergence_mode;
1084  pivot = data->stereo.pivot;
1085 
1086  if (convergence_mode != CAM_S3D_OFFAXIS) {
1087  return shift;
1088  }
1089 
1090  if (((pivot == CAM_S3D_PIVOT_LEFT) && is_left) || ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left)) {
1091  return shift;
1092  }
1093 
1094  if (pivot == CAM_S3D_PIVOT_CENTER) {
1095  fac = 0.5f;
1096  }
1097 
1098  fac_signed = is_left ? fac : -fac;
1099  shift += ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) *
1100  fac_signed;
1101 
1102  return shift;
1103 }
1104 
1106  const Object *camera,
1107  const char *viewname)
1108 {
1109  const bool is_multiview = (rd && rd->scemode & R_MULTIVIEW) != 0;
1110  Camera *data = camera->data;
1111 
1112  BLI_assert(camera->type == OB_CAMERA);
1113 
1114  if (!is_multiview) {
1115  return data->shiftx;
1116  }
1118  return data->shiftx;
1119  }
1120  if (data->type == CAM_PANO) {
1121  return data->shiftx;
1122  }
1123  /* SCE_VIEWS_SETUP_BASIC */
1124  return camera_stereo3d_shift_x(camera, viewname);
1125 }
1126 
1129  const Object *camera,
1130  const char *viewname)
1131 {
1132  if (camera->type == OB_CAMERA) {
1133  params->shiftx = BKE_camera_multiview_shift_x(rd, camera, viewname);
1134  }
1135 }
1136 
1139 /* -------------------------------------------------------------------- */
1144 {
1145  CameraBGImage *bgpic = MEM_callocN(sizeof(CameraBGImage), "Background Image");
1146 
1147  bgpic->scale = 1.0f;
1148  bgpic->alpha = 0.5f;
1149  bgpic->iuser.flag |= IMA_ANIM_ALWAYS;
1151 
1152  BLI_addtail(&cam->bg_images, bgpic);
1153 
1154  return bgpic;
1155 }
1156 
1158 {
1159  CameraBGImage *bgpic_dst = MEM_dupallocN(bgpic_src);
1160 
1161  bgpic_dst->next = bgpic_dst->prev = NULL;
1162 
1163  if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
1164  id_us_plus((ID *)bgpic_dst->ima);
1165  id_us_plus((ID *)bgpic_dst->clip);
1166  }
1167 
1168  if ((flag & LIB_ID_COPY_NO_LIB_OVERRIDE_LOCAL_DATA_FLAG) == 0) {
1170  }
1171 
1172  return bgpic_dst;
1173 }
1174 
1176 {
1177  BLI_remlink(&cam->bg_images, bgpic);
1178 
1179  MEM_freeN(bgpic);
1180 }
1181 
1183 {
1184  CameraBGImage *bgpic = cam->bg_images.first;
1185 
1186  while (bgpic) {
1187  CameraBGImage *next_bgpic = bgpic->next;
1188 
1190 
1191  bgpic = next_bgpic;
1192  }
1193 }
1194 
typedef float(TangentPoint)[2]
Blender kernel action and pose functionality.
struct bPoseChannel * BKE_pose_channel_find_name(const struct bPose *pose, const char *name)
void BKE_animdata_blend_read_data(struct BlendDataReader *reader, struct AnimData *adt)
Definition: anim_data.c:1443
void BKE_animdata_blend_write(struct BlendWriter *writer, struct AnimData *adt)
Definition: anim_data.c:1421
Camera data-block and utility functions.
#define CAMERA_PARAM_ZOOM_INIT_PERSP
Definition: BKE_camera.h:77
#define CAMERA_PARAM_ZOOM_INIT_CAMOB
Definition: BKE_camera.h:76
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
Definition: BKE_idtype.h:39
@ LIB_ID_COPY_NO_LIB_OVERRIDE_LOCAL_DATA_FLAG
Definition: BKE_lib_id.h:161
@ LIB_ID_CREATE_NO_USER_REFCOUNT
Definition: BKE_lib_id.h:126
void id_us_plus(struct ID *id)
Definition: lib_id.c:305
void BKE_id_blend_write(struct BlendWriter *writer, struct ID *id)
Definition: lib_id.c:2008
void * BKE_id_new(struct Main *bmain, short type, const char *name)
Definition: lib_id.c:1159
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(_data, _id_super, _cb_flag)
@ IDWALK_CB_USER
Definition: BKE_lib_query.h:73
@ IDWALK_CB_NOP
Definition: BKE_lib_query.h:33
General operations, lookup, etc. for blender objects.
void BKE_scene_foreach_display_point(struct Depsgraph *depsgraph, void(*func_cb)(const float[3], void *), void *user_data)
Definition: object.cc:4182
struct Object * BKE_scene_object_find_by_name(const struct Scene *scene, const char *name)
const char * BKE_scene_multiview_view_suffix_get(const struct RenderData *rd, const char *viewname)
float BKE_screen_view3d_zoom_to_fac(float camzoom)
Definition: screen.c:1027
#define BLI_assert(a)
Definition: BLI_assert.h:46
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:273
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition: listbase.c:466
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:80
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:100
void orthographic_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
Definition: math_geom.c:4517
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
Definition: math_geom.c:209
int isect_line_line_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float r_i1[3], float r_i2[3])
Definition: math_geom.c:2935
void perspective_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
Definition: math_geom.c:4542
bool isect_plane_plane_v3(const float plane_a[4], const float plane_b[4], float r_isect_co[3], float r_isect_no[3]) ATTR_WARN_UNUSED_RESULT
Definition: math_geom.c:2134
MINLINE float plane_point_side_v3(const float plane[4], const float co[3])
void planes_from_projmat(const float mat[4][4], float left[4], float right[4], float bottom[4], float top[4], float near[4], float far[4])
Definition: math_geom.c:4615
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(float R[4][4])
Definition: math_matrix.c:1206
void mul_m4_v4(const float M[4][4], float r[4])
Definition: math_matrix.c:862
void copy_m3_m4(float m1[3][3], const float m2[4][4])
Definition: math_matrix.c:87
void unit_m4(float m[4][4])
Definition: rct.c:1090
void copy_m4_m3(float m1[4][4], const float m2[3][3])
Definition: math_matrix.c:102
void translate_m4(float mat[4][4], float tx, float ty, float tz)
Definition: math_matrix.c:2318
void normalize_m3(float R[3][3]) ATTR_NONNULL()
Definition: math_matrix.c:1912
void size_to_mat4(float R[4][4], const float size[3])
Definition: math_matrix.c:2111
void normalize_m4_m4(float R[4][4], const float M[4][4]) ATTR_NONNULL()
Definition: math_matrix.c:1965
void copy_m4_m4(float m1[4][4], const float m2[4][4])
Definition: math_matrix.c:77
void mat4_to_size(float size[3], const float M[4][4])
Definition: math_matrix.c:2138
void transpose_m4(float R[4][4])
Definition: math_matrix.c:1377
void normalize_m4(float R[4][4]) ATTR_NONNULL()
Definition: math_matrix.c:1945
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float normalize_v3(float r[3])
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void zero_v3(float r[3])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition: BLI_rect.h:194
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition: BLI_rect.h:198
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
unsigned int uint
Definition: BLI_sys_types.h:67
#define CLAMP_MAX(a, c)
#define UNUSED(x)
#define ELEM(...)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define STREQ(a, b)
#define CLAMP_MIN(a, b)
#define BLO_read_data_address(reader, ptr_p)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_list(BlendDataReader *reader, struct ListBase *list)
Definition: readfile.c:5172
#define BLO_read_id_address(reader, lib, id_ptr_p)
#define BLO_expand(expander, id)
#define BLT_I18NCONTEXT_ID_CAMERA
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:35
struct Object * DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
ID and Library types, which are fundamental for sdna.
#define FILTER_ID_CA
Definition: DNA_ID.h:902
@ INDEX_ID_CA
Definition: DNA_ID.h:1034
#define ID_IS_LINKED(_id)
Definition: DNA_ID.h:566
@ ID_CA
Definition: DNA_ID_enums.h:56
@ CAM_BGIMG_FLAG_OVERRIDE_LIBRARY_LOCAL
@ CAM_BGIMG_FLAG_EXPANDED
#define DEFAULT_SENSOR_HEIGHT
@ CAM_BGIMG_SOURCE_IMAGE
@ CAM_BGIMG_SOURCE_MOVIE
@ CAM_S3D_OFFAXIS
@ CAM_S3D_TOE
@ CAMERA_SENSOR_FIT_HOR
@ CAMERA_SENSOR_FIT_AUTO
@ CAMERA_SENSOR_FIT_VERT
struct Camera Camera
@ CAM_S3D_SPHERICAL
@ CAM_PERSP
@ CAM_PANO
@ CAM_ORTHO
@ CAM_S3D_PIVOT_CENTER
@ CAM_S3D_PIVOT_RIGHT
@ CAM_S3D_PIVOT_LEFT
#define DEFAULT_SENSOR_WIDTH
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
#define MAX_NAME
Definition: DNA_defs.h:48
#define IMA_ANIM_ALWAYS
Object is a sort of wrapper for general info.
@ OB_CAMERA
@ OB_LAMP
#define STEREO_LEFT_NAME
#define R_MULTIVIEW
#define STEREO_RIGHT_NAME
@ SCE_VIEWS_FORMAT_STEREO_3D
@ SCE_VIEWS_FORMAT_MULTIVIEW
#define RV3D_CAMOB
#define RV3D_ORTHO
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
Definition: btVector3.h:356
static void camera_blend_read_expand(BlendExpander *expander, ID *id)
Definition: camera.c:156
static void camera_blend_read_data(BlendDataReader *reader, ID *id)
Definition: camera.c:124
static void camera_foreach_id(ID *id, LibraryForeachIDData *data)
Definition: camera.c:92
float BKE_camera_sensor_size(int sensor_fit, float sensor_x, float sensor_y)
Definition: camera.c:236
bool BKE_camera_view_frame_fit_to_coords(const Depsgraph *depsgraph, const float(*cos)[3], int num_cos, Object *camera_ob, float r_co[3], float *r_scale)
Definition: camera.c:796
void BKE_camera_multiview_model_matrix_scaled(const RenderData *rd, const Object *camera, const char *viewname, float r_modelmat[4][4])
Definition: camera.c:957
bool BKE_camera_view_frame_fit_to_scene(Depsgraph *depsgraph, const Scene *scene, Object *camera_ob, float r_co[3], float *r_scale, float *r_clip_start, float *r_clip_end)
Definition: camera.c:773
#define Z_MAX
Definition: camera.c:571
static bool camera_frame_fit_calc_from_data(CameraParams *params, CameraViewFrameData *data, float r_co[3], float *r_scale, float *r_clip_start, float *r_clip_end)
Definition: camera.c:664
static void camera_blend_read_lib(BlendLibReader *reader, ID *id)
Definition: camera.c:142
static void camera_frame_fit_data_init(const Scene *scene, const Object *ob, const bool do_clip_dists, CameraParams *params, CameraViewFrameData *data)
Definition: camera.c:604
IDTypeInfo IDType_ID_CA
Definition: camera.c:167
static bool camera_is_left(const char *viewname)
Definition: camera.c:940
void BKE_camera_multiview_params(const RenderData *rd, CameraParams *params, const Object *camera, const char *viewname)
Definition: camera.c:1127
#define CAMERA_VIEWFRAME_NUM_PLANES
Definition: camera.c:566
void BKE_camera_multiview_view_matrix(const RenderData *rd, const Object *camera, const bool is_left, float r_viewmat[4][4])
Definition: camera.c:929
static void camera_stereo3d_model_matrix(const Object *camera, const bool is_left, float r_modelmat[4][4])
Definition: camera.c:832
static void camera_model_matrix(const Object *camera, float r_modelmat[4][4])
Definition: camera.c:827
#define Y_MIN
Definition: camera.c:568
void BKE_camera_params_from_object(CameraParams *params, const Object *cam_ob)
Definition: camera.c:281
void BKE_camera_view_frame(const Scene *scene, const Camera *camera, float r_vec[4][3])
Definition: camera.c:549
static float camera_stereo3d_shift_x(const Object *camera, const char *viewname)
Definition: camera.c:1066
void * BKE_camera_add(Main *bmain, const char *name)
Definition: camera.c:203
#define Y_MAX
Definition: camera.c:569
void BKE_camera_params_from_view3d(CameraParams *params, const Depsgraph *depsgraph, const View3D *v3d, const RegionView3D *rv3d)
Definition: camera.c:320
int BKE_camera_sensor_fit(int sensor_fit, float sizex, float sizey)
Definition: camera.c:246
void BKE_camera_params_init(CameraParams *params)
Definition: camera.c:265
static void camera_to_frame_view_cb(const float co[3], void *user_data)
Definition: camera.c:586
static void camera_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int flag)
Definition: camera.c:70
CameraBGImage * BKE_camera_background_image_copy(CameraBGImage *bgpic_src, const int flag)
Definition: camera.c:1157
void BKE_camera_view_frame_ex(const Scene *scene, const Camera *camera, const float drawsize, const bool do_clip, const float scale[3], float r_asp[2], float r_shift[2], float *r_drawsize, float r_vec[4][3])
Definition: camera.c:460
Object * BKE_camera_multiview_render(const Scene *scene, Object *camera, const char *viewname)
Definition: camera.c:1051
#define Z_MIN
Definition: camera.c:570
float BKE_camera_object_dof_distance(const Object *ob)
Definition: camera.c:212
static Object * camera_multiview_advanced(const Scene *scene, Object *camera, const char *suffix)
Definition: camera.c:1018
void BKE_camera_params_compute_viewplane(CameraParams *params, int winx, int winy, float aspx, float aspy)
Definition: camera.c:364
void BKE_camera_multiview_model_matrix(const RenderData *rd, const Object *camera, const char *viewname, float r_modelmat[4][4])
Definition: camera.c:948
void BKE_camera_multiview_window_matrix(const RenderData *rd, const Object *camera, const char *viewname, float r_winmat[4][4])
Definition: camera.c:976
void BKE_camera_background_image_remove(Camera *cam, CameraBGImage *bgpic)
Definition: camera.c:1175
void BKE_camera_background_image_clear(Camera *cam)
Definition: camera.c:1182
void BKE_camera_params_compute_matrix(CameraParams *params)
Definition: camera.c:429
static void camera_blend_write(BlendWriter *writer, ID *id, const void *id_address)
Definition: camera.c:107
bool BKE_camera_multiview_spherical_stereo(const RenderData *rd, const Object *camera)
Definition: camera.c:995
static void camera_free_data(ID *id)
Definition: camera.c:86
static void camera_init_data(ID *id)
Definition: camera.c:52
CameraBGImage * BKE_camera_background_image_new(Camera *cam)
Definition: camera.c:1143
struct CameraViewFrameData CameraViewFrameData
float BKE_camera_multiview_shift_x(const RenderData *rd, const Object *camera, const char *viewname)
Definition: camera.c:1105
static float is_left(const float p0[2], const float p1[2], const float p2[2])
Definition: convexhull_2d.c:37
#define sinf(x)
Definition: cuda/compat.h:102
#define cosf(x)
Definition: cuda/compat.h:101
#define tanf(x)
Definition: cuda/compat.h:104
Scene scene
const Depsgraph * depsgraph
void * user_data
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:28
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
#define atanf(x)
Definition: metal/compat.h:223
#define fabsf(x)
Definition: metal/compat.h:219
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
Definition: rall1d.h:319
struct CameraBGImage * next
struct CameraBGImage * prev
struct MovieClip * clip
struct ImageUser iuser
struct Image * ima
struct Object * focus_object
float z_range[2]
Definition: camera.c:577
float camera_rotmat[3][3]
Definition: camera.c:583
float camera_no[3]
Definition: camera.c:576
float plane_tx[CAMERA_VIEWFRAME_NUM_PLANES][4]
Definition: camera.c:574
unsigned int tot
Definition: camera.c:578
float dist_vals[CAMERA_VIEWFRAME_NUM_PLANES]
Definition: camera.c:575
float clip_end
char sensor_fit
float sensor_y
struct ListBase bg_images
float lens
float shiftx
struct CameraStereoSettings stereo
struct AnimData * adt
float sensor_x
float clip_start
float shifty
struct CameraDOFSettings dof
float ortho_scale
short id_code
Definition: BKE_idtype.h:114
Definition: DNA_ID.h:368
struct Library * lib
Definition: DNA_ID.h:372
float spotsize
void * first
Definition: DNA_listBase.h:31
Definition: BKE_main.h:121
struct bPose * pose
float obmat[4][4]
void * data
ListBase views
short views_format
struct RenderData r
float clip_end
struct Object * camera
float clip_start
float pose_mat[4][4]
float xmax
Definition: DNA_vec_types.h:69
float xmin
Definition: DNA_vec_types.h:69
float ymax
Definition: DNA_vec_types.h:70
float ymin
Definition: DNA_vec_types.h:70