13#define DNA_DEPRECATED_ALLOW
74 std::optional<Library *> ,
141 auto cycles_data_ensure = [](
IDProperty *group) {
151 auto cycles_property_int_set = [](
IDProperty *idprop,
const char *
name,
int value) {
160 auto cycles_property_float_set = [](
IDProperty *idprop,
const char *
name,
float value) {
177 IDProperty *cycles_cam = cycles_data_ensure(idprop_temp);
178 cycles_property_int_set(cycles_cam,
"panorama_type", cam->
panorama_type);
179 cycles_property_float_set(cycles_cam,
"fisheye_fov", cam->
fisheye_fov);
180 cycles_property_float_set(cycles_cam,
"fisheye_lens", cam->
fisheye_lens);
181 cycles_property_float_set(cycles_cam,
"latitude_min", cam->
latitude_min);
182 cycles_property_float_set(cycles_cam,
"latitude_max", cam->
latitude_max);
183 cycles_property_float_set(cycles_cam,
"longitude_min", cam->
longitude_min);
184 cycles_property_float_set(cycles_cam,
"longitude_max", cam->
longitude_max);
191 id->system_properties = idprop_temp;
193 return {idprop_prev, idprop_temp};
199 id->system_properties =
data.idprop_prev;
200 data.idprop_prev =
nullptr;
202 if (
data.idprop_temp) {
204 data.idprop_temp =
nullptr;
242 bgpic->iuser.scene =
nullptr;
306 float view_dir[3], dof_dir[3];
313 sub_v3_v3v3(dof_dir, ob->object_to_world().location(), posemat[3]);
317 ob->object_to_world().location(),
338 if (sizex >= sizey) {
366 params->clip_start = 0.1f;
367 params->clip_end = 100.0f;
400 if (
params->lens == 0.0f) {
457 float pixsize, viewfac, sensor_size, dx, dy;
460 params->ycor = aspy / aspx;
465 pixsize =
params->ortho_scale;
470 pixsize = (sensor_size *
params->clip_start) /
params->lens;
480 viewfac =
params->ycor * winy;
499 viewplane.
xmin += dx;
500 viewplane.
ymin += dy;
501 viewplane.
xmax += dx;
502 viewplane.
ymax += dy;
512 params->viewplane = viewplane;
520 viewplane->
xmin += pix_size_x * region->
xmin;
521 viewplane->
ymin += pix_size_y * region->
ymin;
560 const float drawsize,
562 const float scale[3],
579 r_asp[1] = aspy / aspx;
582 r_asp[0] = aspx / aspy;
592 facx = 0.5f * camera->
ortho_scale * r_asp[0] * scale[0];
593 facy = 0.5f * camera->
ortho_scale * r_asp[1] * scale[1];
596 depth = -drawsize * scale[2];
602 float fac, scale_x, scale_y;
608 *r_drawsize = (drawsize / 2.0f) / ((scale[0] + scale[1] + scale[2]) / 3.0f);
609 depth = *r_drawsize * camera->
lens / (-half_sensor) * scale[2];
614 facx = fac * r_asp[0] * scale_x;
615 facy = fac * r_asp[1] * scale_y;
616 r_shift[0] = camera->
shiftx * fac * 2.0f * scale_x;
617 r_shift[1] = camera->
shifty * fac * 2.0f * scale_y;
620 r_vec[0][0] = r_shift[0] + facx;
621 r_vec[0][1] = r_shift[1] + facy;
623 r_vec[1][0] = r_shift[0] + facx;
624 r_vec[1][1] = r_shift[1] - facy;
626 r_vec[2][0] = r_shift[0] - facx;
627 r_vec[2][1] = r_shift[1] - facy;
629 r_vec[3][0] = r_shift[0] - facx;
630 r_vec[3][1] = r_shift[1] + facy;
635 float fac = ((camera->
clip_start + 0.1f) / -r_vec[0][2]) * scale[2];
650 float dummy_shift[2];
651 float dummy_drawsize;
652 const float dummy_scale[3] = {1.0f, 1.0f, 1.0f};
655 scene, camera, 1.0,
false, dummy_scale, dummy_asp, dummy_shift, &dummy_drawsize, r_vec);
664#define CAMERA_VIEWFRAME_NUM_PLANES 4
693 if (
data->do_zrange) {
704 const bool do_clip_dists,
708 float camera_rotmat_transposed_inversed[4][4];
729 copy_m4_m3(camera_rotmat_transposed_inversed,
data->camera_rotmat);
731 invert_m4(camera_rotmat_transposed_inversed);
752 data->do_zrange =
params->is_ortho || do_clip_dists;
754 if (
data->do_zrange) {
771 if (
data->tot <= 1) {
776 const float *cam_axis_x =
data->camera_rotmat[0];
777 const float *cam_axis_y =
data->camera_rotmat[1];
778 const float *cam_axis_z =
data->camera_rotmat[2];
779 const float *dists =
data->dist_vals;
780 const float dist_span_y = dists[
Y_MIN] + dists[
Y_MAX];
781 const float dist_span_z = dists[
Z_MIN] + dists[
Z_MAX];
782 const float dist_mid_y = (dists[
Y_MIN] - dists[
Y_MAX]) * 0.5f;
783 const float dist_mid_z = (dists[
Z_MIN] - dists[
Z_MAX]) * 0.5f;
784 const float scale_diff = (dist_span_z < dist_span_y) ?
790 *r_scale =
params->ortho_scale - scale_diff;
798 float plane_isect_1[3], plane_isect_1_no[3], plane_isect_1_other[3];
799 float plane_isect_2[3], plane_isect_2_no[3], plane_isect_2_other[3];
801 float plane_isect_pt_1[3], plane_isect_pt_2[3];
816 add_v3_v3v3(plane_isect_1_other, plane_isect_1, plane_isect_1_no);
817 add_v3_v3v3(plane_isect_2_other, plane_isect_2, plane_isect_2_no);
829 float cam_plane_no[3];
830 float plane_isect_delta[3];
839 sub_v3_v3v3(plane_isect_delta, plane_isect_pt_2, plane_isect_pt_1);
840 const float plane_isect_delta_len =
len_v3(plane_isect_delta);
842 if (
dot_v3v3(plane_isect_delta, cam_plane_no) > 0.0f) {
847 madd_v3_v3fl(r_co, plane_isect_1_no,
params->shifty * plane_isect_delta_len * shift_fac);
854 madd_v3_v3fl(r_co, plane_isect_2_no,
params->shiftx * plane_isect_delta_len * shift_fac);
858 if (r_clip_start && r_clip_end) {
860 *r_clip_start =
data->z_range[0] - z_offs;
861 *r_clip_end =
data->z_range[1] - z_offs;
891 &
params, &data_cb, r_co, r_scale, r_clip_start, r_clip_end);
895 const float (*
cos)[3],
927 copy_m4_m4(r_modelmat, camera->object_to_world().ptr());
932 float r_modelmat[4][4])
935 float interocular_distance, convergence_distance;
936 short convergence_mode, pivot;
942 interocular_distance =
data->stereo.interocular_distance;
943 convergence_distance =
data->stereo.convergence_distance;
944 convergence_mode =
data->stereo.convergence_mode;
945 pivot =
data->stereo.pivot;
960 fac_signed =
is_left ? fac : -fac;
965 float angle_sin, angle_cos;
966 float toeinmat[4][4];
973 fac_signed = -fac_signed;
976 angle =
atanf((interocular_distance * 0.5f) / convergence_distance) / fac;
981 rotmat[0][0] = angle_cos;
982 rotmat[2][0] = -angle_sin;
983 rotmat[0][2] = angle_sin;
984 rotmat[2][2] = angle_cos;
990 toeinmat[3][0] = interocular_distance * fac_signed;
1006 toeinmat[3][0] = -interocular_distance * fac_signed;
1020 translate_m4(r_modelmat, -interocular_distance * fac_signed, 0.0f, 0.0f);
1030 float r_viewmat[4][4])
1040 if (viewname && viewname[0] !=
'\0') {
1048 const char *viewname,
1049 float r_modelmat[4][4])
1057 const char *viewname,
1058 float r_modelmat[4][4])
1062 if (!is_multiview) {
1076 const char *viewname,
1077 float r_winmat[4][4])
1097 if (!is_multiview) {
1120 const char *camera_name = camera->
id.
name + 2;
1121 const int len_name = strlen(camera_name);
1122 int len_suffix_max = -1;
1128 const int len_suffix = strlen(srv->suffix);
1130 if ((len_suffix < len_suffix_max) || (len_name < len_suffix)) {
1134 if (
STREQ(camera_name + (len_name - len_suffix), srv->suffix)) {
1135 SNPRINTF(
name,
"%.*s%s", (len_name - len_suffix), camera_name, suffix);
1136 len_suffix_max = len_suffix;
1140 if (
name[0] !=
'\0') {
1142 if (ob !=
nullptr) {
1154 if (!is_multiview) {
1168 float shift =
data->shiftx;
1169 float interocular_distance, convergence_distance;
1170 short convergence_mode, pivot;
1176 if (viewname && viewname[0]) {
1180 interocular_distance =
data->stereo.interocular_distance;
1181 convergence_distance =
data->stereo.convergence_distance;
1182 convergence_mode =
data->stereo.convergence_mode;
1183 pivot =
data->stereo.pivot;
1197 fac_signed =
is_left ? fac : -fac;
1198 shift += ((interocular_distance /
data->sensor_x) * (
data->lens / convergence_distance)) *
1206 const char *viewname)
1213 if (!is_multiview) {
1214 return data->shiftx;
1217 return data->shiftx;
1220 return data->shiftx;
1229 const char *viewname)
1246 bgpic->
scale = 1.0f;
1247 bgpic->
alpha = 0.5f;
1261 bgpic_dst->
next = bgpic_dst->
prev =
nullptr;
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_find_name(const bPose *pose, const char *name)
bool BKE_bpath_foreach_path_fixed_process(BPathForeachPathData *bpath_data, char *path, size_t path_maxncpy)
Camera data-block and utility functions.
#define CAMERA_PARAM_ZOOM_INIT_PERSP
#define CAMERA_PARAM_ZOOM_INIT_CAMOB
IDProperty * IDP_ID_system_properties_ensure(ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
IDProperty * IDP_ID_system_properties_get(ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
IDProperty * IDP_GetPropertyTypeFromGroup(const IDProperty *prop, blender::StringRef name, char type) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_FreeProperty(IDProperty *prop)
#define IDP_int_set(prop, value)
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define IDP_float_set(prop, value)
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
void * BKE_id_new(Main *bmain, short type, const char *name)
@ LIB_ID_COPY_NO_LIB_OVERRIDE_LOCAL_DATA_FLAG
@ LIB_ID_CREATE_NO_USER_REFCOUNT
void BKE_id_blend_write(BlendWriter *writer, ID *id)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
LibraryForeachIDFlag BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
@ IDWALK_DO_DEPRECATED_POINTERS
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)
const char * BKE_scene_multiview_view_suffix_get(const RenderData *rd, const char *viewname)
float BKE_screen_view3d_zoom_to_fac(float camzoom)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
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])
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 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()
void unit_m4(float m[4][4])
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)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
void BLI_rctf_mul(struct rctf *rect, float factor)
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
#define SNPRINTF(dst, format,...)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_string(BlendDataReader *reader, char **ptr_p)
void BLO_write_string(BlendWriter *writer, const char *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)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
ID and Library types, which are fundamental for SDNA.
#define ID_IS_LINKED(_id)
#define DEFAULT_SENSOR_HEIGHT
#define DEFAULT_SENSOR_WIDTH
@ CAM_BGIMG_FLAG_CAMERA_ASPECT
@ CAM_BGIMG_FLAG_OVERRIDE_LIBRARY_LOCAL
@ CAM_BGIMG_FLAG_EXPANDED
#define DNA_struct_default_get(struct_name)
Object is a sort of wrapper for general info.
#define STEREO_RIGHT_NAME
@ SCE_VIEWS_FORMAT_STEREO_3D
@ SCE_VIEWS_FORMAT_MULTIVIEW
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Read Guarded memory(de)allocation.
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)
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)
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)
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_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)
Camera * BKE_camera_add(Main *bmain, const char *name)
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_foreach_path(ID *id, BPathForeachPathData *bpath_data)
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)
BMesh const char void * data
BPy_StructRNA * depsgraph
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static float is_left(const float2 &p0, const float2 &p1, const float2 &p2)
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef 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(StringRef prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
struct CameraBGImage * next
struct CameraBGImage * prev
struct Object * focus_object
float camera_rotmat[3][3]
float plane_tx[CAMERA_VIEWFRAME_NUM_PLANES][4]
float dist_vals[CAMERA_VIEWFRAME_NUM_PLANES]
float fisheye_polynomial_k3
struct ListBase bg_images
float fisheye_polynomial_k1
float fisheye_polynomial_k2
struct Text * custom_shader
struct CameraStereoSettings stereo
char custom_filepath[1024]
float fisheye_polynomial_k0
float fisheye_polynomial_k4
struct CameraDOFSettings dof