14#define DNA_DEPRECATED_ALLOW
73 std::optional<Library *> ,
122 auto cycles_data_ensure = [](
IDProperty *group) {
132 auto cycles_property_int_set = [](
IDProperty *idprop,
const char *name,
int value) {
141 auto cycles_property_float_set = [](
IDProperty *idprop,
const char *name,
float value) {
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);
171 id->properties = idprop_temp;
173 return {idprop_prev, idprop_temp};
179 id->properties = data.idprop_prev;
180 data.idprop_prev =
nullptr;
182 if (data.idprop_temp) {
184 data.idprop_temp =
nullptr;
218 bgpic->iuser.scene =
nullptr;
222 bgpic->flag &= ~CAM_BGIMG_FLAG_OVERRIDE_LIBRARY_LOCAL;
279 float view_dir[3], dof_dir[3];
286 sub_v3_v3v3(dof_dir, ob->object_to_world().location(), posemat[3]);
290 ob->object_to_world().location(),
311 if (sizex >= sizey) {
339 params->clip_start = 0.1f;
340 params->clip_end = 100.0f;
373 if (
params->lens == 0.0f) {
430 float pixsize, viewfac, sensor_size, dx, dy;
433 params->ycor = aspy / aspx;
438 pixsize =
params->ortho_scale;
443 pixsize = (sensor_size *
params->clip_start) /
params->lens;
453 viewfac =
params->ycor * winy;
472 viewplane.
xmin += dx;
473 viewplane.
ymin += dy;
474 viewplane.
xmax += dx;
475 viewplane.
ymax += dy;
485 params->viewplane = viewplane;
493 viewplane->
xmin += pix_size_x * region->xmin;
494 viewplane->
ymin += pix_size_y * region->ymin;
533 const float drawsize,
535 const float scale[3],
546 float aspx =
float(scene->r.xsch) * scene->r.xasp;
547 float aspy =
float(scene->r.ysch) * scene->r.yasp;
552 r_asp[1] = aspy / aspx;
555 r_asp[0] = aspx / aspy;
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];
571 *r_drawsize = 0.5f * camera->ortho_scale;
575 float fac, scale_x, scale_y;
581 *r_drawsize = (drawsize / 2.0f) / ((scale[0] + scale[1] + scale[2]) / 3.0f);
582 depth = *r_drawsize * camera->lens / (-half_sensor) * scale[2];
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;
593 r_vec[0][0] = r_shift[0] + facx;
594 r_vec[0][1] = r_shift[1] + facy;
596 r_vec[1][0] = r_shift[0] + facx;
597 r_vec[1][1] = r_shift[1] - facy;
599 r_vec[2][0] = r_shift[0] - facx;
600 r_vec[2][1] = r_shift[1] - facy;
602 r_vec[3][0] = r_shift[0] - facx;
603 r_vec[3][1] = r_shift[1] + facy;
608 float fac = ((camera->clip_start + 0.1f) / -r_vec[0][2]) * scale[2];
609 for (
uint i = 0; i < 4; i++) {
623 float dummy_shift[2];
624 float dummy_drawsize;
625 const float dummy_scale[3] = {1.0f, 1.0f, 1.0f};
628 scene, camera, 1.0,
false, dummy_scale, dummy_asp, dummy_shift, &dummy_drawsize, r_vec);
637#define CAMERA_VIEWFRAME_NUM_PLANES 4
666 if (data->do_zrange) {
667 const float d =
dot_v3v3(data->camera_no, co);
677 const bool do_clip_dists,
681 float camera_rotmat_transposed_inversed[4][4];
690 params, scene->r.xsch, scene->r.ysch, scene->r.xasp, scene->r.yasp);
698 copy_m3_m4(data->camera_rotmat, (
float(*)[4])ob->object_to_world().ptr());
702 copy_m4_m3(camera_rotmat_transposed_inversed, data->camera_rotmat);
704 invert_m4(camera_rotmat_transposed_inversed);
708 data->plane_tx[
Y_MIN],
709 data->plane_tx[
Y_MAX],
710 data->plane_tx[
Z_MIN],
711 data->plane_tx[
Z_MAX],
717 mul_m4_v4(camera_rotmat_transposed_inversed, data->plane_tx[i]);
719 data->plane_tx[i][3] /=
normalize_v3(data->plane_tx[i]);
725 data->do_zrange =
params->is_ortho || do_clip_dists;
727 if (data->do_zrange) {
744 if (data->tot <= 1) {
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) ?
763 *r_scale =
params->ortho_scale - scale_diff;
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];
774 float plane_isect_pt_1[3], plane_isect_pt_2[3];
779 mul_v3_v3fl(co, data->plane_tx[i], data->dist_vals[i]);
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);
802 float cam_plane_no[3];
803 float plane_isect_delta[3];
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);
815 if (
dot_v3v3(plane_isect_delta, cam_plane_no) > 0.0f) {
820 madd_v3_v3fl(r_co, plane_isect_1_no,
params->shifty * plane_isect_delta_len * shift_fac);
827 madd_v3_v3fl(r_co, plane_isect_2_no,
params->shiftx * plane_isect_delta_len * shift_fac);
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;
864 &
params, &data_cb, r_co, r_scale, r_clip_start, r_clip_end);
868 const float (*
cos)[3],
900 copy_m4_m4(r_modelmat, camera->object_to_world().ptr());
905 float r_modelmat[4][4])
908 float interocular_distance, convergence_distance;
909 short convergence_mode, pivot;
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;
933 fac_signed =
is_left ? fac : -fac;
938 float angle_sin, angle_cos;
939 float toeinmat[4][4];
946 fac_signed = -fac_signed;
949 angle =
atanf((interocular_distance * 0.5f) / convergence_distance) / fac;
951 angle_cos =
cosf(angle * fac_signed);
952 angle_sin =
sinf(angle * fac_signed);
954 rotmat[0][0] = angle_cos;
955 rotmat[2][0] = -angle_sin;
956 rotmat[0][2] = angle_sin;
957 rotmat[2][2] = angle_cos;
963 toeinmat[3][0] = interocular_distance * fac_signed;
979 toeinmat[3][0] = -interocular_distance * fac_signed;
993 translate_m4(r_modelmat, -interocular_distance * fac_signed, 0.0f, 0.0f);
1003 float r_viewmat[4][4])
1013 if (viewname && viewname[0] !=
'\0') {
1021 const char *viewname,
1022 float r_modelmat[4][4])
1030 const char *viewname,
1031 float r_modelmat[4][4])
1035 if (!is_multiview) {
1049 const char *viewname,
1050 float r_winmat[4][4])
1070 if (!is_multiview) {
1078 const Camera *cam =
static_cast<const Camera *
>(camera->data);
1092 const char *camera_name = camera->
id.
name + 2;
1093 const int len_name = strlen(camera_name);
1094 int len_suffix_max = -1;
1100 const int len_suffix = strlen(srv->suffix);
1102 if ((len_suffix < len_suffix_max) || (len_name < len_suffix)) {
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;
1112 if (name[0] !=
'\0') {
1114 if (ob !=
nullptr) {
1124 const bool is_multiview = (camera !=
nullptr) && (scene->r.scemode &
R_MULTIVIEW) != 0;
1126 if (!is_multiview) {
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;
1148 if (viewname && viewname[0]) {
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;
1169 fac_signed =
is_left ? fac : -fac;
1170 shift += ((interocular_distance / data->sensor_x) * (data->lens / convergence_distance)) *
1178 const char *viewname)
1181 const Camera *data =
static_cast<const Camera *
>(camera->data);
1185 if (!is_multiview) {
1186 return data->shiftx;
1189 return data->shiftx;
1192 return data->shiftx;
1201 const char *viewname)
1219 bgpic->
scale = 1.0f;
1220 bgpic->
alpha = 0.5f;
1233 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)
Camera data-block and utility functions.
#define CAMERA_PARAM_ZOOM_INIT_PERSP
#define CAMERA_PARAM_ZOOM_INIT_CAMOB
void IDP_FreeProperty(IDProperty *prop)
IDProperty * IDP_GetPropertyTypeFromGroup(const IDProperty *prop, const char *name, char type) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
IDProperty * IDP_EnsureProperties(ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
IDProperty * IDP_GetProperties(ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
@ LIB_ID_COPY_NO_LIB_OVERRIDE_LOCAL_DATA_FLAG
@ LIB_ID_CREATE_NO_USER_REFCOUNT
void * BKE_id_new(Main *bmain, short type, const char *name)
void BKE_id_blend_write(BlendWriter *writer, ID *id)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
int BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
@ 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)
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(struct ListBase *lb)
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)
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 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 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)
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)
#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 ID_IS_LINKED(_id)
#define DEFAULT_SENSOR_HEIGHT
@ CAM_BGIMG_FLAG_OVERRIDE_LIBRARY_LOCAL
@ 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
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
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)
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_add(Main *bmain, const char *name)
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)
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
draw_view in_light_buf[] float
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
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.
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 CameraStereoSettings stereo
float fisheye_polynomial_k0
float fisheye_polynomial_k4
struct CameraDOFSettings dof