Gizmo: match the DOF gizmo size with the non-gizmo indicator
[blender.git] / source / blender / makesrna / intern / rna_space.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 #include <string.h>
23
24 #include "MEM_guardedalloc.h"
25
26 #include "BLT_translation.h"
27
28 #include "BKE_image.h"
29 #include "BKE_key.h"
30 #include "BKE_movieclip.h"
31 #include "BKE_node.h"
32 #include "BKE_studiolight.h"
33 #include "BKE_sequencer.h"
34
35 #include "ED_text.h"
36
37 #include "BLI_math.h"
38
39 #include "DNA_action_types.h"
40 #include "DNA_gpencil_types.h"
41 #include "DNA_key_types.h"
42 #include "DNA_material_types.h"
43 #include "DNA_node_types.h"
44 #include "DNA_object_types.h"
45 #include "DNA_space_types.h"
46 #include "DNA_sequence_types.h"
47 #include "DNA_mask_types.h"
48 #include "DNA_view3d_types.h"
49 #include "DNA_workspace_types.h"
50
51 #include "RNA_access.h"
52 #include "RNA_define.h"
53
54 #include "rna_internal.h"
55
56 #include "WM_api.h"
57 #include "WM_types.h"
58
59 #include "RE_engine.h"
60 #include "RE_pipeline.h"
61
62 #include "RNA_enum_types.h"
63
64 const EnumPropertyItem rna_enum_space_type_items[] = {
65     /* empty must be here for python, is skipped for UI */
66     {SPACE_EMPTY, "EMPTY", ICON_NONE, "Empty", ""},
67
68     /* General */
69     {0, "", ICON_NONE, "General", ""},
70     {SPACE_VIEW3D,
71      "VIEW_3D",
72      ICON_VIEW3D,
73      "3D Viewport",
74      "Manipulate objects in a 3D environment"},
75     {SPACE_IMAGE,
76      "IMAGE_EDITOR",
77      ICON_IMAGE,
78      "UV/Image Editor",
79      "View and edit images and UV Maps"},
80     {SPACE_NODE,
81      "NODE_EDITOR",
82      ICON_NODETREE,
83      "Node Editor",
84      "Editor for node-based shading and compositing tools"},
85     {SPACE_SEQ, "SEQUENCE_EDITOR", ICON_SEQUENCE, "Video Sequencer", "Video editing tools"},
86     {SPACE_CLIP, "CLIP_EDITOR", ICON_TRACKER, "Movie Clip Editor", "Motion tracking tools"},
87
88     /* Animation */
89     {0, "", ICON_NONE, "Animation", ""},
90 #if 0
91     {SPACE_ACTION,
92      "TIMELINE",
93      ICON_TIME,
94      "Timeline",
95      "Timeline and playback controls (NOTE: Switch to 'Timeline' mode)"}, /* XXX */
96 #endif
97     {SPACE_ACTION, "DOPESHEET_EDITOR", ICON_ACTION, "Dope Sheet", "Adjust timing of keyframes"},
98     {SPACE_GRAPH,
99      "GRAPH_EDITOR",
100      ICON_GRAPH,
101      "Graph Editor",
102      "Edit drivers and keyframe interpolation"},
103     {SPACE_NLA, "NLA_EDITOR", ICON_NLA, "Nonlinear Animation", "Combine and layer Actions"},
104
105     /* Scripting */
106     {0, "", ICON_NONE, "Scripting", ""},
107     {SPACE_TEXT,
108      "TEXT_EDITOR",
109      ICON_TEXT,
110      "Text Editor",
111      "Edit scripts and in-file documentation"},
112     {SPACE_CONSOLE,
113      "CONSOLE",
114      ICON_CONSOLE,
115      "Python Console",
116      "Interactive programmatic console for "
117      "advanced editing and script development"},
118     {SPACE_INFO, "INFO", ICON_INFO, "Info", "Log of operations, warnings and error messages"},
119     /* Special case: Top-bar and Status-bar aren't supposed to be a regular editor for the user. */
120     {SPACE_TOPBAR,
121      "TOPBAR",
122      ICON_NONE,
123      "Top Bar",
124      "Global bar at the top of the screen for "
125      "global per-window settings"},
126     {SPACE_STATUSBAR,
127      "STATUSBAR",
128      ICON_NONE,
129      "Status Bar",
130      "Global bar at the bottom of the "
131      "screen for general status information"},
132
133     /* Data */
134     {0, "", ICON_NONE, "Data", ""},
135     {SPACE_OUTLINER,
136      "OUTLINER",
137      ICON_OUTLINER,
138      "Outliner",
139      "Overview of scene graph and all available data-blocks"},
140     {SPACE_PROPERTIES,
141      "PROPERTIES",
142      ICON_PROPERTIES,
143      "Properties",
144      "Edit properties of active object and related data-blocks"},
145     {SPACE_FILE, "FILE_BROWSER", ICON_FILEBROWSER, "File Browser", "Browse for files and assets"},
146     {SPACE_USERPREF,
147      "PREFERENCES",
148      ICON_PREFERENCES,
149      "Preferences",
150      "Edit persistent configuration settings"},
151     {0, NULL, 0, NULL, NULL},
152 };
153
154 const EnumPropertyItem rna_enum_space_graph_mode_items[] = {
155     {SIPO_MODE_ANIMATION,
156      "FCURVES",
157      ICON_GRAPH,
158      "Graph Editor",
159      "Edit animation/keyframes displayed as 2D curves"},
160     {SIPO_MODE_DRIVERS, "DRIVERS", ICON_DRIVER, "Drivers", "Edit drivers"},
161     {0, NULL, 0, NULL, NULL},
162 };
163
164 #define SACT_ITEM_DOPESHEET \
165   { \
166     SACTCONT_DOPESHEET, "DOPESHEET", ICON_ACTION, "Dope Sheet", "Edit all keyframes in scene" \
167   }
168 #define SACT_ITEM_TIMELINE \
169   { \
170     SACTCONT_TIMELINE, "TIMELINE", ICON_TIME, "Timeline", "Timeline and playback controls" \
171   }
172 #define SACT_ITEM_ACTION \
173   { \
174     SACTCONT_ACTION, "ACTION", ICON_OBJECT_DATA, "Action Editor", \
175         "Edit keyframes in active object's Object-level action" \
176   }
177 #define SACT_ITEM_SHAPEKEY \
178   { \
179     SACTCONT_SHAPEKEY, "SHAPEKEY", ICON_SHAPEKEY_DATA, "Shape Key Editor", \
180         "Edit keyframes in active object's Shape Keys action" \
181   }
182 #define SACT_ITEM_GPENCIL \
183   { \
184     SACTCONT_GPENCIL, "GPENCIL", ICON_GREASEPENCIL, "Grease Pencil", \
185         "Edit timings for all Grease Pencil sketches in file" \
186   }
187 #define SACT_ITEM_MASK \
188   { \
189     SACTCONT_MASK, "MASK", ICON_MOD_MASK, "Mask", "Edit timings for Mask Editor splines" \
190   }
191 #define SACT_ITEM_CACHEFILE \
192   { \
193     SACTCONT_CACHEFILE, "CACHEFILE", ICON_FILE, "Cache File", \
194         "Edit timings for Cache File data-blocks" \
195   }
196
197 #ifndef RNA_RUNTIME
198 /* XXX: action-editor is currently for object-level only actions,
199  * so show that using object-icon hint */
200 static EnumPropertyItem rna_enum_space_action_mode_all_items[] = {
201     SACT_ITEM_DOPESHEET,
202     SACT_ITEM_TIMELINE,
203     SACT_ITEM_ACTION,
204     SACT_ITEM_SHAPEKEY,
205     SACT_ITEM_GPENCIL,
206     SACT_ITEM_MASK,
207     SACT_ITEM_CACHEFILE,
208     {0, NULL, 0, NULL, NULL},
209 };
210 static EnumPropertyItem rna_enum_space_action_ui_mode_items[] = {
211     SACT_ITEM_DOPESHEET,
212     /* SACT_ITEM_TIMELINE, */
213     SACT_ITEM_ACTION,
214     SACT_ITEM_SHAPEKEY,
215     SACT_ITEM_GPENCIL,
216     SACT_ITEM_MASK,
217     SACT_ITEM_CACHEFILE,
218     {0, NULL, 0, NULL, NULL},
219 };
220 #endif
221 /* expose as ui_mode */
222 const EnumPropertyItem rna_enum_space_action_mode_items[] = {
223     SACT_ITEM_DOPESHEET,
224     SACT_ITEM_TIMELINE,
225     {0, NULL, 0, NULL, NULL},
226 };
227
228 #undef SACT_ITEM_DOPESHEET
229 #undef SACT_ITEM_TIMELINE
230 #undef SACT_ITEM_ACTION
231 #undef SACT_ITEM_SHAPEKEY
232 #undef SACT_ITEM_GPENCIL
233 #undef SACT_ITEM_MASK
234 #undef SACT_ITEM_CACHEFILE
235
236 #define SI_ITEM_VIEW(name, icon) \
237   { \
238     SI_MODE_VIEW, "VIEW", icon, name, "View the image" \
239   }
240 #define SI_ITEM_UV \
241   { \
242     SI_MODE_UV, "UV", ICON_UV, "UV Editor", "UV edit in mesh editmode" \
243   }
244 #define SI_ITEM_PAINT \
245   { \
246     SI_MODE_PAINT, "PAINT", ICON_TPAINT_HLT, "Paint", "2D image painting mode" \
247   }
248 #define SI_ITEM_MASK \
249   { \
250     SI_MODE_MASK, "MASK", ICON_MOD_MASK, "Mask", "Mask editing" \
251   }
252
253 const EnumPropertyItem rna_enum_space_image_mode_all_items[] = {
254     SI_ITEM_VIEW("View", ICON_FILE_IMAGE),
255     SI_ITEM_UV,
256     SI_ITEM_PAINT,
257     SI_ITEM_MASK,
258     {0, NULL, 0, NULL, NULL},
259 };
260
261 static const EnumPropertyItem rna_enum_space_image_mode_ui_items[] = {
262     SI_ITEM_VIEW("View", ICON_FILE_IMAGE),
263     SI_ITEM_PAINT,
264     SI_ITEM_MASK,
265     {0, NULL, 0, NULL, NULL},
266 };
267
268 const EnumPropertyItem rna_enum_space_image_mode_items[] = {
269     SI_ITEM_VIEW("Image Editor", ICON_IMAGE),
270     SI_ITEM_UV,
271     {0, NULL, 0, NULL, NULL},
272 };
273
274 #undef SI_ITEM_VIEW
275 #undef SI_ITEM_UV
276 #undef SI_ITEM_PAINT
277 #undef SI_ITEM_MASK
278
279 #define V3D_S3D_CAMERA_LEFT {STEREO_LEFT_ID, "LEFT", ICON_RESTRICT_RENDER_OFF, "Left", ""},
280 #define V3D_S3D_CAMERA_RIGHT {STEREO_RIGHT_ID, "RIGHT", ICON_RESTRICT_RENDER_OFF, "Right", ""},
281 #define V3D_S3D_CAMERA_S3D {STEREO_3D_ID, "S3D", ICON_CAMERA_STEREO, "3D", ""},
282 #ifdef RNA_RUNTIME
283 #  define V3D_S3D_CAMERA_VIEWS {STEREO_MONO_ID, "MONO", ICON_RESTRICT_RENDER_OFF, "Views", ""},
284 #endif
285
286 static const EnumPropertyItem stereo3d_camera_items[] = {
287     V3D_S3D_CAMERA_LEFT V3D_S3D_CAMERA_RIGHT V3D_S3D_CAMERA_S3D{0, NULL, 0, NULL, NULL},
288 };
289
290 #ifdef RNA_RUNTIME
291 static const EnumPropertyItem multiview_camera_items[] = {
292     V3D_S3D_CAMERA_VIEWS V3D_S3D_CAMERA_S3D{0, NULL, 0, NULL, NULL},
293 };
294 #endif
295
296 #undef V3D_S3D_CAMERA_LEFT
297 #undef V3D_S3D_CAMERA_RIGHT
298 #undef V3D_S3D_CAMERA_S3D
299 #undef V3D_S3D_CAMERA_VIEWS
300
301 #ifndef RNA_RUNTIME
302 static const EnumPropertyItem stereo3d_eye_items[] = {
303     {STEREO_LEFT_ID, "LEFT_EYE", ICON_NONE, "Left Eye"},
304     {STEREO_RIGHT_ID, "RIGHT_EYE", ICON_NONE, "Right Eye"},
305     {0, NULL, 0, NULL, NULL},
306 };
307 #endif
308
309 static const EnumPropertyItem display_channels_items[] = {
310     {SI_USE_ALPHA,
311      "COLOR_ALPHA",
312      ICON_IMAGE_RGB_ALPHA,
313      "Color and Alpha",
314      "Display image with RGB colors and alpha transparency"},
315     {0, "COLOR", ICON_IMAGE_RGB, "Color", "Display image with RGB colors"},
316     {SI_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Display  alpha transparency channel"},
317     {SI_SHOW_ZBUF,
318      "Z_BUFFER",
319      ICON_IMAGE_ZDEPTH,
320      "Z-Buffer",
321      "Display Z-buffer associated with image (mapped from camera clip start to end)"},
322     {SI_SHOW_R, "RED", ICON_COLOR_RED, "Red", ""},
323     {SI_SHOW_G, "GREEN", ICON_COLOR_GREEN, "Green", ""},
324     {SI_SHOW_B, "BLUE", ICON_COLOR_BLUE, "Blue", ""},
325     {0, NULL, 0, NULL, NULL},
326 };
327
328 #ifndef RNA_RUNTIME
329 static const EnumPropertyItem autosnap_items[] = {
330     {SACTSNAP_OFF, "NONE", 0, "No Auto-Snap", ""},
331     /* {-1, "", 0, "", ""}, */
332     {SACTSNAP_STEP, "STEP", 0, "Frame Step", "Snap to 1.0 frame intervals"},
333     {SACTSNAP_TSTEP, "TIME_STEP", 0, "Second Step", "Snap to 1.0 second intervals"},
334     /* {-1, "", 0, "", ""}, */
335     {SACTSNAP_FRAME, "FRAME", 0, "Nearest Frame", "Snap to actual frames (nla-action time)"},
336     {SACTSNAP_SECOND, "SECOND", 0, "Nearest Second", "Snap to actual seconds (nla-action time)"},
337     /* {-1, "", 0, "", ""}, */
338     {SACTSNAP_MARKER, "MARKER", 0, "Nearest Marker", "Snap to nearest marker"},
339     {0, NULL, 0, NULL, NULL},
340 };
341 #endif
342
343 const EnumPropertyItem rna_enum_shading_type_items[] = {
344     {OB_WIRE, "WIREFRAME", ICON_SHADING_WIRE, "Wireframe", "Display the object as wire edges"},
345     {OB_SOLID, "SOLID", ICON_SHADING_SOLID, "Solid", "Display in solid mode"},
346     {OB_MATERIAL, "MATERIAL", ICON_SHADING_TEXTURE, "Look Dev", "Display in Look Dev mode"},
347     {OB_RENDER, "RENDERED", ICON_SHADING_RENDERED, "Rendered", "Display render preview"},
348     {0, NULL, 0, NULL, NULL},
349 };
350
351 static const EnumPropertyItem rna_enum_viewport_lighting_items[] = {
352     {V3D_LIGHTING_STUDIO, "STUDIO", 0, "Studio", "Display using studio lighting"},
353     {V3D_LIGHTING_MATCAP, "MATCAP", 0, "MatCap", "Display using matcap material and lighting"},
354     {V3D_LIGHTING_FLAT, "FLAT", 0, "Flat", "Display using flat lighting"},
355     {0, NULL, 0, NULL, NULL},
356 };
357
358 static const EnumPropertyItem rna_enum_shading_color_type_items[] = {
359     {V3D_SHADING_MATERIAL_COLOR, "MATERIAL", 0, "Material", "Show material color"},
360     {V3D_SHADING_SINGLE_COLOR, "SINGLE", 0, "Single", "Show scene in a single color"},
361     {V3D_SHADING_OBJECT_COLOR, "OBJECT", 0, "Object", "Show object color"},
362     {V3D_SHADING_RANDOM_COLOR, "RANDOM", 0, "Random", "Show random object color"},
363     {V3D_SHADING_VERTEX_COLOR, "VERTEX", 0, "Vertex", "Show active vertex color"},
364     {V3D_SHADING_TEXTURE_COLOR, "TEXTURE", 0, "Texture", "Show texture"},
365     {0, NULL, 0, NULL, NULL},
366 };
367
368 static const EnumPropertyItem rna_enum_studio_light_items[] = {
369     {0, "DEFAULT", 0, "Default", ""},
370     {0, NULL, 0, NULL, NULL},
371 };
372
373 const EnumPropertyItem rna_enum_clip_editor_mode_items[] = {
374     {SC_MODE_TRACKING, "TRACKING", ICON_ANIM_DATA, "Tracking", "Show tracking and solving tools"},
375     {SC_MODE_MASKEDIT, "MASK", ICON_MOD_MASK, "Mask", "Show mask editing tools"},
376     {0, NULL, 0, NULL, NULL},
377 };
378
379 /* Actually populated dynamically trough a function,
380  * but helps for context-less access (e.g. doc, i18n...). */
381 static const EnumPropertyItem buttons_context_items[] = {
382     {BCONTEXT_TOOL, "TOOL", ICON_TOOL_SETTINGS, "Tool", "Active Tool and Workspace settings"},
383     {BCONTEXT_SCENE, "SCENE", ICON_SCENE_DATA, "Scene", "Scene"},
384     {BCONTEXT_RENDER, "RENDER", ICON_SCENE, "Render", "Render"},
385     {BCONTEXT_OUTPUT, "OUTPUT", ICON_OUTPUT, "Output", "Output"},
386     {BCONTEXT_VIEW_LAYER, "VIEW_LAYER", ICON_RENDER_RESULT, "View Layer", "View Layer"},
387     {BCONTEXT_WORLD, "WORLD", ICON_WORLD, "World", "World"},
388     {BCONTEXT_OBJECT, "OBJECT", ICON_OBJECT_DATA, "Object", "Object"},
389     {BCONTEXT_CONSTRAINT, "CONSTRAINT", ICON_CONSTRAINT, "Constraints", "Object Constraints"},
390     {BCONTEXT_MODIFIER, "MODIFIER", ICON_MODIFIER, "Modifiers", "Modifiers"},
391     {BCONTEXT_DATA, "DATA", ICON_NONE, "Data", "Object Data"},
392     {BCONTEXT_BONE, "BONE", ICON_BONE_DATA, "Bone", "Bone"},
393     {BCONTEXT_BONE_CONSTRAINT,
394      "BONE_CONSTRAINT",
395      ICON_CONSTRAINT_BONE,
396      "Bone Constraints",
397      "Bone Constraints"},
398     {BCONTEXT_MATERIAL, "MATERIAL", ICON_MATERIAL, "Material", "Material"},
399     {BCONTEXT_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture"},
400     {BCONTEXT_PARTICLE, "PARTICLES", ICON_PARTICLES, "Particles", "Particles"},
401     {BCONTEXT_PHYSICS, "PHYSICS", ICON_PHYSICS, "Physics", "Physics"},
402     {BCONTEXT_SHADERFX, "SHADERFX", ICON_SHADERFX, "Effects", "Object visual effects"},
403     {0, NULL, 0, NULL, NULL},
404 };
405
406 static const EnumPropertyItem fileselectparams_recursion_level_items[] = {
407     {0, "NONE", 0, "None", "Only list current directory's content, with no recursion"},
408     {1, "BLEND", 0, "Blend File", "List .blend files' content"},
409     {2, "ALL_1", 0, "One Level", "List all sub-directories' content, one level of recursion"},
410     {3, "ALL_2", 0, "Two Levels", "List all sub-directories' content, two levels of recursion"},
411     {4,
412      "ALL_3",
413      0,
414      "Three Levels",
415      "List all sub-directories' content, three levels of recursion"},
416     {0, NULL, 0, NULL, NULL},
417 };
418
419 const EnumPropertyItem rna_enum_file_sort_items[] = {
420     {FILE_SORT_ALPHA,
421      "FILE_SORT_ALPHA",
422      ICON_SORTALPHA,
423      "Sort alphabetically",
424      "Sort the file list alphabetically"},
425     {FILE_SORT_EXTENSION,
426      "FILE_SORT_EXTENSION",
427      ICON_SORTBYEXT,
428      "Sort by extension",
429      "Sort the file list by extension/type"},
430     {FILE_SORT_TIME,
431      "FILE_SORT_TIME",
432      ICON_SORTTIME,
433      "Sort by time",
434      "Sort files by modification time"},
435     {FILE_SORT_SIZE, "FILE_SORT_SIZE", ICON_SORTSIZE, "Sort by size", "Sort files by size"},
436     {0, NULL, 0, NULL, NULL},
437 };
438
439 #ifdef RNA_RUNTIME
440
441 #  include "DNA_anim_types.h"
442 #  include "DNA_scene_types.h"
443 #  include "DNA_screen_types.h"
444 #  include "DNA_userdef_types.h"
445
446 #  include "BLI_path_util.h"
447 #  include "BLI_string.h"
448
449 #  include "BKE_animsys.h"
450 #  include "BKE_brush.h"
451 #  include "BKE_colortools.h"
452 #  include "BKE_context.h"
453 #  include "BKE_layer.h"
454 #  include "BKE_global.h"
455 #  include "BKE_nla.h"
456 #  include "BKE_paint.h"
457 #  include "BKE_scene.h"
458 #  include "BKE_screen.h"
459 #  include "BKE_icons.h"
460 #  include "BKE_workspace.h"
461
462 #  include "DEG_depsgraph.h"
463 #  include "DEG_depsgraph_build.h"
464
465 #  include "ED_anim_api.h"
466 #  include "ED_buttons.h"
467 #  include "ED_fileselect.h"
468 #  include "ED_image.h"
469 #  include "ED_node.h"
470 #  include "ED_transform.h"
471 #  include "ED_screen.h"
472 #  include "ED_view3d.h"
473 #  include "ED_sequencer.h"
474 #  include "ED_clip.h"
475
476 #  include "GPU_material.h"
477
478 #  include "IMB_imbuf_types.h"
479
480 #  include "UI_interface.h"
481 #  include "UI_view2d.h"
482
483 static StructRNA *rna_Space_refine(struct PointerRNA *ptr)
484 {
485   SpaceLink *space = (SpaceLink *)ptr->data;
486
487   switch (space->spacetype) {
488     case SPACE_VIEW3D:
489       return &RNA_SpaceView3D;
490     case SPACE_GRAPH:
491       return &RNA_SpaceGraphEditor;
492     case SPACE_OUTLINER:
493       return &RNA_SpaceOutliner;
494     case SPACE_PROPERTIES:
495       return &RNA_SpaceProperties;
496     case SPACE_FILE:
497       return &RNA_SpaceFileBrowser;
498     case SPACE_IMAGE:
499       return &RNA_SpaceImageEditor;
500     case SPACE_INFO:
501       return &RNA_SpaceInfo;
502     case SPACE_SEQ:
503       return &RNA_SpaceSequenceEditor;
504     case SPACE_TEXT:
505       return &RNA_SpaceTextEditor;
506     case SPACE_ACTION:
507       return &RNA_SpaceDopeSheetEditor;
508     case SPACE_NLA:
509       return &RNA_SpaceNLA;
510     case SPACE_NODE:
511       return &RNA_SpaceNodeEditor;
512     case SPACE_CONSOLE:
513       return &RNA_SpaceConsole;
514     case SPACE_USERPREF:
515       return &RNA_SpacePreferences;
516     case SPACE_CLIP:
517       return &RNA_SpaceClipEditor;
518     default:
519       return &RNA_Space;
520   }
521 }
522
523 static ScrArea *rna_area_from_space(PointerRNA *ptr)
524 {
525   bScreen *sc = (bScreen *)ptr->owner_id;
526   SpaceLink *link = (SpaceLink *)ptr->data;
527   return BKE_screen_find_area_from_space(sc, link);
528 }
529
530 static void area_region_from_regiondata(bScreen *sc,
531                                         void *regiondata,
532                                         ScrArea **r_sa,
533                                         ARegion **r_ar)
534 {
535   ScrArea *sa;
536   ARegion *ar;
537
538   *r_sa = NULL;
539   *r_ar = NULL;
540
541   for (sa = sc->areabase.first; sa; sa = sa->next) {
542     for (ar = sa->regionbase.first; ar; ar = ar->next) {
543       if (ar->regiondata == regiondata) {
544         *r_sa = sa;
545         *r_ar = ar;
546         return;
547       }
548     }
549   }
550 }
551
552 static void rna_area_region_from_regiondata(PointerRNA *ptr, ScrArea **r_sa, ARegion **r_ar)
553 {
554   bScreen *sc = (bScreen *)ptr->owner_id;
555   void *regiondata = ptr->data;
556
557   area_region_from_regiondata(sc, regiondata, r_sa, r_ar);
558 }
559
560 /* -------------------------------------------------------------------- */
561 /** \name Generic Region Flag Access
562  * \{ */
563
564 static bool rna_Space_bool_from_region_flag_get_by_type(PointerRNA *ptr,
565                                                         const int region_type,
566                                                         const int region_flag)
567 {
568   ScrArea *sa = rna_area_from_space(ptr);
569   ARegion *ar = BKE_area_find_region_type(sa, region_type);
570   if (ar) {
571     return (ar->flag & region_flag);
572   }
573   return false;
574 }
575
576 static void rna_Space_bool_from_region_flag_set_by_type(PointerRNA *ptr,
577                                                         const int region_type,
578                                                         const int region_flag,
579                                                         bool value)
580 {
581   ScrArea *sa = rna_area_from_space(ptr);
582   ARegion *ar = BKE_area_find_region_type(sa, region_type);
583   if (ar) {
584     SET_FLAG_FROM_TEST(ar->flag, value, region_flag);
585   }
586   ED_region_tag_redraw(ar);
587 }
588
589 static void rna_Space_bool_from_region_flag_update_by_type(bContext *C,
590                                                            PointerRNA *ptr,
591                                                            const int region_type,
592                                                            const int region_flag)
593 {
594   ScrArea *sa = rna_area_from_space(ptr);
595   ARegion *ar = BKE_area_find_region_type(sa, region_type);
596   if (ar) {
597     if (region_flag == RGN_FLAG_HIDDEN) {
598       /* Only support animation when the area is in the current context. */
599       if (ar->overlap && (sa == CTX_wm_area(C))) {
600         ED_region_visibility_change_update_animated(C, sa, ar);
601       }
602       else {
603         ED_region_visibility_change_update(C, sa, ar);
604       }
605     }
606     else if (region_flag == RGN_FLAG_HIDDEN_BY_USER) {
607       if (!(ar->flag & RGN_FLAG_HIDDEN_BY_USER) != !(ar->flag & RGN_FLAG_HIDDEN)) {
608         ED_region_toggle_hidden(C, ar);
609
610         if ((ar->flag & RGN_FLAG_HIDDEN_BY_USER) == 0) {
611           ED_area_type_hud_ensure(C, sa);
612         }
613       }
614     }
615   }
616 }
617
618 /** \} */
619
620 /* -------------------------------------------------------------------- */
621 /** \name Region Flag Access (Typed Callbacks)
622  * \{ */
623
624 /* Header Region. */
625 static bool rna_Space_show_region_header_get(PointerRNA *ptr)
626 {
627   return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_HEADER, RGN_FLAG_HIDDEN);
628 }
629 static void rna_Space_show_region_header_set(PointerRNA *ptr, bool value)
630 {
631   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_HEADER, RGN_FLAG_HIDDEN, !value);
632
633   /* Special case, never show the tool properties when the header is invisible. */
634   bool value_for_tool_header = value;
635   if (value == true) {
636     ScrArea *sa = rna_area_from_space(ptr);
637     ARegion *ar_tool_header = BKE_area_find_region_type(sa, RGN_TYPE_TOOL_HEADER);
638     if (ar_tool_header != NULL) {
639       value_for_tool_header = !(ar_tool_header->flag & RGN_FLAG_HIDDEN_BY_USER);
640     }
641   }
642   rna_Space_bool_from_region_flag_set_by_type(
643       ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN, !value_for_tool_header);
644 }
645 static void rna_Space_show_region_header_update(bContext *C, PointerRNA *ptr)
646 {
647   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_HEADER, RGN_FLAG_HIDDEN);
648 }
649
650 /* Footer Region. */
651 static bool rna_Space_show_region_footer_get(PointerRNA *ptr)
652 {
653   return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_FOOTER, RGN_FLAG_HIDDEN);
654 }
655 static void rna_Space_show_region_footer_set(PointerRNA *ptr, bool value)
656 {
657   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_FOOTER, RGN_FLAG_HIDDEN, !value);
658 }
659 static void rna_Space_show_region_footer_update(bContext *C, PointerRNA *ptr)
660 {
661   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_FOOTER, RGN_FLAG_HIDDEN);
662 }
663
664 /* Tool Header Region.
665  *
666  * This depends on the 'RGN_TYPE_TOOL_HEADER'
667  */
668 static bool rna_Space_show_region_tool_header_get(PointerRNA *ptr)
669 {
670   return !rna_Space_bool_from_region_flag_get_by_type(
671       ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN_BY_USER);
672 }
673 static void rna_Space_show_region_tool_header_set(PointerRNA *ptr, bool value)
674 {
675   rna_Space_bool_from_region_flag_set_by_type(
676       ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN_BY_USER, !value);
677   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN, !value);
678 }
679 static void rna_Space_show_region_tool_header_update(bContext *C, PointerRNA *ptr)
680 {
681   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_TOOL_HEADER, RGN_FLAG_HIDDEN);
682 }
683
684 /* Tools Region. */
685 static bool rna_Space_show_region_toolbar_get(PointerRNA *ptr)
686 {
687   return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_TOOLS, RGN_FLAG_HIDDEN);
688 }
689 static void rna_Space_show_region_toolbar_set(PointerRNA *ptr, bool value)
690 {
691   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_TOOLS, RGN_FLAG_HIDDEN, !value);
692 }
693 static void rna_Space_show_region_toolbar_update(bContext *C, PointerRNA *ptr)
694 {
695   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_TOOLS, RGN_FLAG_HIDDEN);
696 }
697
698 /* UI Region */
699 static bool rna_Space_show_region_ui_get(PointerRNA *ptr)
700 {
701   return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_UI, RGN_FLAG_HIDDEN);
702 }
703 static void rna_Space_show_region_ui_set(PointerRNA *ptr, bool value)
704 {
705   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_UI, RGN_FLAG_HIDDEN, !value);
706 }
707 static void rna_Space_show_region_ui_update(bContext *C, PointerRNA *ptr)
708 {
709   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_UI, RGN_FLAG_HIDDEN);
710 }
711
712 /* Redo (HUD) Region */
713 static bool rna_Space_show_region_hud_get(PointerRNA *ptr)
714 {
715   return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_HUD, RGN_FLAG_HIDDEN_BY_USER);
716 }
717 static void rna_Space_show_region_hud_set(PointerRNA *ptr, bool value)
718 {
719   rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_HUD, RGN_FLAG_HIDDEN_BY_USER, !value);
720 }
721 static void rna_Space_show_region_hud_update(bContext *C, PointerRNA *ptr)
722 {
723   rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_HUD, RGN_FLAG_HIDDEN_BY_USER);
724 }
725
726 /** \} */
727
728 static bool rna_Space_view2d_sync_get(PointerRNA *ptr)
729 {
730   ScrArea *sa;
731   ARegion *ar;
732
733   sa = rna_area_from_space(ptr); /* can be NULL */
734   ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
735   if (ar) {
736     View2D *v2d = &ar->v2d;
737     return (v2d->flag & V2D_VIEWSYNC_SCREEN_TIME) != 0;
738   }
739
740   return false;
741 }
742
743 static void rna_Space_view2d_sync_set(PointerRNA *ptr, bool value)
744 {
745   ScrArea *sa;
746   ARegion *ar;
747
748   sa = rna_area_from_space(ptr); /* can be NULL */
749   ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
750   if (ar) {
751     View2D *v2d = &ar->v2d;
752     if (value) {
753       v2d->flag |= V2D_VIEWSYNC_SCREEN_TIME;
754     }
755     else {
756       v2d->flag &= ~V2D_VIEWSYNC_SCREEN_TIME;
757     }
758   }
759 }
760
761 static void rna_Space_view2d_sync_update(Main *UNUSED(bmain),
762                                          Scene *UNUSED(scene),
763                                          PointerRNA *ptr)
764 {
765   ScrArea *sa;
766   ARegion *ar;
767
768   sa = rna_area_from_space(ptr); /* can be NULL */
769   ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
770
771   if (ar) {
772     bScreen *sc = (bScreen *)ptr->owner_id;
773     View2D *v2d = &ar->v2d;
774
775     UI_view2d_sync(sc, sa, v2d, V2D_LOCK_SET);
776   }
777 }
778
779 static void rna_GPencil_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
780 {
781   /* need set all caches as dirty to recalculate onion skinning */
782   for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
783     if (ob->type == OB_GPENCIL) {
784       DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
785     }
786   }
787   WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
788 }
789
790 /* Space 3D View */
791 static void rna_SpaceView3D_camera_update(Main *bmain, Scene *scene, PointerRNA *ptr)
792 {
793   View3D *v3d = (View3D *)(ptr->data);
794   if (v3d->scenelock) {
795     wmWindowManager *wm = bmain->wm.first;
796
797     scene->camera = v3d->camera;
798     WM_windows_scene_data_sync(&wm->windows, scene);
799   }
800 }
801
802 static void rna_SpaceView3D_use_local_camera_set(PointerRNA *ptr, bool value)
803 {
804   View3D *v3d = (View3D *)(ptr->data);
805   bScreen *sc = (bScreen *)ptr->owner_id;
806
807   v3d->scenelock = !value;
808
809   if (!value) {
810     Scene *scene = ED_screen_scene_find(sc, G_MAIN->wm.first);
811     v3d->camera = scene->camera;
812   }
813 }
814
815 static float rna_View3DOverlay_GridScaleUnit_get(PointerRNA *ptr)
816 {
817   View3D *v3d = (View3D *)(ptr->data);
818   bScreen *screen = (bScreen *)ptr->owner_id;
819   Scene *scene = ED_screen_scene_find(screen, G_MAIN->wm.first);
820
821   return ED_view3d_grid_scale(scene, v3d, NULL);
822 }
823
824 static PointerRNA rna_SpaceView3D_region_3d_get(PointerRNA *ptr)
825 {
826   View3D *v3d = (View3D *)(ptr->data);
827   ScrArea *sa = rna_area_from_space(ptr);
828   void *regiondata = NULL;
829   if (sa) {
830     ListBase *regionbase = (sa->spacedata.first == v3d) ? &sa->regionbase : &v3d->regionbase;
831     ARegion *ar = regionbase->last; /* always last in list, weak .. */
832     regiondata = ar->regiondata;
833   }
834
835   return rna_pointer_inherit_refine(ptr, &RNA_RegionView3D, regiondata);
836 }
837
838 static void rna_SpaceView3D_region_quadviews_begin(CollectionPropertyIterator *iter,
839                                                    PointerRNA *ptr)
840 {
841   View3D *v3d = (View3D *)(ptr->data);
842   ScrArea *sa = rna_area_from_space(ptr);
843   int i = 3;
844
845   ARegion *ar = ((sa && sa->spacedata.first == v3d) ? &sa->regionbase : &v3d->regionbase)->last;
846   ListBase lb = {NULL, NULL};
847
848   if (ar && ar->alignment == RGN_ALIGN_QSPLIT) {
849     while (i-- && ar) {
850       ar = ar->prev;
851     }
852
853     if (i < 0) {
854       lb.first = ar;
855     }
856   }
857
858   rna_iterator_listbase_begin(iter, &lb, NULL);
859 }
860
861 static PointerRNA rna_SpaceView3D_region_quadviews_get(CollectionPropertyIterator *iter)
862 {
863   void *regiondata = ((ARegion *)rna_iterator_listbase_get(iter))->regiondata;
864
865   return rna_pointer_inherit_refine(&iter->parent, &RNA_RegionView3D, regiondata);
866 }
867
868 static void rna_RegionView3D_quadview_update(Main *UNUSED(main),
869                                              Scene *UNUSED(scene),
870                                              PointerRNA *ptr)
871 {
872   ScrArea *sa;
873   ARegion *ar;
874
875   rna_area_region_from_regiondata(ptr, &sa, &ar);
876   if (sa && ar && ar->alignment == RGN_ALIGN_QSPLIT) {
877     ED_view3d_quadview_update(sa, ar, false);
878   }
879 }
880
881 /* same as above but call clip==true */
882 static void rna_RegionView3D_quadview_clip_update(Main *UNUSED(main),
883                                                   Scene *UNUSED(scene),
884                                                   PointerRNA *ptr)
885 {
886   ScrArea *sa;
887   ARegion *ar;
888
889   rna_area_region_from_regiondata(ptr, &sa, &ar);
890   if (sa && ar && ar->alignment == RGN_ALIGN_QSPLIT) {
891     ED_view3d_quadview_update(sa, ar, true);
892   }
893 }
894
895 static void rna_RegionView3D_view_location_get(PointerRNA *ptr, float *values)
896 {
897   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
898   negate_v3_v3(values, rv3d->ofs);
899 }
900
901 static void rna_RegionView3D_view_location_set(PointerRNA *ptr, const float *values)
902 {
903   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
904   negate_v3_v3(rv3d->ofs, values);
905 }
906
907 static void rna_RegionView3D_view_rotation_get(PointerRNA *ptr, float *values)
908 {
909   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
910   invert_qt_qt(values, rv3d->viewquat);
911 }
912
913 static void rna_RegionView3D_view_rotation_set(PointerRNA *ptr, const float *values)
914 {
915   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
916   invert_qt_qt(rv3d->viewquat, values);
917 }
918
919 static void rna_RegionView3D_view_matrix_set(PointerRNA *ptr, const float *values)
920 {
921   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
922   float mat[4][4];
923   invert_m4_m4(mat, (float(*)[4])values);
924   ED_view3d_from_m4(mat, rv3d->ofs, rv3d->viewquat, &rv3d->dist);
925 }
926
927 static bool rna_RegionView3D_is_orthographic_side_view_get(PointerRNA *ptr)
928 {
929   RegionView3D *rv3d = (RegionView3D *)(ptr->data);
930   return RV3D_VIEW_IS_AXIS(rv3d->view);
931 }
932
933 static void rna_3DViewShading_type_update(Main *bmain, Scene *scene, PointerRNA *ptr)
934 {
935   ID *id = ptr->owner_id;
936   if (GS(id->name) == ID_SCE) {
937     return;
938   }
939
940   View3DShading *shading = ptr->data;
941   if (shading->type == OB_MATERIAL ||
942       (shading->type == OB_RENDER && !STREQ(scene->r.engine, RE_engine_id_BLENDER_WORKBENCH))) {
943     /* When switching from workbench to render or material mode the geometry of any
944      * active sculpt session needs to be recalculated. */
945     for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
946       if (ob->sculpt) {
947         DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
948       }
949     }
950   }
951
952   bScreen *screen = (bScreen *)ptr->owner_id;
953   for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
954     for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) {
955       if (sl->spacetype == SPACE_VIEW3D) {
956         View3D *v3d = (View3D *)sl;
957         if (&v3d->shading == shading) {
958           ED_view3d_shade_update(bmain, v3d, sa);
959           return;
960         }
961       }
962     }
963   }
964 }
965
966 static Scene *rna_3DViewShading_scene(PointerRNA *ptr)
967 {
968   /* Get scene, depends if using 3D view or OpenGL render settings. */
969   ID *id = ptr->owner_id;
970   if (GS(id->name) == ID_SCE) {
971     return (Scene *)id;
972   }
973   else {
974     bScreen *screen = (bScreen *)ptr->owner_id;
975     return WM_windows_scene_get_from_screen(G_MAIN->wm.first, screen);
976   }
977 }
978
979 static int rna_3DViewShading_type_get(PointerRNA *ptr)
980 {
981   /* Available shading types depend on render engine. */
982   Scene *scene = rna_3DViewShading_scene(ptr);
983   RenderEngineType *type = (scene) ? RE_engines_find(scene->r.engine) : NULL;
984   View3DShading *shading = (View3DShading *)ptr->data;
985
986   if (scene == NULL || BKE_scene_uses_blender_eevee(scene)) {
987     return shading->type;
988   }
989   else if (BKE_scene_uses_blender_workbench(scene)) {
990     return (shading->type == OB_MATERIAL) ? OB_SOLID : shading->type;
991   }
992   else {
993     if (shading->type == OB_RENDER && !(type && type->view_draw)) {
994       return OB_MATERIAL;
995     }
996     else {
997       return shading->type;
998     }
999   }
1000 }
1001
1002 static void rna_3DViewShading_type_set(PointerRNA *ptr, int value)
1003 {
1004   View3DShading *shading = (View3DShading *)ptr->data;
1005   if (value != shading->type && value == OB_RENDER) {
1006     shading->prev_type = shading->type;
1007   }
1008   shading->type = value;
1009 }
1010
1011 static const EnumPropertyItem *rna_3DViewShading_type_itemf(bContext *UNUSED(C),
1012                                                             PointerRNA *ptr,
1013                                                             PropertyRNA *UNUSED(prop),
1014                                                             bool *r_free)
1015 {
1016   Scene *scene = rna_3DViewShading_scene(ptr);
1017   RenderEngineType *type = (scene) ? RE_engines_find(scene->r.engine) : NULL;
1018
1019   EnumPropertyItem *item = NULL;
1020   int totitem = 0;
1021
1022   RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_WIRE);
1023   RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_SOLID);
1024
1025   if (scene == NULL || BKE_scene_uses_blender_eevee(scene)) {
1026     RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_MATERIAL);
1027     RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_RENDER);
1028   }
1029   else if (BKE_scene_uses_blender_workbench(scene)) {
1030     RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_RENDER);
1031   }
1032   else {
1033     RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_MATERIAL);
1034     if (type && type->view_draw) {
1035       RNA_enum_items_add_value(&item, &totitem, rna_enum_shading_type_items, OB_RENDER);
1036     }
1037   }
1038
1039   RNA_enum_item_end(&item, &totitem);
1040   *r_free = true;
1041
1042   return item;
1043 }
1044
1045 /* Shading.selected_studio_light */
1046 static PointerRNA rna_View3DShading_selected_studio_light_get(PointerRNA *ptr)
1047 {
1048   View3DShading *shading = (View3DShading *)ptr->data;
1049   StudioLight *sl;
1050   if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_MATCAP) {
1051     sl = BKE_studiolight_find(shading->matcap, STUDIOLIGHT_FLAG_ALL);
1052   }
1053   else if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_STUDIO) {
1054     sl = BKE_studiolight_find(shading->studio_light, STUDIOLIGHT_FLAG_ALL);
1055   }
1056   else {
1057     sl = BKE_studiolight_find(shading->lookdev_light, STUDIOLIGHT_FLAG_ALL);
1058   }
1059   return rna_pointer_inherit_refine(ptr, &RNA_StudioLight, sl);
1060 }
1061
1062 /* shading.light */
1063 static const EnumPropertyItem *rna_View3DShading_color_type_itemf(bContext *UNUSED(C),
1064                                                                   PointerRNA *ptr,
1065                                                                   PropertyRNA *UNUSED(prop),
1066                                                                   bool *r_free)
1067 {
1068   View3DShading *shading = (View3DShading *)ptr->data;
1069
1070   int totitem = 0;
1071
1072   if (shading->type == OB_WIRE) {
1073     EnumPropertyItem *item = NULL;
1074     RNA_enum_items_add_value(
1075         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_SINGLE_COLOR);
1076     RNA_enum_items_add_value(
1077         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_OBJECT_COLOR);
1078     RNA_enum_items_add_value(
1079         &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_RANDOM_COLOR);
1080     RNA_enum_item_end(&item, &totitem);
1081     *r_free = true;
1082     return item;
1083   }
1084   else {
1085     /* Solid mode, or lookdev mode for workbench engine. */
1086     r_free = false;
1087     return rna_enum_shading_color_type_items;
1088   }
1089 }
1090
1091 /* Studio light */
1092 static int rna_View3DShading_studio_light_get(PointerRNA *ptr)
1093 {
1094   View3DShading *shading = (View3DShading *)ptr->data;
1095   char *dna_storage = shading->studio_light;
1096
1097   int flag = STUDIOLIGHT_TYPE_STUDIO;
1098   if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_MATCAP) {
1099     flag = STUDIOLIGHT_TYPE_MATCAP;
1100     dna_storage = shading->matcap;
1101   }
1102   else if (shading->type == OB_MATERIAL) {
1103     flag = STUDIOLIGHT_TYPE_WORLD;
1104     dna_storage = shading->lookdev_light;
1105   }
1106   StudioLight *sl = BKE_studiolight_find(dna_storage, flag);
1107   if (sl) {
1108     BLI_strncpy(dna_storage, sl->name, FILE_MAXFILE);
1109     return sl->index;
1110   }
1111   else {
1112     return 0;
1113   }
1114 }
1115
1116 static void rna_View3DShading_studio_light_set(PointerRNA *ptr, int value)
1117 {
1118   View3DShading *shading = (View3DShading *)ptr->data;
1119   char *dna_storage = shading->studio_light;
1120
1121   int flag = STUDIOLIGHT_TYPE_STUDIO;
1122   if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_MATCAP) {
1123     flag = STUDIOLIGHT_TYPE_MATCAP;
1124     dna_storage = shading->matcap;
1125   }
1126   else if (shading->type == OB_MATERIAL) {
1127     flag = STUDIOLIGHT_TYPE_WORLD;
1128     dna_storage = shading->lookdev_light;
1129   }
1130   StudioLight *sl = BKE_studiolight_findindex(value, flag);
1131   if (sl) {
1132     BLI_strncpy(dna_storage, sl->name, FILE_MAXFILE);
1133   }
1134 }
1135
1136 static const EnumPropertyItem *rna_View3DShading_studio_light_itemf(bContext *UNUSED(C),
1137                                                                     PointerRNA *ptr,
1138                                                                     PropertyRNA *UNUSED(prop),
1139                                                                     bool *r_free)
1140 {
1141   View3DShading *shading = (View3DShading *)ptr->data;
1142   EnumPropertyItem *item = NULL;
1143   int totitem = 0;
1144
1145   if (shading->type == OB_SOLID && shading->light == V3D_LIGHTING_MATCAP) {
1146     const int flags = (STUDIOLIGHT_EXTERNAL_FILE | STUDIOLIGHT_TYPE_MATCAP);
1147
1148     LISTBASE_FOREACH (StudioLight *, sl, BKE_studiolight_listbase()) {
1149       int icon_id = (shading->flag & V3D_SHADING_MATCAP_FLIP_X) ? sl->icon_id_matcap_flipped :
1150                                                                   sl->icon_id_matcap;
1151       if ((sl->flag & flags) == flags) {
1152         EnumPropertyItem tmp = {sl->index, sl->name, icon_id, sl->name, ""};
1153         RNA_enum_item_add(&item, &totitem, &tmp);
1154       }
1155     }
1156   }
1157   else {
1158     LISTBASE_FOREACH (StudioLight *, sl, BKE_studiolight_listbase()) {
1159       int icon_id = sl->icon_id_irradiance;
1160       bool show_studiolight = false;
1161
1162       if (sl->flag & STUDIOLIGHT_INTERNAL) {
1163         /* always show internal lights for solid */
1164         if (shading->type == OB_SOLID) {
1165           show_studiolight = true;
1166         }
1167       }
1168       else {
1169         switch (shading->type) {
1170           case OB_SOLID:
1171           case OB_TEXTURE:
1172             show_studiolight = ((sl->flag & STUDIOLIGHT_TYPE_STUDIO) != 0);
1173             break;
1174
1175           case OB_MATERIAL:
1176             show_studiolight = ((sl->flag & STUDIOLIGHT_TYPE_WORLD) != 0);
1177             icon_id = sl->icon_id_radiance;
1178             break;
1179         }
1180       }
1181
1182       if (show_studiolight) {
1183         EnumPropertyItem tmp = {sl->index, sl->name, icon_id, sl->name, ""};
1184         RNA_enum_item_add(&item, &totitem, &tmp);
1185       }
1186     }
1187   }
1188
1189   RNA_enum_item_end(&item, &totitem);
1190   *r_free = true;
1191   return item;
1192 }
1193
1194 static const EnumPropertyItem *rna_SpaceView3D_stereo3d_camera_itemf(bContext *C,
1195                                                                      PointerRNA *UNUSED(ptr),
1196                                                                      PropertyRNA *UNUSED(prop),
1197                                                                      bool *UNUSED(r_free))
1198 {
1199   Scene *scene = CTX_data_scene(C);
1200
1201   if (scene->r.views_format == SCE_VIEWS_FORMAT_MULTIVIEW) {
1202     return multiview_camera_items;
1203   }
1204   else {
1205     return stereo3d_camera_items;
1206   }
1207 }
1208
1209 static int rna_SpaceView3D_icon_from_show_object_viewport_get(PointerRNA *ptr)
1210 {
1211   const View3D *v3d = (View3D *)ptr->data;
1212   /* Ignore selection values when view is off,
1213    * intent is to show if visible objects aren't selectable. */
1214   const int view_value = (v3d->object_type_exclude_viewport != 0);
1215   const int select_value = (v3d->object_type_exclude_select &
1216                             ~v3d->object_type_exclude_viewport) != 0;
1217   return ICON_VIS_SEL_11 + (view_value << 1) + select_value;
1218 }
1219
1220 static char *rna_View3DShading_path(PointerRNA *UNUSED(ptr))
1221 {
1222   return BLI_strdup("shading");
1223 }
1224
1225 static PointerRNA rna_SpaceView3D_overlay_get(PointerRNA *ptr)
1226 {
1227   return rna_pointer_inherit_refine(ptr, &RNA_View3DOverlay, ptr->data);
1228 }
1229
1230 static char *rna_View3DOverlay_path(PointerRNA *UNUSED(ptr))
1231 {
1232   return BLI_strdup("overlay");
1233 }
1234
1235 /* Space Image Editor */
1236
1237 static PointerRNA rna_SpaceImageEditor_uvedit_get(PointerRNA *ptr)
1238 {
1239   return rna_pointer_inherit_refine(ptr, &RNA_SpaceUVEditor, ptr->data);
1240 }
1241
1242 static void rna_SpaceImageEditor_mode_update(Main *bmain, Scene *scene, PointerRNA *UNUSED(ptr))
1243 {
1244   ED_space_image_paint_update(bmain, bmain->wm.first, scene);
1245 }
1246
1247 static void rna_SpaceImageEditor_show_stereo_set(PointerRNA *ptr, int value)
1248 {
1249   SpaceImage *sima = (SpaceImage *)(ptr->data);
1250
1251   if (value) {
1252     sima->iuser.flag |= IMA_SHOW_STEREO;
1253   }
1254   else {
1255     sima->iuser.flag &= ~IMA_SHOW_STEREO;
1256   }
1257 }
1258
1259 static bool rna_SpaceImageEditor_show_stereo_get(PointerRNA *ptr)
1260 {
1261   SpaceImage *sima = (SpaceImage *)(ptr->data);
1262   return (sima->iuser.flag & IMA_SHOW_STEREO) != 0;
1263 }
1264
1265 static void rna_SpaceImageEditor_show_stereo_update(Main *UNUSED(bmain),
1266                                                     Scene *UNUSED(unused),
1267                                                     PointerRNA *ptr)
1268 {
1269   SpaceImage *sima = (SpaceImage *)(ptr->data);
1270   Image *ima = sima->image;
1271
1272   if (ima) {
1273     if (ima->rr) {
1274       BKE_image_multilayer_index(ima->rr, &sima->iuser);
1275     }
1276     else {
1277       BKE_image_multiview_index(ima, &sima->iuser);
1278     }
1279   }
1280 }
1281
1282 static bool rna_SpaceImageEditor_show_render_get(PointerRNA *ptr)
1283 {
1284   SpaceImage *sima = (SpaceImage *)(ptr->data);
1285   return ED_space_image_show_render(sima);
1286 }
1287
1288 static bool rna_SpaceImageEditor_show_paint_get(PointerRNA *ptr)
1289 {
1290   SpaceImage *sima = (SpaceImage *)(ptr->data);
1291   return ED_space_image_show_paint(sima);
1292 }
1293
1294 static bool rna_SpaceImageEditor_show_uvedit_get(PointerRNA *ptr)
1295 {
1296   SpaceImage *sima = (SpaceImage *)(ptr->data);
1297   bScreen *sc = (bScreen *)ptr->owner_id;
1298   wmWindow *win = ED_screen_window_find(sc, G_MAIN->wm.first);
1299   ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1300   Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
1301   return ED_space_image_show_uvedit(sima, obedit);
1302 }
1303
1304 static bool rna_SpaceImageEditor_show_maskedit_get(PointerRNA *ptr)
1305 {
1306   SpaceImage *sima = (SpaceImage *)(ptr->data);
1307   bScreen *sc = (bScreen *)ptr->owner_id;
1308   wmWindow *win = ED_screen_window_find(sc, G_MAIN->wm.first);
1309   ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1310   return ED_space_image_check_show_maskedit(sima, view_layer);
1311 }
1312
1313 static void rna_SpaceImageEditor_image_set(PointerRNA *ptr,
1314                                            PointerRNA value,
1315                                            struct ReportList *UNUSED(reports))
1316 {
1317   SpaceImage *sima = (SpaceImage *)(ptr->data);
1318   bScreen *sc = (bScreen *)ptr->owner_id;
1319   wmWindow *win = ED_screen_window_find(sc, G_MAIN->wm.first);
1320   ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1321   Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
1322
1323   BLI_assert(BKE_id_is_in_global_main(value.data));
1324   ED_space_image_set(G_MAIN, sima, obedit, (Image *)value.data, false);
1325 }
1326
1327 static void rna_SpaceImageEditor_mask_set(PointerRNA *ptr,
1328                                           PointerRNA value,
1329                                           struct ReportList *UNUSED(reports))
1330 {
1331   SpaceImage *sima = (SpaceImage *)(ptr->data);
1332
1333   ED_space_image_set_mask(NULL, sima, (Mask *)value.data);
1334 }
1335
1336 static const EnumPropertyItem *rna_SpaceImageEditor_display_channels_itemf(
1337     bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
1338 {
1339   SpaceImage *sima = (SpaceImage *)ptr->data;
1340   EnumPropertyItem *item = NULL;
1341   ImBuf *ibuf;
1342   void *lock;
1343   int zbuf, alpha, totitem = 0;
1344
1345   ibuf = ED_space_image_acquire_buffer(sima, &lock);
1346
1347   alpha = ibuf && (ibuf->channels == 4);
1348   zbuf = ibuf && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels == 1));
1349
1350   ED_space_image_release_buffer(sima, ibuf, lock);
1351
1352   if (alpha && zbuf) {
1353     return display_channels_items;
1354   }
1355
1356   if (alpha) {
1357     RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_USE_ALPHA);
1358     RNA_enum_items_add_value(&item, &totitem, display_channels_items, 0);
1359     RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_ALPHA);
1360   }
1361   else if (zbuf) {
1362     RNA_enum_items_add_value(&item, &totitem, display_channels_items, 0);
1363     RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_ZBUF);
1364   }
1365   else {
1366     RNA_enum_items_add_value(&item, &totitem, display_channels_items, 0);
1367   }
1368
1369   RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_R);
1370   RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_G);
1371   RNA_enum_items_add_value(&item, &totitem, display_channels_items, SI_SHOW_B);
1372
1373   RNA_enum_item_end(&item, &totitem);
1374   *r_free = true;
1375
1376   return item;
1377 }
1378
1379 static void rna_SpaceImageEditor_zoom_get(PointerRNA *ptr, float *values)
1380 {
1381   SpaceImage *sima = (SpaceImage *)ptr->data;
1382   ScrArea *sa;
1383   ARegion *ar;
1384
1385   values[0] = values[1] = 1;
1386
1387   /* find aregion */
1388   sa = rna_area_from_space(ptr); /* can be NULL */
1389   ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
1390   if (ar) {
1391     ED_space_image_get_zoom(sima, ar, &values[0], &values[1]);
1392   }
1393 }
1394
1395 static void rna_SpaceImageEditor_cursor_location_get(PointerRNA *ptr, float *values)
1396 {
1397   SpaceImage *sima = (SpaceImage *)ptr->data;
1398
1399   if (sima->flag & SI_COORDFLOATS) {
1400     copy_v2_v2(values, sima->cursor);
1401   }
1402   else {
1403     int w, h;
1404     ED_space_image_get_size(sima, &w, &h);
1405
1406     values[0] = sima->cursor[0] * w;
1407     values[1] = sima->cursor[1] * h;
1408   }
1409 }
1410
1411 static void rna_SpaceImageEditor_cursor_location_set(PointerRNA *ptr, const float *values)
1412 {
1413   SpaceImage *sima = (SpaceImage *)ptr->data;
1414
1415   if (sima->flag & SI_COORDFLOATS) {
1416     copy_v2_v2(sima->cursor, values);
1417   }
1418   else {
1419     int w, h;
1420     ED_space_image_get_size(sima, &w, &h);
1421
1422     sima->cursor[0] = values[0] / w;
1423     sima->cursor[1] = values[1] / h;
1424   }
1425 }
1426
1427 static void rna_SpaceImageEditor_image_update(Main *UNUSED(bmain),
1428                                               Scene *UNUSED(scene),
1429                                               PointerRNA *ptr)
1430 {
1431   SpaceImage *sima = (SpaceImage *)ptr->data;
1432   Image *ima = sima->image;
1433
1434   /* make sure all the iuser settings are valid for the sima image */
1435   if (ima) {
1436     if (ima->rr) {
1437       if (BKE_image_multilayer_index(sima->image->rr, &sima->iuser) == NULL) {
1438         BKE_image_init_imageuser(sima->image, &sima->iuser);
1439       }
1440     }
1441     else {
1442       BKE_image_multiview_index(ima, &sima->iuser);
1443     }
1444   }
1445 }
1446
1447 static void rna_SpaceImageEditor_scopes_update(struct bContext *C, struct PointerRNA *ptr)
1448 {
1449   SpaceImage *sima = (SpaceImage *)ptr->data;
1450   ImBuf *ibuf;
1451   void *lock;
1452
1453   ibuf = ED_space_image_acquire_buffer(sima, &lock);
1454   if (ibuf) {
1455     ED_space_image_scopes_update(C, sima, ibuf, true);
1456     WM_main_add_notifier(NC_IMAGE, sima->image);
1457   }
1458   ED_space_image_release_buffer(sima, ibuf, lock);
1459 }
1460
1461 static const EnumPropertyItem *rna_SpaceImageEditor_pivot_itemf(bContext *UNUSED(C),
1462                                                                 PointerRNA *ptr,
1463                                                                 PropertyRNA *UNUSED(prop),
1464                                                                 bool *UNUSED(r_free))
1465 {
1466   static const EnumPropertyItem pivot_items[] = {
1467       {V3D_AROUND_CENTER_BOUNDS, "CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", ""},
1468       {V3D_AROUND_CENTER_MEDIAN, "MEDIAN", ICON_PIVOT_MEDIAN, "Median Point", ""},
1469       {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", ""},
1470       {V3D_AROUND_LOCAL_ORIGINS,
1471        "INDIVIDUAL_ORIGINS",
1472        ICON_PIVOT_INDIVIDUAL,
1473        "Individual Origins",
1474        "Pivot around each selected island's own median point"},
1475       {0, NULL, 0, NULL, NULL},
1476   };
1477
1478   SpaceImage *sima = (SpaceImage *)ptr->data;
1479
1480   if (sima->mode == SI_MODE_PAINT) {
1481     return rna_enum_transform_pivot_items_full;
1482   }
1483   else {
1484     return pivot_items;
1485   }
1486 }
1487
1488 /* Space Text Editor */
1489
1490 static void rna_SpaceTextEditor_word_wrap_set(PointerRNA *ptr, bool value)
1491 {
1492   SpaceText *st = (SpaceText *)(ptr->data);
1493
1494   st->wordwrap = value;
1495   st->left = 0;
1496 }
1497
1498 static void rna_SpaceTextEditor_text_set(PointerRNA *ptr,
1499                                          PointerRNA value,
1500                                          struct ReportList *UNUSED(reports))
1501 {
1502   SpaceText *st = (SpaceText *)(ptr->data);
1503
1504   st->text = value.data;
1505
1506   WM_main_add_notifier(NC_TEXT | NA_SELECTED, st->text);
1507 }
1508
1509 static bool rna_SpaceTextEditor_text_is_syntax_highlight_supported(struct SpaceText *space)
1510 {
1511   return ED_text_is_syntax_highlight_supported(space->text);
1512 }
1513
1514 static void rna_SpaceTextEditor_updateEdited(Main *UNUSED(bmain),
1515                                              Scene *UNUSED(scene),
1516                                              PointerRNA *ptr)
1517 {
1518   SpaceText *st = (SpaceText *)ptr->data;
1519
1520   if (st->text) {
1521     WM_main_add_notifier(NC_TEXT | NA_EDITED, st->text);
1522   }
1523 }
1524
1525 /* Space Properties */
1526
1527 /* note: this function exists only to avoid id refcounting */
1528 static void rna_SpaceProperties_pin_id_set(PointerRNA *ptr,
1529                                            PointerRNA value,
1530                                            struct ReportList *UNUSED(reports))
1531 {
1532   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1533   sbuts->pinid = value.data;
1534 }
1535
1536 static StructRNA *rna_SpaceProperties_pin_id_typef(PointerRNA *ptr)
1537 {
1538   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1539
1540   if (sbuts->pinid) {
1541     return ID_code_to_RNA_type(GS(sbuts->pinid->name));
1542   }
1543
1544   return &RNA_ID;
1545 }
1546
1547 static void rna_SpaceProperties_pin_id_update(Main *UNUSED(bmain),
1548                                               Scene *UNUSED(scene),
1549                                               PointerRNA *ptr)
1550 {
1551   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1552   ID *id = sbuts->pinid;
1553
1554   if (id == NULL) {
1555     sbuts->flag &= ~SB_PIN_CONTEXT;
1556     return;
1557   }
1558
1559   switch (GS(id->name)) {
1560     case ID_MA:
1561       WM_main_add_notifier(NC_MATERIAL | ND_SHADING, NULL);
1562       break;
1563     case ID_TE:
1564       WM_main_add_notifier(NC_TEXTURE, NULL);
1565       break;
1566     case ID_WO:
1567       WM_main_add_notifier(NC_WORLD, NULL);
1568       break;
1569     case ID_LA:
1570       WM_main_add_notifier(NC_LAMP, NULL);
1571       break;
1572     default:
1573       break;
1574   }
1575 }
1576
1577 static void rna_SpaceProperties_context_set(PointerRNA *ptr, int value)
1578 {
1579   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1580
1581   sbuts->mainb = value;
1582   sbuts->mainbuser = value;
1583 }
1584
1585 static const EnumPropertyItem *rna_SpaceProperties_context_itemf(bContext *UNUSED(C),
1586                                                                  PointerRNA *ptr,
1587                                                                  PropertyRNA *UNUSED(prop),
1588                                                                  bool *r_free)
1589 {
1590   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1591   EnumPropertyItem *item = NULL;
1592   int totitem = 0;
1593
1594   if (sbuts->pathflag & (1 << BCONTEXT_TOOL)) {
1595     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_TOOL);
1596   }
1597
1598   if (totitem) {
1599     RNA_enum_item_add_separator(&item, &totitem);
1600   }
1601
1602   if (sbuts->pathflag & (1 << BCONTEXT_RENDER)) {
1603     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_RENDER);
1604   }
1605
1606   if (sbuts->pathflag & (1 << BCONTEXT_OUTPUT)) {
1607     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_OUTPUT);
1608   }
1609
1610   if (sbuts->pathflag & (1 << BCONTEXT_VIEW_LAYER)) {
1611     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_VIEW_LAYER);
1612   }
1613
1614   if (sbuts->pathflag & (1 << BCONTEXT_SCENE)) {
1615     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_SCENE);
1616   }
1617
1618   if (sbuts->pathflag & (1 << BCONTEXT_WORLD)) {
1619     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_WORLD);
1620   }
1621
1622   if (totitem) {
1623     RNA_enum_item_add_separator(&item, &totitem);
1624   }
1625
1626   if (sbuts->pathflag & (1 << BCONTEXT_OBJECT)) {
1627     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_OBJECT);
1628   }
1629
1630   if (sbuts->pathflag & (1 << BCONTEXT_MODIFIER)) {
1631     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_MODIFIER);
1632   }
1633
1634   if (sbuts->pathflag & (1 << BCONTEXT_SHADERFX)) {
1635     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_SHADERFX);
1636   }
1637
1638   if (sbuts->pathflag & (1 << BCONTEXT_PARTICLE)) {
1639     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_PARTICLE);
1640   }
1641
1642   if (sbuts->pathflag & (1 << BCONTEXT_PHYSICS)) {
1643     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_PHYSICS);
1644   }
1645
1646   if (sbuts->pathflag & (1 << BCONTEXT_CONSTRAINT)) {
1647     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_CONSTRAINT);
1648   }
1649
1650   if (sbuts->pathflag & (1 << BCONTEXT_DATA)) {
1651     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_DATA);
1652     (item + totitem - 1)->icon = sbuts->dataicon;
1653   }
1654
1655   if (sbuts->pathflag & (1 << BCONTEXT_BONE)) {
1656     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_BONE);
1657   }
1658
1659   if (sbuts->pathflag & (1 << BCONTEXT_BONE_CONSTRAINT)) {
1660     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_BONE_CONSTRAINT);
1661   }
1662
1663   if (sbuts->pathflag & (1 << BCONTEXT_MATERIAL)) {
1664     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_MATERIAL);
1665   }
1666
1667   if (totitem) {
1668     RNA_enum_item_add_separator(&item, &totitem);
1669   }
1670
1671   if (sbuts->pathflag & (1 << BCONTEXT_TEXTURE)) {
1672     RNA_enum_items_add_value(&item, &totitem, buttons_context_items, BCONTEXT_TEXTURE);
1673   }
1674
1675   RNA_enum_item_end(&item, &totitem);
1676   *r_free = true;
1677
1678   return item;
1679 }
1680
1681 static void rna_SpaceProperties_context_update(Main *UNUSED(bmain),
1682                                                Scene *UNUSED(scene),
1683                                                PointerRNA *ptr)
1684 {
1685   SpaceProperties *sbuts = (SpaceProperties *)(ptr->data);
1686   /* XXX BCONTEXT_DATA is ugly, but required for lights... See T51318. */
1687   if (ELEM(sbuts->mainb, BCONTEXT_WORLD, BCONTEXT_MATERIAL, BCONTEXT_TEXTURE, BCONTEXT_DATA)) {
1688     sbuts->preview = 1;
1689   }
1690 }
1691
1692 /* Space Console */
1693 static void rna_ConsoleLine_body_get(PointerRNA *ptr, char *value)
1694 {
1695   ConsoleLine *ci = (ConsoleLine *)ptr->data;
1696   memcpy(value, ci->line, ci->len + 1);
1697 }
1698
1699 static int rna_ConsoleLine_body_length(PointerRNA *ptr)
1700 {
1701   ConsoleLine *ci = (ConsoleLine *)ptr->data;
1702   return ci->len;
1703 }
1704
1705 static void rna_ConsoleLine_body_set(PointerRNA *ptr, const char *value)
1706 {
1707   ConsoleLine *ci = (ConsoleLine *)ptr->data;
1708   int len = strlen(value);
1709
1710   if ((len >= ci->len_alloc) || (len * 2 < ci->len_alloc)) { /* allocate a new string */
1711     MEM_freeN(ci->line);
1712     ci->line = MEM_mallocN((len + 1) * sizeof(char), "rna_consoleline");
1713     ci->len_alloc = len + 1;
1714   }
1715   memcpy(ci->line, value, len + 1);
1716   ci->len = len;
1717
1718   if (ci->cursor > len) {
1719     /* clamp the cursor */
1720     ci->cursor = len;
1721   }
1722 }
1723
1724 static void rna_ConsoleLine_cursor_index_range(
1725     PointerRNA *ptr, int *min, int *max, int *UNUSED(softmin), int *UNUSED(softmax))
1726 {
1727   ConsoleLine *ci = (ConsoleLine *)ptr->data;
1728
1729   *min = 0;
1730   *max = ci->len; /* intentionally _not_ -1 */
1731 }
1732
1733 /* Space Dopesheet */
1734
1735 static void rna_SpaceDopeSheetEditor_action_set(PointerRNA *ptr,
1736                                                 PointerRNA value,
1737                                                 struct ReportList *UNUSED(reports))
1738 {
1739   SpaceAction *saction = (SpaceAction *)(ptr->data);
1740   bAction *act = (bAction *)value.data;
1741
1742   if ((act == NULL) || (act->idroot == 0)) {
1743     /* just set if we're clearing the action or if the action is "amorphous" still */
1744     saction->action = act;
1745   }
1746   else {
1747     /* action to set must strictly meet the mode criteria... */
1748     if (saction->mode == SACTCONT_ACTION) {
1749       /* currently, this is "object-level" only, until we have some way of specifying this */
1750       if (act->idroot == ID_OB) {
1751         saction->action = act;
1752       }
1753       else {
1754         printf(
1755             "ERROR: cannot assign Action '%s' to Action Editor, as action is not object-level "
1756             "animation\n",
1757             act->id.name + 2);
1758       }
1759     }
1760     else if (saction->mode == SACTCONT_SHAPEKEY) {
1761       /* as the name says, "shapekey-level" only... */
1762       if (act->idroot == ID_KE) {
1763         saction->action = act;
1764       }
1765       else {
1766         printf(
1767             "ERROR: cannot assign Action '%s' to Shape Key Editor, as action doesn't animate "
1768             "Shape Keys\n",
1769             act->id.name + 2);
1770       }
1771     }
1772     else {
1773       printf(
1774           "ACK: who's trying to set an action while not in a mode displaying a single Action "
1775           "only?\n");
1776     }
1777   }
1778 }
1779
1780 static void rna_SpaceDopeSheetEditor_action_update(bContext *C, PointerRNA *ptr)
1781 {
1782   SpaceAction *saction = (SpaceAction *)(ptr->data);
1783   ViewLayer *view_layer = CTX_data_view_layer(C);
1784   Main *bmain = CTX_data_main(C);
1785   Object *obact = OBACT(view_layer);
1786
1787   /* we must set this action to be the one used by active object (if not pinned) */
1788   if (obact /* && saction->pin == 0*/) {
1789     AnimData *adt = NULL;
1790
1791     if (saction->mode == SACTCONT_ACTION) {
1792       /* TODO: context selector could help decide this with more control? */
1793       adt = BKE_animdata_add_id(&obact->id); /* this only adds if non-existent */
1794     }
1795     else if (saction->mode == SACTCONT_SHAPEKEY) {
1796       Key *key = BKE_key_from_object(obact);
1797       if (key) {
1798         adt = BKE_animdata_add_id(&key->id); /* this only adds if non-existent */
1799       }
1800     }
1801
1802     /* set action */
1803     // FIXME: this overlaps a lot with the BKE_animdata_set_action() API method
1804     if (adt) {
1805       /* Don't do anything if old and new actions are the same... */
1806       if (adt->action != saction->action) {
1807         /* NLA Tweak Mode needs special handling... */
1808         if (adt->flag & ADT_NLA_EDIT_ON) {
1809           /* Exit editmode first - we cannot change actions while in tweakmode
1810            * NOTE: This will clear the action ref properly
1811            */
1812           BKE_nla_tweakmode_exit(adt);
1813
1814           /* Assign new action, and adjust the usercounts accordingly */
1815           adt->action = saction->action;
1816           id_us_plus((ID *)adt->action);
1817         }
1818         else {
1819           /* Handle old action... */
1820           if (adt->action) {
1821             /* Fix id-count of action we're replacing */
1822             id_us_min(&adt->action->id);
1823
1824             /* To prevent data loss (i.e. if users flip between actions using the Browse menu),
1825              * stash this action if nothing else uses it.
1826              *
1827              * EXCEPTION:
1828              * This callback runs when unlinking actions. In that case, we don't want to
1829              * stash the action, as the user is signaling that they want to detach it.
1830              * This can be reviewed again later,
1831              * but it could get annoying if we keep these instead.
1832              */
1833             if ((adt->action->id.us <= 0) && (saction->action != NULL)) {
1834               /* XXX: Things here get dodgy if this action is only partially completed,
1835                *      and the user then uses the browse menu to get back to this action,
1836                *      assigning it as the active action (i.e. the stash strip gets out of sync)
1837                */
1838               BKE_nla_action_stash(adt);
1839             }
1840           }
1841
1842           /* Assign new action, and adjust the usercounts accordingly */
1843           adt->action = saction->action;
1844           id_us_plus((ID *)adt->action);
1845         }
1846       }
1847
1848       /* Force update of animdata */
1849       DEG_id_tag_update(&obact->id, ID_RECALC_ANIMATION);
1850     }
1851
1852     /* force depsgraph flush too */
1853     DEG_id_tag_update(&obact->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
1854     /* Update relations as well, so new time source dependency is added. */
1855     DEG_relations_tag_update(bmain);
1856   }
1857 }
1858
1859 static void rna_SpaceDopeSheetEditor_mode_update(bContext *C, PointerRNA *ptr)
1860 {
1861   SpaceAction *saction = (SpaceAction *)(ptr->data);
1862   ScrArea *sa = CTX_wm_area(C);
1863   ViewLayer *view_layer = CTX_data_view_layer(C);
1864   Object *obact = OBACT(view_layer);
1865
1866   /* special exceptions for ShapeKey Editor mode */
1867   if (saction->mode == SACTCONT_SHAPEKEY) {
1868     Key *key = BKE_key_from_object(obact);
1869
1870     /* 1) update the action stored for the editor */
1871     if (key) {
1872       saction->action = (key->adt) ? key->adt->action : NULL;
1873     }
1874     else {
1875       saction->action = NULL;
1876     }
1877
1878     /* 2) enable 'show sliders' by default, since one of the main
1879      *    points of the ShapeKey Editor is to provide a one-stop shop
1880      *    for controlling the shapekeys, whose main control is the value
1881      */
1882     saction->flag |= SACTION_SLIDERS;
1883   }
1884   /* make sure action stored is valid */
1885   else if (saction->mode == SACTCONT_ACTION) {
1886     /* 1) update the action stored for the editor */
1887     /* TODO: context selector could help decide this with more control? */
1888     if (obact) {
1889       saction->action = (obact->adt) ? obact->adt->action : NULL;
1890     }
1891     else {
1892       saction->action = NULL;
1893     }
1894   }
1895
1896   /* Collapse (and show) summary channel and hide channel list for timeline */
1897   if (saction->mode == SACTCONT_TIMELINE) {
1898     saction->ads.flag |= ADS_FLAG_SUMMARY_COLLAPSED;
1899     saction->ads.filterflag |= ADS_FILTER_SUMMARY;
1900   }
1901
1902   if (sa && sa->spacedata.first == saction) {
1903     ARegion *channels_region = BKE_area_find_region_type(sa, RGN_TYPE_CHANNELS);
1904     if (channels_region) {
1905       if (saction->mode == SACTCONT_TIMELINE) {
1906         channels_region->flag |= RGN_FLAG_HIDDEN;
1907       }
1908       else {
1909         channels_region->flag &= ~RGN_FLAG_HIDDEN;
1910       }
1911       ED_region_visibility_change_update(C, sa, channels_region);
1912     }
1913   }
1914
1915   /* recalculate extents of channel list */
1916   saction->runtime.flag |= SACTION_RUNTIME_FLAG_NEED_CHAN_SYNC;
1917
1918   /* store current mode as "old mode",
1919    * so that returning from other editors doesn't always reset to "Action Editor" */
1920   if (saction->mode != SACTCONT_TIMELINE) {
1921     saction->mode_prev = saction->mode;
1922   }
1923 }
1924
1925 /* Space Graph Editor */
1926
1927 static void rna_SpaceGraphEditor_display_mode_update(bContext *C, PointerRNA *ptr)
1928 {
1929   ScrArea *sa = rna_area_from_space(ptr);
1930   SpaceGraph *sipo = (SpaceGraph *)ptr->data;
1931
1932   /* for "Drivers" mode, enable all the necessary bits and pieces */
1933   if (sipo->mode == SIPO_MODE_DRIVERS) {
1934     ED_drivers_editor_init(C, sa);
1935     ED_area_tag_redraw(sa);
1936   }
1937
1938   /* after changing view mode, must force recalculation of F-Curve colors
1939    * which can only be achieved using refresh as opposed to redraw
1940    */
1941   ED_area_tag_refresh(sa);
1942 }
1943
1944 static bool rna_SpaceGraphEditor_has_ghost_curves_get(PointerRNA *ptr)
1945 {
1946   SpaceGraph *sipo = (SpaceGraph *)(ptr->data);
1947   return (BLI_listbase_is_empty(&sipo->runtime.ghost_curves) == false);
1948 }
1949
1950 static void rna_SpaceConsole_rect_update(Main *UNUSED(bmain),
1951                                          Scene *UNUSED(scene),
1952                                          PointerRNA *ptr)
1953 {
1954   SpaceConsole *sc = ptr->data;
1955   WM_main_add_notifier(NC_SPACE | ND_SPACE_CONSOLE | NA_EDITED, sc);
1956 }
1957
1958 static void rna_SequenceEditor_update_cache(Main *UNUSED(bmain),
1959                                             Scene *scene,
1960                                             PointerRNA *UNUSED(ptr))
1961 {
1962   BKE_sequencer_cache_cleanup(scene);
1963 }
1964
1965 static void rna_Sequencer_view_type_update(Main *UNUSED(bmain),
1966                                            Scene *UNUSED(scene),
1967                                            PointerRNA *ptr)
1968 {
1969   ScrArea *sa = rna_area_from_space(ptr);
1970   ED_area_tag_refresh(sa);
1971 }
1972
1973 /* Space Node Editor */
1974
1975 static void rna_SpaceNodeEditor_node_tree_set(PointerRNA *ptr,
1976                                               const PointerRNA value,
1977                                               struct ReportList *UNUSED(reports))
1978 {
1979   SpaceNode *snode = (SpaceNode *)ptr->data;
1980   ED_node_tree_start(snode, (bNodeTree *)value.data, NULL, NULL);
1981 }
1982
1983 static bool rna_SpaceNodeEditor_node_tree_poll(PointerRNA *ptr, const PointerRNA value)
1984 {
1985   SpaceNode *snode = (SpaceNode *)ptr->data;
1986   bNodeTree *ntree = (bNodeTree *)value.data;
1987
1988   /* node tree type must match the selected type in node editor */
1989   return (STREQ(snode->tree_idname, ntree->idname));
1990 }
1991
1992 static void rna_SpaceNodeEditor_node_tree_update(const bContext *C, PointerRNA *UNUSED(ptr))
1993 {
1994   ED_node_tree_update(C);
1995 }
1996
1997 static int rna_SpaceNodeEditor_tree_type_get(PointerRNA *ptr)
1998 {
1999   SpaceNode *snode = (SpaceNode *)ptr->data;
2000   return rna_node_tree_idname_to_enum(snode->tree_idname);
2001 }
2002 static void rna_SpaceNodeEditor_tree_type_set(PointerRNA *ptr, int value)
2003 {
2004   SpaceNode *snode = (SpaceNode *)ptr->data;
2005   ED_node_set_tree_type(snode, rna_node_tree_type_from_enum(value));
2006 }
2007 static bool rna_SpaceNodeEditor_tree_type_poll(void *Cv, bNodeTreeType *type)
2008 {
2009   bContext *C = (bContext *)Cv;
2010   if (type->poll) {
2011     return type->poll(C, type);
2012   }
2013   else {
2014     return true;
2015   }
2016 }
2017
2018 const EnumPropertyItem *RNA_enum_node_tree_types_itemf_impl(bContext *C, bool *r_free)
2019 {
2020   return rna_node_tree_type_itemf(C, rna_SpaceNodeEditor_tree_type_poll, r_free);
2021 }
2022
2023 static const EnumPropertyItem *rna_SpaceNodeEditor_tree_type_itemf(bContext *C,
2024                                                                    PointerRNA *UNUSED(ptr),
2025                                                                    PropertyRNA *UNUSED(prop),
2026                                                                    bool *r_free)
2027 {
2028   return RNA_enum_node_tree_types_itemf_impl(C, r_free);
2029 }
2030
2031 static void rna_SpaceNodeEditor_path_get(PointerRNA *ptr, char *value)
2032 {
2033   SpaceNode *snode = ptr->data;
2034   ED_node_tree_path_get(snode, value);
2035 }
2036
2037 static int rna_SpaceNodeEditor_path_length(PointerRNA *ptr)
2038 {
2039   SpaceNode *snode = ptr->data;
2040   return ED_node_tree_path_length(snode);
2041 }
2042
2043 static void rna_SpaceNodeEditor_path_clear(SpaceNode *snode, bContext *C)
2044 {
2045   ED_node_tree_start(snode, NULL, NULL, NULL);
2046   ED_node_tree_update(C);
2047 }
2048
2049 static void rna_SpaceNodeEditor_path_start(SpaceNode *snode, bContext *C, PointerRNA *node_tree)
2050 {
2051   ED_node_tree_start(snode, (bNodeTree *)node_tree->data, NULL, NULL);
2052   ED_node_tree_update(C);
2053 }
2054
2055 static void rna_SpaceNodeEditor_path_append(SpaceNode *snode,
2056                                             bContext *C,
2057                                             PointerRNA *node_tree,
2058                                             PointerRNA *node)
2059 {
2060   ED_node_tree_push(snode, node_tree->data, node->data);
2061   ED_node_tree_update(C);
2062 }
2063
2064 static void rna_SpaceNodeEditor_path_pop(SpaceNode *snode, bContext *C)
2065 {
2066   ED_node_tree_pop(snode);
2067   ED_node_tree_update(C);
2068 }
2069
2070 static void rna_SpaceNodeEditor_show_backdrop_update(Main *UNUSED(bmain),
2071                                                      Scene *UNUSED(scene),
2072                                                      PointerRNA *UNUSED(ptr))
2073 {
2074   WM_main_add_notifier(NC_NODE | NA_EDITED, NULL);
2075   WM_main_add_notifier(NC_SCENE | ND_NODES, NULL);
2076 }
2077
2078 static void rna_SpaceNodeEditor_cursor_location_from_region(SpaceNode *snode,
2079                                                             bContext *C,
2080                                                             int x,
2081                                                             int y)
2082 {
2083   ARegion *ar = CTX_wm_region(C);
2084
2085   UI_view2d_region_to_view(&ar->v2d, x, y, &snode->cursor[0], &snode->cursor[1]);
2086   snode->cursor[0] /= UI_DPI_FAC;
2087   snode->cursor[1] /= UI_DPI_FAC;
2088 }
2089
2090 static void rna_SpaceClipEditor_clip_set(PointerRNA *ptr,
2091                                          PointerRNA value,
2092                                          struct ReportList *UNUSED(reports))
2093 {
2094   SpaceClip *sc = (SpaceClip *)(ptr->data);
2095   bScreen *screen = (bScreen *)ptr->owner_id;
2096
2097   ED_space_clip_set_clip(NULL, screen, sc, (MovieClip *)value.data);
2098 }
2099
2100 static void rna_SpaceClipEditor_mask_set(PointerRNA *ptr,
2101                                          PointerRNA value,
2102                                          struct ReportList *UNUSED(reports))
2103 {
2104   SpaceClip *sc = (SpaceClip *)(ptr->data);
2105
2106   ED_space_clip_set_mask(NULL, sc, (Mask *)value.data);
2107 }
2108
2109 static void rna_SpaceClipEditor_clip_mode_update(Main *UNUSED(bmain),
2110                                                  Scene *UNUSED(scene),
2111                                                  PointerRNA *ptr)
2112 {
2113   SpaceClip *sc = (SpaceClip *)(ptr->data);
2114
2115   if (sc->mode == SC_MODE_MASKEDIT && sc->view != SC_VIEW_CLIP) {
2116     /* Make sure we are in the right view for mask editing */
2117     sc->view = SC_VIEW_CLIP;
2118     ScrArea *sa = rna_area_from_space(ptr);
2119     ED_area_tag_refresh(sa);
2120   }
2121
2122   sc->scopes.ok = 0;
2123 }
2124
2125 static void rna_SpaceClipEditor_lock_selection_update(Main *UNUSED(bmain),
2126                                                       Scene *UNUSED(scene),
2127                                                       PointerRNA *ptr)
2128 {
2129   SpaceClip *sc = (SpaceClip *)(ptr->data);
2130
2131   sc->xlockof = 0.f;
2132   sc->ylockof = 0.f;
2133 }
2134
2135 static void rna_SpaceClipEditor_view_type_update(Main *UNUSED(bmain),
2136                                                  Scene *UNUSED(scene),
2137                                                  PointerRNA *ptr)
2138 {
2139   ScrArea *sa = rna_area_from_space(ptr);
2140   ED_area_tag_refresh(sa);
2141 }
2142
2143 /* File browser. */
2144
2145 static bool rna_FileSelectParams_use_lib_get(PointerRNA *ptr)
2146 {
2147   FileSelectParams *params = ptr->data;
2148
2149   return params && (params->type == FILE_LOADLIB);
2150 }
2151
2152 static const EnumPropertyItem *rna_FileSelectParams_recursion_level_itemf(
2153     bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
2154 {
2155   FileSelectParams *params = ptr->data;
2156
2157   if (params && params->type != FILE_LOADLIB) {
2158     EnumPropertyItem *item = NULL;
2159     int totitem = 0;
2160
2161     RNA_enum_items_add_value(&item, &totitem, fileselectparams_recursion_level_items, 0);
2162     RNA_enum_items_add_value(&item, &totitem, fileselectparams_recursion_level_items, 2);
2163     RNA_enum_items_add_value(&item, &totitem, fileselectparams_recursion_level_items, 3);
2164     RNA_enum_items_add_value(&item, &totitem, fileselectparams_recursion_level_items, 4);
2165
2166     RNA_enum_item_end(&item, &totitem);
2167     *r_free = true;
2168
2169     return item;
2170   }
2171
2172   *r_free = false;
2173   return fileselectparams_recursion_level_items;
2174 }
2175
2176 static void rna_FileSelectPrams_filter_glob_set(PointerRNA *ptr, const char *value)
2177 {
2178   FileSelectParams *params = ptr->data;
2179
2180   BLI_strncpy(params->filter_glob, value, sizeof(params->filter_glob));
2181
2182   /* Remove stupi things like last group being a wildcard-only one... */
2183   BLI_path_extension_glob_validate(params->filter_glob);
2184 }
2185
2186 static void rna_FileBrowser_FSMenuEntry_path_get(PointerRNA *ptr, char *value)
2187 {
2188   char *path = ED_fsmenu_entry_get_path(ptr->data);
2189
2190   strcpy(value, path ? path : "");
2191 }
2192
2193 static int rna_FileBrowser_FSMenuEntry_path_length(PointerRNA *ptr)
2194 {
2195   char *path = ED_fsmenu_entry_get_path(ptr->data);
2196
2197   return (int)(path ? strlen(path) : 0);
2198 }
2199
2200 static void rna_FileBrowser_FSMenuEntry_path_set(PointerRNA *ptr, const char *value)
2201 {
2202   FSMenuEntry *fsm = ptr->data;
2203
2204   /* Note: this will write to file immediately.
2205    * Not nice (and to be fixed ultimately), but acceptable in this case for now. */
2206   ED_fsmenu_entry_set_path(fsm, value);
2207 }
2208
2209 static void rna_FileBrowser_FSMenuEntry_name_get(PointerRNA *ptr, char *value)
2210 {
2211   strcpy(value, ED_fsmenu_entry_get_name(ptr->data));
2212 }
2213
2214 static int rna_FileBrowser_FSMenuEntry_name_length(PointerRNA *ptr)
2215 {
2216   return (int)strlen(ED_fsmenu_entry_get_name(ptr->data));
2217 }
2218
2219 static void rna_FileBrowser_FSMenuEntry_name_set(PointerRNA *ptr, const char *value)
2220 {
2221   FSMenuEntry *fsm = ptr->data;
2222
2223   /* Note: this will write to file immediately.
2224    * Not nice (and to be fixed ultimately), but acceptable in this case for now. */
2225   ED_fsmenu_entry_set_name(fsm, value);
2226 }
2227
2228 static int rna_FileBrowser_FSMenuEntry_name_get_editable(PointerRNA *ptr,
2229                                                          const char **UNUSED(r_info))
2230 {
2231   FSMenuEntry *fsm = ptr->data;
2232
2233   return fsm->save ? PROP_EDITABLE : 0;
2234 }
2235
2236 static bool rna_FileBrowser_FSMenuEntry_use_save_get(PointerRNA *ptr)
2237 {
2238   FSMenuEntry *fsm = ptr->data;
2239   return fsm->save;
2240 }
2241
2242 static bool rna_FileBrowser_FSMenuEntry_is_valid_get(PointerRNA *ptr)
2243 {
2244   FSMenuEntry *fsm = ptr->data;
2245   return fsm->valid;
2246 }
2247
2248 static void rna_FileBrowser_FSMenu_next(CollectionPropertyIterator *iter)
2249 {
2250   ListBaseIterator *internal = &iter->internal.listbase;
2251
2252   if (internal->skip) {
2253     do {
2254       internal->link = (Link *)(((FSMenuEntry *)(internal->link))->next);
2255       iter->valid = (internal->link != NULL);
2256     } while (iter->valid && internal->skip(iter, internal->link));
2257   }
2258   else {
2259     internal->link = (Link *)(((FSMenuEntry *)(internal->link))->next);
2260     iter->valid = (internal->link != NULL);
2261   }
2262 }
2263
2264 static void rna_FileBrowser_FSMenu_begin(CollectionPropertyIterator *iter, FSMenuCategory category)
2265 {
2266   ListBaseIterator *internal = &iter->internal.listbase;
2267
2268   struct FSMenu *fsmenu = ED_fsmenu_get();
2269   struct FSMenuEntry *fsmentry = ED_fsmenu_get_category(fsmenu, category);
2270
2271   internal->link = (fsmentry) ? (Link *)fsmentry : NULL;
2272   internal->skip = NULL;
2273
2274   iter->valid = (internal->link != NULL);
2275 }
2276
2277 static PointerRNA rna_FileBrowser_FSMenu_get(CollectionPropertyIterator *iter)
2278 {
2279   ListBaseIterator *internal = &iter->internal.listbase;
2280   PointerRNA r_ptr;
2281
2282   RNA_pointer_create(NULL, &RNA_FileBrowserFSMenuEntry, internal->link, &r_ptr);
2283
2284   return r_ptr;
2285 }
2286
2287 static void rna_FileBrowser_FSMenu_end(CollectionPropertyIterator *UNUSED(iter))
2288 {
2289 }
2290
2291 static void rna_FileBrowser_FSMenuSystem_data_begin(CollectionPropertyIterator *iter,
2292                                                     PointerRNA *UNUSED(ptr))
2293 {
2294   rna_FileBrowser_FSMenu_begin(iter, FS_CATEGORY_SYSTEM);
2295 }
2296
2297 static int rna_FileBrowser_FSMenuSystem_data_length(PointerRNA *UNUSED(ptr))
2298 {
2299   struct FSMenu *fsmenu = ED_fsmenu_get();
2300
2301   return ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_SYSTEM);
2302 }
2303
2304 static void rna_FileBrowser_FSMenuSystemBookmark_data_begin(CollectionPropertyIterator *iter,
2305                                                             PointerRNA *UNUSED(ptr))
2306 {
2307   rna_FileBrowser_FSMenu_begin(iter, FS_CATEGORY_SYSTEM_BOOKMARKS);
2308 }
2309
2310 static int rna_FileBrowser_FSMenuSystemBookmark_data_length(PointerRNA *UNUSED(ptr))
2311 {
2312   struct FSMenu *fsmenu = ED_fsmenu_get();
2313
2314   return ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS);
2315 }
2316
2317 static void rna_FileBrowser_FSMenuBookmark_data_begin(CollectionPropertyIterator *iter,
2318                                                       PointerRNA *UNUSED(ptr))
2319 {
2320   rna_FileBrowser_FSMenu_begin(iter, FS_CATEGORY_BOOKMARKS);
2321 }
2322
2323 static int rna_FileBrowser_FSMenuBookmark_data_length(PointerRNA *UNUSED(ptr))
2324 {
2325   struct FSMenu *fsmenu = ED_fsmenu_get();
2326
2327   return ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_BOOKMARKS);
2328 }
2329
2330 static void rna_FileBrowser_FSMenuRecent_data_begin(CollectionPropertyIterator *iter,
2331                                                     PointerRNA *UNUSED(ptr))
2332 {
2333   rna_FileBrowser_FSMenu_begin(iter, FS_CATEGORY_RECENT);
2334 }
2335
2336 static int rna_FileBrowser_FSMenuRecent_data_length(PointerRNA *UNUSED(ptr))
2337 {
2338   struct FSMenu *fsmenu = ED_fsmenu_get();
2339
2340   return ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_RECENT);
2341 }
2342
2343 static int rna_FileBrowser_FSMenu_active_get(PointerRNA *ptr, const FSMenuCategory category)
2344 {
2345   SpaceFile *sf = ptr->data;
2346   int actnr = -1;
2347
2348   switch (category) {
2349     case FS_CATEGORY_SYSTEM:
2350       actnr = sf->systemnr;
2351       break;
2352     case FS_CATEGORY_SYSTEM_BOOKMARKS:
2353       actnr = sf->system_bookmarknr;
2354       break;
2355     case FS_CATEGORY_BOOKMARKS:
2356       actnr = sf->bookmarknr;
2357       break;
2358     case FS_CATEGORY_RECENT:
2359       actnr = sf->recentnr;
2360       break;
2361   }
2362
2363   return actnr;
2364 }
2365
2366 static void rna_FileBrowser_FSMenu_active_set(PointerRNA *ptr,
2367                                               int value,
2368                                               const FSMenuCategory category)
2369 {
2370   SpaceFile *sf = ptr->data;
2371   struct FSMenu *fsmenu = ED_fsmenu_get();
2372   FSMenuEntry *fsm = ED_fsmenu_get_entry(fsmenu, category, value);
2373
2374   if (fsm && sf->params) {
2375     switch (category) {
2376       case FS_CATEGORY_SYSTEM:
2377         sf->systemnr = value;
2378         break;
2379       case FS_CATEGORY_SYSTEM_BOOKMARKS:
2380         sf->system_bookmarknr = value;
2381         break;
2382       case FS_CATEGORY_BOOKMARKS:
2383         sf->bookmarknr = value;
2384         break;
2385       case FS_CATEGORY_RECENT:
2386         sf->recentnr = value;
2387         break;
2388     }
2389
2390     BLI_strncpy(sf->params->dir, fsm->path, sizeof(sf->params->dir));
2391   }
2392 }
2393
2394 static void rna_FileBrowser_FSMenu_active_range(PointerRNA *UNUSED(ptr),
2395                                                 int *min,
2396                                                 int *max,
2397                                                 int *softmin,
2398                                                 int *softmax,
2399                                                 const FSMenuCategory category)
2400 {
2401   struct FSMenu *fsmenu = ED_fsmenu_get();
2402
2403   *min = *softmin = -1;
2404   *max = *softmax = ED_fsmenu_get_nentries(fsmenu, category) - 1;
2405 }
2406
2407 static void rna_FileBrowser_FSMenu_active_update(struct bContext *C, PointerRNA *UNUSED(ptr))
2408 {
2409   ED_file_change_dir(C);
2410 }
2411
2412 static int rna_FileBrowser_FSMenuSystem_active_get(PointerRNA *ptr)
2413 {
2414   return rna_FileBrowser_FSMenu_active_get(ptr, FS_CATEGORY_SYSTEM);
2415 }
2416
2417 static void rna_FileBrowser_FSMenuSystem_active_set(PointerRNA *ptr, int value)
2418 {
2419   rna_FileBrowser_FSMenu_active_set(ptr, value, FS_CATEGORY_SYSTEM);
2420 }
2421
2422 static void rna_FileBrowser_FSMenuSystem_active_range(
2423     PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
2424 {
2425   rna_FileBrowser_FSMenu_active_range(ptr, min, max, softmin, softmax, FS_CATEGORY_SYSTEM);
2426 }
2427
2428 static int rna_FileBrowser_FSMenuSystemBookmark_active_get(PointerRNA *ptr)
2429 {
2430   return rna_FileBrowser_FSMenu_active_get(ptr, FS_CATEGORY_SYSTEM_BOOKMARKS);
2431 }
2432
2433 static void rna_FileBrowser_FSMenuSystemBookmark_active_set(PointerRNA *ptr, int value)
2434 {
2435   rna_FileBrowser_FSMenu_active_set(ptr, value, FS_CATEGORY_SYSTEM_BOOKMARKS);
2436 }
2437
2438 static void rna_FileBrowser_FSMenuSystemBookmark_active_range(
2439     PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
2440 {
2441   rna_FileBrowser_FSMenu_active_range(
2442       ptr, min, max, softmin, softmax, FS_CATEGORY_SYSTEM_BOOKMARKS);
2443 }
2444
2445 static int rna_FileBrowser_FSMenuBookmark_active_get(PointerRNA *ptr)
2446 {
2447   return rna_FileBrowser_FSMenu_active_get(ptr, FS_CATEGORY_BOOKMARKS);
2448 }
2449
2450 static void rna_FileBrowser_FSMenuBookmark_active_set(PointerRNA *ptr, int value)
2451 {
2452   rna_FileBrowser_FSMenu_active_set(ptr, value, FS_CATEGORY_BOOKMARKS);
2453 }
2454
2455 static void rna_FileBrowser_FSMenuBookmark_active_range(
2456     PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
2457 {
2458   rna_FileBrowser_FSMenu_active_range(ptr, min, max, softmin, softmax, FS_CATEGORY_BOOKMARKS);
2459 }
2460
2461 static int rna_FileBrowser_FSMenuRecent_active_get(PointerRNA *ptr)
2462 {
2463   return rna_FileBrowser_FSMenu_active_get(ptr, FS_CATEGORY_RECENT);
2464 }
2465
2466 static void rna_FileBrowser_FSMenuRecent_active_set(PointerRNA *ptr, int value)
2467 {
2468   rna_FileBrowser_FSMenu_active_set(ptr, value, FS_CATEGORY_RECENT);
2469 }
2470
2471 static void rna_FileBrowser_FSMenuRecent_active_range(
2472     PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
2473 {
2474   rna_FileBrowser_FSMenu_active_range(ptr, min, max, softmin, softmax, FS_CATEGORY_RECENT);
2475 }
2476
2477 #else
2478
2479 static const EnumPropertyItem dt_uv_items[] = {
2480     {SI_UVDT_OUTLINE, "OUTLINE", 0, "Outline", "Display white edges with black outline"},
2481     {SI_UVDT_DASH, "DASH", 0, "Dash", "Display dashed black-white edges"},
2482     {SI_UVDT_BLACK, "BLACK", 0, "Black", "Display black edges"},
2483     {SI_UVDT_WHITE, "WHITE", 0, "White", "Display white edges"},
2484     {0, NULL, 0, NULL, NULL},
2485 };
2486
2487 static void rna_def_space_generic_show_region_toggles(StructRNA *srna, int region_type_mask)
2488 {
2489   PropertyRNA *prop;
2490
2491 #  define DEF_SHOW_REGION_PROPERTY(identifier, label, description) \
2492     { \
2493       prop = RNA_def_property(srna, STRINGIFY(identifier), PROP_BOOLEAN, PROP_NONE); \
2494       RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); \
2495       RNA_def_property_boolean_funcs(prop, \
2496                                      STRINGIFY(rna_Space_##identifier##_get), \
2497                                      STRINGIFY(rna_Space_##identifier##_set)); \
2498       RNA_def_property_ui_text(prop, label, description); \
2499       RNA_def_property_update(prop, 0, STRINGIFY(rna_Space_##identifier##_update)); \
2500     } \
2501     ((void)0)
2502
2503   if (region_type_mask & (1 << RGN_TYPE_TOOL_HEADER)) {
2504     region_type_mask &= ~(1 << RGN_TYPE_TOOL_HEADER);
2505     DEF_SHOW_REGION_PROPERTY(show_region_tool_header, "Tool Settings", "");
2506   }
2507   if (region_type_mask & (1 << RGN_TYPE_HEADER)) {
2508     region_type_mask &= ~(1 << RGN_TYPE_HEADER);
2509     DEF_SHOW_REGION_PROPERTY(show_region_header, "Header", "");
2510   }
2511   if (region_type_mask & (1 << RGN_TYPE_FOOTER)) {
2512     region_type_mask &= ~(1 << RGN_TYPE_FOOTER);
2513     DEF_SHOW_REGION_PROPERTY(show_region_footer, "Footer", "");
2514   }
2515   if (region_type_mask & (1 << RGN_TYPE_TOOLS)) {
2516     region_type_mask &= ~(1 << RGN_TYPE_TOOLS);
2517     DEF_SHOW_REGION_PROPERTY(show_region_toolbar, "Toolbar", "");
2518   }
2519   if (region_type_mask & (1 << RGN_TYPE_UI)) {
2520     region_type_mask &= ~(1 << RGN_TYPE_UI);
2521     DEF_SHOW_REGION_PROPERTY(show_region_ui, "Sidebar", "");
2522   }
2523   if (region_type_mask & (1 << RGN_TYPE_HUD)) {
2524     region_type_mask &= ~(1 << RGN_TYPE_HUD);
2525     DEF_SHOW_REGION_PROPERTY(show_region_hud, "Adjust Last Operation", "");
2526   }
2527   BLI_assert(region_type_mask == 0);
2528 }
2529
2530 static void rna_def_space(BlenderRNA *brna)
2531 {
2532   StructRNA *srna;
2533   PropertyRNA *prop;
2534
2535   srna = RNA_def_struct(brna, "Space", NULL);
2536   RNA_def_struct_sdna(srna, "SpaceLink");
2537   RNA_def_struct_ui_text(srna, "Space", "Space data for a screen area");
2538   RNA_def_struct_refine_func(srna, "rna_Space_refine");
2539
2540   prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
2541   RNA_def_property_enum_sdna(prop, NULL, "spacetype");
2542   RNA_def_property_enum_items(prop, rna_enum_space_type_items);
2543   /* When making this editable, take care for the special case of global areas
2544    * (see rna_Area_type_set). */
2545   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
2546   RNA_def_property_ui_text(prop, "Type", "Space data type");
2547
2548   /* access to V2D_VIEWSYNC_SCREEN_TIME */
2549   prop = RNA_def_property(srna, "show_locked_time", PROP_BOOLEAN, PROP_NONE);
2550   RNA_def_property_boolean_funcs(prop, "rna_Space_view2d_sync_get", "rna_Space_view2d_sync_set");
2551   RNA_def_property_ui_text(prop, "Lock Time to Other Windows", "");
2552   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_TIME, "rna_Space_view2d_sync_update");
2553
2554   rna_def_space_generic_show_region_toggles(srna, (1 << RGN_TYPE_HEADER));
2555 }
2556
2557 /* for all spaces that use a mask */
2558 static void rna_def_space_mask_info(StructRNA *srna, int noteflag, const char *mask_set_func)
2559 {
2560   PropertyRNA *prop;
2561
2562   static const EnumPropertyItem overlay_mode_items[] = {
2563       {MASK_OVERLAY_ALPHACHANNEL,
2564        "ALPHACHANNEL",
2565        ICON_NONE,
2566        "Alpha Channel",
2567        "Show alpha channel of the mask"},
2568       {MASK_OVERLAY_COMBINED,
2569        "COMBINED",
2570        ICON_NONE,
2571        "Combined",
2572        "Combine space background image with the mask"},
2573       {0, NULL, 0, NULL, NULL},
2574   };
2575
2576   prop = RNA_def_property(srna, "mask", PROP_POINTER, PROP_NONE);
2577   RNA_def_property_pointer_sdna(prop, NULL, "mask_info.mask");
2578   RNA_def_property_flag(prop, PROP_EDITABLE);
2579   RNA_def_property_ui_text(prop, "Mask", "Mask displayed and edited in this space");
2580   RNA_def_property_pointer_funcs(prop, NULL, mask_set_func, NULL, NULL);
2581   RNA_def_property_update(prop, noteflag, NULL);
2582
2583   /* mask drawing */
2584   prop = RNA_def_property(srna, "mask_display_type", PROP_ENUM, PROP_NONE);
2585   RNA_def_property_enum_sdna(prop, NULL, "mask_info.draw_type");
2586   RNA_def_property_enum_items(prop, dt_uv_items);
2587   RNA_def_property_ui_text(prop, "Edge Display Type", "Display type for mask splines");
2588   RNA_def_property_update(prop, noteflag, NULL);
2589
2590   prop = RNA_def_property(srna, "show_mask_smooth", PROP_BOOLEAN, PROP_NONE);
2591   RNA_def_property_boolean_sdna(prop, NULL, "mask_info.draw_flag", MASK_DRAWFLAG_SMOOTH);
2592   RNA_def_property_ui_text(prop, "Display Smooth Splines", "");
2593   RNA_def_property_update(prop, noteflag, NULL);
2594
2595   prop = RNA_def_property(srna, "show_mask_overlay", PROP_BOOLEAN, PROP_NONE);
2596   RNA_def_property_boolean_sdna(prop, NULL, "mask_info.draw_flag", MASK_DRAWFLAG_OVERLAY);
2597   RNA_def_property_ui_text(prop, "Show Mask Overlay", "");
2598   RNA_def_property_update(prop, noteflag, NULL);
2599
2600   prop = RNA_def_property(srna, "mask_overlay_mode", PROP_ENUM, PROP_NONE);
2601   RNA_def_property_enum_sdna(prop, NULL, "mask_info.overlay_mode");
2602   RNA_def_property_enum_items(prop, overlay_mode_items);
2603   RNA_def_property_ui_text(prop, "Overlay Mode", "Overlay mode of rasterized mask");
2604   RNA_def_property_update(prop, noteflag, NULL);
2605 }
2606
2607 static void rna_def_space_image_uv(BlenderRNA *brna)
2608 {
2609   StructRNA *srna;
2610   PropertyRNA *prop;
2611
2612   static const EnumPropertyItem sticky_mode_items[] = {
2613       {SI_STICKY_DISABLE,
2614        "DISABLED",
2615        ICON_STICKY_UVS_DISABLE,
2616        "Disabled",
2617        "Sticky vertex selection disabled"},
2618       {SI_STICKY_LOC,
2619        "SHARED_LOCATION",
2620        ICON_STICKY_UVS_LOC,
2621        "Shared Location",
2622        "Select UVs that are at the same location and share a mesh vertex"},
2623       {SI_STICKY_VERTEX,
2624        "SHARED_VERTEX",
2625        ICON_STICKY_UVS_VERT,
2626        "Shared Vertex",
2627        "Select UVs that share mesh vertex, irrespective if they are in the same location"},
2628       {0, NULL, 0, NULL, NULL},
2629   };
2630
2631   static const EnumPropertyItem dt_uvstretch_items[] = {
2632       {SI_UVDT_STRETCH_ANGLE, "ANGLE", 0, "Angle", "Angular distortion between UV and 3D angles"},
2633       {SI_UVDT_STRETCH_AREA, "AREA", 0, "Area", "Area distortion between UV and 3D faces"},
2634       {0, NULL, 0, NULL, NULL},
2635   };
2636
2637   static const EnumPropertyItem pixel_snap_mode_items[] = {
2638       {SI_PIXEL_SNAP_DISABLED, "DISABLED", 0, "Disabled", "Don't snap to pixels"},
2639       {SI_PIXEL_SNAP_CORNER, "CORNER", 0, "Corner", "Snap to pixel corners"},
2640       {SI_PIXEL_SNAP_CENTER, "CENTER", 0, "Center", "Snap to pixel centers"},
2641       {0, NULL, 0, NULL, NULL},
2642   };
2643
2644   srna = RNA_def_struct(brna, "SpaceUVEditor", NULL);
2645   RNA_def_struct_sdna(srna, "SpaceImage");
2646   RNA_def_struct_nested(brna, srna, "SpaceImageEditor");
2647   RNA_def_struct_ui_text(srna, "Space UV Editor", "UV editor data for the image editor space");
2648
2649   /* selection */
2650   prop = RNA_def_property(srna, "sticky_select_mode", PROP_ENUM, PROP_NONE);
2651   RNA_def_property_enum_sdna(prop, NULL, "sticky");
2652   RNA_def_property_enum_items(prop, sticky_mode_items);
2653   RNA_def_property_ui_text(
2654       prop,
2655       "Sticky Selection Mode",
2656       "Automatically select also UVs sharing the same vertex as the ones being selected");
2657   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2658
2659   /* drawing */
2660   prop = RNA_def_property(srna, "edge_display_type", PROP_ENUM, PROP_NONE);
2661   RNA_def_property_enum_sdna(prop, NULL, "dt_uv");
2662   RNA_def_property_enum_items(prop, dt_uv_items);
2663   RNA_def_property_ui_text(prop, "Display As", "Display style for UV edges");
2664   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2665
2666   prop = RNA_def_property(srna, "show_smooth_edges", PROP_BOOLEAN, PROP_NONE);
2667   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_SMOOTH_UV);
2668   RNA_def_property_ui_text(prop, "Display Smooth Edges", "Display UV edges anti-aliased");
2669   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2670
2671   prop = RNA_def_property(srna, "show_stretch", PROP_BOOLEAN, PROP_NONE);
2672   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_STRETCH);
2673   RNA_def_property_ui_text(
2674       prop,
2675       "Display Stretch",
2676       "Display faces colored according to the difference in shape between UVs and "
2677       "their 3D coordinates (blue for low distortion, red for high distortion)");
2678   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2679
2680   prop = RNA_def_property(srna, "display_stretch_type", PROP_ENUM, PROP_NONE);
2681   RNA_def_property_enum_sdna(prop, NULL, "dt_uvstretch");
2682   RNA_def_property_enum_items(prop, dt_uvstretch_items);
2683   RNA_def_property_ui_text(prop, "Display Stretch Type", "Type of stretch to draw");
2684   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2685
2686   prop = RNA_def_property(srna, "show_modified_edges", PROP_BOOLEAN, PROP_NONE);
2687   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAWSHADOW);
2688   RNA_def_property_ui_text(
2689       prop, "Display Modified Edges", "Display edges after modifiers are applied");
2690   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2691
2692   prop = RNA_def_property(srna, "show_metadata", PROP_BOOLEAN, PROP_NONE);
2693   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_METADATA);
2694   RNA_def_property_ui_text(prop, "Show Metadata", "Display metadata properties of the image");
2695   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2696
2697   prop = RNA_def_property(srna, "show_texpaint", PROP_BOOLEAN, PROP_NONE);
2698   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_NO_DRAW_TEXPAINT);
2699   RNA_def_property_ui_text(
2700       prop, "Display Texture Paint UVs", "Display overlay of texture paint uv layer");
2701   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2702
2703   prop = RNA_def_property(srna, "show_pixel_coords", PROP_BOOLEAN, PROP_NONE);
2704   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_COORDFLOATS);
2705   RNA_def_property_ui_text(
2706       prop, "Pixel Coordinates", "Display UV coordinates in pixels rather than from 0.0 to 1.0");
2707   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2708
2709   prop = RNA_def_property(srna, "show_faces", PROP_BOOLEAN, PROP_NONE);
2710   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_NO_DRAWFACES);
2711   RNA_def_property_ui_text(prop, "Display Faces", "Display faces over the image");
2712   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2713
2714   prop = RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
2715   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SI_NO_DRAWEDGES);
2716   RNA_def_property_ui_text(prop, "Display Edges", "Display edges in vertex select mode");
2717   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2718
2719   /* todo: move edge and face drawing options here from G.f */
2720
2721   prop = RNA_def_property(srna, "pixel_snap_mode", PROP_ENUM, PROP_NONE);
2722   RNA_def_property_enum_items(prop, pixel_snap_mode_items);
2723   RNA_def_property_ui_text(prop, "Snap to Pixels", "Snap UVs to pixels while editing");
2724   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2725
2726   prop = RNA_def_property(srna, "lock_bounds", PROP_BOOLEAN, PROP_NONE);
2727   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_CLIP_UV);
2728   RNA_def_property_ui_text(prop,
2729                            "Constrain to Image Bounds",
2730                            "Constraint to stay within the image bounds while editing");
2731   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2732
2733   prop = RNA_def_property(srna, "use_live_unwrap", PROP_BOOLEAN, PROP_NONE);
2734   RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_LIVE_UNWRAP);
2735   RNA_def_property_ui_text(
2736       prop,
2737       "Live Unwrap",
2738       "Continuously unwrap the selected UV island while transforming pinned vertices");
2739   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_IMAGE, NULL);
2740 }
2741
2742 static void rna_def_space_outliner(BlenderRNA *brna)
2743 {
2744   StructRNA *srna;
2745   PropertyRNA *prop;
2746
2747   static const EnumPropertyItem display_mode_items[] = {
2748       {SO_SCENES,
2749        "SCENES",
2750        ICON_SCENE_DATA,
2751        "Scenes",
2752        "Display scenes and their view layers, collections and objects"},
2753       {SO_VIEW_LAYER,
2754        "VIEW_LAYER",
2755        ICON_RENDER_RESULT,
2756        "View Layer",
2757        "Display collections and objects in the view layer"},
2758       {SO_SEQUENCE, "SEQUENCE", ICON_SEQUENCE, "Sequence", "Display sequence data-blocks"},
2759       {SO_LIBRARIES,
2760        "LIBRARIES",
2761        ICON_FILE_BLEND,
2762        "Blender File",
2763        "Display data of current file and linked libraries"},
2764       {SO_DATA_API,
2765        "DATA_API",
2766        ICON_RNA,
2767        "Data API",
2768        "Display low level Blender data and its properties"},
2769       {SO_ID_ORPHANS,
2770        "ORPHAN_DATA",
2771        ICON_ORPHAN_DATA,
2772        "Orphan Data",
2773        "Display data-blocks which are unused and/or will be lost when the file is reloaded"},
2774       {0, NULL, 0, NULL, NULL},
2775   };
2776
2777   static const EnumPropertyItem filter_state_items[] = {
2778       {SO_FILTER_OB_ALL, "ALL", 0, "All", "Show all objects in the view layer"},
2779       {SO_FILTER_OB_VISIBLE, "VISIBLE", 0, "Visible", "Show visible objects"},
2780       {SO_FILTER_OB_HIDDEN, "HIDDEN", 0, "Hidden", "Show hidden objects"},
2781       {SO_FILTER_OB_SELECTED, "SELECTED", 0, "Selected", "Show selected objects"},
2782       {SO_FILTER_OB_ACTIVE, "ACTIVE", 0, "Active", "Show only the active object"},
2783       {0, NULL, 0, NULL, NULL},
2784   };
2785
2786   srna = RNA_def_struct(brna, "SpaceOutliner", "Space");
2787   RNA_def_struct_sdna(srna, "SpaceOutliner");
2788   RNA_def_struct_ui_text(srna, "Space Outliner", "Outliner space data");
2789
2790   prop = RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE);
2791   RNA_def_property_enum_sdna(prop, NULL, "outlinevis");
2792   RNA_def_property_enum_items(prop, display_mode_items);
2793   RNA_def_property_ui_text(prop, "Display Mode", "Type of information to display");
2794   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2795
2796   prop = RNA_def_property(srna, "filter_text", PROP_STRING, PROP_NONE);
2797   RNA_def_property_string_sdna(prop, NULL, "search_string");
2798   RNA_def_property_ui_text(prop, "Display Filter", "Live search filtering string");
2799   RNA_def_property_flag(prop, PROP_TEXTEDIT_UPDATE);
2800   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2801
2802   prop = RNA_def_property(srna, "use_filter_case_sensitive", PROP_BOOLEAN, PROP_NONE);
2803   RNA_def_property_boolean_sdna(prop, NULL, "search_flags", SO_FIND_CASE_SENSITIVE);
2804   RNA_def_property_ui_text(
2805       prop, "Case Sensitive Matches Only", "Only use case sensitive matches of search string");
2806   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2807
2808   prop = RNA_def_property(srna, "use_filter_complete", PROP_BOOLEAN, PROP_NONE);
2809   RNA_def_property_boolean_sdna(prop, NULL, "search_flags", SO_FIND_COMPLETE);
2810   RNA_def_property_ui_text(
2811       prop, "Complete Matches Only", "Only use complete matches of search string");
2812   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2813
2814   prop = RNA_def_property(srna, "use_sort_alpha", PROP_BOOLEAN, PROP_NONE);
2815   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SO_SKIP_SORT_ALPHA);
2816   RNA_def_property_ui_text(prop, "Sort Alphabetically", "");
2817   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2818
2819   prop = RNA_def_property(srna, "use_sync_select", PROP_BOOLEAN, PROP_NONE);
2820   RNA_def_property_boolean_sdna(prop, NULL, "flag", SO_SYNC_SELECT);
2821   RNA_def_property_ui_text(
2822       prop, "Sync Outliner Selection", "Sync outliner selection with other editors");
2823   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2824
2825   /* Granular restriction column option. */
2826   prop = RNA_def_property(srna, "show_restrict_column_enable", PROP_BOOLEAN, PROP_NONE);
2827   RNA_def_property_boolean_sdna(prop, NULL, "show_restrict_flags", SO_RESTRICT_ENABLE);
2828   RNA_def_property_ui_text(prop, "Exclude from View Layer", "Exclude from view layer");
2829   RNA_def_property_ui_icon(prop, ICON_CHECKBOX_HLT, 0);
2830   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2831
2832   prop = RNA_def_property(srna, "show_restrict_column_select", PROP_BOOLEAN, PROP_NONE);
2833   RNA_def_property_boolean_sdna(prop, NULL, "show_restrict_flags", SO_RESTRICT_SELECT);
2834   RNA_def_property_ui_text(prop, "Selectable", "Selectable");
2835   RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 0);
2836   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2837
2838   prop = RNA_def_property(srna, "show_restrict_column_hide", PROP_BOOLEAN, PROP_NONE);
2839   RNA_def_property_boolean_sdna(prop, NULL, "show_restrict_flags", SO_RESTRICT_HIDE);
2840   RNA_def_property_ui_text(prop, "Hide in Viewport", "Temporarily hide in viewport");
2841   RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 0);
2842   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2843
2844   prop = RNA_def_property(srna, "show_restrict_column_viewport", PROP_BOOLEAN, PROP_NONE);
2845   RNA_def_property_boolean_sdna(prop, NULL, "show_restrict_flags", SO_RESTRICT_VIEWPORT);
2846   RNA_def_property_ui_text(prop, "Disable in Viewports", "Globally disable in viewports");
2847   RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 0);
2848   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2849
2850   prop = RNA_def_property(srna, "show_restrict_column_render", PROP_BOOLEAN, PROP_NONE);
2851   RNA_def_property_boolean_sdna(prop, NULL, "show_restrict_flags", SO_RESTRICT_RENDER);
2852   RNA_def_property_ui_text(prop, "Disable in Renders", "Globally disable in renders");
2853   RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 0);
2854   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2855
2856   prop = RNA_def_property(srna, "show_restrict_column_holdout", PROP_BOOLEAN, PROP_NONE);
2857   RNA_def_property_boolean_sdna(prop, NULL, "show_restrict_flags", SO_RESTRICT_HOLDOUT);
2858   RNA_def_property_ui_text(prop, "Holdout", "Holdout");
2859   RNA_def_property_ui_icon(prop, ICON_HOLDOUT_ON, 0);
2860   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2861
2862   prop = RNA_def_property(srna, "show_restrict_column_indirect_only", PROP_BOOLEAN, PROP_NONE);
2863   RNA_def_property_boolean_sdna(prop, NULL, "show_restrict_flags", SO_RESTRICT_INDIRECT_ONLY);
2864   RNA_def_property_ui_text(prop, "Indirect Only", "Indirect only");
2865   RNA_def_property_ui_icon(prop, ICON_INDIRECT_ONLY_ON, 0);
2866   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2867
2868   /* Filters. */
2869   prop = RNA_def_property(srna, "use_filter_object", PROP_BOOLEAN, PROP_NONE);
2870   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OBJECT);
2871   RNA_def_property_ui_text(prop, "Filter Objects", "Show objects");
2872   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2873
2874   prop = RNA_def_property(srna, "use_filter_object_content", PROP_BOOLEAN, PROP_NONE);
2875   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_CONTENT);
2876   RNA_def_property_ui_text(
2877       prop, "Show Object Contents", "Show what is inside the objects elements");
2878   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2879
2880   prop = RNA_def_property(srna, "use_filter_children", PROP_BOOLEAN, PROP_NONE);
2881   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_CHILDREN);
2882   RNA_def_property_ui_text(prop, "Show Object Children", "Show children");
2883   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2884
2885   prop = RNA_def_property(srna, "use_filter_collection", PROP_BOOLEAN, PROP_NONE);
2886   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_COLLECTION);
2887   RNA_def_property_ui_text(prop, "Show Collections", "Show collections");
2888   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2889
2890   /* Filters object state. */
2891   prop = RNA_def_property(srna, "filter_state", PROP_ENUM, PROP_NONE);
2892   RNA_def_property_enum_sdna(prop, NULL, "filter_state");
2893   RNA_def_property_enum_items(prop, filter_state_items);
2894   RNA_def_property_ui_text(prop, "Object State Filter", "");
2895   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2896
2897   /* Filters object type. */
2898   prop = RNA_def_property(srna, "use_filter_object_mesh", PROP_BOOLEAN, PROP_NONE);
2899   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_MESH);
2900   RNA_def_property_ui_text(prop, "Show Meshes", "Show mesh objects");
2901   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2902
2903   prop = RNA_def_property(srna, "use_filter_object_armature", PROP_BOOLEAN, PROP_NONE);
2904   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_ARMATURE);
2905   RNA_def_property_ui_text(prop, "Show Armatures", "Show armature objects");
2906   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2907
2908   prop = RNA_def_property(srna, "use_filter_object_empty", PROP_BOOLEAN, PROP_NONE);
2909   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_EMPTY);
2910   RNA_def_property_ui_text(prop, "Show Empties", "Show empty objects");
2911   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2912
2913   prop = RNA_def_property(srna, "use_filter_object_light", PROP_BOOLEAN, PROP_NONE);
2914   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_LAMP);
2915   RNA_def_property_ui_text(prop, "Show Lights", "Show light objects");
2916   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2917
2918   prop = RNA_def_property(srna, "use_filter_object_camera", PROP_BOOLEAN, PROP_NONE);
2919   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_CAMERA);
2920   RNA_def_property_ui_text(prop, "Show Cameras", "Show camera objects");
2921   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2922
2923   prop = RNA_def_property(srna, "use_filter_object_others", PROP_BOOLEAN, PROP_NONE);
2924   RNA_def_property_boolean_negative_sdna(prop, NULL, "filter", SO_FILTER_NO_OB_OTHERS);
2925   RNA_def_property_ui_text(
2926       prop, "Show Other Objects", "Show curves, lattices, light probes, fonts, ...");
2927   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2928
2929   /* Libraries filter. */
2930   prop = RNA_def_property(srna, "use_filter_id_type", PROP_BOOLEAN, PROP_NONE);
2931   RNA_def_property_boolean_sdna(prop, NULL, "filter", SO_FILTER_ID_TYPE);
2932   RNA_def_property_ui_text(prop, "Filter By Type", "Show only data-blocks of one type");
2933   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_OUTLINER, NULL);
2934
2935   prop = RNA_def_property(srna, "filter_id_type", PROP_ENUM, PROP_NONE);
2936   RNA_def_property_enum_sdna(prop, NULL, "filter_id_type");
2937   RNA_def_property_enum_items(prop, rna_enum_id_type_items);
2938   RNA_def_property_ui_text(prop, "Filter ID Type", "Data-block type to show");
2939   RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_ID);
2940 }
2941
2942 static void rna_def_space_view3d_shading(BlenderRNA *brna)
2943 {
2944   StructRNA *srna;
2945   PropertyRNA *prop;
2946
2947   static const EnumPropertyItem background_type_items[] = {
2948       {V3D_SHADING_BACKGROUND_THEME, "THEME", 0, "Theme", "Use the theme for background color"},
2949       {V3D_SHADING_BACKGROUND_WORLD, "WORLD", 0, "World", "Use the world for background color"},
2950       {V3D_SHADING_BACKGROUND_VIEWPORT,
2951        "VIEWPORT",
2952        0,
2953        "Viewport",
2954        "Use a custom color limited to this viewport only"},
2955       {0, NULL, 0, NULL, NULL},
2956   };
2957   static const float default_background_color[] = {0.05f, 0.05f, 0.05f};
2958
2959   static const EnumPropertyItem cavity_type_items[] = {
2960       {V3D_SHADING_CAVITY_SSAO,
2961        "WORLD",
2962        0,
2963        "World",
2964        "Cavity shading computed in world space, useful for larger-scale occlusion"},
2965       {V3D_SHADING_CAVITY_CURVATURE,
2966        "SCREEN",
2967        0,
2968        "Screen",
2969        "Curvature-based shading, useful for making fine details more visible"},
2970       {V3D_SHADING_CAVITY_BOTH, "BOTH", 0, "Both", "Use both effects simultaneously"},
2971       {0, NULL, 0, NULL, NULL},
2972   };
2973
2974   /* Note these settings are used for both 3D viewport and the OpenGL render
2975    * engine in the scene, so can't assume to always be part of a screen. */
2976   srna = RNA_def_struct(brna, "View3DShading", NULL);
2977   RNA_def_struct_path_func(srna, "rna_View3DShading_path");
2978   RNA_def_struct_ui_text(
2979       srna, "3D View Shading Settings", "Settings for shading in the 3D viewport");
2980
2981   prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
2982   RNA_def_property_enum_items(prop, rna_enum_shading_type_items);
2983   RNA_def_property_enum_funcs(prop,
2984                               "rna_3DViewShading_type_get",
2985                               "rna_3DViewShading_type_set",
2986                               "rna_3DViewShading_type_itemf");
2987   RNA_def_property_ui_text(
2988       prop, "Viewport Shading", "Method to display/shade objects in the 3D View");
2989   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_3DViewShading_type_update");
2990
2991   prop = RNA_def_property(srna, "light", PROP_ENUM, PROP_NONE);
2992   RNA_def_property_enum_sdna(prop, NULL, "light");
2993   RNA_def_property_enum_items(prop, rna_enum_viewport_lighting_items);
2994   RNA_def_property_ui_text(prop, "Lighting", "Lighting Method for Solid/Texture Viewport Shading");
2995   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
2996
2997   prop = RNA_def_property(srna, "show_object_outline", PROP_BOOLEAN, PROP_NONE);
2998   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_OBJECT_OUTLINE);
2999   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3000   RNA_def_property_ui_text(prop, "Outline", "Show Object Outline");
3001   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3002
3003   prop = RNA_def_property(srna, "studio_light", PROP_ENUM, PROP_NONE);
3004   RNA_def_property_enum_items(prop, rna_enum_studio_light_items);
3005   RNA_def_property_enum_default(prop, 0);
3006   RNA_def_property_enum_funcs(prop,
3007                               "rna_View3DShading_studio_light_get",
3008                               "rna_View3DShading_studio_light_set",
3009                               "rna_View3DShading_studio_light_itemf");
3010   RNA_def_property_ui_text(prop, "Studiolight", "Studio lighting setup");
3011   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3012
3013   prop = RNA_def_property(srna, "use_world_space_lighting", PROP_BOOLEAN, PROP_NONE);
3014   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_WORLD_ORIENTATION);
3015   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3016   RNA_def_property_ui_text(
3017       prop, "World Space Lighting", "Make the lighting fixed and not follow the camera");
3018   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3019
3020   prop = RNA_def_property(srna, "show_backface_culling", PROP_BOOLEAN, PROP_NONE);
3021   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_BACKFACE_CULLING);
3022   RNA_def_property_ui_text(
3023       prop, "Backface Culling", "Use back face culling to hide the back side of faces");
3024   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3025
3026   prop = RNA_def_property(srna, "show_cavity", PROP_BOOLEAN, PROP_NONE);
3027   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_CAVITY);
3028   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3029   RNA_def_property_ui_text(prop, "Cavity", "Show Cavity");
3030   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3031
3032   prop = RNA_def_property(srna, "cavity_type", PROP_ENUM, PROP_NONE);
3033   RNA_def_property_enum_items(prop, cavity_type_items);
3034   RNA_def_property_ui_text(prop, "Cavity Type", "Way to draw the cavity shading");
3035   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3036
3037   prop = RNA_def_property(srna, "curvature_ridge_factor", PROP_FLOAT, PROP_FACTOR);
3038   RNA_def_property_float_sdna(prop, NULL, "curvature_ridge_factor");
3039   RNA_def_property_float_default(prop, 1.0f);
3040   RNA_def_property_ui_text(prop, "Curvature Ridge", "Factor for the curvature ridges");
3041   RNA_def_property_range(prop, 0.0f, 2.0f);
3042   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3043   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3044
3045   prop = RNA_def_property(srna, "curvature_valley_factor", PROP_FLOAT, PROP_FACTOR);
3046   RNA_def_property_float_sdna(prop, NULL, "curvature_valley_factor");
3047   RNA_def_property_float_default(prop, 1.0f);
3048   RNA_def_property_ui_text(prop, "Curvature Valley", "Factor for the curvature valleys");
3049   RNA_def_property_range(prop, 0.0f, 2.0f);
3050   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3051   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3052
3053   prop = RNA_def_property(srna, "cavity_ridge_factor", PROP_FLOAT, PROP_FACTOR);
3054   RNA_def_property_float_sdna(prop, NULL, "cavity_ridge_factor");
3055   RNA_def_property_float_default(prop, 1.0f);
3056   RNA_def_property_ui_text(prop, "Cavity Ridge", "Factor for the cavity ridges");
3057   RNA_def_property_range(prop, 0.0f, 250.0f);
3058   RNA_def_property_ui_range(prop, 0.00f, 2.5f, 1, 3);
3059   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3060   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3061
3062   prop = RNA_def_property(srna, "cavity_valley_factor", PROP_FLOAT, PROP_FACTOR);
3063   RNA_def_property_float_sdna(prop, NULL, "cavity_valley_factor");
3064   RNA_def_property_float_default(prop, 1.0);
3065   RNA_def_property_ui_text(prop, "Cavity Valley", "Factor for the cavity valleys");
3066   RNA_def_property_range(prop, 0.0f, 250.0f);
3067   RNA_def_property_ui_range(prop, 0.00f, 2.5f, 1, 3);
3068   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3069   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3070
3071   prop = RNA_def_property(srna, "selected_studio_light", PROP_POINTER, PROP_NONE);
3072   RNA_def_property_struct_type(prop, "StudioLight");
3073   RNA_define_verify_sdna(0);
3074   RNA_def_property_ui_text(prop, "Studio Light", "Selected StudioLight");
3075   RNA_def_property_pointer_funcs(
3076       prop, "rna_View3DShading_selected_studio_light_get", NULL, NULL, NULL);
3077   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE);
3078   RNA_define_verify_sdna(1);
3079
3080   prop = RNA_def_property(srna, "studiolight_rotate_z", PROP_FLOAT, PROP_ANGLE);
3081   RNA_def_property_float_sdna(prop, NULL, "studiolight_rot_z");
3082   RNA_def_property_float_default(prop, 0.0);
3083   RNA_def_property_ui_text(
3084       prop, "Studiolight Rotation", "Rotation of the studiolight around the Z-Axis");
3085   RNA_def_property_range(prop, -M_PI, M_PI);
3086   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3087   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3088
3089   prop = RNA_def_property(srna, "color_type", PROP_ENUM, PROP_NONE);
3090   RNA_def_property_enum_sdna(prop, NULL, "color_type");
3091   RNA_def_property_enum_items(prop, rna_enum_shading_color_type_items);
3092   RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_View3DShading_color_type_itemf");
3093   RNA_def_property_ui_text(prop, "Color", "Color Type");
3094   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3095   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3096
3097   prop = RNA_def_property(srna, "wireframe_color_type", PROP_ENUM, PROP_NONE);
3098   RNA_def_property_enum_sdna(prop, NULL, "wire_color_type");
3099   RNA_def_property_enum_items(prop, rna_enum_shading_color_type_items);
3100   RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_View3DShading_color_type_itemf");
3101   RNA_def_property_ui_text(prop, "Color", "Color Type");
3102   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3103
3104   prop = RNA_def_property(srna, "single_color", PROP_FLOAT, PROP_COLOR);
3105   RNA_def_property_float_sdna(prop, NULL, "single_color");
3106   RNA_def_property_array(prop, 3);
3107   RNA_def_property_ui_text(prop, "Color", "Color for single color mode");
3108   RNA_def_property_range(prop, 0.0f, 1.0f);
3109   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3110
3111   prop = RNA_def_property(srna, "background_type", PROP_ENUM, PROP_NONE);
3112   RNA_def_property_enum_items(prop, background_type_items);
3113   RNA_def_property_ui_text(prop, "Background", "Way to draw the background");
3114   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3115
3116   prop = RNA_def_property(srna, "background_color", PROP_FLOAT, PROP_COLOR);
3117   RNA_def_property_array(prop, 3);
3118   RNA_def_property_float_array_default(prop, default_background_color);
3119   RNA_def_property_ui_text(prop, "Background Color", "Color for custom background color");
3120   RNA_def_property_range(prop, 0.0f, 1.0f);
3121   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3122
3123   prop = RNA_def_property(srna, "show_shadows", PROP_BOOLEAN, PROP_NONE);
3124   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_SHADOW);
3125   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3126   RNA_def_property_ui_text(prop, "Shadow", "Show Shadow");
3127   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3128
3129   prop = RNA_def_property(srna, "show_xray", PROP_BOOLEAN, PROP_NONE);
3130   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_XRAY);
3131   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3132   RNA_def_property_ui_text(prop, "Show X-Ray", "Show whole scene transparent");
3133   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3134
3135   prop = RNA_def_property(srna, "show_xray_wireframe", PROP_BOOLEAN, PROP_NONE);
3136   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_XRAY_WIREFRAME);
3137   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3138   RNA_def_property_ui_text(prop, "Show X-Ray", "Show whole scene transparent");
3139   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3140
3141   prop = RNA_def_property(srna, "xray_alpha", PROP_FLOAT, PROP_FACTOR);
3142   RNA_def_property_float_sdna(prop, NULL, "xray_alpha");
3143   RNA_def_property_float_default(prop, 0.5);
3144   RNA_def_property_ui_text(prop, "X-Ray Alpha", "Amount of alpha to use");
3145   RNA_def_property_range(prop, 0.0f, 1.0f);
3146   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3147   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3148
3149   prop = RNA_def_property(srna, "xray_alpha_wireframe", PROP_FLOAT, PROP_FACTOR);
3150   RNA_def_property_float_sdna(prop, NULL, "xray_alpha_wire");
3151   RNA_def_property_float_default(prop, 0.5);
3152   RNA_def_property_ui_text(prop, "X-Ray Alpha", "Amount of alpha to use");
3153   RNA_def_property_range(prop, 0.0f, 1.0f);
3154   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3155   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3156
3157   prop = RNA_def_property(srna, "use_dof", PROP_BOOLEAN, PROP_NONE);
3158   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_DEPTH_OF_FIELD);
3159   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3160   RNA_def_property_ui_text(
3161       prop,
3162       "Depth Of Field",
3163       "Use depth of field on viewport using the values from the active camera");
3164   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3165
3166   prop = RNA_def_property(srna, "use_scene_lights", PROP_BOOLEAN, PROP_NONE);
3167   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_SCENE_LIGHTS);
3168   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3169   RNA_def_property_ui_text(prop, "Scene Lights", "Render lights and light probes of the scene");
3170   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3171
3172   prop = RNA_def_property(srna, "use_scene_world", PROP_BOOLEAN, PROP_NONE);
3173   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_SCENE_WORLD);
3174   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3175   RNA_def_property_ui_text(prop, "Scene World", "Use scene world for lighting");
3176   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3177
3178   prop = RNA_def_property(srna, "show_specular_highlight", PROP_BOOLEAN, PROP_NONE);
3179   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SHADING_SPECULAR_HIGHLIGHT);
3180   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3181   RNA_def_property_ui_text(prop, "Specular Highlights", "Render specular highlights");
3182   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3183
3184   prop = RNA_def_property(srna, "object_outline_color", PROP_FLOAT, PROP_COLOR);
3185   RNA_def_property_float_sdna(prop, NULL, "object_outline_color");
3186   RNA_def_property_array(prop, 3);
3187   RNA_def_property_ui_text(prop, "Outline Color", "Color for object outline");
3188   RNA_def_property_range(prop, 0.0f, 1.0f);
3189   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3190
3191   prop = RNA_def_property(srna, "shadow_intensity", PROP_FLOAT, PROP_FACTOR);
3192   RNA_def_property_float_sdna(prop, NULL, "shadow_intensity");
3193   RNA_def_property_float_default(prop, 0.5);
3194   RNA_def_property_ui_text(prop, "Shadow Intensity", "Darkness of shadows");
3195   RNA_def_property_range(prop, 0.0f, 1.0f);
3196   RNA_def_property_ui_range(prop, 0.00f, 1.0f, 1, 3);
3197   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3198   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3199
3200   prop = RNA_def_property(srna, "studiolight_background_alpha", PROP_FLOAT, PROP_FACTOR);
3201   RNA_def_property_float_sdna(prop, NULL, "studiolight_background");
3202   RNA_def_property_float_default(prop, 0.0);
3203   RNA_def_property_ui_text(prop, "Background", "Show the studiolight in the background");
3204   RNA_def_property_range(prop, 0.0f, 1.0f);
3205   RNA_def_property_ui_range(prop, 0.00f, 1.0f, 1, 3);
3206   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3207   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3208 }
3209
3210 static void rna_def_space_view3d_overlay(BlenderRNA *brna)
3211 {
3212   StructRNA *srna;
3213   PropertyRNA *prop;
3214
3215   srna = RNA_def_struct(brna, "View3DOverlay", NULL);
3216   RNA_def_struct_sdna(srna, "View3D");
3217   RNA_def_struct_nested(brna, srna, "SpaceView3D");
3218   RNA_def_struct_path_func(srna, "rna_View3DOverlay_path");
3219   RNA_def_struct_ui_text(
3220       srna, "3D View Overlay Settings", "Settings for display of overlays in the 3D viewport");
3221
3222   prop = RNA_def_property(srna, "show_overlays", PROP_BOOLEAN, PROP_NONE);
3223   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag2", V3D_HIDE_OVERLAYS);
3224   RNA_def_property_ui_text(prop, "Show Overlays", "Display overlays like gizmos and outlines");
3225   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3226
3227   prop = RNA_def_property(srna, "show_ortho_grid", PROP_BOOLEAN, PROP_NONE);
3228   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_ORTHO_GRID);
3229   RNA_def_property_ui_text(prop, "Display Grid", "Show grid in othographic side view");
3230   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3231
3232   prop = RNA_def_property(srna, "show_floor", PROP_BOOLEAN, PROP_NONE);
3233   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_FLOOR);
3234   RNA_def_property_ui_text(prop, "Display Grid Floor", "Show the ground plane grid");
3235   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3236
3237   prop = RNA_def_property(srna, "show_axis_x", PROP_BOOLEAN, PROP_NONE);
3238   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_X);
3239   RNA_def_property_ui_text(prop, "Display X Axis", "Show the X axis line");
3240   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3241
3242   prop = RNA_def_property(srna, "show_axis_y", PROP_BOOLEAN, PROP_NONE);
3243   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_Y);
3244   RNA_def_property_ui_text(prop, "Display Y Axis", "Show the Y axis line");
3245   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3246
3247   prop = RNA_def_property(srna, "show_axis_z", PROP_BOOLEAN, PROP_NONE);
3248   RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_Z);
3249   RNA_def_property_ui_text(prop, "Display Z Axis", "Show the Z axis line");
3250   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3251
3252   prop = RNA_def_property(srna, "grid_scale", PROP_FLOAT, PROP_NONE);
3253   RNA_def_property_float_sdna(prop, NULL, "grid");
3254   RNA_def_property_ui_text(prop, "Grid Scale", "Distance between 3D View grid lines");
3255   RNA_def_property_range(prop, 0.0f, FLT_MAX);
3256   RNA_def_property_ui_range(prop, 0.001f, 1000.0f, 0.1f, 3);
3257   RNA_def_property_float_default(prop, 1.0f);
3258   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3259
3260   prop = RNA_def_property(srna, "grid_lines", PROP_INT, PROP_NONE);
3261   RNA_def_property_int_sdna(prop, NULL, "gridlines");
3262   RNA_def_property_ui_text(
3263       prop, "Grid Lines", "Number of grid lines to display in perspective view");
3264   RNA_def_property_range(prop, 0, 1024);
3265   RNA_def_property_int_default(prop, 16);
3266   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3267
3268   prop = RNA_def_property(srna, "grid_subdivisions", PROP_INT, PROP_NONE);
3269   RNA_def_property_int_sdna(prop, NULL, "gridsubdiv");
3270   RNA_def_property_ui_text(prop, "Grid Subdivisions", "Number of subdivisions between grid lines");
3271   RNA_def_property_range(prop, 1, 1024);
3272   RNA_def_property_int_default(prop, 10);
3273   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3274
3275   prop = RNA_def_property(srna, "grid_scale_unit", PROP_FLOAT, PROP_NONE);
3276   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
3277   RNA_def_property_float_funcs(prop, "rna_View3DOverlay_GridScaleUnit_get", NULL, NULL);
3278   RNA_def_property_ui_text(
3279       prop, "Grid Scale Unit", "Grid cell size scaled by scene unit system settings");
3280
3281   prop = RNA_def_property(srna, "show_outline_selected", PROP_BOOLEAN, PROP_NONE);
3282   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SELECT_OUTLINE);
3283   RNA_def_property_ui_text(
3284       prop, "Outline Selected", "Show an outline highlight around selected objects");
3285   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3286
3287   prop = RNA_def_property(srna, "show_object_origins", PROP_BOOLEAN, PROP_NONE);
3288   RNA_def_property_boolean_negative_sdna(
3289       prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_OBJECT_ORIGINS);
3290   RNA_def_property_ui_text(prop, "Object Origins", "Show object center dots");
3291   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3292
3293   prop = RNA_def_property(srna, "show_object_origins_all", PROP_BOOLEAN, PROP_NONE);
3294   RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_DRAW_CENTERS);
3295   RNA_def_property_ui_text(
3296       prop,
3297       "All Object Origins",
3298       "Show the object origin center dot for all (selected and unselected) objects");
3299   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3300
3301   prop = RNA_def_property(srna, "show_relationship_lines", PROP_BOOLEAN, PROP_NONE);
3302   RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", V3D_HIDE_HELPLINES);
3303   RNA_def_property_ui_text(prop,
3304                            "Relationship Lines",
3305                            "Show dashed lines indicating parent or constraint relationships");
3306   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3307
3308   prop = RNA_def_property(srna, "show_cursor", PROP_BOOLEAN, PROP_NONE);
3309   RNA_def_property_boolean_negative_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_CURSOR);
3310   RNA_def_property_ui_text(prop, "Show 3D Cursor", "Display 3D Cursor Overlay");
3311   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3312
3313   prop = RNA_def_property(srna, "show_text", PROP_BOOLEAN, PROP_NONE);
3314   RNA_def_property_boolean_negative_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_TEXT);
3315   RNA_def_property_ui_text(prop, "Show Text", "Display overlay text");
3316   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3317
3318   prop = RNA_def_property(srna, "show_extras", PROP_BOOLEAN, PROP_NONE);
3319   RNA_def_property_boolean_negative_sdna(
3320       prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_OBJECT_XTRAS);
3321   RNA_def_property_ui_text(
3322       prop, "Extras", "Object details, including empty wire, cameras and other visual guides");
3323   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3324
3325   prop = RNA_def_property(srna, "show_bones", PROP_BOOLEAN, PROP_NONE);
3326   RNA_def_property_boolean_negative_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_BONES);
3327   RNA_def_property_ui_text(
3328       prop, "Show Bones", "Display bones (disable to show motion paths only)");
3329   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3330
3331   prop = RNA_def_property(srna, "show_face_orientation", PROP_BOOLEAN, PROP_NONE);
3332   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_FACE_ORIENTATION);
3333   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3334   RNA_def_property_ui_text(prop, "Face Orientation", "Show the Face Orientation Overlay");
3335   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3336
3337   prop = RNA_def_property(srna, "show_xray_bone", PROP_BOOLEAN, PROP_NONE);
3338   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_BONE_SELECT);
3339   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3340   RNA_def_property_ui_text(prop, "Show Bone X-Ray", "Show the bone selection overlay");
3341   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3342
3343   prop = RNA_def_property(srna, "xray_alpha_bone", PROP_FLOAT, PROP_FACTOR);
3344   RNA_def_property_float_sdna(prop, NULL, "overlay.xray_alpha_bone");
3345   RNA_def_property_float_default(prop, 0.5f);
3346   RNA_def_property_ui_text(prop, "Opacity", "Opacity to use for bone selection");
3347   RNA_def_property_range(prop, 0.0f, 1.0f);
3348   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3349   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3350
3351   prop = RNA_def_property(srna, "show_motion_paths", PROP_BOOLEAN, PROP_NONE);
3352   RNA_def_property_boolean_negative_sdna(
3353       prop, NULL, "overlay.flag", V3D_OVERLAY_HIDE_MOTION_PATHS);
3354   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3355   RNA_def_property_ui_text(prop, "Motion Paths", "Show the Motion Paths Overlay");
3356   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3357
3358   prop = RNA_def_property(srna, "show_onion_skins", PROP_BOOLEAN, PROP_NONE);
3359   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_ONION_SKINS);
3360   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3361   RNA_def_property_ui_text(prop, "Onion Skins", "Show the Onion Skinning Overlay");
3362   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3363
3364   prop = RNA_def_property(srna, "show_look_dev", PROP_BOOLEAN, PROP_NONE);
3365   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_LOOK_DEV);
3366   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3367   RNA_def_property_ui_text(prop, "Look Dev Preview", "Show look development spheres and palette");
3368   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3369
3370   prop = RNA_def_property(srna, "show_wireframes", PROP_BOOLEAN, PROP_NONE);
3371   RNA_def_property_boolean_sdna(prop, NULL, "overlay.flag", V3D_OVERLAY_WIREFRAMES);
3372   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3373   RNA_def_property_ui_text(prop, "Wireframe", "Show face edges wires");
3374   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3375
3376   prop = RNA_def_property(srna, "wireframe_threshold", PROP_FLOAT, PROP_FACTOR);
3377   RNA_def_property_float_sdna(prop, NULL, "overlay.wireframe_threshold");
3378   RNA_def_property_float_default(prop, 0.5f);
3379   RNA_def_property_ui_text(
3380       prop, "Wireframe Threshold", "Adjust the number of wires displayed (1 for all wires)");
3381   RNA_def_property_range(prop, 0.0f, 1.0f);
3382   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3383   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3384
3385   prop = RNA_def_property(srna, "show_paint_wire", PROP_BOOLEAN, PROP_NONE);
3386   RNA_def_property_boolean_sdna(prop, NULL, "overlay.paint_flag", V3D_OVERLAY_PAINT_WIRE);
3387   RNA_def_property_ui_text(prop, "Show Wire", "Use wireframe display in painting modes");
3388   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3389
3390   prop = RNA_def_property(srna, "show_wpaint_contours", PROP_BOOLEAN, PROP_NONE);
3391   RNA_def_property_boolean_sdna(prop, NULL, "overlay.wpaint_flag", V3D_OVERLAY_WPAINT_CONTOURS);
3392   RNA_def_property_ui_text(
3393       prop,
3394       "Show Weight Contours",
3395       "Show contour lines formed by points with the same interpolated weight");
3396   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3397
3398   prop = RNA_def_property(srna, "show_weight", PROP_BOOLEAN, PROP_NONE);
3399   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_WEIGHT);
3400   RNA_def_property_ui_text(prop, "Show Weights", "Display weights in editmode");
3401   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3402
3403   prop = RNA_def_property(srna, "show_occlude_wire", PROP_BOOLEAN, PROP_NONE);
3404   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_OCCLUDE_WIRE);
3405   RNA_def_property_ui_text(prop, "Hidden Wire", "Use hidden wireframe display");
3406   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3407
3408   prop = RNA_def_property(srna, "show_face_normals", PROP_BOOLEAN, PROP_NONE);
3409   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_NORMALS);
3410   RNA_def_property_ui_text(prop, "Display Normals", "Display face normals as lines");
3411   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3412
3413   prop = RNA_def_property(srna, "show_vertex_normals", PROP_BOOLEAN, PROP_NONE);
3414   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_VERT_NORMALS);
3415   RNA_def_property_ui_text(prop, "Display Vertex Normals", "Display vertex normals as lines");
3416   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3417
3418   prop = RNA_def_property(srna, "show_split_normals", PROP_BOOLEAN, PROP_NONE);
3419   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_LOOP_NORMALS);
3420   RNA_def_property_ui_text(
3421       prop, "Display Split Normals", "Display vertex-per-face normals as lines");
3422   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3423
3424   prop = RNA_def_property(srna, "show_edges", PROP_BOOLEAN, PROP_NONE);
3425   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGES);
3426   RNA_def_property_ui_text(prop, "Draw Edges", "Highlight selected edges");
3427   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3428
3429   prop = RNA_def_property(srna, "show_faces", PROP_BOOLEAN, PROP_NONE);
3430   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACES);
3431   RNA_def_property_ui_text(prop, "Draw Faces", "Highlight selected faces");
3432   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3433
3434   prop = RNA_def_property(srna, "show_face_center", PROP_BOOLEAN, PROP_NONE);
3435   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_DOT);
3436   RNA_def_property_ui_text(prop, "Draw Face Center", "Display face center");
3437   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3438
3439   prop = RNA_def_property(srna, "show_edge_crease", PROP_BOOLEAN, PROP_NONE);
3440   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CREASES);
3441   RNA_def_property_ui_text(
3442       prop, "Draw Creases", "Display creases created for Subdivision Surface modifier");
3443   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3444
3445   prop = RNA_def_property(srna, "show_edge_bevel_weight", PROP_BOOLEAN, PROP_NONE);
3446   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_BWEIGHTS);
3447   RNA_def_property_ui_text(
3448       prop, "Draw Bevel Weights", "Display weights created for the Bevel modifier");
3449   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3450
3451   prop = RNA_def_property(srna, "show_edge_seams", PROP_BOOLEAN, PROP_NONE);
3452   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_SEAMS);
3453   RNA_def_property_ui_text(prop, "Draw Seams", "Display UV unwrapping seams");
3454   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3455
3456   prop = RNA_def_property(srna, "show_edge_sharp", PROP_BOOLEAN, PROP_NONE);
3457   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_SHARP);
3458   RNA_def_property_ui_text(
3459       prop, "Draw Sharp", "Display sharp edges, used with the Edge Split modifier");
3460   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3461
3462   prop = RNA_def_property(srna, "show_freestyle_edge_marks", PROP_BOOLEAN, PROP_NONE);
3463   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FREESTYLE_EDGE);
3464   RNA_def_property_ui_text(prop,
3465                            "Draw Freestyle Edge Marks",
3466                            "Display Freestyle edge marks, used with the Freestyle renderer");
3467   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3468
3469   prop = RNA_def_property(srna, "show_freestyle_face_marks", PROP_BOOLEAN, PROP_NONE);
3470   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FREESTYLE_FACE);
3471   RNA_def_property_ui_text(prop,
3472                            "Draw Freestyle Face Marks",
3473                            "Display Freestyle face marks, used with the Freestyle renderer");
3474   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3475
3476   prop = RNA_def_property(srna, "show_statvis", PROP_BOOLEAN, PROP_NONE);
3477   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_STATVIS);
3478   RNA_def_property_ui_text(prop, "Stat Vis", "Display statistical information about the mesh");
3479   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3480
3481   prop = RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE);
3482   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGE_LEN);
3483   RNA_def_property_ui_text(
3484       prop,
3485       "Edge Length",
3486       "Display selected edge lengths, using global values when set in the transform panel");
3487   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3488
3489   prop = RNA_def_property(srna, "show_extra_edge_angle", PROP_BOOLEAN, PROP_NONE);
3490   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_EDGE_ANG);
3491   RNA_def_property_ui_text(
3492       prop,
3493       "Edge Angle",
3494       "Display selected edge angle, using global values when set in the transform panel");
3495   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3496
3497   prop = RNA_def_property(srna, "show_extra_face_angle", PROP_BOOLEAN, PROP_NONE);
3498   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_ANG);
3499   RNA_def_property_ui_text(prop,
3500                            "Face Angles",
3501                            "Display the angles in the selected edges, "
3502                            "using global values when set in the transform panel");
3503   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3504
3505   prop = RNA_def_property(srna, "show_extra_face_area", PROP_BOOLEAN, PROP_NONE);
3506   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_AREA);
3507   RNA_def_property_ui_text(prop,
3508                            "Face Area",
3509                            "Display the area of selected faces, "
3510                            "using global values when set in the transform panel");
3511   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3512
3513   prop = RNA_def_property(srna, "show_extra_indices", PROP_BOOLEAN, PROP_NONE);
3514   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_INDICES);
3515   RNA_def_property_ui_text(
3516       prop, "Indices", "Display the index numbers of selected vertices, edges, and faces");
3517   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3518
3519   prop = RNA_def_property(srna, "show_curve_handles", PROP_BOOLEAN, PROP_NONE);
3520   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CU_HANDLES);
3521   RNA_def_property_ui_text(prop, "Draw Handles", "Display Bezier handles in editmode");
3522   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3523
3524   prop = RNA_def_property(srna, "show_curve_normals", PROP_BOOLEAN, PROP_NONE);
3525   RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CU_NORMALS);
3526   RNA_def_property_ui_text(prop, "Draw Normals", "Display 3D curve normals in editmode");
3527   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3528
3529   prop = RNA_def_property(srna, "normals_length", PROP_FLOAT, PROP_FACTOR);
3530   RNA_def_property_float_sdna(prop, NULL, "overlay.normals_length");
3531   RNA_def_property_ui_text(prop, "Normal Size", "Display size for normals in the 3D view");
3532   RNA_def_property_range(prop, 0.00001, 100000.0);
3533   RNA_def_property_ui_range(prop, 0.01, 2.0, 1, 2);
3534   RNA_def_property_float_default(prop, 0.02);
3535   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3536
3537   prop = RNA_def_property(srna, "backwire_opacity", PROP_FLOAT, PROP_FACTOR);
3538   RNA_def_property_float_sdna(prop, NULL, "overlay.backwire_opacity");
3539   RNA_def_property_ui_text(prop, "Backwire Opacity", "Opacity when rendering transparent wires");
3540   RNA_def_property_range(prop, 0.0f, 1.0f);
3541   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3542
3543   prop = RNA_def_property(srna, "texture_paint_mode_opacity", PROP_FLOAT, PROP_FACTOR);
3544   RNA_def_property_float_sdna(prop, NULL, "overlay.texture_paint_mode_opacity");
3545   RNA_def_property_float_default(prop, 1.0f);
3546   RNA_def_property_ui_text(
3547       prop, "Stencil Opacity", "Opacity of the texture paint mode stencil mask overlay");
3548   RNA_def_property_range(prop, 0.0f, 1.0f);
3549   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3550
3551   prop = RNA_def_property(srna, "vertex_paint_mode_opacity", PROP_FLOAT, PROP_FACTOR);
3552   RNA_def_property_float_sdna(prop, NULL, "overlay.vertex_paint_mode_opacity");
3553   RNA_def_property_float_default(prop, 1.0f);
3554   RNA_def_property_ui_text(
3555       prop, "Vertex Paint Opacity", "Opacity of the vertex paint mode overlay");
3556   RNA_def_property_range(prop, 0.0f, 1.0f);
3557   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3558
3559   prop = RNA_def_property(srna, "weight_paint_mode_opacity", PROP_FLOAT, PROP_FACTOR);
3560   RNA_def_property_float_sdna(prop, NULL, "overlay.weight_paint_mode_opacity");
3561   RNA_def_property_float_default(prop, 1.0f);
3562   RNA_def_property_ui_text(
3563       prop, "Weight Paint Opacity", "Opacity of the weight paint mode overlay");
3564   RNA_def_property_range(prop, 0.0f, 1.0f);
3565   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3566
3567   prop = RNA_def_property(srna, "sculpt_mode_mask_opacity", PROP_FLOAT, PROP_FACTOR);
3568   RNA_def_property_float_sdna(prop, NULL, "overlay.sculpt_mode_mask_opacity");
3569   RNA_def_property_float_default(prop, 1.0f);
3570   RNA_def_property_ui_text(prop, "Sculpt Mask Opacity", "");
3571   RNA_def_property_range(prop, 0.0f, 1.0f);
3572   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3573
3574   /* grease pencil paper settings */
3575   prop = RNA_def_property(srna, "show_annotation", PROP_BOOLEAN, PROP_NONE);
3576   RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_SHOW_ANNOTATION);
3577   RNA_def_property_ui_text(prop, "Show Annotation", "Show annotations for this view");
3578   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3579
3580   prop = RNA_def_property(srna, "use_gpencil_paper", PROP_BOOLEAN, PROP_NONE);
3581   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_PAPER);
3582   RNA_def_property_ui_text(prop,
3583                            "Use Paper",
3584                            "Cover all viewport with a full color layer to improve visibility "
3585                            "while drawing over complex scenes");
3586   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3587
3588   prop = RNA_def_property(srna, "use_gpencil_grid", PROP_BOOLEAN, PROP_NONE);
3589   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_GRID);
3590   RNA_def_property_ui_text(prop, "Use Grid", "Display a grid over grease pencil paper");
3591   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3592
3593   prop = RNA_def_property(srna, "use_gpencil_fade_layers", PROP_BOOLEAN, PROP_NONE);
3594   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_FADE_NOACTIVE_LAYERS);
3595   RNA_def_property_ui_text(
3596       prop, "Fade Layers", "Toggle fading of Grease Pencil layers except the active one");
3597   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3598
3599   prop = RNA_def_property(srna, "gpencil_grid_opacity", PROP_FLOAT, PROP_NONE);
3600   RNA_def_property_float_sdna(prop, NULL, "overlay.gpencil_grid_opacity");
3601   RNA_def_property_range(prop, 0.1f, 1.0f);
3602   RNA_def_property_float_default(prop, 0.9f);
3603   RNA_def_property_ui_text(prop, "Opacity", "Canvas grid opacity");
3604   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3605
3606   /* Paper opacity factor */
3607   prop = RNA_def_property(srna, "gpencil_paper_opacity", PROP_FLOAT, PROP_NONE);
3608   RNA_def_property_float_sdna(prop, NULL, "overlay.gpencil_paper_opacity");
3609   RNA_def_property_range(prop, 0.0f, 1.0f);
3610   RNA_def_property_float_default(prop, 0.5f);
3611   RNA_def_property_ui_text(prop, "Opacity", "Paper opacity");
3612   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3613
3614   /* Paper opacity factor */
3615   prop = RNA_def_property(srna, "gpencil_fade_layer", PROP_FLOAT, PROP_NONE);
3616   RNA_def_property_float_sdna(prop, NULL, "overlay.gpencil_fade_layer");
3617   RNA_def_property_range(prop, 0.0f, 1.0f);
3618   RNA_def_property_float_default(prop, 0.5f);
3619   RNA_def_property_ui_text(
3620       prop, "Opacity", "Fade layer opacity for Grease Pencil layers except the active one");
3621   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3622
3623   /* show edit lines */
3624   prop = RNA_def_property(srna, "use_gpencil_edit_lines", PROP_BOOLEAN, PROP_NONE);
3625   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_EDIT_LINES);
3626   RNA_def_property_ui_text(prop, "Show Edit Lines", "Show edit lines when editing strokes");
3627   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3628
3629   prop = RNA_def_property(srna, "use_gpencil_multiedit_line_only", PROP_BOOLEAN, PROP_NONE);
3630   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_MULTIEDIT_LINES);
3631   RNA_def_property_ui_text(prop, "Lines Only", "Only show edit lines for additional frames");
3632   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3633
3634   /* main grease pencil onion switch */
3635   prop = RNA_def_property(srna, "use_gpencil_onion_skin", PROP_BOOLEAN, PROP_NONE);
3636   RNA_def_property_boolean_sdna(prop, NULL, "gp_flag", V3D_GP_SHOW_ONION_SKIN);
3637   RNA_def_property_ui_text(
3638       prop, "Onion Skins", "Show ghosts of the keyframes before and after the current frame");
3639   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_GPencil_update");
3640
3641   /* vertex opacity */
3642   prop = RNA_def_property(srna, "vertex_opacity", PROP_FLOAT, PROP_NONE);
3643   RNA_def_property_float_sdna(prop, NULL, "vertex_opacity");
3644   RNA_def_property_range(prop, 0.0f, 1.0f);
3645   RNA_def_property_ui_text(prop, "Vertex Opacity", "Opacity for edit vertices");
3646   RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
3647   RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, "rna_GPencil_update");
3648 }
3649
3650 static void rna_def_space_view3d(BlenderRNA *brna)
3651 {
3652   StructRNA *srna;
3653   PropertyRNA *prop;
3654
3655   static const EnumPropertyItem rv3d_persp_items[] = {
3656       {RV3D_PERSP, "PERSP", 0, "Perspective", ""},
3657       {RV3D_ORTHO, "ORTHO", 0, "Orthographic", ""},
3658       {RV3D_CAMOB, "CAMERA", 0, "Camera", ""},
3659       {0, NULL, 0, NULL, NULL},
3660   };
3661
3662   static const EnumPropertyItem bundle_drawtype_items[] = {
3663       {OB_PLAINAXES, "PLAIN_AXES", 0, "Plain Axes", ""},
3664       {OB_ARROWS, "ARROWS", 0, "Arrows", ""},
3665       {OB_SINGLE_ARROW, "SINGLE_ARROW", 0, "Single Arrow", ""},
3666       {OB_CIRCLE, "CIRCLE", 0, "Circle", ""},
3667       {OB_CUBE, "CUBE", 0, "Cube", ""},
3668       {OB_EMPTY_SPHERE, "SPHERE", 0, "Sphere", ""},
3669       {OB_EMPTY_CONE, "CONE", 0, "Cone", ""},
3670       {0, NULL, 0, NULL, NULL},
3671   };
3672
3673   srna = RNA_def_struct(brna, "SpaceView3D", "Space");
3674   RNA_def_struct_sdna(srna, "View3D");
3675   RNA_def_struct_ui_text(srna, "3D View Space", "3D View space data");
3676
3677   rna_def_space_generic_show_region_toggles(srna,
3678                                             ((1 << RGN_TYPE_TOOL_HEADER) | (1 << RGN_TYPE_TOOLS) |
3679                                              (1 << RGN_TYPE_UI) | (1 << RGN_TYPE_HUD)));
3680
3681   prop = RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
3682   RNA_def_property_flag(prop, PROP_EDITABLE);
3683   RNA_def_property_pointer_sdna(prop, NULL, "camera");
3684   RNA_def_property_ui_text(
3685       prop,
3686       "Camera",
3687       "Active camera used in this view (when unlocked from the scene's active camera)");
3688   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_SpaceView3D_camera_update");
3689
3690   /* render border */
3691   prop = RNA_def_property(srna, "use_render_border", PROP_BOOLEAN, PROP_NONE);
3692   RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_RENDER_BORDER);
3693   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
3694   RNA_def_property_ui_text(prop,
3695                            "Render Region",
3696                            "Use a region within the frame size for rendered viewport"
3697                            "(when not viewing through the camera)");
3698   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3699
3700   prop = RNA_def_property(srna, "render_border_min_x", PROP_FLOAT, PROP_NONE);
3701   RNA_def_property_float_sdna(prop, NULL, "render_border.xmin");
3702   RNA_def_property_range(prop, 0.0f, 1.0f);
3703   RNA_def_property_ui_text(prop, "Region Minimum X", "Minimum X value for the render region");
3704   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3705
3706   prop = RNA_def_property(srna, "render_border_min_y", PROP_FLOAT, PROP_NONE);
3707   RNA_def_property_float_sdna(prop, NULL, "render_border.ymin");
3708   RNA_def_property_range(prop, 0.0f, 1.0f);
3709   RNA_def_property_ui_text(prop, "Region Minimum Y", "Minimum Y value for the render region");
3710   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3711
3712   prop = RNA_def_property(srna, "render_border_max_x", PROP_FLOAT, PROP_NONE);
3713   RNA_def_property_float_sdna(prop, NULL, "render_border.xmax");
3714   RNA_def_property_range(prop, 0.0f, 1.0f);
3715   RNA_def_property_ui_text(prop, "Region Maximum X", "Maximum X value for the render region");
3716   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3717
3718   prop = RNA_def_property(srna, "render_border_max_y", PROP_FLOAT, PROP_NONE);
3719   RNA_def_property_float_sdna(prop, NULL, "render_border.ymax");
3720   RNA_def_property_range(prop, 0.0f, 1.0f);
3721   RNA_def_property_ui_text(prop, "Region Maximum Y", "Maximum Y value for the render region");
3722   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3723
3724   prop = RNA_def_property(srna, "lock_object", PROP_POINTER, PROP_NONE);
3725   RNA_def_property_flag(prop, PROP_EDITABLE);
3726   RNA_def_property_pointer_sdna(prop, NULL, "ob_centre");
3727   RNA_def_property_ui_text(
3728       prop, "Lock to Object", "3D View center is locked to this object's position");
3729   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3730
3731   prop = RNA_def_property(srna, "lock_bone", PROP_STRING, PROP_NONE);
3732   RNA_def_property_string_sdna(prop, NULL, "ob_centre_bone");
3733   RNA_def_property_ui_text(
3734       prop, "Lock to Bone", "3D View center is locked to this bone's position");
3735   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3736
3737   prop = RNA_def_property(srna, "lock_cursor", PROP_BOOLEAN, PROP_NONE);
3738   RNA_def_property_boolean_sdna(prop, NULL, "ob_centre_cursor", 1);
3739   RNA_def_property_ui_text(
3740       prop, "Lock to Cursor", "3D View center is locked to the cursor's position");
3741   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3742
3743   prop = RNA_def_property(srna, "local_view", PROP_POINTER, PROP_NONE);
3744   RNA_def_property_pointer_sdna(prop, NULL, "localvd");
3745   RNA_def_property_ui_text(
3746       prop,
3747       "Local View",
3748       "Display an isolated sub-set of objects, apart from the scene visibility");
3749
3750   prop = RNA_def_property(srna, "lens", PROP_FLOAT, PROP_UNIT_CAMERA);
3751   RNA_def_property_float_sdna(prop, NULL, "lens");
3752   RNA_def_property_ui_text(prop, "Lens", "Viewport lens angle");
3753   RNA_def_property_range(prop, 1.0f, 250.0f);
3754   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3755
3756   prop = RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_DISTANCE);
3757   RNA_def_property_range(prop, 1e-6f, FLT_MAX);
3758   RNA_def_property_ui_range(prop, 0.001f, FLT_MAX, 10, 3);
3759   RNA_def_property_float_default(prop, 0.1f);
3760   RNA_def_property_ui_text(
3761       prop, "Clip Start", "3D View near clipping distance (perspective view only)");
3762   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3763
3764   prop = RNA_def_property(srna, "clip_end", PROP_FLOAT, PROP_DISTANCE);
3765   RNA_def_property_range(prop, 1e-6f, FLT_MAX);
3766   RNA_def_property_ui_range(prop, 0.001f, FLT_MAX, 10, 3);
3767   RNA_def_property_float_default(prop, 1000.0f);
3768   RNA_def_property_ui_text(prop, "Clip End", "3D View far clipping distance");
3769   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3770
3771   prop = RNA_def_property(srna, "lock_camera", PROP_BOOLEAN, PROP_NONE);
3772   RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_LOCK_CAMERA);
3773   RNA_def_property_ui_text(
3774       prop, "Lock Camera to View", "Enable view navigation within the camera view");
3775   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3776
3777   prop = RNA_def_property(srna, "show_gizmo", PROP_BOOLEAN, PROP_NONE);
3778   RNA_def_property_boolean_negative_sdna(prop, NULL, "gizmo_flag", V3D_GIZMO_HIDE);
3779   RNA_def_property_ui_text(prop, "Show Gizmo", "Show gizmos of all types");
3780   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3781
3782   prop = RNA_def_property(srna, "show_gizmo_navigate", PROP_BOOLEAN, PROP_NONE);
3783   RNA_def_property_boolean_negative_sdna(prop, NULL, "gizmo_flag", V3D_GIZMO_HIDE_NAVIGATE);
3784   RNA_def_property_ui_text(prop, "Navigate Gizmo", "Viewport navigation gizmo");
3785   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3786
3787   prop = RNA_def_property(srna, "show_gizmo_context", PROP_BOOLEAN, PROP_NONE);
3788   RNA_def_property_boolean_negative_sdna(prop, NULL, "gizmo_flag", V3D_GIZMO_HIDE_CONTEXT);
3789   RNA_def_property_ui_text(prop, "Context Gizmo", "Context sensitive gizmos for the active item");
3790   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3791
3792   prop = RNA_def_property(srna, "show_gizmo_tool", PROP_BOOLEAN, PROP_NONE);
3793   RNA_def_property_boolean_negative_sdna(prop, NULL, "gizmo_flag", V3D_GIZMO_HIDE_TOOL);
3794   RNA_def_property_ui_text(prop, "Tool Gizmo", "Active tool gizmo");
3795   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3796
3797   /* Per object type gizmo display flags. */
3798
3799   prop = RNA_def_property(srna, "show_gizmo_object_translate", PROP_BOOLEAN, PROP_NONE);
3800   RNA_def_property_boolean_sdna(prop, NULL, "gizmo_show_object", V3D_GIZMO_SHOW_OBJECT_TRANSLATE);
3801   RNA_def_property_ui_text(prop, "Show Object Location", "Gizmo to adjust location");
3802   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3803
3804   prop = RNA_def_property(srna, "show_gizmo_object_rotate", PROP_BOOLEAN, PROP_NONE);
3805   RNA_def_property_boolean_sdna(prop, NULL, "gizmo_show_object", V3D_GIZMO_SHOW_OBJECT_ROTATE);
3806   RNA_def_property_ui_text(prop, "Show Object Rotation", "Gizmo to adjust rotation");
3807   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3808
3809   prop = RNA_def_property(srna, "show_gizmo_object_scale", PROP_BOOLEAN, PROP_NONE);
3810   RNA_def_property_boolean_sdna(prop, NULL, "gizmo_show_object", V3D_GIZMO_SHOW_OBJECT_SCALE);
3811   RNA_def_property_ui_text(prop, "Show Object Scale", "Gizmo to adjust scale");
3812   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3813
3814   /* Empty Object Data. */
3815   prop = RNA_def_property(srna, "show_gizmo_empty_image", PROP_BOOLEAN, PROP_NONE);
3816   RNA_def_property_boolean_sdna(prop, NULL, "gizmo_show_empty", V3D_GIZMO_SHOW_EMPTY_IMAGE);
3817   RNA_def_property_ui_text(prop, "Show Empty Image", "Gizmo to adjust image size and position");
3818   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3819
3820   prop = RNA_def_property(srna, "show_gizmo_empty_force_field", PROP_BOOLEAN, PROP_NONE);
3821   RNA_def_property_boolean_sdna(prop, NULL, "gizmo_show_empty", V3D_GIZMO_SHOW_EMPTY_FORCE_FIELD);
3822   RNA_def_property_ui_text(prop, "Show Empty Force Field", "Gizmo to adjust the force field");
3823   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3824
3825   /* Light Object Data. */
3826   prop = RNA_def_property(srna, "show_gizmo_light_size", PROP_BOOLEAN, PROP_NONE);
3827   RNA_def_property_boolean_sdna(prop, NULL, "gizmo_show_light", V3D_GIZMO_SHOW_LIGHT_SIZE);
3828   RNA_def_property_ui_text(prop, "Show Light Size", "Gizmo to adjust spot and area size");
3829   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3830
3831   prop = RNA_def_property(srna, "show_gizmo_light_look_at", PROP_BOOLEAN, PROP_NONE);
3832   RNA_def_property_boolean_sdna(prop, NULL, "gizmo_show_light", V3D_GIZMO_SHOW_LIGHT_LOOK_AT);
3833   RNA_def_property_ui_text(
3834       prop, "Show Light Look-At", "Gizmo to adjust the direction of the light");
3835   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3836
3837   /* Camera Object Data. */
3838   prop = RNA_def_property(srna, "show_gizmo_camera_lens", PROP_BOOLEAN, PROP_NONE);
3839   RNA_def_property_boolean_sdna(prop, NULL, "gizmo_show_camera", V3D_GIZMO_SHOW_CAMERA_LENS);
3840   RNA_def_property_ui_text(prop, "Show Camera Lens", "Gizmo to adjust camera lens & ortho size");
3841   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3842
3843   prop = RNA_def_property(srna, "show_gizmo_camera_dof_distance", PROP_BOOLEAN, PROP_NONE);
3844   RNA_def_property_boolean_sdna(prop, NULL, "gizmo_show_camera", V3D_GIZMO_SHOW_CAMERA_DOF_DIST);
3845   RNA_def_property_ui_text(prop,
3846                            "Show Camera Focus Distance",
3847                            "Gizmo to adjust camera focus distance "
3848                            "(depends on limits display)");
3849   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3850
3851   prop = RNA_def_property(srna, "use_local_camera", PROP_BOOLEAN, PROP_NONE);
3852   RNA_def_property_boolean_negative_sdna(prop, NULL, "scenelock", 1);
3853   RNA_def_property_boolean_funcs(prop, NULL, "rna_SpaceView3D_use_local_camera_set");
3854   RNA_def_property_ui_text(prop,
3855                            "Use Local Camera",
3856                            "Use a local camera in this view, rather than scene's active camera");
3857   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3858
3859   prop = RNA_def_property(srna, "region_3d", PROP_POINTER, PROP_NONE);
3860   RNA_def_property_struct_type(prop, "RegionView3D");
3861   RNA_def_property_pointer_funcs(prop, "rna_SpaceView3D_region_3d_get", NULL, NULL, NULL);
3862   RNA_def_property_ui_text(
3863       prop, "3D Region", "3D region in this space, in case of quad view the camera region");
3864
3865   prop = RNA_def_property(srna, "region_quadviews", PROP_COLLECTION, PROP_NONE);
3866   RNA_def_property_struct_type(prop, "RegionView3D");
3867   RNA_def_property_collection_funcs(prop,
3868                                     "rna_SpaceView3D_region_quadviews_begin",
3869                                     "rna_iterator_listbase_next",
3870                                     "rna_iterator_listbase_end",
3871                                     "rna_SpaceView3D_region_quadviews_get",
3872                                     NULL,
3873                                     NULL,
3874                                     NULL,
3875                                     NULL);
3876   RNA_def_property_ui_text(prop,
3877                            "Quad View Regions",
3878                            "3D regions (the third one defines quad view settings, "
3879                            "the fourth one is same as 'region_3d')");
3880
3881   prop = RNA_def_property(srna, "show_reconstruction", PROP_BOOLEAN, PROP_NONE);
3882   RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_SHOW_RECONSTRUCTION);
3883   RNA_def_property_ui_text(
3884       prop, "Show Reconstruction", "Display reconstruction data from active movie clip");
3885   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3886
3887   prop = RNA_def_property(srna, "tracks_display_size", PROP_FLOAT, PROP_NONE);
3888   RNA_def_property_range(prop, 0.0, FLT_MAX);
3889   RNA_def_property_ui_range(prop, 0, 5, 1, 3);
3890   RNA_def_property_float_sdna(prop, NULL, "bundle_size");
3891   RNA_def_property_ui_text(prop, "Tracks Size", "Display size of tracks from reconstructed data");
3892   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3893
3894   prop = RNA_def_property(srna, "tracks_display_type", PROP_ENUM, PROP_NONE);
3895   RNA_def_property_enum_sdna(prop, NULL, "bundle_drawtype");
3896   RNA_def_property_enum_items(prop, bundle_drawtype_items);
3897   RNA_def_property_ui_text(prop, "Tracks Display Type", "Viewport display style for tracks");
3898   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3899
3900   prop = RNA_def_property(srna, "show_camera_path", PROP_BOOLEAN, PROP_NONE);
3901   RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_SHOW_CAMERAPATH);
3902   RNA_def_property_ui_text(prop, "Show Camera Path", "Show reconstructed camera path");
3903   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3904
3905   prop = RNA_def_property(srna, "show_bundle_names", PROP_BOOLEAN, PROP_NONE);
3906   RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_SHOW_BUNDLENAME);
3907   RNA_def_property_ui_text(
3908       prop, "Show 3D Marker Names", "Show names for reconstructed tracks objects");
3909   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3910
3911   prop = RNA_def_property(srna, "fx_settings", PROP_POINTER, PROP_NONE);
3912   RNA_def_property_ui_text(prop, "FX Options", "Options used for real time compositing");
3913   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3914
3915   /* Stereo Settings */
3916   prop = RNA_def_property(srna, "stereo_3d_eye", PROP_ENUM, PROP_NONE);
3917   RNA_def_property_enum_sdna(prop, NULL, "multiview_eye");
3918   RNA_def_property_enum_items(prop, stereo3d_eye_items);
3919   RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_SpaceView3D_stereo3d_camera_itemf");
3920   RNA_def_property_ui_text(prop, "Stereo Eye", "Current stereo eye being drawn");
3921   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
3922
3923   prop = RNA_def_property(srna, "stereo_3d_camera", PROP_ENUM, PROP_NONE);
3924   RNA_def_property_enum_sdna(prop, NULL, "stereo3d_camera");
3925   RNA_def_property_enum_items(prop, stereo3d_camera_items);
3926   RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_SpaceView3D_stereo3d_camera_itemf");
3927   RNA_def_property_ui_text(prop, "Camera", "");
3928   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3929
3930   prop = RNA_def_property(srna, "show_stereo_3d_cameras", PROP_BOOLEAN, PROP_NONE);
3931   RNA_def_property_boolean_sdna(prop, NULL, "stereo3d_flag", V3D_S3D_DISPCAMERAS);
3932   RNA_def_property_ui_text(prop, "Cameras", "Show the left and right cameras");
3933   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3934
3935   prop = RNA_def_property(srna, "show_stereo_3d_convergence_plane", PROP_BOOLEAN, PROP_NONE);
3936   RNA_def_property_boolean_sdna(prop, NULL, "stereo3d_flag", V3D_S3D_DISPPLANE);
3937   RNA_def_property_ui_text(prop, "Plane", "Show the stereo 3d convergence plane");
3938   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3939
3940   prop = RNA_def_property(srna, "stereo_3d_convergence_plane_alpha", PROP_FLOAT, PROP_FACTOR);
3941   RNA_def_property_float_sdna(prop, NULL, "stereo3d_convergence_alpha");
3942   RNA_def_property_ui_text(prop, "Plane Alpha", "Opacity (alpha) of the convergence plane");
3943   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3944
3945   prop = RNA_def_property(srna, "show_stereo_3d_volume", PROP_BOOLEAN, PROP_NONE);
3946   RNA_def_property_boolean_sdna(prop, NULL, "stereo3d_flag", V3D_S3D_DISPVOLUME);
3947   RNA_def_property_ui_text(prop, "Volume", "Show the stereo 3d frustum volume");
3948   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3949
3950   prop = RNA_def_property(srna, "stereo_3d_volume_alpha", PROP_FLOAT, PROP_FACTOR);
3951   RNA_def_property_float_sdna(prop, NULL, "stereo3d_volume_alpha");
3952   RNA_def_property_ui_text(prop, "Volume Alpha", "Opacity (alpha) of the cameras' frustum volume");
3953   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3954
3955   {
3956     struct {
3957       const char *name;
3958       int type_mask;
3959       const char *identifier[2];
3960     } info[] = {
3961         {"Mesh", (1 << OB_MESH), {"show_object_viewport_mesh", "show_object_select_mesh"}},
3962         {"Curve", (1 << OB_CURVE), {"show_object_viewport_curve", "show_object_select_curve"}},
3963         {"Surface", (1 << OB_SURF), {"show_object_viewport_surf", "show_object_select_surf"}},
3964         {"Meta", (1 << OB_MBALL), {"show_object_viewport_meta", "show_object_select_meta"}},
3965         {"Font", (1 << OB_FONT), {"show_object_viewport_font", "show_object_select_font"}},
3966         {"Armature",
3967          (1 << OB_ARMATURE),
3968          {"show_object_viewport_armature", "show_object_select_armature"}},
3969         {"Lattice",
3970          (1 << OB_LATTICE),
3971          {"show_object_viewport_lattice", "show_object_select_lattice"}},
3972         {"Empty", (1 << OB_EMPTY), {"show_object_viewport_empty", "show_object_select_empty"}},
3973         {"Grease Pencil",
3974          (1 << OB_GPENCIL),
3975          {"show_object_viewport_grease_pencil", "show_object_select_grease_pencil"}},
3976         {"Camera", (1 << OB_CAMERA), {"show_object_viewport_camera", "show_object_select_camera"}},
3977         {"Light", (1 << OB_LAMP), {"show_object_viewport_light", "show_object_select_light"}},
3978         {"Speaker",
3979          (1 << OB_SPEAKER),
3980          {"show_object_viewport_speaker", "show_object_select_speaker"}},
3981         {"Light Probe",
3982          (1 << OB_LIGHTPROBE),
3983          {"show_object_viewport_light_probe", "show_object_select_light_probe"}},
3984     };
3985
3986     const char *view_mask_member[2] = {
3987         "object_type_exclude_viewport",
3988         "object_type_exclude_select",
3989     };
3990     for (int mask_index = 0; mask_index < 2; mask_index++) {
3991       for (int type_index = 0; type_index < ARRAY_SIZE(info); type_index++) {
3992         prop = RNA_def_property(
3993             srna, info[type_index].identifier[mask_index], PROP_BOOLEAN, PROP_NONE);
3994         RNA_def_property_boolean_negative_sdna(
3995             prop, NULL, view_mask_member[mask_index], info[type_index].type_mask);
3996         RNA_def_property_ui_text(prop, info[type_index].name, "");
3997         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
3998       }
3999     }
4000
4001     /* Heper for drawing the icon. */
4002     prop = RNA_def_property(srna, "icon_from_show_object_viewport", PROP_INT, PROP_NONE);
4003     RNA_def_property_int_funcs(
4004         prop, "rna_SpaceView3D_icon_from_show_object_viewport_get", NULL, NULL);
4005     RNA_def_property_clear_flag(prop, PROP_EDITABLE);
4006     RNA_def_property_ui_text(prop, "Visibility Icon", "");
4007   }
4008
4009   /* Nested Structs */
4010   prop = RNA_def_property(srna, "shading", PROP_POINTER, PROP_NONE);
4011   RNA_def_property_flag(prop, PROP_NEVER_NULL);
4012   RNA_def_property_struct_type(prop, "View3DShading");
4013   RNA_def_property_ui_text(prop, "Shading Settings", "Settings for shading in the 3D viewport");
4014
4015   prop = RNA_def_property(srna, "overlay", PROP_POINTER, PROP_NONE);
4016   RNA_def_property_flag(prop, PROP_NEVER_NULL);
4017   RNA_def_property_struct_type(prop, "View3DOverlay");
4018   RNA_def_property_pointer_funcs(prop, "rna_SpaceView3D_overlay_get", NULL, NULL, NULL);
4019   RNA_def_property_ui_text(
4020       prop, "Overlay Settings", "Settings for display of overlays in the 3D viewport");
4021
4022   rna_def_space_view3d_shading(brna);
4023   rna_def_space_view3d_overlay(brna);
4024
4025   /* *** Animated *** */
4026   RNA_define_animate_sdna(true);
4027   /* region */
4028
4029   srna = RNA_def_struct(brna, "RegionView3D", NULL);
4030   RNA_def_struct_sdna(srna, "RegionView3D");
4031   RNA_def_struct_ui_text(srna, "3D View Region", "3D View region data");
4032
4033   prop = RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_NONE);
4034   RNA_def_property_boolean_sdna(prop, NULL, "viewlock", RV3D_LOCKED);
4035   RNA_def_property_ui_text(prop, "Lock", "Lock view rotation in side views");
4036   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_update");
4037
4038   prop = RNA_def_property(srna, "show_sync_view", PROP_BOOLEAN, PROP_NONE);
4039   RNA_def_property_boolean_sdna(prop, NULL, "viewlock", RV3D_BOXVIEW);
4040   RNA_def_property_ui_text(prop, "Box", "Sync view position between side views");
4041   RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_update");
4042
4043   prop = RNA_def_property(srna, "use_box_clip", PROP_BOOLEAN, PROP_NONE);
4044   RNA_def_property_boolean_sdna(prop, NULL, "viewlock", RV3D_BOXCLIP);
4045   RNA_def_property_ui_text(
4046       prop, "Clip", "Clip objects based on what's visible in other side views");
4047   RNA_def_property_update(
4048       prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_clip_update");
4049
4050   prop = RNA_def_property(srna, "perspective_matrix", PROP_FLOAT, PROP_MATRIX);
4051   RNA_def_property_float_sdna(prop, NULL, "persmat");
4052   RNA_def_property_clear_flag(
4053       prop, PROP_EDITABLE); /* XXX: for now, it's too risky for users to do this */
4054   RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
4055   RNA_def_property_ui_text(
4056       prop, "Perspective Matrix", "Current perspective matrix (``window_matrix * view_matrix``)");
4057
4058   prop = RNA_def_property(srna, "window_matrix", PROP_FLOAT, PROP_MATRIX);
4059   RNA_def_property_float_sdna(prop, NULL, "winmat");
4060   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
4061   RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);