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