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