CMake: add WITH_LINKER_LLD option for unix platforms
[blender-staging.git] / source / blender / blenloader / intern / versioning_userdef.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 blenloader
19  *
20  * Version patch user preferences.
21  */
22 #define DNA_DEPRECATED_ALLOW
23 #include <string.h>
24
25 #include "BLI_listbase.h"
26 #include "BLI_math.h"
27 #include "BLI_utildefines.h"
28
29 #ifdef WITH_INTERNATIONAL
30 #  include "BLT_translation.h"
31 #endif
32
33 #include "DNA_anim_types.h"
34 #include "DNA_curve_types.h"
35 #include "DNA_scene_types.h"
36 #include "DNA_space_types.h"
37 #include "DNA_userdef_types.h"
38 #include "DNA_windowmanager_types.h"
39
40 #include "BKE_addon.h"
41 #include "BKE_colorband.h"
42 #include "BKE_idprop.h"
43 #include "BKE_keyconfig.h"
44 #include "BKE_main.h"
45
46 #include "BLO_readfile.h" /* Own include. */
47
48 #include "wm_event_types.h"
49
50 /* Disallow access to global userdef. */
51 #define U (_error_)
52
53 static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
54 {
55
56 #define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(userdef, ver, subver)
57   if (!USER_VERSION_ATLEAST(280, 20)) {
58     memcpy(btheme, &U_theme_default, sizeof(*btheme));
59   }
60
61 #define FROM_DEFAULT_V4_UCHAR(member) copy_v4_v4_uchar(btheme->member, U_theme_default.member)
62
63   if (!USER_VERSION_ATLEAST(280, 25)) {
64     copy_v4_v4_uchar(btheme->space_action.anim_preview_range, btheme->space_action.anim_active);
65     copy_v4_v4_uchar(btheme->space_nla.anim_preview_range, btheme->space_nla.anim_active);
66     copy_v4_v4_uchar(btheme->space_graph.anim_preview_range, btheme->space_action.anim_active);
67   }
68
69   if (!USER_VERSION_ATLEAST(280, 26)) {
70     FROM_DEFAULT_V4_UCHAR(tui.icon_collection);
71     FROM_DEFAULT_V4_UCHAR(tui.icon_object);
72     FROM_DEFAULT_V4_UCHAR(tui.icon_object_data);
73     FROM_DEFAULT_V4_UCHAR(tui.icon_modifier);
74     FROM_DEFAULT_V4_UCHAR(tui.icon_shading);
75   }
76
77   if (!USER_VERSION_ATLEAST(280, 27)) {
78     FROM_DEFAULT_V4_UCHAR(space_action.shade2);
79     FROM_DEFAULT_V4_UCHAR(space_action.hilite);
80     FROM_DEFAULT_V4_UCHAR(space_action.group);
81     FROM_DEFAULT_V4_UCHAR(space_action.group_active);
82     FROM_DEFAULT_V4_UCHAR(space_action.strip_select);
83     FROM_DEFAULT_V4_UCHAR(space_action.ds_channel);
84     FROM_DEFAULT_V4_UCHAR(space_action.ds_subchannel);
85     FROM_DEFAULT_V4_UCHAR(space_action.keytype_movehold);
86     FROM_DEFAULT_V4_UCHAR(space_action.keytype_movehold_select);
87   }
88
89   if (!USER_VERSION_ATLEAST(280, 28)) {
90     FROM_DEFAULT_V4_UCHAR(space_action.ds_ipoline);
91   }
92
93   if (!USER_VERSION_ATLEAST(280, 29)) {
94     FROM_DEFAULT_V4_UCHAR(space_properties.navigation_bar);
95   }
96   if (!USER_VERSION_ATLEAST(280, 31)) {
97     FROM_DEFAULT_V4_UCHAR(space_clip.list_text);
98   }
99
100   if (!USER_VERSION_ATLEAST(280, 36)) {
101     FROM_DEFAULT_V4_UCHAR(tui.wcol_state.inner_changed);
102     FROM_DEFAULT_V4_UCHAR(tui.wcol_state.inner_changed_sel);
103   }
104
105   if (!USER_VERSION_ATLEAST(280, 39)) {
106     FROM_DEFAULT_V4_UCHAR(space_clip.metadatabg);
107     FROM_DEFAULT_V4_UCHAR(space_clip.metadatatext);
108   }
109
110   if (!USER_VERSION_ATLEAST(280, 40)) {
111     FROM_DEFAULT_V4_UCHAR(space_preferences.navigation_bar);
112     copy_v4_v4_uchar(btheme->space_preferences.execution_buts,
113                      btheme->space_preferences.navigation_bar);
114   }
115
116   if (!USER_VERSION_ATLEAST(280, 41)) {
117     FROM_DEFAULT_V4_UCHAR(space_view3d.back);
118   }
119
120   if (!USER_VERSION_ATLEAST(280, 52)) {
121     FROM_DEFAULT_V4_UCHAR(space_info.info_info);
122   }
123
124   if (!USER_VERSION_ATLEAST(280, 64)) {
125     FROM_DEFAULT_V4_UCHAR(tui.icon_scene);
126
127     if (btheme->space_view3d.obcenter_dia == 0) {
128       btheme->space_view3d.obcenter_dia = U_theme_default.space_view3d.obcenter_dia;
129     }
130
131     FROM_DEFAULT_V4_UCHAR(space_graph.text);
132     FROM_DEFAULT_V4_UCHAR(space_action.text);
133     FROM_DEFAULT_V4_UCHAR(space_nla.text);
134     FROM_DEFAULT_V4_UCHAR(space_sequencer.text);
135     FROM_DEFAULT_V4_UCHAR(space_clip.text);
136
137     FROM_DEFAULT_V4_UCHAR(space_graph.time_scrub_background);
138     FROM_DEFAULT_V4_UCHAR(space_action.time_scrub_background);
139     FROM_DEFAULT_V4_UCHAR(space_nla.time_scrub_background);
140     FROM_DEFAULT_V4_UCHAR(space_sequencer.time_scrub_background);
141     FROM_DEFAULT_V4_UCHAR(space_clip.time_scrub_background);
142   }
143
144   if (!USER_VERSION_ATLEAST(280, 67)) {
145     FROM_DEFAULT_V4_UCHAR(space_outliner.selected_object);
146     FROM_DEFAULT_V4_UCHAR(space_outliner.active_object);
147     FROM_DEFAULT_V4_UCHAR(space_outliner.edited_object);
148     FROM_DEFAULT_V4_UCHAR(space_outliner.row_alternate);
149   }
150
151   if (!USER_VERSION_ATLEAST(281, 3)) {
152     FROM_DEFAULT_V4_UCHAR(space_outliner.selected_highlight);
153     FROM_DEFAULT_V4_UCHAR(space_outliner.active);
154   }
155
156   if (!USER_VERSION_ATLEAST(281, 14)) {
157     FROM_DEFAULT_V4_UCHAR(space_file.execution_buts);
158     FROM_DEFAULT_V4_UCHAR(tui.icon_folder);
159     FROM_DEFAULT_V4_UCHAR(space_clip.path_keyframe_before);
160     FROM_DEFAULT_V4_UCHAR(space_clip.path_keyframe_after);
161     copy_v4_v4_uchar(btheme->space_nla.nla_track, btheme->space_nla.header);
162   }
163
164   if (!USER_VERSION_ATLEAST(282, 5)) {
165     FROM_DEFAULT_V4_UCHAR(space_sequencer.anim_preview_range);
166     FROM_DEFAULT_V4_UCHAR(space_text.line_numbers);
167     FROM_DEFAULT_V4_UCHAR(tui.widget_text_cursor);
168     FROM_DEFAULT_V4_UCHAR(space_view3d.face_back);
169     FROM_DEFAULT_V4_UCHAR(space_view3d.face_front);
170   }
171
172   if (!USER_VERSION_ATLEAST(283, 1)) {
173     FROM_DEFAULT_V4_UCHAR(space_view3d.bone_locked_weight);
174   }
175
176   if (!USER_VERSION_ATLEAST(283, 2)) {
177     FROM_DEFAULT_V4_UCHAR(space_info.info_property);
178     FROM_DEFAULT_V4_UCHAR(space_info.info_property_text);
179     FROM_DEFAULT_V4_UCHAR(space_info.info_operator);
180     FROM_DEFAULT_V4_UCHAR(space_info.info_operator_text);
181   }
182
183   if (!USER_VERSION_ATLEAST(283, 5)) {
184     FROM_DEFAULT_V4_UCHAR(space_graph.time_marker_line);
185     FROM_DEFAULT_V4_UCHAR(space_action.time_marker_line);
186     FROM_DEFAULT_V4_UCHAR(space_nla.time_marker_line);
187     FROM_DEFAULT_V4_UCHAR(space_sequencer.time_marker_line);
188     FROM_DEFAULT_V4_UCHAR(space_clip.time_marker_line);
189     FROM_DEFAULT_V4_UCHAR(space_graph.time_marker_line_selected);
190     FROM_DEFAULT_V4_UCHAR(space_action.time_marker_line_selected);
191     FROM_DEFAULT_V4_UCHAR(space_nla.time_marker_line_selected);
192     FROM_DEFAULT_V4_UCHAR(space_sequencer.time_marker_line_selected);
193     FROM_DEFAULT_V4_UCHAR(space_clip.time_marker_line_selected);
194   }
195
196   if (!USER_VERSION_ATLEAST(283, 6)) {
197     btheme->space_node.grid_levels = U_theme_default.space_node.grid_levels;
198   }
199
200   if (!USER_VERSION_ATLEAST(283, 9)) {
201     FROM_DEFAULT_V4_UCHAR(space_info.info_warning);
202   }
203
204   if (!USER_VERSION_ATLEAST(283, 10)) {
205     FROM_DEFAULT_V4_UCHAR(tui.gizmo_view_align);
206
207     FROM_DEFAULT_V4_UCHAR(space_sequencer.active_strip);
208     FROM_DEFAULT_V4_UCHAR(space_sequencer.selected_strip);
209     FROM_DEFAULT_V4_UCHAR(space_sequencer.color_strip);
210     FROM_DEFAULT_V4_UCHAR(space_sequencer.mask);
211   }
212
213   if (!USER_VERSION_ATLEAST(283, 11)) {
214     FROM_DEFAULT_V4_UCHAR(tui.transparent_checker_primary);
215     FROM_DEFAULT_V4_UCHAR(tui.transparent_checker_secondary);
216     btheme->tui.transparent_checker_size = U_theme_default.tui.transparent_checker_size;
217   }
218
219   /**
220    * Versioning code until next subversion bump goes here.
221    *
222    * \note Be sure to check when bumping the version:
223    * - #BLO_version_defaults_userpref_blend in this file.
224    * - "versioning_{BLENDER_VERSION}.c"
225    *
226    * \note Keep this message at the bottom of the function.
227    */
228   {
229     /* Keep this block, even when empty. */
230   }
231
232 #undef FROM_DEFAULT_V4_UCHAR
233
234 #undef USER_VERSION_ATLEAST
235 }
236
237 /* UserDef.flag */
238 #define USER_LMOUSESELECT (1 << 14) /* deprecated */
239
240 static void do_version_select_mouse(UserDef *userdef, wmKeyMapItem *kmi)
241 {
242   /* Remove select/action mouse from user defined keymaps. */
243   enum {
244     ACTIONMOUSE = 0x0005,
245     SELECTMOUSE = 0x0006,
246     EVT_TWEAK_A = 0x5005,
247     EVT_TWEAK_S = 0x5006,
248   };
249   const bool left = (userdef->flag & USER_LMOUSESELECT) != 0;
250
251   switch (kmi->type) {
252     case SELECTMOUSE:
253       kmi->type = (left) ? LEFTMOUSE : RIGHTMOUSE;
254       break;
255     case ACTIONMOUSE:
256       kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
257       break;
258     case EVT_TWEAK_S:
259       kmi->type = (left) ? EVT_TWEAK_L : EVT_TWEAK_R;
260       break;
261     case EVT_TWEAK_A:
262       kmi->type = (left) ? EVT_TWEAK_R : EVT_TWEAK_L;
263       break;
264     default:
265       break;
266   }
267 }
268
269 static bool keymap_item_has_invalid_wm_context_data_path(wmKeyMapItem *kmi,
270                                                          void *UNUSED(user_data))
271 {
272   if (STRPREFIX(kmi->idname, "WM_OT_context_") && kmi->properties) {
273     IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, "data_path");
274     if (idprop && (idprop->type == IDP_STRING) && STRPREFIX(idprop->data.pointer, "(null)")) {
275       return true;
276     }
277   }
278   return false;
279 }
280
281 /* patching UserDef struct and Themes */
282 void BLO_version_defaults_userpref_blend(Main *bmain, UserDef *userdef)
283 {
284
285 #define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(bmain, ver, subver)
286
287   /* the UserDef struct is not corrected with do_versions() .... ugh! */
288   if (userdef->wheellinescroll == 0) {
289     userdef->wheellinescroll = 3;
290   }
291   if (userdef->menuthreshold1 == 0) {
292     userdef->menuthreshold1 = 5;
293     userdef->menuthreshold2 = 2;
294   }
295   if (userdef->mixbufsize == 0) {
296     userdef->mixbufsize = 2048;
297   }
298   if (userdef->autokey_mode == 0) {
299     /* 'add/replace' but not on */
300     userdef->autokey_mode = 2;
301   }
302   if (userdef->savetime <= 0) {
303     userdef->savetime = 1;
304     // XXX      error(STRINGIFY(BLENDER_STARTUP_FILE)" is buggy, please consider removing it.\n");
305   }
306   if (userdef->gizmo_size == 0) {
307     userdef->gizmo_size = 75;
308     userdef->gizmo_flag |= USER_GIZMO_DRAW;
309   }
310   if (userdef->pad_rot_angle == 0.0f) {
311     userdef->pad_rot_angle = 15.0f;
312   }
313
314   /* graph editor - unselected F-Curve visibility */
315   if (userdef->fcu_inactive_alpha == 0) {
316     userdef->fcu_inactive_alpha = 0.25f;
317   }
318
319   if (!USER_VERSION_ATLEAST(192, 0)) {
320     strcpy(userdef->sounddir, "/");
321   }
322
323   /* patch to set Dupli Armature */
324   if (!USER_VERSION_ATLEAST(220, 0)) {
325     userdef->dupflag |= USER_DUP_ARM;
326   }
327
328   /* added seam, normal color, undo */
329   if (!USER_VERSION_ATLEAST(235, 0)) {
330     userdef->uiflag |= USER_GLOBALUNDO;
331     if (userdef->undosteps == 0) {
332       userdef->undosteps = 32;
333     }
334   }
335   if (!USER_VERSION_ATLEAST(236, 0)) {
336     /* illegal combo... */
337     if (userdef->flag & USER_LMOUSESELECT) {
338       userdef->flag &= ~USER_TWOBUTTONMOUSE;
339     }
340   }
341   if (!USER_VERSION_ATLEAST(240, 0)) {
342     userdef->uiflag |= USER_PLAINMENUS;
343   }
344   if (!USER_VERSION_ATLEAST(242, 0)) {
345     /* set defaults for 3D View rotating axis indicator */
346     /* since size can't be set to 0, this indicates it's not saved in startup.blend */
347     if (userdef->rvisize == 0) {
348       userdef->rvisize = 15;
349       userdef->rvibright = 8;
350       userdef->uiflag |= USER_SHOW_GIZMO_NAVIGATE;
351     }
352   }
353   if (!USER_VERSION_ATLEAST(244, 0)) {
354     /* set default number of recently-used files (if not set) */
355     if (userdef->recent_files == 0) {
356       userdef->recent_files = 10;
357     }
358   }
359   if (!USER_VERSION_ATLEAST(245, 3)) {
360     if (userdef->coba_weight.tot == 0) {
361       BKE_colorband_init(&userdef->coba_weight, true);
362     }
363   }
364   if (!USER_VERSION_ATLEAST(245, 3)) {
365     userdef->flag |= USER_ADD_VIEWALIGNED | USER_ADD_EDITMODE;
366   }
367   if (!USER_VERSION_ATLEAST(250, 0)) {
368     /* adjust grease-pencil distances */
369     userdef->gp_manhattendist = 1;
370     userdef->gp_euclideandist = 2;
371
372     /* adjust default interpolation for new IPO-curves */
373     userdef->ipo_new = BEZT_IPO_BEZ;
374   }
375
376   if (!USER_VERSION_ATLEAST(250, 3)) {
377     /* new audio system */
378     if (userdef->audiochannels == 0) {
379       userdef->audiochannels = 2;
380     }
381     if (userdef->audioformat == 0) {
382       userdef->audioformat = 0x24;
383     }
384     if (userdef->audiorate == 0) {
385       userdef->audiorate = 48000;
386     }
387   }
388
389   if (!USER_VERSION_ATLEAST(250, 8)) {
390     wmKeyMap *km;
391
392     for (km = userdef->user_keymaps.first; km; km = km->next) {
393       if (STREQ(km->idname, "Armature_Sketch")) {
394         strcpy(km->idname, "Armature Sketch");
395       }
396       else if (STREQ(km->idname, "View3D")) {
397         strcpy(km->idname, "3D View");
398       }
399       else if (STREQ(km->idname, "View3D Generic")) {
400         strcpy(km->idname, "3D View Generic");
401       }
402       else if (STREQ(km->idname, "EditMesh")) {
403         strcpy(km->idname, "Mesh");
404       }
405       else if (STREQ(km->idname, "UVEdit")) {
406         strcpy(km->idname, "UV Editor");
407       }
408       else if (STREQ(km->idname, "Animation_Channels")) {
409         strcpy(km->idname, "Animation Channels");
410       }
411       else if (STREQ(km->idname, "GraphEdit Keys")) {
412         strcpy(km->idname, "Graph Editor");
413       }
414       else if (STREQ(km->idname, "GraphEdit Generic")) {
415         strcpy(km->idname, "Graph Editor Generic");
416       }
417       else if (STREQ(km->idname, "Action_Keys")) {
418         strcpy(km->idname, "Dopesheet");
419       }
420       else if (STREQ(km->idname, "NLA Data")) {
421         strcpy(km->idname, "NLA Editor");
422       }
423       else if (STREQ(km->idname, "Node Generic")) {
424         strcpy(km->idname, "Node Editor");
425       }
426       else if (STREQ(km->idname, "Logic Generic")) {
427         strcpy(km->idname, "Logic Editor");
428       }
429       else if (STREQ(km->idname, "File")) {
430         strcpy(km->idname, "File Browser");
431       }
432       else if (STREQ(km->idname, "FileMain")) {
433         strcpy(km->idname, "File Browser Main");
434       }
435       else if (STREQ(km->idname, "FileButtons")) {
436         strcpy(km->idname, "File Browser Buttons");
437       }
438       else if (STREQ(km->idname, "Buttons Generic")) {
439         strcpy(km->idname, "Property Editor");
440       }
441     }
442   }
443
444   if (!USER_VERSION_ATLEAST(252, 3)) {
445     if (userdef->flag & USER_LMOUSESELECT) {
446       userdef->flag &= ~USER_TWOBUTTONMOUSE;
447     }
448   }
449   if (!USER_VERSION_ATLEAST(252, 4)) {
450     /* default new handle type is auto handles */
451     userdef->keyhandles_new = HD_AUTO;
452   }
453
454   if (!USER_VERSION_ATLEAST(257, 0)) {
455     /* clear "AUTOKEY_FLAG_ONLYKEYINGSET" flag from userprefs,
456      * so that it doesn't linger around from old configs like a ghost */
457     userdef->autokey_flag &= ~AUTOKEY_FLAG_ONLYKEYINGSET;
458   }
459
460   if (!USER_VERSION_ATLEAST(260, 3)) {
461     /* if new keyframes handle default is stuff "auto", make it "auto-clamped" instead
462      * was changed in 260 as part of GSoC11, but version patch was wrong
463      */
464     if (userdef->keyhandles_new == HD_AUTO) {
465       userdef->keyhandles_new = HD_AUTO_ANIM;
466     }
467   }
468
469   if (!USER_VERSION_ATLEAST(267, 0)) {
470
471     /* GL Texture Garbage Collection */
472     if (userdef->textimeout == 0) {
473       userdef->texcollectrate = 60;
474       userdef->textimeout = 120;
475     }
476     if (userdef->memcachelimit <= 0) {
477       userdef->memcachelimit = 32;
478     }
479     if (userdef->dbl_click_time == 0) {
480       userdef->dbl_click_time = 350;
481     }
482     if (userdef->v2d_min_gridsize == 0) {
483       userdef->v2d_min_gridsize = 35;
484     }
485     if (userdef->widget_unit == 0) {
486       userdef->widget_unit = 20;
487     }
488     if (userdef->anisotropic_filter <= 0) {
489       userdef->anisotropic_filter = 1;
490     }
491
492     if (userdef->ndof_sensitivity == 0.0f) {
493       userdef->ndof_sensitivity = 1.0f;
494       userdef->ndof_flag = (NDOF_LOCK_HORIZON | NDOF_SHOULD_PAN | NDOF_SHOULD_ZOOM |
495                             NDOF_SHOULD_ROTATE);
496     }
497
498     if (userdef->ndof_orbit_sensitivity == 0.0f) {
499       userdef->ndof_orbit_sensitivity = userdef->ndof_sensitivity;
500
501       if (!(userdef->flag & USER_TRACKBALL)) {
502         userdef->ndof_flag |= NDOF_TURNTABLE;
503       }
504     }
505   }
506
507   /* NOTE!! from now on use userdef->versionfile and userdef->subversionfile */
508 #undef USER_VERSION_ATLEAST
509 #define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(userdef, ver, subver)
510
511   if (!USER_VERSION_ATLEAST(271, 5)) {
512     userdef->pie_menu_radius = 100;
513     userdef->pie_menu_threshold = 12;
514     userdef->pie_animation_timeout = 6;
515   }
516
517   if (!USER_VERSION_ATLEAST(275, 2)) {
518     userdef->ndof_deadzone = 0.1;
519   }
520
521   if (!USER_VERSION_ATLEAST(275, 4)) {
522     userdef->node_margin = 80;
523   }
524
525   if (!USER_VERSION_ATLEAST(278, 6)) {
526     /* Clear preference flags for re-use. */
527     userdef->flag &= ~(USER_FLAG_NUMINPUT_ADVANCED | USER_FLAG_UNUSED_2 | USER_FLAG_UNUSED_3 |
528                        USER_FLAG_UNUSED_6 | USER_FLAG_UNUSED_7 | USER_FLAG_UNUSED_9 |
529                        USER_DEVELOPER_UI);
530     userdef->uiflag &= ~(USER_HEADER_BOTTOM);
531     userdef->transopts &= ~(USER_TR_UNUSED_2 | USER_TR_UNUSED_3 | USER_TR_UNUSED_4 |
532                             USER_TR_UNUSED_6 | USER_TR_UNUSED_7);
533
534     userdef->uiflag |= USER_LOCK_CURSOR_ADJUST;
535   }
536
537   if (!USER_VERSION_ATLEAST(280, 20)) {
538     userdef->gpu_viewport_quality = 0.6f;
539
540     /* Reset theme, old themes will not be compatible with minor version updates from now on. */
541     LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
542       memcpy(btheme, &U_theme_default, sizeof(*btheme));
543     }
544
545     /* Annotations - new layer color
546      * Replace anything that used to be set if it looks like was left
547      * on the old default (i.e. black), which most users used
548      */
549     if ((userdef->gpencil_new_layer_col[3] < 0.1f) || (userdef->gpencil_new_layer_col[0] < 0.1f)) {
550       /* - New color matches the annotation pencil icon
551        * - Non-full alpha looks better!
552        */
553       ARRAY_SET_ITEMS(userdef->gpencil_new_layer_col, 0.38f, 0.61f, 0.78f, 0.9f);
554     }
555   }
556
557   if (!USER_VERSION_ATLEAST(280, 31)) {
558     /* Remove select/action mouse from user defined keymaps. */
559     LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
560       LISTBASE_FOREACH (wmKeyMapDiffItem *, kmdi, &keymap->diff_items) {
561         if (kmdi->remove_item) {
562           do_version_select_mouse(userdef, kmdi->remove_item);
563         }
564         if (kmdi->add_item) {
565           do_version_select_mouse(userdef, kmdi->add_item);
566         }
567       }
568
569       LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
570         do_version_select_mouse(userdef, kmi);
571       }
572     }
573   }
574
575   if (!USER_VERSION_ATLEAST(280, 33)) {
576     /* Enable GLTF addon by default. */
577     BKE_addon_ensure(&userdef->addons, "io_scene_gltf2");
578   }
579
580   if (!USER_VERSION_ATLEAST(280, 35)) {
581     /* Preserve RMB select setting after moving to Python and changing default value. */
582     if (USER_VERSION_ATLEAST(280, 32) || !(userdef->flag & USER_LMOUSESELECT)) {
583       BKE_keyconfig_pref_set_select_mouse(userdef, 1, false);
584     }
585
586     userdef->flag &= ~USER_LMOUSESELECT;
587   }
588
589   if (!USER_VERSION_ATLEAST(280, 38)) {
590
591     /* (keep this block even if it becomes empty). */
592     copy_v4_fl4(userdef->light_param[0].vec, -0.580952, 0.228571, 0.781185, 0.0);
593     copy_v4_fl4(userdef->light_param[0].col, 0.900000, 0.900000, 0.900000, 1.000000);
594     copy_v4_fl4(userdef->light_param[0].spec, 0.318547, 0.318547, 0.318547, 1.000000);
595     userdef->light_param[0].flag = 1;
596     userdef->light_param[0].smooth = 0.1;
597
598     copy_v4_fl4(userdef->light_param[1].vec, 0.788218, 0.593482, -0.162765, 0.0);
599     copy_v4_fl4(userdef->light_param[1].col, 0.267115, 0.269928, 0.358840, 1.000000);
600     copy_v4_fl4(userdef->light_param[1].spec, 0.090838, 0.090838, 0.090838, 1.000000);
601     userdef->light_param[1].flag = 1;
602     userdef->light_param[1].smooth = 0.25;
603
604     copy_v4_fl4(userdef->light_param[2].vec, 0.696472, -0.696472, -0.172785, 0.0);
605     copy_v4_fl4(userdef->light_param[2].col, 0.293216, 0.304662, 0.401968, 1.000000);
606     copy_v4_fl4(userdef->light_param[2].spec, 0.069399, 0.020331, 0.020331, 1.000000);
607     userdef->light_param[2].flag = 1;
608     userdef->light_param[2].smooth = 0.4;
609
610     copy_v4_fl4(userdef->light_param[3].vec, 0.021053, -0.989474, 0.143173, 0.0);
611     copy_v4_fl4(userdef->light_param[3].col, 0.0, 0.0, 0.0, 1.0);
612     copy_v4_fl4(userdef->light_param[3].spec, 0.072234, 0.082253, 0.162642, 1.000000);
613     userdef->light_param[3].flag = 1;
614     userdef->light_param[3].smooth = 0.7;
615
616     copy_v3_fl3(userdef->light_ambient, 0.025000, 0.025000, 0.025000);
617
618     userdef->flag &= ~(USER_FLAG_UNUSED_4);
619
620     userdef->uiflag &= ~(USER_HEADER_FROM_PREF | USER_UIFLAG_UNUSED_12 | USER_UIFLAG_UNUSED_22);
621   }
622
623   if (!USER_VERSION_ATLEAST(280, 41)) {
624     /* (keep this block even if it becomes empty). */
625
626     if (userdef->pie_tap_timeout == 0) {
627       userdef->pie_tap_timeout = 20;
628     }
629   }
630
631   if (!USER_VERSION_ATLEAST(280, 44)) {
632     userdef->uiflag &= ~(USER_UIFLAG_UNUSED_0 | USER_UIFLAG_UNUSED_1);
633     userdef->uiflag2 &= ~(USER_UIFLAG2_UNUSED_0);
634     userdef->gp_settings &= ~(GP_PAINT_UNUSED_0);
635   }
636
637   if (!USER_VERSION_ATLEAST(280, 50)) {
638     /* 3ds is no longer enabled by default and not ported yet. */
639     BKE_addon_remove_safe(&userdef->addons, "io_scene_3ds");
640   }
641
642   if (!USER_VERSION_ATLEAST(280, 51)) {
643     userdef->move_threshold = 2;
644   }
645
646   if (!USER_VERSION_ATLEAST(280, 58)) {
647     if (userdef->image_draw_method != IMAGE_DRAW_METHOD_GLSL) {
648       userdef->image_draw_method = IMAGE_DRAW_METHOD_AUTO;
649     }
650   }
651
652   /* patch to set Dupli Lightprobes and Grease Pencil */
653   if (!USER_VERSION_ATLEAST(280, 58)) {
654     userdef->dupflag |= USER_DUP_LIGHTPROBE;
655     userdef->dupflag |= USER_DUP_GPENCIL;
656   }
657
658   if (!USER_VERSION_ATLEAST(280, 60)) {
659     const float GPU_VIEWPORT_QUALITY_FXAA = 0.10f;
660     const float GPU_VIEWPORT_QUALITY_TAA8 = 0.25f;
661     const float GPU_VIEWPORT_QUALITY_TAA16 = 0.6f;
662     const float GPU_VIEWPORT_QUALITY_TAA32 = 0.8f;
663
664     if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_FXAA) {
665       userdef->viewport_aa = SCE_DISPLAY_AA_OFF;
666     }
667     else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA8) {
668       userdef->viewport_aa = SCE_DISPLAY_AA_FXAA;
669     }
670     else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA16) {
671       userdef->viewport_aa = SCE_DISPLAY_AA_SAMPLES_8;
672     }
673     else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA32) {
674       userdef->viewport_aa = SCE_DISPLAY_AA_SAMPLES_16;
675     }
676     else {
677       userdef->viewport_aa = SCE_DISPLAY_AA_SAMPLES_32;
678     }
679   }
680
681   if (!USER_VERSION_ATLEAST(280, 62)) {
682     /* (keep this block even if it becomes empty). */
683     if (userdef->vbotimeout == 0) {
684       userdef->vbocollectrate = 60;
685       userdef->vbotimeout = 120;
686     }
687
688     if (userdef->lookdev_sphere_size == 0) {
689       userdef->lookdev_sphere_size = 150;
690     }
691
692     userdef->pref_flag |= USER_PREF_FLAG_SAVE;
693   }
694
695   if (!USER_VERSION_ATLEAST(280, 73)) {
696     userdef->drag_threshold = 30;
697     userdef->drag_threshold_mouse = 3;
698     userdef->drag_threshold_tablet = 10;
699   }
700
701   if (!USER_VERSION_ATLEAST(281, 9)) {
702     /* X3D is no longer enabled by default. */
703     BKE_addon_remove_safe(&userdef->addons, "io_scene_x3d");
704   }
705
706   if (!USER_VERSION_ATLEAST(281, 12)) {
707     userdef->render_display_type = USER_RENDER_DISPLAY_WINDOW;
708     userdef->filebrowser_display_type = USER_TEMP_SPACE_DISPLAY_WINDOW;
709   }
710
711   if (!USER_VERSION_ATLEAST(281, 13)) {
712     userdef->auto_smoothing_new = FCURVE_SMOOTH_CONT_ACCEL;
713
714     if (userdef->file_space_data.display_type == FILE_DEFAULTDISPLAY) {
715       memcpy(
716           &userdef->file_space_data, &U_default.file_space_data, sizeof(userdef->file_space_data));
717     }
718   }
719
720   if (!USER_VERSION_ATLEAST(281, 16)) {
721     BKE_keyconfig_pref_filter_items(userdef,
722                                     &((struct wmKeyConfigFilterItemParams){
723                                         .check_item = true,
724                                         .check_diff_item_add = true,
725                                     }),
726                                     keymap_item_has_invalid_wm_context_data_path,
727                                     NULL);
728   }
729
730   if (!USER_VERSION_ATLEAST(282, 1)) {
731     userdef->file_space_data.filter_id = U_default.file_space_data.filter_id;
732   }
733
734   if (!USER_VERSION_ATLEAST(282, 4)) {
735     if (userdef->view_rotate_sensitivity_turntable == 0.0f) {
736       userdef->view_rotate_sensitivity_turntable = DEG2RADF(0.4f);
737       userdef->view_rotate_sensitivity_trackball = 1.0f;
738     }
739     if (userdef->scrollback == 0) {
740       userdef->scrollback = U_default.scrollback;
741     }
742
743     /* Enable Overlay Engine Smooth Wire by default */
744     userdef->gpu_flag |= USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE;
745   }
746
747   if (!USER_VERSION_ATLEAST(283, 13)) {
748     /* If Translations is off then language should default to English. */
749     if ((userdef->transopts & USER_DOTRANSLATE_DEPRECATED) == 0) {
750       userdef->language = ULANGUAGE_ENGLISH;
751     }
752     /* Clear this deprecated flag. */
753     userdef->transopts &= ~USER_DOTRANSLATE_DEPRECATED;
754   }
755
756   /**
757    * Versioning code until next subversion bump goes here.
758    *
759    * \note Be sure to check when bumping the version:
760    * - #do_versions_theme in this file.
761    * - "versioning_{BLENDER_VERSION}.c"
762    *
763    * \note Keep this message at the bottom of the function.
764    */
765   {
766     /* Keep this block, even when empty. */
767   }
768
769   if (userdef->pixelsize == 0.0f) {
770     userdef->pixelsize = 1.0f;
771   }
772
773   LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
774     do_versions_theme(userdef, btheme);
775   }
776 #undef USER_VERSION_ATLEAST
777 }
778
779 #undef USER_LMOUSESELECT