12 #define DNA_DEPRECATED_ALLOW
133 bgpic->iuser.scene =
NULL;
171 .struct_size =
sizeof(
Camera),
173 .name_plural =
"cameras",
176 .asset_type_info =
NULL,
183 .foreach_cache =
NULL,
184 .foreach_path =
NULL,
192 .blend_read_undo_preserve =
NULL,
194 .lib_override_apply_post =
NULL,
219 float view_dir[3], dof_dir[3];
249 if (sizex >= sizey) {
277 params->clip_start = 0.1f;
278 params->clip_end = 100.0f;
311 if (
params->lens == 0.0f) {
368 float pixsize, viewfac, sensor_size, dx, dy;
371 params->ycor = aspy / aspx;
376 pixsize =
params->ortho_scale;
381 pixsize = (sensor_size *
params->clip_start) /
params->lens;
391 viewfac =
params->ycor * winy;
410 viewplane.
xmin += dx;
411 viewplane.
ymin += dy;
412 viewplane.
xmax += dx;
413 viewplane.
ymax += dy;
417 viewplane.
xmin *= pixsize;
418 viewplane.
xmax *= pixsize;
419 viewplane.
ymin *= pixsize;
420 viewplane.
ymax *= pixsize;
426 params->viewplane = viewplane;
462 const float drawsize,
464 const float scale[3],
481 r_asp[1] = aspy / aspx;
484 r_asp[0] = aspx / aspy;
494 facx = 0.5f *
camera->ortho_scale * r_asp[0] * scale[0];
495 facy = 0.5f *
camera->ortho_scale * r_asp[1] * scale[1];
496 r_shift[0] =
camera->shiftx *
camera->ortho_scale * scale[0];
497 r_shift[1] =
camera->shifty *
camera->ortho_scale * scale[1];
498 depth = -drawsize * scale[2];
500 *r_drawsize = 0.5f *
camera->ortho_scale;
504 float fac, scale_x, scale_y;
510 *r_drawsize = (drawsize / 2.0f) / ((scale[0] + scale[1] + scale[2]) / 3.0f);
511 depth = *r_drawsize *
camera->lens / (-half_sensor) * scale[2];
516 facx = fac * r_asp[0] * scale_x;
517 facy = fac * r_asp[1] * scale_y;
518 r_shift[0] =
camera->shiftx * fac * 2.0f * scale_x;
519 r_shift[1] =
camera->shifty * fac * 2.0f * scale_y;
522 r_vec[0][0] = r_shift[0] + facx;
523 r_vec[0][1] = r_shift[1] + facy;
525 r_vec[1][0] = r_shift[0] + facx;
526 r_vec[1][1] = r_shift[1] - facy;
528 r_vec[2][0] = r_shift[0] - facx;
529 r_vec[2][1] = r_shift[1] - facy;
531 r_vec[3][0] = r_shift[0] - facx;
532 r_vec[3][1] = r_shift[1] + facy;
537 float fac = ((
camera->clip_start + 0.1f) / -r_vec[0][2]) * scale[2];
538 for (
uint i = 0; i < 4; i++) {
552 float dummy_shift[2];
553 float dummy_drawsize;
554 const float dummy_scale[3] = {1.0f, 1.0f, 1.0f};
557 scene,
camera, 1.0,
false, dummy_scale, dummy_asp, dummy_shift, &dummy_drawsize, r_vec);
566 #define CAMERA_VIEWFRAME_NUM_PLANES 4
595 if (
data->do_zrange) {
606 const bool do_clip_dists,
610 float camera_rotmat_transposed_inversed[4][4];
631 copy_m4_m3(camera_rotmat_transposed_inversed,
data->camera_rotmat);
633 invert_m4(camera_rotmat_transposed_inversed);
646 mul_m4_v4(camera_rotmat_transposed_inversed,
data->plane_tx[i]);
650 data->dist_vals[i] = FLT_MAX;
654 data->do_zrange =
params->is_ortho || do_clip_dists;
656 if (
data->do_zrange) {
659 data->z_range[0] = FLT_MAX;
660 data->z_range[1] = -FLT_MAX;
673 if (
data->tot <= 1) {
678 const float *cam_axis_x =
data->camera_rotmat[0];
679 const float *cam_axis_y =
data->camera_rotmat[1];
680 const float *cam_axis_z =
data->camera_rotmat[2];
681 const float *dists =
data->dist_vals;
682 const float dist_span_y = dists[
Y_MIN] + dists[
Y_MAX];
683 const float dist_span_z = dists[
Z_MIN] + dists[
Z_MAX];
684 const float dist_mid_y = (dists[
Y_MIN] - dists[
Y_MAX]) * 0.5f;
685 const float dist_mid_z = (dists[
Z_MIN] - dists[
Z_MAX]) * 0.5f;
686 const float scale_diff = (dist_span_z < dist_span_y) ?
692 *r_scale =
params->ortho_scale - scale_diff;
700 float plane_isect_1[3], plane_isect_1_no[3], plane_isect_1_other[3];
701 float plane_isect_2[3], plane_isect_2_no[3], plane_isect_2_other[3];
703 float plane_isect_pt_1[3], plane_isect_pt_2[3];
713 plane_tx[
Y_MIN], plane_tx[
Y_MAX], plane_isect_1, plane_isect_1_no)) ||
715 plane_tx[
Z_MIN], plane_tx[
Z_MAX], plane_isect_2, plane_isect_2_no))) {
719 add_v3_v3v3(plane_isect_1_other, plane_isect_1, plane_isect_1_no);
720 add_v3_v3v3(plane_isect_2_other, plane_isect_2, plane_isect_2_no);
731 float cam_plane_no[3];
732 float plane_isect_delta[3];
741 sub_v3_v3v3(plane_isect_delta, plane_isect_pt_2, plane_isect_pt_1);
742 const float plane_isect_delta_len =
len_v3(plane_isect_delta);
744 if (
dot_v3v3(plane_isect_delta, cam_plane_no) > 0.0f) {
749 madd_v3_v3fl(r_co, plane_isect_1_no,
params->shifty * plane_isect_delta_len * shift_fac);
756 madd_v3_v3fl(r_co, plane_isect_2_no,
params->shiftx * plane_isect_delta_len * shift_fac);
760 if (r_clip_start && r_clip_end) {
762 *r_clip_start =
data->z_range[0] - z_offs;
763 *r_clip_end =
data->z_range[1] - z_offs;
793 &
params, &data_cb, r_co, r_scale, r_clip_start, r_clip_end);
797 const float (*
cos)[3],
834 float r_modelmat[4][4])
837 float interocular_distance, convergence_distance;
838 short convergence_mode, pivot;
844 interocular_distance =
data->stereo.interocular_distance;
845 convergence_distance =
data->stereo.convergence_distance;
846 convergence_mode =
data->stereo.convergence_mode;
847 pivot =
data->stereo.pivot;
862 fac_signed =
is_left ? fac : -fac;
867 float angle_sin, angle_cos;
868 float toeinmat[4][4];
875 fac_signed = -fac_signed;
878 angle =
atanf((interocular_distance * 0.5f) / convergence_distance) / fac;
883 rotmat[0][0] = angle_cos;
884 rotmat[2][0] = -angle_sin;
885 rotmat[0][2] = angle_sin;
886 rotmat[2][2] = angle_cos;
892 toeinmat[3][0] = interocular_distance * fac_signed;
908 toeinmat[3][0] = -interocular_distance * fac_signed;
922 translate_m4(r_modelmat, -interocular_distance * fac_signed, 0.0f, 0.0f);
932 float r_viewmat[4][4])
942 if (viewname && viewname[0] !=
'\0') {
950 const char *viewname,
951 float r_modelmat[4][4])
959 const char *viewname,
960 float r_modelmat[4][4])
978 const char *viewname,
979 float r_winmat[4][4])
1000 if (!is_multiview) {
1021 const char *camera_name =
camera->id.name + 2;
1022 const int len_name = strlen(camera_name);
1023 int len_suffix_max = -1;
1029 const int len_suffix = strlen(srv->suffix);
1031 if ((len_suffix < len_suffix_max) || (len_name < len_suffix)) {
1035 if (
STREQ(camera_name + (len_name - len_suffix), srv->suffix)) {
1036 BLI_snprintf(name,
sizeof(name),
"%.*s%s", (len_name - len_suffix), camera_name, suffix);
1037 len_suffix_max = len_suffix;
1041 if (name[0] !=
'\0') {
1055 if (!is_multiview) {
1069 float shift =
data->shiftx;
1070 float interocular_distance, convergence_distance;
1071 short convergence_mode, pivot;
1077 if (viewname && viewname[0]) {
1081 interocular_distance =
data->stereo.interocular_distance;
1082 convergence_distance =
data->stereo.convergence_distance;
1083 convergence_mode =
data->stereo.convergence_mode;
1084 pivot =
data->stereo.pivot;
1098 fac_signed =
is_left ? fac : -fac;
1099 shift += ((interocular_distance /
data->sensor_x) * (
data->lens / convergence_distance)) *
1107 const char *viewname)
1114 if (!is_multiview) {
1115 return data->shiftx;
1118 return data->shiftx;
1121 return data->shiftx;
1130 const char *viewname)
1147 bgpic->
scale = 1.0f;
1148 bgpic->
alpha = 0.5f;
typedef float(TangentPoint)[2]
Blender kernel action and pose functionality.
struct bPoseChannel * BKE_pose_channel_find_name(const struct bPose *pose, const char *name)
void BKE_animdata_blend_read_data(struct BlendDataReader *reader, struct AnimData *adt)
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
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
@ LIB_ID_COPY_NO_LIB_OVERRIDE_LOCAL_DATA_FLAG
@ LIB_ID_CREATE_NO_USER_REFCOUNT
void id_us_plus(struct ID *id)
void BKE_id_blend_write(struct BlendWriter *writer, struct ID *id)
void * BKE_id_new(struct Main *bmain, short type, const char *name)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(_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)
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])
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 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)
#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 ID_IS_LINKED(_id)
@ CAM_BGIMG_FLAG_OVERRIDE_LIBRARY_LOCAL
@ CAM_BGIMG_FLAG_EXPANDED
#define DEFAULT_SENSOR_HEIGHT
#define DEFAULT_SENSOR_WIDTH
#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
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
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])
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)
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_blend_read_lib(BlendLibReader *reader, ID *id)
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)
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)
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)
static void camera_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int flag)
CameraBGImage * BKE_camera_background_image_copy(CameraBGImage *bgpic_src, const int flag)
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)
float BKE_camera_object_dof_distance(const Object *ob)
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)
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)
CameraBGImage * BKE_camera_background_image_new(Camera *cam)
struct CameraViewFrameData CameraViewFrameData
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_dupallocN)(const 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 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]
struct ListBase bg_images
struct CameraStereoSettings stereo
struct CameraDOFSettings dof