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