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