VSE: Cache rewrite
[blender.git] / source / blender / makesrna / intern / rna_camera.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup RNA
19  */
20
21 #include <stdlib.h>
22
23 #include "DNA_camera_types.h"
24
25 #include "BLI_math.h"
26
27 #include "RNA_access.h"
28 #include "RNA_define.h"
29
30 #include "rna_internal.h"
31
32 #include "WM_api.h"
33 #include "WM_types.h"
34
35 #ifdef RNA_RUNTIME
36
37 #  include "BKE_camera.h"
38 #  include "BKE_object.h"
39 #  include "BKE_sequencer.h"
40
41 #  include "DEG_depsgraph.h"
42 #  include "DEG_depsgraph_build.h"
43
44 static float rna_Camera_angle_get(PointerRNA *ptr)
45 {
46   Camera *cam = ptr->id.data;
47   float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
48   return focallength_to_fov(cam->lens, sensor);
49 }
50
51 static void rna_Camera_angle_set(PointerRNA *ptr, float value)
52 {
53   Camera *cam = ptr->id.data;
54   float sensor = BKE_camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
55   cam->lens = fov_to_focallength(value, sensor);
56 }
57
58 static float rna_Camera_angle_x_get(PointerRNA *ptr)
59 {
60   Camera *cam = ptr->id.data;
61   return focallength_to_fov(cam->lens, cam->sensor_x);
62 }
63
64 static void rna_Camera_angle_x_set(PointerRNA *ptr, float value)
65 {
66   Camera *cam = ptr->id.data;
67   cam->lens = fov_to_focallength(value, cam->sensor_x);
68 }
69
70 static float rna_Camera_angle_y_get(PointerRNA *ptr)
71 {
72   Camera *cam = ptr->id.data;
73   return focallength_to_fov(cam->lens, cam->sensor_y);
74 }
75
76 static void rna_Camera_angle_y_set(PointerRNA *ptr, float value)
77 {
78   Camera *cam = ptr->id.data;
79   cam->lens = fov_to_focallength(value, cam->sensor_y);
80 }
81
82 static void rna_Camera_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
83 {
84   Camera *camera = (Camera *)ptr->id.data;
85
86   DEG_id_tag_update(&camera->id, 0);
87 }
88
89 static void rna_Camera_dependency_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
90 {
91   Camera *camera = (Camera *)ptr->id.data;
92   DEG_relations_tag_update(bmain);
93   DEG_id_tag_update(&camera->id, 0);
94 }
95
96 static CameraBGImage *rna_Camera_background_images_new(Camera *cam)
97 {
98   CameraBGImage *bgpic = BKE_camera_background_image_new(cam);
99
100   WM_main_add_notifier(NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, cam);
101
102   return bgpic;
103 }
104
105 static void rna_Camera_background_images_remove(Camera *cam,
106                                                 ReportList *reports,
107                                                 PointerRNA *bgpic_ptr)
108 {
109   CameraBGImage *bgpic = bgpic_ptr->data;
110   if (BLI_findindex(&cam->bg_images, bgpic) == -1) {
111     BKE_report(reports, RPT_ERROR, "Background image cannot be removed");
112   }
113
114   BKE_camera_background_image_remove(cam, bgpic);
115   RNA_POINTER_INVALIDATE(bgpic_ptr);
116
117   WM_main_add_notifier(NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, cam);
118 }
119
120 static void rna_Camera_background_images_clear(Camera *cam)
121 {
122   BKE_camera_background_image_clear(cam);
123
124   WM_main_add_notifier(NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, cam);
125 }
126
127 static void rna_Camera_dof_update(Main *bmain, Scene *scene, PointerRNA *UNUSED(ptr))
128 {
129   /* TODO(sergey): Can be more selective here. */
130   BKE_sequencer_cache_cleanup_all(bmain);
131   WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene);
132 }
133
134 #else
135
136 static void rna_def_camera_background_image(BlenderRNA *brna)
137 {
138   StructRNA *srna;
139   PropertyRNA *prop;
140
141   static const EnumPropertyItem bgpic_source_items[] = {
142       {CAM_BGIMG_SOURCE_IMAGE, "IMAGE", 0, "Image", ""},
143       {CAM_BGIMG_SOURCE_MOVIE, "MOVIE_CLIP", 0, "Movie Clip", ""},
144       {0, NULL, 0, NULL, NULL},
145   };
146
147   static const EnumPropertyItem bgpic_camera_frame_items[] = {
148       {0, "STRETCH", 0, "Stretch", ""},
149       {CAM_BGIMG_FLAG_CAMERA_ASPECT, "FIT", 0, "Fit", ""},
150       {CAM_BGIMG_FLAG_CAMERA_ASPECT | CAM_BGIMG_FLAG_CAMERA_CROP, "CROP", 0, "Crop", ""},
151       {0, NULL, 0, NULL, NULL},
152   };
153
154   static const EnumPropertyItem bgpic_display_depth_items[] = {
155       {0, "BACK", 0, "Back", ""},
156       {CAM_BGIMG_FLAG_FOREGROUND, "FRONT", 0, "Front", ""},
157       {0, NULL, 0, NULL, NULL},
158   };
159
160   srna = RNA_def_struct(brna, "CameraBackgroundImage", NULL);
161   RNA_def_struct_sdna(srna, "CameraBGImage");
162   RNA_def_struct_ui_text(
163       srna, "Background Image", "Image and settings for display in the 3D View background");
164
165   prop = RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
166   RNA_def_property_enum_sdna(prop, NULL, "source");
167   RNA_def_property_enum_items(prop, bgpic_source_items);
168   RNA_def_property_ui_text(prop, "Background Source", "Data source used for background");
169   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
170
171   prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
172   RNA_def_property_pointer_sdna(prop, NULL, "ima");
173   RNA_def_property_ui_text(prop, "Image", "Image displayed and edited in this space");
174   RNA_def_property_flag(prop, PROP_EDITABLE);
175   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
176
177   prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
178   RNA_def_property_pointer_sdna(prop, NULL, "clip");
179   RNA_def_property_ui_text(prop, "MovieClip", "Movie clip displayed and edited in this space");
180   RNA_def_property_flag(prop, PROP_EDITABLE);
181   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
182
183   prop = RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NONE);
184   RNA_def_property_flag(prop, PROP_NEVER_NULL);
185   RNA_def_property_pointer_sdna(prop, NULL, "iuser");
186   RNA_def_property_ui_text(
187       prop,
188       "Image User",
189       "Parameters defining which layer, pass and frame of the image is displayed");
190   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
191
192   prop = RNA_def_property(srna, "clip_user", PROP_POINTER, PROP_NONE);
193   RNA_def_property_flag(prop, PROP_NEVER_NULL);
194   RNA_def_property_struct_type(prop, "MovieClipUser");
195   RNA_def_property_pointer_sdna(prop, NULL, "cuser");
196   RNA_def_property_ui_text(
197       prop, "Clip User", "Parameters defining which frame of the movie clip is displayed");
198   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
199
200   prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_XYZ);
201   RNA_def_property_float_sdna(prop, NULL, "offset");
202   RNA_def_property_ui_text(prop, "Offset", "");
203   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
204
205   prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_FACTOR);
206   RNA_def_property_float_sdna(prop, NULL, "scale");
207   RNA_def_property_ui_text(prop, "Scale", "Scale the background image");
208   RNA_def_property_range(prop, 0.0, FLT_MAX);
209   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
210
211   prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ANGLE);
212   RNA_def_property_float_sdna(prop, NULL, "rotation");
213   RNA_def_property_ui_text(
214       prop, "Rotation", "Rotation for the background image (ortho view only)");
215   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
216
217   prop = RNA_def_property(srna, "use_flip_x", PROP_BOOLEAN, PROP_NONE);
218   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_BGIMG_FLAG_FLIP_X);
219   RNA_def_property_ui_text(prop, "Flip Horizontally", "Flip the background image horizontally");
220   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
221
222   prop = RNA_def_property(srna, "use_flip_y", PROP_BOOLEAN, PROP_NONE);
223   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_BGIMG_FLAG_FLIP_Y);
224   RNA_def_property_ui_text(prop, "Flip Vertically", "Flip the background image vertically");
225   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
226
227   prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
228   RNA_def_property_float_sdna(prop, NULL, "alpha");
229   RNA_def_property_ui_text(
230       prop, "Alpha", "Image opacity to blend the image against the background color");
231   RNA_def_property_range(prop, 0.0, 1.0);
232   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
233
234   prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
235   RNA_def_property_flag(prop, PROP_NO_DEG_UPDATE);
236   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_BGIMG_FLAG_EXPANDED);
237   RNA_def_property_ui_text(prop, "Show Expanded", "Show the expanded in the user interface");
238   RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1);
239
240   prop = RNA_def_property(srna, "use_camera_clip", PROP_BOOLEAN, PROP_NONE);
241   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_BGIMG_FLAG_CAMERACLIP);
242   RNA_def_property_ui_text(prop, "Camera Clip", "Use movie clip from active scene camera");
243   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
244
245   prop = RNA_def_property(srna, "show_background_image", PROP_BOOLEAN, PROP_NONE);
246   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CAM_BGIMG_FLAG_DISABLED);
247   RNA_def_property_ui_text(prop, "Show Background Image", "Show this image as background");
248   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
249
250   prop = RNA_def_property(srna, "show_on_foreground", PROP_BOOLEAN, PROP_NONE);
251   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_BGIMG_FLAG_FOREGROUND);
252   RNA_def_property_ui_text(
253       prop, "Show On Foreground", "Show this image in front of objects in viewport");
254   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
255
256   /* expose 1 flag as a enum of 2 items */
257   prop = RNA_def_property(srna, "display_depth", PROP_ENUM, PROP_NONE);
258   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
259   RNA_def_property_enum_items(prop, bgpic_display_depth_items);
260   RNA_def_property_ui_text(prop, "Depth", "Display under or over everything");
261   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
262
263   /* expose 2 flags as a enum of 3 items */
264   prop = RNA_def_property(srna, "frame_method", PROP_ENUM, PROP_NONE);
265   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
266   RNA_def_property_enum_items(prop, bgpic_camera_frame_items);
267   RNA_def_property_ui_text(prop, "Frame Method", "How the image fits in the camera frame");
268   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
269 }
270
271 static void rna_def_camera_background_images(BlenderRNA *brna, PropertyRNA *cprop)
272 {
273   StructRNA *srna;
274   FunctionRNA *func;
275   PropertyRNA *parm;
276
277   RNA_def_property_srna(cprop, "CameraBackgroundImages");
278   srna = RNA_def_struct(brna, "CameraBackgroundImages", NULL);
279   RNA_def_struct_sdna(srna, "Camera");
280   RNA_def_struct_ui_text(srna, "Background Images", "Collection of background images");
281
282   func = RNA_def_function(srna, "new", "rna_Camera_background_images_new");
283   RNA_def_function_ui_description(func, "Add new background image");
284   parm = RNA_def_pointer(
285       func, "image", "CameraBackgroundImage", "", "Image displayed as viewport background");
286   RNA_def_function_return(func, parm);
287
288   func = RNA_def_function(srna, "remove", "rna_Camera_background_images_remove");
289   RNA_def_function_ui_description(func, "Remove background image");
290   RNA_def_function_flag(func, FUNC_USE_REPORTS);
291   parm = RNA_def_pointer(
292       func, "image", "CameraBackgroundImage", "", "Image displayed as viewport background");
293   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
294   RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
295
296   func = RNA_def_function(srna, "clear", "rna_Camera_background_images_clear");
297   RNA_def_function_ui_description(func, "Remove all background images");
298 }
299
300 static void rna_def_camera_stereo_data(BlenderRNA *brna)
301 {
302   StructRNA *srna;
303   PropertyRNA *prop;
304
305   static const EnumPropertyItem convergence_mode_items[] = {
306       {CAM_S3D_OFFAXIS, "OFFAXIS", 0, "Off-Axis", "Off-axis frustums converging in a plane"},
307       {CAM_S3D_PARALLEL, "PARALLEL", 0, "Parallel", "Parallel cameras with no convergence"},
308       {CAM_S3D_TOE, "TOE", 0, "Toe-in", "Rotated cameras, looking at the convergence distance"},
309       {0, NULL, 0, NULL, NULL},
310   };
311
312   static const EnumPropertyItem pivot_items[] = {
313       {CAM_S3D_PIVOT_LEFT, "LEFT", 0, "Left", ""},
314       {CAM_S3D_PIVOT_RIGHT, "RIGHT", 0, "Right", ""},
315       {CAM_S3D_PIVOT_CENTER, "CENTER", 0, "Center", ""},
316       {0, NULL, 0, NULL, NULL},
317   };
318
319   srna = RNA_def_struct(brna, "CameraStereoData", NULL);
320   RNA_def_struct_sdna(srna, "CameraStereoSettings");
321   RNA_def_struct_nested(brna, srna, "Camera");
322   RNA_def_struct_ui_text(srna, "Stereo", "Stereoscopy settings for a Camera data-block");
323
324   prop = RNA_def_property(srna, "convergence_mode", PROP_ENUM, PROP_NONE);
325   RNA_def_property_enum_items(prop, convergence_mode_items);
326   RNA_def_property_ui_text(prop, "Mode", "");
327   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
328
329   prop = RNA_def_property(srna, "pivot", PROP_ENUM, PROP_NONE);
330   RNA_def_property_enum_items(prop, pivot_items);
331   RNA_def_property_ui_text(prop, "Pivot", "");
332   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
333
334   prop = RNA_def_property(srna, "interocular_distance", PROP_FLOAT, PROP_DISTANCE);
335   RNA_def_property_range(prop, 0.0f, FLT_MAX);
336   RNA_def_property_ui_range(prop, 0.0f, 1e4f, 1, 3);
337   RNA_def_property_ui_text(
338       prop,
339       "Interocular Distance",
340       "Set the distance between the eyes - the stereo plane distance / 30 should be fine");
341   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
342
343   prop = RNA_def_property(srna, "convergence_distance", PROP_FLOAT, PROP_DISTANCE);
344   RNA_def_property_range(prop, 0.00001f, FLT_MAX);
345   RNA_def_property_ui_range(prop, 0.00001f, 15.f, 1, 3);
346   RNA_def_property_ui_text(prop,
347                            "Convergence Plane Distance",
348                            "The converge point for the stereo cameras "
349                            "(often the distance between a projector and the projection screen)");
350   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
351
352   prop = RNA_def_property(srna, "use_spherical_stereo", PROP_BOOLEAN, PROP_NONE);
353   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_S3D_SPHERICAL);
354   RNA_def_property_ui_text(prop,
355                            "Spherical Stereo",
356                            "Render every pixel rotating the camera around the "
357                            "middle of the interocular distance");
358   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
359
360   prop = RNA_def_property(srna, "use_pole_merge", PROP_BOOLEAN, PROP_NONE);
361   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_S3D_POLE_MERGE);
362   RNA_def_property_ui_text(
363       prop, "Use Pole Merge", "Fade interocular distance to 0 after the given cutoff angle");
364   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
365
366   prop = RNA_def_property(srna, "pole_merge_angle_from", PROP_FLOAT, PROP_ANGLE);
367   RNA_def_property_range(prop, 0.0f, M_PI / 2.0);
368   RNA_def_property_ui_text(
369       prop, "Pole Merge Start Angle", "Angle at which interocular distance starts to fade to 0");
370   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
371
372   prop = RNA_def_property(srna, "pole_merge_angle_to", PROP_FLOAT, PROP_ANGLE);
373   RNA_def_property_range(prop, 0.0f, M_PI / 2.0);
374   RNA_def_property_ui_text(
375       prop, "Pole Merge End Angle", "Angle at which interocular distance is 0");
376   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
377 }
378
379 void RNA_def_camera(BlenderRNA *brna)
380 {
381   StructRNA *srna;
382   PropertyRNA *prop;
383   static const EnumPropertyItem prop_type_items[] = {
384       {CAM_PERSP, "PERSP", 0, "Perspective", ""},
385       {CAM_ORTHO, "ORTHO", 0, "Orthographic", ""},
386       {CAM_PANO, "PANO", 0, "Panoramic", ""},
387       {0, NULL, 0, NULL, NULL},
388   };
389   static const EnumPropertyItem prop_lens_unit_items[] = {
390       {0, "MILLIMETERS", 0, "Millimeters", "Specify the lens in millimeters"},
391       {CAM_ANGLETOGGLE,
392        "FOV",
393        0,
394        "Field of View",
395        "Specify the lens as the field of view's angle"},
396       {0, NULL, 0, NULL, NULL},
397   };
398   static const EnumPropertyItem sensor_fit_items[] = {
399       {CAMERA_SENSOR_FIT_AUTO,
400        "AUTO",
401        0,
402        "Auto",
403        "Fit to the sensor width or height depending on image resolution"},
404       {CAMERA_SENSOR_FIT_HOR, "HORIZONTAL", 0, "Horizontal", "Fit to the sensor width"},
405       {CAMERA_SENSOR_FIT_VERT, "VERTICAL", 0, "Vertical", "Fit to the sensor height"},
406       {0, NULL, 0, NULL, NULL},
407   };
408
409   srna = RNA_def_struct(brna, "Camera", "ID");
410   RNA_def_struct_ui_text(srna, "Camera", "Camera data-block for storing camera settings");
411   RNA_def_struct_ui_icon(srna, ICON_CAMERA_DATA);
412
413   /* Enums */
414   prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
415   RNA_def_property_enum_items(prop, prop_type_items);
416   RNA_def_property_ui_text(prop, "Type", "Camera types");
417   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
418
419   prop = RNA_def_property(srna, "sensor_fit", PROP_ENUM, PROP_NONE);
420   RNA_def_property_enum_sdna(prop, NULL, "sensor_fit");
421   RNA_def_property_enum_items(prop, sensor_fit_items);
422   RNA_def_property_ui_text(
423       prop, "Sensor Fit", "Method to fit image and field of view angle inside the sensor");
424   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
425
426   /* Number values */
427
428   prop = RNA_def_property(srna, "passepartout_alpha", PROP_FLOAT, PROP_FACTOR);
429   RNA_def_property_float_sdna(prop, NULL, "passepartalpha");
430   RNA_def_property_float_default(prop, 0.5f);
431   RNA_def_property_ui_text(
432       prop, "Passepartout Alpha", "Opacity (alpha) of the darkened overlay in Camera view");
433   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
434
435   prop = RNA_def_property(srna, "angle_x", PROP_FLOAT, PROP_ANGLE);
436   RNA_def_property_range(prop, DEG2RAD(0.367), DEG2RAD(172.847));
437   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
438   RNA_def_property_ui_text(prop, "Horizontal FOV", "Camera lens horizontal field of view");
439   RNA_def_property_float_funcs(prop, "rna_Camera_angle_x_get", "rna_Camera_angle_x_set", NULL);
440   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
441
442   prop = RNA_def_property(srna, "angle_y", PROP_FLOAT, PROP_ANGLE);
443   RNA_def_property_range(prop, DEG2RAD(0.367), DEG2RAD(172.847));
444   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
445   RNA_def_property_ui_text(prop, "Vertical FOV", "Camera lens vertical field of view");
446   RNA_def_property_float_funcs(prop, "rna_Camera_angle_y_get", "rna_Camera_angle_y_set", NULL);
447   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
448
449   prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
450   RNA_def_property_range(prop, DEG2RAD(0.367), DEG2RAD(172.847));
451   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
452   RNA_def_property_ui_text(prop, "Field of View", "Camera lens field of view");
453   RNA_def_property_float_funcs(prop, "rna_Camera_angle_get", "rna_Camera_angle_set", NULL);
454   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
455
456   prop = RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_DISTANCE);
457   RNA_def_property_float_default(prop, 0.1f);
458   RNA_def_property_range(prop, 1e-6f, FLT_MAX);
459   RNA_def_property_ui_range(prop, 0.001f, FLT_MAX, 10, 3);
460   RNA_def_property_ui_text(prop, "Clip Start", "Camera near clipping distance");
461   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
462
463   prop = RNA_def_property(srna, "clip_end", PROP_FLOAT, PROP_DISTANCE);
464   RNA_def_property_float_default(prop, 1000.0f);
465   RNA_def_property_range(prop, 1e-6f, FLT_MAX);
466   RNA_def_property_ui_range(prop, 0.001f, FLT_MAX, 10, 3);
467   RNA_def_property_ui_text(prop, "Clip End", "Camera far clipping distance");
468   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
469
470   prop = RNA_def_property(srna, "lens", PROP_FLOAT, PROP_DISTANCE_CAMERA);
471   RNA_def_property_float_sdna(prop, NULL, "lens");
472   RNA_def_property_float_default(prop, 50.0f);
473   RNA_def_property_range(prop, 1.0f, FLT_MAX);
474   RNA_def_property_ui_range(prop, 1.0f, 5000.0f, 100, 4);
475   RNA_def_property_ui_text(prop, "Focal Length", "Perspective Camera lens value in millimeters");
476   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
477
478   prop = RNA_def_property(srna, "sensor_width", PROP_FLOAT, PROP_DISTANCE_CAMERA);
479   RNA_def_property_float_sdna(prop, NULL, "sensor_x");
480   RNA_def_property_float_default(prop, 36.0f);
481   RNA_def_property_range(prop, 1.0f, FLT_MAX);
482   RNA_def_property_ui_range(prop, 1.0f, 100.f, 100, 4);
483   RNA_def_property_ui_text(
484       prop, "Sensor Width", "Horizontal size of the image sensor area in millimeters");
485   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
486
487   prop = RNA_def_property(srna, "sensor_height", PROP_FLOAT, PROP_DISTANCE_CAMERA);
488   RNA_def_property_float_sdna(prop, NULL, "sensor_y");
489   RNA_def_property_float_default(prop, 34.0f);
490   RNA_def_property_range(prop, 1.0f, FLT_MAX);
491   RNA_def_property_ui_range(prop, 1.0f, 100.f, 100, 4);
492   RNA_def_property_ui_text(
493       prop, "Sensor Height", "Vertical size of the image sensor area in millimeters");
494   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
495
496   prop = RNA_def_property(srna, "ortho_scale", PROP_FLOAT, PROP_NONE);
497   RNA_def_property_float_sdna(prop, NULL, "ortho_scale");
498   RNA_def_property_float_default(prop, 6.0f);
499   RNA_def_property_range(prop, FLT_MIN, FLT_MAX);
500   RNA_def_property_ui_range(prop, 0.001f, 10000.0f, 10, 3);
501   RNA_def_property_ui_text(
502       prop, "Orthographic Scale", "Orthographic Camera scale (similar to zoom)");
503   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
504
505   prop = RNA_def_property(srna, "display_size", PROP_FLOAT, PROP_DISTANCE);
506   RNA_def_property_float_sdna(prop, NULL, "drawsize");
507   RNA_def_property_float_default(prop, 1.0f);
508   RNA_def_property_range(prop, 0.01f, 1000.0f);
509   RNA_def_property_ui_range(prop, 0.01, 100, 1, 2);
510   RNA_def_property_ui_text(
511       prop, "Display Size", "Apparent size of the Camera object in the 3D View");
512   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
513
514   prop = RNA_def_property(srna, "shift_x", PROP_FLOAT, PROP_NONE);
515   RNA_def_property_float_sdna(prop, NULL, "shiftx");
516   RNA_def_property_range(prop, -10.0f, 10.0f);
517   RNA_def_property_ui_range(prop, -2.0, 2.0, 1, 3);
518   RNA_def_property_ui_text(prop, "Shift X", "Camera horizontal shift");
519   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
520
521   prop = RNA_def_property(srna, "shift_y", PROP_FLOAT, PROP_NONE);
522   RNA_def_property_float_sdna(prop, NULL, "shifty");
523   RNA_def_property_range(prop, -10.0f, 10.0f);
524   RNA_def_property_ui_range(prop, -2.0, 2.0, 1, 3);
525   RNA_def_property_ui_text(prop, "Shift Y", "Camera vertical shift");
526   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_update");
527
528   prop = RNA_def_property(srna, "dof_distance", PROP_FLOAT, PROP_DISTANCE);
529   RNA_def_property_range(prop, 0.0f, FLT_MAX);
530   RNA_def_property_ui_range(prop, 0.0f, 5000.0f, 1, 2);
531   RNA_def_property_ui_text(prop, "DOF Distance", "Distance to the focus point for depth of field");
532   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_dof_update");
533
534   /* Stereo Settings */
535   prop = RNA_def_property(srna, "stereo", PROP_POINTER, PROP_NONE);
536   RNA_def_property_flag(prop, PROP_NEVER_NULL);
537   RNA_def_property_pointer_sdna(prop, NULL, "stereo");
538   RNA_def_property_struct_type(prop, "CameraStereoData");
539   RNA_def_property_ui_text(prop, "Stereo", "");
540
541   /* flag */
542   prop = RNA_def_property(srna, "show_limits", PROP_BOOLEAN, PROP_NONE);
543   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOWLIMITS);
544   RNA_def_property_ui_text(
545       prop, "Show Limits", "Display the clipping range and focus point on the camera");
546   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
547
548   prop = RNA_def_property(srna, "show_mist", PROP_BOOLEAN, PROP_NONE);
549   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOWMIST);
550   RNA_def_property_ui_text(
551       prop, "Show Mist", "Display a line from the Camera to indicate the mist area");
552   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
553
554   prop = RNA_def_property(srna, "show_passepartout", PROP_BOOLEAN, PROP_NONE);
555   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOWPASSEPARTOUT);
556   RNA_def_property_boolean_default(prop, true);
557   RNA_def_property_ui_text(
558       prop, "Show Passepartout", "Show a darkened overlay outside the image area in Camera view");
559   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
560
561   prop = RNA_def_property(srna, "show_safe_areas", PROP_BOOLEAN, PROP_NONE);
562   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOW_SAFE_MARGINS);
563   RNA_def_property_ui_text(
564       prop, "Show Safe Areas", "Show TV title safe and action safe areas in Camera view");
565   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
566
567   prop = RNA_def_property(srna, "show_safe_center", PROP_BOOLEAN, PROP_NONE);
568   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOW_SAFE_CENTER);
569   RNA_def_property_ui_text(prop,
570                            "Show Center-cut safe areas",
571                            "Show safe areas to fit content in a different aspect ratio");
572   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
573
574   prop = RNA_def_property(srna, "show_name", PROP_BOOLEAN, PROP_NONE);
575   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOWNAME);
576   RNA_def_property_ui_text(prop, "Show Name", "Show the active Camera's name in Camera view");
577   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
578
579   prop = RNA_def_property(srna, "show_sensor", PROP_BOOLEAN, PROP_NONE);
580   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOWSENSOR);
581   RNA_def_property_ui_text(
582       prop, "Show Sensor Size", "Show sensor size (film gate) in Camera view");
583   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
584
585   prop = RNA_def_property(srna, "show_background_images", PROP_BOOLEAN, PROP_NONE);
586   RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOW_BG_IMAGE);
587   RNA_def_property_ui_text(
588       prop, "Display Background Images", "Display reference images behind objects in the 3D View");
589   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
590
591   prop = RNA_def_property(srna, "lens_unit", PROP_ENUM, PROP_NONE);
592   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
593   RNA_def_property_enum_items(prop, prop_lens_unit_items);
594   RNA_def_property_ui_text(prop, "Lens Unit", "Unit to edit lens in for the user interface");
595
596   /* dtx */
597   prop = RNA_def_property(srna, "show_composition_center", PROP_BOOLEAN, PROP_NONE);
598   RNA_def_property_boolean_sdna(prop, NULL, "dtx", CAM_DTX_CENTER);
599   RNA_def_property_ui_text(
600       prop, "Center", "Display center composition guide inside the camera view");
601   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
602
603   prop = RNA_def_property(srna, "show_composition_center_diagonal", PROP_BOOLEAN, PROP_NONE);
604   RNA_def_property_boolean_sdna(prop, NULL, "dtx", CAM_DTX_CENTER_DIAG);
605   RNA_def_property_ui_text(
606       prop, "Center Diagonal", "Display diagonal center composition guide inside the camera view");
607   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
608
609   prop = RNA_def_property(srna, "show_composition_thirds", PROP_BOOLEAN, PROP_NONE);
610   RNA_def_property_boolean_sdna(prop, NULL, "dtx", CAM_DTX_THIRDS);
611   RNA_def_property_ui_text(
612       prop, "Thirds", "Display rule of thirds composition guide inside the camera view");
613   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
614
615   prop = RNA_def_property(srna, "show_composition_golden", PROP_BOOLEAN, PROP_NONE);
616   RNA_def_property_boolean_sdna(prop, NULL, "dtx", CAM_DTX_GOLDEN);
617   RNA_def_property_ui_text(
618       prop, "Golden Ratio", "Display golden ratio composition guide inside the camera view");
619   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
620
621   prop = RNA_def_property(srna, "show_composition_golden_tria_a", PROP_BOOLEAN, PROP_NONE);
622   RNA_def_property_boolean_sdna(prop, NULL, "dtx", CAM_DTX_GOLDEN_TRI_A);
623   RNA_def_property_ui_text(prop,
624                            "Golden Triangle A",
625                            "Display golden triangle A composition guide inside the camera view");
626   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
627
628   prop = RNA_def_property(srna, "show_composition_golden_tria_b", PROP_BOOLEAN, PROP_NONE);
629   RNA_def_property_boolean_sdna(prop, NULL, "dtx", CAM_DTX_GOLDEN_TRI_B);
630   RNA_def_property_ui_text(prop,
631                            "Golden Triangle B",
632                            "Display golden triangle B composition guide inside the camera view");
633   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
634
635   prop = RNA_def_property(srna, "show_composition_harmony_tri_a", PROP_BOOLEAN, PROP_NONE);
636   RNA_def_property_boolean_sdna(prop, NULL, "dtx", CAM_DTX_HARMONY_TRI_A);
637   RNA_def_property_ui_text(
638       prop, "Harmonious Triangle A", "Display harmony A composition guide inside the camera view");
639   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
640
641   prop = RNA_def_property(srna, "show_composition_harmony_tri_b", PROP_BOOLEAN, PROP_NONE);
642   RNA_def_property_boolean_sdna(prop, NULL, "dtx", CAM_DTX_HARMONY_TRI_B);
643   RNA_def_property_ui_text(
644       prop, "Harmonious Triangle B", "Display harmony B composition guide inside the camera view");
645   RNA_def_property_update(prop, NC_CAMERA | ND_DRAW_RENDER_VIEWPORT, NULL);
646
647   /* pointers */
648   prop = RNA_def_property(srna, "dof_object", PROP_POINTER, PROP_NONE);
649   RNA_def_property_struct_type(prop, "Object");
650   RNA_def_property_pointer_sdna(prop, NULL, "dof_ob");
651   RNA_def_property_flag(prop, PROP_EDITABLE);
652   RNA_def_property_ui_text(
653       prop, "DOF Object", "Use this object to define the depth of field focal point");
654   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Camera_dependency_update");
655
656   prop = RNA_def_property(srna, "gpu_dof", PROP_POINTER, PROP_NONE);
657   RNA_def_property_struct_type(prop, "GPUDOFSettings");
658   RNA_def_property_ui_text(prop, "GPU Depth Of Field", "");
659   RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
660
661   prop = RNA_def_property(srna, "background_images", PROP_COLLECTION, PROP_NONE);
662   RNA_def_property_collection_sdna(prop, NULL, "bg_images", NULL);
663   RNA_def_property_struct_type(prop, "CameraBackgroundImage");
664   RNA_def_property_ui_text(prop, "Background Images", "List of background images");
665   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
666
667   rna_def_animdata_common(srna);
668
669   rna_def_camera_background_image(brna);
670   rna_def_camera_background_images(brna, prop);
671
672   /* Nested Data  */
673   RNA_define_animate_sdna(true);
674
675   /* *** Animated *** */
676   rna_def_camera_stereo_data(brna);
677
678   /* Camera API */
679   RNA_api_camera(srna);
680 }
681
682 #endif