Blender V5.0
versioning_userdef.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10#define DNA_DEPRECATED_ALLOW
11#include <cstring>
12
13#include <fmt/format.h>
14
15#include "BLI_listbase.h"
16#include "BLI_map.hh"
17#include "BLI_math_rotation.h"
18#include "BLI_math_vector.h"
19#include "BLI_string.h"
20#include "BLI_string_utf8.h"
21#include "BLI_string_utils.hh"
22#include "BLI_utildefines.h"
23
24#include "DNA_anim_types.h"
25#include "DNA_curve_types.h"
26#include "DNA_scene_types.h"
27#include "DNA_space_types.h"
28#include "DNA_userdef_types.h"
30
31#include "BKE_addon.h"
32#include "BKE_blender_version.h"
33#include "BKE_colorband.hh"
34#include "BKE_idprop.hh"
35#include "BKE_keyconfig.h"
36#include "BKE_main.hh"
37#include "BKE_preferences.h"
38
39#include "BLO_readfile.hh"
40#include "BLO_userdef_default.h"
41
42#include "BLT_translation.hh"
43
44#include "DNA_brush_enums.h"
45
46#include "GPU_platform.hh"
47
48#include "MEM_guardedalloc.h"
49
50#include "readfile.hh" /* Own include. */
51
52#include "WM_keymap.hh"
53#include "WM_types.hh"
54#include "wm_event_types.hh"
55
56/* Don't use translation strings in versioning!
57 * These depend on the preferences already being read.
58 * If this is important we can set the translations as part of versioning preferences,
59 * however that should only be done if there are important use-cases. */
60#if 0
61# include "BLT_translation.hh"
62#else
63# define N_(msgid) msgid
64#endif
65
66/* For versioning we only ever want to manipulate preferences passed in. */
67#define U BLI_STATIC_ASSERT(false, "Global 'U' not allowed, only use arguments passed in!")
68
69static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
70{
71
72#define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_FILE_ATLEAST(userdef, ver, subver)
73#define FROM_DEFAULT_V4_UCHAR(member) copy_v4_v4_uchar(btheme->member, U_theme_default.member)
74
75 if (!USER_VERSION_ATLEAST(300, 41)) {
77 }
78
79 /* Again reset the theme, but only if stored with an early 3.1 alpha version. Some changes were
80 * done in the release branch and then merged into the 3.1 branch (master). So the previous reset
81 * wouldn't work for people who saved their preferences with a 3.1 build meanwhile. But we still
82 * don't want to reset theme changes stored in the eventual 3.0 release once opened in a 3.1
83 * build. */
84 if (userdef->versionfile > 300 && !USER_VERSION_ATLEAST(301, 1)) {
86 }
87
88 if (!USER_VERSION_ATLEAST(301, 2)) {
89 FROM_DEFAULT_V4_UCHAR(space_sequencer.mask);
90 }
91
92 if (!USER_VERSION_ATLEAST(302, 8)) {
93 btheme->space_node.grid_levels = U_theme_default.space_node.grid_levels;
94 }
95
96 if (!USER_VERSION_ATLEAST(306, 3)) {
97 FROM_DEFAULT_V4_UCHAR(space_view3d.face_retopology);
98 }
99
100 if (!USER_VERSION_ATLEAST(306, 8)) {
101 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_simulation);
102 FROM_DEFAULT_V4_UCHAR(space_action.simulated_frames);
103 }
104
105 if (!USER_VERSION_ATLEAST(400, 12)) {
106 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_repeat);
107 }
108
109 if (!USER_VERSION_ATLEAST(400, 24)) {
110 FROM_DEFAULT_V4_UCHAR(tui.wcol_list_item.inner_sel);
111 FROM_DEFAULT_V4_UCHAR(space_sequencer.transition);
112 }
113
114 if (!USER_VERSION_ATLEAST(400, 27)) {
115 FROM_DEFAULT_V4_UCHAR(space_sequencer.keyborder);
116 FROM_DEFAULT_V4_UCHAR(space_sequencer.keyborder_select);
117 FROM_DEFAULT_V4_UCHAR(space_sequencer.transition);
118 }
119
120 if (!USER_VERSION_ATLEAST(400, 35)) {
121 FROM_DEFAULT_V4_UCHAR(tui.wcol_list_item.item);
122 }
123
124 if (!USER_VERSION_ATLEAST(401, 4)) {
125 FROM_DEFAULT_V4_UCHAR(space_view3d.edge_select);
126 FROM_DEFAULT_V4_UCHAR(space_view3d.edge_mode_select);
127 FROM_DEFAULT_V4_UCHAR(space_view3d.face_select);
128 FROM_DEFAULT_V4_UCHAR(space_view3d.face_mode_select);
129 }
130
131 if (!USER_VERSION_ATLEAST(402, 13)) {
132 FROM_DEFAULT_V4_UCHAR(space_text.hilite);
133 FROM_DEFAULT_V4_UCHAR(space_console.console_cursor);
134 }
135
136 if (!USER_VERSION_ATLEAST(402, 16)) {
138 &userdef->themes, btheme, "Theme", '.', offsetof(bTheme, name), sizeof(btheme->name));
139 }
140
141 if (!USER_VERSION_ATLEAST(402, 47)) {
142 FROM_DEFAULT_V4_UCHAR(space_view3d.time_gp_keyframe);
143 }
144
145 if (!USER_VERSION_ATLEAST(402, 62)) {
146 FROM_DEFAULT_V4_UCHAR(space_sequencer.audio);
147 FROM_DEFAULT_V4_UCHAR(space_sequencer.color_strip);
148 FROM_DEFAULT_V4_UCHAR(space_sequencer.effect);
149 FROM_DEFAULT_V4_UCHAR(space_sequencer.image);
150 FROM_DEFAULT_V4_UCHAR(space_sequencer.mask);
151 FROM_DEFAULT_V4_UCHAR(space_sequencer.meta);
152 FROM_DEFAULT_V4_UCHAR(space_sequencer.movie);
153 FROM_DEFAULT_V4_UCHAR(space_sequencer.movieclip);
154 FROM_DEFAULT_V4_UCHAR(space_sequencer.scene);
155 FROM_DEFAULT_V4_UCHAR(space_sequencer.text_strip);
156 FROM_DEFAULT_V4_UCHAR(space_sequencer.transition);
157 }
158
159 if (!USER_VERSION_ATLEAST(403, 5)) {
160 FROM_DEFAULT_V4_UCHAR(space_view3d.before_current_frame);
161 FROM_DEFAULT_V4_UCHAR(space_view3d.after_current_frame);
162 FROM_DEFAULT_V4_UCHAR(space_sequencer.before_current_frame);
163 FROM_DEFAULT_V4_UCHAR(space_sequencer.after_current_frame);
164 }
165
166 if (!USER_VERSION_ATLEAST(403, 18)) {
167 FROM_DEFAULT_V4_UCHAR(tui.icon_autokey);
168 }
169
170 if (!USER_VERSION_ATLEAST(403, 25)) {
171 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_foreach_geometry_element);
172 }
173
174 if (!USER_VERSION_ATLEAST(403, 27)) {
175 FROM_DEFAULT_V4_UCHAR(tui.editor_border);
176 FROM_DEFAULT_V4_UCHAR(tui.editor_outline);
177 FROM_DEFAULT_V4_UCHAR(tui.editor_outline_active);
178 }
179
180 if (!USER_VERSION_ATLEAST(404, 7)) {
181 if (btheme->space_view3d.face_front[0] == 0 && btheme->space_view3d.face_front[1] == 0 &&
182 btheme->space_view3d.face_front[2] == 0xFF && btheme->space_view3d.face_front[3] == 0xB3)
183 {
184 /* Use new default value only if currently set to the old default value. */
185 FROM_DEFAULT_V4_UCHAR(space_view3d.face_front);
186 }
187 }
188
189 if (!USER_VERSION_ATLEAST(404, 12)) {
190 FROM_DEFAULT_V4_UCHAR(space_sequencer.text_strip_cursor);
191 FROM_DEFAULT_V4_UCHAR(space_sequencer.selected_text);
192 }
193
194 if (!USER_VERSION_ATLEAST(405, 3)) {
195 FROM_DEFAULT_V4_UCHAR(tui.wcol_state.error);
196 FROM_DEFAULT_V4_UCHAR(tui.wcol_state.warning);
197 FROM_DEFAULT_V4_UCHAR(tui.wcol_state.info);
198 FROM_DEFAULT_V4_UCHAR(tui.wcol_state.success);
199 }
200
201 if (!USER_VERSION_ATLEAST(405, 14)) {
202 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_closure);
203 }
204
205 if (!USER_VERSION_ATLEAST(500, 6)) {
206 /* Match the selected/unselected outline colors. */
207 copy_v4_v4_uchar(btheme->tui.wcol_box.outline_sel, U_theme_default.tui.wcol_box.outline);
209 U_theme_default.tui.wcol_list_item.outline);
210 copy_v4_v4_uchar(btheme->tui.wcol_menu.outline_sel, U_theme_default.tui.wcol_menu.outline);
212 U_theme_default.tui.wcol_menu_back.outline);
214 U_theme_default.tui.wcol_menu_item.outline);
215 copy_v4_v4_uchar(btheme->tui.wcol_num.outline_sel, U_theme_default.tui.wcol_num.outline);
217 U_theme_default.tui.wcol_numslider.outline);
218 copy_v4_v4_uchar(btheme->tui.wcol_option.outline_sel, U_theme_default.tui.wcol_option.outline);
220 U_theme_default.tui.wcol_pie_menu.outline);
222 U_theme_default.tui.wcol_progress.outline);
224 U_theme_default.tui.wcol_pulldown.outline);
225 copy_v4_v4_uchar(btheme->tui.wcol_radio.outline_sel, U_theme_default.tui.wcol_radio.outline);
227 U_theme_default.tui.wcol_regular.outline);
228 copy_v4_v4_uchar(btheme->tui.wcol_scroll.outline_sel, U_theme_default.tui.wcol_scroll.outline);
229 copy_v4_v4_uchar(btheme->tui.wcol_tab.outline_sel, U_theme_default.tui.wcol_tab.outline);
230 copy_v4_v4_uchar(btheme->tui.wcol_text.outline_sel, U_theme_default.tui.wcol_text.outline);
231 copy_v4_v4_uchar(btheme->tui.wcol_toggle.outline_sel, U_theme_default.tui.wcol_toggle.outline);
232 copy_v4_v4_uchar(btheme->tui.wcol_tool.outline_sel, U_theme_default.tui.wcol_tool.outline);
234 U_theme_default.tui.wcol_toolbar_item.outline);
236 U_theme_default.tui.wcol_tooltip.outline);
237 }
238
239 if (!USER_VERSION_ATLEAST(500, 9)) {
240 FROM_DEFAULT_V4_UCHAR(tui.panel_header);
241 FROM_DEFAULT_V4_UCHAR(tui.panel_back);
242 FROM_DEFAULT_V4_UCHAR(tui.panel_sub_back);
243 }
244
245 if (!USER_VERSION_ATLEAST(500, 12)) {
246 FROM_DEFAULT_V4_UCHAR(space_node.syntaxs);
247 FROM_DEFAULT_V4_UCHAR(space_node.syntaxb);
248 FROM_DEFAULT_V4_UCHAR(space_node.syntaxn);
249 FROM_DEFAULT_V4_UCHAR(space_node.syntaxv);
250 FROM_DEFAULT_V4_UCHAR(space_node.syntaxc);
251 FROM_DEFAULT_V4_UCHAR(space_node.syntaxd);
252 FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_attribute);
253 FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_filter);
254 FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_geometry);
255 FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_output);
256 FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_script);
257 FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_shader);
258 FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_texture);
259 FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_vector);
260 }
261
262 if (!USER_VERSION_ATLEAST(500, 19)) {
263 btheme->tui.menu_shadow_fac = U_theme_default.tui.menu_shadow_fac;
264 btheme->tui.menu_shadow_width = U_theme_default.tui.menu_shadow_width;
265 }
266
267 if (!USER_VERSION_ATLEAST(500, 24)) {
268 FROM_DEFAULT_V4_UCHAR(tui.panel_title);
269 FROM_DEFAULT_V4_UCHAR(tui.panel_text);
270 }
271
272 if (!USER_VERSION_ATLEAST(500, 29)) {
273 FROM_DEFAULT_V4_UCHAR(space_node.console_output);
274 }
275
276 if (!USER_VERSION_ATLEAST(405, 45)) {
277 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_closure);
278 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_repeat);
279 }
280
281 if (!USER_VERSION_ATLEAST(500, 47)) {
282 if (btheme->tui.panel_title[3] == 0) {
283 btheme->tui.panel_title[3] = 255;
284 }
285 if (btheme->tui.panel_text[3] == 0) {
286 btheme->tui.panel_text[3] = 255;
287 }
288 }
289
290 if (!USER_VERSION_ATLEAST(500, 50)) {
291 FROM_DEFAULT_V4_UCHAR(common.anim.preview_range);
292 }
293
294 if (!USER_VERSION_ATLEAST(500, 52)) {
295 FROM_DEFAULT_V4_UCHAR(tui.waxis);
296 }
297
298 if (!USER_VERSION_ATLEAST(405, 55)) {
299 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_closure);
300 FROM_DEFAULT_V4_UCHAR(space_node.node_zone_repeat);
301 }
302
303 if (!USER_VERSION_ATLEAST(500, 56)) {
304 FROM_DEFAULT_V4_UCHAR(common.anim.playhead);
305 FROM_DEFAULT_V4_UCHAR(common.anim.channel_group);
306 FROM_DEFAULT_V4_UCHAR(common.anim.channel_group_active);
307 }
308
309 if (!USER_VERSION_ATLEAST(500, 60)) {
310 FROM_DEFAULT_V4_UCHAR(common.curves.handle_free);
311 FROM_DEFAULT_V4_UCHAR(common.curves.handle_auto);
312 FROM_DEFAULT_V4_UCHAR(common.curves.handle_vect);
313 FROM_DEFAULT_V4_UCHAR(common.curves.handle_align);
314 FROM_DEFAULT_V4_UCHAR(common.curves.handle_auto_clamped);
315 FROM_DEFAULT_V4_UCHAR(common.curves.handle_sel_free);
316 FROM_DEFAULT_V4_UCHAR(common.curves.handle_sel_auto);
317 FROM_DEFAULT_V4_UCHAR(common.curves.handle_sel_vect);
318 FROM_DEFAULT_V4_UCHAR(common.curves.handle_sel_align);
319 FROM_DEFAULT_V4_UCHAR(common.curves.handle_sel_auto_clamped);
320 FROM_DEFAULT_V4_UCHAR(common.curves.handle_vertex);
321 FROM_DEFAULT_V4_UCHAR(common.curves.handle_vertex_select);
322 btheme->common.curves.handle_vertex_size = U_theme_default.common.curves.handle_vertex_size;
323 }
324
325 if (!USER_VERSION_ATLEAST(500, 69)) {
326 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe);
327 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_extreme);
328 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_breakdown);
329 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_jitter);
330 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_moving_hold);
331 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_generated);
332 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_selected);
333 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_extreme_selected);
334 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_breakdown_selected);
335 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_jitter_selected);
336 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_moving_hold_selected);
337 FROM_DEFAULT_V4_UCHAR(common.anim.keyframe_generated_selected);
338 FROM_DEFAULT_V4_UCHAR(common.anim.long_key);
339 FROM_DEFAULT_V4_UCHAR(common.anim.long_key_selected);
340 }
341
342 if (!USER_VERSION_ATLEAST(500, 74)) {
343 FROM_DEFAULT_V4_UCHAR(tui.panel_active);
344 }
345
346 if (!USER_VERSION_ATLEAST(500, 78)) {
347 FROM_DEFAULT_V4_UCHAR(regions.channels.back);
348 FROM_DEFAULT_V4_UCHAR(regions.channels.text);
349 FROM_DEFAULT_V4_UCHAR(regions.channels.text_selected);
350 FROM_DEFAULT_V4_UCHAR(regions.asset_shelf.back);
351 FROM_DEFAULT_V4_UCHAR(regions.asset_shelf.header_back);
352 FROM_DEFAULT_V4_UCHAR(regions.sidebars.back);
353 FROM_DEFAULT_V4_UCHAR(regions.sidebars.tab_back);
354 }
355
356 if (!USER_VERSION_ATLEAST(500, 79)) {
357 FROM_DEFAULT_V4_UCHAR(common.anim.channels);
358 FROM_DEFAULT_V4_UCHAR(common.anim.channels_sub);
359 FROM_DEFAULT_V4_UCHAR(common.anim.channel);
360 FROM_DEFAULT_V4_UCHAR(common.anim.channel_selected);
361 }
362
363 if (!USER_VERSION_ATLEAST(500, 80)) {
364 FROM_DEFAULT_V4_UCHAR(regions.scrubbing.back);
365 FROM_DEFAULT_V4_UCHAR(regions.scrubbing.text);
366 FROM_DEFAULT_V4_UCHAR(regions.scrubbing.time_marker);
367 FROM_DEFAULT_V4_UCHAR(regions.scrubbing.time_marker_selected);
368 }
369
370 if (!USER_VERSION_ATLEAST(500, 91)) {
371 FROM_DEFAULT_V4_UCHAR(space_view3d.bevel);
372 FROM_DEFAULT_V4_UCHAR(space_view3d.seam);
373 FROM_DEFAULT_V4_UCHAR(space_view3d.sharp);
374 FROM_DEFAULT_V4_UCHAR(space_view3d.crease);
375 FROM_DEFAULT_V4_UCHAR(space_view3d.freestyle);
376 }
377
378 if (!USER_VERSION_ATLEAST(500, 93)) {
379 FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.text);
380 FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.text_sel);
381 FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.item);
382 FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.inner);
383 FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.inner_sel);
384 FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.outline);
385 FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.outline_sel);
386 btheme->tui.wcol_curve.roundness = U_theme_default.tui.wcol_curve.roundness;
387 }
388
389 if (!USER_VERSION_ATLEAST(500, 104)) {
390 FROM_DEFAULT_V4_UCHAR(common.anim.scene_strip_range);
391 }
392
393 /* Reset the theme due to compatibility breaking changes in 5.0. */
394 if (!USER_VERSION_ATLEAST(500, 111)) {
396 /* Update text styles to match. */
397 LISTBASE_FOREACH (uiStyle *, style, &userdef->uistyles) {
398 style->paneltitle.points = 11.0f;
399 style->paneltitle.shadow = 3;
400 style->paneltitle.shadowalpha = 0.5f;
401 style->paneltitle.shadowcolor = 0.0f;
402 style->widget.points = 11.0f;
403 style->widget.shadow = 1;
404 style->widget.shadowalpha = 0.5f;
405 style->widget.shadowcolor = 0.0f;
406 style->tooltip.shadow = 1;
407 style->tooltip.points = 11.0f;
408 style->tooltip.shadowalpha = 0.5f;
409 style->tooltip.shadowcolor = 0.0f;
410 }
411
412 FROM_DEFAULT_V4_UCHAR(space_node.node_outline);
413 }
414
421
422#undef FROM_DEFAULT_V4_UCHAR
423
424#undef USER_VERSION_ATLEAST
425}
426
428#define USER_LMOUSESELECT (1 << 14) /* deprecated */
429
430static void do_version_select_mouse(const UserDef *userdef, wmKeyMapItem *kmi)
431{
432 /* Remove select/action mouse from user defined keymaps. */
433 enum {
434 ACTIONMOUSE = 0x0005,
435 SELECTMOUSE = 0x0006,
436 EVT_TWEAK_A = 0x5005,
437 EVT_TWEAK_S = 0x5006,
438 };
439 const bool left = (userdef->flag & USER_LMOUSESELECT) != 0;
440
441 switch (kmi->type) {
442 case SELECTMOUSE:
443 kmi->type = (left) ? LEFTMOUSE : RIGHTMOUSE;
444 break;
445 case ACTIONMOUSE:
446 kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
447 break;
448 case EVT_TWEAK_S:
449 kmi->type = (left) ? LEFTMOUSE : RIGHTMOUSE;
450 kmi->val = KM_PRESS_DRAG;
451 break;
452 case EVT_TWEAK_A:
453 kmi->type = (left) ? RIGHTMOUSE : LEFTMOUSE;
454 kmi->val = KM_PRESS_DRAG;
455 break;
456 default:
457 break;
458 }
459}
460
462{
463 if (STREQ(kmi->idname, "GRAPH_OT_keyframe_jump")) {
464 STRNCPY(kmi->idname, "SCREEN_OT_keyframe_jump");
465 }
466}
467
468static bool keymap_item_has_invalid_wm_context_data_path(wmKeyMapItem *kmi, void * /*user_data*/)
469{
470 if (STRPREFIX(kmi->idname, "WM_OT_context_") && kmi->properties) {
471 IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, "data_path");
472 if (idprop && (idprop->type == IDP_STRING) &&
473 STRPREFIX(static_cast<const char *>(idprop->data.pointer), "(null)"))
474 {
475 return true;
476 }
477 }
478 return false;
479}
480
482static bool keymap_item_update_tweak_event(wmKeyMapItem *kmi, void * /*user_data*/)
483{
484 /* Tweak events for L M R mouse-buttons. */
485 enum {
486 EVT_TWEAK_L = 0x5002,
487 EVT_TWEAK_M = 0x5003,
488 EVT_TWEAK_R = 0x5004,
489 };
490 switch (kmi->type) {
491 case EVT_TWEAK_L:
492 kmi->type = LEFTMOUSE;
493 break;
494 case EVT_TWEAK_M:
495 kmi->type = MIDDLEMOUSE;
496 break;
497 case EVT_TWEAK_R:
498 kmi->type = RIGHTMOUSE;
499 break;
500 default:
501 kmi->direction = KM_ANY;
502 return false;
503 }
504
505 if (kmi->val >= KM_DIRECTION_N && kmi->val <= KM_DIRECTION_NW) {
506 kmi->direction = kmi->val;
507 }
508 else {
509 kmi->direction = KM_ANY;
510 }
511 kmi->val = KM_PRESS_DRAG;
512 return false;
513}
514
516 const blender::StringRef asset_prefix,
517 const blender::StringRef tool_property,
520 const blender::Map<int, blender::StringRef> &id_asset_map,
521 wmKeyMapItem *kmi)
522{
523 std::optional<blender::StringRef> asset_id = {};
524 std::optional<blender::StringRefNull> tool_id = {};
525 if (STREQ(kmi->idname, "WM_OT_tool_set_by_id")) {
526 IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, "name");
527 if (idprop && (idprop->type == IDP_STRING)) {
528 const blender::StringRef prop_val = IDP_string_get(idprop);
529 if (!prop_val.startswith("builtin_brush.")) {
530 return;
531 }
532 if (tool_asset_map.contains(prop_val)) {
533 asset_id = tool_asset_map.lookup(prop_val);
534 }
535 else if (tool_tool_map.contains(prop_val)) {
536 tool_id = tool_tool_map.lookup(prop_val);
537 }
538 }
539 }
540 else if (STREQ(kmi->idname, "PAINT_OT_brush_select")) {
541 IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, tool_property);
542 if (idprop && (idprop->type == IDP_INT)) {
543 const int prop_val = IDP_int_get(idprop);
544 if (id_asset_map.contains(prop_val)) {
545 asset_id = id_asset_map.lookup(prop_val);
546 }
547 }
548 }
549
550 if (asset_id) {
551 const std::string full_path = fmt::format("{}{}", asset_prefix, *asset_id);
552
554 STRNCPY(kmi->idname, "BRUSH_OT_asset_activate");
556 kmi->properties,
557 blender::bke::idprop::create("asset_library_type", ASSET_LIBRARY_ESSENTIALS).release());
559 blender::bke::idprop::create("relative_asset_identifier", full_path).release());
560 }
561 else if (tool_id) {
563 IDP_AddToGroup(kmi->properties, blender::bke::idprop::create("name", *tool_id).release());
564 }
565}
566
568 const blender::StringRef asset_prefix,
569 const blender::StringRef tool_property,
570 const blender::Map<int, blender::StringRef> &id_asset_map,
571 wmKeyMapItem *kmi)
572{
573 std::optional<blender::StringRef> asset_id = {};
574 /* Only the paint.brush_select operator is stored in the default keymap & applicable to be
575 * updated if the user removed it in a previous version. */
576 if (STREQ(kmi->idname, "PAINT_OT_brush_select")) {
577 IDProperty *idprop = IDP_GetPropertyFromGroup(kmi->properties, tool_property);
578 if (idprop && (idprop->type == IDP_INT)) {
579 const int prop_val = IDP_int_get(idprop);
580 if (id_asset_map.contains(prop_val)) {
581 asset_id = id_asset_map.lookup(prop_val);
582 }
583 }
584 }
585
586 if (asset_id) {
587 const std::string full_path = fmt::format("{}{}", asset_prefix, *asset_id);
588
590 STRNCPY(kmi->idname, "BRUSH_OT_asset_activate");
592 kmi->properties,
593 blender::bke::idprop::create("asset_library_type", ASSET_LIBRARY_ESSENTIALS).release());
595 blender::bke::idprop::create("relative_asset_identifier", full_path).release());
596 }
597}
598
600 wmKeyMap *keymap,
601 const blender::StringRef asset_prefix,
602 const blender::StringRef tool_property,
605 const blender::Map<int, blender::StringRef> &id_asset_map)
606{
607 LISTBASE_FOREACH (wmKeyMapDiffItem *, kmid, &keymap->diff_items) {
608 if (kmid->add_item) {
610 tool_property,
611 tool_tool_map,
612 tool_asset_map,
613 id_asset_map,
614 kmid->add_item);
615 }
616 if (kmid->remove_item) {
618 asset_prefix, tool_property, id_asset_map, kmid->remove_item);
619 }
620 }
621}
622
624{
625 constexpr blender::StringRef asset_prefix =
626 "brushes/essentials_brushes-mesh_sculpt.blend/Brush/";
627 constexpr blender::StringRef tool_property = "sculpt_tool";
628
629 const auto tool_asset_map = []() {
631 map.add_new("builtin_brush.Draw Sharp", "Draw Sharp");
632 map.add_new("builtin_brush.Clay", "Clay");
633 map.add_new("builtin_brush.Clay Strips", "Clay Strips");
634 map.add_new("builtin_brush.Clay Thumb", "Clay Thumb");
635 map.add_new("builtin_brush.Layer", "Layer");
636 map.add_new("builtin_brush.Inflate", "Inflate/Deflate");
637 map.add_new("builtin_brush.Blob", "Blob");
638 map.add_new("builtin_brush.Crease", "Crease Polish");
639 map.add_new("builtin_brush.Smooth", "Smooth");
640 map.add_new("builtin_brush.Flatten", "Flatten/Contrast");
641 map.add_new("builtin_brush.Fill", "Fill/Deepen");
642 map.add_new("builtin_brush.Scrape", "Scrape/Fill");
643 map.add_new("builtin_brush.Multi-plane Scrape", "Scrape Multiplane");
644 map.add_new("builtin_brush.Pinch", "Pinch/Magnify");
645 map.add_new("builtin_brush.Grab", "Grab");
646 map.add_new("builtin_brush.Elastic Deform", "Elastic Grab");
647 map.add_new("builtin_brush.Snake Hook", "Snake Hook");
648 map.add_new("builtin_brush.Thumb", "Thumb");
649 map.add_new("builtin_brush.Pose", "Pose");
650 map.add_new("builtin_brush.Nudge", "Nudge");
651 map.add_new("builtin_brush.Rotate", "Twist");
652 map.add_new("builtin_brush.Slide Relax", "Relax Slide");
653 map.add_new("builtin_brush.Boundary", "Boundary");
654 map.add_new("builtin_brush.Cloth", "Drag Cloth");
655 map.add_new("builtin_brush.Simplify", "Density");
656 map.add_new("builtin_brush.Multires Displacement Eraser", "Erase Multires Displacement");
657 map.add_new("builtin_brush.Multires Displacement Smear", "Smear Multires Displacement");
658 map.add_new("builtin_brush.Smear", "Smear");
659
660 return map;
661 }();
662
663 const auto tool_tool_map = []() {
665 map.add_new("builtin_brush.Draw", "builtin.brush");
666 map.add_new("builtin_brush.Paint", "builtin_brush.paint");
667 map.add_new("builtin_brush.Mask", "builtin_brush.mask");
668 map.add_new("builtin_brush.Draw Face Sets", "builtin_brush.draw_face_sets");
669 return map;
670 }();
671
672 const auto id_asset_map = []() {
674 map.add_new(SCULPT_BRUSH_TYPE_DRAW, "Draw");
675 map.add_new(SCULPT_BRUSH_TYPE_DRAW_SHARP, "Draw Sharp");
676 map.add_new(SCULPT_BRUSH_TYPE_CLAY, "Clay");
677 map.add_new(SCULPT_BRUSH_TYPE_CLAY_STRIPS, "Clay Strips");
678 map.add_new(SCULPT_BRUSH_TYPE_CLAY_THUMB, "Clay Thumb");
679 map.add_new(SCULPT_BRUSH_TYPE_LAYER, "Layer");
680 map.add_new(SCULPT_BRUSH_TYPE_INFLATE, "Inflate/Deflate");
681 map.add_new(SCULPT_BRUSH_TYPE_BLOB, "Blob");
682 map.add_new(SCULPT_BRUSH_TYPE_CREASE, "Crease Polish");
683 map.add_new(SCULPT_BRUSH_TYPE_SMOOTH, "Smooth");
684 map.add_new(SCULPT_BRUSH_TYPE_FLATTEN, "Flatten/Contrast");
685 map.add_new(SCULPT_BRUSH_TYPE_FILL, "Fill/Deepen");
686 map.add_new(SCULPT_BRUSH_TYPE_SCRAPE, "Scrape/Fill");
687 map.add_new(SCULPT_BRUSH_TYPE_MULTIPLANE_SCRAPE, "Scrape Multiplane");
688 map.add_new(SCULPT_BRUSH_TYPE_PINCH, "Pinch/Magnify");
689 map.add_new(SCULPT_BRUSH_TYPE_GRAB, "Grab");
690 map.add_new(SCULPT_BRUSH_TYPE_ELASTIC_DEFORM, "Elastic Grab");
691 map.add_new(SCULPT_BRUSH_TYPE_SNAKE_HOOK, "Snake Hook");
692 map.add_new(SCULPT_BRUSH_TYPE_THUMB, "Thumb");
693 map.add_new(SCULPT_BRUSH_TYPE_POSE, "Pose");
694 map.add_new(SCULPT_BRUSH_TYPE_NUDGE, "Nudge");
695 map.add_new(SCULPT_BRUSH_TYPE_ROTATE, "Twist");
696 map.add_new(SCULPT_BRUSH_TYPE_SLIDE_RELAX, "Relax Slide");
697 map.add_new(SCULPT_BRUSH_TYPE_BOUNDARY, "Boundary");
698 map.add_new(SCULPT_BRUSH_TYPE_CLOTH, "Drag Cloth");
699 map.add_new(SCULPT_BRUSH_TYPE_SIMPLIFY, "Density");
700 map.add_new(SCULPT_BRUSH_TYPE_MASK, "Mask");
701 map.add_new(SCULPT_BRUSH_TYPE_DRAW_FACE_SETS, "Face Set Paint");
702 map.add_new(SCULPT_BRUSH_TYPE_DISPLACEMENT_ERASER, "Erase Multires Displacement");
703 map.add_new(SCULPT_BRUSH_TYPE_DISPLACEMENT_SMEAR, "Smear Multires Displacement");
704 map.add_new(SCULPT_BRUSH_TYPE_PAINT, "Paint Hard");
705 map.add_new(SCULPT_BRUSH_TYPE_SMEAR, "Smear");
706 return map;
707 }();
708
710 keymap, asset_prefix, tool_property, tool_tool_map, tool_asset_map, id_asset_map);
711}
712
714{
715 constexpr blender::StringRef asset_prefix =
716 "brushes/essentials_brushes-mesh_vertex.blend/Brush/";
717 constexpr blender::StringRef tool_property = "vertex_tool";
718
719 const auto tool_tool_map = []() {
721 map.add_new("builtin_brush.Draw", "builtin.brush");
722 map.add_new("builtin_brush.Blur", "builtin_brush.blur");
723 map.add_new("builtin_brush.Average", "builtin_brush.average");
724 map.add_new("builtin_brush.Smear", "builtin_brush.smear");
725 return map;
726 }();
727
728 const auto id_asset_map = []() {
730 map.add_new(VPAINT_BRUSH_TYPE_DRAW, "Paint Hard");
731 map.add_new(VPAINT_BRUSH_TYPE_BLUR, "Blur");
732 map.add_new(VPAINT_BRUSH_TYPE_AVERAGE, "Average");
733 map.add_new(VPAINT_BRUSH_TYPE_SMEAR, "Smear");
734 return map;
735 }();
736
737 keymap_update_brushes(keymap, asset_prefix, tool_property, tool_tool_map, {}, id_asset_map);
738}
739
741{
742 constexpr blender::StringRef asset_prefix =
743 "brushes/essentials_brushes-mesh_weight.blend/Brush/";
744 constexpr blender::StringRef tool_property = "weight_tool";
745
746 const auto tool_tool_map = []() {
748 map.add_new("builtin_brush.Draw", "builtin.brush");
749 map.add_new("builtin_brush.Blur", "builtin_brush.blur");
750 map.add_new("builtin_brush.Average", "builtin_brush.average");
751 map.add_new("builtin_brush.Smear", "builtin_brush.smear");
752 return map;
753 }();
754
755 const auto asset_id_map = []() {
757 map.add_new(WPAINT_BRUSH_TYPE_DRAW, "Paint");
758 map.add_new(WPAINT_BRUSH_TYPE_BLUR, "Blur");
759 map.add_new(WPAINT_BRUSH_TYPE_AVERAGE, "Average");
760 map.add_new(WPAINT_BRUSH_TYPE_SMEAR, "Smear");
761 return map;
762 }();
763
764 keymap_update_brushes(keymap, asset_prefix, tool_property, tool_tool_map, {}, asset_id_map);
765}
766
768{
769 constexpr blender::StringRef asset_prefix =
770 "brushes/essentials_brushes-mesh_texture.blend/Brush/";
771 constexpr blender::StringRef tool_property = "image_tool";
772
773 const auto tool_tool_map = []() {
775 map.add_new("builtin_brush.Draw", "builtin.brush");
776 map.add_new("builtin_brush.Soften", "builtin_brush.soften");
777 map.add_new("builtin_brush.Smear", "builtin_brush.smear");
778 map.add_new("builtin_brush.Clone", "builtin_brush.clone");
779 map.add_new("builtin_brush.Fill", "builtin_brush.fill");
780 map.add_new("builtin_brush.Mask", "builtin_brush.mask");
781 return map;
782 }();
783
784 const auto id_asset_map = []() {
786 map.add_new(IMAGE_PAINT_BRUSH_TYPE_DRAW, "Paint Hard");
792 return map;
793 }();
794
795 keymap_update_brushes(keymap, asset_prefix, tool_property, tool_tool_map, {}, id_asset_map);
796}
797
799{
800/* #UserDef & #Main happen to have the same struct member. */
801#define USER_VERSION_ATLEAST(ver, subver) MAIN_VERSION_FILE_ATLEAST(userdef, ver, subver)
802
803 /* the UserDef struct is not corrected with do_versions() .... ugh! */
804 if (userdef->menuthreshold1 == 0) {
805 userdef->menuthreshold1 = 5;
806 userdef->menuthreshold2 = 2;
807 }
808 if (userdef->mixbufsize == 0) {
809 userdef->mixbufsize = 2048;
810 }
811 if (userdef->autokey_mode == 0) {
812 /* 'add/replace' but not on */
813 userdef->autokey_mode = 2;
814 }
815 if (userdef->savetime <= 0) {
816 userdef->savetime = 1;
817 // XXX error(STRINGIFY(BLENDER_STARTUP_FILE)" is buggy, please consider removing it.\n");
818 }
819 if (userdef->gizmo_size == 0) {
820 userdef->gizmo_size = 75;
821 userdef->gizmo_flag |= USER_GIZMO_DRAW;
822 }
823 if (userdef->pad_rot_angle == 0.0f) {
824 userdef->pad_rot_angle = 15.0f;
825 }
826
827 /* If the userdef was created on a different platform, it may have an
828 * unsupported GPU backend selected. If so, pick a supported default. */
829#ifdef __APPLE__
830 if (userdef->gpu_backend == GPU_BACKEND_OPENGL || userdef->gpu_backend == GPU_BACKEND_VULKAN) {
832 }
833#else
834 if (userdef->gpu_backend == GPU_BACKEND_METAL) {
836 }
837#endif
838
839 /* graph editor - unselected F-Curve visibility */
840 if (userdef->fcu_inactive_alpha == 0) {
841 userdef->fcu_inactive_alpha = 0.25f;
842 }
843
844 if (!USER_VERSION_ATLEAST(192, 0)) {
845 STRNCPY(userdef->sounddir, "/");
846 }
847
848 /* patch to set Dupli Armature */
849 if (!USER_VERSION_ATLEAST(220, 0)) {
850 userdef->dupflag |= USER_DUP_ARM;
851 }
852
853 /* added seam, normal color, undo */
854 if (!USER_VERSION_ATLEAST(235, 0)) {
855 userdef->uiflag |= USER_GLOBALUNDO;
856 if (userdef->undosteps == 0) {
857 userdef->undosteps = 32;
858 }
859 }
860 if (!USER_VERSION_ATLEAST(236, 0)) {
861 /* illegal combo... */
862 if (userdef->flag & USER_LMOUSESELECT) {
863 userdef->flag &= ~USER_TWOBUTTONMOUSE;
864 }
865 }
866 if (!USER_VERSION_ATLEAST(240, 0)) {
867 userdef->uiflag |= USER_PLAINMENUS;
868 }
869 if (!USER_VERSION_ATLEAST(242, 0)) {
870 /* set defaults for 3D View rotating axis indicator */
871 /* since size can't be set to 0, this indicates it's not saved in startup.blend */
872 if (userdef->rvisize == 0) {
873 userdef->rvisize = 15;
874 userdef->rvibright = 8;
876 }
877 }
878 if (!USER_VERSION_ATLEAST(244, 0)) {
879 /* set default number of recently-used files (if not set) */
880 if (userdef->recent_files == 0) {
881 userdef->recent_files = 10;
882 }
883 }
884 if (!USER_VERSION_ATLEAST(245, 3)) {
885 if (userdef->coba_weight.tot == 0) {
886 BKE_colorband_init(&userdef->coba_weight, true);
887 }
888 }
889 if (!USER_VERSION_ATLEAST(245, 3)) {
891 }
892 if (!USER_VERSION_ATLEAST(250, 0)) {
893 /* adjust grease-pencil distances */
894 userdef->gp_manhattandist = 1;
895 userdef->gp_euclideandist = 2;
896
897 /* adjust default interpolation for new IPO-curves */
898 userdef->ipo_new = BEZT_IPO_BEZ;
899 }
900
901 if (!USER_VERSION_ATLEAST(250, 3)) {
902 /* new audio system */
903 if (userdef->audiochannels == 0) {
904 userdef->audiochannels = 2;
905 }
906 if (userdef->audioformat == 0) {
907 userdef->audioformat = 0x24;
908 }
909 if (userdef->audiorate == 0) {
910 userdef->audiorate = 48000;
911 }
912 }
913
914 if (!USER_VERSION_ATLEAST(250, 8)) {
915 LISTBASE_FOREACH (wmKeyMap *, km, &userdef->user_keymaps) {
916 if (STREQ(km->idname, "Armature_Sketch")) {
917 STRNCPY(km->idname, "Armature Sketch");
918 }
919 else if (STREQ(km->idname, "View3D")) {
920 STRNCPY(km->idname, "3D View");
921 }
922 else if (STREQ(km->idname, "View3D Generic")) {
923 STRNCPY(km->idname, "3D View Generic");
924 }
925 else if (STREQ(km->idname, "EditMesh")) {
926 STRNCPY(km->idname, "Mesh");
927 }
928 else if (STREQ(km->idname, "UVEdit")) {
929 STRNCPY(km->idname, "UV Editor");
930 }
931 else if (STREQ(km->idname, "Animation_Channels")) {
932 STRNCPY(km->idname, "Animation Channels");
933 }
934 else if (STREQ(km->idname, "GraphEdit Keys")) {
935 STRNCPY(km->idname, "Graph Editor");
936 }
937 else if (STREQ(km->idname, "GraphEdit Generic")) {
938 STRNCPY(km->idname, "Graph Editor Generic");
939 }
940 else if (STREQ(km->idname, "Action_Keys")) {
941 STRNCPY(km->idname, "Dopesheet");
942 }
943 else if (STREQ(km->idname, "NLA Data")) {
944 STRNCPY(km->idname, "NLA Editor");
945 }
946 else if (STREQ(km->idname, "Node Generic")) {
947 STRNCPY(km->idname, "Node Editor");
948 }
949 else if (STREQ(km->idname, "Logic Generic")) {
950 STRNCPY(km->idname, "Logic Editor");
951 }
952 else if (STREQ(km->idname, "File")) {
953 STRNCPY(km->idname, "File Browser");
954 }
955 else if (STREQ(km->idname, "FileMain")) {
956 STRNCPY(km->idname, "File Browser Main");
957 }
958 else if (STREQ(km->idname, "FileButtons")) {
959 STRNCPY(km->idname, "File Browser Buttons");
960 }
961 else if (STREQ(km->idname, "Buttons Generic")) {
962 STRNCPY(km->idname, "Property Editor");
963 }
964 }
965 }
966
967 if (!USER_VERSION_ATLEAST(252, 3)) {
968 if (userdef->flag & USER_LMOUSESELECT) {
969 userdef->flag &= ~USER_TWOBUTTONMOUSE;
970 }
971 }
972 if (!USER_VERSION_ATLEAST(252, 4)) {
973 /* default new handle type is auto handles */
974 userdef->keyhandles_new = HD_AUTO;
975 }
976
977 if (!USER_VERSION_ATLEAST(257, 0)) {
978 /* Clear #AUTOKEY_FLAG_ONLYKEYINGSET flag from user-preferences,
979 * so that it doesn't linger around from old configurations like a ghost. */
981 }
982
983 if (!USER_VERSION_ATLEAST(260, 3)) {
984 /* if new keyframes handle default is stuff "auto", make it "auto-clamped" instead
985 * was changed in 260 as part of GSoC11, but version patch was wrong
986 */
987 if (userdef->keyhandles_new == HD_AUTO) {
988 userdef->keyhandles_new = HD_AUTO_ANIM;
989 }
990 }
991
992 if (!USER_VERSION_ATLEAST(267, 0)) {
993
994 /* GL Texture Garbage Collection */
995 if (userdef->textimeout == 0) {
996 userdef->texcollectrate = 60;
997 userdef->textimeout = 120;
998 }
999 if (userdef->memcachelimit <= 0) {
1000 userdef->memcachelimit = 32;
1001 }
1002 if (userdef->dbl_click_time == 0) {
1003 userdef->dbl_click_time = 350;
1004 }
1005 if (userdef->v2d_min_gridsize == 0) {
1006 userdef->v2d_min_gridsize = 35;
1007 }
1008 if (userdef->widget_unit == 0) {
1009 userdef->widget_unit = 20;
1010 }
1011 if (userdef->anisotropic_filter <= 0) {
1012 userdef->anisotropic_filter = 1;
1013 }
1014
1015 if (userdef->ndof_translation_sensitivity == 0.0f) {
1016 userdef->ndof_translation_sensitivity = 1.0f;
1019 }
1020
1021 if (userdef->ndof_rotation_sensitivity == 0.0f) {
1023
1024 if (!(userdef->flag & USER_TRACKBALL)) {
1025 userdef->ndof_flag |= NDOF_TURNTABLE;
1026 }
1027 }
1028 }
1029
1030 if (!USER_VERSION_ATLEAST(269, 4)) {
1031 userdef->walk_navigation.mouse_speed = 1.0f;
1032 userdef->walk_navigation.walk_speed = 2.5f; /* m/s */
1033 userdef->walk_navigation.walk_speed_factor = 5.0f;
1034 userdef->walk_navigation.view_height = 1.6f; /* m */
1035 userdef->walk_navigation.jump_height = 0.4f; /* m */
1036 userdef->walk_navigation.teleport_time = 0.2f; /* s */
1037 }
1038
1039 if (!USER_VERSION_ATLEAST(271, 5)) {
1040 userdef->pie_menu_radius = 100;
1041 userdef->pie_menu_threshold = 12;
1042 userdef->pie_animation_timeout = 6;
1043 }
1044
1045 if (!USER_VERSION_ATLEAST(275, 2)) {
1046 userdef->ndof_deadzone = 0.0;
1047 }
1048
1049 if (!USER_VERSION_ATLEAST(275, 4)) {
1050 userdef->node_margin = 80;
1051 }
1052
1053 if (!USER_VERSION_ATLEAST(278, 6)) {
1054 /* Clear preference flags for re-use. */
1055 userdef->flag &= ~(USER_FLAG_NUMINPUT_ADVANCED | (1 << 2) | USER_MENU_CLOSE_LEAVE |
1058 userdef->uiflag &= ~USER_HEADER_BOTTOM;
1061
1062 userdef->uiflag |= USER_LOCK_CURSOR_ADJUST;
1063 }
1064
1065 if (!USER_VERSION_ATLEAST(280, 20)) {
1066 userdef->gpu_viewport_quality = 0.6f;
1067
1068 /* Reset theme, old themes will not be compatible with minor version updates from now on. */
1069 LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
1071 }
1072
1073 /* Annotations - new layer color
1074 * Replace anything that used to be set if it looks like was left
1075 * on the old default (i.e. black), which most users used
1076 */
1077 if ((userdef->gpencil_new_layer_col[3] < 0.1f) || (userdef->gpencil_new_layer_col[0] < 0.1f)) {
1078 /* - New color matches the annotation pencil icon
1079 * - Non-full alpha looks better!
1080 */
1081 ARRAY_SET_ITEMS(userdef->gpencil_new_layer_col, 0.38f, 0.61f, 0.78f, 0.9f);
1082 }
1083 }
1084
1085 if (!USER_VERSION_ATLEAST(280, 31)) {
1086 /* Remove select/action mouse from user defined keymaps. */
1087 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
1088 LISTBASE_FOREACH (wmKeyMapDiffItem *, kmdi, &keymap->diff_items) {
1089 if (kmdi->remove_item) {
1090 do_version_select_mouse(userdef, kmdi->remove_item);
1091 }
1092 if (kmdi->add_item) {
1093 do_version_select_mouse(userdef, kmdi->add_item);
1094 }
1095 }
1096
1097 LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
1098 do_version_select_mouse(userdef, kmi);
1099 }
1100 }
1101 }
1102
1103 if (!USER_VERSION_ATLEAST(280, 33)) {
1104 /* Enable GLTF addon by default. */
1105 BKE_addon_ensure(&userdef->addons, "io_scene_gltf2");
1106
1107 userdef->pressure_threshold_max = 1.0f;
1108 }
1109
1110 if (!USER_VERSION_ATLEAST(280, 35)) {
1111 /* Preserve RMB select setting after moving to Python and changing default value. */
1112 if (USER_VERSION_ATLEAST(280, 32) || !(userdef->flag & USER_LMOUSESELECT)) {
1113 BKE_keyconfig_pref_set_select_mouse(userdef, 1, false);
1114 }
1115
1116 userdef->flag &= ~USER_LMOUSESELECT;
1117 }
1118
1119 if (!USER_VERSION_ATLEAST(280, 38)) {
1120 copy_v4_fl4(userdef->light_param[0].vec, -0.580952, 0.228571, 0.781185, 0.0);
1121 copy_v4_fl4(userdef->light_param[0].col, 0.900000, 0.900000, 0.900000, 1.000000);
1122 copy_v4_fl4(userdef->light_param[0].spec, 0.318547, 0.318547, 0.318547, 1.000000);
1123 userdef->light_param[0].flag = 1;
1124 userdef->light_param[0].smooth = 0.1;
1125
1126 copy_v4_fl4(userdef->light_param[1].vec, 0.788218, 0.593482, -0.162765, 0.0);
1127 copy_v4_fl4(userdef->light_param[1].col, 0.267115, 0.269928, 0.358840, 1.000000);
1128 copy_v4_fl4(userdef->light_param[1].spec, 0.090838, 0.090838, 0.090838, 1.000000);
1129 userdef->light_param[1].flag = 1;
1130 userdef->light_param[1].smooth = 0.25;
1131
1132 copy_v4_fl4(userdef->light_param[2].vec, 0.696472, -0.696472, -0.172785, 0.0);
1133 copy_v4_fl4(userdef->light_param[2].col, 0.293216, 0.304662, 0.401968, 1.000000);
1134 copy_v4_fl4(userdef->light_param[2].spec, 0.069399, 0.020331, 0.020331, 1.000000);
1135 userdef->light_param[2].flag = 1;
1136 userdef->light_param[2].smooth = 0.4;
1137
1138 copy_v4_fl4(userdef->light_param[3].vec, 0.021053, -0.989474, 0.143173, 0.0);
1139 copy_v4_fl4(userdef->light_param[3].col, 0.0, 0.0, 0.0, 1.0);
1140 copy_v4_fl4(userdef->light_param[3].spec, 0.072234, 0.082253, 0.162642, 1.000000);
1141 userdef->light_param[3].flag = 1;
1142 userdef->light_param[3].smooth = 0.7;
1143
1144 copy_v3_fl3(userdef->light_ambient, 0.025000, 0.025000, 0.025000);
1145
1146 userdef->flag &= ~USER_FLAG_UNUSED_4;
1147
1149 }
1150
1151 if (!USER_VERSION_ATLEAST(280, 41)) {
1152 if (userdef->pie_tap_timeout == 0) {
1153 userdef->pie_tap_timeout = 20;
1154 }
1155 }
1156
1157 if (!USER_VERSION_ATLEAST(280, 44)) {
1160 userdef->gp_settings &= ~GP_PAINT_UNUSED_0;
1161 }
1162
1163 if (!USER_VERSION_ATLEAST(280, 50)) {
1164 /* 3ds is no longer enabled by default and not ported yet. */
1165 BKE_addon_remove_safe(&userdef->addons, "io_scene_3ds");
1166 }
1167
1168 if (!USER_VERSION_ATLEAST(280, 51)) {
1169 userdef->move_threshold = 2;
1170 }
1171
1172 if (!USER_VERSION_ATLEAST(280, 58)) {
1173 if (userdef->image_draw_method != IMAGE_DRAW_METHOD_GLSL) {
1175 }
1176 }
1177
1178 /* Patch to set dupli light-probes and grease-pencil. */
1179 if (!USER_VERSION_ATLEAST(280, 58)) {
1180 userdef->dupflag |= USER_DUP_LIGHTPROBE;
1181 userdef->dupflag |= USER_DUP_GPENCIL;
1182 }
1183
1184 if (!USER_VERSION_ATLEAST(280, 60)) {
1185 const float GPU_VIEWPORT_QUALITY_FXAA = 0.10f;
1186 const float GPU_VIEWPORT_QUALITY_TAA8 = 0.25f;
1187 const float GPU_VIEWPORT_QUALITY_TAA16 = 0.6f;
1188 const float GPU_VIEWPORT_QUALITY_TAA32 = 0.8f;
1189
1190 if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_FXAA) {
1192 }
1193 else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA8) {
1195 }
1196 else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA16) {
1198 }
1199 else if (userdef->gpu_viewport_quality <= GPU_VIEWPORT_QUALITY_TAA32) {
1201 }
1202 else {
1204 }
1205 }
1206
1207 if (!USER_VERSION_ATLEAST(280, 62)) {
1208 if (userdef->vbotimeout == 0) {
1209 userdef->vbocollectrate = 60;
1210 userdef->vbotimeout = 120;
1211 }
1212
1213 if (userdef->lookdev_sphere_size == 0) {
1214 userdef->lookdev_sphere_size = 150;
1215 }
1216
1217 userdef->pref_flag |= USER_PREF_FLAG_SAVE;
1218 }
1219
1220 if (!USER_VERSION_ATLEAST(280, 73)) {
1221 userdef->drag_threshold = 30;
1222 userdef->drag_threshold_mouse = 3;
1223 userdef->drag_threshold_tablet = 10;
1224 }
1225
1226 if (!USER_VERSION_ATLEAST(281, 9)) {
1227 /* X3D is no longer enabled by default. */
1228 BKE_addon_remove_safe(&userdef->addons, "io_scene_x3d");
1229 }
1230
1231 if (!USER_VERSION_ATLEAST(281, 12)) {
1234 }
1235
1236 if (!USER_VERSION_ATLEAST(281, 13)) {
1238
1240 memcpy(
1241 &userdef->file_space_data, &U_default.file_space_data, sizeof(userdef->file_space_data));
1242 }
1243 }
1244
1245 if (!USER_VERSION_ATLEAST(281, 16)) {
1247 params.check_item = true;
1248 params.check_diff_item_add = true;
1251 }
1252
1253 if (!USER_VERSION_ATLEAST(282, 1)) {
1254 userdef->file_space_data.filter_id = U_default.file_space_data.filter_id;
1255 }
1256
1257 if (!USER_VERSION_ATLEAST(282, 4)) {
1258 if (userdef->view_rotate_sensitivity_turntable == 0.0f) {
1260 userdef->view_rotate_sensitivity_trackball = 1.0f;
1261 }
1262 if (userdef->scrollback == 0) {
1263 userdef->scrollback = U_default.scrollback;
1264 }
1265
1266 /* Enable Overlay Engine Smooth Wire by default */
1268 }
1269
1270 if (!USER_VERSION_ATLEAST(283, 13)) {
1271 /* If Translations is off then language should default to English. */
1272 if ((userdef->transopts & USER_DOTRANSLATE_DEPRECATED) == 0) {
1273 userdef->language = ULANGUAGE_ENGLISH;
1274 }
1275 /* Clear this deprecated flag. */
1277 }
1278
1279 if (!USER_VERSION_ATLEAST(290, 7)) {
1281 }
1282
1283 if (!USER_VERSION_ATLEAST(291, 1)) {
1284 if (userdef->collection_instance_empty_size == 0) {
1285 userdef->collection_instance_empty_size = 1.0f;
1286 }
1287 }
1288
1289 if (!USER_VERSION_ATLEAST(292, 3)) {
1290 if (userdef->pixelsize == 0.0f) {
1291 userdef->pixelsize = 1.0f;
1292 }
1293 /* Clear old userdef flag for "Camera Parent Lock". */
1294 userdef->uiflag &= ~USER_AREA_CORNER_HANDLE;
1295 }
1296
1297 if (!USER_VERSION_ATLEAST(292, 9)) {
1298 if (BLI_listbase_is_empty(&userdef->asset_libraries)) {
1300 }
1301 }
1302
1303 if (!USER_VERSION_ATLEAST(293, 1)) {
1304 /* This rename was made after 2.93.0, harmless to run when it's not needed. */
1305 const char *replace_table[][2] = {
1306 {"blender", "Blender"},
1307 {"blender_27x", "Blender_27x"},
1308 {"industry_compatible", "Industry_Compatible"},
1309 };
1310 const int replace_table_len = ARRAY_SIZE(replace_table);
1311
1313 userdef->keyconfigstr, sizeof(userdef->keyconfigstr), replace_table, replace_table_len);
1316 kpt->idname, sizeof(kpt->idname), replace_table, replace_table_len);
1317 }
1318 }
1319
1320 if (!USER_VERSION_ATLEAST(293, 12)) {
1321 if (userdef->gizmo_size_navigate_v3d == 0) {
1322 userdef->gizmo_size_navigate_v3d = 80;
1323 }
1324
1326 }
1327
1328 if (!USER_VERSION_ATLEAST(293, 13)) {
1329 BKE_addon_ensure(&userdef->addons, "pose_library");
1330 }
1331
1332 if (!USER_VERSION_ATLEAST(300, 21)) {
1333 /* Deprecated userdef->flag USER_SAVE_PREVIEWS */
1336 /* Clear for reuse. */
1337 userdef->flag &= ~USER_FLAG_UNUSED_5;
1338 }
1339
1340 if (!USER_VERSION_ATLEAST(300, 38)) {
1341 /* Patch to set Dupli Lattice/Camera/Speaker. */
1342 userdef->dupflag |= USER_DUP_LATTICE;
1343 userdef->dupflag |= USER_DUP_CAMERA;
1344 userdef->dupflag |= USER_DUP_SPEAKER;
1345 }
1346
1347 if (!USER_VERSION_ATLEAST(300, 40)) {
1348 /* Rename the default asset library from "Default" to "User Library". This isn't bullet proof
1349 * since it doesn't handle translations and ignores user changes. But this was an alpha build
1350 * (experimental) feature and the name is just for display in the UI anyway. So it doesn't have
1351 * to work perfectly at all. */
1352 LISTBASE_FOREACH (bUserAssetLibrary *, asset_library, &userdef->asset_libraries) {
1353 /* Ignores translations, since that would depend on the current preferences (global `U`). */
1354 if (STREQ(asset_library->name, "Default")) {
1356 userdef, asset_library, BKE_PREFS_ASSET_LIBRARY_DEFAULT_NAME);
1357 }
1358 }
1359 }
1360
1361 if (!USER_VERSION_ATLEAST(300, 40)) {
1362 LISTBASE_FOREACH (uiStyle *, style, &userdef->uistyles) {
1363 const int default_title_points = 11; /* UI_DEFAULT_TITLE_POINTS */
1364 style->paneltitle.points = default_title_points;
1365 style->grouplabel.points = default_title_points;
1366 }
1367 }
1368
1369 if (!USER_VERSION_ATLEAST(300, 43)) {
1370 userdef->ndof_flag |= NDOF_CAMERA_PAN_ZOOM;
1371 }
1372
1373 if (!USER_VERSION_ATLEAST(302, 5)) {
1376 }
1377
1378 if (!USER_VERSION_ATLEAST(302, 11)) {
1380 }
1381
1382 /* Set GPU backend to OpenGL. */
1383 if (!USER_VERSION_ATLEAST(305, 5)) {
1384#ifdef __APPLE__
1385 userdef->gpu_backend = GPU_BACKEND_METAL;
1386#else
1388#endif
1389 }
1390
1391 if (!USER_VERSION_ATLEAST(305, 10)) {
1392 LISTBASE_FOREACH (bUserAssetLibrary *, asset_library, &userdef->asset_libraries) {
1393 asset_library->import_method = ASSET_IMPORT_APPEND_REUSE;
1394 }
1395 }
1396
1397 if (!USER_VERSION_ATLEAST(306, 2)) {
1399 }
1400
1401 if (!USER_VERSION_ATLEAST(306, 4)) {
1402 /* Increase the number of recently-used files if using the old default value. */
1403 if (userdef->recent_files == 10) {
1404 userdef->recent_files = 20;
1405 }
1406 }
1407
1408 if (!USER_VERSION_ATLEAST(306, 5)) {
1409 if (userdef->pythondir_legacy[0]) {
1411 "Versioning user script path");
1412
1413 STRNCPY(script_dir->dir_path, userdef->pythondir_legacy);
1414 STRNCPY_UTF8(script_dir->name, DATA_("Untitled"));
1415 BLI_addhead(&userdef->script_directories, script_dir);
1416 }
1417 }
1418
1419 if (!USER_VERSION_ATLEAST(306, 6)) {
1420 LISTBASE_FOREACH (bUserAssetLibrary *, asset_library, &userdef->asset_libraries) {
1421 asset_library->flag |= ASSET_LIBRARY_RELATIVE_PATH;
1422 }
1423 }
1424
1425 if (!USER_VERSION_ATLEAST(400, 4)) {
1426 /* obj and ply python addons were removed. */
1427 BKE_addon_remove_safe(&userdef->addons, "io_mesh_ply");
1428 BKE_addon_remove_safe(&userdef->addons, "io_scene_obj");
1429 }
1430
1431 if (!USER_VERSION_ATLEAST(400, 15)) {
1432 userdef->node_preview_res = 120;
1433 }
1434
1435 if (!USER_VERSION_ATLEAST(400, 18)) {
1436 userdef->playback_fps_samples = 8;
1437 }
1438
1439 if (!USER_VERSION_ATLEAST(400, 19)) {
1440 userdef->uiflag |= USER_NODE_AUTO_OFFSET;
1441 }
1442
1443 if (!USER_VERSION_ATLEAST(400, 24)) {
1444 /* Clear deprecated USER_MENUFIXEDORDER user flag for reuse. */
1445 userdef->uiflag &= ~(1 << 23);
1446 }
1447
1448 if (!USER_VERSION_ATLEAST(400, 26)) {
1450 }
1451
1452 if (!USER_VERSION_ATLEAST(400, 32)) {
1454 }
1455
1456 if (!USER_VERSION_ATLEAST(401, 3)) {
1457 LISTBASE_FOREACH (uiStyle *, style, &userdef->uistyles) {
1458 style->paneltitle.character_weight = 400;
1459 style->grouplabel.character_weight = 400;
1460 style->widget.character_weight = 400;
1461 }
1462 }
1463
1464 if (!USER_VERSION_ATLEAST(401, 9)) {
1468 }
1469
1470 if (!USER_VERSION_ATLEAST(401, 13)) {
1471 if (userdef->keying_flag & AUTOKEY_FLAG_INSERTNEEDED) {
1473 }
1475 }
1476
1477 if (!USER_VERSION_ATLEAST(401, 21)) {
1478 LISTBASE_FOREACH (wmKeyMap *, km, &userdef->user_keymaps) {
1479 if (STREQ(km->idname, "NLA Channels")) {
1480 STRNCPY(km->idname, "NLA Tracks");
1481 }
1482 }
1483 }
1484
1485 if (!USER_VERSION_ATLEAST(402, 36)) {
1486 /* Reset repositories. */
1487 while (!BLI_listbase_is_empty(&userdef->extension_repos)) {
1489 userdef, static_cast<bUserExtensionRepo *>(userdef->extension_repos.first));
1490 }
1491
1494 }
1495
1496 if (!USER_VERSION_ATLEAST(402, 42)) {
1497 /* 80 was the old default. */
1498 if (userdef->node_margin == 80) {
1499 userdef->node_margin = 40;
1500 }
1501 }
1502
1503 if (!USER_VERSION_ATLEAST(402, 56)) {
1505 }
1506
1507 if (!USER_VERSION_ATLEAST(402, 58)) {
1508 /* Remove add-ons which are no longer bundled by default
1509 * and have no upgrade path to extensions in the UI. */
1510 const char *addon_modules[] = {
1511 "depsgraph_debug",
1512 "io_coat3D",
1513 "io_import_images_as_planes",
1514 "io_mesh_stl",
1515 "io_scene_x3d",
1516 };
1517 for (int i = 0; i < ARRAY_SIZE(addon_modules); i++) {
1518 BKE_addon_remove_safe(&userdef->addons, addon_modules[i]);
1519 }
1520 }
1521
1522 if (!USER_VERSION_ATLEAST(402, 59)) {
1523 userdef->network_timeout = 10;
1524 userdef->network_connection_limit = 5;
1525 }
1526
1527 if (!USER_VERSION_ATLEAST(402, 63)) {
1529 }
1530
1531 if (!USER_VERSION_ATLEAST(402, 65)) {
1532 /* Bone Selection Sets is no longer an add-on, but core functionality. */
1533 BKE_addon_remove_safe(&userdef->addons, "bone_selection_sets");
1534 }
1535
1536 if (!USER_VERSION_ATLEAST(403, 3)) {
1538 userdef, "VIEW3D_AST_brush_sculpt", "Brushes/Mesh Sculpt/Cloth");
1540 userdef, "VIEW3D_AST_brush_sculpt", "Brushes/Mesh Sculpt/General");
1542 userdef, "VIEW3D_AST_brush_sculpt", "Brushes/Mesh Sculpt/Paint");
1543 }
1544
1545 if (!USER_VERSION_ATLEAST(403, 12)) {
1546 LISTBASE_FOREACH (uiStyle *, style, &userdef->uistyles) {
1547 style->tooltip.points = 11.0f; /* UI_DEFAULT_TOOLTIP_POINTS */
1548 style->tooltip.character_weight = 400;
1549 style->tooltip.shadow = 0;
1550 style->tooltip.shady = -1;
1551 style->tooltip.shadowalpha = 0.5f;
1552 style->tooltip.shadowcolor = 0.0f;
1553 }
1554 }
1555 if (!USER_VERSION_ATLEAST(403, 19)) {
1557 }
1558
1559 if (!USER_VERSION_ATLEAST(404, 3)) {
1561
1563 userdef, "VIEW3D_AST_brush_gpencil_paint", "Brushes/Grease Pencil Draw/Draw");
1565 userdef, "VIEW3D_AST_brush_gpencil_paint", "Brushes/Grease Pencil Draw/Erase");
1567 userdef, "VIEW3D_AST_brush_gpencil_paint", "Brushes/Grease Pencil Draw/Utilities");
1568
1570 userdef, "VIEW3D_AST_brush_gpencil_sculpt", "Brushes/Grease Pencil Sculpt/Contrast");
1572 userdef, "VIEW3D_AST_brush_gpencil_sculpt", "Brushes/Grease Pencil Sculpt/Transform");
1574 userdef, "VIEW3D_AST_brush_gpencil_sculpt", "Brushes/Grease Pencil Sculpt/Utilities");
1575 }
1576
1577 if (!USER_VERSION_ATLEAST(404, 9)) {
1578 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
1579 if (STREQ("Sculpt", keymap->idname)) {
1581 }
1582 else if (STREQ("Vertex Paint", keymap->idname)) {
1584 }
1585 else if (STREQ("Weight Paint", keymap->idname)) {
1587 }
1588 else if (STREQ("Image Paint", keymap->idname)) {
1590 }
1591 }
1592 }
1593
1594 if (!USER_VERSION_ATLEAST(404, 28)) {
1596 }
1597
1598 if (userdef->border_width == 0) {
1599 userdef->border_width = 2;
1600 }
1601
1602 if (!USER_VERSION_ATLEAST(405, 10)) {
1603 static const blender::Map<std::string, std::string> keymap_renames = {
1604 {"SequencerCommon", "Video Sequence Editor"},
1605 {"SequencerPreview", "Preview"},
1606
1607 {"Sequencer Tool: Cursor", "Preview Tool: Cursor"},
1608 {"Sequencer Tool: Sample", "Preview Tool: Sample"},
1609 {"Sequencer Tool: Move", "Preview Tool: Move"},
1610 {"Sequencer Tool: Rotate", "Preview Tool: Rotate"},
1611 {"Sequencer Tool: Scale", "Preview Tool: Scale"},
1612
1613 {"Sequencer Timeline Tool: Select Box", "Sequencer Tool: Select Box"},
1614 {"Sequencer Timeline Tool: Select Box (fallback)",
1615 "Sequencer Tool: Select Box (fallback)"},
1616
1617 {"Sequencer Preview Tool: Tweak", "Preview Tool: Tweak"},
1618 {"Sequencer Preview Tool: Tweak (fallback)", "Preview Tool: Tweak (fallback)"},
1619 {"Sequencer Preview Tool: Select Box", "Preview Tool: Select Box"},
1620 {"Sequencer Preview Tool: Select Box (fallback)", "Preview Tool: Select Box (fallback)"},
1621 };
1622
1623 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
1624 std::string old_name(keymap->idname);
1625 if (const std::string *new_name = keymap_renames.lookup_ptr(old_name)) {
1626 STRNCPY(keymap->idname, new_name->c_str());
1627 }
1628 }
1629 }
1630
1631 if (!USER_VERSION_ATLEAST(405, 11)) {
1634 userdef,
1635 &params,
1636 [](wmKeyMapItem *kmi, void * /*user_data*/) -> bool {
1637 if (kmi->shift == KM_ANY && kmi->ctrl == KM_ANY && kmi->alt == KM_ANY &&
1638 kmi->oskey == KM_ANY)
1639 {
1640 kmi->hyper = KM_ANY;
1641 }
1642 return false;
1643 },
1644 nullptr);
1645 }
1646
1647 if (!USER_VERSION_ATLEAST(405, 50)) {
1648 LISTBASE_FOREACH (wmKeyMap *, keymap, &userdef->user_keymaps) {
1649 LISTBASE_FOREACH (wmKeyMapDiffItem *, kmdi, &keymap->diff_items) {
1650 if (kmdi->remove_item) {
1651 do_version_keyframe_jump(kmdi->remove_item);
1652 }
1653 if (kmdi->add_item) {
1654 do_version_keyframe_jump(kmdi->add_item);
1655 }
1656 }
1657
1658 LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
1660 }
1661 }
1662 }
1663
1664 if (!USER_VERSION_ATLEAST(405, 86)) {
1665 if (userdef->gpu_shader_workers > 0) {
1667 }
1668 }
1669
1670 if (!USER_VERSION_ATLEAST(500, 11)) {
1672 }
1673
1674 if (!USER_VERSION_ATLEAST(500, 59)) {
1676 }
1677
1678 if (!USER_VERSION_ATLEAST(500, 76)) {
1679 if (userdef->stored_bounds.file.xmin == userdef->stored_bounds.file.xmax) {
1680 memcpy(&userdef->stored_bounds, &U_default.stored_bounds, sizeof(userdef->stored_bounds));
1681 }
1682 }
1683
1684 if (!USER_VERSION_ATLEAST(500, 90)) {
1686 userdef, "IMAGE_AST_brush_paint", "Brushes/Mesh Texture Paint/Basic");
1688 userdef, "IMAGE_AST_brush_paint", "Brushes/Mesh Texture Paint/Erase");
1690 userdef, "IMAGE_AST_brush_paint", "Brushes/Mesh Texture Paint/Pixel Art");
1692 userdef, "IMAGE_AST_brush_paint", "Brushes/Mesh Texture Paint/Utilities");
1693
1695 userdef, "VIEW3D_AST_brush_texture_paint", "Brushes/Mesh Texture Paint/Basic");
1697 userdef, "VIEW3D_AST_brush_texture_paint", "Brushes/Mesh Texture Paint/Erase");
1699 userdef, "VIEW3D_AST_brush_texture_paint", "Brushes/Mesh Texture Paint/Pixel Art");
1701 userdef, "VIEW3D_AST_brush_texture_paint", "Brushes/Mesh Texture Paint/Utilities");
1702 }
1703
1704 if (!USER_VERSION_ATLEAST(500, 94)) {
1705 /* Force-reset file compression to ON, see #135735. */
1706 userdef->flag |= USER_FILECOMPRESS;
1707 }
1708
1709 if (!USER_VERSION_ATLEAST(500, 96)) {
1710 /* Increase the number of recently-used files if using the old default value. */
1711 if (userdef->recent_files == 20) {
1712 userdef->recent_files = 200;
1713 }
1714 }
1715
1716 if (!USER_VERSION_ATLEAST(500, 99)) {
1717 userdef->xr_navigation.vignette_intensity = 50.0f;
1718 userdef->xr_navigation.turn_amount = DEG2RAD(30);
1719 userdef->xr_navigation.turn_speed = DEG2RAD(60);
1721 }
1722
1723 if (!USER_VERSION_ATLEAST(500, 101)) {
1724 /* The Copy Global Transform add-on was moved into Blender itself, and thus
1725 * is no longer an add-on. */
1726 BKE_addon_remove_safe(&userdef->addons, "copy_global_transform");
1727 }
1728
1729 if (!USER_VERSION_ATLEAST(500, 116)) {
1731 userdef, "NODE_AST_compositor", "Camera & Lens Effects");
1733 userdef, "NODE_AST_compositor", "Creative");
1735 userdef, "NODE_AST_compositor", "Utilities");
1736 }
1737
1744
1745 LISTBASE_FOREACH (bTheme *, btheme, &userdef->themes) {
1746 do_versions_theme(userdef, btheme);
1747 }
1748#undef USER_VERSION_ATLEAST
1749}
1750
1752{
1753 /* User preference experimental settings are only supported in alpha builds.
1754 * This prevents users corrupting data and relying on API that may change.
1755 *
1756 * If user preferences are saved this will be stored in disk as expected.
1757 * This only starts to take effect when there is a release branch (on beta).
1758 *
1759 * At that time master already has its version bumped so its user preferences
1760 * are not touched by these settings. */
1761#ifdef WITH_EXPERIMENTAL_FEATURES
1763 return;
1764 }
1765#endif
1766
1767 MEMSET_STRUCT_AFTER(&userdef->experimental, 0, SANITIZE_AFTER_HERE);
1768}
1769
1770#undef USER_LMOUSESELECT
struct bAddon * BKE_addon_ensure(struct ListBase *addon_list, const char *module)
Definition addon.cc:45
bool BKE_addon_remove_safe(struct ListBase *addon_list, const char *module)
Definition addon.cc:56
bool BKE_blender_version_is_alpha(void)
Definition blender.cc:176
void BKE_colorband_init(ColorBand *coba, bool rangetype)
Definition colorband.cc:23
IDProperty * IDP_GetPropertyFromGroup(const IDProperty *prop, blender::StringRef name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:747
#define IDP_int_get(prop)
#define IDP_string_get(prop)
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
Definition idprop.cc:717
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.cc:112
#define WM_KEY_CONFIG_FILTER_ITEM_ALL
void BKE_preferences_asset_library_default_add(struct UserDef *userdef) ATTR_NONNULL()
void BKE_preferences_extension_repo_remove(UserDef *userdef, bUserExtensionRepo *repo)
bUserExtensionRepo * BKE_preferences_extension_repo_add_default_user(UserDef *userdef)
#define BKE_PREFS_ASSET_LIBRARY_DEFAULT_NAME
void BKE_preferences_asset_library_name_set(struct UserDef *userdef, struct bUserAssetLibrary *library, const char *name) ATTR_NONNULL()
bUserExtensionRepo * BKE_preferences_extension_repo_add_default_system(UserDef *userdef)
bUserExtensionRepo * BKE_preferences_extension_repo_add_default_remote(UserDef *userdef)
bool BKE_preferences_asset_shelf_settings_ensure_catalog_path_enabled(UserDef *userdef, const char *shelf_idname, const char *catalog_path)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:91
#define DEG2RAD(_deg)
#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_fl3(float v[3], float x, float y, float z)
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:693
#define STRNCPY_UTF8(dst, src)
bool BLI_string_replace_table_exact(char *string, size_t string_maxncpy, const char *replace_table[][2], int replace_table_len)
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
#define STRPREFIX(a, b)
#define ARRAY_SIZE(arr)
#define ARRAY_SET_ITEMS(...)
#define MEMSET_STRUCT_AFTER(struct_var, value, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define STREQ(a, b)
external readfile function prototypes.
const UserDef U_default
const bTheme U_theme_default
#define DATA_(msgid)
@ IDP_STRING
@ IDP_INT
@ FCURVE_SMOOTH_CONT_ACCEL
@ ASSET_IMPORT_APPEND_REUSE
@ ASSET_LIBRARY_RELATIVE_PATH
@ ASSET_LIBRARY_ESSENTIALS
@ WPAINT_BRUSH_TYPE_BLUR
@ WPAINT_BRUSH_TYPE_AVERAGE
@ WPAINT_BRUSH_TYPE_DRAW
@ WPAINT_BRUSH_TYPE_SMEAR
@ SCULPT_BRUSH_TYPE_DRAW_SHARP
@ SCULPT_BRUSH_TYPE_THUMB
@ SCULPT_BRUSH_TYPE_GRAB
@ SCULPT_BRUSH_TYPE_BOUNDARY
@ SCULPT_BRUSH_TYPE_DISPLACEMENT_SMEAR
@ SCULPT_BRUSH_TYPE_MASK
@ SCULPT_BRUSH_TYPE_DRAW_FACE_SETS
@ SCULPT_BRUSH_TYPE_DRAW
@ SCULPT_BRUSH_TYPE_NUDGE
@ SCULPT_BRUSH_TYPE_CLAY
@ SCULPT_BRUSH_TYPE_CLOTH
@ SCULPT_BRUSH_TYPE_PINCH
@ SCULPT_BRUSH_TYPE_SMEAR
@ SCULPT_BRUSH_TYPE_POSE
@ SCULPT_BRUSH_TYPE_CLAY_THUMB
@ SCULPT_BRUSH_TYPE_MULTIPLANE_SCRAPE
@ SCULPT_BRUSH_TYPE_SIMPLIFY
@ SCULPT_BRUSH_TYPE_SNAKE_HOOK
@ SCULPT_BRUSH_TYPE_CREASE
@ SCULPT_BRUSH_TYPE_LAYER
@ SCULPT_BRUSH_TYPE_SLIDE_RELAX
@ SCULPT_BRUSH_TYPE_ELASTIC_DEFORM
@ SCULPT_BRUSH_TYPE_SMOOTH
@ SCULPT_BRUSH_TYPE_PAINT
@ SCULPT_BRUSH_TYPE_DISPLACEMENT_ERASER
@ SCULPT_BRUSH_TYPE_INFLATE
@ SCULPT_BRUSH_TYPE_BLOB
@ SCULPT_BRUSH_TYPE_ROTATE
@ SCULPT_BRUSH_TYPE_CLAY_STRIPS
@ IMAGE_PAINT_BRUSH_TYPE_MASK
@ IMAGE_PAINT_BRUSH_TYPE_FILL
@ IMAGE_PAINT_BRUSH_TYPE_DRAW
@ IMAGE_PAINT_BRUSH_TYPE_CLONE
@ IMAGE_PAINT_BRUSH_TYPE_SOFTEN
@ IMAGE_PAINT_BRUSH_TYPE_SMEAR
@ VPAINT_BRUSH_TYPE_AVERAGE
@ VPAINT_BRUSH_TYPE_DRAW
@ VPAINT_BRUSH_TYPE_SMEAR
@ VPAINT_BRUSH_TYPE_BLUR
@ 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_DUP_LIGHTPROBE
@ USER_DUP_CAMERA
@ USER_DUP_SPEAKER
@ USER_DUP_GPENCIL
@ USER_DUP_CURVES
@ USER_DUP_ARM
@ USER_DUP_POINTCLOUD
@ USER_DUP_LATTICE
@ AUTOKEY_FLAG_INSERTNEEDED
@ MANUALKEY_FLAG_INSERTNEEDED
@ AUTOKEY_FLAG_ONLYKEYINGSET
@ USER_TR_UNUSED_4
@ USER_DOTRANSLATE_DEPRECATED
@ USER_TR_UNUSED_3
@ USER_TR_UNUSED_6
@ USER_TR_UNUSED_7
@ USER_AREA_CORNER_HANDLE
@ USER_FILTER_BRUSHES_BY_TOOL
@ USER_LOCK_CURSOR_ADJUST
@ USER_REGISTER_ALL_USERS
@ USER_SHOW_GIZMO_NAVIGATE
@ USER_HEADER_FROM_PREF
@ USER_HEADER_BOTTOM
@ USER_GLOBALUNDO
@ USER_PLAINMENUS
@ USER_NO_MULTITOUCH_GESTURES
@ USER_NODE_AUTO_OFFSET
@ IMAGE_DRAW_METHOD_AUTO
@ IMAGE_DRAW_METHOD_GLSL
@ USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE
@ USER_GPU_FLAG_UNUSED_0
@ ULANGUAGE_ENGLISH
@ USER_SEQ_PROXY_SETUP_AUTOMATIC
@ USER_ADD_VIEWALIGNED
@ USER_INTERNET_ALLOW
@ USER_MENU_CLOSE_LEAVE
@ USER_ADD_EDITMODE
@ USER_TRACKBALL
@ USER_FLAG_UNUSED_5
@ USER_FILECOMPRESS
@ USER_FLAG_UNUSED_4
@ USER_FLAG_UNUSED_6
@ USER_FLAG_UNUSED_7
@ USER_FLAG_NUMINPUT_ADVANCED
@ USER_DEVELOPER_UI
@ USER_TWOBUTTONMOUSE
@ STATUSBAR_SHOW_VERSION
@ STATUSBAR_SHOW_EXTENSIONS_UPDATES
@ USER_ANIM_HIGH_QUALITY_DRAWING
@ USER_ANIM_SHOW_CHANNEL_GROUP_COLORS
@ USER_ALWAYS_SHOW_NUMBER_ARROWS
@ USER_RENDER_DISPLAY_WINDOW
@ USER_FILE_PREVIEW_NONE
@ USER_FILE_PREVIEW_AUTO
@ GP_PAINT_UNUSED_0
@ NDOF_LOCK_HORIZON
@ NDOF_SHOULD_PAN
@ NDOF_SHOULD_ZOOM
@ NDOF_SHOULD_ROTATE
@ NDOF_TURNTABLE
@ NDOF_ORBIT_CENTER_AUTO
@ NDOF_SHOW_GUIDE_ORBIT_CENTER
@ NDOF_CAMERA_PAN_ZOOM
@ USER_ANIM_KEY_CHANNEL_SCALE
@ USER_ANIM_KEY_CHANNEL_ROTATION
@ USER_ANIM_KEY_CHANNEL_LOCATION
@ USER_ANIM_KEY_CHANNEL_CUSTOM_PROPERTIES
@ USER_TEXT_RENDER_SUBPIXELAA
@ USER_SHADER_COMPILE_SUBPROCESS
@ USER_SEQ_ED_CONNECT_STRIPS_BY_DEFAULT
@ USER_PREF_FLAG_SAVE
@ USER_GIZMO_DRAW
@ USER_XR_NAV_SNAP_TURN
@ USER_TEMP_SPACE_DISPLAY_WINDOW
Read Guarded memory(de)allocation.
@ KM_ANY
Definition WM_types.hh:309
@ KM_PRESS_DRAG
Definition WM_types.hh:319
@ KM_DIRECTION_NW
Definition WM_types.hh:341
@ KM_DIRECTION_N
Definition WM_types.hh:334
const Value * lookup_ptr(const Key &key) const
Definition BLI_map.hh:508
const Value & lookup(const Key &key) const
Definition BLI_map.hh:545
void add_new(const Key &key, const Value &value)
Definition BLI_map.hh:265
bool contains(const Key &key) const
Definition BLI_map.hh:353
constexpr bool startswith(StringRef prefix) const
#define offsetof(t, d)
#define common
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
static int left
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
const char * name
void * pointer
Definition DNA_ID.h:142
IDPropertyData data
Definition DNA_ID.h:169
char type
Definition DNA_ID.h:156
void * first
unsigned char handle_vertex_size
ThemeCommonCurves curves
unsigned char grid_levels
unsigned char face_front[4]
float menu_shadow_fac
uiWidgetColors wcol_pulldown
uiWidgetColors wcol_numslider
uiWidgetColors wcol_list_item
uiWidgetColors wcol_menu
uiWidgetColors wcol_progress
unsigned char panel_text[4]
uiWidgetColors wcol_menu_back
uiWidgetColors wcol_num
short menu_shadow_width
uiWidgetColors wcol_curve
uiWidgetColors wcol_menu_item
uiWidgetColors wcol_toggle
uiWidgetColors wcol_regular
uiWidgetColors wcol_tooltip
uiWidgetColors wcol_option
uiWidgetColors wcol_text
uiWidgetColors wcol_tab
uiWidgetColors wcol_radio
uiWidgetColors wcol_scroll
uiWidgetColors wcol_pie_menu
uiWidgetColors wcol_toolbar_item
uiWidgetColors wcol_tool
unsigned char panel_title[4]
uiWidgetColors wcol_box
struct WalkNavigation walk_navigation
float pressure_threshold_max
short texcollectrate
short dbl_click_time
struct ListBase addons
short menuthreshold2
short key_insert_channels
short anisotropic_filter
float ndof_translation_sensitivity
short vbocollectrate
float pad_rot_angle
ListBase script_directories
struct ListBase uistyles
short playback_fps_samples
uint8_t network_timeout
float view_rotate_sensitivity_trackball
short pie_animation_timeout
float light_ambient[3]
float view_rotate_sensitivity_turntable
UserDef_FileSpaceData file_space_data
UserDef_Experimental experimental
short v2d_min_gridsize
uint8_t network_connection_limit
struct ListBase user_keymaps
char drag_threshold_mouse
float gpencil_new_layer_col[4]
short animation_flag
struct XrNavigation xr_navigation
short lookdev_sphere_size
float fcu_inactive_alpha
struct ListBase themes
char file_preview_type
char gizmo_size_navigate_v3d
short sequencer_proxy_setup
short pie_menu_radius
float ndof_rotation_sensitivity
short gp_euclideandist
short gpu_shader_workers
short image_draw_method
short menuthreshold1
char auto_smoothing_new
short pie_menu_threshold
struct ListBase user_keyconfig_prefs
char drag_threshold_tablet
short shader_compilation_method
struct ListBase extension_repos
short gp_manhattandist
struct SolidLight light_param[4]
char filebrowser_display_type
int sequencer_editor_flag
unsigned int dupflag
char node_preview_res
short pie_tap_timeout
char preferences_display_type
char keyconfigstr[64]
UserDef_TempWinBounds stored_bounds
float collection_instance_empty_size
struct ListBase asset_libraries
char render_display_type
struct ColorBand coba_weight
float ndof_deadzone
char sounddir[768]
ThemeSpace space_view3d
ThemeUI tui
ThemeCommon common
ThemeSpace space_node
char name[64]
float xmax
float xmin
unsigned char outline_sel[4]
i
Definition text_draw.cc:230
static void keymap_update_brushes_handle_add_item(const blender::StringRef asset_prefix, const blender::StringRef tool_property, const blender::Map< blender::StringRef, blender::StringRefNull > &tool_tool_map, const blender::Map< blender::StringRef, blender::StringRef > &tool_asset_map, const blender::Map< int, blender::StringRef > &id_asset_map, wmKeyMapItem *kmi)
static bool keymap_item_update_tweak_event(wmKeyMapItem *kmi, void *)
static void do_version_select_mouse(const UserDef *userdef, wmKeyMapItem *kmi)
static bool keymap_item_has_invalid_wm_context_data_path(wmKeyMapItem *kmi, void *)
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 void keymap_update_brushes_handle_remove_item(const blender::StringRef asset_prefix, const blender::StringRef tool_property, const blender::Map< int, blender::StringRef > &id_asset_map, wmKeyMapItem *kmi)
static void do_version_keyframe_jump(wmKeyMapItem *kmi)
static void keymap_update_mesh_texture_paint_brushes(wmKeyMap *keymap)
static void keymap_update_mesh_weight_paint_brushes(wmKeyMap *keymap)
static void keymap_update_brushes(wmKeyMap *keymap, const blender::StringRef asset_prefix, const blender::StringRef tool_property, const blender::Map< blender::StringRef, blender::StringRefNull > &tool_tool_map, const blender::Map< blender::StringRef, blender::StringRef > &tool_asset_map, const blender::Map< int, blender::StringRef > &id_asset_map)
static void keymap_update_mesh_vertex_paint_brushes(wmKeyMap *keymap)
static void keymap_update_mesh_sculpt_brushes(wmKeyMap *keymap)
static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
@ RIGHTMOUSE
@ LEFTMOUSE
@ MIDDLEMOUSE
void WM_keymap_item_properties_reset(wmKeyMapItem *kmi, IDProperty *properties)
Definition wm_keymap.cc:206