Blender V5.0
versioning_280.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
8
9/* allow readfile to use deprecated functionality */
10#define DNA_DEPRECATED_ALLOW
11
12#include <algorithm>
13#include <cfloat>
14#include <cstring>
15
16#include "BLI_listbase.h"
17#include "BLI_math_rotation.h"
18#include "BLI_mempool.h"
19#include "BLI_string.h"
20#include "BLI_string_utf8.h"
21#include "BLI_utildefines.h"
22
23/* Define macros in `DNA_genfile.h`. */
24#define DNA_GENFILE_VERSIONING_MACROS
25
26#include "DNA_defaults.h"
27
28#include "DNA_anim_types.h"
29#include "DNA_armature_types.h"
30#include "DNA_brush_types.h"
31#include "DNA_camera_types.h"
32#include "DNA_cloth_types.h"
35#include "DNA_curve_types.h"
37#include "DNA_fluid_types.h"
38#include "DNA_freestyle_types.h"
39#include "DNA_genfile.h"
42#include "DNA_gpu_types.h"
43#include "DNA_key_types.h"
44#include "DNA_layer_types.h"
45#include "DNA_light_types.h"
47#include "DNA_linestyle_types.h"
48#include "DNA_material_types.h"
49#include "DNA_mesh_types.h"
50#include "DNA_modifier_types.h"
51#include "DNA_object_types.h"
52#include "DNA_particle_types.h"
53#include "DNA_rigidbody_types.h"
54#include "DNA_scene_types.h"
55#include "DNA_screen_types.h"
56#include "DNA_sequence_types.h"
57#include "DNA_shader_fx_types.h"
58#include "DNA_text_types.h"
59#include "DNA_texture_types.h"
60#include "DNA_view3d_types.h"
62#include "DNA_workspace_types.h"
63#include "DNA_world_types.h"
64
65#undef DNA_GENFILE_VERSIONING_MACROS
66
67#include "BKE_anim_data.hh"
68#include "BKE_blender.hh"
69#include "BKE_collection.hh"
70#include "BKE_colortools.hh"
71#include "BKE_constraint.h"
72#include "BKE_curveprofile.h"
73#include "BKE_customdata.hh"
74#include "BKE_fcurve.hh"
75#include "BKE_fcurve_driver.h"
76#include "BKE_freestyle.h"
78#include "BKE_idprop.hh"
79#include "BKE_key.hh"
80#include "BKE_layer.hh"
81#include "BKE_lib_id.hh"
82#include "BKE_main.hh"
83#include "BKE_mesh.hh"
85#include "BKE_node.hh"
87#include "BKE_paint.hh"
88#include "BKE_paint_types.hh"
89#include "BKE_pointcache.h"
90#include "BKE_report.hh"
91#include "BKE_rigidbody.h"
92#include "BKE_screen.hh"
93#include "BKE_studiolight.h"
94#include "BKE_unit.hh"
95#include "BKE_workspace.hh"
96
97#include "SEQ_iterator.hh"
98#include "SEQ_modifier.hh"
99#include "SEQ_utils.hh"
100
101#include "NOD_shader.h"
102
103#include "IMB_colormanagement.hh"
104#include "IMB_imbuf.hh"
105
106#include "BLT_translation.hh"
107
108#include "BLO_read_write.hh"
109#include "BLO_readfile.hh"
110#include "readfile.hh"
111
112#include "versioning_common.hh"
113
114#include "MEM_guardedalloc.h"
115
116/* Make preferences read-only, use `versioning_userdef.cc`. */
117#define U (*((const UserDef *)&U))
118
119static bScreen *screen_parent_find(const bScreen *screen)
120{
121 /* Can avoid lookup if screen state isn't maximized/full
122 * (parent and child store the same state). */
123 if (ELEM(screen->state, SCREENMAXIMIZED, SCREENFULL)) {
124 LISTBASE_FOREACH (const ScrArea *, area, &screen->areabase) {
125 if (area->full && area->full != screen) {
126 BLI_assert(area->full->state == screen->state);
127 return area->full;
128 }
129 }
130 }
131
132 return nullptr;
133}
134
136{
137 bmain->is_locked_for_linking = false;
138
139 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
140 const bScreen *screen_parent = screen_parent_find(screen);
141 WorkSpace *workspace;
142 if (screen->temp) {
143 continue;
144 }
145
146 if (screen_parent) {
147 /* Full-screen with "Back to Previous" option, don't create
148 * a new workspace, add layout workspace containing parent. */
149 workspace = static_cast<WorkSpace *>(
150 BLI_findstring(&bmain->workspaces, screen_parent->id.name + 2, offsetof(ID, name) + 2));
151 }
152 else {
153 workspace = BKE_workspace_add(bmain, screen->id.name + 2);
154 }
155 if (workspace == nullptr) {
156 continue; /* Not much we can do. */
157 }
158 BKE_workspace_layout_add(bmain, workspace, screen, screen->id.name + 2);
159 }
160
161 bmain->is_locked_for_linking = true;
162}
163
165{
167 SpaceAction *saction = (SpaceAction *)stype->create(area, scene);
168 ARegion *region_channels;
169
170 /* Properly free current regions */
171 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
172 BKE_area_region_free(area->type, region);
173 }
175
176 area->type = stype;
177 area->spacetype = stype->spaceid;
178
179 BLI_addhead(&area->spacedata, saction);
180 area->regionbase = saction->regionbase;
182
183 /* Different defaults for timeline */
184 region_channels = BKE_area_find_region_type(area, RGN_TYPE_CHANNELS);
185 region_channels->flag |= RGN_FLAG_HIDDEN;
186
187 saction->mode = SACTCONT_TIMELINE;
190}
191
205{
207
209
210 LISTBASE_FOREACH (wmWindowManager *, wm, &bmain->wm) {
211 LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
212 bScreen *screen_parent = screen_parent_find(win->screen);
213 bScreen *screen = screen_parent ? screen_parent : win->screen;
214
215 if (screen->temp) {
216 /* We do not generate a new workspace for those screens...
217 * still need to set some data in win. */
218 win->workspace_hook = BKE_workspace_instance_hook_create(bmain, win->winid);
219 win->scene = screen->scene;
220 /* Deprecated from now on! */
221 win->screen = nullptr;
222 continue;
223 }
224
225 WorkSpace *workspace = static_cast<WorkSpace *>(
226 BLI_findstring(&bmain->workspaces, screen->id.name + 2, offsetof(ID, name) + 2));
227 BLI_assert(workspace != nullptr);
228 WorkSpaceLayout *layout = BKE_workspace_layout_find(workspace, win->screen);
229 BLI_assert(layout != nullptr);
230
231 win->workspace_hook = BKE_workspace_instance_hook_create(bmain, win->winid);
232
233 BKE_workspace_active_set(win->workspace_hook, workspace);
234 BKE_workspace_active_layout_set(win->workspace_hook, win->winid, workspace, layout);
235
236 /* Move scene and view layer to window. */
237 Scene *scene = screen->scene;
238 ViewLayer *layer = static_cast<ViewLayer *>(
239 BLI_findlink(&scene->view_layers, scene->r.actlay));
240 if (!layer) {
241 layer = BKE_view_layer_default_view(scene);
242 }
243
244 win->scene = scene;
245 STRNCPY_UTF8(win->view_layer_name, layer->name);
246
247 /* Deprecated from now on! */
248 win->screen = nullptr;
249 }
250 }
251
252 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
253 /* Deprecated from now on! */
254 BLI_freelistN(&screen->scene->transform_spaces);
255 screen->scene = nullptr;
256 }
257}
258
259static void do_version_layers_to_collections(Main *bmain, Scene *scene)
260{
261 /* Since we don't have access to FileData we check the (always valid) first
262 * render layer instead. */
263 if (!scene->master_collection) {
265 }
266
267 if (scene->view_layers.first) {
268 return;
269 }
270
271 /* Create collections from layers. */
272 Collection *collection_master = scene->master_collection;
273 Collection *collections[20] = {nullptr};
274
275 for (int layer = 0; layer < 20; layer++) {
276 LISTBASE_FOREACH (Base *, base, &scene->base) {
277 if (base->lay & (1 << layer)) {
278 /* Create collections when needed only. */
279 if (collections[layer] == nullptr) {
280 char name[MAX_ID_NAME - 2];
281
282 SNPRINTF_UTF8(name, DATA_("Collection %d"), layer + 1);
283
284 Collection *collection = BKE_collection_add(bmain, collection_master, name);
285 collection->id.lib = scene->id.lib;
286 if (ID_IS_LINKED(collection)) {
287 collection->id.tag |= ID_TAG_INDIRECT;
288 }
289 collections[layer] = collection;
290
291 if (!(scene->lay & (1 << layer))) {
293 }
294 }
295
296 /* Note usually this would do slow collection syncing for view layers,
297 * but since no view layers exists yet at this point it's fast. */
298 BKE_collection_object_add_notest(bmain, collections[layer], base->object);
299 }
300
301 if (base->flag & SELECT) {
302 base->object->flag |= SELECT;
303 }
304 else {
305 base->object->flag &= ~SELECT;
306 }
307 }
308 }
309
310 /* Handle legacy render layers. */
311 bool have_override = false;
312 const bool need_default_renderlayer = scene->r.layers.first == nullptr;
313
314 LISTBASE_FOREACH (SceneRenderLayer *, srl, &scene->r.layers) {
315 ViewLayer *view_layer = BKE_view_layer_add(scene, srl->name, nullptr, VIEWLAYER_ADD_NEW);
316
317 if (srl->layflag & SCE_LAY_DISABLE) {
318 view_layer->flag &= ~VIEW_LAYER_RENDER;
319 }
320
321 if ((srl->layflag & SCE_LAY_FRS) == 0) {
322 view_layer->flag &= ~VIEW_LAYER_FREESTYLE;
323 }
324
325 view_layer->layflag = srl->layflag;
326 view_layer->passflag = srl->passflag;
327 view_layer->pass_alpha_threshold = srl->pass_alpha_threshold;
328 view_layer->samples = srl->samples;
329 view_layer->mat_override = srl->mat_override;
330 view_layer->world_override = srl->world_override;
331
333 view_layer->freestyle_config = srl->freestyleConfig;
334 view_layer->id_properties = srl->prop;
335
336 /* Set exclusion and overrides. */
337 for (int layer = 0; layer < 20; layer++) {
338 Collection *collection = collections[layer];
339 if (collection) {
341 collection);
342
343 if (srl->lay_exclude & (1 << layer)) {
344 /* Disable excluded layer. */
345 have_override = true;
348 nlc->flag |= LAYER_COLLECTION_EXCLUDE;
349 }
350 }
351 else {
352 if (srl->lay_zmask & (1 << layer)) {
353 have_override = true;
355 }
356
357 if ((srl->lay & (1 << layer)) == 0) {
358 have_override = true;
360 }
361 }
362 }
363 }
364
365 BKE_view_layer_synced_ensure(scene, view_layer);
366 /* for convenience set the same active object in all the layers */
367 if (scene->basact) {
368 view_layer->basact = BKE_view_layer_base_find(view_layer, scene->basact->object);
369 }
370
372 if ((base->flag & BASE_SELECTABLE) && (base->object->flag & SELECT)) {
373 base->flag |= BASE_SELECTED;
374 }
375 }
376 }
377
378 BLI_freelistN(&scene->r.layers);
379
380 /* If render layers included overrides, or there are no render layers,
381 * we also create a vanilla viewport layer. */
382 if (have_override || need_default_renderlayer) {
383 ViewLayer *view_layer = BKE_view_layer_add(scene, "Viewport", nullptr, VIEWLAYER_ADD_NEW);
384
385 /* If we ported all the original render layers,
386 * we don't need to make the viewport layer renderable. */
387 if (!BLI_listbase_is_single(&scene->view_layers)) {
388 view_layer->flag &= ~VIEW_LAYER_RENDER;
389 }
390
391 BKE_view_layer_synced_ensure(scene, view_layer);
392 /* convert active base */
393 if (scene->basact) {
394 view_layer->basact = BKE_view_layer_base_find(view_layer, scene->basact->object);
395 }
396
397 /* convert selected bases */
399 if ((base->flag & BASE_SELECTABLE) && (base->object->flag & SELECT)) {
400 base->flag |= BASE_SELECTED;
401 }
402
403 /* keep lay around for forward compatibility (open those files in 2.79) */
404 base->lay = base->object->lay;
405 }
406 }
407
408 /* remove bases once and for all */
409 LISTBASE_FOREACH (Base *, base, &scene->base) {
410 id_us_min(&base->object->id);
411 }
412
413 BLI_freelistN(&scene->base);
414 scene->basact = nullptr;
415}
416
418{
419 if (ID_IS_LINKED(collection)) {
420 LISTBASE_FOREACH (CollectionChild *, collection_child, &collection->children) {
421 if (!ID_IS_LINKED(collection_child->collection)) {
422 collection_child->collection->id.lib = collection->id.lib;
423 }
424 do_version_collection_propagate_lib_to_children(collection_child->collection);
425 }
426 }
427}
428
431{
432 LISTBASE_FOREACH (const bGPDpalette *, palette, &gpd->palettes) {
433 LISTBASE_FOREACH (bGPDpalettecolor *, palcolor, &palette->colors) {
434 /* fix layers */
435 LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
436 /* unlock/unhide layer */
437 gpl->flag &= ~GP_LAYER_LOCKED;
438 gpl->flag &= ~GP_LAYER_HIDE;
439 /* set opacity to 1 */
440 gpl->opacity = 1.0f;
441 /* disable tint */
442 gpl->tintcolor[3] = 0.0f;
443
444 LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
445 LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
446 if ((gps->colorname[0] != '\0') && STREQ(gps->colorname, palcolor->info)) {
447 /* copy color settings */
448 copy_v4_v4(gpl->color, palcolor->color);
449 }
450 }
451 }
452 }
453 }
454 }
455}
456
457static void do_versions_remove_region(ListBase *regionbase, ARegion *region)
458{
459 MEM_delete(region->runtime);
460 BLI_freelinkN(regionbase, region);
461}
462
463static void do_versions_remove_regions_by_type(ListBase *regionbase, int regiontype)
464{
465 ARegion *region, *region_next;
466 for (region = static_cast<ARegion *>(regionbase->first); region; region = region_next) {
467 region_next = static_cast<ARegion *>(region->next);
468 if (region->regiontype == regiontype) {
469 do_versions_remove_region(regionbase, region);
470 }
471 }
472}
473
474static ARegion *do_versions_find_region_or_null(ListBase *regionbase, int regiontype)
475{
476 LISTBASE_FOREACH (ARegion *, region, regionbase) {
477 if (region->regiontype == regiontype) {
478 return region;
479 }
480 }
481 return nullptr;
482}
483
484static ARegion *do_versions_find_region(ListBase *regionbase, int regiontype)
485{
486 ARegion *region = do_versions_find_region_or_null(regionbase, regiontype);
487 if (region == nullptr) {
488 BLI_assert_msg(0, "Did not find expected region in versioning");
489 }
490 return region;
491}
492
494 const short space_type,
495 const short region_flag)
496{
497 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
498 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
499 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
500 if (sl->spacetype == space_type) {
501 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
502 &sl->regionbase;
504 if (!region) {
506 region = do_versions_add_region(RGN_TYPE_TOOLS, "tools region");
507 BLI_insertlinkafter(regionbase, header, region);
508 region->alignment = RGN_ALIGN_LEFT;
509 region->flag = region_flag;
510 }
511 }
512 }
513 }
514 }
515}
516
518{
519 LISTBASE_FOREACH (Bone *, bone, lb) {
520 bone->scale_in_z = bone->scale_in_x;
521 bone->scale_out_z = bone->scale_out_x;
522
523 do_version_bones_split_bbone_scale(&bone->childbase);
524 }
525}
526
528{
529 LISTBASE_FOREACH (Bone *, bone, lb) {
530 if (bone->flag & BONE_NO_SCALE) {
531 bone->inherit_scale_mode = BONE_INHERIT_SCALE_NONE_LEGACY;
532 bone->flag &= ~BONE_NO_SCALE;
533 }
534
535 do_version_bones_inherit_scale(&bone->childbase);
536 }
537}
538
539static bool replace_bbone_scale_rnapath(char **p_old_path)
540{
541 char *old_path = *p_old_path;
542
543 if (old_path == nullptr) {
544 return false;
545 }
546
547 if (BLI_str_endswith(old_path, "bbone_scalein") || BLI_str_endswith(old_path, "bbone_scaleout"))
548 {
549 *p_old_path = BLI_strdupcat(old_path, "x");
550
551 MEM_freeN(old_path);
552 return true;
553 }
554
555 return false;
556}
557
559{
560 /* Update driver variable paths. */
561 if (fcu->driver) {
562 LISTBASE_FOREACH (DriverVar *, dvar, &fcu->driver->variables) {
564 replace_bbone_scale_rnapath(&dtar->rna_path);
565 }
567 }
568 }
569
570 /* Update F-Curve's path. */
572 /* If matched, duplicate the curve and tweak name. */
573 FCurve *second = BKE_fcurve_copy(fcu);
574
575 second->rna_path[strlen(second->rna_path) - 1] = 'y';
576
577 BLI_insertlinkafter(curves, fcu, second);
578
579 /* Add to the curve group. */
580 second->grp = fcu->grp;
581
582 if (fcu->grp != nullptr && fcu->grp->channels.last == fcu) {
583 fcu->grp->channels.last = second;
584 }
585 }
586}
587
589{
590 LISTBASE_FOREACH (bConstraint *, con, lb) {
591 if (con->type == CONSTRAINT_TYPE_SAMEVOL) {
593 data->mode = SAMEVOL_UNIFORM;
594 }
595 }
596}
597
599{
600 LISTBASE_FOREACH (bConstraint *, con, lb) {
601 if (con->type == CONSTRAINT_TYPE_SIZELIKE) {
603 data->power = 1.0f;
604 }
605 }
606}
607
609{
610 LISTBASE_FOREACH (bConstraint *, con, lb) {
611 if (con->type == CONSTRAINT_TYPE_ROTLIKE) {
613 data->mix_mode = (data->flag & ROTLIKE_OFFSET) ? ROTLIKE_MIX_OFFSET : ROTLIKE_MIX_REPLACE;
614 data->flag &= ~ROTLIKE_OFFSET;
615 }
616 }
617}
618
620{
621 LISTBASE_FOREACH (Strip *, strip, seqbase) {
622 if (ELEM(strip->type, STRIP_TYPE_SOUND_RAM, STRIP_TYPE_SOUND_HD) == 0) {
623 if (strip->data->transform == nullptr) {
624 strip->data->transform = MEM_callocN<StripTransform>("StripTransform");
625 }
626
627 if (strip->data->crop == nullptr) {
628 strip->data->crop = MEM_callocN<StripCrop>("StripCrop");
629 }
630
631 if (strip->seqbase.first != nullptr) {
633 }
634 }
635 }
636}
637
638/* Return true if there is something to convert. */
639static void do_versions_material_convert_legacy_blend_mode(bNodeTree *ntree, char blend_method)
640{
641 bool need_update = false;
642
643 /* Iterate backwards from end so we don't encounter newly added links. */
644 bNodeLink *prevlink;
645 for (bNodeLink *link = static_cast<bNodeLink *>(ntree->links.last); link; link = prevlink) {
646 prevlink = static_cast<bNodeLink *>(link->prev);
647
648 /* Detect link to replace. */
649 bNode *fromnode = link->fromnode;
650 bNodeSocket *fromsock = link->fromsock;
651 bNode *tonode = link->tonode;
652 bNodeSocket *tosock = link->tosock;
653
654 if (!(tonode->type_legacy == SH_NODE_OUTPUT_MATERIAL && STREQ(tosock->identifier, "Surface")))
655 {
656 continue;
657 }
658
659 /* Only do outputs that are enabled for EEVEE */
661 continue;
662 }
663
664 enum {
665 MA_BM_ADD = 1,
666 MA_BM_MULTIPLY = 2,
667 };
668 if (blend_method == MA_BM_ADD) {
669 blender::bke::node_remove_link(ntree, *link);
670
672 add_node->locx_legacy = 0.5f * (fromnode->locx_legacy + tonode->locx_legacy);
673 add_node->locy_legacy = 0.5f * (fromnode->locy_legacy + tonode->locy_legacy);
674
675 bNodeSocket *shader1_socket = static_cast<bNodeSocket *>(add_node->inputs.first);
676 bNodeSocket *shader2_socket = static_cast<bNodeSocket *>(add_node->inputs.last);
678
680 nullptr, *ntree, SH_NODE_BSDF_TRANSPARENT);
681 transp_node->locx_legacy = add_node->locx_legacy;
682 transp_node->locy_legacy = add_node->locy_legacy - 110.0f;
683
684 bNodeSocket *transp_socket = blender::bke::node_find_socket(*transp_node, SOCK_OUT, "BSDF");
685
686 /* Link to input and material output node. */
687 blender::bke::node_add_link(*ntree, *fromnode, *fromsock, *add_node, *shader1_socket);
689 *ntree, *transp_node, *transp_socket, *add_node, *shader2_socket);
690 blender::bke::node_add_link(*ntree, *add_node, *add_socket, *tonode, *tosock);
691
692 need_update = true;
693 }
694 else if (blend_method == MA_BM_MULTIPLY) {
695 blender::bke::node_remove_link(ntree, *link);
696
698 nullptr, *ntree, SH_NODE_BSDF_TRANSPARENT);
699
700 bNodeSocket *color_socket = blender::bke::node_find_socket(*transp_node, SOCK_IN, "Color");
701 bNodeSocket *transp_socket = blender::bke::node_find_socket(*transp_node, SOCK_OUT, "BSDF");
702
703 /* If incoming link is from a closure socket, we need to convert it. */
704 if (fromsock->type == SOCK_SHADER) {
705 transp_node->locx_legacy = 0.33f * fromnode->locx_legacy + 0.66f * tonode->locx_legacy;
706 transp_node->locy_legacy = 0.33f * fromnode->locy_legacy + 0.66f * tonode->locy_legacy;
707
709 nullptr, *ntree, SH_NODE_SHADERTORGB);
710 shtorgb_node->locx_legacy = 0.66f * fromnode->locx_legacy + 0.33f * tonode->locx_legacy;
711 shtorgb_node->locy_legacy = 0.66f * fromnode->locy_legacy + 0.33f * tonode->locy_legacy;
712
714 *shtorgb_node, SOCK_IN, "Shader");
716 *shtorgb_node, SOCK_OUT, "Color");
717
718 blender::bke::node_add_link(*ntree, *fromnode, *fromsock, *shtorgb_node, *shader_socket);
720 *ntree, *shtorgb_node, *rgba_socket, *transp_node, *color_socket);
721 }
722 else {
723 transp_node->locx_legacy = 0.5f * (fromnode->locx_legacy + tonode->locx_legacy);
724 transp_node->locy_legacy = 0.5f * (fromnode->locy_legacy + tonode->locy_legacy);
725
726 blender::bke::node_add_link(*ntree, *fromnode, *fromsock, *transp_node, *color_socket);
727 }
728
729 /* Link to input and material output node. */
730 blender::bke::node_add_link(*ntree, *transp_node, *transp_socket, *tonode, *tosock);
731
732 need_update = true;
733 }
734 }
735
736 if (need_update) {
738 }
739}
740
742{
743 layer_collection->local_collections_bits = ~0;
744 LISTBASE_FOREACH (LayerCollection *, child, &layer_collection->layer_collections) {
746 }
747}
748
750{
751 if (cumap == nullptr) {
752 return;
753 }
754
755#define CUMA_EXTEND_EXTRAPOLATE_OLD 1
756 for (int curve_map_index = 0; curve_map_index < 4; curve_map_index++) {
757 CurveMap *cuma = &cumap->cm[curve_map_index];
758 if (cuma->flag & CUMA_EXTEND_EXTRAPOLATE_OLD) {
760 return;
761 }
762 }
763#undef CUMA_EXTEND_EXTRAPOLATE_OLD
764}
765
766/* Util version to walk over all CurveMappings in the given `bmain` */
767static void do_version_curvemapping_walker(Main *bmain, void (*callback)(CurveMapping *cumap))
768{
769 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
770 callback(&scene->r.mblur_shutter_curve);
771
772 if (scene->view_settings.curve_mapping) {
773 callback(scene->view_settings.curve_mapping);
774 }
775
776 if (scene->ed != nullptr) {
777 LISTBASE_FOREACH (Strip *, strip, &scene->ed->seqbase) {
778 LISTBASE_FOREACH (StripModifierData *, smd, &strip->modifiers) {
780 smd->type);
781
782 if (smti) {
783 if (smd->type == eSeqModifierType_Curves) {
785 callback(&cmd->curve_mapping);
786 }
787 else if (smd->type == eSeqModifierType_HueCorrect) {
789 callback(&hcmd->curve_mapping);
790 }
791 }
792 }
793 }
794 }
795
796 /* toolsettings */
797 ToolSettings *ts = scene->toolsettings;
798 if (ts->vpaint) {
799 callback(ts->vpaint->paint.cavity_curve);
800 }
801 if (ts->wpaint) {
802 callback(ts->wpaint->paint.cavity_curve);
803 }
804 if (ts->sculpt) {
805 callback(ts->sculpt->paint.cavity_curve);
806 }
807 if (ts->gp_paint) {
808 callback(ts->gp_paint->paint.cavity_curve);
809 }
810 if (ts->gp_interpolate.custom_ipo) {
811 callback(ts->gp_interpolate.custom_ipo);
812 }
813 if (ts->gp_sculpt.cur_falloff) {
814 callback(ts->gp_sculpt.cur_falloff);
815 }
816 if (ts->gp_sculpt.cur_primitive) {
817 callback(ts->gp_sculpt.cur_primitive);
818 }
819 callback(ts->imapaint.paint.cavity_curve);
820 }
821
822 FOREACH_NODETREE_BEGIN (bmain, node_tree, id) {
823 LISTBASE_FOREACH (bNode *, node, &node_tree->nodes) {
824 if (ELEM(node->type_legacy,
833 {
834 callback((CurveMapping *)node->storage);
835 }
836 }
837 }
839
840 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
841 if (brush->curve_distance_falloff) {
842 callback(brush->curve_distance_falloff);
843 }
844 if (brush->gpencil_settings) {
845 if (brush->gpencil_settings->curve_sensitivity) {
846 callback(brush->gpencil_settings->curve_sensitivity);
847 }
848 if (brush->gpencil_settings->curve_strength) {
849 callback(brush->gpencil_settings->curve_strength);
850 }
851 if (brush->gpencil_settings->curve_jitter) {
852 callback(brush->gpencil_settings->curve_jitter);
853 }
854 }
855 }
856
857 LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
858 if (part->clumpcurve) {
859 callback(part->clumpcurve);
860 }
861 if (part->roughcurve) {
862 callback(part->roughcurve);
863 }
864 if (part->twistcurve) {
865 callback(part->twistcurve);
866 }
867 }
868
869 /* Object */
870 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
871 /* Object modifiers */
872 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
873 if (md->type == eModifierType_Hook) {
875
876 if (hmd->curfalloff) {
877 callback(hmd->curfalloff);
878 }
879 }
880 else if (md->type == eModifierType_Warp) {
882 if (tmd->curfalloff) {
883 callback(tmd->curfalloff);
884 }
885 }
886 else if (md->type == eModifierType_WeightVGEdit) {
888
889 if (wmd->cmap_curve) {
890 callback(wmd->cmap_curve);
891 }
892 }
893 }
894 /* Grease pencil modifiers */
895 LISTBASE_FOREACH (ModifierData *, md, &ob->greasepencil_modifiers) {
896 if (md->type == eGpencilModifierType_Thick) {
898
899 if (gpmd->curve_thickness) {
900 callback(gpmd->curve_thickness);
901 }
902 }
903 else if (md->type == eGpencilModifierType_Hook) {
905
906 if (gpmd->curfalloff) {
907 callback(gpmd->curfalloff);
908 }
909 }
910 else if (md->type == eGpencilModifierType_Noise) {
912
913 if (gpmd->curve_intensity) {
914 callback(gpmd->curve_intensity);
915 }
916 }
917 else if (md->type == eGpencilModifierType_Tint) {
919
920 if (gpmd->curve_intensity) {
921 callback(gpmd->curve_intensity);
922 }
923 }
924 else if (md->type == eGpencilModifierType_Smooth) {
926
927 if (gpmd->curve_intensity) {
928 callback(gpmd->curve_intensity);
929 }
930 }
931 else if (md->type == eGpencilModifierType_Color) {
933
934 if (gpmd->curve_intensity) {
935 callback(gpmd->curve_intensity);
936 }
937 }
938 else if (md->type == eGpencilModifierType_Opacity) {
940
941 if (gpmd->curve_intensity) {
942 callback(gpmd->curve_intensity);
943 }
944 }
945 }
946 }
947
948 /* Free Style */
949 LISTBASE_FOREACH (FreestyleLineStyle *, linestyle, &bmain->linestyles) {
950 LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->alpha_modifiers) {
951 switch (m->type) {
953 callback(((LineStyleAlphaModifier_AlongStroke *)m)->curve);
954 break;
956 callback(((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve);
957 break;
959 callback(((LineStyleAlphaModifier_DistanceFromObject *)m)->curve);
960 break;
962 callback(((LineStyleAlphaModifier_Material *)m)->curve);
963 break;
965 callback(((LineStyleAlphaModifier_Tangent *)m)->curve);
966 break;
968 callback(((LineStyleAlphaModifier_Noise *)m)->curve);
969 break;
971 callback(((LineStyleAlphaModifier_CreaseAngle *)m)->curve);
972 break;
974 callback(((LineStyleAlphaModifier_Curvature_3D *)m)->curve);
975 break;
976 }
977 }
978
979 LISTBASE_FOREACH (LineStyleModifier *, m, &linestyle->thickness_modifiers) {
980 switch (m->type) {
982 callback(((LineStyleThicknessModifier_AlongStroke *)m)->curve);
983 break;
985 callback(((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve);
986 break;
988 callback(((LineStyleThicknessModifier_DistanceFromObject *)m)->curve);
989 break;
991 callback(((LineStyleThicknessModifier_Material *)m)->curve);
992 break;
994 callback(((LineStyleThicknessModifier_Tangent *)m)->curve);
995 break;
997 callback(((LineStyleThicknessModifier_CreaseAngle *)m)->curve);
998 break;
1000 callback(((LineStyleThicknessModifier_Curvature_3D *)m)->curve);
1001 break;
1002 }
1003 }
1004 }
1005}
1006
1008{
1009 bool need_update = false;
1010
1011 /* Iterate backwards from end so we don't encounter newly added links. */
1013 /* Detect link to replace. */
1014 bNode *fromnode = link->fromnode;
1015 bNodeSocket *fromsock = link->fromsock;
1016 bNode *tonode = link->tonode;
1017 bNodeSocket *tosock = link->tosock;
1018
1019 if (!(tonode->type_legacy == SH_NODE_OUTPUT_MATERIAL &&
1020 fromnode->type_legacy != SH_NODE_DISPLACEMENT &&
1021 STREQ(tosock->identifier, "Displacement")))
1022 {
1023 continue;
1024 }
1025
1026 /* Replace link with displacement node. */
1027 blender::bke::node_remove_link(ntree, *link);
1028
1029 /* Add displacement node. */
1031 node->locx_legacy = 0.5f * (fromnode->locx_legacy + tonode->locx_legacy);
1032 node->locy_legacy = 0.5f * (fromnode->locy_legacy + tonode->locy_legacy);
1033
1034 bNodeSocket *scale_socket = blender::bke::node_find_socket(*node, SOCK_IN, "Scale");
1035 bNodeSocket *midlevel_socket = blender::bke::node_find_socket(*node, SOCK_IN, "Midlevel");
1036 bNodeSocket *height_socket = blender::bke::node_find_socket(*node, SOCK_IN, "Height");
1037 bNodeSocket *displacement_socket = blender::bke::node_find_socket(
1038 *node, SOCK_OUT, "Displacement");
1039
1040 /* Set default values for compatibility. */
1041 *version_cycles_node_socket_float_value(scale_socket) = 0.1f;
1042 *version_cycles_node_socket_float_value(midlevel_socket) = 0.0f;
1043
1044 /* Link to input and material output node. */
1045 blender::bke::node_add_link(*ntree, *fromnode, *fromsock, *node, *height_socket);
1046 blender::bke::node_add_link(*ntree, *node, *displacement_socket, *tonode, *tosock);
1047
1048 need_update = true;
1049 }
1050
1051 if (need_update) {
1053 }
1054}
1055
1057{
1058 if (node->type_legacy == SH_NODE_DISPLACEMENT) {
1059 if (node->custom1 != SHD_SPACE_WORLD) {
1060 node->custom1 = SHD_SPACE_OBJECT;
1061 }
1062 }
1063 else if (node->type_legacy == SH_NODE_BSDF_PRINCIPLED) {
1066 }
1067 }
1068}
1069
1071{
1072 auto check_node = [](const bNode *node) {
1073 return ELEM(node->type_legacy,
1078 };
1079 auto update_input = [](const bNode *, bNodeSocket *input) {
1081 *value = sqrtf(max_ff(*value, 0.0f));
1082 };
1083 auto update_input_link = [ntree](bNode *fromnode,
1084 bNodeSocket *fromsock,
1085 bNode *tonode,
1086 bNodeSocket *tosock) {
1087 /* Add `sqrt` node. */
1088 bNode *node = blender::bke::node_add_static_node(nullptr, *ntree, SH_NODE_MATH);
1089 node->custom1 = NODE_MATH_POWER;
1090 node->locx_legacy = 0.5f * (fromnode->locx_legacy + tonode->locx_legacy);
1091 node->locy_legacy = 0.5f * (fromnode->locy_legacy + tonode->locy_legacy);
1092
1093 /* Link to input and material output node. */
1094 *version_cycles_node_socket_float_value(static_cast<bNodeSocket *>(node->inputs.last)) = 0.5f;
1096 *ntree, *fromnode, *fromsock, *node, *static_cast<bNodeSocket *>(node->inputs.first));
1098 *ntree, *node, *static_cast<bNodeSocket *>(node->outputs.first), *tonode, *tosock);
1099 };
1100
1101 version_update_node_input(ntree, check_node, "Roughness", update_input, update_input_link);
1102}
1103
1105{
1106 /* Flip euler order of mapping shader node */
1107 if (node->type_legacy == SH_NODE_MAPPING && node->storage) {
1108 TexMapping *texmap = static_cast<TexMapping *>(node->storage);
1109
1110 float quat[4];
1111 eulO_to_quat(quat, texmap->rot, EULER_ORDER_ZYX);
1112 quat_to_eulO(texmap->rot, EULER_ORDER_XYZ, quat);
1113 }
1114}
1115
1117{
1118 /* Remap values of vector curve node from normalized to absolute values */
1119 if (node->type_legacy == SH_NODE_CURVE_VEC && node->storage) {
1120 CurveMapping *mapping = static_cast<CurveMapping *>(node->storage);
1121 mapping->flag &= ~CUMA_DO_CLIP;
1122
1123 for (int curve_index = 0; curve_index < CM_TOT; curve_index++) {
1124 CurveMap *cm = &mapping->cm[curve_index];
1125 if (cm->curve) {
1126 for (int i = 0; i < cm->totpoint; i++) {
1127 cm->curve[i].x = (cm->curve[i].x * 2.0f) - 1.0f;
1128 cm->curve[i].y = (cm->curve[i].y - 0.5f) * 2.0f;
1129 }
1130 }
1131 }
1132
1134 }
1135}
1136
1138{
1139 bool need_update = false;
1140
1141 /* Set default values. */
1142 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1143 if (node->type_legacy == SH_NODE_AMBIENT_OCCLUSION) {
1144 node->custom1 = 1; /* samples */
1145 node->custom2 &= ~SHD_AO_LOCAL;
1146
1147 bNodeSocket *distance_socket = blender::bke::node_find_socket(*node, SOCK_IN, "Distance");
1148 *version_cycles_node_socket_float_value(distance_socket) = 0.0f;
1149 }
1150 }
1151
1152 /* Iterate backwards from end so we don't encounter newly added links. */
1154 /* Detect link to replace. */
1155 bNode *fromnode = link->fromnode;
1156 bNode *tonode = link->tonode;
1157 bNodeSocket *tosock = link->tosock;
1158
1159 if (!(fromnode->type_legacy == SH_NODE_AMBIENT_OCCLUSION)) {
1160 continue;
1161 }
1162
1163 /* Replace links with color socket. */
1164 blender::bke::node_remove_link(ntree, *link);
1165 bNodeSocket *color_socket = blender::bke::node_find_socket(*fromnode, SOCK_OUT, "Color");
1166 blender::bke::node_add_link(*ntree, *fromnode, *color_socket, *tonode, *tosock);
1167
1168 need_update = true;
1169 }
1170
1171 if (need_update) {
1173 }
1174}
1175
1177{
1178 if (node->id == nullptr) {
1179 return;
1180 }
1181
1182 int color_space;
1183 if (node->type_legacy == SH_NODE_TEX_IMAGE && node->storage) {
1184 NodeTexImage *tex = static_cast<NodeTexImage *>(node->storage);
1185 color_space = tex->color_space;
1186 }
1187 else if (node->type_legacy == SH_NODE_TEX_ENVIRONMENT && node->storage) {
1188 NodeTexEnvironment *tex = static_cast<NodeTexEnvironment *>(node->storage);
1189 color_space = tex->color_space;
1190 }
1191 else {
1192 return;
1193 }
1194
1195 enum { SHD_COLORSPACE_NONE = 0 };
1196 Image *image = (Image *)node->id;
1197 if (color_space == SHD_COLORSPACE_NONE) {
1200 }
1201}
1202
1203static void light_emission_node_to_energy(Light *light, float *energy, float color[3])
1204{
1205 *energy = 1.0;
1206 copy_v3_fl(color, 1.0f);
1207
1208 /* If nodetree has animation or drivers, don't try to convert. */
1209 bNodeTree *ntree = light->nodetree;
1210 if (ntree == nullptr || ntree->adt) {
1211 return;
1212 }
1213
1214 /* Find emission node */
1215 bNode *output_node = ntreeShaderOutputNode(ntree, SHD_OUTPUT_CYCLES);
1216 if (output_node == nullptr) {
1217 return;
1218 }
1219
1220 bNode *emission_node = nullptr;
1221 LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
1222 if (link->tonode == output_node && link->fromnode->type_legacy == SH_NODE_EMISSION) {
1223 emission_node = link->fromnode;
1224 break;
1225 }
1226 }
1227
1228 if (emission_node == nullptr) {
1229 return;
1230 }
1231
1232 /* Don't convert if anything is linked */
1234 *emission_node, SOCK_IN, "Strength");
1235 bNodeSocket *color_socket = blender::bke::node_find_socket(*emission_node, SOCK_IN, "Color");
1236
1237 if ((strength_socket->flag & SOCK_IS_LINKED) || (color_socket->flag & SOCK_IS_LINKED)) {
1238 return;
1239 }
1240
1241 float *strength_value = version_cycles_node_socket_float_value(strength_socket);
1242 float *color_value = version_cycles_node_socket_rgba_value(color_socket);
1243
1244 *energy = *strength_value;
1245 copy_v3_v3(color, color_value);
1246
1247 *strength_value = 1.0f;
1248 copy_v4_fl(color_value, 1.0f);
1249 light->use_nodes = false;
1250}
1251
1252static void light_emission_unify(Light *light, const char *engine)
1253{
1254 if (light->type != LA_SUN) {
1255 light->energy_deprecated *= 100.0f;
1256 }
1257
1258 /* Attempt to extract constant energy and color from nodes. */
1259 bool use_nodes = light->use_nodes;
1260 float energy, color[3];
1261 light_emission_node_to_energy(light, &energy, color);
1262
1263 if (STREQ(engine, "CYCLES")) {
1264 if (use_nodes) {
1265 /* Energy extracted from nodes */
1266 light->energy_deprecated = energy;
1267 copy_v3_v3(&light->r, color);
1268 }
1269 else {
1270 /* Default cycles multipliers if there are no nodes */
1271 if (light->type == LA_SUN) {
1272 light->energy_deprecated = 1.0f;
1273 }
1274 else {
1275 light->energy_deprecated = 100.0f;
1276 }
1277 }
1278 }
1279 else {
1280 /* Disable nodes if scene was configured for Eevee */
1281 light->use_nodes = false;
1282 }
1283}
1284
1285/* The B input of the Math node is no longer used for single-operand operators.
1286 * Previously, if the B input was linked and the A input was not, the B input
1287 * was used as the input of the operator. To correct this, we move the link
1288 * from B to A if B is linked and A is not.
1289 */
1291{
1292 bool need_update = false;
1293
1294 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1295 if (node->type_legacy == SH_NODE_MATH) {
1296 if (ELEM(node->custom1,
1309 {
1310 bNodeSocket *sockA = static_cast<bNodeSocket *>(BLI_findlink(&node->inputs, 0));
1311 bNodeSocket *sockB = static_cast<bNodeSocket *>(BLI_findlink(&node->inputs, 1));
1312 if (!sockA->link && sockB->link) {
1314 *ntree, *sockB->link->fromnode, *sockB->link->fromsock, *node, *sockA);
1315 blender::bke::node_remove_link(ntree, *sockB->link);
1316 need_update = true;
1317 }
1318 }
1319 }
1320 }
1321
1322 if (need_update) {
1324 }
1325}
1326
1327/* The Value output of the Vector Math node is no longer available in the Add
1328 * and Subtract operators. Previously, this Value output was computed from the
1329 * Vector output V as follows:
1330 *
1331 * Value = (abs(V.x) + abs(V.y) + abs(V.z)) / 3
1332 *
1333 * Or more compactly using vector operators:
1334 *
1335 * Value = dot(abs(V), (1 / 3, 1 / 3, 1 / 3))
1336 *
1337 * To correct this, if the Value output was used, we are going to compute
1338 * it using the second equation by adding an absolute and a dot node, and
1339 * then connect them appropriately.
1340 */
1342{
1343 bool need_update = false;
1344
1345 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1346 if (node->type_legacy == SH_NODE_VECTOR_MATH) {
1347 bNodeSocket *sockOutValue = blender::bke::node_find_socket(*node, SOCK_OUT, "Value");
1348 if (version_node_socket_is_used(sockOutValue) &&
1350 {
1351
1354 absNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
1355 absNode->locy_legacy = node->locy_legacy;
1356
1359 dotNode->locx_legacy = absNode->locx_legacy + absNode->width + 20.0f;
1360 dotNode->locy_legacy = absNode->locy_legacy;
1361 bNodeSocket *sockDotB = static_cast<bNodeSocket *>(BLI_findlink(&dotNode->inputs, 1));
1362 bNodeSocket *sockDotOutValue = blender::bke::node_find_socket(*dotNode, SOCK_OUT, "Value");
1364
1366 if (link->fromsock == sockOutValue) {
1368 *ntree, *dotNode, *sockDotOutValue, *link->tonode, *link->tosock);
1369 blender::bke::node_remove_link(ntree, *link);
1370 }
1371 }
1372
1373 bNodeSocket *sockAbsA = static_cast<bNodeSocket *>(BLI_findlink(&absNode->inputs, 0));
1374 bNodeSocket *sockDotA = static_cast<bNodeSocket *>(BLI_findlink(&dotNode->inputs, 0));
1375 bNodeSocket *sockOutVector = blender::bke::node_find_socket(*node, SOCK_OUT, "Vector");
1376 bNodeSocket *sockAbsOutVector = blender::bke::node_find_socket(
1377 *absNode, SOCK_OUT, "Vector");
1378
1379 blender::bke::node_add_link(*ntree, *node, *sockOutVector, *absNode, *sockAbsA);
1380 blender::bke::node_add_link(*ntree, *absNode, *sockAbsOutVector, *dotNode, *sockDotA);
1381
1382 need_update = true;
1383 }
1384 }
1385 }
1386
1387 if (need_update) {
1389 }
1390}
1391
1392/* The Vector output of the Vector Math node is no longer available in the Dot
1393 * Product operator. Previously, this Vector was always zero initialized. To
1394 * correct this, we zero out any socket the Vector Output was connected to.
1395 */
1397{
1398 bool need_update = false;
1399
1400 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1401 if (node->type_legacy == SH_NODE_VECTOR_MATH) {
1402 bNodeSocket *sockOutVector = blender::bke::node_find_socket(*node, SOCK_OUT, "Vector");
1403 if (version_node_socket_is_used(sockOutVector) &&
1404 node->custom1 == NODE_VECTOR_MATH_DOT_PRODUCT)
1405 {
1406 LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) {
1407 if (link->fromsock == sockOutVector) {
1408 switch (link->tosock->type) {
1409 case SOCK_FLOAT:
1410 *version_cycles_node_socket_float_value(link->tosock) = 0.0f;
1411 break;
1412 case SOCK_VECTOR:
1414 break;
1415 case SOCK_RGBA:
1417 break;
1418 }
1419 blender::bke::node_remove_link(ntree, *link);
1420 }
1421 }
1422 need_update = true;
1423 }
1424 }
1425 }
1426
1427 if (need_update) {
1429 }
1430}
1431
1432/* Previously, the Vector output of the cross product operator was normalized.
1433 * To correct this, a Normalize node is added to normalize the output if used.
1434 * Moreover, the Value output was removed. This Value was equal to the length
1435 * of the cross product. To correct this, a Length node is added if needed.
1436 */
1438{
1439 bool need_update = false;
1440
1441 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1442 if (node->type_legacy == SH_NODE_VECTOR_MATH) {
1443 if (node->custom1 == NODE_VECTOR_MATH_CROSS_PRODUCT) {
1444 bNodeSocket *sockOutVector = blender::bke::node_find_socket(*node, SOCK_OUT, "Vector");
1445 if (version_node_socket_is_used(sockOutVector)) {
1447 nullptr, *ntree, SH_NODE_VECTOR_MATH);
1448 normalizeNode->custom1 = NODE_VECTOR_MATH_NORMALIZE;
1449 normalizeNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
1450 normalizeNode->locy_legacy = node->locy_legacy;
1451 bNodeSocket *sockNormalizeOut = blender::bke::node_find_socket(
1452 *normalizeNode, SOCK_OUT, "Vector");
1453
1455 if (link->fromsock == sockOutVector) {
1457 *ntree, *normalizeNode, *sockNormalizeOut, *link->tonode, *link->tosock);
1458 blender::bke::node_remove_link(ntree, *link);
1459 }
1460 }
1461 bNodeSocket *sockNormalizeA = static_cast<bNodeSocket *>(
1462 BLI_findlink(&normalizeNode->inputs, 0));
1464 *ntree, *node, *sockOutVector, *normalizeNode, *sockNormalizeA);
1465
1466 need_update = true;
1467 }
1468
1469 bNodeSocket *sockOutValue = blender::bke::node_find_socket(*node, SOCK_OUT, "Value");
1470 if (version_node_socket_is_used(sockOutValue)) {
1472 nullptr, *ntree, SH_NODE_VECTOR_MATH);
1473 lengthNode->custom1 = NODE_VECTOR_MATH_LENGTH;
1474 lengthNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
1475 if (version_node_socket_is_used(sockOutVector)) {
1476 lengthNode->locy_legacy = node->locy_legacy - lengthNode->height - 20.0f;
1477 }
1478 else {
1479 lengthNode->locy_legacy = node->locy_legacy;
1480 }
1482 *lengthNode, SOCK_OUT, "Value");
1483
1485 if (link->fromsock == sockOutValue) {
1487 *ntree, *lengthNode, *sockLengthOut, *link->tonode, *link->tosock);
1488 blender::bke::node_remove_link(ntree, *link);
1489 }
1490 }
1491 bNodeSocket *sockLengthA = static_cast<bNodeSocket *>(
1492 BLI_findlink(&lengthNode->inputs, 0));
1493 blender::bke::node_add_link(*ntree, *node, *sockOutVector, *lengthNode, *sockLengthA);
1494
1495 need_update = true;
1496 }
1497 }
1498 }
1499 }
1500
1501 if (need_update) {
1503 }
1504}
1505
1506/* The Value output of the Vector Math node is no longer available in the
1507 * Normalize operator. This Value output was equal to the length of the
1508 * the input vector A. To correct this, we either add a Length node or
1509 * convert the Normalize node into a Length node, depending on if the
1510 * Vector output is needed.
1511 */
1513{
1514 bool need_update = false;
1515
1516 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1517 if (node->type_legacy == SH_NODE_VECTOR_MATH) {
1518 bNodeSocket *sockOutValue = blender::bke::node_find_socket(*node, SOCK_OUT, "Value");
1519 if (node->custom1 == NODE_VECTOR_MATH_NORMALIZE && version_node_socket_is_used(sockOutValue))
1520 {
1521 bNodeSocket *sockOutVector = blender::bke::node_find_socket(*node, SOCK_OUT, "Vector");
1522 if (version_node_socket_is_used(sockOutVector)) {
1524 nullptr, *ntree, SH_NODE_VECTOR_MATH);
1525 lengthNode->custom1 = NODE_VECTOR_MATH_LENGTH;
1526 lengthNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
1527 lengthNode->locy_legacy = node->locy_legacy;
1529 *lengthNode, SOCK_OUT, "Value");
1530
1532 if (link->fromsock == sockOutValue) {
1534 *ntree, *lengthNode, *sockLengthValue, *link->tonode, *link->tosock);
1535 blender::bke::node_remove_link(ntree, *link);
1536 }
1537 }
1538 bNodeSocket *sockA = static_cast<bNodeSocket *>(BLI_findlink(&node->inputs, 0));
1539 bNodeSocket *sockLengthA = static_cast<bNodeSocket *>(
1540 BLI_findlink(&lengthNode->inputs, 0));
1541 if (sockA->link) {
1542 bNodeLink *link = sockA->link;
1544 *ntree, *link->fromnode, *link->fromsock, *lengthNode, *sockLengthA);
1545 }
1546 else {
1549 }
1550
1551 need_update = true;
1552 }
1553 else {
1554 node->custom1 = NODE_VECTOR_MATH_LENGTH;
1555 }
1556 }
1557 }
1558 }
1559 if (need_update) {
1561 }
1562}
1563
1564/* The Vector Math operator types didn't have an enum, but rather, their
1565 * values were hard coded into the code. After the enum was created and
1566 * after more vector operators were added, the hard coded values needs
1567 * to be remapped to their correct enum values. To fix this, we remap
1568 * the values according to the following rules:
1569 *
1570 * Dot Product Operator : 3 -> 7
1571 * Normalize Operator : 5 -> 11
1572 *
1573 * Additionally, since the Average operator was removed, it is assigned
1574 * a value of -1 just to be identified later in the versioning code:
1575 *
1576 * Average Operator : 2 -> -1
1577 */
1579{
1580 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1581 if (node->type_legacy == SH_NODE_VECTOR_MATH) {
1582 switch (node->custom1) {
1583 case 2:
1584 node->custom1 = -1;
1585 break;
1586 case 3:
1587 node->custom1 = 7;
1588 break;
1589 case 5:
1590 node->custom1 = 11;
1591 break;
1592 }
1593 }
1594 }
1595}
1596
1597/* The Average operator is no longer available in the Vector Math node.
1598 * The Vector output was equal to the normalized sum of input vectors while
1599 * the Value output was equal to the length of the sum of input vectors.
1600 * To correct this, we convert the node into an Add node and add a length
1601 * node or a normalize node if needed.
1602 */
1604{
1605 bool need_update = false;
1606
1607 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1608 if (node->type_legacy == SH_NODE_VECTOR_MATH) {
1609 /* See update_vector_math_node_operators_enum_mapping. */
1610 if (node->custom1 == -1) {
1611 node->custom1 = NODE_VECTOR_MATH_ADD;
1612 bNodeSocket *sockOutVector = blender::bke::node_find_socket(*node, SOCK_OUT, "Vector");
1613 if (version_node_socket_is_used(sockOutVector)) {
1615 nullptr, *ntree, SH_NODE_VECTOR_MATH);
1616 normalizeNode->custom1 = NODE_VECTOR_MATH_NORMALIZE;
1617 normalizeNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
1618 normalizeNode->locy_legacy = node->locy_legacy;
1619 bNodeSocket *sockNormalizeOut = blender::bke::node_find_socket(
1620 *normalizeNode, SOCK_OUT, "Vector");
1621
1623 if (link->fromsock == sockOutVector) {
1625 *ntree, *normalizeNode, *sockNormalizeOut, *link->tonode, *link->tosock);
1626 blender::bke::node_remove_link(ntree, *link);
1627 }
1628 }
1629 bNodeSocket *sockNormalizeA = static_cast<bNodeSocket *>(
1630 BLI_findlink(&normalizeNode->inputs, 0));
1632 *ntree, *node, *sockOutVector, *normalizeNode, *sockNormalizeA);
1633
1634 need_update = true;
1635 }
1636
1637 bNodeSocket *sockOutValue = blender::bke::node_find_socket(*node, SOCK_OUT, "Value");
1638 if (version_node_socket_is_used(sockOutValue)) {
1640 nullptr, *ntree, SH_NODE_VECTOR_MATH);
1641 lengthNode->custom1 = NODE_VECTOR_MATH_LENGTH;
1642 lengthNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
1643 if (version_node_socket_is_used(sockOutVector)) {
1644 lengthNode->locy_legacy = node->locy_legacy - lengthNode->height - 20.0f;
1645 }
1646 else {
1647 lengthNode->locy_legacy = node->locy_legacy;
1648 }
1650 *lengthNode, SOCK_OUT, "Value");
1651
1653 if (link->fromsock == sockOutValue) {
1655 *ntree, *lengthNode, *sockLengthOut, *link->tonode, *link->tosock);
1656 blender::bke::node_remove_link(ntree, *link);
1657 }
1658 }
1659 bNodeSocket *sockLengthA = static_cast<bNodeSocket *>(
1660 BLI_findlink(&lengthNode->inputs, 0));
1661 blender::bke::node_add_link(*ntree, *node, *sockOutVector, *lengthNode, *sockLengthA);
1662
1663 need_update = true;
1664 }
1665 }
1666 }
1667 }
1668
1669 if (need_update) {
1671 }
1672}
1673
1674/* The Noise node now have a dimension property. This property should be
1675 * initialized to 3 by default.
1676 */
1678{
1679 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1680 if (node->type_legacy == SH_NODE_TEX_NOISE && node->storage) {
1681 NodeTexNoise *tex = (NodeTexNoise *)node->storage;
1682 tex->dimensions = 3;
1683 }
1684 }
1685}
1686
1687/* This callback function is used by update_mapping_node_inputs_and_properties.
1688 * It is executed on every fcurve in the nodetree id updating its RNA paths. The
1689 * paths needs to be updated because the node properties became inputs.
1690 *
1691 * nodes["Mapping"].translation --> nodes["Mapping"].inputs[1].default_value
1692 * nodes["Mapping"].rotation --> nodes["Mapping"].inputs[2].default_value
1693 * nodes["Mapping"].scale --> nodes["Mapping"].inputs[3].default_value
1694 * nodes["Mapping"].max --> nodes["Maximum"].inputs[1].default_value
1695 * nodes["Mapping"].min --> nodes["Minimum"].inputs[1].default_value
1696 *
1697 * The fcurve can be that of any node or property in the nodetree, so we only
1698 * update if the rna path starts with the rna path of the mapping node and
1699 * doesn't end with "default_value", that is, not the Vector input.
1700 */
1702 const char *nodePath,
1703 const bNode *minimumNode,
1704 const bNode *maximumNode)
1705{
1706 if (!STRPREFIX(fcurve->rna_path, nodePath) ||
1707 BLI_str_endswith(fcurve->rna_path, "default_value"))
1708 {
1709 return;
1710 }
1711 char *old_fcurve_rna_path = fcurve->rna_path;
1712
1713 if (BLI_str_endswith(old_fcurve_rna_path, "translation")) {
1714 fcurve->rna_path = BLI_sprintfN("%s.%s", nodePath, "inputs[1].default_value");
1715 }
1716 else if (BLI_str_endswith(old_fcurve_rna_path, "rotation")) {
1717 fcurve->rna_path = BLI_sprintfN("%s.%s", nodePath, "inputs[2].default_value");
1718 }
1719 else if (BLI_str_endswith(old_fcurve_rna_path, "scale")) {
1720 fcurve->rna_path = BLI_sprintfN("%s.%s", nodePath, "inputs[3].default_value");
1721 }
1722 else if (minimumNode && BLI_str_endswith(old_fcurve_rna_path, "max")) {
1723 char node_name_esc[sizeof(minimumNode->name) * 2];
1724 BLI_str_escape(node_name_esc, minimumNode->name, sizeof(node_name_esc));
1725 fcurve->rna_path = BLI_sprintfN("nodes[\"%s\"].%s", node_name_esc, "inputs[1].default_value");
1726 }
1727 else if (maximumNode && BLI_str_endswith(old_fcurve_rna_path, "min")) {
1728 char node_name_esc[sizeof(maximumNode->name) * 2];
1729 BLI_str_escape(node_name_esc, maximumNode->name, sizeof(node_name_esc));
1730 fcurve->rna_path = BLI_sprintfN("nodes[\"%s\"].%s", node_name_esc, "inputs[1].default_value");
1731 }
1732
1733 if (fcurve->rna_path != old_fcurve_rna_path) {
1734 MEM_freeN(old_fcurve_rna_path);
1735 }
1736}
1737
1738/* The Mapping node has been rewritten to support dynamic inputs. Previously,
1739 * the transformation information was stored in a TexMapping struct in the
1740 * node->storage member of bNode. Currently, the transformation information
1741 * is stored in input sockets. To correct this, we transfer the information
1742 * from the TexMapping struct to the input sockets.
1743 *
1744 * Additionally, the Minimum and Maximum properties are no longer available
1745 * in the node. To correct this, a Vector Minimum and/or a Vector Maximum
1746 * nodes are added if needed.
1747 *
1748 * Finally, the #TexMapping struct is freed and `node->storage` is set to null.
1749 *
1750 * Since the RNA paths of the properties changed, we also have to update the
1751 * rna_path of the FCurves if they exist. To do that, we loop over FCurves
1752 * and check if they control a property of the node, if they do, we update
1753 * the path to be that of the corresponding socket in the node or the added
1754 * minimum/maximum node.
1755 */
1757{
1758 bool need_update = false;
1759
1760 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1761 /* If `node->storage` is null, then conversion has already taken place.
1762 * This can happen if a file with the new mapping node [saved from (2, 81, 8) or newer]
1763 * is opened in a blender version prior to (2, 81, 8) and saved from there again. */
1764 if (node->type_legacy == SH_NODE_MAPPING && node->storage) {
1765 TexMapping *mapping = (TexMapping *)node->storage;
1766 node->custom1 = mapping->type;
1767 node->width = 140.0f;
1768
1769 bNodeSocket *sockLocation = blender::bke::node_find_socket(*node, SOCK_IN, "Location");
1771 bNodeSocket *sockRotation = blender::bke::node_find_socket(*node, SOCK_IN, "Rotation");
1773 bNodeSocket *sockScale = blender::bke::node_find_socket(*node, SOCK_IN, "Scale");
1775
1776 bNode *maximumNode = nullptr;
1777 if (mapping->flag & TEXMAP_CLIP_MIN) {
1778 maximumNode = blender::bke::node_add_static_node(nullptr, *ntree, SH_NODE_VECTOR_MATH);
1779 maximumNode->custom1 = NODE_VECTOR_MATH_MAXIMUM;
1780 if (mapping->flag & TEXMAP_CLIP_MAX) {
1781 maximumNode->locx_legacy = node->locx_legacy + (node->width + 20.0f) * 2.0f;
1782 }
1783 else {
1784 maximumNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
1785 }
1786 maximumNode->locy_legacy = node->locy_legacy;
1787 bNodeSocket *sockMaximumB = static_cast<bNodeSocket *>(
1788 BLI_findlink(&maximumNode->inputs, 1));
1790 bNodeSocket *sockMappingResult = blender::bke::node_find_socket(*node, SOCK_OUT, "Vector");
1791
1793 if (link->fromsock == sockMappingResult) {
1794 bNodeSocket *sockMaximumResult = blender::bke::node_find_socket(
1795 *maximumNode, SOCK_OUT, "Vector");
1797 *ntree, *maximumNode, *sockMaximumResult, *link->tonode, *link->tosock);
1798 blender::bke::node_remove_link(ntree, *link);
1799 }
1800 }
1801 if (!(mapping->flag & TEXMAP_CLIP_MAX)) {
1802 bNodeSocket *sockMaximumA = static_cast<bNodeSocket *>(
1803 BLI_findlink(&maximumNode->inputs, 0));
1805 *ntree, *node, *sockMappingResult, *maximumNode, *sockMaximumA);
1806 }
1807
1808 need_update = true;
1809 }
1810
1811 bNode *minimumNode = nullptr;
1812 if (mapping->flag & TEXMAP_CLIP_MAX) {
1813 minimumNode = blender::bke::node_add_static_node(nullptr, *ntree, SH_NODE_VECTOR_MATH);
1814 minimumNode->custom1 = NODE_VECTOR_MATH_MINIMUM;
1815 minimumNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
1816 minimumNode->locy_legacy = node->locy_legacy;
1817 bNodeSocket *sockMinimumB = static_cast<bNodeSocket *>(
1818 BLI_findlink(&minimumNode->inputs, 1));
1820
1821 bNodeSocket *sockMinimumResult = blender::bke::node_find_socket(
1822 *minimumNode, SOCK_OUT, "Vector");
1823 bNodeSocket *sockMappingResult = blender::bke::node_find_socket(*node, SOCK_OUT, "Vector");
1824
1825 if (maximumNode) {
1826 bNodeSocket *sockMaximumA = static_cast<bNodeSocket *>(
1827 BLI_findlink(&maximumNode->inputs, 0));
1829 *ntree, *minimumNode, *sockMinimumResult, *maximumNode, *sockMaximumA);
1830 }
1831 else {
1833 if (link->fromsock == sockMappingResult) {
1835 *ntree, *minimumNode, *sockMinimumResult, *link->tonode, *link->tosock);
1836 blender::bke::node_remove_link(ntree, *link);
1837 }
1838 }
1839 }
1840 bNodeSocket *sockMinimumA = static_cast<bNodeSocket *>(
1841 BLI_findlink(&minimumNode->inputs, 0));
1843 *ntree, *node, *sockMappingResult, *minimumNode, *sockMinimumA);
1844
1845 need_update = true;
1846 }
1847
1848 MEM_freeN(node->storage);
1849 node->storage = nullptr;
1850
1851 char node_name_esc[sizeof(node->name) * 2];
1852 BLI_str_escape(node_name_esc, node->name, sizeof(node_name_esc));
1853
1854 char *nodePath = BLI_sprintfN("nodes[\"%s\"]", node_name_esc);
1855 BKE_fcurves_id_cb(&ntree->id, [&](ID * /*id*/, FCurve *fcu) {
1856 update_mapping_node_fcurve_rna_path_callback(fcu, nodePath, minimumNode, maximumNode);
1857 });
1858 MEM_freeN(nodePath);
1859 }
1860 }
1861
1862 if (need_update) {
1864 }
1865}
1866
1867/* The Musgrave node now has a dimension property. This property should
1868 * be initialized to 3 by default.
1869 */
1871{
1872 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1873 if (node->type_legacy == SH_NODE_TEX_MUSGRAVE_DEPRECATED && node->storage) {
1874 NodeTexMusgrave *tex = (NodeTexMusgrave *)node->storage;
1875 tex->dimensions = 3;
1876 }
1877 }
1878}
1879
1880/* The Color output of the Musgrave node has been removed. Previously, this
1881 * output was just equal to the `Fac` output. To correct this, we move links
1882 * from the Color output to the `Fac` output if they exist.
1883 */
1885{
1886 LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
1887 if (link->fromnode && link->fromnode->type_legacy == SH_NODE_TEX_MUSGRAVE_DEPRECATED) {
1888 if (link->fromsock->type == SOCK_RGBA) {
1889 link->fromsock = link->fromsock->next;
1890 }
1891 }
1892 }
1893}
1894
1895/* The Voronoi node now have a dimension property. This property should be
1896 * initialized to 3 by default.
1897 */
1899{
1900 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1901 if (node->type_legacy == SH_NODE_TEX_VORONOI && node->storage) {
1902 NodeTexVoronoi *tex = (NodeTexVoronoi *)node->storage;
1903 tex->dimensions = 3;
1904 }
1905 }
1906}
1907
1908/* The F3 and F4 features of the Voronoi node have been removed.
1909 * To correct this, we set the feature type to be F2 if it is F3
1910 * or F4. The SHD_VORONOI_F3 and SHD_VORONOI_F4 enum values were
1911 * 2 and 3 respectively.
1912 */
1914{
1915 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1916 if (node->type_legacy == SH_NODE_TEX_VORONOI && node->storage) {
1917 NodeTexVoronoi *tex = (NodeTexVoronoi *)node->storage;
1918 if (ELEM(tex->feature, 2, 3)) {
1919 tex->feature = SHD_VORONOI_F2;
1920 }
1921 }
1922 }
1923}
1924
1925/* The `Fac` output of the Voronoi node has been removed. Previously, this
1926 * output was the voronoi distance in the Intensity mode and the Cell ID
1927 * in the Cell mode. To correct this, we update the identifier and name
1928 * of the `Fac` socket such that it gets mapped to the Distance socket.
1929 * This is supposed to work with update_voronoi_node_coloring.
1930 */
1932{
1933 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1934 if (node->type_legacy == SH_NODE_TEX_VORONOI) {
1935 bNodeSocket *facOutput = static_cast<bNodeSocket *>(BLI_findlink(&node->outputs, 1));
1936 STRNCPY_UTF8(facOutput->identifier, "Distance");
1937 STRNCPY_UTF8(facOutput->name, "Distance");
1938 }
1939 }
1940}
1941
1942/* The Crackle feature of the Voronoi node has been removed. Previously,
1943 * this feature returned the F2 distance minus the F1 distance. The
1944 * crackle feature had an enum value of 4. To fix this we do the
1945 * following:
1946 *
1947 * 1. The node feature is set to F1.
1948 * 2. A new Voronoi node is added and its feature is set to F2.
1949 * 3. The properties, input values, and connections are copied
1950 * from the node to the new Voronoi node so that they match
1951 * exactly.
1952 * 4. A Subtract node is added.
1953 * 5. The outputs of the F1 and F2 voronoi are connected to
1954 * the inputs of the subtract node.
1955 * 6. The output of the subtract node is connected to the
1956 * appropriate sockets.
1957 */
1959{
1960 bool need_update = false;
1961
1962 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1963 if (node->type_legacy == SH_NODE_TEX_VORONOI && node->storage) {
1964 NodeTexVoronoi *tex = (NodeTexVoronoi *)node->storage;
1965 bNodeSocket *sockDistance = blender::bke::node_find_socket(*node, SOCK_OUT, "Distance");
1966 bNodeSocket *sockColor = blender::bke::node_find_socket(*node, SOCK_OUT, "Color");
1967 if (tex->feature == 4 &&
1968 (version_node_socket_is_used(sockDistance) || version_node_socket_is_used(sockColor)))
1969 {
1970 tex->feature = SHD_VORONOI_F1;
1971
1973 nullptr, *ntree, SH_NODE_TEX_VORONOI);
1974 NodeTexVoronoi *texVoronoi = (NodeTexVoronoi *)voronoiNode->storage;
1975 texVoronoi->feature = SHD_VORONOI_F2;
1976 texVoronoi->distance = tex->distance;
1977 texVoronoi->dimensions = 3;
1978 voronoiNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
1979 voronoiNode->locy_legacy = node->locy_legacy;
1980
1981 bNodeSocket *sockVector = blender::bke::node_find_socket(*node, SOCK_IN, "Vector");
1982 bNodeSocket *sockScale = blender::bke::node_find_socket(*node, SOCK_IN, "Scale");
1983 bNodeSocket *sockExponent = blender::bke::node_find_socket(*node, SOCK_IN, "Exponent");
1984 bNodeSocket *sockVoronoiVector = blender::bke::node_find_socket(
1985 *voronoiNode, SOCK_IN, "Vector");
1986 bNodeSocket *sockVoronoiScale = blender::bke::node_find_socket(
1987 *voronoiNode, SOCK_IN, "Scale");
1988 bNodeSocket *sockVoronoiExponent = blender::bke::node_find_socket(
1989 *voronoiNode, SOCK_IN, "Exponent");
1990 if (sockVector->link) {
1992 *sockVector->link->fromnode,
1993 *sockVector->link->fromsock,
1994 *voronoiNode,
1995 *sockVoronoiVector);
1996 }
1998 sockVoronoiScale) = *version_cycles_node_socket_float_value(sockScale);
1999 if (sockScale->link) {
2001 *sockScale->link->fromnode,
2002 *sockScale->link->fromsock,
2003 *voronoiNode,
2004 *sockVoronoiScale);
2005 }
2007 sockVoronoiExponent) = *version_cycles_node_socket_float_value(sockExponent);
2008 if (sockExponent->link) {
2010 *sockExponent->link->fromnode,
2011 *sockExponent->link->fromsock,
2012 *voronoiNode,
2013 *sockVoronoiExponent);
2014 }
2015
2016 bNode *subtractNode = blender::bke::node_add_static_node(nullptr, *ntree, SH_NODE_MATH);
2017 subtractNode->custom1 = NODE_MATH_SUBTRACT;
2018 subtractNode->locx_legacy = voronoiNode->locx_legacy + voronoiNode->width + 20.0f;
2019 subtractNode->locy_legacy = voronoiNode->locy_legacy;
2020 bNodeSocket *sockSubtractOutValue = blender::bke::node_find_socket(
2021 *subtractNode, SOCK_OUT, "Value");
2022
2024 if (link->fromnode == node) {
2026 *ntree, *subtractNode, *sockSubtractOutValue, *link->tonode, *link->tosock);
2027 blender::bke::node_remove_link(ntree, *link);
2028 }
2029 }
2030
2031 bNodeSocket *sockDistanceF1 = blender::bke::node_find_socket(*node, SOCK_OUT, "Distance");
2033 *voronoiNode, SOCK_OUT, "Distance");
2034 bNodeSocket *sockSubtractA = static_cast<bNodeSocket *>(
2035 BLI_findlink(&subtractNode->inputs, 0));
2036 bNodeSocket *sockSubtractB = static_cast<bNodeSocket *>(
2037 BLI_findlink(&subtractNode->inputs, 1));
2038
2039 blender::bke::node_add_link(*ntree, *node, *sockDistanceF1, *subtractNode, *sockSubtractB);
2041 *ntree, *voronoiNode, *sockDistanceF2, *subtractNode, *sockSubtractA);
2042
2043 need_update = true;
2044 }
2045 }
2046 }
2047
2048 if (need_update) {
2050 }
2051}
2052
2062{
2063 bool need_update = false;
2064
2066 bNode *node = link->fromnode;
2067 if (node && node->type_legacy == SH_NODE_TEX_VORONOI && node->storage) {
2068 NodeTexVoronoi *tex = (NodeTexVoronoi *)node->storage;
2069 if (tex->coloring == 0) {
2070 bNodeSocket *sockColor = blender::bke::node_find_socket(*node, SOCK_OUT, "Color");
2071 if (link->fromsock == sockColor) {
2072 bNodeSocket *sockDistance = blender::bke::node_find_socket(*node, SOCK_OUT, "Distance");
2073 blender::bke::node_add_link(*ntree, *node, *sockDistance, *link->tonode, *link->tosock);
2074 blender::bke::node_remove_link(ntree, *link);
2075 need_update = true;
2076 }
2077 }
2078 else {
2079 bNodeSocket *sockDistance = blender::bke::node_find_socket(*node, SOCK_OUT, "Distance");
2080 if (link->fromsock == sockDistance) {
2081 bNodeSocket *sockColor = blender::bke::node_find_socket(*node, SOCK_OUT, "Color");
2082 blender::bke::node_add_link(*ntree, *node, *sockColor, *link->tonode, *link->tosock);
2083 blender::bke::node_remove_link(ntree, *link);
2084 need_update = true;
2085 }
2086 }
2087 }
2088 }
2089
2090 if (need_update) {
2092 }
2093}
2094
2095/* Previously, the output euclidean distance was actually the squared
2096 * euclidean distance. To fix this, we square the output distance
2097 * socket if the distance metric is set to SHD_VORONOI_EUCLIDEAN.
2098 */
2100{
2101 bool need_update = false;
2102
2103 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2104 if (node->type_legacy == SH_NODE_TEX_VORONOI && node->storage) {
2105 NodeTexVoronoi *tex = (NodeTexVoronoi *)node->storage;
2106 bNodeSocket *sockDistance = blender::bke::node_find_socket(*node, SOCK_OUT, "Distance");
2107 if (tex->distance == SHD_VORONOI_EUCLIDEAN &&
2109 version_node_socket_is_used(sockDistance))
2110 {
2111 bNode *multiplyNode = blender::bke::node_add_static_node(nullptr, *ntree, SH_NODE_MATH);
2112 multiplyNode->custom1 = NODE_MATH_MULTIPLY;
2113 multiplyNode->locx_legacy = node->locx_legacy + node->width + 20.0f;
2114 multiplyNode->locy_legacy = node->locy_legacy;
2115
2116 bNodeSocket *sockValue = blender::bke::node_find_socket(*multiplyNode, SOCK_OUT, "Value");
2118 if (link->fromsock == sockDistance) {
2120 *ntree, *multiplyNode, *sockValue, *link->tonode, *link->tosock);
2121 blender::bke::node_remove_link(ntree, *link);
2122 }
2123 }
2124
2125 bNodeSocket *sockMultiplyA = static_cast<bNodeSocket *>(
2126 BLI_findlink(&multiplyNode->inputs, 0));
2127 bNodeSocket *sockMultiplyB = static_cast<bNodeSocket *>(
2128 BLI_findlink(&multiplyNode->inputs, 1));
2129
2130 blender::bke::node_add_link(*ntree, *node, *sockDistance, *multiplyNode, *sockMultiplyA);
2131 blender::bke::node_add_link(*ntree, *node, *sockDistance, *multiplyNode, *sockMultiplyB);
2132
2133 need_update = true;
2134 }
2135 }
2136 }
2137
2138 if (need_update) {
2140 }
2141}
2142
2149{
2150 bool need_update = false;
2151
2152 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2153 if (ELEM(node->type_legacy, SH_NODE_TEX_NOISE, SH_NODE_TEX_WAVE)) {
2154
2155 bNodeSocket *sockDistortion = blender::bke::node_find_socket(*node, SOCK_IN, "Distortion");
2156 float *distortion = version_cycles_node_socket_float_value(sockDistortion);
2157
2158 if (version_node_socket_is_used(sockDistortion) && sockDistortion->link != nullptr) {
2159 bNode *distortionInputNode = sockDistortion->link->fromnode;
2160 bNodeSocket *distortionInputSock = sockDistortion->link->fromsock;
2161
2162 bNode *mulNode = blender::bke::node_add_static_node(nullptr, *ntree, SH_NODE_MATH);
2163 mulNode->custom1 = NODE_MATH_MULTIPLY;
2164 mulNode->locx_legacy = node->locx_legacy;
2165 mulNode->locy_legacy = node->locy_legacy - 240.0f;
2166 mulNode->flag |= NODE_COLLAPSED;
2167 bNodeSocket *mulSockA = static_cast<bNodeSocket *>(BLI_findlink(&mulNode->inputs, 0));
2168 bNodeSocket *mulSockB = static_cast<bNodeSocket *>(BLI_findlink(&mulNode->inputs, 1));
2170 bNodeSocket *mulSockOut = blender::bke::node_find_socket(*mulNode, SOCK_OUT, "Value");
2171
2172 blender::bke::node_remove_link(ntree, *sockDistortion->link);
2174 *ntree, *distortionInputNode, *distortionInputSock, *mulNode, *mulSockA);
2175 blender::bke::node_add_link(*ntree, *mulNode, *mulSockOut, *node, *sockDistortion);
2176
2177 need_update = true;
2178 }
2179 else if (*distortion != 0.0f) {
2180 *distortion = *distortion * 0.5f;
2181 }
2182 }
2183 }
2184
2185 if (need_update) {
2187 }
2188}
2189
2201{
2202 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2203 if (node->type_legacy == SH_NODE_TEX_WAVE) {
2204 NodeTexWave *tex = (NodeTexWave *)node->storage;
2207
2208 if (tex->wave_profile == SHD_WAVE_PROFILE_SIN) {
2210 *node, SOCK_IN, "Phase Offset");
2212 }
2213 }
2214 }
2215}
2216
2218{
2219 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 0)) {
2220 /* Convert group layer visibility flags to hidden nested collection. */
2221 LISTBASE_FOREACH (Collection *, collection, &bmain->collections) {
2222 /* Add fake user for all existing groups. */
2223 id_fake_user_set(&collection->id);
2224
2225 if (collection->flag & (COLLECTION_HIDE_VIEWPORT | COLLECTION_HIDE_RENDER)) {
2226 continue;
2227 }
2228
2229 Collection *hidden_collection_array[20] = {nullptr};
2230 for (CollectionObject *cob = static_cast<CollectionObject *>(collection->gobject.first),
2231 *cob_next = nullptr;
2232 cob;
2233 cob = cob_next)
2234 {
2235 cob_next = cob->next;
2236 Object *ob = cob->ob;
2237
2238 if (!(ob->lay & collection->layer)) {
2239 /* Find or create hidden collection matching object's first layer. */
2240 Collection **collection_hidden = nullptr;
2241 int coll_idx = 0;
2242 for (; coll_idx < 20; coll_idx++) {
2243 if (ob->lay & (1 << coll_idx)) {
2244 collection_hidden = &hidden_collection_array[coll_idx];
2245 break;
2246 }
2247 }
2248 if (collection_hidden == nullptr) {
2249 /* This should never happen (objects are always supposed to be instantiated in a
2250 * scene), but it does sometimes, see e.g. #81168.
2251 * Just put them in first hidden collection in those cases. */
2252 collection_hidden = &hidden_collection_array[0];
2253 }
2254
2255 if (*collection_hidden == nullptr) {
2256 char name[MAX_ID_NAME];
2257 SNPRINTF_UTF8(name, DATA_("Hidden %d"), coll_idx + 1);
2258 *collection_hidden = BKE_collection_add(bmain, collection, name);
2259 (*collection_hidden)->flag |= COLLECTION_HIDE_VIEWPORT | COLLECTION_HIDE_RENDER;
2260 }
2261
2262 BKE_collection_object_add_notest(bmain, *collection_hidden, ob);
2263 BKE_collection_object_remove(bmain, collection, ob, true);
2264 }
2265 }
2266 }
2267
2268 /* We need to assign lib pointer to generated hidden collections *after* all have been
2269 * created, otherwise we'll end up with several data-blocks sharing same name/library,
2270 * which is FORBIDDEN! NOTE: we need this to be recursive, since a child collection may be
2271 * sorted before its parent in bmain. */
2272 LISTBASE_FOREACH (Collection *, collection, &bmain->collections) {
2274 }
2275
2276 /* Convert layers to collections. */
2277 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2279 }
2280 }
2281
2282 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 0)) {
2283 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2284 BLO_read_assert_message(screen->scene == nullptr,
2285 ,
2286 (BlendHandle *)fd,
2287 bmain,
2288 "No Screen data-block should ever have a nullptr `scene` pointer");
2289
2290 /* same render-layer as do_version_workspaces_after_lib_link will activate,
2291 * so same layer as BKE_view_layer_default_view would return */
2292 ViewLayer *layer = static_cast<ViewLayer *>(screen->scene->view_layers.first);
2293
2294 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2295 LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) {
2296 if (space->spacetype == SPACE_OUTLINER) {
2297 SpaceOutliner *space_outliner = (SpaceOutliner *)space;
2298
2299 space_outliner->outlinevis = SO_VIEW_LAYER;
2300
2302 if (space_outliner->treestore == nullptr) {
2303 space_outliner->treestore = BLI_mempool_create(
2304 sizeof(TreeStoreElem), 1, 512, BLI_MEMPOOL_ALLOW_ITER);
2305 }
2306
2307 /* Create a tree store element for the collection. This is normally
2308 * done in check_persistent `outliner_tree.cc`, but we need to access
2309 * it here :/ (expand element if it's the only one) */
2310 TreeStoreElem *tselem = static_cast<TreeStoreElem *>(
2311 BLI_mempool_calloc(space_outliner->treestore));
2312 tselem->type = TSE_LAYER_COLLECTION;
2313 tselem->id = &((LayerCollection *)(layer->layer_collections.first))->collection->id;
2314 tselem->nr = tselem->used = 0;
2315 tselem->flag &= ~TSE_CLOSED;
2316 }
2317 }
2318 }
2319 }
2320 }
2321 }
2322
2323 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 0)) {
2324 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2325 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2326 LISTBASE_FOREACH (SpaceLink *, space, &area->spacedata) {
2327 if (space->spacetype == SPACE_IMAGE) {
2328 SpaceImage *sima = (SpaceImage *)space;
2329 if ((sima) && (sima->gpd)) {
2330 sima->gpd->flag |= GP_DATA_ANNOTATIONS;
2332 }
2333 }
2334 if (space->spacetype == SPACE_CLIP) {
2335 SpaceClip *spclip = (SpaceClip *)space;
2336 MovieClip *clip = spclip->clip;
2337 if ((clip) && (clip->gpd)) {
2338 clip->gpd->flag |= GP_DATA_ANNOTATIONS;
2340 }
2341 }
2342 }
2343 }
2344 }
2345 }
2346
2347 /* New workspace design. */
2348 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 1)) {
2350 }
2351
2352 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 2)) {
2353 /* Cleanup any remaining SceneRenderLayer data for files that were created
2354 * with Blender 2.8 before the SceneRenderLayer > RenderLayer refactor. */
2355 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2356 LISTBASE_FOREACH (SceneRenderLayer *, srl, &scene->r.layers) {
2357 if (srl->prop) {
2358 IDP_FreeProperty(srl->prop);
2359 }
2360 BKE_freestyle_config_free(&srl->freestyleConfig, true);
2361 }
2362 BLI_freelistN(&scene->r.layers);
2363 }
2364 }
2365
2366 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 3)) {
2367 /* Due to several changes to particle RNA and draw code particles from older files may
2368 * no longer be visible.
2369 * Here we correct this by setting a default draw size for those files. */
2370 LISTBASE_FOREACH (Object *, object, &bmain->objects) {
2371 LISTBASE_FOREACH (ParticleSystem *, psys, &object->particlesystem) {
2372 if (psys->part->draw_size == 0.0f) {
2373 psys->part->draw_size = 0.1f;
2374 }
2375 }
2376 }
2377 }
2378
2379 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 4)) {
2380 LISTBASE_FOREACH (Object *, object, &bmain->objects) {
2381 if (object->particlesystem.first) {
2382 object->duplicator_visibility_flag = OB_DUPLI_FLAG_VIEWPORT;
2383 LISTBASE_FOREACH (ParticleSystem *, psys, &object->particlesystem) {
2384 if (psys->part->draw & PART_DRAW_EMITTER) {
2385 object->duplicator_visibility_flag |= OB_DUPLI_FLAG_RENDER;
2386 break;
2387 }
2388 }
2389 }
2390 else if (object->transflag & OB_DUPLI) {
2391 object->duplicator_visibility_flag = OB_DUPLI_FLAG_VIEWPORT;
2392 }
2393 else {
2394 object->duplicator_visibility_flag = OB_DUPLI_FLAG_VIEWPORT | OB_DUPLI_FLAG_RENDER;
2395 }
2396 }
2397
2398 /* Cleanup deprecated flag from particle-settings data-blocks. */
2399 LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
2400 part->draw &= ~PART_DRAW_EMITTER;
2401 }
2402 }
2403
2404 /* SpaceTime & SpaceLogic removal/replacing */
2405 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 9)) {
2406 const wmWindowManager *wm = static_cast<wmWindowManager *>(bmain->wm.first);
2407 const Scene *scene = static_cast<Scene *>(bmain->scenes.first);
2408
2409 if (wm != nullptr) {
2410 /* Action editors need a scene for creation. First, update active
2411 * screens using the active scene of the window they're displayed in.
2412 * Next, update remaining screens using first scene in main listbase. */
2413
2414 LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
2415 const bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
2416 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2417 if (ELEM(area->butspacetype, SPACE_TIME, SPACE_LOGIC)) {
2419
2420 /* Don't forget to unset! */
2421 area->butspacetype = SPACE_EMPTY;
2422 }
2423 }
2424 }
2425 }
2426 if (scene != nullptr) {
2427 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2428 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2429 if (ELEM(area->butspacetype, SPACE_TIME, SPACE_LOGIC)) {
2430 /* Areas that were already handled won't be handled again */
2432
2433 /* Don't forget to unset! */
2434 area->butspacetype = SPACE_EMPTY;
2435 }
2436 }
2437 }
2438 }
2439 }
2440
2441 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 14)) {
2442 /* This code fixes crashes when loading early 2.80 development files, due to the lack of a
2443 * master collection after removal of the versioning code handling the 'SceneCollection' data
2444 * that was part of the very early 2.80 development (commit 23835a393c).
2445 *
2446 * NOTE: This code only ensures that there is no crash, since the whole collection hierarchy
2447 * from these files remain lost, these files will still need a lot of manual work if one want
2448 * to get them working properly again. Or just open and save them with an older release of
2449 * Blender (up to 3.6 included). */
2450 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2451 if (scene->master_collection == nullptr) {
2452 scene->master_collection = BKE_collection_master_add(scene);
2453 /* #BKE_layer_collection_sync accepts missing view-layer in a scene, but not invalid ones
2454 * where the first view-layer's layer-collection would not be for the Scene's master
2455 * collection. */
2456 LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
2457 if (LayerCollection *first_layer_collection = static_cast<LayerCollection *>(
2458 view_layer->layer_collections.first))
2459 {
2460 first_layer_collection->collection = scene->master_collection;
2461 }
2462 }
2463 }
2464 }
2465 }
2466
2467 /* Update Curve object Shape Key data layout to include the Radius property */
2468 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 23)) {
2469 LISTBASE_FOREACH (Curve *, cu, &bmain->curves) {
2470 if (!cu->key || cu->key->elemsize != sizeof(float[4])) {
2471 continue;
2472 }
2473
2474 cu->key->elemstr[0] = 3; /*KEYELEM_ELEM_SIZE_CURVE*/
2475 cu->key->elemsize = sizeof(float[3]);
2476
2477 int new_count = BKE_keyblock_curve_element_count(&cu->nurb);
2478
2479 LISTBASE_FOREACH (KeyBlock *, block, &cu->key->block) {
2480 int old_count = block->totelem;
2481 void *old_data = block->data;
2482
2483 if (!old_data || old_count <= 0) {
2484 continue;
2485 }
2486
2487 block->totelem = new_count;
2488 block->data = MEM_calloc_arrayN<float[3]>(new_count, __func__);
2489
2490 float *oldptr = static_cast<float *>(old_data);
2491 float (*newptr)[3] = static_cast<float (*)[3]>(block->data);
2492
2493 LISTBASE_FOREACH (Nurb *, nu, &cu->nurb) {
2494 if (nu->bezt) {
2495 BezTriple *bezt = nu->bezt;
2496
2497 for (int a = 0; a < nu->pntsu; a++, bezt++) {
2498 if ((old_count -= 3) < 0) {
2499 memcpy(newptr, bezt->vec, sizeof(float[3][3]));
2500 newptr[3][0] = bezt->tilt;
2501 }
2502 else {
2503 memcpy(newptr, oldptr, sizeof(float[3][4]));
2504 }
2505
2506 newptr[3][1] = bezt->radius;
2507
2508 oldptr += 3 * 4;
2509 newptr += 4; /*KEYELEM_ELEM_LEN_BEZTRIPLE*/
2510 }
2511 }
2512 else if (nu->bp) {
2513 BPoint *bp = nu->bp;
2514
2515 for (int a = 0; a < nu->pntsu * nu->pntsv; a++, bp++) {
2516 if (--old_count < 0) {
2517 copy_v3_v3(newptr[0], bp->vec);
2518 newptr[1][0] = bp->tilt;
2519 }
2520 else {
2521 memcpy(newptr, oldptr, sizeof(float[4]));
2522 }
2523
2524 newptr[1][1] = bp->radius;
2525
2526 oldptr += 4;
2527 newptr += 2; /*KEYELEM_ELEM_LEN_BPOINT*/
2528 }
2529 }
2530 }
2531
2532 MEM_freeN(old_data);
2533 }
2534 }
2535 }
2536
2537 /* Move B-Bone custom handle settings from bPoseChannel to Bone. */
2538 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 25)) {
2539 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2540 bArmature *arm = static_cast<bArmature *>(ob->data);
2541
2542 /* If it is an armature from the same file. */
2543 if (ob->pose && arm && arm->id.lib == ob->id.lib) {
2544 bool rebuild = false;
2545
2546 LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
2547 /* If the 2.7 flag is enabled, processing is needed. */
2548 if (pchan->bone && (pchan->bboneflag & PCHAN_BBONE_CUSTOM_HANDLES)) {
2549 /* If the settings in the Bone are not set, copy. */
2550 if (pchan->bone->bbone_prev_type == BBONE_HANDLE_AUTO &&
2551 pchan->bone->bbone_next_type == BBONE_HANDLE_AUTO &&
2552 pchan->bone->bbone_prev == nullptr && pchan->bone->bbone_next == nullptr)
2553 {
2554 pchan->bone->bbone_prev_type = (pchan->bboneflag & PCHAN_BBONE_CUSTOM_START_REL) ?
2557 pchan->bone->bbone_next_type = (pchan->bboneflag & PCHAN_BBONE_CUSTOM_END_REL) ?
2560
2561 if (pchan->bbone_prev) {
2562 pchan->bone->bbone_prev = pchan->bbone_prev->bone;
2563 }
2564 if (pchan->bbone_next) {
2565 pchan->bone->bbone_next = pchan->bbone_next->bone;
2566 }
2567 }
2568
2569 rebuild = true;
2570 pchan->bboneflag = 0;
2571 }
2572 }
2573
2574 /* Tag pose rebuild for all objects that use this armature. */
2575 if (rebuild) {
2576 LISTBASE_FOREACH (Object *, ob2, &bmain->objects) {
2577 if (ob2->pose && ob2->data == arm) {
2578 ob2->pose->flag |= POSE_RECALC;
2579 }
2580 }
2581 }
2582 }
2583 }
2584 }
2585
2586 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 30)) {
2587 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
2588 if (brush->gpencil_settings != nullptr) {
2589 brush->gpencil_brush_type = brush->gpencil_settings->brush_type;
2590 }
2591 }
2592 }
2593
2594 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 38)) {
2595 /* Ensure we get valid rigidbody object/constraint data in relevant collections' objects.
2596 */
2597 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2598 RigidBodyWorld *rbw = scene->rigidbody_world;
2599
2600 if (rbw == nullptr) {
2601 continue;
2602 }
2603
2606 }
2607 }
2608
2609 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 69)) {
2610 /* Unify DOF settings (EEVEE part only) */
2611 enum { SCE_EEVEE_DOF_ENABLED = (1 << 7) };
2612 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2613 if (STREQ(scene->r.engine, RE_engine_id_BLENDER_EEVEE)) {
2614 if (scene->eevee.flag & SCE_EEVEE_DOF_ENABLED) {
2615 Object *cam_ob = scene->camera;
2616 if (cam_ob && cam_ob->type == OB_CAMERA) {
2617 Camera *cam = static_cast<Camera *>(cam_ob->data);
2618 cam->dof.flag |= CAM_DOF_ENABLED;
2619 }
2620 }
2621 }
2622 }
2623
2624 LISTBASE_FOREACH (Camera *, camera, &bmain->cameras) {
2625 camera->dof.focus_object = camera->dof_ob;
2626 camera->dof.focus_distance = camera->dof_distance;
2627 camera->dof.aperture_fstop = camera->gpu_dof.fstop;
2628 camera->dof.aperture_rotation = camera->gpu_dof.rotation;
2629 camera->dof.aperture_ratio = camera->gpu_dof.ratio;
2630 camera->dof.aperture_blades = camera->gpu_dof.num_blades;
2631 camera->dof_ob = nullptr;
2632 }
2633 }
2634
2635 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 66)) {
2636 /* Shader node tree changes. After lib linking so we have all the type-info
2637 * pointers and updated sockets and we can use the high level node API to
2638 * manipulate nodes. */
2639 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2640 if (ntree->type != NTREE_SHADER) {
2641 continue;
2642 }
2643
2644 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 273, 5)) {
2645 /* Euler order was ZYX in previous versions. */
2646 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2648 }
2649 }
2650
2651 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 276, 6)) {
2652 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2654 }
2655 }
2656
2657 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 279, 2) ||
2658 (MAIN_VERSION_FILE_ATLEAST(bmain, 280, 0) && !MAIN_VERSION_FILE_ATLEAST(bmain, 280, 4)))
2659 {
2661 }
2662
2663 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 279, 3)) {
2664 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2666 }
2667 }
2668
2669 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 279, 4) ||
2670 (MAIN_VERSION_FILE_ATLEAST(bmain, 280, 0) && !MAIN_VERSION_FILE_ATLEAST(bmain, 280, 5)))
2671 {
2672 /* Switch to squared roughness convention */
2674 }
2675
2676 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 279, 5)) {
2678 }
2679
2680 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 66)) {
2681 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2683 }
2684 }
2685 }
2687 }
2688
2689 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 64)) {
2690 /* Unify Cycles and Eevee settings. */
2691 Scene *scene = static_cast<Scene *>(bmain->scenes.first);
2692 const char *engine = (scene) ? scene->r.engine : "CYCLES";
2693
2694 LISTBASE_FOREACH (Light *, light, &bmain->lights) {
2695 light_emission_unify(light, engine);
2696 }
2697 }
2698
2699 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 69)) {
2700 /* Unify Cycles and Eevee depth of field. */
2701 Scene *scene = static_cast<Scene *>(bmain->scenes.first);
2702 const char *engine = (scene) ? scene->r.engine : "CYCLES";
2703
2704 if (STREQ(engine, RE_engine_id_CYCLES)) {
2705 LISTBASE_FOREACH (Camera *, camera, &bmain->cameras) {
2706 IDProperty *ccamera = version_cycles_properties_from_ID(&camera->id);
2707 if (ccamera) {
2708 const bool is_fstop = version_cycles_property_int(ccamera, "aperture_type", 0) == 1;
2709
2710 camera->dof.aperture_fstop = version_cycles_property_float(
2711 ccamera, "aperture_fstop", 5.6f);
2712 camera->dof.aperture_blades = version_cycles_property_int(ccamera, "aperture_blades", 0);
2713 camera->dof.aperture_rotation = version_cycles_property_float(
2714 ccamera, "aperture_rotation", 0.0);
2715 camera->dof.aperture_ratio = version_cycles_property_float(
2716 ccamera, "aperture_ratio", 1.0f);
2717 camera->dof.flag |= CAM_DOF_ENABLED;
2718
2719 float aperture_size = version_cycles_property_float(ccamera, "aperture_size", 0.0f);
2720
2721 if (is_fstop) {
2722 continue;
2723 }
2724 if (aperture_size > 0.0f) {
2725 if (camera->type == CAM_ORTHO) {
2726 camera->dof.aperture_fstop = 1.0f / (2.0f * aperture_size);
2727 }
2728 else {
2729 camera->dof.aperture_fstop = (camera->lens * 1e-3f) / (2.0f * aperture_size);
2730 }
2731
2732 continue;
2733 }
2734 }
2735
2736 /* No depth of field, set default settings. */
2737 camera->dof.aperture_fstop = 2.8f;
2738 camera->dof.aperture_blades = 0;
2739 camera->dof.aperture_rotation = 0.0f;
2740 camera->dof.aperture_ratio = 1.0f;
2741 camera->dof.flag &= ~CAM_DOF_ENABLED;
2742 }
2743 }
2744 }
2745
2746 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 2)) {
2747 /* Replace Multiply and Additive blend mode by Alpha Blend
2748 * now that we use dual-source blending. */
2749 /* We take care of doing only node-trees that are always part of materials
2750 * with old blending modes. */
2751 enum {
2752 MA_BM_ADD = 1,
2753 MA_BM_MULTIPLY = 2,
2754 };
2755 LISTBASE_FOREACH (Material *, ma, &bmain->materials) {
2756 bNodeTree *ntree = ma->nodetree;
2757 if (ma->blend_method == MA_BM_ADD) {
2758 if (ma->use_nodes) {
2760 }
2761 ma->blend_method = MA_BM_BLEND;
2762 }
2763 else if (ma->blend_method == MA_BM_MULTIPLY) {
2764 if (ma->use_nodes) {
2766 }
2767 ma->blend_method = MA_BM_BLEND;
2768 }
2769 }
2770
2771 /* Update all ruler layers to set new flag. */
2772 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2773 bGPdata *gpd = scene->gpd;
2774 if (gpd == nullptr) {
2775 continue;
2776 }
2777 LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
2778 if (STREQ(gpl->info, "RulerData3D")) {
2779 gpl->flag |= GP_LAYER_IS_RULER;
2780 break;
2781 }
2782 }
2783 }
2784
2785 /* This versioning could probably be done only on earlier versions, not sure however
2786 * which exact version fully deprecated tessfaces, so think we can keep that one here, no
2787 * harm to be expected anyway for being over-conservative. */
2788 LISTBASE_FOREACH (Mesh *, me, &bmain->meshes) {
2789 /* Check if we need to convert mfaces to polys. */
2790 if (me->totface_legacy && !me->faces_num) {
2791 /* temporarily switch main so that reading from
2792 * external CustomData works */
2793 Main *orig_gmain = BKE_blender_globals_main_swap(bmain);
2794
2796
2797 Main *tmp_gmain = BKE_blender_globals_main_swap(orig_gmain);
2798 BLI_assert(tmp_gmain == bmain);
2799 UNUSED_VARS_NDEBUG(tmp_gmain);
2800 }
2801
2802 /* Deprecated, only kept for conversion. */
2804 }
2805 }
2806
2807 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 2)) {
2808 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2809 if (ntree->type == NTREE_SHADER) {
2811 }
2812 }
2814 }
2815
2816 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 3)) {
2817 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2818 if (ntree->type == NTREE_SHADER) {
2824 }
2825 }
2827 }
2828
2829 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 7)) {
2830 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2831 if (ntree->type == NTREE_SHADER) {
2833 }
2834 }
2836 }
2837
2838 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 8)) {
2839 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2840 if (ntree->type == NTREE_SHADER) {
2842 }
2843 }
2845 }
2846
2847 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 10)) {
2848 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2849 if (ntree->type == NTREE_SHADER) {
2851 }
2852 }
2854 }
2855
2856 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 11)) {
2857 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2858 if (ntree->type == NTREE_SHADER) {
2863 }
2864 }
2866 }
2867
2868 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 282, 2)) {
2869 /* Init all Vertex/Sculpt and Weight Paint brushes. */
2870 Material *ma;
2871 /* Pen Soft brush. */
2872 do_versions_rename_id(bmain, ID_BR, "Draw Soft", "Pencil Soft");
2873 do_versions_rename_id(bmain, ID_BR, "Draw Pencil", "Pencil");
2874 do_versions_rename_id(bmain, ID_BR, "Draw Pen", "Pen");
2875 do_versions_rename_id(bmain, ID_BR, "Draw Ink", "Ink Pen");
2876 do_versions_rename_id(bmain, ID_BR, "Draw Noise", "Ink Pen Rough");
2877 do_versions_rename_id(bmain, ID_BR, "Draw Marker", "Marker Bold");
2878 do_versions_rename_id(bmain, ID_BR, "Draw Block", "Marker Chisel");
2879
2880 ma = static_cast<Material *>(
2881 BLI_findstring(&bmain->materials, "Black", offsetof(ID, name) + 2));
2882 if (ma && ma->gp_style) {
2883 do_versions_rename_id(bmain, ID_MA, "Black", "Solid Stroke");
2884 }
2885 ma = static_cast<Material *>(BLI_findstring(&bmain->materials, "Red", offsetof(ID, name) + 2));
2886 if (ma && ma->gp_style) {
2887 do_versions_rename_id(bmain, ID_MA, "Red", "Squares Stroke");
2888 }
2889 ma = static_cast<Material *>(
2890 BLI_findstring(&bmain->materials, "Grey", offsetof(ID, name) + 2));
2891 if (ma && ma->gp_style) {
2892 do_versions_rename_id(bmain, ID_MA, "Grey", "Solid Fill");
2893 }
2894 ma = static_cast<Material *>(
2895 BLI_findstring(&bmain->materials, "Black Dots", offsetof(ID, name) + 2));
2896 if (ma && ma->gp_style) {
2897 do_versions_rename_id(bmain, ID_MA, "Black Dots", "Dots Stroke");
2898 }
2899
2900 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2901 ToolSettings *ts = scene->toolsettings;
2902
2903 /* Ensure new Paint modes. */
2908
2909 /* Enable cursor by default. */
2910 Paint *paint = &ts->gp_paint->paint;
2911 paint->flags |= PAINT_SHOW_BRUSH;
2912 }
2913 }
2914
2915 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 282, 4)) {
2916 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2917 if (ntree->type == NTREE_SHADER) {
2919 }
2920 }
2922 }
2923
2924 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 4)) {
2925 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2926 if (ntree->type == NTREE_SHADER) {
2928 }
2929 }
2931 }
2932
2933 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 8)) {
2934
2935 /* During development of Blender 2.80 the "Object.hide" property was
2936 * removed, and reintroduced in 5e968a996a53 as "Object.hide_viewport". */
2937 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2938 BKE_fcurves_id_cb(&ob->id, [&](ID * /*id*/, FCurve *fcu) {
2939 if (fcu->rna_path == nullptr || !STREQ(fcu->rna_path, "hide")) {
2940 return;
2941 }
2942
2943 MEM_freeN(fcu->rna_path);
2944 fcu->rna_path = BLI_strdupn("hide_viewport", 13);
2945 });
2946 }
2947
2948 /* Reset all grease pencil brushes. */
2949 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2950 /* Ensure new Paint modes. */
2954 }
2955 }
2956
2957 /* Old forgotten versioning code. */
2958 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 300, 39)) {
2959 /* Paint Brush. This ensure that the brush paints by default. Used during the development and
2960 * patch review of the initial Sculpt Vertex Colors implementation (D5975) */
2961 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
2962 if (brush->ob_mode & OB_MODE_SCULPT && brush->sculpt_brush_type == SCULPT_BRUSH_TYPE_PAINT) {
2963 brush->tip_roundness = 1.0f;
2964 brush->flow = 1.0f;
2965 brush->density = 1.0f;
2966 brush->tip_scale_x = 1.0f;
2967 }
2968 }
2969
2970 /* Pose Brush with support for loose parts. */
2971 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
2972 if (brush->sculpt_brush_type == SCULPT_BRUSH_TYPE_POSE &&
2973 brush->disconnected_distance_max == 0.0f)
2974 {
2975 brush->flag2 |= BRUSH_USE_CONNECTED_ONLY;
2976 brush->disconnected_distance_max = 0.1f;
2977 }
2978 }
2979
2980 /* 2.8x dropped support for non-empty dupli instances. but proper do-versioning was never
2981 * done correctly. So added here as a 'safe' place version wise, always better than in
2982 * readfile lib-linking code! */
2983 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2984 if (ob->type != OB_EMPTY && ob->instance_collection != nullptr) {
2985 BLO_reportf_wrap(fd->reports,
2986 RPT_INFO,
2987 RPT_("Non-Empty object '%s' cannot duplicate collection '%s' "
2988 "anymore in Blender 2.80 and later, removed instancing"),
2989 ob->id.name + 2,
2990 ob->instance_collection->id.name + 2);
2991 ob->instance_collection = nullptr;
2992 ob->transflag &= ~OB_DUPLICOLLECTION;
2993 }
2994 }
2995 }
2996
3003}
3004
3005/* NOTE: This version patch is intended for versions < 2.52.2,
3006 * but was initially introduced in 2.27 already.
3007 * But in 2.79 another case generating non-unique names was discovered
3008 * (see #55668, involving Meta strips). */
3010{
3011 LISTBASE_FOREACH (Strip *, strip, seqbasep) {
3013 if (strip->seqbase.first != nullptr) {
3014 do_versions_seq_unique_name_all_strips(sce, &strip->seqbase);
3015 }
3016 }
3017}
3018
3023
3024static bool strip_update_flags_cb(Strip *strip, void * /*user_data*/)
3025{
3026 strip->flag &= ~((1 << 6) | (1 << 18) | (1 << 19) | (1 << 21));
3027 if (strip->type == STRIP_TYPE_SPEED) {
3030 }
3031 return true;
3032}
3033
3040
3041/* NOLINTNEXTLINE: readability-function-size */
3042void blo_do_versions_280(FileData *fd, Library * /*lib*/, Main *bmain)
3043{
3044 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 0)) {
3045 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3046 scene->r.gauss = 1.5f;
3047 }
3048 }
3049
3050 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 1)) {
3051 if (!DNA_struct_member_exists(fd->filesdna, "GPUDOFSettings", "float", "ratio")) {
3052 LISTBASE_FOREACH (Camera *, ca, &bmain->cameras) {
3053 ca->gpu_dof.ratio = 1.0f;
3054 }
3055 }
3056
3057 /* MTexPoly now removed. */
3058 if (DNA_struct_exists(fd->filesdna, "MTexPoly")) {
3059 LISTBASE_FOREACH (Mesh *, me, &bmain->meshes) {
3060 /* If we have UVs, so this file will have MTexPoly layers too! */
3061 if (CustomData_has_layer(&me->corner_data, CD_MLOOPUV) ||
3062 CustomData_has_layer(&me->corner_data, CD_PROP_FLOAT2))
3063 {
3064 CustomData_update_typemap(&me->face_data);
3065 CustomData_free_layers(&me->face_data, CD_MTEXPOLY);
3066 }
3067 }
3068 }
3069 }
3070
3071 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 2)) {
3072 if (!DNA_struct_member_exists(fd->filesdna, "Light", "float", "cascade_max_dist")) {
3073 LISTBASE_FOREACH (Light *, la, &bmain->lights) {
3074 la->cascade_max_dist = 1000.0f;
3075 la->cascade_count = 4;
3076 la->cascade_exponent = 0.8f;
3077 la->cascade_fade = 0.1f;
3078 }
3079 }
3080
3081 if (!DNA_struct_member_exists(fd->filesdna, "LightProbe", "float", "vis_bias")) {
3082 LISTBASE_FOREACH (LightProbe *, probe, &bmain->lightprobes) {
3083 probe->vis_bias = 1.0f;
3084 probe->vis_blur = 0.2f;
3085 }
3086 }
3087
3088 /* Eevee shader nodes renamed because of the output node system.
3089 * Note that a new output node is not being added here, because it would be overkill
3090 * to handle this case in lib_verify_nodetree.
3091 *
3092 * Also, metallic node is now unified into the principled node. */
3094
3095 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
3096 if (ntree->type == NTREE_SHADER) {
3097 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
3098 if (node->type_legacy == 194 /* SH_NODE_EEVEE_METALLIC */ &&
3099 STREQ(node->idname, "ShaderNodeOutputMetallic"))
3100 {
3101 STRNCPY_UTF8(node->idname, "ShaderNodeEeveeMetallic");
3103 }
3104
3105 else if (node->type_legacy == SH_NODE_EEVEE_SPECULAR &&
3106 STREQ(node->idname, "ShaderNodeOutputSpecular"))
3107 {
3108 STRNCPY_UTF8(node->idname, "ShaderNodeEeveeSpecular");
3110 }
3111
3112 else if (node->type_legacy == 196 /* SH_NODE_OUTPUT_EEVEE_MATERIAL */ &&
3113 STREQ(node->idname, "ShaderNodeOutputEeveeMaterial"))
3114 {
3115 node->type_legacy = SH_NODE_OUTPUT_MATERIAL;
3116 STRNCPY_UTF8(node->idname, "ShaderNodeOutputMaterial");
3117 }
3118
3119 else if (node->type_legacy == 194 /* SH_NODE_EEVEE_METALLIC */ &&
3120 STREQ(node->idname, "ShaderNodeEeveeMetallic"))
3121 {
3122 node->type_legacy = SH_NODE_BSDF_PRINCIPLED;
3123 STRNCPY_UTF8(node->idname, "ShaderNodeBsdfPrincipled");
3124 node->custom1 = SHD_GLOSSY_MULTI_GGX;
3126 }
3127 }
3128 }
3129 }
3131
3134 {
3135 BKE_report(fd->reports != nullptr ? fd->reports->reports : nullptr,
3136 RPT_ERROR,
3137 "Eevee material conversion problem. Error in console");
3138 printf(
3139 "You need to connect Principled and Eevee Specular shader nodes to new material "
3140 "output "
3141 "nodes.\n");
3142 }
3143
3146 {
3147 BKE_report(fd->reports != nullptr ? fd->reports->reports : nullptr,
3148 RPT_ERROR,
3149 "Eevee material conversion problem. Error in console");
3150 printf(
3151 "You need to combine transparency and emission shaders to the converted Principled "
3152 "shader nodes.\n");
3153 }
3154
3155 {
3156 /* Init grease pencil edit line color */
3157 if (!DNA_struct_member_exists(fd->filesdna, "bGPdata", "float", "line_color[4]")) {
3158 LISTBASE_FOREACH (bGPdata *, gpd, &bmain->gpencils) {
3159 ARRAY_SET_ITEMS(gpd->line_color, 0.6f, 0.6f, 0.6f, 0.5f);
3160 }
3161 }
3162
3163 /* Init grease pencil pixel size factor */
3164 if (!DNA_struct_member_exists(fd->filesdna, "bGPdata", "float", "pixfactor")) {
3165 LISTBASE_FOREACH (bGPdata *, gpd, &bmain->gpencils) {
3166 gpd->pixfactor = GP_DEFAULT_PIX_FACTOR;
3167 }
3168 }
3169
3170 /* Grease pencil multi-frame falloff curve. */
3171 if (!DNA_struct_member_exists(
3172 fd->filesdna, "GP_Sculpt_Settings", "CurveMapping", "cur_falloff"))
3173 {
3174 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3175 /* sculpt brushes */
3176 GP_Sculpt_Settings &gset = scene->toolsettings->gp_sculpt;
3177 if (gset.cur_falloff == nullptr) {
3178 gset.cur_falloff = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
3181 &gset.cur_falloff->clipr,
3184 }
3185 }
3186 }
3187 }
3188
3189 /* 2.79 style Maintain Volume mode. */
3190 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
3192 if (ob->pose) {
3193 LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
3195 }
3196 }
3197 }
3198 }
3199
3200 /* Files from this version included do get a valid `win->screen` pointer written for backward
3201 * compatibility, however this should never be used nor needed, so clear these pointers here. */
3202 if (MAIN_VERSION_FILE_ATLEAST(bmain, 280, 1)) {
3203 LISTBASE_FOREACH (wmWindowManager *, wm, &bmain->wm) {
3204 LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
3205 win->screen = nullptr;
3206 }
3207 }
3208 }
3209
3210 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 3)) {
3211 /* init grease pencil grids and paper */
3212 if (!DNA_struct_member_exists(
3213 fd->filesdna, "View3DOverlay", "float", "gpencil_paper_color[3]"))
3214 {
3215 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3216 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3217 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3218 if (sl->spacetype == SPACE_VIEW3D) {
3219 View3D *v3d = reinterpret_cast<View3D *>(sl);
3220 v3d->overlay.gpencil_paper_opacity = 0.5f;
3221 v3d->overlay.gpencil_grid_opacity = 0.9f;
3222 }
3223 }
3224 }
3225 }
3226 }
3227 }
3228
3229 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 6)) {
3230 if (DNA_struct_member_exists(fd->filesdna, "SpaceOutliner", "int", "filter") == false) {
3231 /* Update files using invalid (outdated) outlinevis Outliner values. */
3232 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3233 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3234 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3235 if (sl->spacetype == SPACE_OUTLINER) {
3236 SpaceOutliner *space_outliner = (SpaceOutliner *)sl;
3237
3238 if (!ELEM(space_outliner->outlinevis,
3239 SO_SCENES,
3244 {
3245 space_outliner->outlinevis = SO_VIEW_LAYER;
3246 }
3247 }
3248 }
3249 }
3250 }
3251 }
3252
3253 if (!DNA_struct_member_exists(fd->filesdna, "LightProbe", "float", "intensity")) {
3254 LISTBASE_FOREACH (LightProbe *, probe, &bmain->lightprobes) {
3255 probe->intensity = 1.0f;
3256 }
3257 }
3258
3259 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3260 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3261 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3262 if (sl->spacetype == SPACE_VIEW3D) {
3263 View3D *v3d = (View3D *)sl;
3266
3267 /* Assume (demo) files written with 2.8 want to show
3268 * Eevee renders in the viewport. */
3269 if (MAIN_VERSION_FILE_ATLEAST(bmain, 280, 0)) {
3270 v3d->drawtype = OB_MATERIAL;
3271 }
3272 }
3273 }
3274 }
3275 }
3276 }
3277
3278 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 7)) {
3279 /* Render engine storage moved elsewhere and back during 2.8
3280 * development, we assume any files saved in 2.8 had Eevee set
3281 * as scene render engine. */
3282 if (MAIN_VERSION_FILE_ATLEAST(bmain, 280, 0)) {
3283 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3284 STRNCPY_UTF8(scene->r.engine, RE_engine_id_BLENDER_EEVEE);
3285 }
3286 }
3287 }
3288
3289 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 8)) {
3290 /* Blender Internal removal */
3291 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3292 if (STR_ELEM(scene->r.engine, "BLENDER_RENDER", "BLENDER_GAME")) {
3293 STRNCPY_UTF8(scene->r.engine, RE_engine_id_BLENDER_EEVEE);
3294 }
3295 }
3296
3297 LISTBASE_FOREACH (Tex *, tex, &bmain->textures) {
3298 /* Removed environment map, point-density, voxel-data, ocean textures. */
3299 if (ELEM(tex->type, 10, 14, 15, 16)) {
3300 tex->type = 0;
3301 }
3302 }
3303 }
3304
3305 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 11)) {
3306
3307 /* Remove info editor, but only if at the top of the window. */
3308 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3309 /* Calculate window width/height from screen vertices */
3310 int win_width = 0, win_height = 0;
3311 LISTBASE_FOREACH (ScrVert *, vert, &screen->vertbase) {
3312 win_width = std::max<int>(win_width, vert->vec.x);
3313 win_height = std::max<int>(win_height, vert->vec.y);
3314 }
3315
3316 for (ScrArea *area = static_cast<ScrArea *>(screen->areabase.first), *area_next; area;
3317 area = area_next)
3318 {
3319 area_next = static_cast<ScrArea *>(area->next);
3320
3321 if (area->spacetype == SPACE_INFO) {
3322 if ((area->v2->vec.y == win_height) && (area->v1->vec.x == 0) &&
3323 (area->v4->vec.x == win_width))
3324 {
3326
3327 BLI_remlink(&screen->areabase, area);
3328
3332
3333 MEM_freeN(area);
3334 }
3335 }
3336 /* AREA_TEMP_INFO is deprecated from now on, it should only be set for info areas
3337 * which are deleted above, so don't need to unset it. Its slot/bit can be reused */
3338 }
3339 }
3340 }
3341
3342 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 11)) {
3343 LISTBASE_FOREACH (Light *, la, &bmain->lights) {
3344 if (la->mode & (1 << 13)) { /* LA_SHAD_RAY */
3345 la->mode |= LA_SHADOW;
3346 la->mode &= ~(1 << 13);
3347 }
3348 }
3349 }
3350
3351 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 12)) {
3352 /* Remove tool property regions. */
3353 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3354 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3355 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3356 if (ELEM(sl->spacetype, SPACE_VIEW3D, SPACE_CLIP)) {
3357 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
3358 &sl->regionbase;
3359
3360 for (ARegion *region = static_cast<ARegion *>(regionbase->first), *region_next; region;
3361 region = region_next)
3362 {
3363 region_next = static_cast<ARegion *>(region->next);
3364
3365 if (region->regiontype == RGN_TYPE_TOOL_PROPS) {
3366 BKE_area_region_free(nullptr, region);
3367 BLI_freelinkN(regionbase, region);
3368 }
3369 }
3370 }
3371 }
3372 }
3373 }
3374 }
3375
3376 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 13)) {
3377 /* Initialize specular factor. */
3378 if (!DNA_struct_member_exists(fd->filesdna, "Light", "float", "spec_fac")) {
3379 LISTBASE_FOREACH (Light *, la, &bmain->lights) {
3380 la->spec_fac = 1.0f;
3381 }
3382 }
3383
3384 /* Initialize new view3D options. */
3385 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3386 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3387 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3388 if (sl->spacetype == SPACE_VIEW3D) {
3389 View3D *v3d = (View3D *)sl;
3392 copy_v3_fl(v3d->shading.single_color, 0.8f);
3393 v3d->shading.shadow_intensity = 0.5;
3394
3395 v3d->overlay.normals_length = 0.1f;
3396 v3d->overlay.flag = 0;
3397 }
3398 }
3399 }
3400 }
3401 }
3402
3403 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 14)) {
3404 if (!DNA_struct_member_exists(fd->filesdna, "Scene", "SceneDisplay", "display")) {
3405 /* Initialize new scene.SceneDisplay */
3406 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3407 const float vector[3] = {-M_SQRT1_3, -M_SQRT1_3, M_SQRT1_3};
3408 copy_v3_v3(scene->display.light_direction, vector);
3409 }
3410 }
3411 if (!DNA_struct_member_exists(fd->filesdna, "SceneDisplay", "float", "shadow_shift")) {
3412 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3413 scene->display.shadow_shift = 0.1;
3414 }
3415 }
3416
3417 if (!DNA_struct_member_exists(fd->filesdna, "ToolSettings", "char", "transform_pivot_point")) {
3418 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3419 scene->toolsettings->transform_pivot_point = V3D_AROUND_CENTER_MEDIAN;
3420 }
3421 }
3422
3423 if (!DNA_struct_exists(fd->filesdna, "SceneEEVEE")) {
3424 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3425 /* First set the default for all the properties. */
3426
3427 scene->eevee.gi_diffuse_bounces = 3;
3428 scene->eevee.gi_cubemap_resolution = 512;
3429 scene->eevee.gi_visibility_resolution = 32;
3430
3431 scene->eevee.taa_samples = 16;
3432 scene->eevee.taa_render_samples = 64;
3433
3434 scene->eevee.volumetric_start = 0.1f;
3435 scene->eevee.volumetric_end = 100.0f;
3436 scene->eevee.volumetric_tile_size = 8;
3437 scene->eevee.volumetric_samples = 64;
3438 scene->eevee.volumetric_sample_distribution = 0.8f;
3439 scene->eevee.volumetric_light_clamp = 0.0f;
3440 scene->eevee.volumetric_shadow_samples = 16;
3441
3442 scene->eevee.gtao_distance = 0.2f;
3443 scene->eevee.fast_gi_quality = 0.25f;
3444
3445 scene->eevee.bokeh_max_size = 100.0f;
3446 scene->eevee.bokeh_threshold = 1.0f;
3447
3448 scene->eevee.motion_blur_samples = 8;
3449 scene->eevee.motion_blur_shutter_deprecated = 0.5f;
3450
3451 scene->eevee.shadow_cube_size_deprecated = 512;
3452
3453 scene->eevee.flag = SCE_EEVEE_TAA_REPROJECTION;
3454
3455 /* If the file is pre-2.80 move on. */
3456 if (scene->layer_properties == nullptr) {
3457 continue;
3458 }
3459
3460 /* Now we handle eventual properties that may be set in the file. */
3461#define EEVEE_GET_BOOL(_props, _name, _flag) \
3462 { \
3463 IDProperty *_idprop = IDP_GetPropertyFromGroup(_props, #_name); \
3464 if (_idprop != nullptr) { \
3465 const int _value = IDP_int_get(_idprop); \
3466 if (_value) { \
3467 scene->eevee.flag |= _flag; \
3468 } \
3469 else { \
3470 scene->eevee.flag &= ~_flag; \
3471 } \
3472 } \
3473 } \
3474 ((void)0)
3475
3476#define EEVEE_GET_INT(_props, _name) \
3477 { \
3478 IDProperty *_idprop = IDP_GetPropertyFromGroup(_props, #_name); \
3479 if (_idprop != nullptr) { \
3480 scene->eevee._name = IDP_int_get(_idprop); \
3481 } \
3482 } \
3483 ((void)0)
3484
3485#define EEVEE_GET_FLOAT(_props, _name) \
3486 { \
3487 IDProperty *_idprop = IDP_GetPropertyFromGroup(_props, #_name); \
3488 if (_idprop != nullptr) { \
3489 scene->eevee._name = IDP_float_get(_idprop); \
3490 } \
3491 } \
3492 ((void)0)
3493
3494#define EEVEE_GET_FLOAT_ARRAY(_props, _name, _length) \
3495 { \
3496 IDProperty *_idprop = IDP_GetPropertyFromGroup(_props, #_name); \
3497 if (_idprop != nullptr) { \
3498 const float *_values = static_cast<float *>(IDP_Array(_idprop)); \
3499 for (int _i = 0; _i < _length; _i++) { \
3500 scene->eevee._name[_i] = _values[_i]; \
3501 } \
3502 } \
3503 } \
3504 ((void)0)
3505 enum { SCE_EEVEE_DOF_ENABLED = (1 << 7) };
3506 IDProperty *props = IDP_GetPropertyFromGroup(scene->layer_properties,
3508 // EEVEE_GET_BOOL(props, volumetric_enable, SCE_EEVEE_VOLUMETRIC_ENABLED);
3509 // EEVEE_GET_BOOL(props, volumetric_lights, SCE_EEVEE_VOLUMETRIC_LIGHTS);
3510 // EEVEE_GET_BOOL(props, volumetric_shadows, SCE_EEVEE_VOLUMETRIC_SHADOWS);
3511 EEVEE_GET_BOOL(props, gtao_enable, SCE_EEVEE_GTAO_ENABLED);
3512 // EEVEE_GET_BOOL(props, gtao_use_bent_normals, SCE_EEVEE_GTAO_BENT_NORMALS);
3513 // EEVEE_GET_BOOL(props, gtao_bounce, SCE_EEVEE_GTAO_BOUNCE);
3514 EEVEE_GET_BOOL(props, dof_enable, SCE_EEVEE_DOF_ENABLED);
3515 // EEVEE_GET_BOOL(props, bloom_enable, SCE_EEVEE_BLOOM_ENABLED);
3516 EEVEE_GET_BOOL(props, motion_blur_enable, SCE_EEVEE_MOTION_BLUR_ENABLED_DEPRECATED);
3517 // EEVEE_GET_BOOL(props, shadow_high_bitdepth, SCE_EEVEE_SHADOW_HIGH_BITDEPTH);
3518 EEVEE_GET_BOOL(props, taa_reprojection, SCE_EEVEE_TAA_REPROJECTION);
3519 // EEVEE_GET_BOOL(props, sss_enable, SCE_EEVEE_SSS_ENABLED);
3520 // EEVEE_GET_BOOL(props, sss_separate_albedo, SCE_EEVEE_SSS_SEPARATE_ALBEDO);
3521 EEVEE_GET_BOOL(props, ssr_enable, SCE_EEVEE_SSR_ENABLED);
3522 // EEVEE_GET_BOOL(props, ssr_refraction, SCE_EEVEE_SSR_REFRACTION);
3523 // EEVEE_GET_BOOL(props, ssr_halfres, SCE_EEVEE_SSR_HALF_RESOLUTION);
3524
3525 EEVEE_GET_INT(props, gi_diffuse_bounces);
3526 EEVEE_GET_INT(props, gi_diffuse_bounces);
3527 EEVEE_GET_INT(props, gi_cubemap_resolution);
3528 EEVEE_GET_INT(props, gi_visibility_resolution);
3529
3530 EEVEE_GET_INT(props, taa_samples);
3531 EEVEE_GET_INT(props, taa_render_samples);
3532
3533 // EEVEE_GET_INT(props, sss_samples);
3534 // EEVEE_GET_FLOAT(props, sss_jitter_threshold);
3535
3536 // EEVEE_GET_FLOAT(props, ssr_quality);
3537 // EEVEE_GET_FLOAT(props, ssr_max_roughness);
3538 // EEVEE_GET_FLOAT(props, ssr_thickness);
3539 // EEVEE_GET_FLOAT(props, ssr_border_fade);
3540 // EEVEE_GET_FLOAT(props, ssr_firefly_fac);
3541
3542 EEVEE_GET_FLOAT(props, volumetric_start);
3543 EEVEE_GET_FLOAT(props, volumetric_end);
3544 EEVEE_GET_INT(props, volumetric_tile_size);
3545 EEVEE_GET_INT(props, volumetric_samples);
3546 EEVEE_GET_FLOAT(props, volumetric_sample_distribution);
3547 EEVEE_GET_FLOAT(props, volumetric_light_clamp);
3548 EEVEE_GET_INT(props, volumetric_shadow_samples);
3549
3550 // EEVEE_GET_FLOAT(props, gtao_distance);
3551 // EEVEE_GET_FLOAT(props, gtao_factor);
3552 EEVEE_GET_FLOAT(props, fast_gi_quality);
3553
3554 EEVEE_GET_FLOAT(props, bokeh_max_size);
3555 EEVEE_GET_FLOAT(props, bokeh_threshold);
3556
3557 // EEVEE_GET_FLOAT_ARRAY(props, bloom_color, 3);
3558 // EEVEE_GET_FLOAT(props, bloom_threshold);
3559 // EEVEE_GET_FLOAT(props, bloom_knee);
3560 // EEVEE_GET_FLOAT(props, bloom_intensity);
3561 // EEVEE_GET_FLOAT(props, bloom_radius);
3562 // EEVEE_GET_FLOAT(props, bloom_clamp);
3563
3564 EEVEE_GET_INT(props, motion_blur_samples);
3565 EEVEE_GET_FLOAT(props, motion_blur_shutter_deprecated);
3566
3567 // EEVEE_GET_INT(props, shadow_method);
3568 EEVEE_GET_INT(props, shadow_cube_size_deprecated);
3569 // EEVEE_GET_INT(props, shadow_cascade_size);
3570
3571 /* Cleanup. */
3572 IDP_FreeProperty(scene->layer_properties);
3573 scene->layer_properties = nullptr;
3574
3575#undef EEVEE_GET_FLOAT_ARRAY
3576#undef EEVEE_GET_FLOAT
3577#undef EEVEE_GET_INT
3578#undef EEVEE_GET_BOOL
3579 }
3580 }
3581
3582 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 15)) {
3583 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3584 scene->display.matcap_ssao_distance = 0.2f;
3585 scene->display.matcap_ssao_attenuation = 1.0f;
3586 scene->display.matcap_ssao_samples = 16;
3587 }
3588
3589 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3590 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3591 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3592 if (sl->spacetype == SPACE_OUTLINER) {
3593 SpaceOutliner *space_outliner = (SpaceOutliner *)sl;
3594 space_outliner->filter_id_type = ID_GR;
3595 space_outliner->outlinevis = SO_VIEW_LAYER;
3596 }
3597 }
3598 }
3599 }
3600
3601 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3602 switch (scene->toolsettings->snap_mode) {
3603 case 0:
3604 scene->toolsettings->snap_mode = (1 << 4); /* SCE_SNAP_TO_INCREMENT */
3605 break;
3606 case 1:
3607 scene->toolsettings->snap_mode = (1 << 0); /* SCE_SNAP_TO_VERTEX */
3608 break;
3609 case 2:
3610 scene->toolsettings->snap_mode = (1 << 1); /* SCE_SNAP_TO_EDGE */
3611 break;
3612 case 3:
3613 scene->toolsettings->snap_mode = (1 << 2); /* SCE_SNAP_INDIVIDUAL_PROJECT */
3614 break;
3615 case 4:
3616 scene->toolsettings->snap_mode = (1 << 3); /* SCE_SNAP_TO_VOLUME */
3617 break;
3618 }
3619 switch (scene->toolsettings->snap_node_mode) {
3620 case 5:
3621 scene->toolsettings->snap_node_mode = (1 << 5); /* SCE_SNAP_TO_NODE_X */
3622 break;
3623 case 6:
3624 scene->toolsettings->snap_node_mode = (1 << 6); /* SCE_SNAP_TO_NODE_Y */
3625 break;
3626 case 7:
3627 scene->toolsettings->snap_node_mode =
3628 (1 << 5) | (1 << 6); /* SCE_SNAP_TO_NODE_X | SCE_SNAP_TO_NODE_Y */
3629 break;
3630 case 8:
3631 scene->toolsettings->snap_node_mode = (1 << 7); /* SCE_SNAP_TO_GRID */
3632 break;
3633 }
3634 switch (scene->toolsettings->snap_uv_mode) {
3635 case 0:
3636 scene->toolsettings->snap_uv_mode = (1 << 4); /* SCE_SNAP_TO_INCREMENT */
3637 break;
3638 case 1:
3639 scene->toolsettings->snap_uv_mode = (1 << 0); /* SCE_SNAP_TO_VERTEX */
3640 break;
3641 }
3642 }
3643
3644 LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
3645 part->shape_flag = PART_SHAPE_CLOSE_TIP;
3646 part->shape = 0.0f;
3647 part->rad_root = 1.0f;
3648 part->rad_tip = 0.0f;
3649 part->rad_scale = 0.01f;
3650 }
3651 }
3652 }
3653
3654 /* Particle shape shared with Eevee. */
3655 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 16)) {
3656 LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
3658
3659 if (cpart) {
3660 part->shape = version_cycles_property_float(cpart, "shape", 0.0);
3661 part->rad_root = version_cycles_property_float(cpart, "root_width", 1.0);
3662 part->rad_tip = version_cycles_property_float(cpart, "tip_width", 0.0);
3663 part->rad_scale = version_cycles_property_float(cpart, "radius_scale", 0.01);
3664 if (version_cycles_property_boolean(cpart, "use_closetip", true)) {
3665 part->shape_flag |= PART_SHAPE_CLOSE_TIP;
3666 }
3667 }
3668 }
3669 }
3670
3671 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 18)) {
3672 if (!DNA_struct_member_exists(fd->filesdna, "Material", "float", "roughness")) {
3673 LISTBASE_FOREACH (Material *, mat, &bmain->materials) {
3674 if (mat->use_nodes) {
3675 if (MAIN_VERSION_FILE_ATLEAST(bmain, 280, 0)) {
3676 mat->roughness = mat->gloss_mir;
3677 }
3678 else {
3679 mat->roughness = 0.25f;
3680 }
3681 }
3682 else {
3683 mat->roughness = 1.0f - mat->gloss_mir;
3684 }
3685 mat->metallic = mat->ray_mirror;
3686 }
3687
3688 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3689 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3690 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3691 if (sl->spacetype == SPACE_VIEW3D) {
3692 View3D *v3d = (View3D *)sl;
3694 }
3695 }
3696 }
3697 }
3698 }
3699
3700 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "float", "xray_alpha")) {
3701 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3702 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3703 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3704 if (sl->spacetype == SPACE_VIEW3D) {
3705 View3D *v3d = (View3D *)sl;
3706 v3d->shading.xray_alpha = 0.5f;
3707 }
3708 }
3709 }
3710 }
3711 }
3712 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "char", "matcap[256]")) {
3714 /* when loading the internal file is loaded before the matcaps */
3715 if (default_matcap) {
3716 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3717 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3718 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3719 if (sl->spacetype == SPACE_VIEW3D) {
3720 View3D *v3d = (View3D *)sl;
3721 STRNCPY(v3d->shading.matcap, default_matcap->name);
3722 }
3723 }
3724 }
3725 }
3726 }
3727 }
3728 if (!DNA_struct_member_exists(fd->filesdna, "View3DOverlay", "float", "wireframe_threshold")) {
3729 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3730 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3731 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3732 if (sl->spacetype == SPACE_VIEW3D) {
3733 View3D *v3d = (View3D *)sl;
3734 v3d->overlay.wireframe_threshold = 0.5f;
3735 }
3736 }
3737 }
3738 }
3739 }
3740 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "float", "cavity_valley_factor"))
3741 {
3742 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3743 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3744 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3745 if (sl->spacetype == SPACE_VIEW3D) {
3746 View3D *v3d = (View3D *)sl;
3747 v3d->shading.cavity_valley_factor = 1.0f;
3748 v3d->shading.cavity_ridge_factor = 1.0f;
3749 }
3750 }
3751 }
3752 }
3753 }
3754 if (!DNA_struct_member_exists(fd->filesdna, "View3DOverlay", "float", "xray_alpha_bone")) {
3755 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3756 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3757 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3758 if (sl->spacetype == SPACE_VIEW3D) {
3759 View3D *v3d = (View3D *)sl;
3760 v3d->overlay.xray_alpha_bone = 0.5f;
3761 }
3762 }
3763 }
3764 }
3765 }
3766 }
3767
3768 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 19)) {
3769 if (!DNA_struct_member_exists(fd->filesdna, "Image", "ListBase", "renderslot")) {
3770 LISTBASE_FOREACH (Image *, ima, &bmain->images) {
3771 if (ima->type == IMA_TYPE_R_RESULT) {
3772 for (int i = 0; i < 8; i++) {
3773 RenderSlot *slot = MEM_callocN<RenderSlot>("Image Render Slot Init");
3774 SNPRINTF_UTF8(slot->name, "Slot %d", i + 1);
3775 BLI_addtail(&ima->renderslots, slot);
3776 }
3777 }
3778 }
3779 }
3780 if (!DNA_struct_member_exists(fd->filesdna, "SpaceAction", "char", "mode_prev")) {
3781 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3782 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3783 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3784 if (sl->spacetype == SPACE_ACTION) {
3785 SpaceAction *saction = (SpaceAction *)sl;
3786 /* "Dope-sheet" should be default here,
3787 * unless it looks like the Action Editor was active instead. */
3788 if ((saction->mode_prev == 0) && (saction->action == nullptr)) {
3789 saction->mode_prev = SACTCONT_DOPESHEET;
3790 }
3791 }
3792 }
3793 }
3794 }
3795 }
3796
3797 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3798 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3799 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3800 if (sl->spacetype == SPACE_VIEW3D) {
3801 View3D *v3d = (View3D *)sl;
3802 if (v3d->drawtype == OB_TEXTURE) {
3803 v3d->drawtype = OB_SOLID;
3806 }
3807 }
3808 }
3809 }
3810 }
3811 }
3812
3813 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 21)) {
3814 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
3815 if (sce->ed != nullptr && sce->ed->seqbase.first != nullptr) {
3816 do_versions_seq_unique_name_all_strips(sce, &sce->ed->seqbase);
3817 }
3818 }
3819
3820 if (!DNA_struct_member_exists(
3821 fd->filesdna, "View3DOverlay", "float", "texture_paint_mode_opacity"))
3822 {
3823 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3824 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3825 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3826 if (sl->spacetype == SPACE_VIEW3D) {
3827 enum {
3828 V3D_SHOW_MODE_SHADE_OVERRIDE = (1 << 15),
3829 };
3830 View3D *v3d = (View3D *)sl;
3831 float alpha = (v3d->flag2 & V3D_SHOW_MODE_SHADE_OVERRIDE) ? 0.0f : 1.0f;
3835 }
3836 }
3837 }
3838 }
3839 }
3840
3841 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "char", "background_type")) {
3842 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3843 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3844 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3845 if (sl->spacetype == SPACE_VIEW3D) {
3846 View3D *v3d = (View3D *)sl;
3847 copy_v3_fl(v3d->shading.background_color, 0.05f);
3848 }
3849 }
3850 }
3851 }
3852 }
3853
3854 if (!DNA_struct_member_exists(
3855 fd->filesdna, "RigidBodyWorld", "RigidBodyWorld_Shared", "*shared"))
3856 {
3857 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3858 RigidBodyWorld *rbw = scene->rigidbody_world;
3859
3860 if (rbw == nullptr) {
3861 continue;
3862 }
3863
3864 if (rbw->shared == nullptr) {
3865 rbw->shared = MEM_callocN<RigidBodyWorld_Shared>("RigidBodyWorld_Shared");
3867 }
3868
3869 /* Move shared pointers from deprecated location to current location */
3870 rbw->shared->pointcache = rbw->pointcache;
3871 rbw->shared->ptcaches = rbw->ptcaches;
3872
3873 rbw->pointcache = nullptr;
3874 BLI_listbase_clear(&rbw->ptcaches);
3875
3876 if (rbw->shared->pointcache == nullptr) {
3878 }
3879 }
3880 }
3881
3882 if (!DNA_struct_member_exists(fd->filesdna, "SoftBody", "SoftBody_Shared", "*shared")) {
3883 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
3884 SoftBody *sb = ob->soft;
3885 if (sb == nullptr) {
3886 continue;
3887 }
3888 if (sb->shared == nullptr) {
3889 sb->shared = MEM_callocN<SoftBody_Shared>("SoftBody_Shared");
3890 }
3891
3892 /* Move shared pointers from deprecated location to current location */
3893 sb->shared->pointcache = sb->pointcache;
3894 sb->shared->ptcaches = sb->ptcaches;
3895
3896 sb->pointcache = nullptr;
3897 BLI_listbase_clear(&sb->ptcaches);
3898 }
3899 }
3900
3901 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "short", "type")) {
3902 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3903 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3904 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3905 if (sl->spacetype == SPACE_VIEW3D) {
3906 View3D *v3d = (View3D *)sl;
3907 if (v3d->drawtype == OB_RENDER) {
3908 v3d->drawtype = OB_SOLID;
3909 }
3910 v3d->shading.type = v3d->drawtype;
3911 v3d->shading.prev_type = OB_SOLID;
3912 }
3913 }
3914 }
3915 }
3916 }
3917
3918 if (!DNA_struct_member_exists(fd->filesdna, "SceneDisplay", "View3DShading", "shading")) {
3919 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3920 BKE_screen_view3d_shading_init(&scene->display.shading);
3921 }
3922 }
3923 /* initialize grease pencil view data */
3924 if (!DNA_struct_member_exists(fd->filesdna, "SpaceView3D", "float", "vertex_opacity")) {
3925 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3926 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3927 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3928 if (sl->spacetype == SPACE_VIEW3D) {
3929 View3D *v3d = (View3D *)sl;
3930 v3d->vertex_opacity = 1.0f;
3932 }
3933 }
3934 }
3935 }
3936 }
3937 }
3938
3939 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 22)) {
3940 if (!DNA_struct_member_exists(fd->filesdna, "ToolSettings", "char", "annotate_v3d_align")) {
3941 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3942 scene->toolsettings->annotate_v3d_align = GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR;
3943 scene->toolsettings->annotate_thickness = 3;
3944 }
3945 }
3946 if (!DNA_struct_member_exists(fd->filesdna, "bGPDlayer", "short", "line_change")) {
3947 LISTBASE_FOREACH (bGPdata *, gpd, &bmain->gpencils) {
3948 LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
3949 gpl->line_change = gpl->thickness;
3950 if ((gpl->thickness < 1) || (gpl->thickness > 10)) {
3951 gpl->thickness = 3;
3952 }
3953 }
3954 }
3955 }
3956 if (!DNA_struct_member_exists(fd->filesdna, "View3DOverlay", "float", "gpencil_paper_opacity"))
3957 {
3958 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3959 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3960 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3961 if (sl->spacetype == SPACE_VIEW3D) {
3962 View3D *v3d = (View3D *)sl;
3963 v3d->overlay.gpencil_paper_opacity = 0.5f;
3964 }
3965 }
3966 }
3967 }
3968 }
3969 if (!DNA_struct_member_exists(fd->filesdna, "View3DOverlay", "float", "gpencil_grid_opacity"))
3970 {
3971 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
3972 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
3973 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
3974 if (sl->spacetype == SPACE_VIEW3D) {
3975 View3D *v3d = (View3D *)sl;
3976 v3d->overlay.gpencil_grid_opacity = 0.5f;
3977 }
3978 }
3979 }
3980 }
3981 }
3982
3983 /* default loc axis */
3984 if (!DNA_struct_member_exists(fd->filesdna, "GP_Sculpt_Settings", "int", "lock_axis")) {
3985 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
3986 /* lock axis */
3987 GP_Sculpt_Settings &gset = scene->toolsettings->gp_sculpt;
3988 gset.lock_axis = GP_LOCKAXIS_Y;
3989 }
3990 }
3991
3992 /* Versioning code for Subsurf modifier. */
3993 if (!DNA_struct_member_exists(fd->filesdna, "SubsurfModifier", "short", "uv_smooth")) {
3994 LISTBASE_FOREACH (Object *, object, &bmain->objects) {
3995 LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
3996 if (md->type == eModifierType_Subsurf) {
4000 }
4001 else {
4003 }
4004 }
4005 }
4006 }
4007 }
4008
4009 if (!DNA_struct_member_exists(fd->filesdna, "SubsurfModifier", "short", "quality")) {
4010 LISTBASE_FOREACH (Object *, object, &bmain->objects) {
4011 LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
4012 if (md->type == eModifierType_Subsurf) {
4014 smd->quality = min_ii(smd->renderLevels, 3);
4015 }
4016 }
4017 }
4018 }
4019 /* Versioning code for Multires modifier. */
4020 if (!DNA_struct_member_exists(fd->filesdna, "MultiresModifier", "short", "quality")) {
4021 LISTBASE_FOREACH (Object *, object, &bmain->objects) {
4022 LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
4023 if (md->type == eModifierType_Multires) {
4025 mmd->quality = 3;
4028 }
4029 else {
4031 }
4032 }
4033 }
4034 }
4035 }
4036
4037 if (!DNA_struct_member_exists(fd->filesdna, "ClothSimSettings", "short", "bending_model")) {
4038 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
4039 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
4040 ClothModifierData *clmd = nullptr;
4041 if (md->type == eModifierType_Cloth) {
4042 clmd = (ClothModifierData *)md;
4043 }
4044 else if (md->type == eModifierType_ParticleSystem) {
4046 ParticleSystem *psys = psmd->psys;
4047 clmd = psys->clmd;
4048 }
4049 if (clmd != nullptr) {
4051 clmd->sim_parms->tension = clmd->sim_parms->structural;
4052 clmd->sim_parms->compression = clmd->sim_parms->structural;
4053 clmd->sim_parms->shear = clmd->sim_parms->structural;
4054 clmd->sim_parms->max_tension = clmd->sim_parms->max_struct;
4055 clmd->sim_parms->max_compression = clmd->sim_parms->max_struct;
4056 clmd->sim_parms->max_shear = clmd->sim_parms->max_struct;
4058 clmd->sim_parms->tension_damp = clmd->sim_parms->Cdis;
4059 clmd->sim_parms->compression_damp = clmd->sim_parms->Cdis;
4060 clmd->sim_parms->shear_damp = clmd->sim_parms->Cdis;
4061 }
4062 }
4063 }
4064 }
4065
4066 if (!DNA_struct_member_exists(fd->filesdna, "BrushGpencilSettings", "float", "era_strength_f"))
4067 {
4068 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
4069 if (brush->gpencil_settings != nullptr) {
4070 BrushGpencilSettings *gp = brush->gpencil_settings;
4071 if (gp->brush_type == GPAINT_BRUSH_TYPE_ERASE) {
4072 gp->era_strength_f = 100.0f;
4073 gp->era_thickness_f = 10.0f;
4074 }
4075 }
4076 }
4077 }
4078
4079 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
4080 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
4081 if (md->type == eModifierType_Cloth) {
4083
4085 clmd->sim_parms->vgroup_mass = 0;
4086 }
4087
4089 clmd->sim_parms->vgroup_struct = 0;
4090 clmd->sim_parms->vgroup_shear = 0;
4091 clmd->sim_parms->vgroup_bend = 0;
4092 }
4093
4094 if (!(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW)) {
4095 clmd->sim_parms->shrink_min = 0.0f;
4096 clmd->sim_parms->vgroup_shrink = 0;
4097 }
4098
4101 }
4102 }
4103 }
4104 }
4105 }
4106
4107 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 24)) {
4108 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4109 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4110 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4111 if (sl->spacetype == SPACE_VIEW3D) {
4112 View3D *v3d = (View3D *)sl;
4117 }
4118 }
4119 }
4120 }
4121
4122 if (!DNA_struct_member_exists(fd->filesdna, "ShrinkwrapModifierData", "char", "shrinkMode")) {
4123 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
4124 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
4125 if (md->type == eModifierType_Shrinkwrap) {
4127 if (smd->shrinkOpts & MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE) {
4129 smd->shrinkOpts &= ~MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE;
4130 }
4131 }
4132 }
4133 }
4134 }
4135
4136 if (!DNA_struct_member_exists(fd->filesdna, "PartDeflect", "float", "pdef_cfrict")) {
4137 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
4138 if (ob->pd) {
4139 ob->pd->pdef_cfrict = 5.0f;
4140 }
4141
4142 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
4143 if (md->type == eModifierType_Cloth) {
4145
4146 clmd->coll_parms->selfepsilon = 0.015f;
4147 }
4148 }
4149 }
4150 }
4151
4152 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "float", "xray_alpha_wire")) {
4153 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4154 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4155 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4156 if (sl->spacetype == SPACE_VIEW3D) {
4157 View3D *v3d = (View3D *)sl;
4159 }
4160 }
4161 }
4162 }
4163 }
4164 }
4165
4166 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 25)) {
4167 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4168 UnitSettings *unit = &scene->unit;
4169 if (unit->system != USER_UNIT_NONE) {
4170 unit->length_unit = BKE_unit_base_of_type_get(scene->unit.system, B_UNIT_LENGTH);
4171 unit->mass_unit = BKE_unit_base_of_type_get(scene->unit.system, B_UNIT_MASS);
4172 }
4174 }
4175
4176 /* gpencil grid settings */
4177 LISTBASE_FOREACH (bGPdata *, gpd, &bmain->gpencils) {
4178 ARRAY_SET_ITEMS(gpd->grid.color, 0.5f, 0.5f, 0.5f); /* Color */
4179 ARRAY_SET_ITEMS(gpd->grid.scale, 1.0f, 1.0f); /* Scale */
4180 gpd->grid.lines = GP_DEFAULT_GRID_LINES; /* Number of lines */
4181 }
4182 }
4183
4184 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 29)) {
4185 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4186 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4187 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4188 if (sl->spacetype == SPACE_VIEW3D) {
4189 enum { V3D_OCCLUDE_WIRE = (1 << 14) };
4190 View3D *v3d = (View3D *)sl;
4191 if (v3d->flag2 & V3D_OCCLUDE_WIRE) {
4193 v3d->flag2 &= ~V3D_OCCLUDE_WIRE;
4194 }
4195 }
4196 }
4197 }
4198 }
4199
4200 /* Files stored pre 2.5 (possibly re-saved with newer versions) may have non-visible
4201 * spaces without a header (visible/active ones are properly versioned).
4202 * Multiple version patches below assume there's always a header though. So inserting this
4203 * patch in-between older ones to add a header when needed.
4204 *
4205 * From here on it should be fine to assume there always is a header.
4206 */
4207 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 1)) {
4208 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4209 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4210 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4211 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
4212 &sl->regionbase;
4213 ARegion *region_header = do_versions_find_region_or_null(regionbase, RGN_TYPE_HEADER);
4214
4215 if (!region_header) {
4216 /* Headers should always be first in the region list, except if there's also a
4217 * tool-header. These were only introduced in later versions though, so should be
4218 * fine to always insert headers first. */
4220
4222 "header 2.83.1 versioning");
4223 region->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM :
4225 BLI_addhead(regionbase, region);
4226 }
4227 }
4228 }
4229 }
4230 }
4231
4232 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4233 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4234 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4235 if (sl->spacetype == SPACE_PROPERTIES) {
4236 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
4237 &sl->regionbase;
4238 ARegion *region = BKE_area_region_new();
4239 ARegion *region_header = nullptr;
4240
4241 for (region_header = static_cast<ARegion *>(regionbase->first);
4242 region_header != nullptr;
4243 region_header = static_cast<ARegion *>(region_header->next))
4244 {
4245 if (region_header->regiontype == RGN_TYPE_HEADER) {
4246 break;
4247 }
4248 }
4249 BLI_assert(region_header);
4250
4251 BLI_insertlinkafter(regionbase, region_header, region);
4252
4253 region->regiontype = RGN_TYPE_NAV_BAR;
4254 region->alignment = RGN_ALIGN_LEFT;
4255 }
4256 }
4257 }
4258 }
4259
4260 /* grease pencil fade layer opacity */
4261 if (!DNA_struct_member_exists(fd->filesdna, "View3DOverlay", "float", "gpencil_fade_layer")) {
4262 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4263 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4264 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4265 if (sl->spacetype == SPACE_VIEW3D) {
4266 View3D *v3d = (View3D *)sl;
4267 v3d->overlay.gpencil_fade_layer = 0.5f;
4268 }
4269 }
4270 }
4271 }
4272 }
4273 }
4274
4275 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 30)) {
4276 /* grease pencil main material show switches */
4277 LISTBASE_FOREACH (Material *, mat, &bmain->materials) {
4278 if (mat->gp_style) {
4279 mat->gp_style->flag |= GP_MATERIAL_STROKE_SHOW;
4280 mat->gp_style->flag |= GP_MATERIAL_FILL_SHOW;
4281 }
4282 }
4283 }
4284
4285 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 33)) {
4286
4287 if (!DNA_struct_member_exists(fd->filesdna, "SceneEEVEE", "float", "overscan")) {
4288 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4289 scene->eevee.overscan = 3.0f;
4290 }
4291 }
4292
4293 LISTBASE_FOREACH (Light *, la, &bmain->lights) {
4294 /* Removed Hemi lights. */
4295 if (!ELEM(la->type, LA_LOCAL, LA_SUN, LA_SPOT, LA_AREA)) {
4296 la->type = LA_SUN;
4297 }
4298 }
4299
4300 if (!DNA_struct_member_exists(fd->filesdna, "SceneEEVEE", "float", "light_threshold")) {
4301 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4302 scene->eevee.light_threshold = 0.01f;
4303 }
4304 }
4305
4306 if (!DNA_struct_member_exists(fd->filesdna, "Light", "float", "att_dist")) {
4307 LISTBASE_FOREACH (Light *, la, &bmain->lights) {
4308 la->att_dist = la->clipend_deprecated;
4309 }
4310 }
4311
4312 if (!DNA_struct_member_exists(fd->filesdna, "Brush", "char", "weight_brush_type")) {
4313 /* Magic defines from old files (2.7x) */
4314
4315#define PAINT_BLEND_MIX 0
4316#define PAINT_BLEND_ADD 1
4317#define PAINT_BLEND_SUB 2
4318#define PAINT_BLEND_MUL 3
4319#define PAINT_BLEND_BLUR 4
4320#define PAINT_BLEND_LIGHTEN 5
4321#define PAINT_BLEND_DARKEN 6
4322#define PAINT_BLEND_AVERAGE 7
4323#define PAINT_BLEND_SMEAR 8
4324#define PAINT_BLEND_COLORDODGE 9
4325#define PAINT_BLEND_DIFFERENCE 10
4326#define PAINT_BLEND_SCREEN 11
4327#define PAINT_BLEND_HARDLIGHT 12
4328#define PAINT_BLEND_OVERLAY 13
4329#define PAINT_BLEND_SOFTLIGHT 14
4330#define PAINT_BLEND_EXCLUSION 15
4331#define PAINT_BLEND_LUMINOSITY 16
4332#define PAINT_BLEND_SATURATION 17
4333#define PAINT_BLEND_HUE 18
4334#define PAINT_BLEND_ALPHA_SUB 19
4335#define PAINT_BLEND_ALPHA_ADD 20
4336
4337 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
4338 if (brush->ob_mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) {
4339 const char tool_init = brush->vertex_brush_type;
4340 bool is_blend = false;
4341
4342 {
4343 char tool;
4344 switch (tool_init) {
4345 case PAINT_BLEND_MIX:
4347 break;
4348 case PAINT_BLEND_BLUR:
4350 break;
4353 break;
4354 case PAINT_BLEND_SMEAR:
4356 break;
4357 default:
4359 is_blend = true;
4360 break;
4361 }
4362 brush->vertex_brush_type = tool;
4363 }
4364
4365 if (is_blend == false) {
4366 brush->blend = IMB_BLEND_MIX;
4367 }
4368 else {
4369 short blend = IMB_BLEND_MIX;
4370 switch (tool_init) {
4371 case PAINT_BLEND_ADD:
4373 break;
4374 case PAINT_BLEND_SUB:
4376 break;
4377 case PAINT_BLEND_MUL:
4379 break;
4382 break;
4383 case PAINT_BLEND_DARKEN:
4385 break;
4388 break;
4391 break;
4392 case PAINT_BLEND_SCREEN:
4394 break;
4397 break;
4400 break;
4403 break;
4406 break;
4409 break;
4412 break;
4413 case PAINT_BLEND_HUE:
4415 break;
4418 break;
4421 break;
4422 }
4423 brush->blend = blend;
4424 }
4425 }
4426 /* For now these match, in the future new items may not. */
4427 brush->weight_brush_type = brush->vertex_brush_type;
4428 }
4429
4430#undef PAINT_BLEND_MIX
4431#undef PAINT_BLEND_ADD
4432#undef PAINT_BLEND_SUB
4433#undef PAINT_BLEND_MUL
4434#undef PAINT_BLEND_BLUR
4435#undef PAINT_BLEND_LIGHTEN
4436#undef PAINT_BLEND_DARKEN
4437#undef PAINT_BLEND_AVERAGE
4438#undef PAINT_BLEND_SMEAR
4439#undef PAINT_BLEND_COLORDODGE
4440#undef PAINT_BLEND_DIFFERENCE
4441#undef PAINT_BLEND_SCREEN
4442#undef PAINT_BLEND_HARDLIGHT
4443#undef PAINT_BLEND_OVERLAY
4444#undef PAINT_BLEND_SOFTLIGHT
4445#undef PAINT_BLEND_EXCLUSION
4446#undef PAINT_BLEND_LUMINOSITY
4447#undef PAINT_BLEND_SATURATION
4448#undef PAINT_BLEND_HUE
4449#undef PAINT_BLEND_ALPHA_SUB
4450#undef PAINT_BLEND_ALPHA_ADD
4451 }
4452 }
4453
4454 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 34)) {
4455 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4456 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4457 LISTBASE_FOREACH (SpaceLink *, slink, &area->spacedata) {
4458 if (slink->spacetype == SPACE_USERPREF) {
4459 ARegion *navigation_region = BKE_spacedata_find_region_type(
4460 slink, area, RGN_TYPE_NAV_BAR);
4461
4462 if (!navigation_region) {
4463 ARegion *main_region = BKE_spacedata_find_region_type(slink, area, RGN_TYPE_WINDOW);
4464 ListBase *regionbase = (slink == area->spacedata.first) ? &area->regionbase :
4465 &slink->regionbase;
4466
4467 navigation_region = BKE_area_region_new();
4468
4469 /* Order matters, addhead not addtail! */
4470 BLI_insertlinkbefore(regionbase, main_region, navigation_region);
4471
4472 navigation_region->regiontype = RGN_TYPE_NAV_BAR;
4473 navigation_region->alignment = RGN_ALIGN_LEFT;
4474 }
4475 }
4476 }
4477 }
4478 }
4479 }
4480
4481 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 36)) {
4482 if (!DNA_struct_member_exists(
4483 fd->filesdna, "View3DShading", "float", "curvature_ridge_factor"))
4484 {
4485 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4486 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4487 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4488 if (sl->spacetype == SPACE_VIEW3D) {
4489 View3D *v3d = (View3D *)sl;
4490 v3d->shading.curvature_ridge_factor = 1.0f;
4491 v3d->shading.curvature_valley_factor = 1.0f;
4492 }
4493 }
4494 }
4495 }
4496 }
4497
4498 /* Rename OpenGL to Workbench. */
4499 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4500 if (STREQ(scene->r.engine, "BLENDER_OPENGL")) {
4501 STRNCPY(scene->r.engine, RE_engine_id_BLENDER_WORKBENCH);
4502 }
4503 }
4504
4505 /* init Annotations onion skin */
4506 if (!DNA_struct_member_exists(fd->filesdna, "bGPDlayer", "int", "gstep")) {
4507 LISTBASE_FOREACH (bGPdata *, gpd, &bmain->gpencils) {
4508 LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
4509 ARRAY_SET_ITEMS(gpl->gcolor_prev, 0.302f, 0.851f, 0.302f);
4510 ARRAY_SET_ITEMS(gpl->gcolor_next, 0.250f, 0.1f, 1.0f);
4511 }
4512 }
4513 }
4514
4515 /* Move studio_light selection to lookdev_light. */
4516 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "char", "lookdev_light[256]")) {
4517 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4518 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4519 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4520 if (sl->spacetype == SPACE_VIEW3D) {
4521 View3D *v3d = (View3D *)sl;
4522 memcpy(v3d->shading.lookdev_light, v3d->shading.studio_light, sizeof(char[256]));
4523 }
4524 }
4525 }
4526 }
4527 }
4528
4529 /* Change Solid mode shadow orientation. */
4530 if (!DNA_struct_member_exists(fd->filesdna, "SceneDisplay", "float", "shadow_focus")) {
4531 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4532 float *dir = scene->display.light_direction;
4533 std::swap(dir[2], dir[1]);
4534 dir[2] = -dir[2];
4535 dir[0] = -dir[0];
4536 }
4537 }
4538 }
4539
4540 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 37)) {
4541 LISTBASE_FOREACH (Camera *, ca, &bmain->cameras) {
4542 ca->drawsize *= 2.0f;
4543 }
4544
4545 /* Grease pencil primitive curve */
4546 if (!DNA_struct_member_exists(
4547 fd->filesdna, "GP_Sculpt_Settings", "CurveMapping", "cur_primitive"))
4548 {
4549 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4550 GP_Sculpt_Settings &gset = scene->toolsettings->gp_sculpt;
4551 if (gset.cur_primitive == nullptr) {
4552 gset.cur_primitive = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
4555 &gset.cur_primitive->clipr,
4558 }
4559 }
4560 }
4561 }
4562
4563 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 38)) {
4564 if (DNA_struct_member_exists(fd->filesdna, "Object", "char", "empty_image_visibility_flag")) {
4565 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
4566 ob->empty_image_visibility_flag ^= (OB_EMPTY_IMAGE_HIDE_PERSPECTIVE |
4569 }
4570 }
4571
4572 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4573 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4574 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4575 switch (sl->spacetype) {
4576 case SPACE_IMAGE: {
4577 SpaceImage *sima = (SpaceImage *)sl;
4582 break;
4583 }
4584 case SPACE_VIEW3D: {
4585 View3D *v3d = (View3D *)sl;
4588 v3d->flag2 &= ~((1 << 3) | V3D_FLAG2_UNUSED_6 | V3D_FLAG2_UNUSED_12 |
4590 break;
4591 }
4592 case SPACE_OUTLINER: {
4593 SpaceOutliner *space_outliner = (SpaceOutliner *)sl;
4594 space_outliner->filter &= ~(SO_FILTER_CLEARED_1 | SO_FILTER_UNUSED_5 |
4596 space_outliner->storeflag &= ~SO_TREESTORE_UNUSED_1;
4597 break;
4598 }
4599 case SPACE_FILE: {
4600 SpaceFile *sfile = (SpaceFile *)sl;
4601 if (sfile->params) {
4604 }
4605 break;
4606 }
4607 case SPACE_NODE: {
4608 SpaceNode *snode = (SpaceNode *)sl;
4610 break;
4611 }
4612 case SPACE_PROPERTIES: {
4613 SpaceProperties *sbuts = (SpaceProperties *)sl;
4614 sbuts->flag &= ~(SB_FLAG_UNUSED_2 | SB_FLAG_UNUSED_3);
4615 break;
4616 }
4617 case SPACE_NLA: {
4618 SpaceNla *snla = (SpaceNla *)sl;
4620 break;
4621 }
4622 }
4623 }
4624 }
4625 }
4626
4627 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4633
4636
4637 if (scene->toolsettings->sculpt) {
4638 scene->toolsettings->sculpt->flags &= ~(SCULPT_FLAG_UNUSED_0 | SCULPT_FLAG_UNUSED_1 |
4640 }
4641
4642 if (scene->ed) {
4643 blender::seq::foreach_strip(&scene->ed->seqbase, strip_update_flags_cb, nullptr);
4644 }
4645 }
4646
4647 LISTBASE_FOREACH (World *, world, &bmain->worlds) {
4650 }
4651
4652 LISTBASE_FOREACH (Image *, image, &bmain->images) {
4656 }
4657
4658 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
4661 ob->shapeflag &= ~OB_SHAPE_FLAG_UNUSED_1;
4662 }
4663
4664 LISTBASE_FOREACH (Mesh *, me, &bmain->meshes) {
4668 }
4669
4670 LISTBASE_FOREACH (Material *, mat, &bmain->materials) {
4671 mat->blend_flag &= ~(1 << 2); /* UNUSED */
4672 }
4673 }
4674
4675 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 40)) {
4676 if (!DNA_struct_member_exists(
4677 fd->filesdna, "ToolSettings", "char", "snap_transform_mode_flag"))
4678 {
4679 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4680 scene->toolsettings->snap_transform_mode_flag = SCE_SNAP_TRANSFORM_MODE_TRANSLATE;
4681 }
4682 }
4683
4684 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4685 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4686 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4687 switch (sl->spacetype) {
4688 case SPACE_VIEW3D: {
4689 enum { V3D_BACKFACE_CULLING = (1 << 10) };
4690 View3D *v3d = (View3D *)sl;
4691 if (v3d->flag2 & V3D_BACKFACE_CULLING) {
4692 v3d->flag2 &= ~V3D_BACKFACE_CULLING;
4694 }
4695 break;
4696 }
4697 }
4698 }
4699 }
4700 }
4701
4702 if (!DNA_struct_exists(fd->filesdna, "TransformOrientationSlot")) {
4703 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4704 for (int i = 0; i < ARRAY_SIZE(scene->orientation_slots); i++) {
4705 scene->orientation_slots[i].index_custom = -1;
4706 }
4707 }
4708 }
4709
4710 /* Grease pencil cutter/select segment intersection threshold. */
4711 if (!DNA_struct_member_exists(fd->filesdna, "GP_Sculpt_Settings", "float", "isect_threshold"))
4712 {
4713 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4714 GP_Sculpt_Settings &gset = scene->toolsettings->gp_sculpt;
4715 gset.isect_threshold = 0.1f;
4716 }
4717 }
4718
4719 /* Fix anamorphic bokeh eevee rna limits. */
4720 LISTBASE_FOREACH (Camera *, ca, &bmain->cameras) {
4721 ca->gpu_dof.ratio = std::max(ca->gpu_dof.ratio, 0.01f);
4722 }
4723
4724 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4725 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4726 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4727 if (sl->spacetype == SPACE_USERPREF) {
4728 ARegion *execute_region = BKE_spacedata_find_region_type(sl, area, RGN_TYPE_EXECUTE);
4729
4730 if (!execute_region) {
4731 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
4732 &sl->regionbase;
4733 ARegion *region_navbar = BKE_spacedata_find_region_type(sl, area, RGN_TYPE_NAV_BAR);
4734
4735 execute_region = BKE_area_region_new();
4736
4737 BLI_assert(region_navbar);
4738
4739 BLI_insertlinkafter(regionbase, region_navbar, execute_region);
4740
4741 execute_region->regiontype = RGN_TYPE_EXECUTE;
4742 execute_region->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
4743 execute_region->flag |= RGN_FLAG_DYNAMIC_SIZE;
4744 }
4745 }
4746 }
4747 }
4748 }
4749 }
4750
4751 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 43)) {
4752 ListBase *lb = which_libbase(bmain, ID_BR);
4754 }
4755
4756 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 44)) {
4757 if (!DNA_struct_member_exists(fd->filesdna, "Material", "float", "a")) {
4758 LISTBASE_FOREACH (Material *, mat, &bmain->materials) {
4759 mat->a = 1.0f;
4760 }
4761 }
4762
4763 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4764 enum {
4765 R_ALPHAKEY = 2,
4766 };
4767 scene->r.seq_flag &= ~(R_SEQ_UNUSED_0 | R_SEQ_UNUSED_1 | R_SEQ_UNUSED_2);
4768 scene->r.color_mgt_flag &= ~R_COLOR_MANAGEMENT_UNUSED_1;
4769 if (scene->r.alphamode == R_ALPHAKEY) {
4770 scene->r.alphamode = R_ADDSKY;
4771 }
4772 ToolSettings *ts = scene->toolsettings;
4773 ts->particle.flag &= ~PE_UNUSED_6;
4774 if (ts->sculpt != nullptr) {
4776 }
4777 }
4778 }
4779
4780 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 46)) {
4781 /* Add wireframe color. */
4782 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "char", "wire_color_type")) {
4783 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4784 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4785 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4786 if (sl->spacetype == SPACE_VIEW3D) {
4787 View3D *v3d = (View3D *)sl;
4789 }
4790 }
4791 }
4792 }
4793 }
4794
4795 if (!DNA_struct_member_exists(fd->filesdna, "View3DCursor", "short", "rotation_mode")) {
4796 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4797 if (is_zero_v3(scene->cursor.rotation_axis)) {
4798 scene->cursor.rotation_mode = ROT_MODE_XYZ;
4799 scene->cursor.rotation_quaternion[0] = 1.0f;
4800 scene->cursor.rotation_axis[1] = 1.0f;
4801 }
4802 }
4803 }
4804 }
4805
4806 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 47)) {
4807 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4808 ParticleEditSettings *pset = &scene->toolsettings->particle;
4809 if (pset->brushtype < 0) {
4810 pset->brushtype = PE_BRUSH_COMB;
4811 }
4812 }
4813
4814 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
4815 {
4816 enum { PARCURVE = 1, PARKEY = 2, PAR_DEPRECATED = 16 };
4817 if (ELEM(ob->partype, PARCURVE, PARKEY, PAR_DEPRECATED)) {
4818 ob->partype = PAROBJECT;
4819 }
4820 }
4821
4822 {
4823 enum { OB_WAVE = 21, OB_LIFE = 23, OB_SECTOR = 24 };
4824 if (ELEM(ob->type, OB_WAVE, OB_LIFE, OB_SECTOR)) {
4825 ob->type = OB_EMPTY;
4826 }
4827 }
4828
4831
4832 ob->nlaflag &= ~(OB_ADS_UNUSED_1 | OB_ADS_UNUSED_2);
4833 }
4834
4835 LISTBASE_FOREACH (bArmature *, arm, &bmain->armatures) {
4838 }
4839
4840 LISTBASE_FOREACH (Text *, text, &bmain->texts) {
4841 text->flags &= ~(TXT_FLAG_UNUSED_8 | TXT_FLAG_UNUSED_9);
4842 }
4843 }
4844
4845 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 48)) {
4846 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
4847 /* Those are not currently used, but are accessible through RNA API and were not
4848 * properly initialized previously. This is mere copy of #scene_init_data code. */
4849 if (scene->r.im_format.view_settings.look[0] == '\0') {
4850 BKE_color_managed_display_settings_init(&scene->r.im_format.display_settings);
4852 &scene->r.im_format.view_settings, &scene->r.im_format.display_settings, "Filmic");
4853 }
4854
4855 if (scene->r.bake.im_format.view_settings.look[0] == '\0') {
4856 BKE_color_managed_display_settings_init(&scene->r.bake.im_format.display_settings);
4857 BKE_color_managed_view_settings_init(&scene->r.bake.im_format.view_settings,
4858 &scene->r.bake.im_format.display_settings,
4859 "Filmic");
4860 }
4861 }
4862 }
4863
4864 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 49)) {
4865 /* All tool names changed, reset to defaults. */
4866 LISTBASE_FOREACH (WorkSpace *, workspace, &bmain->workspaces) {
4867 while (!BLI_listbase_is_empty(&workspace->tools)) {
4868 BKE_workspace_tool_remove(workspace, static_cast<bToolRef *>(workspace->tools.first));
4869 }
4870 }
4871 }
4872
4873 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 52)) {
4874 LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
4875 /* Replace deprecated PART_DRAW_BB by PART_DRAW_NOT */
4876 if (part->ren_as == PART_DRAW_BB) {
4877 part->ren_as = PART_DRAW_NOT;
4878 }
4879 if (part->draw_as == PART_DRAW_BB) {
4880 part->draw_as = PART_DRAW_NOT;
4881 }
4882 }
4883
4884 if (!DNA_struct_member_exists(fd->filesdna, "TriangulateModifierData", "int", "min_vertices"))
4885 {
4886 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
4887 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
4888 if (md->type == eModifierType_Triangulate) {
4890 smd->min_vertices = 4;
4891 }
4892 }
4893 }
4894 }
4895
4896 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
4897 if (ntree->type == NTREE_SHADER) {
4898 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
4899 /* Fix missing version patching from earlier changes. */
4900 if (STREQ(node->idname, "ShaderNodeOutputLamp")) {
4901 STRNCPY_UTF8(node->idname, "ShaderNodeOutputLight");
4902 }
4903 if (node->type_legacy == SH_NODE_BSDF_PRINCIPLED && node->custom2 == 0) {
4904 node->custom2 = SHD_SUBSURFACE_BURLEY;
4905 }
4906 }
4907 }
4908 }
4910 }
4911
4912 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 53)) {
4913 LISTBASE_FOREACH (Material *, mat, &bmain->materials) {
4914 /* Eevee: Keep material appearance consistent with previous behavior. */
4915 if (!mat->use_nodes || !mat->nodetree || mat->blend_method == MA_BM_SOLID) {
4916 mat->blend_shadow = MA_BS_SOLID;
4917 }
4918 }
4919
4920 /* grease pencil default animation channel color */
4921 {
4922 LISTBASE_FOREACH (bGPdata *, gpd, &bmain->gpencils) {
4923 if (gpd->flag & GP_DATA_ANNOTATIONS) {
4924 continue;
4925 }
4926 LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
4927 /* default channel color */
4928 ARRAY_SET_ITEMS(gpl->color, 0.2f, 0.2f, 0.2f);
4929 }
4930 }
4931 }
4932 }
4933
4934 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 54)) {
4935 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
4936 bool is_first_subdiv = true;
4937 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
4938 if (md->type == eModifierType_Subsurf) {
4940 if (is_first_subdiv) {
4942 }
4943 else {
4945 }
4946 is_first_subdiv = false;
4947 }
4948 else if (md->type == eModifierType_Multires) {
4950 if (is_first_subdiv) {
4952 }
4953 else {
4955 }
4956 is_first_subdiv = false;
4957 }
4958 }
4959 }
4960 }
4961
4962 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 55)) {
4963 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4964 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4965 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4966 if (sl->spacetype == SPACE_TEXT) {
4967 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
4968 &sl->regionbase;
4969
4970 /* Remove multiple footers that were added by mistake. */
4972
4973 /* Add footer. */
4974 ARegion *region = do_versions_add_region(RGN_TYPE_FOOTER, "footer for text");
4976
4977 ARegion *region_header = do_versions_find_region(regionbase, RGN_TYPE_HEADER);
4978 BLI_insertlinkafter(regionbase, region_header, region);
4979 }
4980 }
4981 }
4982 }
4983 }
4984
4985 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 56)) {
4986 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
4987 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
4988 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
4989 if (sl->spacetype == SPACE_VIEW3D) {
4990 View3D *v3d = (View3D *)sl;
4996 }
4997 }
4998 }
4999 }
5000 }
5001
5002 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 57)) {
5003 /* Enable Show Interpolation in dope-sheet by default. */
5004 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5005 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5006 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5007 if (sl->spacetype == SPACE_ACTION) {
5008 SpaceAction *saction = (SpaceAction *)sl;
5009 if ((saction->flag & SACTION_SHOW_EXTREMES) == 0) {
5010 saction->flag |= SACTION_SHOW_INTERPOLATION;
5011 }
5012 }
5013 }
5014 }
5015 }
5016
5017 /* init grease pencil brush gradients */
5018 if (!DNA_struct_member_exists(fd->filesdna, "BrushGpencilSettings", "float", "hardness")) {
5019 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
5020 if (brush->gpencil_settings != nullptr) {
5021 BrushGpencilSettings *gp = brush->gpencil_settings;
5022 gp->hardness = 1.0f;
5023 copy_v2_fl(gp->aspect_ratio, 1.0f);
5024 }
5025 }
5026 }
5027
5028 /* init grease pencil stroke gradients */
5029 if (!DNA_struct_member_exists(fd->filesdna, "bGPDstroke", "float", "hardness")) {
5030 LISTBASE_FOREACH (bGPdata *, gpd, &bmain->gpencils) {
5031 LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
5032 LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
5033 LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
5034 gps->hardness = 1.0f;
5035 copy_v2_fl(gps->aspect_ratio, 1.0f);
5036 }
5037 }
5038 }
5039 }
5040 }
5041
5042 /* enable the axis aligned ortho grid by default */
5043 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5044 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5045 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5046 if (sl->spacetype == SPACE_VIEW3D) {
5047 View3D *v3d = (View3D *)sl;
5049 }
5050 }
5051 }
5052 }
5053 }
5054
5055 /* Keep un-versioned until we're finished adding space types. */
5056 {
5057 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5058 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5059 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5060 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
5061 &sl->regionbase;
5062 /* All spaces that use tools must be eventually added. */
5063 ARegion *region = nullptr;
5064 if (ELEM(sl->spacetype, SPACE_VIEW3D, SPACE_IMAGE, SPACE_SEQ) &&
5065 ((region = do_versions_find_region_or_null(regionbase, RGN_TYPE_TOOL_HEADER)) ==
5066 nullptr))
5067 {
5068 /* Add tool header. */
5069 region = do_versions_add_region(RGN_TYPE_TOOL_HEADER, "tool header");
5071
5072 ARegion *region_header = do_versions_find_region(regionbase, RGN_TYPE_HEADER);
5073 BLI_insertlinkbefore(regionbase, region_header, region);
5074 /* Hide by default, enable for painting workspaces (startup only). */
5076 }
5077 if (region != nullptr) {
5079 region->flag, region->flag & RGN_FLAG_HIDDEN_BY_USER, RGN_FLAG_HIDDEN);
5080 }
5081 }
5082 }
5083 }
5084 }
5085
5086 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 60)) {
5087 if (!DNA_struct_member_exists(fd->filesdna, "bSplineIKConstraint", "short", "yScaleMode")) {
5088 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5089 if (ob->pose) {
5090 LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
5091 LISTBASE_FOREACH (bConstraint *, con, &pchan->constraints) {
5092 if (con->type == CONSTRAINT_TYPE_SPLINEIK) {
5094 if ((data->flag & CONSTRAINT_SPLINEIK_SCALE_LIMITED) == 0) {
5096 }
5097 }
5098 }
5099 }
5100 }
5101 }
5102 }
5103
5104 if (!DNA_struct_member_exists(
5105 fd->filesdna, "View3DOverlay", "float", "sculpt_mode_mask_opacity"))
5106 {
5107 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5108 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5109 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5110 if (sl->spacetype == SPACE_VIEW3D) {
5111 View3D *v3d = (View3D *)sl;
5112 v3d->overlay.sculpt_mode_mask_opacity = 0.75f;
5113 }
5114 }
5115 }
5116 }
5117 }
5118 if (!DNA_struct_member_exists(fd->filesdna, "SceneDisplay", "char", "render_aa")) {
5119 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5120 scene->display.render_aa = SCE_DISPLAY_AA_SAMPLES_8;
5121 scene->display.viewport_aa = SCE_DISPLAY_AA_FXAA;
5122 }
5123 }
5124
5125 /* Split bbone_scalein/bbone_scaleout into x and y fields. */
5126 if (!DNA_struct_member_exists(fd->filesdna, "bPoseChannel", "float", "scale_out_z")) {
5127 /* Update armature data and pose channels. */
5128 LISTBASE_FOREACH (bArmature *, arm, &bmain->armatures) {
5129 do_version_bones_split_bbone_scale(&arm->bonebase);
5130 }
5131
5132 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5133 if (ob->pose) {
5134 LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
5135 pchan->scale_in_z = pchan->scale_in_x;
5136 pchan->scale_out_z = pchan->scale_out_x;
5137 }
5138 }
5139 }
5140
5141 /* Update action curves and drivers. */
5142 LISTBASE_FOREACH (bAction *, act, &bmain->actions) {
5143 LISTBASE_FOREACH_MUTABLE (FCurve *, fcu, &act->curves) {
5144 do_version_bbone_scale_fcurve_fix(&act->curves, fcu);
5145 }
5146 }
5147
5148 BKE_animdata_main_cb(bmain, [](ID * /*id*/, AnimData *adt) {
5149 LISTBASE_FOREACH_MUTABLE (FCurve *, fcu, &adt->drivers) {
5151 }
5152 });
5153 }
5154
5155 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
5156 if (sce->ed != nullptr) {
5158 }
5159 }
5160 }
5161
5162 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 61)) {
5163 /* Added a power option to Copy Scale. */
5164 if (!DNA_struct_member_exists(fd->filesdna, "bSizeLikeConstraint", "float", "power")) {
5165 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5167 if (ob->pose) {
5168 LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
5169 do_version_constraints_copy_scale_power(&pchan->constraints);
5170 }
5171 }
5172 }
5173 }
5174
5175 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5176 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5177 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5178 if (ELEM(sl->spacetype, SPACE_CLIP, SPACE_GRAPH, SPACE_SEQ)) {
5179 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
5180 &sl->regionbase;
5181
5182 ARegion *region = nullptr;
5183 if (sl->spacetype == SPACE_CLIP) {
5184 if (((SpaceClip *)sl)->view == SC_VIEW_GRAPH) {
5186 }
5187 }
5188 else {
5190 }
5191
5192 if (region != nullptr) {
5193 region->v2d.scroll &= ~V2D_SCROLL_LEFT;
5194 region->v2d.scroll |= V2D_SCROLL_RIGHT;
5195 }
5196 }
5197 }
5198 }
5199 }
5200
5201 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5202 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5203 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5204 if (sl->spacetype != SPACE_OUTLINER) {
5205 continue;
5206 }
5207 SpaceOutliner *space_outliner = (SpaceOutliner *)sl;
5208 space_outliner->filter &= ~SO_FLAG_UNUSED_1;
5210 }
5211 }
5212 }
5213 }
5214
5215 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 68)) {
5216 /* Unify Cycles and Eevee film transparency. */
5217 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5218 if (STREQ(scene->r.engine, RE_engine_id_CYCLES)) {
5219 IDProperty *cscene = version_cycles_properties_from_ID(&scene->id);
5220 if (cscene) {
5221 bool cycles_film_transparency = version_cycles_property_boolean(
5222 cscene, "film_transparent", false);
5223 scene->r.alphamode = cycles_film_transparency ? R_ALPHAPREMUL : R_ADDSKY;
5224 }
5225 }
5226 }
5227 }
5228
5229 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 69)) {
5230 LISTBASE_FOREACH (bArmature *, arm, &bmain->armatures) {
5231 arm->flag &= ~(ARM_FLAG_UNUSED_7 | ARM_FLAG_UNUSED_9);
5232 }
5233
5234 /* Initializes sun lights with the new angular diameter property */
5235 if (!DNA_struct_member_exists(fd->filesdna, "Light", "float", "sun_angle")) {
5236 LISTBASE_FOREACH (Light *, light, &bmain->lights) {
5237 light->sun_angle = 2.0f * atanf(light->area_size);
5238 }
5239 }
5240 }
5241
5242 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 70)) {
5243 /* New image alpha modes. */
5244 LISTBASE_FOREACH (Image *, image, &bmain->images) {
5245 enum { IMA_IGNORE_ALPHA = (1 << 12) };
5246 if (image->flag & IMA_IGNORE_ALPHA) {
5247 image->alpha_mode = IMA_ALPHA_IGNORE;
5248 image->flag &= ~IMA_IGNORE_ALPHA;
5249 }
5250 }
5251 }
5252
5253 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 71)) {
5254 /* This assumes the Blender builtin config. Depending on the OCIO
5255 * environment variable for versioning is weak, and these deprecated view
5256 * transforms and look names don't seem to exist in other commonly used
5257 * OCIO configs so .blend files created for those would be unaffected. */
5258 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5259 ColorManagedViewSettings *view_settings;
5260 view_settings = &scene->view_settings;
5261
5262 if (STREQ(view_settings->view_transform, "Default")) {
5263 STRNCPY_UTF8(view_settings->view_transform, "Standard");
5264 }
5265 else if (STR_ELEM(view_settings->view_transform, "RRT", "Film")) {
5266 STRNCPY_UTF8(view_settings->view_transform, "Filmic");
5267 }
5268 else if (STREQ(view_settings->view_transform, "Log")) {
5269 STRNCPY_UTF8(view_settings->view_transform, "Filmic Log");
5270 }
5271
5272 if (STREQ(view_settings->look, "Filmic - Base Contrast")) {
5273 STRNCPY_UTF8(view_settings->look, "None");
5274 }
5275 }
5276 }
5277
5278 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 74)) {
5279 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5280 if (scene->ed != nullptr) {
5281 do_versions_seq_alloc_transform_and_crop(&scene->ed->seqbase);
5282 }
5283 }
5284 }
5285
5286 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 75)) {
5287 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5288 if (scene->master_collection != nullptr) {
5289 scene->master_collection->flag &= ~(COLLECTION_HIDE_VIEWPORT | COLLECTION_HIDE_SELECT |
5291 }
5292
5293 UnitSettings *unit = &scene->unit;
5294 if (unit->system == USER_UNIT_NONE) {
5295 unit->length_unit = char(USER_UNIT_ADAPTIVE);
5296 unit->mass_unit = char(USER_UNIT_ADAPTIVE);
5297 }
5298
5299 RenderData *render_data = &scene->r;
5300 switch (render_data->ffcodecdata.ffmpeg_preset) {
5301 case FFM_PRESET_ULTRAFAST:
5302 case FFM_PRESET_SUPERFAST:
5304 break;
5305 case FFM_PRESET_VERYFAST:
5306 case FFM_PRESET_FASTER:
5307 case FFM_PRESET_FAST:
5308 case FFM_PRESET_MEDIUM:
5310 break;
5311 case FFM_PRESET_SLOW:
5312 case FFM_PRESET_SLOWER:
5313 case FFM_PRESET_VERYSLOW:
5315 }
5316 }
5317
5318 LISTBASE_FOREACH (bArmature *, arm, &bmain->armatures) {
5319 arm->flag &= ~ARM_BCOLL_SOLO_ACTIVE;
5320 }
5321 }
5322
5323 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 1)) {
5324 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5325 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
5326 if (md->type == eModifierType_DataTransfer) {
5327 /* Now data-transfer's mix factor is multiplied with weights when any,
5328 * instead of being ignored,
5329 * we need to take care of that to keep 'old' files compatible. */
5331 if (dtmd->defgrp_name[0] != '\0') {
5332 dtmd->mix_factor = 1.0f;
5333 }
5334 }
5335 }
5336 }
5337 }
5338
5339 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 3)) {
5340 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5341 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5342 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5343 if (sl->spacetype == SPACE_TEXT) {
5344 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
5345 &sl->regionbase;
5347 if (region) {
5348 region->alignment = RGN_ALIGN_RIGHT;
5349 }
5350 }
5351 /* Mark outliners as dirty for syncing and enable synced selection */
5352 if (sl->spacetype == SPACE_OUTLINER) {
5353 SpaceOutliner *space_outliner = (SpaceOutliner *)sl;
5355 space_outliner->flag |= SO_SYNC_SELECT;
5356 }
5357 }
5358 }
5359 }
5360 LISTBASE_FOREACH (Mesh *, mesh, &bmain->meshes) {
5361 if (mesh->remesh_voxel_size == 0.0f) {
5362 mesh->remesh_voxel_size = 0.1f;
5363 }
5364 }
5365 }
5366
5367 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 3)) {
5368 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
5369 if (ntree->type == NTREE_SHADER) {
5371 }
5372 }
5374 }
5375
5376 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 4)) {
5377 ID *id;
5378 FOREACH_MAIN_ID_BEGIN (bmain, id) {
5380 if (ntree) {
5381 ntree->id.flag |= ID_FLAG_EMBEDDED_DATA;
5382 }
5383 }
5385 }
5386
5387 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 5)) {
5388 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
5389 if (br->ob_mode & OB_MODE_SCULPT && br->normal_radius_factor == 0.0f) {
5390 br->normal_radius_factor = 0.5f;
5391 }
5392 }
5393
5394 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5395 /* Older files do not have a master collection, which is then added through
5396 * `BKE_collection_master_add()`, so everything is fine. */
5397 if (scene->master_collection != nullptr) {
5398 scene->master_collection->id.flag |= ID_FLAG_EMBEDDED_DATA;
5399 }
5400 }
5401 }
5402
5403 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 6)) {
5404 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5405 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5406 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5407 if (sl->spacetype == SPACE_VIEW3D) {
5408 View3D *v3d = (View3D *)sl;
5410
5411 /* files by default don't have studio lights selected unless interacted
5412 * with the shading popover. When no studio-light could be read, we will
5413 * select the default world one. */
5416 if (studio_light != nullptr) {
5417 STRNCPY(v3d->shading.lookdev_light, studio_light->name);
5418 }
5419 }
5420 }
5421 }
5422 }
5423 }
5424
5425 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 9)) {
5426 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5427 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5428 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5429 if (sl->spacetype == SPACE_FILE) {
5430 SpaceFile *sfile = (SpaceFile *)sl;
5431 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
5432 &sl->regionbase;
5433 ARegion *region_ui = do_versions_find_region(regionbase, RGN_TYPE_UI);
5434 ARegion *region_header = do_versions_find_region(regionbase, RGN_TYPE_HEADER);
5435 ARegion *region_toolprops = do_versions_find_region_or_null(regionbase,
5437
5438 /* Check, even though this is expected to be valid. */
5439 if (region_ui) {
5440 /* Reinsert UI region so that it spawns entire area width. */
5441 BLI_remlink(regionbase, region_ui);
5442 BLI_insertlinkafter(regionbase, region_header, region_ui);
5443
5444 region_ui->flag |= RGN_FLAG_DYNAMIC_SIZE;
5445 }
5446
5447 if (region_toolprops &&
5448 (region_toolprops->alignment == (RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV)))
5449 {
5450 SpaceType *stype = BKE_spacetype_from_id(sl->spacetype);
5451
5452 /* Remove empty region at old location. */
5453 BLI_assert(sfile->op == nullptr);
5454 BKE_area_region_free(stype, region_toolprops);
5455 BLI_freelinkN(regionbase, region_toolprops);
5456 }
5457
5458 if (sfile->params) {
5460 }
5461 }
5462 }
5463 }
5464 }
5465
5466 /* Convert the BONE_NO_SCALE flag to inherit_scale_mode enum. */
5467 if (!DNA_struct_member_exists(fd->filesdna, "Bone", "char", "inherit_scale_mode")) {
5468 LISTBASE_FOREACH (bArmature *, arm, &bmain->armatures) {
5469 do_version_bones_inherit_scale(&arm->bonebase);
5470 }
5471 }
5472
5473 /* Convert the Offset flag to the mix mode enum. */
5474 if (!DNA_struct_member_exists(fd->filesdna, "bRotateLikeConstraint", "char", "mix_mode")) {
5475 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5477 if (ob->pose) {
5478 LISTBASE_FOREACH (bPoseChannel *, pchan, &ob->pose->chanbase) {
5480 }
5481 }
5482 }
5483 }
5484
5485 /* Added studio-light intensity. */
5486 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "float", "studiolight_intensity"))
5487 {
5488 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5489 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5490 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5491 if (sl->spacetype == SPACE_VIEW3D) {
5492 View3D *v3d = (View3D *)sl;
5493 v3d->shading.studiolight_intensity = 1.0f;
5494 }
5495 }
5496 }
5497 }
5498 }
5499
5500 /* Elastic deform brush */
5501 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
5502 if (br->ob_mode & OB_MODE_SCULPT && br->elastic_deform_volume_preservation == 0.0f) {
5503 br->elastic_deform_volume_preservation = 0.5f;
5504 }
5505 }
5506 }
5507
5508 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 10)) {
5509 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
5510 if (ntree->type == NTREE_SHADER) {
5512 }
5513 }
5515 }
5516
5517 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 11)) {
5518 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
5519 if (ntree->type == NTREE_SHADER) {
5522 }
5523 }
5525 }
5526
5527 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 281, 15)) {
5528 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5529 constexpr char SCE_SNAP_TO_NODE_X = (1 << 1);
5530 if (scene->toolsettings->snap_node_mode == SCE_SNAP_TO_NODE_X) {
5531 scene->toolsettings->snap_node_mode = SCE_SNAP_TO_GRID;
5532 }
5533 }
5534
5535 if (!DNA_struct_member_exists(
5536 fd->filesdna, "LayerCollection", "short", "local_collections_bits"))
5537 {
5538 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5539 LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
5540 LISTBASE_FOREACH (LayerCollection *, layer_collection, &view_layer->layer_collections) {
5541 do_versions_local_collection_bits_set(layer_collection);
5542 }
5543 }
5544 }
5545 }
5546
5547 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5548 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5549 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5550 if (sl->spacetype == SPACE_VIEW3D) {
5551 View3D *v3d = (View3D *)sl;
5552
5553 LISTBASE_FOREACH (ScrArea *, area_other, &screen->areabase) {
5554 LISTBASE_FOREACH (SpaceLink *, sl_other, &area_other->spacedata) {
5555 if (sl != sl_other && sl_other->spacetype == SPACE_VIEW3D) {
5556 View3D *v3d_other = (View3D *)sl_other;
5557
5558 if (v3d->shading.prop == v3d_other->shading.prop) {
5559 v3d_other->shading.prop = nullptr;
5560 }
5561 }
5562 }
5563 }
5564 }
5565 else if (sl->spacetype == SPACE_FILE) {
5566 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase :
5567 &sl->regionbase;
5568 ARegion *region_tools = do_versions_find_region_or_null(regionbase, RGN_TYPE_TOOLS);
5569 ARegion *region_header = do_versions_find_region(regionbase, RGN_TYPE_HEADER);
5570
5571 if (region_tools) {
5572 ARegion *region_next = region_tools->next;
5573
5574 /* We temporarily had two tools regions, get rid of the second one. */
5575 if (region_next && region_next->regiontype == RGN_TYPE_TOOLS) {
5576 do_versions_remove_region(regionbase, region_next);
5577 }
5578
5579 BLI_remlink(regionbase, region_tools);
5580 BLI_insertlinkafter(regionbase, region_header, region_tools);
5581 }
5582 else {
5584 "versioning file tools region");
5585 BLI_insertlinkafter(regionbase, region_header, region_tools);
5586 region_tools->alignment = RGN_ALIGN_LEFT;
5587 }
5588 }
5589 }
5590 }
5591 }
5592
5593 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
5594 if (br->ob_mode & OB_MODE_SCULPT && br->area_radius_factor == 0.0f) {
5595 br->area_radius_factor = 0.5f;
5596 }
5597 }
5598 }
5599
5600 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 282, 2)) {
5602
5603 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5604 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5605 area->flag &= ~AREA_FLAG_UNUSED_6;
5606 }
5607 }
5608
5609 /* Add custom curve profile to toolsettings for bevel tool */
5610 if (!DNA_struct_member_exists(fd->filesdna, "ToolSettings", "CurveProfile", "custom_profile"))
5611 {
5612 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5613 ToolSettings *ts = scene->toolsettings;
5614 if ((ts) && (ts->custom_bevel_profile_preset == nullptr)) {
5616 }
5617 }
5618 }
5619
5620 /* Add custom curve profile to bevel modifier */
5621 if (!DNA_struct_member_exists(fd->filesdna, "BevelModifier", "CurveProfile", "custom_profile"))
5622 {
5623 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5624 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
5625 if (md->type == eModifierType_Bevel) {
5627 if (!bmd->custom_profile) {
5629 }
5630 }
5631 }
5632 }
5633 }
5634
5635 /* Dash Ratio and Dash Samples */
5636 if (!DNA_struct_member_exists(fd->filesdna, "Brush", "float", "dash_ratio")) {
5637 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
5638 br->dash_ratio = 1.0f;
5639 br->dash_samples = 20;
5640 }
5641 }
5642
5643 /* Pose brush smooth iterations */
5644 if (!DNA_struct_member_exists(fd->filesdna, "Brush", "float", "pose_smooth_iterations")) {
5645 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
5646 br->pose_smooth_iterations = 4;
5647 }
5648 }
5649
5650 /* Cloth pressure */
5651 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5652 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
5653 if (md->type == eModifierType_Cloth) {
5655
5656 clmd->sim_parms->pressure_factor = 1;
5657 }
5658 }
5659 }
5660 }
5661
5662 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 282, 3)) {
5663 /* Remove Unified pressure/size and pressure/alpha */
5664 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5665 ToolSettings *ts = scene->toolsettings;
5666 UnifiedPaintSettings *ups = &ts->unified_paint_settings;
5668 }
5669
5670 /* Set the default render pass in the viewport to Combined. */
5671 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "int", "render_pass")) {
5672 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5673 scene->display.shading.render_pass = SCE_PASS_COMBINED;
5674 }
5675
5676 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5677 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5678 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5679 if (sl->spacetype == SPACE_VIEW3D) {
5680 View3D *v3d = (View3D *)sl;
5682 }
5683 }
5684 }
5685 }
5686 }
5687
5688 /* Make markers region visible by default. */
5689 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5690 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5691 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5692 switch (sl->spacetype) {
5693 case SPACE_SEQ: {
5694 SpaceSeq *sseq = (SpaceSeq *)sl;
5695 sseq->flag |= SEQ_SHOW_MARKERS;
5696 break;
5697 }
5698 case SPACE_ACTION: {
5699 SpaceAction *saction = (SpaceAction *)sl;
5700 saction->flag |= SACTION_SHOW_MARKERS;
5701 break;
5702 }
5703 case SPACE_GRAPH: {
5704 SpaceGraph *sipo = (SpaceGraph *)sl;
5705 sipo->flag |= SIPO_SHOW_MARKERS;
5706 break;
5707 }
5708 case SPACE_NLA: {
5709 SpaceNla *snla = (SpaceNla *)sl;
5710 snla->flag |= SNLA_SHOW_MARKERS;
5711 break;
5712 }
5713 }
5714 }
5715 }
5716 }
5717 }
5718
5719 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 3)) {
5720 /* Color Management Look. */
5721 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
5722 ColorManagedViewSettings *view_settings;
5723 view_settings = &scene->view_settings;
5724 if (BLI_str_startswith(view_settings->look, "Filmic - ")) {
5725 char *src = view_settings->look + strlen("Filmic - ");
5726 memmove(view_settings->look, src, strlen(src) + 1);
5727 }
5728 else if (BLI_str_startswith(view_settings->look, "Standard - ")) {
5729 char *src = view_settings->look + strlen("Standard - ");
5730 memmove(view_settings->look, src, strlen(src) + 1);
5731 }
5732 }
5733
5734 /* Sequencer Tool region */
5736
5737 /* Cloth internal springs */
5738 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5739 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
5740 if (md->type == eModifierType_Cloth) {
5742
5743 clmd->sim_parms->internal_tension = 15.0f;
5744 clmd->sim_parms->max_internal_tension = 15.0f;
5745 clmd->sim_parms->internal_compression = 15.0f;
5746 clmd->sim_parms->max_internal_compression = 15.0f;
5748 }
5749 }
5750 }
5751
5752 /* Add primary tile to images. */
5753 if (!DNA_struct_member_exists(fd->filesdna, "Image", "ListBase", "tiles")) {
5754 LISTBASE_FOREACH (Image *, ima, &bmain->images) {
5755 ImageTile *tile = MEM_callocN<ImageTile>("Image Tile");
5756 tile->tile_number = 1001;
5757 BLI_addtail(&ima->tiles, tile);
5758 }
5759 }
5760
5761 /* UDIM Image Editor change. */
5762 if (!DNA_struct_member_exists(fd->filesdna, "SpaceImage", "int", "tile_grid_shape[2]")) {
5763 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5764 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5765 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5766 if (sl->spacetype == SPACE_IMAGE) {
5767 SpaceImage *sima = (SpaceImage *)sl;
5768 sima->tile_grid_shape[0] = 1;
5769 sima->tile_grid_shape[1] = 1;
5770 }
5771 }
5772 }
5773 }
5774 }
5775
5776 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
5777 br->add_col[3] = 0.9f;
5778 br->sub_col[3] = 0.9f;
5779 }
5780
5781 /* Pose brush IK segments. */
5782 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
5783 if (br->pose_ik_segments == 0) {
5784 br->pose_ik_segments = 1;
5785 }
5786 }
5787
5788 /* Pose brush keep anchor point. */
5789 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
5790 if (br->sculpt_brush_type == SCULPT_BRUSH_TYPE_POSE) {
5791 br->flag2 |= BRUSH_POSE_IK_ANCHORED;
5792 }
5793 }
5794
5795 /* Tip Roundness. */
5796 if (!DNA_struct_member_exists(fd->filesdna, "Brush", "float", "tip_roundness")) {
5797 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
5798 if (br->ob_mode & OB_MODE_SCULPT && br->sculpt_brush_type == SCULPT_BRUSH_TYPE_CLAY_STRIPS)
5799 {
5800 br->tip_roundness = 0.18f;
5801 }
5802 }
5803 }
5804 }
5805
5806 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 5)) {
5807 /* Alembic Transform Cache changed from world to local space. */
5808 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5809 LISTBASE_FOREACH (bConstraint *, con, &ob->constraints) {
5810 if (con->type == CONSTRAINT_TYPE_TRANSFORM_CACHE) {
5811 con->ownspace = CONSTRAINT_SPACE_LOCAL;
5812 }
5813 }
5814 }
5815
5816 /* Add 2D transform to UV Warp modifier. */
5817 if (!DNA_struct_member_exists(fd->filesdna, "UVWarpModifierData", "float", "scale[2]")) {
5818 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5819 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
5820 if (md->type == eModifierType_UVWarp) {
5822 copy_v2_fl(umd->scale, 1.0f);
5823 }
5824 }
5825 }
5826 }
5827
5828 /* Add Lookdev blur property. */
5829 if (!DNA_struct_member_exists(fd->filesdna, "View3DShading", "float", "studiolight_blur")) {
5830 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5831 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5832 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5833 if (sl->spacetype == SPACE_VIEW3D) {
5834 View3D *v3d = (View3D *)sl;
5835 v3d->shading.studiolight_blur = 0.5f;
5836 }
5837 }
5838 }
5839 }
5840 }
5841 }
5842
5843 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 7)) {
5844 /* Init default Grease Pencil Vertex paint mix factor for Viewport. */
5845 if (!DNA_struct_member_exists(
5846 fd->filesdna, "View3DOverlay", "float", "gpencil_vertex_paint_opacity"))
5847 {
5848 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
5849 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
5850 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
5851 if (sl->spacetype == SPACE_VIEW3D) {
5852 View3D *v3d = (View3D *)sl;
5854 }
5855 }
5856 }
5857 }
5858 }
5859
5860 /* Update Grease Pencil after drawing engine and code refactor.
5861 * It uses the seed variable of Array modifier to avoid double patching for
5862 * files created with a development version. */
5863 if (!DNA_struct_member_exists(fd->filesdna, "ArrayGpencilModifierData", "int", "seed")) {
5864 /* Init new Grease Pencil Paint tools. */
5865 {
5866 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
5867 if (brush->gpencil_settings != nullptr) {
5868 brush->gpencil_vertex_brush_type = brush->gpencil_settings->brush_type;
5869 brush->gpencil_sculpt_brush_type = brush->gpencil_settings->brush_type;
5870 brush->gpencil_weight_brush_type = brush->gpencil_settings->brush_type;
5871 }
5872 }
5873 }
5874
5875 LISTBASE_FOREACH (Material *, mat, &bmain->materials) {
5876 MaterialGPencilStyle *gp_style = mat->gp_style;
5877 if (gp_style == nullptr) {
5878 continue;
5879 }
5880 /* Fix Grease Pencil Material colors to Linear. */
5881 srgb_to_linearrgb_v4(gp_style->stroke_rgba, gp_style->stroke_rgba);
5882 srgb_to_linearrgb_v4(gp_style->fill_rgba, gp_style->fill_rgba);
5883
5884 /* Move old gradient variables to texture. */
5886 gp_style->texture_angle = gp_style->gradient_angle;
5887 copy_v2_v2(gp_style->texture_scale, gp_style->gradient_scale);
5888 copy_v2_v2(gp_style->texture_offset, gp_style->gradient_shift);
5889 }
5890 /* Set Checker material as Solid. This fill mode has been removed and replaced
5891 * by textures. */
5892 if (gp_style->fill_style == GP_MATERIAL_FILL_STYLE_CHECKER) {
5894 }
5895 /* Update Alpha channel for texture opacity. */
5896 if (gp_style->fill_style == GP_MATERIAL_FILL_STYLE_TEXTURE) {
5897 gp_style->fill_rgba[3] *= gp_style->texture_opacity;
5898 }
5899 /* Stroke stencil mask to mix = 1. */
5900 if (gp_style->flag & GP_MATERIAL_STROKE_PATTERN) {
5901 gp_style->mix_stroke_factor = 1.0f;
5902 gp_style->flag &= ~GP_MATERIAL_STROKE_PATTERN;
5903 }
5904 /* Mix disabled, set mix factor to 0. */
5905 else if ((gp_style->flag & GP_MATERIAL_STROKE_TEX_MIX) == 0) {
5906 gp_style->mix_stroke_factor = 0.0f;
5907 }
5908 }
5909
5910 /* Fix Grease Pencil VFX and modifiers. */
5911 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
5912 if (ob->type != OB_GPENCIL_LEGACY) {
5913 continue;
5914 }
5915
5916 /* VFX. */
5917 LISTBASE_FOREACH (ShaderFxData *, fx, &ob->shader_fx) {
5918 switch (fx->type) {
5922 vfx->factor = 1.0f;
5923 }
5926 break;
5927 }
5928 case eShaderFxType_Pixel: {
5930 srgb_to_linearrgb_v4(vfx->rgba, vfx->rgba);
5931 break;
5932 }
5933 case eShaderFxType_Rim: {
5934 RimShaderFxData *vfx = (RimShaderFxData *)fx;
5937 break;
5938 }
5939 case eShaderFxType_Shadow: {
5942 break;
5943 }
5944 case eShaderFxType_Glow: {
5947 vfx->glow_color[3] = 1.0f;
5949 vfx->blur[1] = vfx->blur[0];
5950 break;
5951 }
5952 default:
5953 break;
5954 }
5955 }
5956
5957 /* Modifiers. */
5958 LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
5959 switch ((GpencilModifierType)md->type) {
5962 mmd->seed = 1;
5963 if ((mmd->offset[0] != 0.0f) || (mmd->offset[1] != 0.0f) || (mmd->offset[2] != 0.0f))
5964 {
5965 mmd->flag |= GP_ARRAY_USE_OFFSET;
5966 }
5967 if ((mmd->shift[0] != 0.0f) || (mmd->shift[1] != 0.0f) || (mmd->shift[2] != 0.0f)) {
5968 mmd->flag |= GP_ARRAY_USE_OFFSET;
5969 }
5970 if (mmd->object != nullptr) {
5972 }
5973 break;
5974 }
5977 float factor = mmd->factor / 25.0f;
5978 mmd->factor = (mmd->flag & GP_NOISE_MOD_LOCATION) ? factor : 0.0f;
5979 mmd->factor_thickness = (mmd->flag & GP_NOISE_MOD_STRENGTH) ? factor : 0.0f;
5980 mmd->factor_strength = (mmd->flag & GP_NOISE_MOD_THICKNESS) ? factor : 0.0f;
5981 mmd->factor_uvs = (mmd->flag & GP_NOISE_MOD_UV) ? factor : 0.0f;
5982
5983 mmd->noise_scale = (mmd->flag & GP_NOISE_FULL_STROKE) ? 0.0f : 1.0f;
5984
5985 if (mmd->curve_intensity == nullptr) {
5986 mmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
5987 if (mmd->curve_intensity) {
5989 }
5990 }
5991 break;
5992 }
5995 srgb_to_linearrgb_v3_v3(mmd->rgb, mmd->rgb);
5996 if (mmd->curve_intensity == nullptr) {
5997 mmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
5998 if (mmd->curve_intensity) {
6000 }
6001 }
6002 break;
6003 }
6006 if (mmd->curve_intensity == nullptr) {
6007 mmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
6008 if (mmd->curve_intensity) {
6010 }
6011 }
6012 break;
6013 }
6016 if (mmd->curve_intensity == nullptr) {
6017 mmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
6018 if (mmd->curve_intensity) {
6020 }
6021 }
6022 break;
6023 }
6026 if (mmd->curve_intensity == nullptr) {
6027 mmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
6028 if (mmd->curve_intensity) {
6030 }
6031 }
6032 break;
6033 }
6035 if (!DNA_struct_member_exists(
6036 fd->filesdna, "ThickGpencilModifierData", "float", "thickness_fac"))
6037 {
6039 mmd->thickness_fac = mmd->thickness;
6040 }
6041 break;
6042 }
6045 mmd->fading_opacity = 1.0 - mmd->fading_opacity;
6046 break;
6047 }
6049 const short simple = (1 << 0);
6051 if (mmd->flag & simple) {
6052 mmd->flag &= ~simple;
6053 mmd->type = GP_SUBDIV_SIMPLE;
6054 }
6055 break;
6056 }
6057 default:
6058 break;
6059 }
6060 }
6061 }
6062
6063 /* Fix Layers Colors and Vertex Colors to Linear.
6064 * Also set lights to on for layers. */
6065 LISTBASE_FOREACH (bGPdata *, gpd, &bmain->gpencils) {
6066 if (gpd->flag & GP_DATA_ANNOTATIONS) {
6067 continue;
6068 }
6069 /* Onion colors. */
6070 srgb_to_linearrgb_v3_v3(gpd->gcolor_prev, gpd->gcolor_prev);
6071 srgb_to_linearrgb_v3_v3(gpd->gcolor_next, gpd->gcolor_next);
6072 /* Z-depth Offset. */
6073 gpd->zdepth_offset = 0.150f;
6074
6075 LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
6076 gpl->flag |= GP_LAYER_USE_LIGHTS;
6077 srgb_to_linearrgb_v4(gpl->tintcolor, gpl->tintcolor);
6078 gpl->vertex_paint_opacity = 1.0f;
6079
6080 LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
6081 LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
6082 /* Set initial opacity for fill color. */
6083 gps->fill_opacity_fac = 1.0f;
6084
6085 /* Calc geometry data because in old versions this data was not saved. */
6087
6088 srgb_to_linearrgb_v4(gps->vert_color_fill, gps->vert_color_fill);
6089 int i;
6090 bGPDspoint *pt;
6091 for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
6093 }
6094 }
6095 }
6096 }
6097 }
6098 }
6099 }
6100
6101 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 8)) {
6102 if (!DNA_struct_member_exists(
6103 fd->filesdna, "View3DOverlay", "float", "sculpt_mode_face_sets_opacity"))
6104 {
6105 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
6106 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
6107 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
6108 if (sl->spacetype == SPACE_VIEW3D) {
6109 View3D *v3d = (View3D *)sl;
6111 }
6112 }
6113 }
6114 }
6115 }
6116
6117 /* Alembic Transform Cache changed from local to world space. */
6118 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
6119 LISTBASE_FOREACH (bConstraint *, con, &ob->constraints) {
6120 if (con->type == CONSTRAINT_TYPE_TRANSFORM_CACHE) {
6121 con->ownspace = CONSTRAINT_SPACE_WORLD;
6122 }
6123 }
6124 }
6125
6126 /* Boundary Edges Auto-masking. */
6127 if (!DNA_struct_member_exists(
6128 fd->filesdna, "Brush", "int", "automasking_boundary_edges_propagation_steps"))
6129 {
6130 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
6131 br->automasking_boundary_edges_propagation_steps = 1;
6132 }
6133 }
6134
6135 /* Corrective smooth modifier scale. */
6136 if (!DNA_struct_member_exists(fd->filesdna, "CorrectiveSmoothModifierData", "float", "scale"))
6137 {
6138 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
6139 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
6140 if (md->type == eModifierType_CorrectiveSmooth) {
6142 csmd->scale = 1.0f;
6143 }
6144 }
6145 }
6146 }
6147
6148 /* Default Face Set Color. */
6149 LISTBASE_FOREACH (Mesh *, me, &bmain->meshes) {
6150 if (me->faces_num > 0) {
6151 const int *face_sets = static_cast<const int *>(
6152 CustomData_get_layer(&me->face_data, CD_SCULPT_FACE_SETS));
6153 if (face_sets) {
6154 me->face_sets_color_default = abs(face_sets[0]);
6155 }
6156 }
6157 }
6158 }
6159
6160 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 11)) {
6161 if (!DNA_struct_member_exists(fd->filesdna, "OceanModifierData", "float", "fetch_jonswap")) {
6162 LISTBASE_FOREACH (Object *, object, &bmain->objects) {
6163 LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
6164 if (md->type == eModifierType_Ocean) {
6166 omd->fetch_jonswap = 120.0f;
6167 }
6168 }
6169 }
6170 }
6171
6172 if (!DNA_struct_exists(fd->filesdna, "XrSessionSettings")) {
6173 LISTBASE_FOREACH (wmWindowManager *, wm, &bmain->wm) {
6174 const View3D *v3d_default = DNA_struct_default_get(View3D);
6175
6176 wm->xr.session_settings.shading = v3d_default->shading;
6177 wm->xr.session_settings.draw_flags = (V3D_OFSDRAW_SHOW_GRIDFLOOR |
6179 wm->xr.session_settings.clip_start = v3d_default->clip_start;
6180 wm->xr.session_settings.clip_end = v3d_default->clip_end;
6181
6182 wm->xr.session_settings.flag = XR_SESSION_USE_POSITION_TRACKING;
6183 }
6184 }
6185
6186 /* Surface deform modifier strength. */
6187 if (!DNA_struct_member_exists(fd->filesdna, "SurfaceDeformModifierData", "float", "strength"))
6188 {
6189 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
6190 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
6191 if (md->type == eModifierType_SurfaceDeform) {
6193 sdmd->strength = 1.0f;
6194 }
6195 }
6196 }
6197 }
6198 }
6199
6200 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 12)) {
6201 /* Activate f-curve drawing in the sequencer. */
6202 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
6203 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
6204 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
6205 if (sl->spacetype == SPACE_SEQ) {
6206 SpaceSeq *sseq = (SpaceSeq *)sl;
6208 }
6209 }
6210 }
6211 }
6212
6213 /* Remesh Modifier Voxel Mode. */
6214 if (!DNA_struct_member_exists(fd->filesdna, "RemeshModifierData", "float", "voxel_size")) {
6215 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
6216 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
6217 if (md->type == eModifierType_Remesh) {
6219 rmd->voxel_size = 0.1f;
6220 rmd->adaptivity = 0.0f;
6221 }
6222 }
6223 }
6224 }
6225 }
6226
6227 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 14)) {
6228 /* Solidify modifier merge tolerance. */
6229 if (!DNA_struct_member_exists(
6230 fd->filesdna, "SolidifyModifierData", "float", "merge_tolerance"))
6231 {
6232 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
6233 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
6234 if (md->type == eModifierType_Solidify) {
6236 /* set to 0.0003 since that is what was used before, default now is 0.0001 */
6237 smd->merge_tolerance = 0.0003f;
6238 }
6239 }
6240 }
6241 }
6242
6243 /* Enumerator was incorrect for a time in 2.83 development.
6244 * Note that this only corrects values known to be invalid. */
6245 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
6246 RigidBodyCon *rbc = ob->rigidbody_constraint;
6247 if (rbc != nullptr) {
6248 enum {
6249 INVALID_RBC_TYPE_SLIDER = 2,
6250 INVALID_RBC_TYPE_6DOF_SPRING = 4,
6251 INVALID_RBC_TYPE_MOTOR = 7,
6252 };
6253 switch (rbc->type) {
6254 case INVALID_RBC_TYPE_SLIDER:
6255 rbc->type = RBC_TYPE_SLIDER;
6256 break;
6257 case INVALID_RBC_TYPE_6DOF_SPRING:
6259 break;
6260 case INVALID_RBC_TYPE_MOTOR:
6261 rbc->type = RBC_TYPE_MOTOR;
6262 break;
6263 }
6264 }
6265 }
6266 }
6267
6268 /* Match scale of fluid modifier gravity with scene gravity. */
6269 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 15)) {
6270 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
6271 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
6272 if (md->type == eModifierType_Fluid) {
6274 if (fmd->domain != nullptr) {
6275 mul_v3_fl(fmd->domain->gravity, 9.81f);
6276 }
6277 }
6278 }
6279 }
6280 }
6281
6282 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 16)) {
6283 /* Init SMAA threshold for grease pencil render. */
6284 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
6285 scene->grease_pencil_settings.smaa_threshold = 1.0f;
6286 }
6287 }
6288
6289 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 283, 17)) {
6290 /* Reset the cloth mass to 1.0 in brushes with an invalid value. */
6291 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
6292 if (br->sculpt_brush_type == SCULPT_BRUSH_TYPE_CLOTH) {
6293 if (br->cloth_mass == 0.0f) {
6294 br->cloth_mass = 1.0f;
6295 }
6296 }
6297 }
6298
6299 /* Set Brush default color for grease pencil. */
6300 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
6301 if (brush->gpencil_settings) {
6302 brush->rgb[0] = 0.498f;
6303 brush->rgb[1] = 1.0f;
6304 brush->rgb[2] = 0.498f;
6305 }
6306 }
6307 }
6308
6309 /* Old forgotten versioning code. */
6310 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 300, 39)) {
6311 /* Set the cloth wind factor to 1 for old forces. */
6312 if (!DNA_struct_member_exists(fd->filesdna, "PartDeflect", "float", "f_wind_factor")) {
6313 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
6314 if (ob->pd) {
6315 ob->pd->f_wind_factor = 1.0f;
6316 }
6317 }
6318 LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
6319 if (part->pd) {
6320 part->pd->f_wind_factor = 1.0f;
6321 }
6322 if (part->pd2) {
6323 part->pd2->f_wind_factor = 1.0f;
6324 }
6325 }
6326 }
6327
6328 LISTBASE_FOREACH (wmWindowManager *, wm, &bmain->wm) {
6329 /* Don't rotate light with the viewer by default, make it fixed. Shading settings can't be
6330 * edited and this flag should always be set. */
6331 wm->xr.session_settings.shading.flag |= V3D_SHADING_WORLD_ORIENTATION;
6332 }
6333 }
6334
6341}
void BKE_animdata_main_cb(struct Main *bmain, blender::FunctionRef< void(ID *, AnimData *)> func)
void BKE_fcurves_id_cb(struct ID *id, blender::FunctionRef< void(ID *, FCurve *)> func)
Blender util stuff.
Main * BKE_blender_globals_main_swap(Main *new_gmain)
Definition blender.cc:236
bool BKE_collection_object_remove(Main *bmain, Collection *collection, Object *ob, bool free_us)
Collection * BKE_collection_master_add(Scene *scene)
Collection * BKE_collection_add(Main *bmain, Collection *collection_parent, const char *name_custom)
bool BKE_collection_object_add_notest(Main *bmain, Collection *collection, Object *ob)
void BKE_curvemap_reset(CurveMap *cuma, const rctf *clipr, int preset, CurveMapSlopeType slope)
void BKE_curvemapping_changed_all(CurveMapping *cumap)
void BKE_color_managed_display_settings_init(ColorManagedDisplaySettings *settings)
void BKE_curvemapping_init(CurveMapping *cumap)
CurveMapping * BKE_curvemapping_add(int tot, float minx, float miny, float maxx, float maxy)
Definition colortools.cc:89
void BKE_color_managed_view_settings_init(ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const char *view_transform)
struct CurveProfile * BKE_curveprofile_add(eCurveProfilePresets preset)
CustomData interface, see also DNA_customdata_types.h.
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
void CustomData_free_layers(CustomData *data, eCustomDataType type)
void CustomData_update_typemap(CustomData *data)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
FCurve * BKE_fcurve_copy(const FCurve *fcu)
#define DRIVER_TARGETS_LOOPER_BEGIN(dvar)
#define DRIVER_TARGETS_LOOPER_END
void BKE_freestyle_config_free(struct FreestyleConfig *config, bool do_id_user)
Definition freestyle.cc:44
void BKE_gpencil_stroke_geometry_update(struct bGPdata *gpd, struct bGPDstroke *gps)
IDProperty * IDP_GetPropertyFromGroup(const IDProperty *prop, blender::StringRef name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:747
void IDP_FreeProperty(IDProperty *prop)
Definition idprop.cc:1251
int BKE_keyblock_curve_element_count(const ListBase *nurb)
Definition key.cc:2013
LayerCollection * BKE_layer_collection_first_from_scene_collection(const ViewLayer *view_layer, const Collection *collection)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
@ VIEWLAYER_ADD_NEW
Definition BKE_layer.hh:34
ViewLayer * BKE_view_layer_add(Scene *scene, const char *name, ViewLayer *view_layer_source, int type)
ViewLayer * BKE_view_layer_default_view(const Scene *scene)
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
void BKE_main_id_repair_duplicate_names_listbase(Main *bmain, ListBase *lb)
Definition lib_id.cc:1258
void id_fake_user_set(ID *id)
Definition lib_id.cc:396
void id_us_min(ID *id)
Definition lib_id.cc:366
#define FOREACH_MAIN_ID_END
Definition BKE_main.hh:583
ListBase * which_libbase(Main *bmain, short type)
Definition main.cc:902
#define MAIN_VERSION_FILE_ATLEAST(main, ver, subver)
Definition BKE_main.hh:658
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
Definition BKE_main.hh:577
void BKE_mesh_tessface_clear(Mesh *mesh)
void BKE_mesh_do_versions_convert_mfaces_to_mpolys(Mesh *mesh)
#define FOREACH_NODETREE_END
Definition BKE_node.hh:881
#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id)
Definition BKE_node.hh:871
#define SH_NODE_TEX_NOISE
#define CMP_NODE_TIME
#define SH_NODE_TEX_WAVE
#define SH_NODE_TEX_IMAGE
#define SH_NODE_BSDF_PRINCIPLED
#define SH_NODE_EMISSION
#define SH_NODE_ADD_SHADER
#define SH_NODE_VECTOR_MATH
#define SH_NODE_TEX_ENVIRONMENT
#define SH_NODE_CURVE_VEC
#define CMP_NODE_HUECORRECT
#define SH_NODE_MATH
#define SH_NODE_BSDF_TRANSPARENT
#define SH_NODE_AMBIENT_OCCLUSION
#define SH_NODE_SHADERTORGB
#define SH_NODE_OUTPUT_MATERIAL
#define CMP_NODE_CURVE_RGB
#define SH_NODE_TEX_VORONOI
#define SH_NODE_BSDF_GLOSSY
#define SH_NODE_TEX_MUSGRAVE_DEPRECATED
#define SH_NODE_MAPPING
#define SH_NODE_CURVE_RGB
#define SH_NODE_EEVEE_SPECULAR
#define TEX_NODE_CURVE_TIME
#define SH_NODE_BSDF_GLASS
#define SH_NODE_DISPLACEMENT
#define SH_NODE_BSDF_GLOSSY_LEGACY
#define SH_NODE_BSDF_REFRACTION
#define CMP_NODE_CURVE_VEC_DEPRECATED
#define TEX_NODE_CURVE_RGB
bool BKE_paint_ensure_from_paintmode(Scene *sce, PaintMode mode)
Definition paint.cc:326
struct PointCache * BKE_ptcache_add(struct ListBase *ptcaches)
@ RPT_INFO
Definition BKE_report.hh:35
@ RPT_ERROR
Definition BKE_report.hh:39
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:153
API for Blender-side Rigid Body stuff.
void BKE_rigidbody_constraints_collection_validate(struct Scene *scene, struct RigidBodyWorld *rbw)
void BKE_rigidbody_world_init_runtime(struct RigidBodyWorld *rbw)
Definition rigidbody.cc:96
void BKE_rigidbody_objects_collection_validate(struct Main *bmain, struct Scene *scene, struct RigidBodyWorld *rbw)
ARegion * BKE_spacedata_find_region_type(const SpaceLink *slink, const ScrArea *area, int region_type) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition screen.cc:437
void BKE_screen_remove_unused_scrverts(bScreen *screen)
Definition screen.cc:810
void BKE_screen_remove_unused_scredges(bScreen *screen)
Definition screen.cc:765
ARegion * BKE_area_region_new()
Definition screen.cc:387
void BKE_screen_area_free(ScrArea *area)
Definition screen.cc:638
SpaceType * BKE_spacetype_from_id(int spaceid)
Definition screen.cc:257
void BKE_area_region_free(SpaceType *st, ARegion *region)
Definition screen.cc:597
void BKE_screen_remove_double_scredges(bScreen *screen)
Definition screen.cc:749
void BKE_screen_view3d_shading_init(View3DShading *shading)
Definition screen.cc:1017
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
Definition screen.cc:846
@ STUDIOLIGHT_TYPE_MATCAP
@ STUDIOLIGHT_TYPE_WORLD
struct StudioLight * BKE_studiolight_find(const char *name, int flag)
struct StudioLight * BKE_studiolight_find_default(int flag)
int BKE_unit_base_of_type_get(int system, int type)
Definition unit.cc:2537
@ B_UNIT_LENGTH
Definition BKE_unit.hh:137
@ B_UNIT_MASS
Definition BKE_unit.hh:140
@ B_UNIT_TIME
Definition BKE_unit.hh:142
WorkSpaceLayout * BKE_workspace_layout_find(const WorkSpace *workspace, const bScreen *screen) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT
Definition workspace.cc:429
WorkSpace * BKE_workspace_add(Main *bmain, const char *name)
Definition workspace.cc:319
void BKE_workspace_tool_remove(WorkSpace *workspace, bToolRef *tref) ATTR_NONNULL(1
WorkSpaceInstanceHook * BKE_workspace_instance_hook_create(const Main *bmain, int winid)
Definition workspace.cc:339
WorkSpaceLayout * BKE_workspace_layout_add(Main *bmain, WorkSpace *workspace, bScreen *screen, const char *name) ATTR_NONNULL()
Definition workspace.cc:380
void BKE_workspace_active_layout_set(WorkSpaceInstanceHook *hook, int winid, WorkSpace *workspace, WorkSpaceLayout *layout) SETTER_ATTRS
Activate a layout.
Definition workspace.cc:605
bScreen * BKE_workspace_active_screen_get(const WorkSpaceInstanceHook *hook) GETTER_ATTRS
Definition workspace.cc:614
void BKE_workspace_active_set(WorkSpaceInstanceHook *hook, WorkSpace *workspace) SETTER_ATTRS
Definition workspace.cc:567
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:534
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:608
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:270
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:497
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:111
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:332
#define LISTBASE_FOREACH_BACKWARD_MUTABLE(type, var, list)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:131
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:91
void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:371
void void BLI_INLINE bool BLI_listbase_is_single(const ListBase *lb)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE void srgb_to_linearrgb_v4(float linear[4], const float srgb[4])
void srgb_to_linearrgb_v3_v3(float linear[3], const float srgb[3])
#define M_SQRT1_3
#define M_PI_2
#define M_PI_4
@ EULER_ORDER_XYZ
@ EULER_ORDER_ZYX
void quat_to_eulO(float e[3], short order, const float q[4])
void eulO_to_quat(float q[4], const float e[3], short order)
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void copy_v4_fl(float r[4], float f)
MINLINE void copy_v2_fl(float r[2], float f)
@ BLI_MEMPOOL_ALLOW_ITER
BLI_mempool * BLI_mempool_create(unsigned int esize, unsigned int elem_num, unsigned int pchunk, unsigned int flag) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
void * BLI_mempool_calloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
char * BLI_sprintfN(const char *__restrict format,...) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_PRINTF_FORMAT(1
int bool BLI_str_startswith(const char *__restrict str, const char *__restrict start) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
char * BLI_strdupcat(const char *__restrict str1, const char *__restrict str2) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
#define STR_ELEM(...)
Definition BLI_string.h:661
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition string.cc:30
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:693
int bool bool BLI_str_endswith(const char *__restrict str, const char *__restrict end) ATTR_NONNULL(1
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define SNPRINTF_UTF8(dst, format,...)
#define STRNCPY_UTF8(dst, src)
#define STRPREFIX(a, b)
#define ARRAY_SIZE(arr)
#define ARRAY_SET_ITEMS(...)
#define ENUM_OPERATORS(_type, _max)
#define UNUSED_VARS_NDEBUG(...)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define ELEM(...)
#define STREQ(a, b)
void BLO_reportf_wrap(BlendFileReadReport *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
external readfile function prototypes.
#define BLO_read_assert_message(_check_expr, _ret_value, _bh, _bmain, _message)
#define RPT_(msgid)
#define DATA_(msgid)
@ ID_TAG_INDIRECT
Definition DNA_ID.h:848
#define ID_IS_LINKED(_id)
Definition DNA_ID.h:694
#define MAX_ID_NAME
Definition DNA_ID.h:373
@ ID_FLAG_EMBEDDED_DATA
Definition DNA_ID.h:774
@ ID_BR
@ ID_MA
@ ID_GR
@ ADS_FILTER_SUMMARY
@ ROT_MODE_XYZ
@ ADS_FLAG_SUMMARY_COLLAPSED
@ POSE_RECALC
@ SACTCONT_TIMELINE
@ SACTCONT_DOPESHEET
@ SACTION_SHOW_INTERPOLATION
@ SACTION_SHOW_EXTREMES
@ SACTION_SHOW_MARKERS
@ BBONE_HANDLE_AUTO
@ BBONE_HANDLE_ABSOLUTE
@ BBONE_HANDLE_RELATIVE
@ ARM_DRAW_RELATION_FROM_HEAD
@ ARM_BCOLL_SOLO_ACTIVE
@ ARM_FLAG_UNUSED_12
@ ARM_FLAG_UNUSED_7
@ ARM_FLAG_UNUSED_1
@ ARM_FLAG_UNUSED_9
@ BONE_INHERIT_SCALE_NONE_LEGACY
@ GPAINT_BRUSH_TYPE_ERASE
@ SCULPT_BRUSH_TYPE_CLOTH
@ SCULPT_BRUSH_TYPE_POSE
@ SCULPT_BRUSH_TYPE_PAINT
@ SCULPT_BRUSH_TYPE_CLAY_STRIPS
@ VPAINT_BRUSH_TYPE_AVERAGE
@ VPAINT_BRUSH_TYPE_DRAW
@ VPAINT_BRUSH_TYPE_SMEAR
@ VPAINT_BRUSH_TYPE_BLUR
@ BRUSH_USE_CONNECTED_ONLY
@ BRUSH_POSE_IK_ANCHORED
@ CAM_DOF_ENABLED
@ CAM_ORTHO
@ CLOTH_BENDING_LINEAR
@ CLOTH_COLLSETTINGS_FLAG_ENABLED
@ CLOTH_COLLSETTINGS_FLAG_SELF
@ CLOTH_SIMSETTINGS_FLAG_GOAL
@ CLOTH_SIMSETTINGS_FLAG_SCALING
@ CLOTH_SIMSETTINGS_FLAG_SEW
Object groups, one object can be in many groups at once.
@ COLLECTION_HIDE_RENDER
@ COLLECTION_HIDE_SELECT
@ COLLECTION_HIDE_VIEWPORT
#define CM_TOT
@ CUMA_EXTEND_EXTRAPOLATE
@ CUMA_DO_CLIP
@ CURVE_PRESET_GAUSS
@ CURVE_PRESET_BELL
@ ROTLIKE_MIX_OFFSET
@ ROTLIKE_MIX_REPLACE
@ CONSTRAINT_TYPE_ROTLIKE
@ CONSTRAINT_TYPE_SPLINEIK
@ CONSTRAINT_TYPE_SIZELIKE
@ CONSTRAINT_TYPE_SAMEVOL
@ CONSTRAINT_TYPE_TRANSFORM_CACHE
@ CONSTRAINT_SPLINEIK_YS_FIT_CURVE
@ CONSTRAINT_SPACE_WORLD
@ CONSTRAINT_SPACE_LOCAL
@ SAMEVOL_UNIFORM
@ PROF_PRESET_LINE
@ CD_PROP_FLOAT2
#define DNA_struct_default_get(struct_name)
blenloader genfile private function prototypes
#define GP_DEFAULT_PIX_FACTOR
#define GP_DEFAULT_GRID_LINES
@ eGpencilModifierType_Array
@ eGpencilModifierType_Noise
@ eGpencilModifierType_Color
@ eGpencilModifierType_Multiply
@ eGpencilModifierType_Subdiv
@ eGpencilModifierType_Opacity
@ eGpencilModifierType_Hook
@ eGpencilModifierType_Smooth
@ eGpencilModifierType_Tint
@ eGpencilModifierType_Thick
@ IMA_FLAG_UNUSED_16
@ IMA_FLAG_UNUSED_8
@ IMA_FLAG_UNUSED_6
@ IMA_FLAG_UNUSED_1
@ IMA_FLAG_UNUSED_15
@ IMA_HIGH_BITDEPTH
@ IMA_FLAG_UNUSED_4
@ IMA_ALPHA_IGNORE
@ IMA_TYPE_R_RESULT
@ LAYER_COLLECTION_EXCLUDE
@ LAYER_COLLECTION_INDIRECT_ONLY
@ LAYER_COLLECTION_HOLDOUT
@ VIEW_LAYER_FREESTYLE
@ VIEW_LAYER_RENDER
@ LA_AREA
@ LA_LOCAL
@ LA_SPOT
@ LA_SUN
@ LA_SHADOW
@ LS_MODIFIER_NOISE
@ LS_MODIFIER_TANGENT
@ LS_MODIFIER_CREASE_ANGLE
@ LS_MODIFIER_DISTANCE_FROM_OBJECT
@ LS_MODIFIER_CURVATURE_3D
@ LS_MODIFIER_ALONG_STROKE
@ LS_MODIFIER_MATERIAL
@ LS_MODIFIER_DISTANCE_FROM_CAMERA
@ MA_BM_SOLID
@ MA_BM_BLEND
@ MA_BS_SOLID
@ GP_MATERIAL_STROKE_PATTERN
@ GP_MATERIAL_STROKE_TEX_MIX
@ GP_MATERIAL_STROKE_SHOW
@ GP_MATERIAL_FILL_SHOW
@ GP_MATERIAL_FILL_STYLE_GRADIENT
@ GP_MATERIAL_FILL_STYLE_TEXTURE
@ GP_MATERIAL_FILL_STYLE_CHECKER
@ GP_MATERIAL_FILL_STYLE_SOLID
@ ME_REMESH_REPROJECT_ATTRIBUTES
@ ME_FLAG_UNUSED_6
@ ME_FLAG_UNUSED_4
@ ME_FLAG_UV_SELECT_SYNC_VALID
@ ME_FLAG_UNUSED_7
@ ME_FLAG_UNUSED_1
@ ME_FLAG_UNUSED_0
@ GP_ARRAY_USE_OFFSET
@ GP_ARRAY_USE_OB_OFFSET
@ MOD_SHRINKWRAP_ABOVE_SURFACE
@ GP_NOISE_MOD_UV
@ GP_NOISE_MOD_STRENGTH
@ GP_NOISE_MOD_THICKNESS
@ GP_NOISE_FULL_STROKE
@ GP_NOISE_MOD_LOCATION
@ eMultiresModifierFlag_PlainUv_DEPRECATED
@ eMultiresModifierFlag_UseCrease
@ eModifierType_ParticleSystem
@ eModifierType_Solidify
@ eModifierType_Subsurf
@ eModifierType_Cloth
@ eModifierType_Fluid
@ eModifierType_Shrinkwrap
@ eModifierType_Hook
@ eModifierType_Ocean
@ eModifierType_DataTransfer
@ eModifierType_UVWarp
@ eModifierType_SurfaceDeform
@ eModifierType_Warp
@ eModifierType_CorrectiveSmooth
@ eModifierType_Bevel
@ eModifierType_Remesh
@ eModifierType_WeightVGEdit
@ eModifierType_Multires
@ eModifierType_Triangulate
@ eSubsurfModifierFlag_SubsurfUv_DEPRECATED
@ eSubsurfModifierFlag_UseCrease
@ SUBSURF_UV_SMOOTH_PRESERVE_CORNERS
@ SUBSURF_UV_SMOOTH_NONE
@ NODE_VECTOR_MATH_NORMALIZE
@ NODE_VECTOR_MATH_LENGTH
@ NODE_VECTOR_MATH_CROSS_PRODUCT
@ NODE_VECTOR_MATH_ADD
@ NODE_VECTOR_MATH_DOT_PRODUCT
@ NODE_VECTOR_MATH_ABSOLUTE
@ NODE_VECTOR_MATH_MAXIMUM
@ NODE_VECTOR_MATH_SUBTRACT
@ NODE_VECTOR_MATH_MINIMUM
@ SHD_VORONOI_EUCLIDEAN
@ SHD_WAVE_PROFILE_SIN
@ SHD_SPACE_OBJECT
@ SHD_SPACE_WORLD
@ NODE_MATH_ABSOLUTE
@ NODE_MATH_SINE
@ NODE_MATH_ARCCOSINE
@ NODE_MATH_POWER
@ NODE_MATH_ARCTANGENT
@ NODE_MATH_SQRT
@ NODE_MATH_CEIL
@ NODE_MATH_FRACTION
@ NODE_MATH_ARCSINE
@ NODE_MATH_MULTIPLY
@ NODE_MATH_ROUND
@ NODE_MATH_FLOOR
@ NODE_MATH_SUBTRACT
@ NODE_MATH_COSINE
@ NODE_MATH_TANGENT
@ SHD_VORONOI_F2
@ SHD_VORONOI_F1
@ SHD_OUTPUT_CYCLES
@ SHD_OUTPUT_ALL
@ SHD_OUTPUT_EEVEE
@ SHD_SUBSURFACE_BURLEY
@ SHD_SUBSURFACE_RANDOM_WALK_SKIN
@ SHD_WAVE_BANDS_DIRECTION_DIAGONAL
@ SHD_GLOSSY_MULTI_GGX
@ SHD_AO_LOCAL
@ NODE_COLLAPSED
@ NTREE_SHADER
@ SOCK_OUT
@ SOCK_IN
@ SHD_WAVE_RINGS_DIRECTION_SPHERICAL
@ SOCK_IS_LINKED
@ SOCK_VECTOR
@ SOCK_SHADER
@ SOCK_FLOAT
@ SOCK_RGBA
@ OB_TEXTURE
@ OB_SOLID
@ OB_RENDER
@ OB_MATERIAL
@ OB_MODE_WEIGHT_PAINT
@ OB_MODE_SCULPT
@ OB_MODE_VERTEX_PAINT
Object is a sort of wrapper for general info.
@ OB_EMPTY_IMAGE_HIDE_ORTHOGRAPHIC
@ OB_EMPTY_IMAGE_HIDE_BACK
@ OB_EMPTY_IMAGE_HIDE_PERSPECTIVE
@ PAROBJECT
@ OB_EMPTY
@ OB_CAMERA
@ OB_GPENCIL_LEGACY
@ OB_ADS_UNUSED_1
@ OB_ADS_UNUSED_2
@ OB_FLAG_ACTIVE_CLIPBOARD
@ OB_FLAG_USE_SIMULATION_CACHE
@ OB_TRANSFORM_ADJUST_ROOT_PARENT_FOR_VIEW_LOCK
@ OB_DUPLI
@ OB_TRANSFLAG_UNUSED_1
@ OB_TRANSFLAG_UNUSED_12
@ OB_TRANSFLAG_UNUSED_6
@ OB_TRANSFLAG_UNUSED_3
@ OB_DUPLICOLLECTION
@ OB_DUPLI_FLAG_VIEWPORT
@ OB_DUPLI_FLAG_RENDER
@ TSE_LAYER_COLLECTION
@ TSE_CLOSED
@ PART_SHAPE_CLOSE_TIP
@ PART_DRAW_NOT
@ PART_DRAW_BB
Types and defines for representing Rigid Body entities.
@ RBC_TYPE_SLIDER
@ RBC_TYPE_MOTOR
@ RBC_TYPE_6DOF_SPRING
@ UNIFIED_PAINT_FLAG_UNUSED_0
@ UNIFIED_PAINT_FLAG_UNUSED_1
#define BASE_SELECTED(v3d, base)
@ PE_UNUSED_6
@ R_SEQ_UNUSED_0
@ R_SEQ_UNUSED_2
@ R_SEQ_UNUSED_1
@ SCULPT_FLAG_UNUSED_1
@ SCULPT_FLAG_UNUSED_2
@ SCULPT_FLAG_UNUSED_0
@ SCULPT_FLAG_UNUSED_6
@ SCE_LAY_DISABLE
@ SCE_LAY_FRS
@ R_MODE_UNUSED_13
@ R_MODE_UNUSED_6
@ R_MODE_UNUSED_5
@ R_MODE_UNUSED_8
@ R_MODE_UNUSED_4
@ R_MODE_UNUSED_2
@ R_MODE_UNUSED_18
@ R_MODE_UNUSED_17
@ R_MODE_UNUSED_10
@ R_MODE_UNUSED_7
@ R_MODE_UNUSED_19
@ R_MODE_UNUSED_3
@ R_MODE_UNUSED_16
@ R_MODE_UNUSED_21
@ R_MODE_UNUSED_20
@ R_SIMPLIFY_NORMALS
@ R_MODE_UNUSED_27
@ GP_LOCKAXIS_Y
@ FFM_PRESET_GOOD
@ FFM_PRESET_REALTIME
@ FFM_PRESET_BEST
@ PAINT_SHOW_BRUSH
@ SCE_DISPLAY_AA_SAMPLES_8
@ SCE_DISPLAY_AA_FXAA
@ R_COLOR_MANAGEMENT_UNUSED_1
@ GP_PROJECT_VIEWSPACE
@ GP_PROJECT_CURSOR
@ SCE_SNAP_TRANSFORM_MODE_TRANSLATE
@ R_ADDSKY
@ R_ALPHAPREMUL
#define USER_UNIT_ADAPTIVE
@ SCE_EEVEE_SSR_ENABLED
@ SCE_EEVEE_TAA_REPROJECTION
@ SCE_EEVEE_GTAO_ENABLED
@ SCE_EEVEE_MOTION_BLUR_ENABLED_DEPRECATED
@ PE_BRUSH_COMB
@ USER_UNIT_NONE
#define BASE_SELECTABLE(v3d, base)
@ SCE_PASS_COMBINED
@ R_SCEMODE_UNUSED_19
@ R_SCEMODE_UNUSED_16
@ R_SCEMODE_UNUSED_11
@ R_SCEMODE_UNUSED_13
@ R_SCEMODE_UNUSED_17
@ R_SCEMODE_UNUSED_8
@ SCE_SNAP_TO_GRID
@ AREA_FLAG_UNUSED_6
@ RGN_ALIGN_BOTTOM
@ RGN_ALIGN_LEFT
@ RGN_ALIGN_TOP
@ RGN_ALIGN_RIGHT
@ RGN_SPLIT_PREV
@ SCREENFULL
@ SCREENMAXIMIZED
@ RGN_TYPE_CHANNELS
@ RGN_TYPE_TOOL_HEADER
@ RGN_TYPE_EXECUTE
@ RGN_TYPE_UI
@ RGN_TYPE_WINDOW
@ RGN_TYPE_PREVIEW
@ RGN_TYPE_NAV_BAR
@ RGN_TYPE_FOOTER
@ RGN_TYPE_HEADER
@ RGN_TYPE_TOOLS
@ RGN_TYPE_TOOL_PROPS
@ RGN_FLAG_DYNAMIC_SIZE
@ RGN_FLAG_HIDDEN
@ RGN_FLAG_HIDDEN_BY_USER
@ eSeqModifierType_Curves
@ eSeqModifierType_HueCorrect
@ SEQ_CACHE_STORE_FINAL_OUT
@ STRIP_TYPE_SOUND_HD
@ STRIP_TYPE_SOUND_RAM
@ STRIP_TYPE_SPEED
@ SEQ_SPEED_UNUSED_1
@ eShaderFxColorizeMode_GrayScale
@ eShaderFxColorizeMode_Sepia
@ eShaderFxType_Pixel
@ eShaderFxType_Rim
@ eShaderFxType_Glow
@ eShaderFxType_Shadow
@ eShaderFxType_Colorize
@ SI_FLAG_UNUSED_8
@ SI_FLAG_UNUSED_0
@ SI_FLAG_UNUSED_7
@ SI_FLAG_UNUSED_17
@ SI_FLAG_UNUSED_23
@ SI_FLAG_UNUSED_3
@ SI_FLAG_UNUSED_24
@ SI_FLAG_UNUSED_1
@ SI_FLAG_UNUSED_18
@ SI_FLAG_UNUSED_6
@ SNODE_FLAG_UNUSED_6
@ SNODE_FLAG_UNUSED_11
@ SNODE_FLAG_UNUSED_10
@ SPACE_TEXT
@ SPACE_CLIP
@ SPACE_ACTION
@ SPACE_OUTLINER
@ SPACE_NODE
@ SPACE_USERPREF
@ SPACE_FILE
@ SPACE_PROPERTIES
@ SPACE_NLA
@ SPACE_SEQ
@ SPACE_EMPTY
@ SPACE_IMAGE
@ SPACE_GRAPH
@ SPACE_VIEW3D
@ SPACE_INFO
@ SEQ_TIMELINE_SHOW_FCURVES
@ SC_VIEW_GRAPH
@ FILE_DETAILS_DATETIME
@ FILE_DETAILS_SIZE
@ SIPO_SHOW_MARKERS
@ SO_RESTRICT_HIDE
@ SO_RESTRICT_ENABLE
@ SO_FILTER_CLEARED_1
@ SO_FILTER_OB_STATE_SELECTABLE
@ SO_FILTER_UNUSED_5
@ SNLA_FLAG_UNUSED_0
@ SNLA_FLAG_UNUSED_1
@ SNLA_FLAG_UNUSED_3
@ SNLA_SHOW_MARKERS
@ SO_SYNC_SELECT
@ SO_FLAG_UNUSED_1
@ SB_FLAG_UNUSED_3
@ SB_FLAG_UNUSED_2
@ SO_TREESTORE_UNUSED_1
@ FILE_PARAMS_FLAG_UNUSED_3
@ FILE_PARAMS_FLAG_UNUSED_1
@ FILE_PARAMS_FLAG_UNUSED_2
@ SEQ_SHOW_MARKERS
@ SO_SEQUENCE
@ SO_DATA_API
@ SO_LIBRARIES
@ SO_VIEW_LAYER
@ SO_SCENES
@ SO_ID_ORPHANS
@ TXT_FLAG_UNUSED_9
@ TXT_FLAG_UNUSED_8
@ TEXMAP_CLIP_MIN
@ TEXMAP_CLIP_MAX
@ USER_HEADER_BOTTOM
@ V2D_SCROLL_LEFT
@ V2D_SCROLL_RIGHT
@ V3D_OFSDRAW_SHOW_GRIDFLOOR
@ V3D_OFSDRAW_SHOW_ANNOTATION
@ V3D_SHADING_TEXTURE_COLOR
@ V3D_SHADING_MATERIAL_COLOR
@ V3D_SHADING_SINGLE_COLOR
@ V3D_LIGHTING_STUDIO
@ V3D_FLAG2_UNUSED_15
@ V3D_FLAG2_UNUSED_14
@ V3D_FLAG2_UNUSED_6
@ V3D_FLAG2_UNUSED_12
@ V3D_FLAG2_UNUSED_13
@ V3D_SHADING_SCENE_WORLD_RENDER
@ V3D_SHADING_SPECULAR_HIGHLIGHT
@ V3D_SHADING_WORLD_ORIENTATION
@ V3D_SHADING_OBJECT_OUTLINE
@ V3D_SHADING_SCENE_LIGHTS_RENDER
@ V3D_SHADING_XRAY_WIREFRAME
@ V3D_SHADING_BACKFACE_CULLING
@ V3D_GP_SHOW_EDIT_LINES
@ V3D_AROUND_CENTER_MEDIAN
@ V3D_GIZMO_SHOW_ARMATURE_BBONE
@ V3D_GIZMO_SHOW_ARMATURE_ROLL
@ V3D_LOCAL_COLLECTIONS
@ V3D_FLAG_UNUSED_10
@ V3D_FLAG_UNUSED_1
@ V3D_FLAG_UNUSED_12
@ V3D_OVERLAY_EDIT_FREESTYLE_FACE
@ V3D_OVERLAY_EDIT_RETOPOLOGY
@ V3D_OVERLAY_EDIT_CREASES
@ V3D_OVERLAY_EDIT_FREESTYLE_EDGE
@ V3D_OVERLAY_EDIT_FACES
@ V3D_OVERLAY_EDIT_SEAMS
@ V3D_OVERLAY_EDIT_BWEIGHTS
@ V3D_OVERLAY_EDIT_SHARP
@ V3D_GIZMO_SHOW_EMPTY_FORCE_FIELD
@ V3D_GIZMO_SHOW_EMPTY_IMAGE
@ V3D_SHOW_ORTHO_GRID
@ V3D_GIZMO_SHOW_CAMERA_DOF_DIST
@ V3D_GIZMO_SHOW_CAMERA_LENS
@ V3D_GIZMO_SHOW_LIGHT_LOOK_AT
@ V3D_GIZMO_SHOW_LIGHT_SIZE
#define WM_OUTLINER_SYNC_SELECT_FROM_ALL
@ WO_MODE_UNUSED_5
@ WO_MODE_UNUSED_7
@ WO_MODE_UNUSED_2
@ WO_MODE_UNUSED_1
@ WO_MODE_UNUSED_3
@ WO_MODE_UNUSED_4
@ XR_SESSION_USE_POSITION_TRACKING
static AppView * view
@ COLOR_ROLE_DATA
const char * IMB_colormanagement_role_colorspace_name_get(int role)
@ IMB_BLEND_EXCLUSION
Definition IMB_imbuf.hh:198
@ IMB_BLEND_DIFFERENCE
Definition IMB_imbuf.hh:197
@ IMB_BLEND_HARDLIGHT
Definition IMB_imbuf.hh:188
@ IMB_BLEND_COLORDODGE
Definition IMB_imbuf.hh:191
@ IMB_BLEND_ERASE_ALPHA
Definition IMB_imbuf.hh:185
@ IMB_BLEND_SCREEN
Definition IMB_imbuf.hh:192
@ IMB_BLEND_HUE
Definition IMB_imbuf.hh:199
@ IMB_BLEND_MUL
Definition IMB_imbuf.hh:182
@ IMB_BLEND_ADD_ALPHA
Definition IMB_imbuf.hh:186
@ IMB_BLEND_DARKEN
Definition IMB_imbuf.hh:184
@ IMB_BLEND_OVERLAY
Definition IMB_imbuf.hh:187
@ IMB_BLEND_SATURATION
Definition IMB_imbuf.hh:200
@ IMB_BLEND_LUMINOSITY
Definition IMB_imbuf.hh:201
@ IMB_BLEND_LIGHTEN
Definition IMB_imbuf.hh:183
@ IMB_BLEND_SOFTLIGHT
Definition IMB_imbuf.hh:193
@ IMB_BLEND_MIX
Definition IMB_imbuf.hh:179
@ IMB_BLEND_ADD
Definition IMB_imbuf.hh:180
@ IMB_BLEND_SUB
Definition IMB_imbuf.hh:181
Read Guarded memory(de)allocation.
struct bNode * ntreeShaderOutputNode(struct bNodeTree *ntree, int target)
#define U
BMesh const char void * data
nullptr float
#define SELECT
#define offsetof(t, d)
#define input
#define printf(...)
#define abs
const ccl_global KernelWorkTile * tile
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:123
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
static void error(const char *str)
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
Definition node.cc:2532
void node_remove_link(bNodeTree *ntree, bNodeLink &link)
Definition node.cc:3847
bNode * node_add_static_node(const bContext *C, bNodeTree &ntree, int type)
Definition node.cc:3500
bNodeLink & node_add_link(bNodeTree &ntree, bNode &fromnode, bNodeSocket &fromsock, bNode &tonode, bNodeSocket &tosock)
Definition node.cc:3810
bNodeTree * node_tree_from_id(ID *id)
Definition node.cc:4568
void foreach_strip(ListBase *seqbase, ForEachFunc callback, void *user_data)
Definition iterator.cc:59
const StripModifierTypeInfo * modifier_type_info_get(int type)
void strip_unique_name_set(Scene *scene, ListBase *seqbasep, Strip *strip)
const char * name
#define sqrtf
#define atanf
const char * RE_engine_id_CYCLES
Definition scene.cc:1583
const char * RE_engine_id_BLENDER_WORKBENCH
Definition scene.cc:1582
const char * RE_engine_id_BLENDER_EEVEE
Definition scene.cc:1580
ARegionRuntimeHandle * runtime
struct ARegion * next
ListBase drivers
float vec[4]
struct CurveProfile * custom_profile
float vec[3][3]
struct CameraDOFSettings dof
struct ClothSimSettings * sim_parms
struct ClothCollSettings * coll_parms
float internal_spring_max_diversion
CurveMapPoint * curve
CurveMap cm[4]
struct CurveMapping curve_mapping
ListBase seqbase
bActionGroup * grp
char * rna_path
ChannelDriver * driver
BlendFileReadReport * reports
Definition readfile.hh:192
SDNA * filesdna
Definition readfile.hh:105
struct FluidDomainSettings * domain
struct CurveMapping * custom_ipo
struct CurveMapping * cur_primitive
struct CurveMapping * cur_falloff
struct CurveMapping * curfalloff
struct CurveMapping curve_mapping
Definition DNA_ID.h:414
int tag
Definition DNA_ID.h:442
struct Library * lib
Definition DNA_ID.h:420
char name[258]
Definition DNA_ID.h:432
short flag
Definition DNA_ID.h:438
ColorManagedColorspaceSettings colorspace_settings
ListBase layer_collections
unsigned short local_collections_bits
ID id
Definition DNA_ID.h:550
short use_nodes
struct bNodeTree * nodetree
short type
void * last
void * first
ListBase lightprobes
Definition BKE_main.hh:296
ListBase brushes
Definition BKE_main.hh:302
bool is_locked_for_linking
Definition BKE_main.hh:224
ListBase scenes
Definition BKE_main.hh:278
ListBase wm
Definition BKE_main.hh:307
ListBase textures
Definition BKE_main.hh:285
ListBase actions
Definition BKE_main.hh:300
ListBase texts
Definition BKE_main.hh:294
ListBase meshes
Definition BKE_main.hh:281
ListBase lights
Definition BKE_main.hh:288
ListBase particles
Definition BKE_main.hh:303
ListBase materials
Definition BKE_main.hh:284
ListBase linestyles
Definition BKE_main.hh:313
ListBase cameras
Definition BKE_main.hh:289
ListBase armatures
Definition BKE_main.hh:299
ListBase curves
Definition BKE_main.hh:282
ListBase worlds
Definition BKE_main.hh:291
ListBase screens
Definition BKE_main.hh:292
ListBase workspaces
Definition BKE_main.hh:315
ListBase collections
Definition BKE_main.hh:298
ListBase images
Definition BKE_main.hh:286
ListBase gpencils
Definition BKE_main.hh:309
ListBase objects
Definition BKE_main.hh:280
struct MaterialGPencilStyle * gp_style
struct bGPdata * gpd
struct CurveMapping * cavity_curve
struct ParticleSystem * psys
struct ClothModifierData * clmd
char engine[32]
struct FFMpegCodecData ffcodecdata
char name[64]
struct PointCache * pointcache
struct RigidBodyWorld_Shared * shared
struct Collection * master_collection
string name
Definition scene.h:117
struct Editing * ed
struct RenderData r
ListBase view_layers
ListBase spacedata
struct SpaceType * type
ListBase regionbase
struct PointCache * pointcache
struct SoftBody_Shared * shared
struct MovieClip * clip
struct wmOperator * op
FileSelectParams * params
int tile_grid_shape[2]
struct bGPdata * gpd
struct BLI_mempool * treestore
SpaceLink *(* create)(const ScrArea *area, const Scene *scene)
Definition BKE_screen.hh:93
void * effectdata
ListBase seqbase
char name[FILE_MAXFILE]
struct CurveMapping * curve_intensity
struct ImagePaintSettings imapaint
struct CurveProfile * custom_bevel_profile_preset
struct GP_Interpolate_Settings gp_interpolate
struct ParticleEditSettings particle
struct GP_Sculpt_Settings gp_sculpt
float sculpt_mode_mask_opacity
float sculpt_mode_face_sets_opacity
float texture_paint_mode_opacity
float vertex_paint_mode_opacity
float gpencil_vertex_paint_opacity
float weight_paint_mode_opacity
float background_color[3]
float curvature_valley_factor
char studio_light[256]
char lookdev_light[256]
struct IDProperty * prop
float vertex_opacity
View3DOverlay overlay
char gizmo_show_armature
char gizmo_show_light
char gizmo_show_camera
char gizmo_show_empty
View3DShading shading
float clip_start
struct FreestyleConfig freestyle_config
struct IDProperty * id_properties
ListBase layer_collections
struct World * world_override
struct Base * basact
float pass_alpha_threshold
struct Material * mat_override
char name[64]
struct CurveMapping * curfalloff
struct CurveMapping * cmap_curve
Wrapper for bScreen.
struct bNodeLink * link
char identifier[64]
ListBase nodes
ListBase links
struct AnimData * adt
int16_t custom1
float width
ListBase inputs
float height
float locx_legacy
struct ID * id
char name[64]
int16_t type_legacy
float locy_legacy
void * storage
ListBase outputs
int16_t custom2
ListBase areabase
i
Definition text_draw.cc:230
static int blend(const Tex *tex, const float texvec[3], TexResult *texres)
static bNode * add_node(bNodeTree *ntree, const int type, const blender::float2 loc)
static void update_musgrave_node_color_output(bNodeTree *ntree)
static void do_version_collection_propagate_lib_to_children(Collection *collection)
void blo_do_versions_280(FileData *fd, Library *, Main *bmain)
static void update_vector_math_node_average_operator(bNodeTree *ntree)
#define PAINT_BLEND_DIFFERENCE
#define PAINT_BLEND_EXCLUSION
static void do_versions_material_convert_legacy_blend_mode(bNodeTree *ntree, char blend_method)
#define PAINT_BLEND_COLORDODGE
static void do_version_layers_to_collections(Main *bmain, Scene *scene)
static void do_versions_area_ensure_tool_region(Main *bmain, const short space_type, const short region_flag)
static void update_voronoi_node_f3_and_f4(bNodeTree *ntree)
static void light_emission_unify(Light *light, const char *engine)
static void update_voronoi_node_fac_output(bNodeTree *ntree)
#define PAINT_BLEND_SATURATION
#define EEVEE_GET_FLOAT(_props, _name)
static void ambient_occlusion_node_relink(bNodeTree *ntree)
static void update_wave_node_directions_and_offset(bNodeTree *ntree)
#define PAINT_BLEND_SUB
static void do_version_curvemapping_walker(Main *bmain, void(*callback)(CurveMapping *cumap))
static bScreen * screen_parent_find(const bScreen *screen)
static void do_versions_remove_region(ListBase *regionbase, ARegion *region)
#define PAINT_BLEND_LUMINOSITY
static void do_versions_remove_regions_by_type(ListBase *regionbase, int regiontype)
static void light_emission_node_to_energy(Light *light, float *energy, float color[3])
static void displacement_node_insert(bNodeTree *ntree)
eNTreeDoVersionErrors
static void update_math_node_single_operand_operators(bNodeTree *ntree)
static bool replace_bbone_scale_rnapath(char **p_old_path)
static void displacement_principled_nodes(bNode *node)
static void update_voronoi_node_dimensions(bNodeTree *ntree)
static void update_mapping_node_inputs_and_properties(bNodeTree *ntree)
#define PAINT_BLEND_HARDLIGHT
#define PAINT_BLEND_AVERAGE
#define EEVEE_GET_BOOL(_props, _name, _flag)
static void do_version_bbone_scale_fcurve_fix(ListBase *curves, FCurve *fcu)
static void update_musgrave_node_dimensions(bNodeTree *ntree)
#define PAINT_BLEND_BLUR
#define EEVEE_GET_INT(_props, _name)
static void square_roughness_node_insert(bNodeTree *ntree)
#define PAINT_BLEND_ALPHA_ADD
static void do_version_curvemapping_flag_extend_extrapolate(CurveMapping *cumap)
static void do_version_constraints_copy_rotation_mix_mode(ListBase *lb)
static void update_vector_math_node_normalize_operator(bNodeTree *ntree)
static void update_vector_math_node_add_and_subtract_operators(bNodeTree *ntree)
static void do_version_workspaces_after_lib_link(Main *bmain)
After lib-link versioning for new workspace design.
void do_versions_after_linking_280(FileData *fd, Main *bmain)
#define PAINT_BLEND_OVERLAY
#define PAINT_BLEND_ALPHA_SUB
#define CUMA_EXTEND_EXTRAPOLATE_OLD
#define PAINT_BLEND_SOFTLIGHT
#define PAINT_BLEND_SMEAR
#define PAINT_BLEND_SCREEN
static void do_version_workspaces_create_from_screens(Main *bmain)
static void vector_curve_node_remap(bNode *node)
#define PAINT_BLEND_LIGHTEN
static void update_vector_math_node_operators_enum_mapping(bNodeTree *ntree)
static ARegion * do_versions_find_region_or_null(ListBase *regionbase, int regiontype)
static void do_version_area_change_space_to_space_action(ScrArea *area, const Scene *scene)
static void image_node_colorspace(bNode *node)
static void do_versions_seq_set_cache_defaults(Editing *ed)
static void do_version_constraints_maintain_volume_mode_uniform(ListBase *lb)
static void do_versions_seq_alloc_transform_and_crop(ListBase *seqbase)
static void update_vector_math_node_cross_product_operator(bNodeTree *ntree)
#define PAINT_BLEND_MIX
#define PAINT_BLEND_DARKEN
static void do_versions_seq_unique_name_all_strips(Scene *sce, ListBase *seqbasep)
static void update_voronoi_node_square_distance(bNodeTree *ntree)
static void do_versions_local_collection_bits_set(LayerCollection *layer_collection)
static void update_voronoi_node_coloring(bNodeTree *ntree)
static void do_version_bones_inherit_scale(ListBase *lb)
static void update_noise_and_wave_distortion(bNodeTree *ntree)
static void mapping_node_order_flip(bNode *node)
static void update_mapping_node_fcurve_rna_path_callback(FCurve *fcurve, const char *nodePath, const bNode *minimumNode, const bNode *maximumNode)
static void update_voronoi_node_crackle(bNodeTree *ntree)
#define PAINT_BLEND_MUL
#define PAINT_BLEND_ADD
static ARegion * do_versions_find_region(ListBase *regionbase, int regiontype)
#define PAINT_BLEND_HUE
static void update_noise_node_dimensions(bNodeTree *ntree)
static void do_version_constraints_copy_scale_power(ListBase *lb)
static void update_vector_math_node_dot_product_operator(bNodeTree *ntree)
static bool strip_update_flags_cb(Strip *strip, void *)
static void do_versions_fix_annotations(bGPdata *gpd)
static void do_version_bones_split_bbone_scale(ListBase *lb)
ID * do_versions_rename_id(Main *bmain, const short id_type, const char *name_src, const char *name_dst)
float * version_cycles_node_socket_float_value(bNodeSocket *socket)
IDProperty * version_cycles_properties_from_ID(ID *id)
int version_cycles_property_int(IDProperty *idprop, const char *name, int default_value)
bool version_node_socket_is_used(bNodeSocket *sock)
void version_update_node_input(bNodeTree *ntree, FunctionRef< bool(bNode *)> check_node, const char *socket_identifier, FunctionRef< void(bNode *, bNodeSocket *)> update_input, FunctionRef< void(bNode *, bNodeSocket *, bNode *, bNodeSocket *)> update_input_link)
float * version_cycles_node_socket_rgba_value(bNodeSocket *socket)
float * version_cycles_node_socket_vector_value(bNodeSocket *socket)
bool version_cycles_property_boolean(IDProperty *idprop, const char *name, bool default_value)
void version_socket_update_is_used(bNodeTree *ntree)
ARegion * do_versions_add_region(int regiontype, const char *)
float version_cycles_property_float(IDProperty *idprop, const char *name, float default_value)