Blender V4.3
blenkernel/intern/camera.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstddef>
10#include <cstdlib>
11#include <optional>
12
13/* Allow using deprecated functionality for .blend file I/O. */
14#define DNA_DEPRECATED_ALLOW
15
16#include "DNA_ID.h"
17#include "DNA_camera_types.h"
18#include "DNA_defaults.h"
19#include "DNA_light_types.h"
20#include "DNA_object_types.h"
21#include "DNA_scene_types.h"
22#include "DNA_view3d_types.h"
23
24#include "BLI_listbase.h"
25#include "BLI_math_geom.h"
26#include "BLI_math_matrix.h"
27#include "BLI_math_vector.h"
28#include "BLI_rect.h"
29#include "BLI_string.h"
30#include "BLI_utildefines.h"
31
32#include "BKE_action.hh"
33#include "BKE_camera.h"
34#include "BKE_idprop.hh"
35#include "BKE_idtype.hh"
36#include "BKE_lib_id.hh"
37#include "BKE_lib_query.hh"
38#include "BKE_object.hh"
39#include "BKE_scene.hh"
40#include "BKE_screen.hh"
41
42#include "BLT_translation.hh"
43
45
46#include "MEM_guardedalloc.h"
47
48#include "BLO_read_write.hh"
49
50/* -------------------------------------------------------------------- */
54static void camera_init_data(ID *id)
55{
56 Camera *cam = (Camera *)id;
58
60}
61
72static void camera_copy_data(Main * /*bmain*/,
73 std::optional<Library *> /*owner_library*/,
74 ID *id_dst,
75 const ID *id_src,
76 const int flag)
77{
78 Camera *cam_dst = (Camera *)id_dst;
79 const Camera *cam_src = (const Camera *)id_src;
80
81 /* We never handle user-count here for owned data. */
82 const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT;
83
85 LISTBASE_FOREACH (CameraBGImage *, bgpic_src, &cam_src->bg_images) {
86 CameraBGImage *bgpic_dst = BKE_camera_background_image_copy(bgpic_src, flag_subdata);
87 BLI_addtail(&cam_dst->bg_images, bgpic_dst);
88 }
89}
90
92static void camera_free_data(ID *id)
93{
94 Camera *cam = (Camera *)id;
96}
97
99{
100 Camera *camera = reinterpret_cast<Camera *>(id);
102
103 BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, camera->dof.focus_object, IDWALK_CB_NOP);
104 LISTBASE_FOREACH (CameraBGImage *, bgpic, &camera->bg_images) {
107 }
108
112 }
113}
114
119
121{
122 auto cycles_data_ensure = [](IDProperty *group) {
123 IDProperty *prop = IDP_GetPropertyTypeFromGroup(group, "cycles", IDP_GROUP);
124 if (prop) {
125 return prop;
126 }
127 prop = blender::bke::idprop::create_group("cycles").release();
128 IDP_AddToGroup(group, prop);
129 return prop;
130 };
131
132 auto cycles_property_int_set = [](IDProperty *idprop, const char *name, int value) {
133 if (IDProperty *prop = IDP_GetPropertyTypeFromGroup(idprop, name, IDP_INT)) {
134 IDP_Int(prop) = value;
135 }
136 else {
137 IDP_AddToGroup(idprop, blender::bke::idprop::create(name, value).release());
138 }
139 };
140
141 auto cycles_property_float_set = [](IDProperty *idprop, const char *name, float value) {
142 if (IDProperty *prop = IDP_GetPropertyTypeFromGroup(idprop, name, IDP_FLOAT)) {
143 IDP_Float(prop) = value;
144 }
145 else {
146 IDP_AddToGroup(idprop, blender::bke::idprop::create(name, value).release());
147 }
148 };
149
150 /* For forward compatibility, still write panoramic properties as ID properties for
151 * previous blender versions. */
152 IDProperty *idprop_prev = IDP_GetProperties(id);
153 /* Make a copy to avoid modifying the original. */
154 IDProperty *idprop_temp = idprop_prev ? IDP_CopyProperty(idprop_prev) : IDP_EnsureProperties(id);
155
156 Camera *cam = (Camera *)id;
157 IDProperty *cycles_cam = cycles_data_ensure(idprop_temp);
158 cycles_property_int_set(cycles_cam, "panorama_type", cam->panorama_type);
159 cycles_property_float_set(cycles_cam, "fisheye_fov", cam->fisheye_fov);
160 cycles_property_float_set(cycles_cam, "fisheye_lens", cam->fisheye_lens);
161 cycles_property_float_set(cycles_cam, "latitude_min", cam->latitude_min);
162 cycles_property_float_set(cycles_cam, "latitude_max", cam->latitude_max);
163 cycles_property_float_set(cycles_cam, "longitude_min", cam->longitude_min);
164 cycles_property_float_set(cycles_cam, "longitude_max", cam->longitude_max);
165 cycles_property_float_set(cycles_cam, "fisheye_polynomial_k0", cam->fisheye_polynomial_k0);
166 cycles_property_float_set(cycles_cam, "fisheye_polynomial_k1", cam->fisheye_polynomial_k1);
167 cycles_property_float_set(cycles_cam, "fisheye_polynomial_k2", cam->fisheye_polynomial_k2);
168 cycles_property_float_set(cycles_cam, "fisheye_polynomial_k3", cam->fisheye_polynomial_k3);
169 cycles_property_float_set(cycles_cam, "fisheye_polynomial_k4", cam->fisheye_polynomial_k4);
170
171 id->properties = idprop_temp;
172
173 return {idprop_prev, idprop_temp};
174}
175
178{
179 id->properties = data.idprop_prev;
180 data.idprop_prev = nullptr;
181
182 if (data.idprop_temp) {
183 IDP_FreeProperty(data.idprop_temp);
184 data.idprop_temp = nullptr;
185 }
186}
187
188static void camera_blend_write(BlendWriter *writer, ID *id, const void *id_address)
189{
190 const bool is_undo = BLO_write_is_undo(writer);
191 Camera *cam = (Camera *)id;
192
194 if (!is_undo) {
196 }
197
198 /* write LibData */
199 BLO_write_id_struct(writer, Camera, id_address, &cam->id);
200 BKE_id_blend_write(writer, &cam->id);
201
202 LISTBASE_FOREACH (CameraBGImage *, bgpic, &cam->bg_images) {
203 BLO_write_struct(writer, CameraBGImage, bgpic);
204 }
205
206 if (!is_undo) {
208 }
209}
210
212{
213 Camera *ca = (Camera *)id;
214
216
217 LISTBASE_FOREACH (CameraBGImage *, bgpic, &ca->bg_images) {
218 bgpic->iuser.scene = nullptr;
219
220 /* If linking from a library, clear 'local' library override flag. */
221 if (ID_IS_LINKED(ca)) {
222 bgpic->flag &= ~CAM_BGIMG_FLAG_OVERRIDE_LIBRARY_LOCAL;
223 }
224 }
225}
226
228 /*id_code*/ ID_CA,
229 /*id_filter*/ FILTER_ID_CA,
230 /*dependencies_id_types*/ FILTER_ID_OB | FILTER_ID_IM,
231 /*main_listbase_index*/ INDEX_ID_CA,
232 /*struct_size*/ sizeof(Camera),
233 /*name*/ "Camera",
234 /*name_plural*/ N_("cameras"),
235 /*translation_context*/ BLT_I18NCONTEXT_ID_CAMERA,
237 /*asset_type_info*/ nullptr,
238
239 /*init_data*/ camera_init_data,
240 /*copy_data*/ camera_copy_data,
241 /*free_data*/ camera_free_data,
242 /*make_local*/ nullptr,
243 /*foreach_id*/ camera_foreach_id,
244 /*foreach_cache*/ nullptr,
245 /*foreach_path*/ nullptr,
246 /*owner_pointer_get*/ nullptr,
247
248 /*blend_write*/ camera_blend_write,
249 /*blend_read_data*/ camera_blend_read_data,
250 /*blend_read_after_liblink*/ nullptr,
251
252 /*blend_read_undo_preserve*/ nullptr,
253
254 /*lib_override_apply_post*/ nullptr,
255};
256
259/* -------------------------------------------------------------------- */
263void *BKE_camera_add(Main *bmain, const char *name)
264{
265 Camera *cam;
266
267 cam = static_cast<Camera *>(BKE_id_new(bmain, ID_CA, name));
268
269 return cam;
270}
271
273{
274 const Camera *cam = (const Camera *)ob->data;
275 if (ob->type != OB_CAMERA) {
276 return 0.0f;
277 }
278 if (cam->dof.focus_object) {
279 float view_dir[3], dof_dir[3];
280 normalize_v3_v3(view_dir, ob->object_to_world().ptr()[2]);
282 cam->dof.focus_subtarget);
283 if (pchan) {
284 float posemat[4][4];
285 mul_m4_m4m4(posemat, cam->dof.focus_object->object_to_world().ptr(), pchan->pose_mat);
286 sub_v3_v3v3(dof_dir, ob->object_to_world().location(), posemat[3]);
287 }
288 else {
289 sub_v3_v3v3(dof_dir,
290 ob->object_to_world().location(),
291 cam->dof.focus_object->object_to_world().location());
292 }
293 return fmax(fabsf(dot_v3v3(view_dir, dof_dir)), 1e-5f);
294 }
295 return fmax(cam->dof.focus_distance, 1e-5f);
296}
297
298float BKE_camera_sensor_size(int sensor_fit, float sensor_x, float sensor_y)
299{
300 /* sensor size used to fit to. for auto, sensor_x is both x and y. */
301 if (sensor_fit == CAMERA_SENSOR_FIT_VERT) {
302 return sensor_y;
303 }
304
305 return sensor_x;
306}
307
308int BKE_camera_sensor_fit(int sensor_fit, float sizex, float sizey)
309{
310 if (sensor_fit == CAMERA_SENSOR_FIT_AUTO) {
311 if (sizex >= sizey) {
313 }
314
316 }
317
318 return sensor_fit;
319}
320
323/* -------------------------------------------------------------------- */
328{
329 memset(params, 0, sizeof(CameraParams));
330
331 /* defaults */
332 params->sensor_x = DEFAULT_SENSOR_WIDTH;
333 params->sensor_y = DEFAULT_SENSOR_HEIGHT;
334 params->sensor_fit = CAMERA_SENSOR_FIT_AUTO;
335
336 params->zoom = 1.0f;
337
338 /* fallback for non camera objects */
339 params->clip_start = 0.1f;
340 params->clip_end = 100.0f;
341}
342
344{
345 if (!cam_ob) {
346 return;
347 }
348
349 if (cam_ob->type == OB_CAMERA) {
350 /* camera object */
351 const Camera *cam = static_cast<const Camera *>(cam_ob->data);
352
353 if (cam->type == CAM_ORTHO) {
354 params->is_ortho = true;
355 }
356 params->lens = cam->lens;
357 params->ortho_scale = cam->ortho_scale;
358
359 params->shiftx = cam->shiftx;
360 params->shifty = cam->shifty;
361
362 params->sensor_x = cam->sensor_x;
363 params->sensor_y = cam->sensor_y;
364 params->sensor_fit = cam->sensor_fit;
365
366 params->clip_start = cam->clip_start;
367 params->clip_end = cam->clip_end;
368 }
369 else if (cam_ob->type == OB_LAMP) {
370 /* light object */
371 Light *la = static_cast<Light *>(cam_ob->data);
372 params->lens = 16.0f / tanf(la->spotsize * 0.5f);
373 if (params->lens == 0.0f) {
374 params->lens = 35.0f;
375 }
376 }
377 else {
378 params->lens = 35.0f;
379 }
380}
381
383 const Depsgraph *depsgraph,
384 const View3D *v3d,
385 const RegionView3D *rv3d)
386{
387 /* common */
388 params->lens = v3d->lens;
389 params->clip_start = v3d->clip_start;
390 params->clip_end = v3d->clip_end;
391
392 if (rv3d->persp == RV3D_CAMOB) {
393 /* camera view */
394 const Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, v3d->camera);
395 BKE_camera_params_from_object(params, ob_camera_eval);
396
398
399 params->offsetx = 2.0f * rv3d->camdx * params->zoom;
400 params->offsety = 2.0f * rv3d->camdy * params->zoom;
401
402 params->shiftx *= params->zoom;
403 params->shifty *= params->zoom;
404
406 }
407 else if (rv3d->persp == RV3D_ORTHO) {
408 /* orthographic view */
409 float sensor_size = BKE_camera_sensor_size(
410 params->sensor_fit, params->sensor_x, params->sensor_y);
411 /* Halve, otherwise too extreme low Z-buffer quality. */
412 params->clip_end *= 0.5f;
413 params->clip_start = -params->clip_end;
414
415 params->is_ortho = true;
416 /* make sure any changes to this match ED_view3d_radius_to_dist_ortho() */
417 params->ortho_scale = rv3d->dist * sensor_size / v3d->lens;
419 }
420 else {
421 /* perspective view */
423 }
424}
425
427 CameraParams *params, int winx, int winy, float aspx, float aspy)
428{
429 rctf viewplane;
430 float pixsize, viewfac, sensor_size, dx, dy;
431 int sensor_fit;
432
433 params->ycor = aspy / aspx;
434
435 if (params->is_ortho) {
436 /* orthographic camera */
437 /* scale == 1.0 means exact 1 to 1 mapping */
438 pixsize = params->ortho_scale;
439 }
440 else {
441 /* perspective camera */
442 sensor_size = BKE_camera_sensor_size(params->sensor_fit, params->sensor_x, params->sensor_y);
443 pixsize = (sensor_size * params->clip_start) / params->lens;
444 }
445
446 /* determine sensor fit */
447 sensor_fit = BKE_camera_sensor_fit(params->sensor_fit, aspx * winx, aspy * winy);
448
449 if (sensor_fit == CAMERA_SENSOR_FIT_HOR) {
450 viewfac = winx;
451 }
452 else {
453 viewfac = params->ycor * winy;
454 }
455
456 pixsize /= viewfac;
457
458 /* extra zoom factor */
459 pixsize *= params->zoom;
460
461 /* compute view plane:
462 * Fully centered, Z-buffer fills in jittered between `-.5` and `+.5`. */
463 viewplane.xmin = -0.5f * float(winx);
464 viewplane.ymin = -0.5f * params->ycor * float(winy);
465 viewplane.xmax = 0.5f * float(winx);
466 viewplane.ymax = 0.5f * params->ycor * float(winy);
467
468 /* lens shift and offset */
469 dx = params->shiftx * viewfac + winx * params->offsetx;
470 dy = params->shifty * viewfac + winy * params->offsety;
471
472 viewplane.xmin += dx;
473 viewplane.ymin += dy;
474 viewplane.xmax += dx;
475 viewplane.ymax += dy;
476
477 /* the window matrix is used for clipping, and not changed during OSA steps */
478 /* using an offset of +0.5 here would give clip errors on edges */
479 BLI_rctf_mul(&viewplane, pixsize);
480
481 /* Used for rendering (offset by near-clip with perspective views), passed to RE_SetPixelSize.
482 * For viewport drawing 'RegionView3D.pixsize'. */
483 params->viewdx = pixsize;
484 params->viewdy = params->ycor * pixsize;
485 params->viewplane = viewplane;
486}
487
488void BKE_camera_params_crop_viewplane(rctf *viewplane, int winx, int winy, const rcti *region)
489{
490 float pix_size_x = BLI_rctf_size_x(viewplane) / winx;
491 float pix_size_y = BLI_rctf_size_y(viewplane) / winy;
492
493 viewplane->xmin += pix_size_x * region->xmin;
494 viewplane->ymin += pix_size_y * region->ymin;
495
496 viewplane->xmax = viewplane->xmin + pix_size_x * BLI_rcti_size_x(region);
497 viewplane->ymax = viewplane->ymin + pix_size_y * BLI_rcti_size_y(region);
498}
499
501{
502 rctf viewplane = params->viewplane;
503
504 /* compute projection matrix */
505 if (params->is_ortho) {
506 orthographic_m4(params->winmat,
507 viewplane.xmin,
508 viewplane.xmax,
509 viewplane.ymin,
510 viewplane.ymax,
511 params->clip_start,
512 params->clip_end);
513 }
514 else {
515 perspective_m4(params->winmat,
516 viewplane.xmin,
517 viewplane.xmax,
518 viewplane.ymin,
519 viewplane.ymax,
520 params->clip_start,
521 params->clip_end);
522 }
523}
524
527/* -------------------------------------------------------------------- */
532 const Camera *camera,
533 const float drawsize,
534 const bool do_clip,
535 const float scale[3],
536 float r_asp[2],
537 float r_shift[2],
538 float *r_drawsize,
539 float r_vec[4][3])
540{
541 float facx, facy;
542 float depth;
543
544 /* aspect correction */
545 if (scene) {
546 float aspx = float(scene->r.xsch) * scene->r.xasp;
547 float aspy = float(scene->r.ysch) * scene->r.yasp;
548 int sensor_fit = BKE_camera_sensor_fit(camera->sensor_fit, aspx, aspy);
549
550 if (sensor_fit == CAMERA_SENSOR_FIT_HOR) {
551 r_asp[0] = 1.0;
552 r_asp[1] = aspy / aspx;
553 }
554 else {
555 r_asp[0] = aspx / aspy;
556 r_asp[1] = 1.0;
557 }
558 }
559 else {
560 r_asp[0] = 1.0f;
561 r_asp[1] = 1.0f;
562 }
563
564 if (camera->type == CAM_ORTHO) {
565 facx = 0.5f * camera->ortho_scale * r_asp[0] * scale[0];
566 facy = 0.5f * camera->ortho_scale * r_asp[1] * scale[1];
567 r_shift[0] = camera->shiftx * camera->ortho_scale * scale[0];
568 r_shift[1] = camera->shifty * camera->ortho_scale * scale[1];
569 depth = -drawsize * scale[2];
570
571 *r_drawsize = 0.5f * camera->ortho_scale;
572 }
573 else {
574 /* that way it's always visible - clip_start+0.1 */
575 float fac, scale_x, scale_y;
576 float half_sensor = 0.5f * ((camera->sensor_fit == CAMERA_SENSOR_FIT_VERT) ?
577 (camera->sensor_y) :
578 (camera->sensor_x));
579
580 /* fixed size, variable depth (stays a reasonable size in the 3D view) */
581 *r_drawsize = (drawsize / 2.0f) / ((scale[0] + scale[1] + scale[2]) / 3.0f);
582 depth = *r_drawsize * camera->lens / (-half_sensor) * scale[2];
583 fac = *r_drawsize;
584 scale_x = scale[0];
585 scale_y = scale[1];
586
587 facx = fac * r_asp[0] * scale_x;
588 facy = fac * r_asp[1] * scale_y;
589 r_shift[0] = camera->shiftx * fac * 2.0f * scale_x;
590 r_shift[1] = camera->shifty * fac * 2.0f * scale_y;
591 }
592
593 r_vec[0][0] = r_shift[0] + facx;
594 r_vec[0][1] = r_shift[1] + facy;
595 r_vec[0][2] = depth;
596 r_vec[1][0] = r_shift[0] + facx;
597 r_vec[1][1] = r_shift[1] - facy;
598 r_vec[1][2] = depth;
599 r_vec[2][0] = r_shift[0] - facx;
600 r_vec[2][1] = r_shift[1] - facy;
601 r_vec[2][2] = depth;
602 r_vec[3][0] = r_shift[0] - facx;
603 r_vec[3][1] = r_shift[1] + facy;
604 r_vec[3][2] = depth;
605
606 if (do_clip) {
607 /* Ensure the frame isn't behind the near clipping plane, #62814. */
608 float fac = ((camera->clip_start + 0.1f) / -r_vec[0][2]) * scale[2];
609 for (uint i = 0; i < 4; i++) {
610 if (camera->type == CAM_ORTHO) {
611 r_vec[i][2] *= fac;
612 }
613 else {
614 mul_v3_fl(r_vec[i], fac);
615 }
616 }
617 }
618}
619
620void BKE_camera_view_frame(const Scene *scene, const Camera *camera, float r_vec[4][3])
621{
622 float dummy_asp[2];
623 float dummy_shift[2];
624 float dummy_drawsize;
625 const float dummy_scale[3] = {1.0f, 1.0f, 1.0f};
626
628 scene, camera, 1.0, false, dummy_scale, dummy_asp, dummy_shift, &dummy_drawsize, r_vec);
629}
630
633/* -------------------------------------------------------------------- */
637#define CAMERA_VIEWFRAME_NUM_PLANES 4
638
639#define Y_MIN 0
640#define Y_MAX 1
641#define Z_MIN 2
642#define Z_MAX 3
643
645 float plane_tx[CAMERA_VIEWFRAME_NUM_PLANES][4]; /* 4 planes normalized */
646 float dist_vals[CAMERA_VIEWFRAME_NUM_PLANES]; /* distance (signed) */
647 float camera_no[3];
648 float z_range[2];
650
652
653 /* Not used by callbacks... */
654 float camera_rotmat[3][3];
655};
656
657static void camera_to_frame_view_cb(const float co[3], void *user_data)
658{
659 CameraViewFrameData *data = (CameraViewFrameData *)user_data;
660
661 for (uint i = 0; i < CAMERA_VIEWFRAME_NUM_PLANES; i++) {
662 const float nd = plane_point_side_v3(data->plane_tx[i], co);
663 CLAMP_MAX(data->dist_vals[i], nd);
664 }
665
666 if (data->do_zrange) {
667 const float d = dot_v3v3(data->camera_no, co);
668 CLAMP_MAX(data->z_range[0], d);
669 CLAMP_MIN(data->z_range[1], d);
670 }
671
672 data->tot++;
673}
674
675static void camera_frame_fit_data_init(const Scene *scene,
676 const Object *ob,
677 const bool do_clip_dists,
680{
681 float camera_rotmat_transposed_inversed[4][4];
682
683 /* setup parameters */
686
687 /* Compute matrix, view-plane, etc. */
688 if (scene) {
690 params, scene->r.xsch, scene->r.ysch, scene->r.xasp, scene->r.yasp);
691 }
692 else {
694 }
696
697 /* initialize callback data */
698 copy_m3_m4(data->camera_rotmat, (float(*)[4])ob->object_to_world().ptr());
699 normalize_m3(data->camera_rotmat);
700 /* To transform a plane which is in its homogeneous representation (4d vector),
701 * we need the inverse of the transpose of the transform matrix... */
702 copy_m4_m3(camera_rotmat_transposed_inversed, data->camera_rotmat);
703 transpose_m4(camera_rotmat_transposed_inversed);
704 invert_m4(camera_rotmat_transposed_inversed);
705
706 /* Extract frustum planes from projection matrix. */
708 data->plane_tx[Y_MIN],
709 data->plane_tx[Y_MAX],
710 data->plane_tx[Z_MIN],
711 data->plane_tx[Z_MAX],
712 nullptr,
713 nullptr);
714
715 /* Rotate planes and get normals from them */
716 for (uint i = 0; i < CAMERA_VIEWFRAME_NUM_PLANES; i++) {
717 mul_m4_v4(camera_rotmat_transposed_inversed, data->plane_tx[i]);
718 /* Normalize. */
719 data->plane_tx[i][3] /= normalize_v3(data->plane_tx[i]);
720
721 data->dist_vals[i] = FLT_MAX;
722 }
723
724 data->tot = 0;
725 data->do_zrange = params->is_ortho || do_clip_dists;
726
727 if (data->do_zrange) {
728 /* We want (0, 0, -1) transformed by camera_rotmat, this is a quicker shortcut. */
729 negate_v3_v3(data->camera_no, data->camera_rotmat[2]);
730 data->z_range[0] = FLT_MAX;
731 data->z_range[1] = -FLT_MAX;
732 }
733}
734
737 float r_co[3],
738 float *r_scale,
739 float *r_clip_start,
740 float *r_clip_end)
741{
742 float plane_tx[CAMERA_VIEWFRAME_NUM_PLANES][4];
743
744 if (data->tot <= 1) {
745 return false;
746 }
747
748 if (params->is_ortho) {
749 const float *cam_axis_x = data->camera_rotmat[0];
750 const float *cam_axis_y = data->camera_rotmat[1];
751 const float *cam_axis_z = data->camera_rotmat[2];
752 const float *dists = data->dist_vals;
753 const float dist_span_y = dists[Y_MIN] + dists[Y_MAX];
754 const float dist_span_z = dists[Z_MIN] + dists[Z_MAX];
755 const float dist_mid_y = (dists[Y_MIN] - dists[Y_MAX]) * 0.5f;
756 const float dist_mid_z = (dists[Z_MIN] - dists[Z_MAX]) * 0.5f;
757 const float scale_diff = (dist_span_z < dist_span_y) ?
758 (dist_span_z * (BLI_rctf_size_x(&params->viewplane) /
759 BLI_rctf_size_y(&params->viewplane))) :
760 (dist_span_y * (BLI_rctf_size_y(&params->viewplane) /
761 BLI_rctf_size_x(&params->viewplane)));
762
763 *r_scale = params->ortho_scale - scale_diff;
764
765 zero_v3(r_co);
766 madd_v3_v3fl(r_co, cam_axis_x, dist_mid_y + (params->shiftx * scale_diff));
767 madd_v3_v3fl(r_co, cam_axis_y, dist_mid_z + (params->shifty * scale_diff));
768 madd_v3_v3fl(r_co, cam_axis_z, -(data->z_range[0] - 1.0f - params->clip_start));
769 }
770 else {
771 float plane_isect_1[3], plane_isect_1_no[3], plane_isect_1_other[3];
772 float plane_isect_2[3], plane_isect_2_no[3], plane_isect_2_other[3];
773
774 float plane_isect_pt_1[3], plane_isect_pt_2[3];
775
776 /* apply the dist-from-plane's to the transformed plane points */
777 for (int i = 0; i < CAMERA_VIEWFRAME_NUM_PLANES; i++) {
778 float co[3];
779 mul_v3_v3fl(co, data->plane_tx[i], data->dist_vals[i]);
780 plane_from_point_normal_v3(plane_tx[i], co, data->plane_tx[i]);
781 }
782
783 if (!isect_plane_plane_v3(plane_tx[Y_MIN], plane_tx[Y_MAX], plane_isect_1, plane_isect_1_no) ||
784 !isect_plane_plane_v3(plane_tx[Z_MIN], plane_tx[Z_MAX], plane_isect_2, plane_isect_2_no))
785 {
786 return false;
787 }
788
789 add_v3_v3v3(plane_isect_1_other, plane_isect_1, plane_isect_1_no);
790 add_v3_v3v3(plane_isect_2_other, plane_isect_2, plane_isect_2_no);
791
792 if (!isect_line_line_v3(plane_isect_1,
793 plane_isect_1_other,
794 plane_isect_2,
795 plane_isect_2_other,
796 plane_isect_pt_1,
797 plane_isect_pt_2))
798 {
799 return false;
800 }
801
802 float cam_plane_no[3];
803 float plane_isect_delta[3];
804
805 const float shift_fac = BKE_camera_sensor_size(
806 params->sensor_fit, params->sensor_x, params->sensor_y) /
807 params->lens;
808
809 /* we want (0, 0, -1) transformed by camera_rotmat, this is a quicker shortcut. */
810 negate_v3_v3(cam_plane_no, data->camera_rotmat[2]);
811
812 sub_v3_v3v3(plane_isect_delta, plane_isect_pt_2, plane_isect_pt_1);
813 const float plane_isect_delta_len = len_v3(plane_isect_delta);
814
815 if (dot_v3v3(plane_isect_delta, cam_plane_no) > 0.0f) {
816 copy_v3_v3(r_co, plane_isect_pt_1);
817
818 /* offset shift */
819 normalize_v3(plane_isect_1_no);
820 madd_v3_v3fl(r_co, plane_isect_1_no, params->shifty * plane_isect_delta_len * shift_fac);
821 }
822 else {
823 copy_v3_v3(r_co, plane_isect_pt_2);
824
825 /* offset shift */
826 normalize_v3(plane_isect_2_no);
827 madd_v3_v3fl(r_co, plane_isect_2_no, params->shiftx * plane_isect_delta_len * shift_fac);
828 }
829 }
830
831 if (r_clip_start && r_clip_end) {
832 const float z_offs = dot_v3v3(r_co, data->camera_no);
833 *r_clip_start = data->z_range[0] - z_offs;
834 *r_clip_end = data->z_range[1] - z_offs;
835 }
836 return true;
837}
838
839#undef Y_MIN
840#undef Y_MAX
841#undef Z_MIN
842#undef Z_MAX
843
845 const Scene *scene,
846 Object *camera_ob,
847 float r_co[3],
848 float *r_scale,
849 float *r_clip_start,
850 float *r_clip_end)
851{
853 CameraViewFrameData data_cb;
854
855 /* just in case */
856 *r_scale = 1.0f;
857
858 camera_frame_fit_data_init(scene, camera_ob, r_clip_start && r_clip_end, &params, &data_cb);
859
860 /* run callback on all visible points */
862
864 &params, &data_cb, r_co, r_scale, r_clip_start, r_clip_end);
865}
866
868 const float (*cos)[3],
869 int num_cos,
870 Object *camera_ob,
871 float r_co[3],
872 float *r_scale)
873{
875 Object *camera_ob_eval = DEG_get_evaluated_object(depsgraph, camera_ob);
877 CameraViewFrameData data_cb;
878
879 /* just in case */
880 *r_scale = 1.0f;
881
882 camera_frame_fit_data_init(scene_eval, camera_ob_eval, false, &params, &data_cb);
883
884 /* run callback on all given coordinates */
885 while (num_cos--) {
886 camera_to_frame_view_cb(cos[num_cos], &data_cb);
887 }
888
889 return camera_frame_fit_calc_from_data(&params, &data_cb, r_co, r_scale, nullptr, nullptr);
890}
891
894/* -------------------------------------------------------------------- */
898static void camera_model_matrix(const Object *camera, float r_modelmat[4][4])
899{
900 copy_m4_m4(r_modelmat, camera->object_to_world().ptr());
901}
902
903static void camera_stereo3d_model_matrix(const Object *camera,
904 const bool is_left,
905 float r_modelmat[4][4])
906{
907 const Camera *data = (const Camera *)camera->data;
908 float interocular_distance, convergence_distance;
909 short convergence_mode, pivot;
910 float sizemat[4][4];
911
912 float fac = 1.0f;
913 float fac_signed;
914
915 interocular_distance = data->stereo.interocular_distance;
916 convergence_distance = data->stereo.convergence_distance;
917 convergence_mode = data->stereo.convergence_mode;
918 pivot = data->stereo.pivot;
919
920 if (((pivot == CAM_S3D_PIVOT_LEFT) && is_left) || ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left)) {
921 camera_model_matrix(camera, r_modelmat);
922 return;
923 }
924
925 float size[3];
926 mat4_to_size(size, camera->object_to_world().ptr());
927 size_to_mat4(sizemat, size);
928
929 if (pivot == CAM_S3D_PIVOT_CENTER) {
930 fac = 0.5f;
931 }
932
933 fac_signed = is_left ? fac : -fac;
934
935 /* rotation */
936 if (convergence_mode == CAM_S3D_TOE) {
937 float angle;
938 float angle_sin, angle_cos;
939 float toeinmat[4][4];
940 float rotmat[4][4];
941
942 unit_m4(rotmat);
943
944 if (pivot == CAM_S3D_PIVOT_CENTER) {
945 fac = -fac;
946 fac_signed = -fac_signed;
947 }
948
949 angle = atanf((interocular_distance * 0.5f) / convergence_distance) / fac;
950
951 angle_cos = cosf(angle * fac_signed);
952 angle_sin = sinf(angle * fac_signed);
953
954 rotmat[0][0] = angle_cos;
955 rotmat[2][0] = -angle_sin;
956 rotmat[0][2] = angle_sin;
957 rotmat[2][2] = angle_cos;
958
959 if (pivot == CAM_S3D_PIVOT_CENTER) {
960 /* set the rotation */
961 copy_m4_m4(toeinmat, rotmat);
962 /* set the translation */
963 toeinmat[3][0] = interocular_distance * fac_signed;
964
965 /* transform */
966 normalize_m4_m4(r_modelmat, camera->object_to_world().ptr());
967 mul_m4_m4m4(r_modelmat, r_modelmat, toeinmat);
968
969 /* scale back to the original size */
970 mul_m4_m4m4(r_modelmat, r_modelmat, sizemat);
971 }
972 else { /* CAM_S3D_PIVOT_LEFT, CAM_S3D_PIVOT_RIGHT */
973 /* rotate perpendicular to the interocular line */
974 normalize_m4_m4(r_modelmat, camera->object_to_world().ptr());
975 mul_m4_m4m4(r_modelmat, r_modelmat, rotmat);
976
977 /* translate along the interocular line */
978 unit_m4(toeinmat);
979 toeinmat[3][0] = -interocular_distance * fac_signed;
980 mul_m4_m4m4(r_modelmat, r_modelmat, toeinmat);
981
982 /* rotate to toe-in angle */
983 mul_m4_m4m4(r_modelmat, r_modelmat, rotmat);
984
985 /* scale back to the original size */
986 mul_m4_m4m4(r_modelmat, r_modelmat, sizemat);
987 }
988 }
989 else {
990 normalize_m4_m4(r_modelmat, camera->object_to_world().ptr());
991
992 /* translate - no rotation in CAM_S3D_OFFAXIS, CAM_S3D_PARALLEL */
993 translate_m4(r_modelmat, -interocular_distance * fac_signed, 0.0f, 0.0f);
994
995 /* scale back to the original size */
996 mul_m4_m4m4(r_modelmat, r_modelmat, sizemat);
997 }
998}
999
1001 const Object *camera,
1002 const bool is_left,
1003 float r_viewmat[4][4])
1004{
1006 rd, camera, is_left ? STEREO_LEFT_NAME : STEREO_RIGHT_NAME, r_viewmat);
1007 invert_m4(r_viewmat);
1008}
1009
1010/* left is the default */
1011static bool camera_is_left(const char *viewname)
1012{
1013 if (viewname && viewname[0] != '\0') {
1014 return !STREQ(viewname, STEREO_RIGHT_NAME);
1015 }
1016 return true;
1017}
1018
1020 const Object *camera,
1021 const char *viewname,
1022 float r_modelmat[4][4])
1023{
1024 BKE_camera_multiview_model_matrix_scaled(rd, camera, viewname, r_modelmat);
1025 normalize_m4(r_modelmat);
1026}
1027
1029 const Object *camera,
1030 const char *viewname,
1031 float r_modelmat[4][4])
1032{
1033 const bool is_multiview = (rd && rd->scemode & R_MULTIVIEW) != 0;
1034
1035 if (!is_multiview) {
1036 camera_model_matrix(camera, r_modelmat);
1037 }
1038 else if (rd->views_format == SCE_VIEWS_FORMAT_MULTIVIEW) {
1039 camera_model_matrix(camera, r_modelmat);
1040 }
1041 else { /* SCE_VIEWS_SETUP_BASIC */
1042 const bool is_left = camera_is_left(viewname);
1043 camera_stereo3d_model_matrix(camera, is_left, r_modelmat);
1044 }
1045}
1046
1048 const Object *camera,
1049 const char *viewname,
1050 float r_winmat[4][4])
1051{
1053
1054 /* Setup parameters */
1057 BKE_camera_multiview_params(rd, &params, camera, viewname);
1058
1059 /* Compute matrix, view-plane, etc. */
1062
1063 copy_m4_m4(r_winmat, params.winmat);
1064}
1065
1067{
1068 const bool is_multiview = (rd && rd->scemode & R_MULTIVIEW) != 0;
1069
1070 if (!is_multiview) {
1071 return false;
1072 }
1073
1074 if (camera->type != OB_CAMERA) {
1075 return false;
1076 }
1077
1078 const Camera *cam = static_cast<const Camera *>(camera->data);
1079
1081 ((cam->stereo.flag & CAM_S3D_SPHERICAL) != 0))
1082 {
1083 return true;
1084 }
1085
1086 return false;
1087}
1088
1089static Object *camera_multiview_advanced(const Scene *scene, Object *camera, const char *suffix)
1090{
1091 char name[MAX_NAME];
1092 const char *camera_name = camera->id.name + 2;
1093 const int len_name = strlen(camera_name);
1094 int len_suffix_max = -1;
1095
1096 name[0] = '\0';
1097
1098 /* we need to take the better match, thus the len_suffix_max test */
1099 LISTBASE_FOREACH (const SceneRenderView *, srv, &scene->r.views) {
1100 const int len_suffix = strlen(srv->suffix);
1101
1102 if ((len_suffix < len_suffix_max) || (len_name < len_suffix)) {
1103 continue;
1104 }
1105
1106 if (STREQ(camera_name + (len_name - len_suffix), srv->suffix)) {
1107 SNPRINTF(name, "%.*s%s", (len_name - len_suffix), camera_name, suffix);
1108 len_suffix_max = len_suffix;
1109 }
1110 }
1111
1112 if (name[0] != '\0') {
1113 Object *ob = BKE_scene_object_find_by_name(scene, name);
1114 if (ob != nullptr) {
1115 return ob;
1116 }
1117 }
1118
1119 return camera;
1120}
1121
1122Object *BKE_camera_multiview_render(const Scene *scene, Object *camera, const char *viewname)
1123{
1124 const bool is_multiview = (camera != nullptr) && (scene->r.scemode & R_MULTIVIEW) != 0;
1125
1126 if (!is_multiview) {
1127 return camera;
1128 }
1129 if (scene->r.views_format == SCE_VIEWS_FORMAT_STEREO_3D) {
1130 return camera;
1131 }
1132 /* SCE_VIEWS_FORMAT_MULTIVIEW */
1133 const char *suffix = BKE_scene_multiview_view_suffix_get(&scene->r, viewname);
1134 return camera_multiview_advanced(scene, camera, suffix);
1135}
1136
1137static float camera_stereo3d_shift_x(const Object *camera, const char *viewname)
1138{
1139 const Camera *data = static_cast<const Camera *>(camera->data);
1140 float shift = data->shiftx;
1141 float interocular_distance, convergence_distance;
1142 short convergence_mode, pivot;
1143 bool is_left = true;
1144
1145 float fac = 1.0f;
1146 float fac_signed;
1147
1148 if (viewname && viewname[0]) {
1149 is_left = STREQ(viewname, STEREO_LEFT_NAME);
1150 }
1151
1152 interocular_distance = data->stereo.interocular_distance;
1153 convergence_distance = data->stereo.convergence_distance;
1154 convergence_mode = data->stereo.convergence_mode;
1155 pivot = data->stereo.pivot;
1156
1157 if (convergence_mode != CAM_S3D_OFFAXIS) {
1158 return shift;
1159 }
1160
1161 if (((pivot == CAM_S3D_PIVOT_LEFT) && is_left) || ((pivot == CAM_S3D_PIVOT_RIGHT) && !is_left)) {
1162 return shift;
1163 }
1164
1165 if (pivot == CAM_S3D_PIVOT_CENTER) {
1166 fac = 0.5f;
1167 }
1168
1169 fac_signed = is_left ? fac : -fac;
1170 shift += ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) *
1171 fac_signed;
1172
1173 return shift;
1174}
1175
1177 const Object *camera,
1178 const char *viewname)
1179{
1180 const bool is_multiview = (rd && rd->scemode & R_MULTIVIEW) != 0;
1181 const Camera *data = static_cast<const Camera *>(camera->data);
1182
1183 BLI_assert(camera->type == OB_CAMERA);
1184
1185 if (!is_multiview) {
1186 return data->shiftx;
1187 }
1189 return data->shiftx;
1190 }
1191 if (data->type == CAM_PANO) {
1192 return data->shiftx;
1193 }
1194 /* SCE_VIEWS_SETUP_BASIC */
1195 return camera_stereo3d_shift_x(camera, viewname);
1196}
1197
1200 const Object *camera,
1201 const char *viewname)
1202{
1203 if (camera->type == OB_CAMERA) {
1204 params->shiftx = BKE_camera_multiview_shift_x(rd, camera, viewname);
1205 }
1206}
1207
1210/* -------------------------------------------------------------------- */
1215{
1216 CameraBGImage *bgpic = static_cast<CameraBGImage *>(
1217 MEM_callocN(sizeof(CameraBGImage), "Background Image"));
1218
1219 bgpic->scale = 1.0f;
1220 bgpic->alpha = 0.5f;
1221 bgpic->iuser.flag |= IMA_ANIM_ALWAYS;
1223
1224 BLI_addtail(&cam->bg_images, bgpic);
1225
1226 return bgpic;
1227}
1228
1230{
1231 CameraBGImage *bgpic_dst = static_cast<CameraBGImage *>(MEM_dupallocN(bgpic_src));
1232
1233 bgpic_dst->next = bgpic_dst->prev = nullptr;
1234
1235 if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
1236 id_us_plus((ID *)bgpic_dst->ima);
1237 id_us_plus((ID *)bgpic_dst->clip);
1238 }
1239
1242 }
1243
1244 return bgpic_dst;
1245}
1246
1248{
1249 BLI_remlink(&cam->bg_images, bgpic);
1250
1251 MEM_freeN(bgpic);
1252}
1253
1255{
1256 CameraBGImage *bgpic = static_cast<CameraBGImage *>(cam->bg_images.first);
1257
1258 while (bgpic) {
1259 CameraBGImage *next_bgpic = bgpic->next;
1260
1262
1263 bgpic = next_bgpic;
1264 }
1265}
1266
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
Camera data-block and utility functions.
#define CAMERA_PARAM_ZOOM_INIT_PERSP
Definition BKE_camera.h:79
#define CAMERA_PARAM_ZOOM_INIT_CAMOB
Definition BKE_camera.h:78
#define IDP_Float(prop)
#define IDP_Int(prop)
void IDP_FreeProperty(IDProperty *prop)
Definition idprop.cc:1227
IDProperty * IDP_GetPropertyTypeFromGroup(const IDProperty *prop, const char *name, char type) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:769
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
Definition idprop.cc:722
IDProperty * IDP_EnsureProperties(ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition idprop.cc:880
IDProperty * IDP_GetProperties(ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition idprop.cc:875
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:861
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
Definition BKE_idtype.hh:39
@ LIB_ID_COPY_NO_LIB_OVERRIDE_LOCAL_DATA_FLAG
@ LIB_ID_CREATE_NO_USER_REFCOUNT
void id_us_plus(ID *id)
Definition lib_id.cc:351
void * BKE_id_new(Main *bmain, short type, const char *name)
Definition lib_id.cc:1482
void BKE_id_blend_write(BlendWriter *writer, ID *id)
Definition lib_id.cc:2560
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
@ IDWALK_CB_USER
@ IDWALK_CB_NOP
int BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
Definition lib_query.cc:120
@ IDWALK_DO_DEPRECATED_POINTERS
#define BKE_LIB_FOREACHID_PROCESS_ID_NOCHECK(data_, id_, cb_flag_)
General operations, lookup, etc. for blender objects.
void BKE_scene_foreach_display_point(Depsgraph *depsgraph, void(*func_cb)(const float[3], void *), void *user_data)
Object * BKE_scene_object_find_by_name(const Scene *scene, const char *name)
Definition scene.cc:1974
const char * BKE_scene_multiview_view_suffix_get(const RenderData *rd, const char *viewname)
Definition scene.cc:3125
float BKE_screen_view3d_zoom_to_fac(float camzoom)
Definition screen.cc:998
#define BLI_assert(a)
Definition BLI_assert.h:50
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:496
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:130
void orthographic_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
Definition math_geom.cc:215
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])
void perspective_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
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
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])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void normalize_m4_m4(float rmat[4][4], const float mat[4][4]) ATTR_NONNULL()
void unit_m4(float m[4][4])
Definition rct.c:1127
void copy_m4_m3(float m1[4][4], const float m2[3][3])
void translate_m4(float mat[4][4], float Tx, float Ty, float Tz)
void normalize_m3(float R[3][3]) ATTR_NONNULL()
void size_to_mat4(float R[4][4], const float size[3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mul_m4_v4(const float mat[4][4], float r[4])
bool invert_m4(float mat[4][4])
void mat4_to_size(float size[3], const float M[4][4])
void transpose_m4(float R[4][4])
void normalize_m4(float R[4][4]) ATTR_NONNULL()
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
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 normalize_v3(float n[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition BLI_rect.h:193
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition BLI_rect.h:189
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition BLI_rect.h:197
void BLI_rctf_mul(struct rctf *rect, float factor)
Definition rct.c:582
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition BLI_rect.h:201
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:597
unsigned int uint
#define CLAMP_MAX(a, c)
#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_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_struct_list(reader, struct_name, list)
bool BLO_write_is_undo(BlendWriter *writer)
#define BLT_I18NCONTEXT_ID_CAMERA
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
ID and Library types, which are fundamental for SDNA.
#define FILTER_ID_OB
Definition DNA_ID.h:1181
#define FILTER_ID_CA
Definition DNA_ID.h:1167
#define ID_IS_LINKED(_id)
Definition DNA_ID.h:654
@ INDEX_ID_CA
Definition DNA_ID.h:1301
#define FILTER_ID_IM
Definition DNA_ID.h:1171
@ ID_CA
@ IDP_FLOAT
@ IDP_INT
@ IDP_GROUP
@ CAM_S3D_OFFAXIS
@ CAM_S3D_TOE
@ CAMERA_SENSOR_FIT_HOR
@ CAMERA_SENSOR_FIT_AUTO
@ CAMERA_SENSOR_FIT_VERT
#define DEFAULT_SENSOR_HEIGHT
struct Camera Camera
@ CAM_BGIMG_FLAG_OVERRIDE_LIBRARY_LOCAL
@ CAM_BGIMG_FLAG_EXPANDED
@ CAM_S3D_PIVOT_CENTER
@ CAM_S3D_PIVOT_RIGHT
@ CAM_S3D_PIVOT_LEFT
#define DEFAULT_SENSOR_WIDTH
@ CAM_S3D_SPHERICAL
@ CAM_PERSP
@ CAM_PANO
@ CAM_ORTHO
#define DNA_struct_default_get(struct_name)
#define MAX_NAME
Definition DNA_defs.h:50
@ IMA_ANIM_ALWAYS
Object is a sort of wrapper for general info.
@ OB_CAMERA
@ OB_LAMP
#define STEREO_LEFT_NAME
@ R_MULTIVIEW
@ SCE_VIEWS_FORMAT_STEREO_3D
@ SCE_VIEWS_FORMAT_MULTIVIEW
#define STEREO_RIGHT_NAME
@ RV3D_CAMOB
@ RV3D_ORTHO
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:125
Read Guarded memory(de)allocation.
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 Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture 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 void camera_blend_read_data(BlendDataReader *reader, ID *id)
static void camera_foreach_id(ID *id, LibraryForeachIDData *data)
float BKE_camera_sensor_size(int sensor_fit, float sensor_x, float sensor_y)
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)
void BKE_camera_multiview_model_matrix_scaled(const RenderData *rd, const Object *camera, const char *viewname, float r_modelmat[4][4])
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)
CameraBGImage * BKE_camera_background_image_copy(const CameraBGImage *bgpic_src, const int flag)
#define Z_MAX
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)
static void camera_frame_fit_data_init(const Scene *scene, const Object *ob, const bool do_clip_dists, CameraParams *params, CameraViewFrameData *data)
IDTypeInfo IDType_ID_CA
static bool camera_is_left(const char *viewname)
CameraBGImage * BKE_camera_background_image_new(Camera *cam)
void BKE_camera_multiview_params(const RenderData *rd, CameraParams *params, const Object *camera, const char *viewname)
#define CAMERA_VIEWFRAME_NUM_PLANES
void BKE_camera_multiview_view_matrix(const RenderData *rd, const Object *camera, const bool is_left, float r_viewmat[4][4])
static void camera_stereo3d_model_matrix(const Object *camera, const bool is_left, float r_modelmat[4][4])
static void camera_model_matrix(const Object *camera, float r_modelmat[4][4])
static void camera_copy_data(Main *, std::optional< Library * >, ID *id_dst, const ID *id_src, const int flag)
#define Y_MIN
void BKE_camera_params_from_object(CameraParams *params, const Object *cam_ob)
void BKE_camera_view_frame(const Scene *scene, const Camera *camera, float r_vec[4][3])
static float camera_stereo3d_shift_x(const Object *camera, const char *viewname)
void * BKE_camera_add(Main *bmain, const char *name)
#define Y_MAX
void BKE_camera_params_from_view3d(CameraParams *params, const Depsgraph *depsgraph, const View3D *v3d, const RegionView3D *rv3d)
int BKE_camera_sensor_fit(int sensor_fit, float sizex, float sizey)
void BKE_camera_params_init(CameraParams *params)
static void camera_to_frame_view_cb(const float co[3], void *user_data)
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])
void BKE_camera_params_crop_viewplane(rctf *viewplane, int winx, int winy, const rcti *region)
#define Z_MIN
float BKE_camera_object_dof_distance(const Object *ob)
void BKE_camera_params_compute_viewplane(CameraParams *params, int winx, int winy, float aspx, float aspy)
void BKE_camera_multiview_model_matrix(const RenderData *rd, const Object *camera, const char *viewname, float r_modelmat[4][4])
void BKE_camera_multiview_window_matrix(const RenderData *rd, const Object *camera, const char *viewname, float r_winmat[4][4])
void BKE_camera_background_image_remove(Camera *cam, CameraBGImage *bgpic)
static CameraCyclesCompatibilityData camera_write_cycles_compatibility_data_create(ID *id)
void BKE_camera_background_image_clear(Camera *cam)
void BKE_camera_params_compute_matrix(CameraParams *params)
static void camera_blend_write(BlendWriter *writer, ID *id, const void *id_address)
bool BKE_camera_multiview_spherical_stereo(const RenderData *rd, const Object *camera)
static void camera_free_data(ID *id)
static void camera_init_data(ID *id)
static Object * camera_multiview_advanced(const Scene *scene, Object *camera, const char *suffix)
static void camera_write_cycles_compatibility_data_clear(ID *id, CameraCyclesCompatibilityData &data)
Object * BKE_camera_multiview_render(const Scene *scene, Object *camera, const char *viewname)
float BKE_camera_multiview_shift_x(const RenderData *rd, const Object *camera, const char *viewname)
static float is_left(const float p0[2], const float p1[2], const float p2[2])
const Depsgraph * depsgraph
#define sinf(x)
#define cosf(x)
#define tanf(x)
#define atanf(x)
#define fabsf(x)
draw_view in_light_buf[] float
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
void *(* MEM_dupallocN)(const void *vmemh)
Definition mallocn.cc:39
ccl_device_inline float3 cos(float3 v)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRefNull prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRefNull prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
#define FLT_MAX
Definition stdcycles.h:14
struct CameraBGImage * next
struct CameraBGImage * prev
struct MovieClip * clip
struct ImageUser iuser
struct Image * ima
struct Object * focus_object
float plane_tx[CAMERA_VIEWFRAME_NUM_PLANES][4]
float dist_vals[CAMERA_VIEWFRAME_NUM_PLANES]
float clip_end
char panorama_type
char sensor_fit
float sensor_y
float latitude_max
float fisheye_polynomial_k3
float longitude_max
struct ListBase bg_images
float fisheye_polynomial_k1
float latitude_min
float fisheye_polynomial_k2
struct CameraStereoSettings stereo
float fisheye_fov
float fisheye_polynomial_k0
float fisheye_polynomial_k4
float sensor_x
float clip_start
float fisheye_lens
float longitude_min
struct CameraDOFSettings dof
float ortho_scale
Definition DNA_ID.h:413
char name[66]
Definition DNA_ID.h:425
float spotsize
void * first
struct bPose * pose
struct Object * camera
float clip_start
float pose_mat[4][4]
float xmax
float xmin
float ymax
float ymin
#define N_(msgid)
uint8_t flag
Definition wm_window.cc:138