28 #define DNA_DEPRECATED_ALLOW
150 bgpic->iuser.scene =
NULL;
187 .struct_size =
sizeof(
Camera),
189 .name_plural =
"cameras",
198 .foreach_cache =
NULL,
206 .blend_read_undo_preserve =
NULL,
208 .lib_override_apply_post =
NULL,
234 float view_dir[3], dof_dir[3];
255 if (sizex >= sizey) {
283 params->clip_start = 0.1f;
284 params->clip_end = 100.0f;
317 if (
params->lens == 0.0f) {
374 float pixsize, viewfac, sensor_size, dx, dy;
377 params->ycor = aspy / aspx;
382 pixsize =
params->ortho_scale;
387 pixsize = (sensor_size *
params->clip_start) /
params->lens;
397 viewfac =
params->ycor * winy;
416 viewplane.
xmin += dx;
417 viewplane.
ymin += dy;
418 viewplane.
xmax += dx;
419 viewplane.
ymax += dy;
423 viewplane.
xmin *= pixsize;
424 viewplane.
xmax *= pixsize;
425 viewplane.
ymin *= pixsize;
426 viewplane.
ymax *= pixsize;
432 params->viewplane = viewplane;
469 const float drawsize,
471 const float scale[3],
488 r_asp[1] = aspy / aspx;
491 r_asp[0] = aspx / aspy;
501 facx = 0.5f * camera->
ortho_scale * r_asp[0] * scale[0];
502 facy = 0.5f * camera->
ortho_scale * r_asp[1] * scale[1];
505 depth = -drawsize * scale[2];
511 float fac, scale_x, scale_y;
517 *r_drawsize = (drawsize / 2.0f) / ((scale[0] + scale[1] + scale[2]) / 3.0f);
518 depth = *r_drawsize * camera->
lens / (-half_sensor) * scale[2];
523 facx = fac * r_asp[0] * scale_x;
524 facy = fac * r_asp[1] * scale_y;
525 r_shift[0] = camera->
shiftx * fac * 2.0f * scale_x;
526 r_shift[1] = camera->
shifty * fac * 2.0f * scale_y;
529 r_vec[0][0] = r_shift[0] + facx;
530 r_vec[0][1] = r_shift[1] + facy;
532 r_vec[1][0] = r_shift[0] + facx;
533 r_vec[1][1] = r_shift[1] - facy;
535 r_vec[2][0] = r_shift[0] - facx;
536 r_vec[2][1] = r_shift[1] - facy;
538 r_vec[3][0] = r_shift[0] - facx;
539 r_vec[3][1] = r_shift[1] + facy;
544 float fac = (camera->
clip_start + 0.1f) / -r_vec[0][2];
545 for (
uint i = 0; i < 4; i++) {
559 float dummy_shift[2];
560 float dummy_drawsize;
561 const float dummy_scale[3] = {1.0f, 1.0f, 1.0f};
564 scene, camera, 1.0,
false, dummy_scale, dummy_asp, dummy_shift, &dummy_drawsize, r_vec);
573 #define CAMERA_VIEWFRAME_NUM_PLANES 4
599 if (
data->is_ortho) {
612 float camera_rotmat_transposed_inversed[4][4];
633 copy_m4_m3(camera_rotmat_transposed_inversed,
data->camera_rotmat);
635 invert_m4(camera_rotmat_transposed_inversed);
650 mul_m4_v4(camera_rotmat_transposed_inversed,
data->plane_tx[i]);
660 data->dist_to_cam = FLT_MAX;
671 if (
data->tot <= 1) {
676 const float *cam_axis_x =
data->camera_rotmat[0];
677 const float *cam_axis_y =
data->camera_rotmat[1];
678 const float *cam_axis_z =
data->camera_rotmat[2];
687 if ((dists[0] + dists[2]) > (dists[1] + dists[3])) {
688 scale_diff = (dists[1] + dists[3]) *
692 scale_diff = (dists[0] + dists[2]) *
695 *r_scale =
params->ortho_scale - scale_diff;
698 madd_v3_v3fl(r_co, cam_axis_x, (dists[2] - dists[0]) * 0.5f +
params->shiftx * scale_diff);
699 madd_v3_v3fl(r_co, cam_axis_y, (dists[1] - dists[3]) * 0.5f +
params->shifty * scale_diff);
705 float plane_isect_1[3], plane_isect_1_no[3], plane_isect_1_other[3];
706 float plane_isect_2[3], plane_isect_2_no[3], plane_isect_2_other[3];
708 float plane_isect_pt_1[3], plane_isect_pt_2[3];
722 add_v3_v3v3(plane_isect_1_other, plane_isect_1, plane_isect_1_no);
723 add_v3_v3v3(plane_isect_2_other, plane_isect_2, plane_isect_2_no);
730 plane_isect_pt_2) != 0) {
731 float cam_plane_no[3];
732 float plane_isect_delta[3];
733 float plane_isect_delta_len;
742 sub_v3_v3v3(plane_isect_delta, plane_isect_pt_2, plane_isect_pt_1);
743 plane_isect_delta_len =
len_v3(plane_isect_delta);
745 if (
dot_v3v3(plane_isect_delta, cam_plane_no) > 0.0f) {
750 madd_v3_v3fl(r_co, plane_isect_1_no,
params->shifty * plane_isect_delta_len * shift_fac);
757 madd_v3_v3fl(r_co, plane_isect_2_no,
params->shiftx * plane_isect_delta_len * shift_fac);
786 const float (*
cos)[3],
823 float r_modelmat[4][4])
826 float interocular_distance, convergence_distance;
827 short convergence_mode, pivot;
833 interocular_distance =
data->stereo.interocular_distance;
834 convergence_distance =
data->stereo.convergence_distance;
835 convergence_mode =
data->stereo.convergence_mode;
836 pivot =
data->stereo.pivot;
851 fac_signed =
is_left ? fac : -fac;
856 float angle_sin, angle_cos;
857 float toeinmat[4][4];
864 fac_signed = -fac_signed;
867 angle =
atanf((interocular_distance * 0.5f) / convergence_distance) / fac;
872 rotmat[0][0] = angle_cos;
873 rotmat[2][0] = -angle_sin;
874 rotmat[0][2] = angle_sin;
875 rotmat[2][2] = angle_cos;
881 toeinmat[3][0] = interocular_distance * fac_signed;
897 toeinmat[3][0] = -interocular_distance * fac_signed;
911 translate_m4(r_modelmat, -interocular_distance * fac_signed, 0.0f, 0.0f);
922 float r_viewmat[4][4])
932 if (viewname && viewname[0] !=
'\0') {
940 const char *viewname,
941 float r_modelmat[4][4])
949 const char *viewname,
950 float r_modelmat[4][4])
968 const char *viewname,
969 float r_winmat[4][4])
1011 const char *camera_name = camera->
id.
name + 2;
1012 const int len_name = strlen(camera_name);
1013 int len_suffix_max = -1;
1019 const int len_suffix = strlen(srv->suffix);
1021 if ((len_suffix < len_suffix_max) || (len_name < len_suffix)) {
1025 if (
STREQ(camera_name + (len_name - len_suffix), srv->suffix)) {
1026 BLI_snprintf(name,
sizeof(name),
"%.*s%s", (len_name - len_suffix), camera_name, suffix);
1027 len_suffix_max = len_suffix;
1031 if (name[0] !=
'\0') {
1046 if (!is_multiview) {
1060 float shift =
data->shiftx;
1061 float interocular_distance, convergence_distance;
1062 short convergence_mode, pivot;
1068 if (viewname && viewname[0]) {
1072 interocular_distance =
data->stereo.interocular_distance;
1073 convergence_distance =
data->stereo.convergence_distance;
1074 convergence_mode =
data->stereo.convergence_mode;
1075 pivot =
data->stereo.pivot;
1089 fac_signed =
is_left ? fac : -fac;
1090 shift += ((interocular_distance /
data->sensor_x) * (
data->lens / convergence_distance)) *
1098 const char *viewname)
1105 if (!is_multiview) {
1106 return data->shiftx;
1109 return data->shiftx;
1118 const char *viewname)
1135 bgpic->
scale = 1.0f;
1136 bgpic->
alpha = 0.5f;
typedef float(TangentPoint)[2]
void BKE_animdata_blend_read_data(struct BlendDataReader *reader, struct AnimData *adt)
void BKE_animdata_blend_write(struct BlendWriter *writer, struct AnimData *adt)
Camera data-block and utility functions.
#define CAMERA_PARAM_ZOOM_INIT_PERSP
#define CAMERA_PARAM_ZOOM_INIT_CAMOB
void BKE_lib_id_make_local_generic(struct Main *bmain, struct ID *id, const int flags)
void BKE_id_blend_write(struct BlendWriter *writer, struct ID *id)
void * BKE_id_new(struct Main *bmain, const short type, const char *name)
#define BKE_LIB_FOREACHID_PROCESS(_data, _id_super, _cb_flag)
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)
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)
#define LISTBASE_FOREACH(type, var, list)
void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE float sqrtf_signed(float f)
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
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])
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
void perspective_m4(float mat[4][4], const float left, const float right, const float bottom, const float top, const float nearClip, const float farClip)
void planes_from_projmat(const float mat[4][4], float left[4], float right[4], float top[4], float bottom[4], float near[4], float far[4])
float dist_signed_squared_to_plane_v3(const float p[3], const float plane[4])
void orthographic_m4(float mat[4][4], const float left, const float right, const float bottom, const float top, const float nearClip, const float farClip)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
bool invert_m4(float R[4][4])
void mul_m4_v4(const float M[4][4], float r[4])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void unit_m4(float m[4][4])
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 normalize_m4_m4(float R[4][4], const float M[4][4]) ATTR_NONNULL()
void copy_m4_m4(float m1[4][4], const float m2[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 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 void copy_v4_fl(float r[4], 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)
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#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)
#define BLO_read_id_address(reader, lib, id_ptr_p)
#define BLO_expand(expander, id)
bool BLO_write_is_undo(BlendWriter *writer)
#define BLT_I18NCONTEXT_ID_CAMERA
struct Depsgraph Depsgraph
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 DEFAULT_SENSOR_HEIGHT
@ CAM_BGIMG_FLAG_EXPANDED
#define DEFAULT_SENSOR_WIDTH
#define DNA_struct_default_get(struct_name)
Object is a sort of wrapper for general info.
@ SCE_VIEWS_FORMAT_STEREO_3D
@ SCE_VIEWS_FORMAT_MULTIVIEW
#define STEREO_RIGHT_NAME
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
static void camera_blend_read_expand(BlendExpander *expander, ID *id)
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])
static void camera_blend_read_lib(BlendLibReader *reader, ID *id)
static bool camera_is_left(const char *viewname)
static void camera_make_local(Main *bmain, ID *id, const int flags)
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])
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)
static void camera_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int UNUSED(flag))
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])
Object * BKE_camera_multiview_render(const Scene *scene, Object *camera, const char *viewname)
static bool camera_frame_fit_calc_from_data(CameraParams *params, CameraViewFrameData *data, float r_co[3], float *r_scale)
static void camera_frame_fit_data_init(const Scene *scene, const Object *ob, CameraParams *params, CameraViewFrameData *data)
static Object * camera_multiview_advanced(const Scene *scene, Object *camera, const char *suffix)
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)
void BKE_camera_background_image_clear(Camera *cam)
bool BKE_camera_view_frame_fit_to_scene(Depsgraph *depsgraph, const Scene *scene, Object *camera_ob, float r_co[3], float *r_scale)
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)
float BKE_camera_object_dof_distance(Object *ob)
static void camera_init_data(ID *id)
CameraBGImage * BKE_camera_background_image_new(Camera *cam)
struct CameraViewFrameData CameraViewFrameData
void BKE_camera_params_from_view3d(CameraParams *params, Depsgraph *depsgraph, const View3D *v3d, const RegionView3D *rv3d)
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
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
struct CameraBGImage * next
struct Object * focus_object
float dist_vals_sq[CAMERA_VIEWFRAME_NUM_PLANES]
float normal_tx[CAMERA_VIEWFRAME_NUM_PLANES][3]
float camera_rotmat[3][3]
float plane_tx[CAMERA_VIEWFRAME_NUM_PLANES][4]
struct ListBase bg_images
struct CameraStereoSettings stereo
struct CameraDOFSettings dof