Blender  V2.93
versioning_userdef.c
Go to the documentation of this file.
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 
22 #define DNA_DEPRECATED_ALLOW
23 #include <string.h>
24 
25 #include "BLI_listbase.h"
26 #include "BLI_math.h"
27 #include "BLI_string.h"
28 #include "BLI_utildefines.h"
29 
30 #ifdef WITH_INTERNATIONAL
31 # include "BLT_translation.h"
32 #endif
33 
34 #include "DNA_anim_types.h"
35 #include "DNA_collection_types.h"
36 #include "DNA_curve_types.h"
37 #include "DNA_scene_types.h"
38 #include "DNA_space_types.h"
39 #include "DNA_userdef_types.h"
41 
42 #include "BKE_addon.h"
43 #include "BKE_blender_version.h"
44 #include "BKE_colorband.h"
45 #include "BKE_idprop.h"
46 #include "BKE_keyconfig.h"
47 #include "BKE_main.h"
48 #include "BKE_preferences.h"
49 
50 #include "BLO_readfile.h"
51 
52 #include "readfile.h" /* Own include. */
53 
54 #include "wm_event_types.h"
55 
56 /* For versioning we only ever want to manipulate preferences passed in. */
57 #define U BLI_STATIC_ASSERT(false, "Global 'U' not allowed, only use arguments passed in!")
58 
59 static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
60 {
61 
62 #define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(userdef, ver, subver)
63  if (!USER_VERSION_ATLEAST(280, 20)) {
64  memcpy(btheme, &U_theme_default, sizeof(*btheme));
65  }
66 
67 #define FROM_DEFAULT_V4_UCHAR(member) copy_v4_v4_uchar(btheme->member, U_theme_default.member)
68 
69  if (!USER_VERSION_ATLEAST(280, 25)) {
73  }
74 
75  if (!USER_VERSION_ATLEAST(280, 26)) {
76  FROM_DEFAULT_V4_UCHAR(tui.icon_collection);
77  FROM_DEFAULT_V4_UCHAR(tui.icon_object);
78  FROM_DEFAULT_V4_UCHAR(tui.icon_object_data);
79  FROM_DEFAULT_V4_UCHAR(tui.icon_modifier);
80  FROM_DEFAULT_V4_UCHAR(tui.icon_shading);
81  }
82 
83  if (!USER_VERSION_ATLEAST(280, 27)) {
84  FROM_DEFAULT_V4_UCHAR(space_action.shade2);
85  FROM_DEFAULT_V4_UCHAR(space_action.hilite);
86  FROM_DEFAULT_V4_UCHAR(space_action.group);
87  FROM_DEFAULT_V4_UCHAR(space_action.group_active);
88  FROM_DEFAULT_V4_UCHAR(space_action.strip_select);
89  FROM_DEFAULT_V4_UCHAR(space_action.ds_channel);
90  FROM_DEFAULT_V4_UCHAR(space_action.ds_subchannel);
91  FROM_DEFAULT_V4_UCHAR(space_action.keytype_movehold);
92  FROM_DEFAULT_V4_UCHAR(space_action.keytype_movehold_select);
93  }
94 
95  if (!USER_VERSION_ATLEAST(280, 28)) {
96  FROM_DEFAULT_V4_UCHAR(space_action.ds_ipoline);
97  }
98 
99  if (!USER_VERSION_ATLEAST(280, 29)) {
100  FROM_DEFAULT_V4_UCHAR(space_properties.navigation_bar);
101  }
102  if (!USER_VERSION_ATLEAST(280, 31)) {
103  FROM_DEFAULT_V4_UCHAR(space_clip.list_text);
104  }
105 
106  if (!USER_VERSION_ATLEAST(280, 36)) {
107  FROM_DEFAULT_V4_UCHAR(tui.wcol_state.inner_changed);
108  FROM_DEFAULT_V4_UCHAR(tui.wcol_state.inner_changed_sel);
109  }
110 
111  if (!USER_VERSION_ATLEAST(280, 39)) {
112  FROM_DEFAULT_V4_UCHAR(space_clip.metadatabg);
113  FROM_DEFAULT_V4_UCHAR(space_clip.metadatatext);
114  }
115 
116  if (!USER_VERSION_ATLEAST(280, 40)) {
117  FROM_DEFAULT_V4_UCHAR(space_preferences.navigation_bar);
120  }
121 
122  if (!USER_VERSION_ATLEAST(280, 41)) {
123  FROM_DEFAULT_V4_UCHAR(space_view3d.back);
124  }
125 
126  if (!USER_VERSION_ATLEAST(280, 52)) {
127  FROM_DEFAULT_V4_UCHAR(space_info.info_info);
128  }
129 
130  if (!USER_VERSION_ATLEAST(280, 64)) {
131  FROM_DEFAULT_V4_UCHAR(tui.icon_scene);
132 
133  if (btheme->space_view3d.obcenter_dia == 0) {
135  }
136 
137  FROM_DEFAULT_V4_UCHAR(space_graph.text);
138  FROM_DEFAULT_V4_UCHAR(space_action.text);
139  FROM_DEFAULT_V4_UCHAR(space_nla.text);
140  FROM_DEFAULT_V4_UCHAR(space_sequencer.text);
141  FROM_DEFAULT_V4_UCHAR(space_clip.text);
142 
143  FROM_DEFAULT_V4_UCHAR(space_graph.time_scrub_background);
144  FROM_DEFAULT_V4_UCHAR(space_action.time_scrub_background);
145  FROM_DEFAULT_V4_UCHAR(space_nla.time_scrub_background);
146  FROM_DEFAULT_V4_UCHAR(space_sequencer.time_scrub_background);
147  FROM_DEFAULT_V4_UCHAR(space_clip.time_scrub_background);
148  }
149 
150  if (!USER_VERSION_ATLEAST(280, 67)) {
151  FROM_DEFAULT_V4_UCHAR(space_outliner.selected_object);
152  FROM_DEFAULT_V4_UCHAR(space_outliner.active_object);
153  FROM_DEFAULT_V4_UCHAR(space_outliner.edited_object);
154  FROM_DEFAULT_V4_UCHAR(space_outliner.row_alternate);
155  }
156 
157  if (!USER_VERSION_ATLEAST(281, 3)) {
158  FROM_DEFAULT_V4_UCHAR(space_outliner.selected_highlight);
159  FROM_DEFAULT_V4_UCHAR(space_outliner.active);
160  }
161 
162  if (!USER_VERSION_ATLEAST(281, 14)) {
163  FROM_DEFAULT_V4_UCHAR(space_file.execution_buts);
164  FROM_DEFAULT_V4_UCHAR(tui.icon_folder);
165  FROM_DEFAULT_V4_UCHAR(space_clip.path_keyframe_before);
166  FROM_DEFAULT_V4_UCHAR(space_clip.path_keyframe_after);
168  }
169 
170  if (!USER_VERSION_ATLEAST(282, 5)) {
171  FROM_DEFAULT_V4_UCHAR(space_sequencer.anim_preview_range);
172  FROM_DEFAULT_V4_UCHAR(space_text.line_numbers);
173  FROM_DEFAULT_V4_UCHAR(tui.widget_text_cursor);
174  FROM_DEFAULT_V4_UCHAR(space_view3d.face_back);
175  FROM_DEFAULT_V4_UCHAR(space_view3d.face_front);
176  }
177 
178  if (!USER_VERSION_ATLEAST(283, 1)) {
179  FROM_DEFAULT_V4_UCHAR(space_view3d.bone_locked_weight);
180  }
181 
182  if (!USER_VERSION_ATLEAST(283, 2)) {
183  FROM_DEFAULT_V4_UCHAR(space_info.info_property);
184  FROM_DEFAULT_V4_UCHAR(space_info.info_property_text);
185  FROM_DEFAULT_V4_UCHAR(space_info.info_operator);
186  FROM_DEFAULT_V4_UCHAR(space_info.info_operator_text);
187  }
188 
189  if (!USER_VERSION_ATLEAST(283, 5)) {
190  FROM_DEFAULT_V4_UCHAR(space_graph.time_marker_line);
191  FROM_DEFAULT_V4_UCHAR(space_action.time_marker_line);
192  FROM_DEFAULT_V4_UCHAR(space_nla.time_marker_line);
193  FROM_DEFAULT_V4_UCHAR(space_sequencer.time_marker_line);
194  FROM_DEFAULT_V4_UCHAR(space_clip.time_marker_line);
195  FROM_DEFAULT_V4_UCHAR(space_graph.time_marker_line_selected);
196  FROM_DEFAULT_V4_UCHAR(space_action.time_marker_line_selected);
197  FROM_DEFAULT_V4_UCHAR(space_nla.time_marker_line_selected);
198  FROM_DEFAULT_V4_UCHAR(space_sequencer.time_marker_line_selected);
199  FROM_DEFAULT_V4_UCHAR(space_clip.time_marker_line_selected);
200  }
201 
202  if (!USER_VERSION_ATLEAST(283, 6)) {
204  }
205 
206  if (!USER_VERSION_ATLEAST(283, 9)) {
207  FROM_DEFAULT_V4_UCHAR(space_info.info_warning);
208  }
209 
210  if (!USER_VERSION_ATLEAST(283, 10)) {
211  FROM_DEFAULT_V4_UCHAR(tui.gizmo_view_align);
212 
213  FROM_DEFAULT_V4_UCHAR(space_sequencer.active_strip);
214  FROM_DEFAULT_V4_UCHAR(space_sequencer.selected_strip);
215  FROM_DEFAULT_V4_UCHAR(space_sequencer.color_strip);
216  FROM_DEFAULT_V4_UCHAR(space_sequencer.mask);
217  }
218 
219  if (!USER_VERSION_ATLEAST(283, 11)) {
220  FROM_DEFAULT_V4_UCHAR(tui.transparent_checker_primary);
221  FROM_DEFAULT_V4_UCHAR(tui.transparent_checker_secondary);
223  }
224  if (!USER_VERSION_ATLEAST(291, 2)) {
225  /* The new defaults for the file browser theme are the same as
226  * the outliner's, and it's less disruptive to just copy them. */
229 
230  FROM_DEFAULT_V4_UCHAR(space_image.grid);
231  }
232 
233  if (!USER_VERSION_ATLEAST(291, 3)) {
234  for (int i = 0; i < COLLECTION_COLOR_TOT; ++i) {
235  FROM_DEFAULT_V4_UCHAR(collection_color[i].color);
236  }
237 
238  FROM_DEFAULT_V4_UCHAR(space_properties.match);
239 
240  /* New grid theme color defaults are the same as the existing background colors,
241  * so they are copied to limit disruption. */
242  copy_v3_v3_uchar(btheme->space_clip.grid, btheme->space_clip.back);
243  btheme->space_clip.grid[3] = 255.0f;
244 
245  copy_v3_v3_uchar(btheme->space_node.grid, btheme->space_node.back);
246  }
247 
248  if (!USER_VERSION_ATLEAST(291, 9)) {
249  FROM_DEFAULT_V4_UCHAR(space_graph.vertex_active);
250  }
251 
252  if (!USER_VERSION_ATLEAST(292, 5)) {
253  for (int i = 0; i < COLLECTION_COLOR_TOT; ++i) {
254  FROM_DEFAULT_V4_UCHAR(collection_color[i].color);
255  }
256  FROM_DEFAULT_V4_UCHAR(space_sequencer.row_alternate);
257  FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_geometry);
258  FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_attribute);
259  }
260 
261  if (!USER_VERSION_ATLEAST(292, 12)) {
262  FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_shader);
263  }
264 
265  if (!USER_VERSION_ATLEAST(293, 15)) {
266  FROM_DEFAULT_V4_UCHAR(space_properties.active);
267 
268  FROM_DEFAULT_V4_UCHAR(space_info.info_error);
269  FROM_DEFAULT_V4_UCHAR(space_info.info_warning);
270  FROM_DEFAULT_V4_UCHAR(space_info.info_info);
271  FROM_DEFAULT_V4_UCHAR(space_info.info_debug);
272  FROM_DEFAULT_V4_UCHAR(space_info.info_debug_text);
273  FROM_DEFAULT_V4_UCHAR(space_info.info_property);
274  FROM_DEFAULT_V4_UCHAR(space_info.info_error);
275  FROM_DEFAULT_V4_UCHAR(space_info.info_operator);
276 
277  btheme->space_spreadsheet = btheme->space_outliner;
278  }
279 
289  {
290  /* Keep this block, even when empty. */
291  }
292 
293 #undef FROM_DEFAULT_V4_UCHAR
294 
295 #undef USER_VERSION_ATLEAST
296 }
297 
298 /* UserDef.flag */
299 #define USER_LMOUSESELECT (1 << 14) /* deprecated */
300 
301 static void do_version_select_mouse(UserDef *userdef, wmKeyMapItem *kmi)
302 {
303  /* Remove select/action mouse from user defined keymaps. */
304  enum {
305  ACTIONMOUSE = 0x0005,
306  SELECTMOUSE = 0x0006,
307  EVT_TWEAK_A = 0x5005,
308  EVT_TWEAK_S = 0x5006,
309  };
310  const bool left = (userdef->flag & USER_LMOUSESELECT) != 0;
311 
312  switch (kmi->type) {
313  case SELECTMOUSE:
314  kmi->type = (left) ? LEFTMOUSE : RIGHTMOUSE;
315  break;
316  case ACTIONMOUSE:
317  kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
318  break;
319  case EVT_TWEAK_S:
320  kmi->type = (left) ? EVT_TWEAK_L : EVT_TWEAK_R;
321  break;
322  case EVT_TWEAK_A:
323  kmi->type = (left) ? EVT_TWEAK_R : EVT_TWEAK_L;
324  break;
325  default:
326  break;
327  }
328 }
329 
331  void *UNUSED(user_data))
332 {
333  if (STRPREFIX(kmi->idname, "WM_OT_context_") && kmi->properties) {
334  IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, "data_path");
335  if (idprop && (idprop->type == IDP_STRING) && STRPREFIX(idprop->data.pointer, "(null)")) {
336  return true;
337  }
338  }
339  return false;
340 }
341 
342 /* patching UserDef struct and Themes */
344 {
345  /* #UserDef & #Main happen to have the same struct member. */
346 #define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_ATLEAST(userdef, ver, subver)
347 
348  /* the UserDef struct is not corrected with do_versions() .... ugh! */
349  if (userdef->menuthreshold1 == 0) {
350  userdef->menuthreshold1 = 5;
351  userdef->menuthreshold2 = 2;
352  }
353  if (userdef->mixbufsize == 0) {
354  userdef->mixbufsize = 2048;
355  }
356  if (userdef->autokey_mode == 0) {
357  /* 'add/replace' but not on */
358  userdef->autokey_mode = 2;
359  }
360  if (userdef->savetime <= 0) {
361  userdef->savetime = 1;
362  // XXX error(STRINGIFY(BLENDER_STARTUP_FILE)" is buggy, please consider removing it.\n");
363  }
364  if (userdef->gizmo_size == 0) {
365  userdef->gizmo_size = 75;
366  userdef->gizmo_flag |= USER_GIZMO_DRAW;
367  }
368  if (userdef->pad_rot_angle == 0.0f) {
369  userdef->pad_rot_angle = 15.0f;
370  }
371 
372  /* graph editor - unselected F-Curve visibility */
373  if (userdef->fcu_inactive_alpha == 0) {
374  userdef->fcu_inactive_alpha = 0.25f;
375  }
376 
377  if (!USER_VERSION_ATLEAST(192, 0)) {
378  strcpy(userdef->sounddir, "/");
379  }
380 
381  /* patch to set Dupli Armature */
382  if (!USER_VERSION_ATLEAST(220, 0)) {
383  userdef->dupflag |= USER_DUP_ARM;
384  }
385 
386  /* added seam, normal color, undo */
387  if (!USER_VERSION_ATLEAST(235, 0)) {
388  userdef->uiflag |= USER_GLOBALUNDO;
389  if (userdef->undosteps == 0) {
390  userdef->undosteps = 32;
391  }
392  }
393  if (!USER_VERSION_ATLEAST(236, 0)) {
394  /* illegal combo... */
395  if (userdef->flag & USER_LMOUSESELECT) {
396  userdef->flag &= ~USER_TWOBUTTONMOUSE;
397  }
398  }
399  if (!USER_VERSION_ATLEAST(240, 0)) {
400  userdef->uiflag |= USER_PLAINMENUS;
401  }
402  if (!USER_VERSION_ATLEAST(242, 0)) {
403  /* set defaults for 3D View rotating axis indicator */
404  /* since size can't be set to 0, this indicates it's not saved in startup.blend */
405  if (userdef->rvisize == 0) {
406  userdef->rvisize = 15;
407  userdef->rvibright = 8;
408  userdef->uiflag |= USER_SHOW_GIZMO_NAVIGATE;
409  }
410  }
411  if (!USER_VERSION_ATLEAST(244, 0)) {
412  /* set default number of recently-used files (if not set) */
413  if (userdef->recent_files == 0) {
414  userdef->recent_files = 10;
415  }
416  }
417  if (!USER_VERSION_ATLEAST(245, 3)) {
418  if (userdef->coba_weight.tot == 0) {
419  BKE_colorband_init(&userdef->coba_weight, true);
420  }
421  }
422  if (!USER_VERSION_ATLEAST(245, 3)) {
424  }
425  if (!USER_VERSION_ATLEAST(250, 0)) {
426  /* adjust grease-pencil distances */
427  userdef->gp_manhattandist = 1;
428  userdef->gp_euclideandist = 2;
429 
430  /* adjust default interpolation for new IPO-curves */
431  userdef->ipo_new = BEZT_IPO_BEZ;
432  }
433 
434  if (!USER_VERSION_ATLEAST(250, 3)) {
435  /* new audio system */
436  if (userdef->audiochannels == 0) {
437  userdef->audiochannels = 2;
438  }
439  if (userdef->audioformat == 0) {
440  userdef->audioformat = 0x24;
441  }
442  if (userdef->audiorate == 0) {
443  userdef->audiorate = 48000;
444  }
445  }
446 
447  if (!USER_VERSION_ATLEAST(250, 8)) {
448  wmKeyMap *km;
449 
450  for (km = userdef->user_keymaps.first; km; km = km->next) {
451  if (STREQ(km->idname, "Armature_Sketch")) {
452  strcpy(km->idname, "Armature Sketch");
453  }
454  else if (STREQ(km->idname, "View3D")) {
455  strcpy(km->idname, "3D View");
456  }
457  else if (STREQ(km->idname, "View3D Generic")) {
458  strcpy(km->idname, "3D View Generic");
459  }
460  else if (STREQ(km->idname, "EditMesh")) {
461  strcpy(km->idname, "Mesh");
462  }
463  else if (STREQ(km->idname, "UVEdit")) {
464  strcpy(km->idname, "UV Editor");
465  }
466  else if (STREQ(km->idname, "Animation_Channels")) {
467  strcpy(km->idname, "Animation Channels");
468  }
469  else if (STREQ(km->idname, "GraphEdit Keys")) {
470  strcpy(km->idname, "Graph Editor");
471  }
472  else if (STREQ(km->idname, "GraphEdit Generic")) {
473  strcpy(km->idname, "Graph Editor Generic");
474  }
475  else if (STREQ(km->idname, "Action_Keys")) {
476  strcpy(km->idname, "Dopesheet");
477  }
478  else if (STREQ(km->idname, "NLA Data")) {
479  strcpy(km->idname, "NLA Editor");
480  }
481  else if (STREQ(km->idname, "Node Generic")) {
482  strcpy(km->idname, "Node Editor");
483  }
484  else if (STREQ(km->idname, "Logic Generic")) {
485  strcpy(km->idname, "Logic Editor");
486  }
487  else if (STREQ(km->idname, "File")) {
488  strcpy(km->idname, "File Browser");
489  }
490  else if (STREQ(km->idname, "FileMain")) {
491  strcpy(km->idname, "File Browser Main");
492  }
493  else if (STREQ(km->idname, "FileButtons")) {
494  strcpy(km->idname, "File Browser Buttons");
495  }
496  else if (STREQ(km->idname, "Buttons Generic")) {
497  strcpy(km->idname, "Property Editor");
498  }
499  }
500  }
501 
502  if (!USER_VERSION_ATLEAST(252, 3)) {
503  if (userdef->flag & USER_LMOUSESELECT) {
504  userdef->flag &= ~USER_TWOBUTTONMOUSE;
505  }
506  }
507  if (!USER_VERSION_ATLEAST(252, 4)) {
508  /* default new handle type is auto handles */
509  userdef->keyhandles_new = HD_AUTO;
510  }
511 
512  if (!USER_VERSION_ATLEAST(257, 0)) {
513  /* clear "AUTOKEY_FLAG_ONLYKEYINGSET" flag from userprefs,
514  * so that it doesn't linger around from old configs like a ghost */
516  }
517 
518  if (!USER_VERSION_ATLEAST(260, 3)) {
519  /* if new keyframes handle default is stuff "auto", make it "auto-clamped" instead
520  * was changed in 260 as part of GSoC11, but version patch was wrong
521  */
522  if (userdef->keyhandles_new == HD_AUTO) {
523  userdef->keyhandles_new = HD_AUTO_ANIM;
524  }
525  }
526 
527  if (!USER_VERSION_ATLEAST(267, 0)) {
528 
529  /* GL Texture Garbage Collection */
530  if (userdef->textimeout == 0) {
531  userdef->texcollectrate = 60;
532  userdef->textimeout = 120;
533  }
534  if (userdef->memcachelimit <= 0) {
535  userdef->memcachelimit = 32;
536  }
537  if (userdef->dbl_click_time == 0) {
538  userdef->dbl_click_time = 350;
539  }
540  if (userdef->v2d_min_gridsize == 0) {
541  userdef->v2d_min_gridsize = 35;
542  }
543  if (userdef->widget_unit == 0) {
544  userdef->widget_unit = 20;
545  }
546  if (userdef->anisotropic_filter <= 0) {
547  userdef->anisotropic_filter = 1;
548  }
549 
550  if (userdef->ndof_sensitivity == 0.0f) {
551  userdef->ndof_sensitivity = 1.0f;
554  }
555 
556  if (userdef->ndof_orbit_sensitivity == 0.0f) {
557  userdef->ndof_orbit_sensitivity = userdef->ndof_sensitivity;
558 
559  if (!(userdef->flag & USER_TRACKBALL)) {
560  userdef->ndof_flag |= NDOF_TURNTABLE;
561  }
562  }
563  }
564 
565  if (!USER_VERSION_ATLEAST(269, 4)) {
566  userdef->walk_navigation.mouse_speed = 1.0f;
567  userdef->walk_navigation.walk_speed = 2.5f; /* m/s */
568  userdef->walk_navigation.walk_speed_factor = 5.0f;
569  userdef->walk_navigation.view_height = 1.6f; /* m */
570  userdef->walk_navigation.jump_height = 0.4f; /* m */
571  userdef->walk_navigation.teleport_time = 0.2f; /* s */
572  }
573 
574  if (!USER_VERSION_ATLEAST(271, 5)) {
575  userdef->pie_menu_radius = 100;
576  userdef->pie_menu_threshold = 12;
577  userdef->pie_animation_timeout = 6;
578  }
579 
580  if (!USER_VERSION_ATLEAST(275, 2)) {
581  userdef->ndof_deadzone = 0.1;
582  }
583 
584  if (!USER_VERSION_ATLEAST(275, 4)) {
585  userdef->node_margin = 80;
586  }
587 
588  if (!USER_VERSION_ATLEAST(278, 6)) {
589  /* Clear preference flags for re-use. */
593  userdef->uiflag &= ~(USER_HEADER_BOTTOM);
596 
597  userdef->uiflag |= USER_LOCK_CURSOR_ADJUST;
598  }
599 
600  if (!USER_VERSION_ATLEAST(280, 20)) {
601  userdef->gpu_viewport_quality = 0.6f;
602 
603  /* Reset theme, old themes will not be compatible with minor version updates from now on. */
604  LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
605  memcpy(btheme, &U_theme_default, sizeof(*btheme));
606  }
607 
608  /* Annotations - new layer color
609  * Replace anything that used to be set if it looks like was left
610  * on the old default (i.e. black), which most users used
611  */
612  if ((userdef->gpencil_new_layer_col[3] < 0.1f) || (userdef->gpencil_new_layer_col[0] < 0.1f)) {
613  /* - New color matches the annotation pencil icon
614  * - Non-full alpha looks better!
615  */
616  ARRAY_SET_ITEMS(userdef->gpencil_new_layer_col, 0.38f, 0.61f, 0.78f, 0.9f);
617  }
618  }
619 
620  if (!USER_VERSION_ATLEAST(280, 31)) {
621  /* Remove select/action mouse from user defined keymaps. */
622  LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
623  LISTBASE_FOREACH (wmKeyMapDiffItem *, kmdi, &keymap->diff_items) {
624  if (kmdi->remove_item) {
625  do_version_select_mouse(userdef, kmdi->remove_item);
626  }
627  if (kmdi->add_item) {
628  do_version_select_mouse(userdef, kmdi->add_item);
629  }
630  }
631 
632  LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
633  do_version_select_mouse(userdef, kmi);
634  }
635  }
636  }
637 
638  if (!USER_VERSION_ATLEAST(280, 33)) {
639  /* Enable GLTF addon by default. */
640  BKE_addon_ensure(&userdef->addons, "io_scene_gltf2");
641 
642  userdef->pressure_threshold_max = 1.0f;
643  }
644 
645  if (!USER_VERSION_ATLEAST(280, 35)) {
646  /* Preserve RMB select setting after moving to Python and changing default value. */
647  if (USER_VERSION_ATLEAST(280, 32) || !(userdef->flag & USER_LMOUSESELECT)) {
648  BKE_keyconfig_pref_set_select_mouse(userdef, 1, false);
649  }
650 
651  userdef->flag &= ~USER_LMOUSESELECT;
652  }
653 
654  if (!USER_VERSION_ATLEAST(280, 38)) {
655 
656  /* (keep this block even if it becomes empty). */
657  copy_v4_fl4(userdef->light_param[0].vec, -0.580952, 0.228571, 0.781185, 0.0);
658  copy_v4_fl4(userdef->light_param[0].col, 0.900000, 0.900000, 0.900000, 1.000000);
659  copy_v4_fl4(userdef->light_param[0].spec, 0.318547, 0.318547, 0.318547, 1.000000);
660  userdef->light_param[0].flag = 1;
661  userdef->light_param[0].smooth = 0.1;
662 
663  copy_v4_fl4(userdef->light_param[1].vec, 0.788218, 0.593482, -0.162765, 0.0);
664  copy_v4_fl4(userdef->light_param[1].col, 0.267115, 0.269928, 0.358840, 1.000000);
665  copy_v4_fl4(userdef->light_param[1].spec, 0.090838, 0.090838, 0.090838, 1.000000);
666  userdef->light_param[1].flag = 1;
667  userdef->light_param[1].smooth = 0.25;
668 
669  copy_v4_fl4(userdef->light_param[2].vec, 0.696472, -0.696472, -0.172785, 0.0);
670  copy_v4_fl4(userdef->light_param[2].col, 0.293216, 0.304662, 0.401968, 1.000000);
671  copy_v4_fl4(userdef->light_param[2].spec, 0.069399, 0.020331, 0.020331, 1.000000);
672  userdef->light_param[2].flag = 1;
673  userdef->light_param[2].smooth = 0.4;
674 
675  copy_v4_fl4(userdef->light_param[3].vec, 0.021053, -0.989474, 0.143173, 0.0);
676  copy_v4_fl4(userdef->light_param[3].col, 0.0, 0.0, 0.0, 1.0);
677  copy_v4_fl4(userdef->light_param[3].spec, 0.072234, 0.082253, 0.162642, 1.000000);
678  userdef->light_param[3].flag = 1;
679  userdef->light_param[3].smooth = 0.7;
680 
681  copy_v3_fl3(userdef->light_ambient, 0.025000, 0.025000, 0.025000);
682 
683  userdef->flag &= ~(USER_FLAG_UNUSED_4);
684 
686  }
687 
688  if (!USER_VERSION_ATLEAST(280, 41)) {
689  /* (keep this block even if it becomes empty). */
690 
691  if (userdef->pie_tap_timeout == 0) {
692  userdef->pie_tap_timeout = 20;
693  }
694  }
695 
696  if (!USER_VERSION_ATLEAST(280, 44)) {
698  userdef->uiflag2 &= ~(USER_UIFLAG2_UNUSED_0);
699  userdef->gp_settings &= ~(GP_PAINT_UNUSED_0);
700  }
701 
702  if (!USER_VERSION_ATLEAST(280, 50)) {
703  /* 3ds is no longer enabled by default and not ported yet. */
704  BKE_addon_remove_safe(&userdef->addons, "io_scene_3ds");
705  }
706 
707  if (!USER_VERSION_ATLEAST(280, 51)) {
708  userdef->move_threshold = 2;
709  }
710 
711  if (!USER_VERSION_ATLEAST(280, 58)) {
712  if (userdef->image_draw_method != IMAGE_DRAW_METHOD_GLSL) {
714  }
715  }
716 
717  /* patch to set Dupli Lightprobes and Grease Pencil */
718  if (!USER_VERSION_ATLEAST(280, 58)) {
719  userdef->dupflag |= USER_DUP_LIGHTPROBE;
720  userdef->dupflag |= USER_DUP_GPENCIL;
721  }
722 
723  if (!USER_VERSION_ATLEAST(280, 60)) {
724  const float GPU_VIEWPORT_QUALITY_FXAA = 0.10f;
725  const float GPU_VIEWPORT_QUALITY_TAA8 = 0.25f;
726  const float GPU_VIEWPORT_QUALITY_TAA16 = 0.6f;
727  const float GPU_VIEWPORT_QUALITY_TAA32 = 0.8f;
728 
729  if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_FXAA) {
730  userdef->viewport_aa = SCE_DISPLAY_AA_OFF;
731  }
732  else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA8) {
733  userdef->viewport_aa = SCE_DISPLAY_AA_FXAA;
734  }
735  else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA16) {
737  }
738  else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA32) {
740  }
741  else {
743  }
744  }
745 
746  if (!USER_VERSION_ATLEAST(280, 62)) {
747  /* (keep this block even if it becomes empty). */
748  if (userdef->vbotimeout == 0) {
749  userdef->vbocollectrate = 60;
750  userdef->vbotimeout = 120;
751  }
752 
753  if (userdef->lookdev_sphere_size == 0) {
754  userdef->lookdev_sphere_size = 150;
755  }
756 
757  userdef->pref_flag |= USER_PREF_FLAG_SAVE;
758  }
759 
760  if (!USER_VERSION_ATLEAST(280, 73)) {
761  userdef->drag_threshold = 30;
762  userdef->drag_threshold_mouse = 3;
763  userdef->drag_threshold_tablet = 10;
764  }
765 
766  if (!USER_VERSION_ATLEAST(281, 9)) {
767  /* X3D is no longer enabled by default. */
768  BKE_addon_remove_safe(&userdef->addons, "io_scene_x3d");
769  }
770 
771  if (!USER_VERSION_ATLEAST(281, 12)) {
774  }
775 
776  if (!USER_VERSION_ATLEAST(281, 13)) {
778 
780  memcpy(
781  &userdef->file_space_data, &U_default.file_space_data, sizeof(userdef->file_space_data));
782  }
783  }
784 
785  if (!USER_VERSION_ATLEAST(281, 16)) {
787  &((struct wmKeyConfigFilterItemParams){
788  .check_item = true,
789  .check_diff_item_add = true,
790  }),
792  NULL);
793  }
794 
795  if (!USER_VERSION_ATLEAST(282, 1)) {
797  }
798 
799  if (!USER_VERSION_ATLEAST(282, 4)) {
800  if (userdef->view_rotate_sensitivity_turntable == 0.0f) {
802  userdef->view_rotate_sensitivity_trackball = 1.0f;
803  }
804  if (userdef->scrollback == 0) {
805  userdef->scrollback = U_default.scrollback;
806  }
807 
808  /* Enable Overlay Engine Smooth Wire by default */
810  }
811 
812  if (!USER_VERSION_ATLEAST(283, 13)) {
813  /* If Translations is off then language should default to English. */
814  if ((userdef->transopts & USER_DOTRANSLATE_DEPRECATED) == 0) {
815  userdef->language = ULANGUAGE_ENGLISH;
816  }
817  /* Clear this deprecated flag. */
819  }
820 
821  if (!USER_VERSION_ATLEAST(290, 7)) {
823  }
824 
825  if (!USER_VERSION_ATLEAST(291, 1)) {
826  if (userdef->collection_instance_empty_size == 0) {
827  userdef->collection_instance_empty_size = 1.0f;
828  }
829  }
830 
831  if (!USER_VERSION_ATLEAST(292, 3)) {
832  if (userdef->pixelsize == 0.0f) {
833  userdef->pixelsize = 1.0f;
834  }
835  /* Clear old userdef flag for "Camera Parent Lock". */
836  userdef->uiflag &= ~USER_UIFLAG_UNUSED_3;
837  }
838 
839  if (!USER_VERSION_ATLEAST(292, 9)) {
840  if (BLI_listbase_is_empty(&userdef->asset_libraries)) {
842  }
843  }
844 
845  if (!USER_VERSION_ATLEAST(293, 1)) {
846  /* This rename was made after 2.93.0, harmless to run when it's not needed. */
847  const char *replace_table[][2] = {
848  {"blender", "Blender"},
849  {"blender_27x", "Blender_27x"},
850  {"industry_compatible", "Industry_Compatible"},
851  };
852  const int replace_table_len = ARRAY_SIZE(replace_table);
853 
855  userdef->keyconfigstr, sizeof(userdef->keyconfigstr), replace_table, replace_table_len);
858  kpt->idname, sizeof(kpt->idname), replace_table, replace_table_len);
859  }
860  }
861 
862  if (!USER_VERSION_ATLEAST(293, 2)) {
863  /* Enable asset browser features by default for alpha testing.
864  * BLO_sanitize_experimental_features_userpref_blend() will disable it again for non-alpha
865  * builds. */
866  userdef->experimental.use_asset_browser = true;
867  }
868 
869  if (!USER_VERSION_ATLEAST(293, 12)) {
870  if (userdef->gizmo_size_navigate_v3d == 0) {
871  userdef->gizmo_size_navigate_v3d = 80;
872  }
873 
875  }
876 
886  {
887  /* Keep this block, even when empty. */
888  }
889 
890  LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
891  do_versions_theme(userdef, btheme);
892  }
893 #undef USER_VERSION_ATLEAST
894 }
895 
897 {
898  /* User preference experimental settings are only supported in alpha builds.
899  * This prevents users corrupting data and relying on API that may change.
900  *
901  * If user preferences are saved this will be stored in disk as expected.
902  * This only starts to take effect when there is a release branch (on beta).
903  *
904  * At that time master already has its version bumped so its user preferences
905  * are not touched by these settings. */
906 
908  return;
909  }
910 
911  MEMSET_STRUCT_AFTER(&userdef->experimental, 0, SANITIZE_AFTER_HERE);
912 }
913 
914 #undef USER_LMOUSESELECT
struct bAddon * BKE_addon_ensure(struct ListBase *addon_list, const char *module)
Definition: addon.c:58
bool BKE_addon_remove_safe(struct ListBase *addon_list, const char *module)
Definition: addon.c:69
bool BKE_blender_version_is_alpha(void)
Definition: blender.c:147
void BKE_colorband_init(struct ColorBand *coba, bool rangetype)
Definition: colorband.c:38
struct IDProperty * IDP_GetPropertyFromGroup(const struct IDProperty *prop, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BKE_keyconfig_pref_filter_items(struct UserDef *userdef, const struct wmKeyConfigFilterItemParams *params, bool(*filter_fn)(struct wmKeyMapItem *kmi, void *user_data), void *user_data)
void BKE_keyconfig_pref_set_select_mouse(struct UserDef *userdef, int value, bool override)
Definition: keyconfig.c:125
void BKE_preferences_asset_library_default_add(struct UserDef *userdef) ATTR_NONNULL()
Definition: preferences.c:103
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
Definition: BLI_listbase.h:124
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
#define DEG2RADF(_deg)
MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
MINLINE void copy_v3_v3_uchar(unsigned char r[3], const unsigned char a[3])
MINLINE void copy_v3_fl3(float v[3], float x, float y, float z)
bool BLI_str_replace_table_exact(char *string, const size_t string_len, const char *replace_table[][2], int replace_table_len)
Definition: string.c:549
#define STRPREFIX(a, b)
#define ARRAY_SIZE(arr)
#define ARRAY_SET_ITEMS(...)
#define UNUSED(x)
#define MEMSET_STRUCT_AFTER(struct_var, value, member)
#define STREQ(a, b)
external readfile function prototypes.
const struct UserDef U_default
const struct bTheme U_theme_default
@ IDP_STRING
Definition: DNA_ID.h:97
@ FCURVE_SMOOTH_CONT_ACCEL
Object groups, one object can be in many groups at once.
@ COLLECTION_COLOR_TOT
@ HD_AUTO_ANIM
@ HD_AUTO
@ BEZT_IPO_BEZ
@ SCE_DISPLAY_AA_OFF
@ SCE_DISPLAY_AA_SAMPLES_32
@ SCE_DISPLAY_AA_SAMPLES_8
@ SCE_DISPLAY_AA_SAMPLES_16
@ SCE_DISPLAY_AA_FXAA
@ FILE_DEFAULTDISPLAY
@ USER_TR_UNUSED_4
@ USER_DOTRANSLATE_DEPRECATED
@ USER_TR_UNUSED_3
@ USER_TR_UNUSED_6
@ USER_TR_UNUSED_7
@ USER_TR_UNUSED_2
@ USER_UIFLAG_UNUSED_3
@ USER_UIFLAG_UNUSED_22
@ USER_LOCK_CURSOR_ADJUST
@ USER_SHOW_GIZMO_NAVIGATE
@ USER_HEADER_FROM_PREF
@ USER_HEADER_BOTTOM
@ USER_GLOBALUNDO
@ USER_UIFLAG_UNUSED_12
@ USER_PLAINMENUS
@ USER_UIFLAG_UNUSED_0
@ USER_UIFLAG_UNUSED_1
@ IMAGE_DRAW_METHOD_AUTO
@ IMAGE_DRAW_METHOD_GLSL
@ USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE
@ USER_SEQ_PROXY_SETUP_AUTOMATIC
@ USER_ADD_VIEWALIGNED
@ USER_FLAG_UNUSED_9
@ USER_ADD_EDITMODE
@ USER_TRACKBALL
@ USER_FLAG_UNUSED_4
@ USER_FLAG_UNUSED_6
@ USER_FLAG_UNUSED_7
@ USER_FLAG_NUMINPUT_ADVANCED
@ USER_DEVELOPER_UI
@ USER_FLAG_UNUSED_2
@ USER_FLAG_UNUSED_3
@ USER_TWOBUTTONMOUSE
@ STATUSBAR_SHOW_VERSION
@ USER_DUP_LIGHTPROBE
@ USER_DUP_GPENCIL
@ USER_DUP_ARM
@ USER_UIFLAG2_UNUSED_0
@ USER_RENDER_DISPLAY_WINDOW
@ GP_PAINT_UNUSED_0
@ NDOF_LOCK_HORIZON
@ NDOF_SHOULD_PAN
@ NDOF_SHOULD_ZOOM
@ NDOF_SHOULD_ROTATE
@ NDOF_TURNTABLE
@ AUTOKEY_FLAG_ONLYKEYINGSET
@ USER_GIZMO_DRAW
@ ULANGUAGE_ENGLISH
@ USER_PREF_FLAG_SAVE
@ USER_TEMP_SPACE_DISPLAY_WINDOW
void * user_data
static int left
void * pointer
Definition: DNA_ID.h:63
IDPropertyData data
Definition: DNA_ID.h:80
char type
Definition: DNA_ID.h:71
void * first
Definition: DNA_listBase.h:47
unsigned char anim_active[4]
unsigned char navigation_bar[4]
unsigned char obcenter_dia
unsigned char header[4]
unsigned char nla_track[4]
unsigned char anim_preview_range[4]
unsigned char grid_levels
unsigned char grid[4]
unsigned char back[4]
unsigned char execution_buts[4]
unsigned char row_alternate[4]
unsigned char transparent_checker_size
struct WalkNavigation walk_navigation
short autokey_mode
float pressure_threshold_max
short texcollectrate
short dbl_click_time
short gp_settings
struct ListBase addons
short menuthreshold2
short anisotropic_filter
short vbocollectrate
float pad_rot_angle
char drag_threshold
float view_rotate_sensitivity_trackball
float ndof_sensitivity
short pie_animation_timeout
float ndof_orbit_sensitivity
float light_ambient[3]
char statusbar_flag
float view_rotate_sensitivity_turntable
UserDef_FileSpaceData file_space_data
short textimeout
UserDef_Experimental experimental
short v2d_min_gridsize
char keyhandles_new
struct ListBase user_keymaps
char drag_threshold_mouse
float gpencil_new_layer_col[4]
short vbotimeout
short lookdev_sphere_size
float fcu_inactive_alpha
struct ListBase themes
char gizmo_size_navigate_v3d
short sequencer_proxy_setup
short pie_menu_radius
short recent_files
short gp_euclideandist
short image_draw_method
short menuthreshold1
char auto_smoothing_new
short pie_menu_threshold
struct ListBase user_keyconfig_prefs
short autokey_flag
char drag_threshold_tablet
short gp_manhattandist
struct SolidLight light_param[4]
char filebrowser_display_type
char move_threshold
unsigned int dupflag
short pie_tap_timeout
char keyconfigstr[64]
float collection_instance_empty_size
struct ListBase asset_libraries
char render_display_type
struct ColorBand coba_weight
float ndof_deadzone
char sounddir[768]
short widget_unit
ThemeSpace space_clip
ThemeSpace space_action
ThemeSpace space_view3d
ThemeSpace space_outliner
ThemeSpace space_nla
ThemeSpace space_graph
ThemeUI tui
ThemeSpace space_preferences
ThemeSpace space_node
ThemeSpace space_spreadsheet
ThemeSpace space_file
struct wmKeyMap * next
void BLO_sanitize_experimental_features_userpref_blend(UserDef *userdef)
#define USER_VERSION_ATLEAST(ver, subver)
#define FROM_DEFAULT_V4_UCHAR(member)
#define USER_LMOUSESELECT
void blo_do_versions_userdef(UserDef *userdef)
static bool keymap_item_has_invalid_wm_context_data_path(wmKeyMapItem *kmi, void *UNUSED(user_data))
static void do_version_select_mouse(UserDef *userdef, wmKeyMapItem *kmi)
static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
@ RIGHTMOUSE
@ EVT_TWEAK_R
@ LEFTMOUSE
@ EVT_TWEAK_L