Blender V4.5
versioning_260.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#include <algorithm>
10
11#include "BKE_idprop.hh"
12#include "BLI_listbase.h"
13#include "BLI_utildefines.h"
14
15/* allow readfile to use deprecated functionality */
16#define DNA_DEPRECATED_ALLOW
17
18/* Define macros in `DNA_genfile.h`. */
19#define DNA_GENFILE_VERSIONING_MACROS
20
21#include "DNA_anim_types.h"
22#include "DNA_brush_types.h"
23#include "DNA_camera_types.h"
24#include "DNA_cloth_types.h"
27#include "DNA_fluid_types.h"
28#include "DNA_genfile.h"
29#include "DNA_light_types.h"
30#include "DNA_linestyle_types.h"
31#include "DNA_material_types.h"
32#include "DNA_mesh_types.h"
33#include "DNA_meshdata_types.h"
34#include "DNA_node_types.h"
36#include "DNA_object_types.h"
37#include "DNA_screen_types.h"
38#include "DNA_sequence_types.h"
39#include "DNA_space_types.h"
40#include "DNA_text_types.h"
41#include "DNA_view3d_types.h"
42#include "DNA_world_types.h"
43
44#undef DNA_GENFILE_VERSIONING_MACROS
45
46#include "MEM_guardedalloc.h"
47
48#include "BLI_math_matrix.h"
49#include "BLI_math_rotation.h"
50#include "BLI_math_vector.h"
51#include "BLI_path_utils.hh"
52#include "BLI_string.h"
53#include "BLI_string_utf8.h"
54#include "BLI_string_utils.hh"
55
57#include "BKE_customdata.hh"
58#include "BKE_image.hh"
59#include "BKE_main.hh" /* for Main */
61#include "BKE_modifier.hh"
63#include "BKE_node_runtime.hh"
65#include "BKE_particle.h"
66#include "BKE_scene.hh"
67#include "BKE_screen.hh"
68#include "BKE_text.h" /* for txt_extended_ascii_as_utf8 */
69#include "BKE_texture.h"
70#include "BKE_tracking.h"
71
72#include "SEQ_iterator.hh"
73#include "SEQ_modifier.hh"
74#include "SEQ_utils.hh"
75
76#include "IMB_imbuf_enums.h"
77
78#include "MOV_enums.hh"
79
80#include "NOD_common.hh"
81#include "NOD_composite.hh"
82
83#include "BLO_readfile.hh"
84
85#include "readfile.hh"
86
88#define CLANG_FORMAT_NOP_WORKAROUND ((void)0)
89
90/* Make preferences read-only, use `versioning_userdef.cc`. */
91#define U (*((const UserDef *)&U))
92
94{
95 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
96 if (ELEM(node->type_legacy, CMP_NODE_IMAGE, CMP_NODE_R_LAYERS)) {
97 /* default Image output value should have 0 alpha */
98 bNodeSocket *sock = static_cast<bNodeSocket *>(node->outputs.first);
99 ((bNodeSocketValueRGBA *)sock->default_value)->value[3] = 0.0f;
100 }
101 }
102}
103
105{
106 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
107 if (node->type_legacy == CMP_NODE_ROTATE) {
108 /* Convert degrees to radians. */
109 bNodeSocket *sock = static_cast<bNodeSocket *>(node->inputs.first)->next;
110 ((bNodeSocketValueFloat *)sock->default_value)->value = DEG2RADF(
111 ((bNodeSocketValueFloat *)sock->default_value)->value);
112 }
113 else if (node->type_legacy == CMP_NODE_DBLUR) {
114 /* Convert degrees to radians. */
115 NodeDBlurData *ndbd = static_cast<NodeDBlurData *>(node->storage);
116 ndbd->angle = DEG2RADF(ndbd->angle);
117 ndbd->spin = DEG2RADF(ndbd->spin);
118 }
119 else if (node->type_legacy == CMP_NODE_DEFOCUS) {
120 /* Convert degrees to radians. */
121 NodeDefocus *nqd = static_cast<NodeDefocus *>(node->storage);
122 /* XXX DNA char to float conversion seems to map the char value
123 * into the [0.0f, 1.0f] range. */
124 nqd->rotation = DEG2RADF(nqd->rotation * 255.0f);
125 }
126 else if (node->type_legacy == CMP_NODE_CHROMA_MATTE) {
127 /* Convert degrees to radians. */
128 NodeChroma *ndc = static_cast<NodeChroma *>(node->storage);
129 ndc->t1 = DEG2RADF(ndc->t1);
130 ndc->t2 = DEG2RADF(ndc->t2);
131 }
132 else if (node->type_legacy == CMP_NODE_GLARE) {
133 /* Convert degrees to radians. */
134 NodeGlare *ndg = static_cast<NodeGlare *>(node->storage);
135 /* XXX DNA char to float conversion seems to map the char value
136 * into the [0.0f, 1.0f] range. */
137 ndg->angle_ofs = DEG2RADF(ndg->angle_ofs * 255.0f);
138 }
139 /* XXX TexMapping struct is used by other nodes too (at least node_composite_mapValue),
140 * but not the rot part...
141 */
142 else if (node->type_legacy == SH_NODE_MAPPING) {
143 /* Convert degrees to radians. */
144 TexMapping *tmap = static_cast<TexMapping *>(node->storage);
145 tmap->rot[0] = DEG2RADF(tmap->rot[0]);
146 tmap->rot[1] = DEG2RADF(tmap->rot[1]);
147 tmap->rot[2] = DEG2RADF(tmap->rot[2]);
148 }
149 }
150}
151
153{
154 /* RenderData.subimtype flag options for imtype */
155 enum {
156 R_OPENEXR_HALF = (1 << 0),
157 R_OPENEXR_ZBUF = (1 << 1),
158 R_PREVIEW_JPG = (1 << 2),
159 R_CINEON_LOG = (1 << 3),
160 R_TIFF_16BIT = (1 << 4),
161
162 R_JPEG2K_12BIT = (1 << 5),
163 /* Jpeg2000 */
164 R_JPEG2K_16BIT = (1 << 6),
165 R_JPEG2K_YCC = (1 << 7),
166 /* when disabled use RGB */
167 R_JPEG2K_CINE_PRESET = (1 << 8),
168 R_JPEG2K_CINE_48FPS = (1 << 9),
169 };
170
171 /* NOTE: rd->subimtype is moved into individual settings now and no longer
172 * exists */
173 RenderData *rd = &sce->r;
174 ImageFormatData *imf = &sce->r.im_format;
175
176 /* we know no data loss happens here, the old values were in char range */
177 imf->imtype = char(rd->imtype);
178 imf->planes = char(rd->planes);
179 imf->compress = char(rd->quality);
180 imf->quality = char(rd->quality);
181
182 /* default, was stored in multiple places, may override later */
184
185 /* openexr */
186 imf->exr_codec = rd->quality & 7; /* 0-4 were valid values back then */
187
188 switch (imf->imtype) {
190 imf->depth = (rd->subimtype & R_OPENEXR_HALF) ? R_IMF_CHAN_DEPTH_16 : R_IMF_CHAN_DEPTH_32;
191 if (rd->subimtype & R_PREVIEW_JPG) {
193 }
194 break;
196 if (rd->subimtype & R_TIFF_16BIT) {
198 }
199 break;
200 case R_IMF_IMTYPE_JP2:
201 if (rd->subimtype & R_JPEG2K_16BIT) {
203 }
204 else if (rd->subimtype & R_JPEG2K_12BIT) {
206 }
207
208 if (rd->subimtype & R_JPEG2K_YCC) {
210 }
211 if (rd->subimtype & R_JPEG2K_CINE_PRESET) {
213 }
214 if (rd->subimtype & R_JPEG2K_CINE_48FPS) {
216 }
217 break;
219 case R_IMF_IMTYPE_DPX:
220 if (rd->subimtype & R_CINEON_LOG) {
222 }
223 break;
224 }
225}
226
227/* socket use flags were only temporary before */
229{
230 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
231 LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
232 sock->flag &= ~SOCK_IS_LINKED;
233 }
234 LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
235 sock->flag &= ~SOCK_IS_LINKED;
236 }
237 }
238 LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->inputs_legacy) {
239 sock->flag &= ~SOCK_IS_LINKED;
240 }
241 LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->outputs_legacy) {
242 sock->flag &= ~SOCK_IS_LINKED;
243 }
244
245 LISTBASE_FOREACH (bNodeLink *, link, &ntree->links) {
246 link->fromsock->flag |= SOCK_IS_LINKED;
247 link->tosock->flag |= SOCK_IS_LINKED;
248 }
249}
250
252{
253 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
254 if (node->type_legacy == CMP_NODE_OUTPUT_FILE) {
255 /* previous CMP_NODE_OUTPUT_FILE nodes get converted to multi-file outputs */
256 NodeImageFile *old_data = static_cast<NodeImageFile *>(node->storage);
257 NodeImageMultiFile *nimf = MEM_callocN<NodeImageMultiFile>("node image multi file");
258 bNodeSocket *old_image = static_cast<bNodeSocket *>(BLI_findlink(&node->inputs, 0));
259 bNodeSocket *old_z = static_cast<bNodeSocket *>(BLI_findlink(&node->inputs, 1));
260
261 char filename[FILE_MAXFILE];
262
263 /* ugly, need to remove the old inputs list to avoid bad pointer
264 * checks when adding new sockets.
265 * sock->storage is expected to contain path info in ntreeCompositOutputFileAddSocket.
266 */
267 BLI_listbase_clear(&node->inputs);
268
269 node->storage = nimf;
270
271 /* looks like storage data can be messed up somehow, stupid check here */
272 if (old_data) {
273 char basepath[FILE_MAXDIR];
274
275 /* split off filename from the old path, to be used as socket sub-path */
277 old_data->name, basepath, sizeof(basepath), filename, sizeof(filename));
278
279 STRNCPY(nimf->base_path, basepath);
280 nimf->format = old_data->im_format;
281 }
282 else {
283 STRNCPY(filename, old_image->name);
284 }
285
286 /* If Z buffer is saved, change the image type to multi-layer EXR.
287 * XXX: this is slightly messy, Z buffer was ignored before for anything but EXR and IRIS ...
288 * I'm just assuming here that IRIZ means IRIS with z buffer. */
289 if (old_data && ELEM(old_data->im_format.imtype, R_IMF_IMTYPE_IRIZ, R_IMF_IMTYPE_OPENEXR)) {
290 char sockpath[FILE_MAX];
291
293
294 SNPRINTF(sockpath, "%s_Image", filename);
295 bNodeSocket *sock = ntreeCompositOutputFileAddSocket(ntree, node, sockpath, &nimf->format);
296 /* XXX later do_versions copies path from socket name, need to set this explicitly */
297 STRNCPY(sock->name, sockpath);
298 if (old_image->link) {
299 old_image->link->tosock = sock;
300 sock->link = old_image->link;
301 }
302
303 SNPRINTF(sockpath, "%s_Z", filename);
304 sock = ntreeCompositOutputFileAddSocket(ntree, node, sockpath, &nimf->format);
305 /* XXX later do_versions copies path from socket name, need to set this explicitly */
306 STRNCPY(sock->name, sockpath);
307 if (old_z->link) {
308 old_z->link->tosock = sock;
309 sock->link = old_z->link;
310 }
311 }
312 else {
313 bNodeSocket *sock = ntreeCompositOutputFileAddSocket(ntree, node, filename, &nimf->format);
314 /* XXX later do_versions copies path from socket name, need to set this explicitly */
315 STRNCPY(sock->name, filename);
316 if (old_image->link) {
317 old_image->link->tosock = sock;
318 sock->link = old_image->link;
319 }
320 }
321
322 blender::bke::node_remove_socket(*ntree, *node, *old_image);
323 blender::bke::node_remove_socket(*ntree, *node, *old_z);
324 if (old_data) {
325 MEM_freeN(old_data);
326 }
327 }
328 else if (node->type_legacy == CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED) {
329 NodeImageMultiFile *nimf = static_cast<NodeImageMultiFile *>(node->storage);
330
331 /* CMP_NODE_OUTPUT_MULTI_FILE has been re-declared as CMP_NODE_OUTPUT_FILE */
332 node->type_legacy = CMP_NODE_OUTPUT_FILE;
333
334 /* initialize the node-wide image format from render data, if available */
335 if (sce) {
336 nimf->format = sce->r.im_format;
337 }
338
339 /* transfer render format toggle to node format toggle */
340 LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
341 NodeImageMultiFileSocket *simf = static_cast<NodeImageMultiFileSocket *>(sock->storage);
342 simf->use_node_format = simf->use_render_format;
343 }
344
345 /* we do have preview now */
346 node->flag |= NODE_PREVIEW;
347 }
348 }
349}
350
351/* blue and red are swapped pre 2.62.1, be sane (red == red) now! */
353{
354 for (int a = 0; a < mesh->corner_data.totlayer; a++) {
355 CustomDataLayer *layer = &mesh->corner_data.layers[a];
356
357 if (layer->type == CD_PROP_BYTE_COLOR) {
358 MLoopCol *mloopcol = static_cast<MLoopCol *>(layer->data);
359 for (int i = 0; i < mesh->corners_num; i++, mloopcol++) {
360 std::swap(mloopcol->r, mloopcol->b);
361 }
362 }
363 }
364}
365
367{
368 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
369 if (node->type_legacy == CMP_NODE_OUTPUT_FILE) {
370 LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
371 NodeImageMultiFileSocket *input = static_cast<NodeImageMultiFileSocket *>(sock->storage);
372 /* input file path is stored in dedicated struct now instead socket name */
373 STRNCPY(input->path, sock->name);
374 }
375 }
376 }
377}
378
380{
381 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
382 if (node->type_legacy == CMP_NODE_OUTPUT_FILE) {
383 LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
384 NodeImageMultiFileSocket *input = static_cast<NodeImageMultiFileSocket *>(sock->storage);
385
386 /* Multi-layer names are stored as separate strings now,
387 * used the path string before, so copy it over. */
388 STRNCPY_UTF8(input->layer, input->path);
389
390 /* paths/layer names also have to be unique now, initial check */
391 ntreeCompositOutputFileUniquePath(&node->inputs, sock, input->path, '_');
392 ntreeCompositOutputFileUniqueLayer(&node->inputs, sock, input->layer, '_');
393 }
394 }
395 }
396}
397
399{
400 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
401 if (node->type_legacy == CMP_NODE_IMAGE) {
402 LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
404
405 /* Take pass index both from current storage pointer (actually an int). */
406 output->pass_index = POINTER_AS_INT(sock->storage);
407
408 /* replace socket data pointer */
409 sock->storage = output;
410 }
411 }
412 }
413}
414
416{
417 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
418 if (node->type_legacy == NODE_FRAME) {
419 /* initialize frame node storage data */
420 if (node->storage == nullptr) {
421 NodeFrame *data = MEM_callocN<NodeFrame>("frame node storage");
422 node->storage = data;
423
424 /* copy current flags */
425 data->flag = node->custom1;
426
427 data->label_size = 20;
428 }
429 }
430
431 /* initialize custom node color */
432 node->color[0] = node->color[1] = node->color[2] = 0.608f; /* default theme color */
433 }
434}
435
437{
438 for (int i = 0; i < track->markersnr; i++) {
439 MovieTrackingMarker *marker = &track->markers[i];
440
441 if (is_zero_v2(marker->pattern_corners[0]) && is_zero_v2(marker->pattern_corners[1]) &&
442 is_zero_v2(marker->pattern_corners[2]) && is_zero_v2(marker->pattern_corners[3]))
443 {
444 marker->pattern_corners[0][0] = track->pat_min_legacy[0];
445 marker->pattern_corners[0][1] = track->pat_min_legacy[1];
446
447 marker->pattern_corners[1][0] = track->pat_max_legacy[0];
448 marker->pattern_corners[1][1] = track->pat_min_legacy[1];
449
450 marker->pattern_corners[2][0] = track->pat_max_legacy[0];
451 marker->pattern_corners[2][1] = track->pat_max_legacy[1];
452
453 marker->pattern_corners[3][0] = track->pat_min_legacy[0];
454 marker->pattern_corners[3][1] = track->pat_max_legacy[1];
455 }
456
457 if (is_zero_v2(marker->search_min) && is_zero_v2(marker->search_max)) {
458 copy_v2_v2(marker->search_min, track->search_min_legacy);
459 copy_v2_v2(marker->search_max, track->search_max_legacy);
460 }
461 }
462}
463
464static const char *node_get_static_idname(int type, int treetype)
465{
466 /* XXX hack, group types share a single static integer identifier,
467 * but are registered as separate types */
468 if (type == NODE_GROUP) {
469 switch (treetype) {
470 case NTREE_COMPOSIT:
471 return "CompositorNodeGroup";
472 case NTREE_SHADER:
473 return "ShaderNodeGroup";
474 case NTREE_TEXTURE:
475 return "TextureNodeGroup";
476 }
477 }
478 else {
479 switch (type) {
480 case NODE_FRAME:
481 return "NodeFrame";
482 case NODE_GROUP:
483 return "NodeGroup";
484 case NODE_GROUP_INPUT:
485 return "NodeGroupInput";
487 return "NodeGroupOutput";
488 case NODE_REROUTE:
489 return "NodeReroute";
490 case /*SH_NODE_OUTPUT*/ 1:
491 return "ShaderNodeOutput";
492 case /*SH_NODE_MATERIAL*/ 100:
493 return "ShaderNodeMaterial";
494 case SH_NODE_RGB:
495 return "ShaderNodeRGB";
496 case SH_NODE_VALUE:
497 return "ShaderNodeValue";
499 return "ShaderNodeMixRGB";
500 case SH_NODE_VALTORGB:
501 return "ShaderNodeValToRGB";
502 case SH_NODE_RGBTOBW:
503 return "ShaderNodeRGBToBW";
504 case /*SH_NODE_TEXTURE*/ 106:
505 return "ShaderNodeTexture";
506 case SH_NODE_NORMAL:
507 return "ShaderNodeNormal";
508 case SH_NODE_GAMMA:
509 return "ShaderNodeGamma";
511 return "ShaderNodeBrightContrast";
512 case /*SH_NODE_GEOMETRY*/ 108:
513 return "ShaderNodeGeometry";
514 case SH_NODE_MAPPING:
515 return "ShaderNodeMapping";
517 return "ShaderNodeVectorCurve";
519 return "ShaderNodeRGBCurve";
520 case SH_NODE_CAMERA:
521 return "ShaderNodeCameraData";
522 case SH_NODE_MATH:
523 return "ShaderNodeMath";
525 return "ShaderNodeVectorMath";
526 case SH_NODE_SQUEEZE:
527 return "ShaderNodeSqueeze";
528 case /*SH_NODE_MATERIAL_EXT*/ 118:
529 return "ShaderNodeExtendedMaterial";
530 case SH_NODE_INVERT:
531 return "ShaderNodeInvert";
533 return "ShaderNodeSeparateRGB";
535 return "ShaderNodeCombineRGB";
536 case SH_NODE_HUE_SAT:
537 return "ShaderNodeHueSaturation";
539 return "ShaderNodeOutputMaterial";
541 return "ShaderNodeOutputLamp";
543 return "ShaderNodeOutputWorld";
544 case SH_NODE_FRESNEL:
545 return "ShaderNodeFresnel";
547 return "ShaderNodeLayerWeight";
549 return "ShaderNodeMixShader";
551 return "ShaderNodeAddShader";
553 return "ShaderNodeAttribute";
555 return "ShaderNodeAmbientOcclusion";
557 return "ShaderNodeBackground";
558 case SH_NODE_HOLDOUT:
559 return "ShaderNodeHoldout";
560 case /*SH_NODE_BSDF_ANISOTROPIC*/ 131:
561 return "ShaderNodeBsdfAnisotropic";
563 return "ShaderNodeBsdfDiffuse";
564 case /*SH_NODE_BSDF_GLOSSY*/ 133:
565 return "ShaderNodeBsdfGlossy";
567 return "ShaderNodeBsdfGlass";
569 return "ShaderNodeBsdfRefraction";
571 return "ShaderNodeBsdfTranslucent";
573 return "ShaderNodeBsdfTransparent";
575 return "ShaderNodeBsdfRayPortal";
576 case /*SH_NODE_BSDF_VELVET*/ 139:
577 return "ShaderNodeBsdfVelvet";
578 case /*SH_NODE_VOLUME_TRANSPARENT*/ 161:
579 return "ShaderNodeVolumeTransparent";
580 case /*SH_NODE_VOLUME_ISOTROPIC*/ 162:
581 return "ShaderNodeVolumeIsotropic";
582 case SH_NODE_EMISSION:
583 return "ShaderNodeEmission";
585 return "ShaderNodeNewGeometry";
587 return "ShaderNodeLightPath";
589 return "ShaderNodeLightFalloff";
591 return "ShaderNodeObjectInfo";
593 return "ShaderNodeParticleInfo";
595 return "ShaderNodeHairInfo";
596 case SH_NODE_BUMP:
597 return "ShaderNodeBump";
599 return "ShaderNodeNormalMap";
600 case SH_NODE_TANGENT:
601 return "ShaderNodeTangent";
602 case SH_NODE_SCRIPT:
603 return "ShaderNodeScript";
605 return "ShaderNodeTexImage";
607 return "ShaderNodeTexEnvironment";
608 case SH_NODE_TEX_SKY:
609 return "ShaderNodeTexSky";
611 return "ShaderNodeTexGradient";
613 return "ShaderNodeTexNoise";
615 return "ShaderNodeTexMagic";
616 case SH_NODE_TEX_WAVE:
617 return "ShaderNodeTexWave";
619 return "ShaderNodeTexMusgrave";
621 return "ShaderNodeTexVoronoi";
623 return "ShaderNodeTexChecker";
625 return "ShaderNodeTexBrick";
627 return "ShaderNodeTexCoord";
628 case CMP_NODE_VIEWER:
629 return "CompositorNodeViewer";
630 case CMP_NODE_RGB:
631 return "CompositorNodeRGB";
632 case CMP_NODE_VALUE:
633 return "CompositorNodeValue";
634 case CMP_NODE_MIX_RGB:
635 return "CompositorNodeMixRGB";
637 return "CompositorNodeValToRGB";
638 case CMP_NODE_RGBTOBW:
639 return "CompositorNodeRGBToBW";
640 case CMP_NODE_NORMAL:
641 return "CompositorNodeNormal";
643 return "CompositorNodeCurveVec";
645 return "CompositorNodeCurveRGB";
647 return "CompositorNodeAlphaOver";
648 case CMP_NODE_BLUR:
649 return "CompositorNodeBlur";
650 case CMP_NODE_FILTER:
651 return "CompositorNodeFilter";
653 return "CompositorNodeMapValue";
655 return "CompositorNodeMapRange";
656 case CMP_NODE_TIME:
657 return "CompositorNodeTime";
658 case CMP_NODE_VECBLUR:
659 return "CompositorNodeVecBlur";
661 return "CompositorNodeSepRGBA";
663 return "CompositorNodeSepHSVA";
665 return "CompositorNodeSetAlpha";
666 case CMP_NODE_HUE_SAT:
667 return "CompositorNodeHueSat";
668 case CMP_NODE_IMAGE:
669 return "CompositorNodeImage";
671 return "CompositorNodeRLayers";
673 return "CompositorNodeComposite";
675 return "CompositorNodeOutputFile";
676 case CMP_NODE_TEXTURE:
677 return "CompositorNodeTexture";
679 return "CompositorNodeTranslate";
681 return "CompositorNodeZcombine";
683 return "CompositorNodeCombRGBA";
685 return "CompositorNodeDilateErode";
686 case CMP_NODE_INPAINT:
687 return "CompositorNodeInpaint";
689 return "CompositorNodeDespeckle";
690 case CMP_NODE_ROTATE:
691 return "CompositorNodeRotate";
692 case CMP_NODE_SCALE:
693 return "CompositorNodeScale";
695 return "CompositorNodeSepYCCA";
697 return "CompositorNodeCombYCCA";
699 return "CompositorNodeSepYUVA";
701 return "CompositorNodeCombYUVA";
703 return "CompositorNodeDiffMatte";
705 return "CompositorNodeColorSpill";
707 return "CompositorNodeChromaMatte";
709 return "CompositorNodeChannelMatte";
710 case CMP_NODE_FLIP:
711 return "CompositorNodeFlip";
713 return "CompositorNodeSplitViewer";
714 case CMP_NODE_MAP_UV:
715 return "CompositorNodeMapUV";
716 case CMP_NODE_ID_MASK:
717 return "CompositorNodeIDMask";
719 return "CompositorNodeDoubleEdgeMask";
720 case CMP_NODE_DEFOCUS:
721 return "CompositorNodeDefocus";
723 return "CompositorNodeDisplace";
725 return "CompositorNodeCombHSVA";
726 case CMP_NODE_MATH:
727 return "CompositorNodeMath";
729 return "CompositorNodeLumaMatte";
731 return "CompositorNodeBrightContrast";
732 case CMP_NODE_GAMMA:
733 return "CompositorNodeGamma";
734 case CMP_NODE_INVERT:
735 return "CompositorNodeInvert";
737 return "CompositorNodeNormalize";
738 case CMP_NODE_CROP:
739 return "CompositorNodeCrop";
740 case CMP_NODE_DBLUR:
741 return "CompositorNodeDBlur";
743 return "CompositorNodeBilateralblur";
745 return "CompositorNodePremulKey";
746 case CMP_NODE_GLARE:
747 return "CompositorNodeGlare";
748 case CMP_NODE_TONEMAP:
749 return "CompositorNodeTonemap";
751 return "CompositorNodeLensdist";
753 return "CompositorNodeLevels";
755 return "CompositorNodeColorMatte";
757 return "CompositorNodeDistanceMatte";
759 return "CompositorNodeColorBalance";
761 return "CompositorNodeHueCorrect";
763 return "CompositorNodeMovieClip";
765 return "CompositorNodeTransform";
767 return "CompositorNodeStabilize";
769 return "CompositorNodeMovieDistortion";
771 return "CompositorNodeBoxMask";
773 return "CompositorNodeEllipseMask";
775 return "CompositorNodeBokehImage";
777 return "CompositorNodeBokehBlur";
778 case CMP_NODE_SWITCH:
779 return "CompositorNodeSwitch";
781 return "CompositorNodeColorCorrection";
782 case CMP_NODE_MASK:
783 return "CompositorNodeMask";
785 return "CompositorNodeKeyingScreen";
786 case CMP_NODE_KEYING:
787 return "CompositorNodeKeying";
789 return "CompositorNodeTrackPos";
791 return "CompositorNodePixelate";
792 case TEX_NODE_OUTPUT:
793 return "TextureNodeOutput";
794 case TEX_NODE_CHECKER:
795 return "TextureNodeChecker";
796 case TEX_NODE_TEXTURE:
797 return "TextureNodeTexture";
798 case TEX_NODE_BRICKS:
799 return "TextureNodeBricks";
800 case TEX_NODE_MATH:
801 return "TextureNodeMath";
802 case TEX_NODE_MIX_RGB:
803 return "TextureNodeMixRGB";
804 case TEX_NODE_RGBTOBW:
805 return "TextureNodeRGBToBW";
807 return "TextureNodeValToRGB";
808 case TEX_NODE_IMAGE:
809 return "TextureNodeImage";
811 return "TextureNodeCurveRGB";
812 case TEX_NODE_INVERT:
813 return "TextureNodeInvert";
814 case TEX_NODE_HUE_SAT:
815 return "TextureNodeHueSaturation";
817 return "TextureNodeCurveTime";
818 case TEX_NODE_ROTATE:
819 return "TextureNodeRotate";
820 case TEX_NODE_VIEWER:
821 return "TextureNodeViewer";
823 return "TextureNodeTranslate";
824 case TEX_NODE_COORD:
825 return "TextureNodeCoordinates";
827 return "TextureNodeDistance";
829 return "TextureNodeCompose";
831 return "TextureNodeDecompose";
833 return "TextureNodeValToNor";
834 case TEX_NODE_SCALE:
835 return "TextureNodeScale";
836 case TEX_NODE_AT:
837 return "TextureNodeAt";
839 return "TextureNodeTexVoronoi";
841 return "TextureNodeTexBlend";
843 return "TextureNodeTexMagic";
845 return "TextureNodeTexMarble";
847 return "TextureNodeTexClouds";
848 case TEX_NODE_PROC + TEX_WOOD:
849 return "TextureNodeTexWood";
851 return "TextureNodeTexMusgrave";
853 return "TextureNodeTexNoise";
855 return "TextureNodeTexStucci";
857 return "TextureNodeTexDistNoise";
858 }
859 }
860 return "";
861}
862
864{
865 switch (sock->type) {
866 case SOCK_FLOAT: {
867 bNodeSocketValueFloat *dval = sock->default_value_typed<bNodeSocketValueFloat>();
869 }
870 case SOCK_INT: {
871 bNodeSocketValueInt *dval = sock->default_value_typed<bNodeSocketValueInt>();
873 }
874 case SOCK_BOOLEAN: {
876 }
877 case SOCK_VECTOR: {
878 bNodeSocketValueVector *dval = sock->default_value_typed<bNodeSocketValueVector>();
880 }
881 case SOCK_RGBA: {
883 }
884 case SOCK_STRING: {
885 bNodeSocketValueString *dval = sock->default_value_typed<bNodeSocketValueString>();
887 }
888 case SOCK_SHADER: {
890 }
891 }
892 return "";
893}
894
895static void do_versions_nodetree_customnodes(bNodeTree *ntree, int /*is_group*/)
896{
897 /* initialize node tree type idname */
898 {
899 ntree->typeinfo = nullptr;
900
901 /* tree type idname */
902 switch (ntree->type) {
903 case NTREE_COMPOSIT:
904 STRNCPY(ntree->idname, "CompositorNodeTree");
905 break;
906 case NTREE_SHADER:
907 STRNCPY(ntree->idname, "ShaderNodeTree");
908 break;
909 case NTREE_TEXTURE:
910 STRNCPY(ntree->idname, "TextureNodeTree");
911 break;
912 }
913
914 /* node type idname */
915 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
916 BLI_strncpy(node->idname,
917 node_get_static_idname(node->type_legacy, ntree->type),
918 sizeof(node->idname));
919
920 /* existing old nodes have been initialized already */
921 node->flag |= NODE_INIT;
922
923 /* sockets idname */
924 LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
925 STRNCPY(sock->idname, node_socket_get_static_idname(sock).c_str());
926 }
927 LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
928 STRNCPY(sock->idname, node_socket_get_static_idname(sock).c_str());
929 }
930 }
931 /* tree sockets idname */
932 LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->inputs_legacy) {
933 STRNCPY(sock->idname, node_socket_get_static_idname(sock).c_str());
934 }
935 LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->outputs_legacy) {
936 STRNCPY(sock->idname, node_socket_get_static_idname(sock).c_str());
937 }
938 }
939
940 {
942 /* initialize socket in_out values */
943 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
944 LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
945 sock->in_out = SOCK_IN;
946 }
947 LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
948 sock->in_out = SOCK_OUT;
949 }
950 }
951 LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->inputs_legacy) {
952 sock->in_out = SOCK_IN;
953 }
954 LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->outputs_legacy) {
955 sock->in_out = SOCK_OUT;
956 }
957 }
958
959 /* initialize socket identifier strings */
960 {
961 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
962 LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
963 STRNCPY(sock->identifier, sock->name);
964 BLI_uniquename(&node->inputs,
965 sock,
966 "socket",
967 '.',
968 offsetof(bNodeSocket, identifier),
969 sizeof(sock->identifier));
970 }
971 LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
972 STRNCPY(sock->identifier, sock->name);
973 BLI_uniquename(&node->outputs,
974 sock,
975 "socket",
976 '.',
977 offsetof(bNodeSocket, identifier),
978 sizeof(sock->identifier));
979 }
980 }
981 LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->inputs_legacy) {
982 STRNCPY(sock->identifier, sock->name);
983 BLI_uniquename(&ntree->inputs_legacy,
984 sock,
985 "socket",
986 '.',
987 offsetof(bNodeSocket, identifier),
988 sizeof(sock->identifier));
989 }
990 LISTBASE_FOREACH (bNodeSocket *, sock, &ntree->outputs_legacy) {
991 STRNCPY(sock->identifier, sock->name);
992 BLI_uniquename(&ntree->outputs_legacy,
993 sock,
994 "socket",
995 '.',
996 offsetof(bNodeSocket, identifier),
997 sizeof(sock->identifier));
998 }
999 }
1000}
1001
1002/* Sync functions update formula parameters for other modes, such that the result is comparable.
1003 * Note that the results are not exactly the same due to differences in color handling
1004 * (sRGB conversion happens for LGG),
1005 * but this keeps settings comparable. */
1007{
1009
1010 for (int c = 0; c < 3; c++) {
1011 n->slope[c] = (2.0f - n->lift[c]) * n->gain[c];
1012 n->offset[c] = (n->lift[c] - 1.0f) * n->gain[c];
1013 n->power[c] = (n->gamma[c] != 0.0f) ? 1.0f / n->gamma[c] : 1000000.0f;
1014 }
1015}
1016
1018{
1020
1021 for (int c = 0; c < 3; c++) {
1022 float d = n->slope[c] + n->offset[c];
1023 n->lift[c] = (d != 0.0f ? n->slope[c] + 2.0f * n->offset[c] / d : 0.0f);
1024 n->gain[c] = d;
1025 n->gamma[c] = (n->power[c] != 0.0f) ? 1.0f / n->power[c] : 1000000.0f;
1026 }
1027}
1028
1029static bool strip_colorbalance_update_cb(Strip *strip, void * /*user_data*/)
1030{
1031 StripData *data = strip->data;
1032
1033 if (data && data->color_balance) {
1035 strip, nullptr, seqModifierType_ColorBalance);
1037
1038 cbmd->color_balance = *data->color_balance;
1039
1040 /* multiplication with color balance used is handled differently,
1041 * so we need to move multiplication to modifier so files would be
1042 * compatible
1043 */
1044 cbmd->color_multiply = strip->mul;
1045 strip->mul = 1.0f;
1046
1047 MEM_freeN(data->color_balance);
1048 data->color_balance = nullptr;
1049 }
1050 return true;
1051}
1052
1053static bool strip_set_alpha_mode_cb(Strip *strip, void * /*user_data*/)
1054{
1055 enum { SEQ_MAKE_PREMUL = (1 << 6) };
1056 if (strip->flag & SEQ_MAKE_PREMUL) {
1058 }
1059 else {
1061 }
1062 return true;
1063}
1064
1065static bool strip_set_wipe_angle_cb(Strip *strip, void * /*user_data*/)
1066{
1067 if (strip->type == STRIP_TYPE_WIPE) {
1068 WipeVars *wv = static_cast<WipeVars *>(strip->effectdata);
1069 wv->angle = DEG2RADF(wv->angle);
1070 }
1071 return true;
1072}
1073
1074/* Create a socket stub without typeinfo. */
1075static bNodeSocket *version_make_socket_stub(const char *idname,
1077 eNodeSocketInOut in_out,
1078 const char *identifier,
1079 const char *name,
1080 const void *default_value,
1081 const IDProperty *prop)
1082{
1083 bNodeSocket *socket = MEM_callocN<bNodeSocket>(__func__);
1084 socket->runtime = MEM_new<blender::bke::bNodeSocketRuntime>(__func__);
1085 STRNCPY(socket->idname, idname);
1086 socket->type = int(type);
1087 socket->in_out = int(in_out);
1088
1089 socket->limit = (in_out == SOCK_IN ? 1 : 0xFFF);
1090
1091 STRNCPY(socket->identifier, identifier);
1092 STRNCPY(socket->name, name);
1093 socket->storage = nullptr;
1094 socket->flag |= SOCK_COLLAPSED;
1095
1096 /* NOTE: technically socket values can store ref-counted ID pointers, but at this stage the
1097 * refcount can be ignored. It gets recomputed after lib-linking for all ID pointers. Socket
1098 * values don't have allocated data, so a simple duplication works here. */
1099 socket->default_value = default_value ? MEM_dupallocN(default_value) : nullptr;
1100 socket->prop = prop ? IDP_CopyProperty(prop) : nullptr;
1101
1102 return socket;
1103}
1104
1105/* Same as node_add_static_node but does not rely on node typeinfo. */
1106static bNode *version_add_group_in_out_node(bNodeTree *ntree, const int type)
1107{
1108 ListBase *ntree_socket_list = nullptr;
1109 ListBase *node_socket_list = nullptr;
1110 eNodeSocketInOut socket_in_out = SOCK_IN;
1111
1112 bNode *node = MEM_callocN<bNode>("new node");
1113 switch (type) {
1114 case NODE_GROUP_INPUT:
1115 STRNCPY(node->idname, "NodeGroupInput");
1116 ntree_socket_list = &ntree->inputs_legacy;
1117 /* Group input has only outputs. */
1118 node_socket_list = &node->outputs;
1119 socket_in_out = SOCK_OUT;
1120 break;
1121 case NODE_GROUP_OUTPUT:
1122 STRNCPY(node->idname, "NodeGroupOutput");
1123 ntree_socket_list = &ntree->outputs_legacy;
1124 /* Group output has only inputs. */
1125 node_socket_list = &node->inputs;
1126 socket_in_out = SOCK_IN;
1127 break;
1128 default:
1130 return nullptr;
1131 }
1132
1133 node->runtime = MEM_new<blender::bke::bNodeRuntime>(__func__);
1134 BLI_addtail(&ntree->nodes, node);
1135 blender::bke::node_unique_id(*ntree, *node);
1136
1137 /* Manual initialization of the node,
1138 * node->typeinfo is only set after versioning. */
1139 node->type_legacy = type;
1140 {
1141 if (ntree->typeinfo && ntree->typeinfo->node_add_init) {
1142 ntree->typeinfo->node_add_init(ntree, node);
1143 }
1144
1145 /* Add sockets without relying on declarations or typeinfo.
1146 * These are stubs for links, full typeinfo is defined later. */
1147 LISTBASE_FOREACH (bNodeSocket *, tree_socket, ntree_socket_list) {
1148 bNodeSocket *node_socket = version_make_socket_stub(tree_socket->idname,
1149 eNodeSocketDatatype(tree_socket->type),
1150 socket_in_out,
1151 tree_socket->identifier,
1152 tree_socket->name,
1153 tree_socket->default_value,
1154 tree_socket->prop);
1155
1156 BLI_addtail(node_socket_list, node_socket);
1157 BKE_ntree_update_tag_socket_type(ntree, node_socket);
1158 BKE_ntree_update_tag_socket_new(ntree, node_socket);
1159 }
1160 }
1161 BKE_ntree_update_tag_node_new(ntree, node);
1162 return node;
1163}
1164
1165/* NOLINTNEXTLINE: readability-function-size */
1166void blo_do_versions_260(FileData *fd, Library * /*lib*/, Main *bmain)
1167{
1168 if (bmain->versionfile < 260) {
1169 {
1170 /* set default alpha value of Image outputs in image and render layer nodes to 0 */
1172 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
1173 /* there are files with invalid audio_channels value, the real cause
1174 * is unknown, but we fix it here anyway to avoid crashes */
1175 if (sce->r.ffcodecdata.audio_channels == 0) {
1176 sce->r.ffcodecdata.audio_channels = 2;
1177 }
1178
1179 if (sce->nodetree) {
1181 }
1182 }
1183
1184 LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
1186 }
1187 }
1188
1189 {
1190 /* Support old particle dupli-object rotation settings. */
1191 LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
1192 if (ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
1193 part->draw |= PART_DRAW_ROTATE_OB;
1194
1195 if (part->rotmode == 0) {
1196 part->rotmode = PART_ROT_VEL;
1197 }
1198 }
1199 }
1200 }
1201 }
1202
1203 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 260, 1)) {
1204 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1205 ob->collision_boundtype = ob->boundtype;
1206 }
1207
1208 {
1209 LISTBASE_FOREACH (Camera *, cam, &bmain->cameras) {
1210 if (cam->sensor_x < 0.01f) {
1211 cam->sensor_x = DEFAULT_SENSOR_WIDTH;
1212 }
1213
1214 if (cam->sensor_y < 0.01f) {
1215 cam->sensor_y = DEFAULT_SENSOR_HEIGHT;
1216 }
1217 }
1218 }
1219 }
1220
1221 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 260, 2)) {
1222 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
1223 if (ntree->type == NTREE_SHADER) {
1224 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1225 if (node->type_legacy == SH_NODE_MAPPING) {
1226 TexMapping *tex_mapping = static_cast<TexMapping *>(node->storage);
1227 tex_mapping->projx = PROJ_X;
1228 tex_mapping->projy = PROJ_Y;
1229 tex_mapping->projz = PROJ_Z;
1230 }
1231 }
1232 }
1233 }
1235 }
1236
1237 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 260, 4)) {
1238 {
1239 /* Convert node angles to radians! */
1241 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
1242 if (sce->nodetree) {
1244 }
1245 }
1246
1247 LISTBASE_FOREACH (Material *, mat, &bmain->materials) {
1248 if (mat->nodetree) {
1250 }
1251 }
1252
1253 LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
1255 }
1256 }
1257
1258 {
1259 /* Tomato compatibility code. */
1261 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
1262 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
1263 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
1264 if (sl->spacetype == SPACE_VIEW3D) {
1265 View3D *v3d = (View3D *)sl;
1266 if (v3d->bundle_size == 0.0f) {
1267 v3d->bundle_size = 0.2f;
1269 }
1270
1271 if (v3d->bundle_drawtype == 0) {
1273 }
1274 }
1275 else if (sl->spacetype == SPACE_CLIP) {
1276 SpaceClip *sclip = (SpaceClip *)sl;
1277 if (sclip->scopes.track_preview_height == 0) {
1278 sclip->scopes.track_preview_height = 120;
1279 }
1280 }
1281 }
1282 }
1283 }
1284
1285 LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) {
1286 if (clip->aspx < 1.0f) {
1287 clip->aspx = 1.0f;
1288 clip->aspy = 1.0f;
1289 }
1290
1291 clip->proxy.build_tc_flag = IMB_TC_RECORD_RUN;
1292
1293 if (clip->proxy.build_size_flag == 0) {
1294 clip->proxy.build_size_flag = IMB_PROXY_25;
1295 }
1296
1297 if (clip->proxy.quality == 0) {
1298 clip->proxy.quality = 90;
1299 }
1300
1301 if (clip->tracking.camera.pixel_aspect < 0.01f) {
1302 clip->tracking.camera.pixel_aspect = 1.0f;
1303 }
1304
1305 MovieTrackingTrack *track = static_cast<MovieTrackingTrack *>(
1306 clip->tracking.tracks_legacy.first);
1307 while (track) {
1308 if (track->minimum_correlation == 0.0f) {
1309 track->minimum_correlation = 0.75f;
1310 }
1311
1312 track = static_cast<MovieTrackingTrack *>(track->next);
1313 }
1314 }
1315 }
1316 }
1317
1318 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 260, 6)) {
1319 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
1321 }
1322
1323 LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) {
1324 MovieTrackingSettings *settings = &clip->tracking.settings;
1325
1326 if (settings->default_pattern_size == 0.0f) {
1328 settings->default_minimum_correlation = 0.75;
1329 settings->default_pattern_size = 11;
1330 settings->default_search_size = 51;
1331 }
1332 }
1333
1334 {
1335 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1336 /* convert delta addition into delta scale */
1337 int i;
1338 for (i = 0; i < 3; i++) {
1339 if ((ob->dsize[i] == 0.0f) || /* simple case, user never touched dsize */
1340 (ob->scale[i] == 0.0f)) /* can't scale the dsize to give a non zero result,
1341 * so fallback to 1.0f */
1342 {
1343 ob->dscale[i] = 1.0f;
1344 }
1345 else {
1346 ob->dscale[i] = (ob->scale[i] + ob->dsize[i]) / ob->scale[i];
1347 }
1348 }
1349 }
1350 }
1351 }
1352 /* sigh, this dscale vs dsize version patching was not done right, fix for fix,
1353 * this intentionally checks an exact subversion, also note this was never in a release,
1354 * at some point this could be removed. */
1355 else if (bmain->versionfile == 260 && bmain->subversionfile == 6) {
1356 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1357 if (is_zero_v3(ob->dscale)) {
1358 copy_vn_fl(ob->dscale, 3, 1.0f);
1359 }
1360 }
1361 }
1362
1363 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 260, 8)) {
1364 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
1365 if (brush->sculpt_brush_type == SCULPT_BRUSH_TYPE_ROTATE) {
1366 brush->alpha = 1.0f;
1367 }
1368 }
1369 }
1370
1371 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 261, 1)) {
1372 {
1373 /* update use flags for node sockets (was only temporary before) */
1375 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
1376 if (sce->nodetree) {
1378 }
1379 }
1380
1381 LISTBASE_FOREACH (Material *, mat, &bmain->materials) {
1382 if (mat->nodetree) {
1384 }
1385 }
1386
1387 LISTBASE_FOREACH (Tex *, tex, &bmain->textures) {
1388 if (tex->nodetree) {
1390 }
1391 }
1392
1393 LISTBASE_FOREACH (Light *, la, &bmain->lights) {
1394 if (la->nodetree) {
1396 }
1397 }
1398
1399 LISTBASE_FOREACH (World *, world, &bmain->worlds) {
1400 if (world->nodetree) {
1402 }
1403 }
1404
1405 LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
1407 }
1408 }
1409 {
1410 LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) {
1411 MovieTracking *tracking = &clip->tracking;
1412 MovieTrackingObject *tracking_object = static_cast<MovieTrackingObject *>(
1413 tracking->objects.first);
1414
1415 clip->proxy.build_tc_flag |= IMB_TC_RECORD_RUN_NO_GAPS;
1416
1417 if (!tracking->settings.object_distance) {
1418 tracking->settings.object_distance = 1.0f;
1419 }
1420
1421 if (BLI_listbase_is_empty(&tracking->objects)) {
1422 BKE_tracking_object_add(tracking, "Camera");
1423 }
1424
1425 while (tracking_object) {
1426 if (!tracking_object->scale) {
1427 tracking_object->scale = 1.0f;
1428 }
1429
1430 tracking_object = static_cast<MovieTrackingObject *>(tracking_object->next);
1431 }
1432 }
1433
1434 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1435 LISTBASE_FOREACH (bConstraint *, con, &ob->constraints) {
1436 if (con->type == CONSTRAINT_TYPE_OBJECTSOLVER) {
1437 bObjectSolverConstraint *data = static_cast<bObjectSolverConstraint *>(con->data);
1438
1439 if (data->invmat[3][3] == 0.0f) {
1440 unit_m4(data->invmat);
1441 }
1442 }
1443 }
1444 }
1445 }
1446 }
1447
1448 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 261, 2)) {
1449 {
1450 /* convert deprecated sculpt_paint_unified_* fields to
1451 * UnifiedPaintSettings */
1452 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
1453 ToolSettings *ts = scene->toolsettings;
1455 ups->size = ts->sculpt_paint_unified_size;
1456 ups->unprojected_radius = ts->sculpt_paint_unified_unprojected_radius;
1457 ups->alpha = ts->sculpt_paint_unified_alpha;
1458 ups->flag = ts->sculpt_paint_settings;
1459 }
1460 }
1461 }
1462
1463 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 261, 3)) {
1464 {
1465 /* Convert extended ASCII to UTF8 for text editor. */
1467 LISTBASE_FOREACH (Text *, text, &bmain->texts) {
1468 if (!(text->flags & TXT_ISEXT)) {
1469 LISTBASE_FOREACH (TextLine *, tl, &text->lines) {
1470 int added = txt_extended_ascii_as_utf8(&tl->line);
1471 tl->len += added;
1472
1473 /* reset cursor position if line was changed */
1474 if (added && tl == text->curl) {
1475 text->curc = 0;
1476 }
1477 }
1478 }
1479 }
1480 }
1481 {
1482 /* set new dynamic paint values */
1483 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1484 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
1485 if (md->type == eModifierType_DynamicPaint) {
1487 if (pmd->canvas) {
1488 DynamicPaintSurface *surface = static_cast<DynamicPaintSurface *>(
1489 pmd->canvas->surfaces.first);
1490 for (; surface; surface = static_cast<DynamicPaintSurface *>(surface->next)) {
1491 surface->color_dry_threshold = 1.0f;
1492 surface->influence_scale = 1.0f;
1493 surface->radius_scale = 1.0f;
1494 surface->flags |= MOD_DPAINT_USE_DRYING;
1495 }
1496 }
1497 }
1498 }
1499 }
1500 }
1501 }
1502
1503 if (bmain->versionfile < 262) {
1504 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1505 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
1506 if (md->type == eModifierType_Cloth) {
1508 if (clmd->sim_parms) {
1509 clmd->sim_parms->vel_damping = 1.0f;
1510 }
1511 }
1512 }
1513 }
1514 }
1515
1516 if (bmain->versionfile < 263) {
1517 /* set fluidsim rate. the version patch for this in 2.62 was wrong, so
1518 * try to correct it, if rate is 0.0 that's likely not intentional */
1519 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1520 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
1521 if (md->type == eModifierType_Fluidsim) {
1523 if (fmd->fss->animRate == 0.0f) {
1524 fmd->fss->animRate = 1.0f;
1525 }
1526 }
1527 }
1528 }
1529 }
1530
1531 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 262, 1)) {
1532 /* update use flags for node sockets (was only temporary before) */
1533 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
1534 if (sce->nodetree) {
1536 }
1537 }
1538
1539 /* XXX can't associate with scene for group nodes, image format will stay uninitialized */
1540 LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
1542 }
1543 }
1544
1545 /* only swap for pre-release bmesh merge which had MLoopCol red/blue swap */
1546 if (bmain->versionfile == 262 && bmain->subversionfile == 1) {
1547 {
1548 LISTBASE_FOREACH (Mesh *, me, &bmain->meshes) {
1550 }
1551 }
1552 }
1553
1554 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 262, 2)) {
1555 /* Set new idname of keyingsets from their now "label-only" name. */
1556 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
1557 LISTBASE_FOREACH (KeyingSet *, ks, &scene->keyingsets) {
1558 if (!ks->idname[0]) {
1559 STRNCPY(ks->idname, ks->name);
1560 }
1561 }
1562 }
1563 }
1564
1565 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 262, 3)) {
1566 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1567 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
1568 if (md->type == eModifierType_Lattice) {
1570 lmd->strength = 1.0f;
1571 }
1572 }
1573 }
1574 }
1575
1576 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 262, 4)) {
1577 /* Read Viscosity presets from older files */
1578 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1579 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
1580 if (md->type == eModifierType_Fluidsim) {
1582 if (fmd->fss->viscosityMode == 3) {
1583 fmd->fss->viscosityValue = 5.0;
1584 fmd->fss->viscosityExponent = 5;
1585 }
1586 else if (fmd->fss->viscosityMode == 4) {
1587 fmd->fss->viscosityValue = 2.0;
1588 fmd->fss->viscosityExponent = 3;
1589 }
1590 }
1591 }
1592 }
1593 }
1594
1595 if (bmain->versionfile < 263) {
1596 /* Default for old files is to save particle rotations to pointcache */
1597 LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
1598 part->flag |= PART_ROTATIONS;
1599 }
1600 }
1601
1602 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 1)) {
1603 /* file output node paths are now stored in the file info struct instead socket name */
1604 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
1605 if (sce->nodetree) {
1607 }
1608 }
1609 LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
1611 }
1612 }
1613
1614 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 3)) {
1615 /* For weight paint, each brush now gets its own weight;
1616 * unified paint settings also have weight. Update unified
1617 * paint settings and brushes with a default weight value. */
1618 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
1619 ToolSettings *ts = scene->toolsettings;
1620 if (ts) {
1623 }
1624 }
1625
1626 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
1627 brush->weight = 0.5;
1628 }
1629 }
1630
1631 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 2)) {
1632 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
1633 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
1634 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
1635 if (sl->spacetype == SPACE_CLIP) {
1636 SpaceClip *sclip = (SpaceClip *)sl;
1637 bool hide = false;
1638
1639 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
1640 if (region->regiontype == RGN_TYPE_PREVIEW) {
1641 if (region->alignment != RGN_ALIGN_NONE) {
1642 region->flag |= RGN_FLAG_HIDDEN;
1643 region->v2d.flag &= ~V2D_IS_INIT;
1644 region->alignment = RGN_ALIGN_NONE;
1645
1646 hide = true;
1647 }
1648 }
1649 }
1650
1651 if (hide) {
1652 sclip->view = SC_VIEW_CLIP;
1653 }
1654 }
1655 }
1656 }
1657 }
1658 }
1659
1660 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 4)) {
1661 LISTBASE_FOREACH (Camera *, cam, &bmain->cameras) {
1662 if (cam->flag & CAM_PANORAMA) {
1663 cam->type = CAM_PANO;
1664 cam->flag &= ~CAM_PANORAMA;
1665 }
1666 }
1667
1668 LISTBASE_FOREACH (Curve *, cu, &bmain->curves) {
1669 if (cu->bevfac2 == 0.0f) {
1670 cu->bevfac1 = 0.0f;
1671 cu->bevfac2 = 1.0f;
1672 }
1673 }
1674 }
1675
1676 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 5)) {
1677 {
1678 /* file output node paths are now stored in the file info struct instead socket name */
1679 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
1680 if (sce->nodetree) {
1683 }
1684 }
1685 LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
1688 }
1689 }
1690 }
1691
1692 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 6)) {
1693 /* update use flags for node sockets (was only temporary before) */
1694 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
1695 if (sce->nodetree) {
1696 do_versions_nodetree_frame_2_64_6(sce->nodetree);
1697 }
1698 }
1699
1700 LISTBASE_FOREACH (Material *, mat, &bmain->materials) {
1701 if (mat->nodetree) {
1702 do_versions_nodetree_frame_2_64_6(mat->nodetree);
1703 }
1704 }
1705
1706 LISTBASE_FOREACH (Tex *, tex, &bmain->textures) {
1707 if (tex->nodetree) {
1708 do_versions_nodetree_frame_2_64_6(tex->nodetree);
1709 }
1710 }
1711
1712 LISTBASE_FOREACH (Light *, la, &bmain->lights) {
1713 if (la->nodetree) {
1715 }
1716 }
1717
1718 LISTBASE_FOREACH (World *, world, &bmain->worlds) {
1719 if (world->nodetree) {
1720 do_versions_nodetree_frame_2_64_6(world->nodetree);
1721 }
1722 }
1723
1724 LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
1726 }
1727 }
1728
1729 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 7)) {
1730 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1731 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
1732 if (md->type == eModifierType_Fluid) {
1734 if ((fmd->type & MOD_FLUID_TYPE_DOMAIN) && fmd->domain) {
1735 int maxres = max_iii(fmd->domain->res[0], fmd->domain->res[1], fmd->domain->res[2]);
1736 fmd->domain->scale = fmd->domain->dx * maxres;
1737 fmd->domain->dx = 1.0f / fmd->domain->scale;
1738 }
1739 }
1740 }
1741 }
1742 }
1743
1744 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 9)) {
1745 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
1746 if (ntree->type == NTREE_SHADER) {
1747 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1748 if (ELEM(node->type_legacy, SH_NODE_TEX_IMAGE, SH_NODE_TEX_ENVIRONMENT)) {
1749 NodeTexImage *tex = static_cast<NodeTexImage *>(node->storage);
1750
1751 tex->iuser.frames = 1;
1752 tex->iuser.sfra = 1;
1753 }
1754 }
1755 }
1756 }
1758 }
1759
1760 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 10)) {
1761 {
1762 /* composite redesign */
1763 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
1764 if (ntree->type == NTREE_COMPOSIT) {
1765 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1766 if (node->type_legacy == CMP_NODE_DEFOCUS) {
1767 NodeDefocus *data = static_cast<NodeDefocus *>(node->storage);
1768 if (data->maxblur == 0.0f) {
1769 data->maxblur = 16.0f;
1770 }
1771 }
1772 }
1773 }
1774 }
1776 }
1777
1778 {
1780 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
1781 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
1782 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
1783 if (sl->spacetype == SPACE_CLIP) {
1784 SpaceClip *sclip = (SpaceClip *)sl;
1785
1786 if (sclip->around == 0) {
1788 }
1789 }
1790 }
1791 }
1792 }
1793 }
1794
1795 {
1796 LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) {
1797 clip->start_frame = 1;
1798 }
1799 }
1800 }
1801
1802 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 11)) {
1803 LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) {
1804 MovieTrackingTrack *track = static_cast<MovieTrackingTrack *>(
1805 clip->tracking.tracks_legacy.first);
1806 while (track) {
1808
1809 track = static_cast<MovieTrackingTrack *>(track->next);
1810 }
1811 }
1812 }
1813
1814 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 13)) {
1815 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
1816 if (ntree->type == NTREE_COMPOSIT) {
1817 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1818 if (node->type_legacy == CMP_NODE_DILATEERODE) {
1819 if (node->storage == nullptr) {
1821 data->falloff = PROP_SMOOTH;
1822 node->storage = data;
1823 }
1824 }
1825 }
1826 }
1827 }
1829 }
1830
1831 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 14)) {
1832 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
1833 if (ntree->type == NTREE_COMPOSIT) {
1834 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1835 if (node->type_legacy == CMP_NODE_KEYING) {
1836 NodeKeyingData *data = static_cast<NodeKeyingData *>(node->storage);
1837
1838 if (data->despill_balance == 0.0f) {
1839 data->despill_balance = 0.5f;
1840 }
1841 }
1842 }
1843 }
1844 }
1846
1847 /* Keep compatibility for dupli-object particle size. */
1848 LISTBASE_FOREACH (ParticleSettings *, part, &bmain->particles) {
1849 if (ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
1850 if ((part->draw & PART_DRAW_ROTATE_OB) == 0) {
1851 part->draw |= PART_DRAW_NO_SCALE_OB;
1852 }
1853 }
1854 }
1855 }
1856
1857 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 17)) {
1858 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
1859 if (ntree->type == NTREE_COMPOSIT) {
1860 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1861 if (node->type_legacy == CMP_NODE_MASK) {
1862 if (node->storage == nullptr) {
1863 NodeMask *data = MEM_callocN<NodeMask>(__func__);
1864 /* move settings into own struct */
1865 data->size_x = int(node->custom3);
1866 data->size_y = int(node->custom4);
1867 node->custom3 = 0.5f; /* default shutter */
1868 node->storage = data;
1869 }
1870 }
1871 }
1872 }
1873 }
1875 }
1876
1877 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 18)) {
1878 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
1879 if (scene->ed) {
1881 &scene->ed->seqbase, strip_colorbalance_update_cb, nullptr);
1882 }
1883 }
1884 }
1885
1886 /* color management pipeline changes compatibility code */
1887 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 19)) {
1888 bool colormanagement_disabled = false;
1889
1890 /* make scenes which are not using color management have got None as display device,
1891 * so they wouldn't perform linear-to-sRGB conversion on display
1892 */
1893 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
1894 if ((scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) == 0) {
1895 ColorManagedDisplaySettings *display_settings = &scene->display_settings;
1896
1897 if (display_settings->display_device[0] == 0) {
1899 }
1900
1901 colormanagement_disabled = true;
1902 }
1903 }
1904
1905 LISTBASE_FOREACH (Image *, ima, &bmain->images) {
1906 if (ima->source == IMA_SRC_VIEWER) {
1907 ima->flag |= IMA_VIEW_AS_RENDER;
1908 }
1909 else if (colormanagement_disabled) {
1910 /* if color-management not used, set image's color space to raw, so no sRGB->linear
1911 * conversion would happen on display and render there's no clear way to check whether
1912 * color management is enabled or not in render engine so set all images to raw if there's
1913 * at least one scene with color management disabled this would still behave incorrect in
1914 * cases when color management was used for only some of scenes, but such a setup is
1915 * crazy anyway and think it's fair enough to break compatibility in that cases.
1916 */
1917
1918 STRNCPY(ima->colorspace_settings.name, "Raw");
1919 }
1920 }
1921 }
1922
1923 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 20)) {
1924 LISTBASE_FOREACH (Key *, key, &bmain->shapekeys) {
1926 }
1927 }
1928
1929 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 263, 21)) {
1930 {
1931 LISTBASE_FOREACH (Mesh *, me, &bmain->meshes) {
1932 CustomData_update_typemap(&me->vert_data);
1933 CustomData_free_layers(&me->vert_data, CD_MSTICKY);
1934 }
1935 }
1936 }
1937
1938 /* correction for files saved in blender version when BKE_pose_copy_data
1939 * didn't copy animation visualization, which lead to deadlocks on motion
1940 * path calculation for proxied armatures, see #32742.
1941 */
1942 if (bmain->versionfile < 264) {
1943 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1944 if (ob->pose) {
1945 if (ob->pose->avs.path_step == 0) {
1946 animviz_settings_init(&ob->pose->avs);
1947 }
1948 }
1949 }
1950 }
1951
1952 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 264, 1)) {
1953 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
1954 if (ntree->type == NTREE_SHADER) {
1955 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
1956 if (node->type_legacy == SH_NODE_TEX_COORD) {
1957 node->flag |= NODE_OPTIONS;
1958 }
1959 }
1960 }
1961 }
1963 }
1964
1965 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 264, 2)) {
1966 LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) {
1967 MovieTracking *tracking = &clip->tracking;
1968 LISTBASE_FOREACH (MovieTrackingObject *, tracking_object, &tracking->objects) {
1969 if (tracking_object->keyframe1 == 0 && tracking_object->keyframe2 == 0) {
1970 tracking_object->keyframe1 = tracking->settings.keyframe1_legacy;
1971 tracking_object->keyframe2 = tracking->settings.keyframe2_legacy;
1972 }
1973 }
1974 }
1975 }
1976
1977 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 264, 3)) {
1978 /* smoke branch */
1979 {
1981 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
1982 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
1983 if (md->type == eModifierType_Fluid) {
1985 if ((fmd->type & MOD_FLUID_TYPE_DOMAIN) && fmd->domain) {
1986 /* keep branch saves if possible */
1987 if (!fmd->domain->flame_max_temp) {
1988 fmd->domain->burning_rate = 0.75f;
1989 fmd->domain->flame_smoke = 1.0f;
1990 fmd->domain->flame_vorticity = 0.5f;
1991 fmd->domain->flame_ignition = 1.25f;
1992 fmd->domain->flame_max_temp = 1.75f;
1993 fmd->domain->adapt_threshold = 0.02f;
1994 fmd->domain->adapt_margin = 4;
1995 fmd->domain->flame_smoke_color[0] = 0.7f;
1996 fmd->domain->flame_smoke_color[1] = 0.7f;
1997 fmd->domain->flame_smoke_color[2] = 0.7f;
1998 }
1999 }
2000 else if ((fmd->type & MOD_FLUID_TYPE_FLOW) && fmd->flow) {
2001 if (!fmd->flow->texture_size) {
2002 fmd->flow->fuel_amount = 1.0;
2003 fmd->flow->surface_distance = 1.5;
2004 fmd->flow->color[0] = 0.7f;
2005 fmd->flow->color[1] = 0.7f;
2006 fmd->flow->color[2] = 0.7f;
2007 fmd->flow->texture_size = 1.0f;
2008 }
2009 }
2010 }
2011 }
2012 }
2013 }
2014
2015 /* render border for viewport */
2016 {
2017 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2018 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2019 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
2020 if (sl->spacetype == SPACE_VIEW3D) {
2021 View3D *v3d = (View3D *)sl;
2022 if (v3d->render_border.xmin == 0.0f && v3d->render_border.ymin == 0.0f &&
2023 v3d->render_border.xmax == 0.0f && v3d->render_border.ymax == 0.0f)
2024 {
2025 v3d->render_border.xmax = 1.0f;
2026 v3d->render_border.ymax = 1.0f;
2027 }
2028 }
2029 }
2030 }
2031 }
2032 }
2033 }
2034
2035 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 264, 5)) {
2036 /* set a unwrapping margin and ABF by default */
2037 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2038 if (scene->toolsettings->uvcalc_margin == 0.0f) {
2039 scene->toolsettings->uvcalc_margin = 0.001f;
2040 scene->toolsettings->unwrapper = UVCALC_UNWRAP_METHOD_ANGLE;
2041 }
2042 }
2043 }
2044
2045 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 264, 7)) {
2046 /* convert tiles size from resolution and number of tiles */
2047 {
2049 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2050 if (scene->r.tilex == 0 || scene->r.tiley == 1) {
2051 scene->r.tilex = scene->r.tiley = 64;
2052 }
2053 }
2054 }
2055
2056 /* collision masks */
2057 {
2058 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2059 if (ob->col_group == 0) {
2060 ob->col_group = 0x01;
2061 ob->col_mask = 0xff;
2062 }
2063 }
2064 }
2065 }
2066
2067 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 264, 7)) {
2068 LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) {
2069 LISTBASE_FOREACH (MovieTrackingTrack *, track, &clip->tracking.tracks_legacy) {
2071 }
2072
2073 LISTBASE_FOREACH (MovieTrackingObject *, tracking_object, &clip->tracking.objects) {
2074 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
2076 }
2077 }
2078 }
2079 }
2080
2081 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 265, 3)) {
2082 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2083 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2084 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
2085 switch (sl->spacetype) {
2086 case SPACE_VIEW3D: {
2087 View3D *v3d = (View3D *)sl;
2088 v3d->flag2 |= V3D_SHOW_ANNOTATION;
2089 break;
2090 }
2091 case SPACE_SEQ: {
2092 SpaceSeq *sseq = (SpaceSeq *)sl;
2094 break;
2095 }
2096 case SPACE_IMAGE: {
2097 SpaceImage *sima = (SpaceImage *)sl;
2098 sima->flag |= SI_SHOW_GPENCIL;
2099 break;
2100 }
2101 case SPACE_NODE: {
2102 SpaceNode *snode = (SpaceNode *)sl;
2103 snode->flag |= SNODE_SHOW_GPENCIL;
2104 break;
2105 }
2106 case SPACE_CLIP: {
2107 SpaceClip *sclip = (SpaceClip *)sl;
2108 sclip->flag |= SC_SHOW_ANNOTATION;
2109 break;
2110 }
2111 }
2112 }
2113 }
2114 }
2115 }
2116
2117 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 265, 5)) {
2118 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2119 if (scene->ed) {
2120 blender::seq::for_each_callback(&scene->ed->seqbase, strip_set_alpha_mode_cb, nullptr);
2121 }
2122
2123 if (scene->r.bake_samples == 0) {
2124 scene->r.bake_samples = 256;
2125 }
2126 }
2127
2128 LISTBASE_FOREACH (Image *, image, &bmain->images) {
2129 if (image->flag & IMA_DO_PREMUL) {
2130 image->alpha_mode = IMA_ALPHA_STRAIGHT;
2131 }
2132 else {
2134 }
2135 }
2136
2137 LISTBASE_FOREACH (Tex *, tex, &bmain->textures) {
2138 if (tex->type == TEX_IMAGE && (tex->imaflag & TEX_USEALPHA) == 0) {
2139 Image *image = static_cast<Image *>(
2140 blo_do_versions_newlibadr(fd, &tex->id, ID_IS_LINKED(tex), tex->ima));
2141
2142 if (image && (image->flag & IMA_DO_PREMUL) == 0) {
2143 enum { IMA_IGNORE_ALPHA = (1 << 12) };
2144 image->flag |= IMA_IGNORE_ALPHA;
2145 }
2146 }
2147 }
2148
2149 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2150 if (ntree->type == NTREE_COMPOSIT) {
2151 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2152 if (node->type_legacy == CMP_NODE_IMAGE) {
2153 Image *image = static_cast<Image *>(
2154 blo_do_versions_newlibadr(fd, &ntree->id, ID_IS_LINKED(ntree), node->id));
2155
2156 if (image) {
2157 if ((image->flag & IMA_DO_PREMUL) == 0 && image->alpha_mode == IMA_ALPHA_STRAIGHT) {
2158 node->custom1 |= CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT;
2159 }
2160 }
2161 }
2162 }
2163 }
2164 }
2166 }
2167 else if (!MAIN_VERSION_FILE_ATLEAST(bmain, 266, 1)) {
2168 /* texture use alpha was removed for 2.66 but added back again for 2.66a,
2169 * for compatibility all textures assumed it to be enabled */
2170 LISTBASE_FOREACH (Tex *, tex, &bmain->textures) {
2171 if (tex->type == TEX_IMAGE) {
2172 tex->imaflag |= TEX_USEALPHA;
2173 }
2174 }
2175 }
2176
2177 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 265, 7)) {
2178 LISTBASE_FOREACH (Curve *, cu, &bmain->curves) {
2179 if (cu->flag & (CU_FRONT | CU_BACK)) {
2180 if (cu->extrude != 0.0f || cu->bevel_radius != 0.0f) {
2181 LISTBASE_FOREACH (Nurb *, nu, &cu->nurb) {
2182 int a;
2183
2184 if (nu->bezt) {
2185 BezTriple *bezt = nu->bezt;
2186 a = nu->pntsu;
2187
2188 while (a--) {
2189 bezt->radius = 1.0f;
2190 bezt++;
2191 }
2192 }
2193 else if (nu->bp) {
2194 BPoint *bp = nu->bp;
2195 a = nu->pntsu * nu->pntsv;
2196
2197 while (a--) {
2198 bp->radius = 1.0f;
2199 bp++;
2200 }
2201 }
2202 }
2203 }
2204 }
2205 }
2206 }
2207
2208 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 265, 9)) {
2209 LISTBASE_FOREACH (Mesh *, me, &bmain->meshes) {
2211 }
2212 }
2213
2214 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 265, 10)) {
2215 LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
2216 if (br->ob_mode & OB_MODE_TEXTURE_PAINT) {
2217 br->mtex.brush_map_mode = MTEX_MAP_MODE_TILED;
2218 }
2219 }
2220 }
2221
2222 /* add storage for compositor translate nodes when not existing */
2223 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 265, 11)) {
2224 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2225 if (ntree->type == NTREE_COMPOSIT) {
2226 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2227 if (node->type_legacy == CMP_NODE_TRANSLATE && node->storage == nullptr) {
2228 node->storage = MEM_callocN<NodeTranslateData>("node translate data");
2229 }
2230 }
2231 }
2232 }
2234 }
2235
2236 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 266, 2)) {
2237 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2238 do_versions_nodetree_customnodes(ntree, ((ID *)ntree == id));
2239 }
2241 }
2242
2243 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 266, 2)) {
2244 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2245 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2246 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
2247 if (sl->spacetype == SPACE_NODE) {
2248 SpaceNode *snode = (SpaceNode *)sl;
2249
2250 /* reset pointers to force tree path update from context */
2251 snode->nodetree = nullptr;
2252 snode->edittree = nullptr;
2253 snode->id = nullptr;
2254 snode->from = nullptr;
2255
2256 /* convert deprecated treetype setting to tree_idname */
2257 switch (snode->treetype) {
2258 case NTREE_COMPOSIT:
2259 STRNCPY(snode->tree_idname, "CompositorNodeTree");
2260 break;
2261 case NTREE_SHADER:
2262 STRNCPY(snode->tree_idname, "ShaderNodeTree");
2263 break;
2264 case NTREE_TEXTURE:
2265 STRNCPY(snode->tree_idname, "TextureNodeTree");
2266 break;
2267 }
2268 }
2269 }
2270 }
2271 }
2272 }
2273
2274 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 266, 3)) {
2275 {
2276 /* Fix for a very old issue:
2277 * Node names were nominally made unique in r24478 (2.50.8), but the do_versions check
2278 * to update existing node names only applied to `bmain->nodetree` (i.e. group nodes).
2279 * Uniqueness is now required for proper preview mapping,
2280 * so do this now to ensure old files don't break.
2281 */
2282 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2283 if (id == &ntree->id) {
2284 continue; /* already fixed for node groups */
2285 }
2286
2287 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2288 blender::bke::node_unique_name(*ntree, *node);
2289 }
2290 }
2292 }
2293
2294 /* Convert the previously used ntree->inputs/ntree->outputs lists to interface nodes.
2295 * Pre 2.56.2 node trees automatically have all unlinked sockets exposed already,
2296 * see do_versions_after_linking_250.
2297 *
2298 * This assumes valid typeinfo pointers, as set in lib_link_ntree.
2299 *
2300 * NOTE: theoretically only needed in node groups (main->nodetree),
2301 * but due to a temporary bug such links could have been added in all trees,
2302 * so have to clean up all of them ...
2303 *
2304 * NOTE: this always runs, without it links with nullptr fromnode and tonode remain
2305 * which causes problems.
2306 */
2307 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2308 bNode *input_node = nullptr, *output_node = nullptr;
2309 int num_inputs = 0, num_outputs = 0;
2310 bNodeLink *link, *next_link;
2311 /* Only create new interface nodes for actual older files.
2312 * New file versions already have input/output nodes with duplicate links,
2313 * in that case just remove the invalid links.
2314 */
2315 const bool create_io_nodes = MAIN_VERSION_FILE_OLDER(bmain, 266, 2);
2316
2317 float input_locx = 1000000.0f, input_locy = 0.0f;
2318 float output_locx = -1000000.0f, output_locy = 0.0f;
2319 /* Rough guess, not nice but we don't have access to UI constants here. */
2320 const float offsetx = 42 + 3 * 20 + 20;
2321 // const float offsety = 0.0f;
2322
2323 if (create_io_nodes) {
2324 if (ntree->inputs_legacy.first) {
2326 }
2327
2328 if (ntree->outputs_legacy.first) {
2330 }
2331 }
2332
2333 /* Redirect links from/to the node tree interface to input/output node.
2334 * If the fromnode/tonode pointers are nullptr, this means a link from/to
2335 * the ntree interface sockets, which need to be redirected to new interface nodes.
2336 */
2337 for (link = static_cast<bNodeLink *>(ntree->links.first); link != nullptr; link = next_link)
2338 {
2339 bool free_link = false;
2340 next_link = link->next;
2341
2342 if (link->fromnode == nullptr) {
2343 if (input_node) {
2344 link->fromnode = input_node;
2345 link->fromsock = node_group_input_find_socket(input_node, link->fromsock->identifier);
2346 BLI_assert(link->fromsock != nullptr);
2347 num_inputs++;
2348
2349 if (link->tonode) {
2350 input_locx = std::min(input_locx, link->tonode->locx_legacy - offsetx);
2351 input_locy += link->tonode->locy_legacy;
2352 }
2353 }
2354 else {
2355 free_link = true;
2356 }
2357 }
2358
2359 if (link->tonode == nullptr) {
2360 if (output_node) {
2361 link->tonode = output_node;
2362 link->tosock = node_group_output_find_socket(output_node, link->tosock->identifier);
2363 BLI_assert(link->tosock != nullptr);
2364 num_outputs++;
2365
2366 if (link->fromnode) {
2367 output_locx = std::max(output_locx, link->fromnode->locx_legacy + offsetx);
2368 output_locy += link->fromnode->locy_legacy;
2369 }
2370 }
2371 else {
2372 free_link = true;
2373 }
2374 }
2375
2376 if (free_link) {
2377 blender::bke::node_remove_link(ntree, *link);
2378 }
2379 }
2380
2381 if (num_inputs > 0) {
2382 input_locy /= num_inputs;
2383 input_node->locx_legacy = input_locx;
2384 input_node->locy_legacy = input_locy;
2385 }
2386 if (num_outputs > 0) {
2387 output_locy /= num_outputs;
2388 output_node->locx_legacy = output_locx;
2389 output_node->locy_legacy = output_locy;
2390 }
2391 }
2393 }
2394
2395 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 280, 60)) {
2396 /* From this point we no longer write incomplete links for forward
2397 * compatibility with 2.66, we have to clean them up for all previous
2398 * versions. */
2399 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2400 bNodeLink *link, *next_link;
2401
2402 for (link = static_cast<bNodeLink *>(ntree->links.first); link != nullptr; link = next_link)
2403 {
2404 next_link = link->next;
2405 if (link->fromnode == nullptr || link->tonode == nullptr) {
2406 blender::bke::node_remove_link(ntree, *link);
2407 }
2408 }
2409 }
2411 }
2412
2413 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 266, 4)) {
2414 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
2415 BKE_texture_mtex_default(&brush->mask_mtex);
2416
2417 if (brush->ob_mode & OB_MODE_TEXTURE_PAINT) {
2418 brush->spacing /= 2;
2419 }
2420 }
2421 }
2422
2423 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 266, 6)) {
2424#define BRUSH_TEXTURE_OVERLAY (1 << 21)
2425
2426 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
2427 brush->overlay_flags = 0;
2428 if (brush->flag & BRUSH_TEXTURE_OVERLAY) {
2429 brush->overlay_flags |= (BRUSH_OVERLAY_PRIMARY | BRUSH_OVERLAY_CURSOR);
2430 }
2431 }
2432#undef BRUSH_TEXTURE_OVERLAY
2433 }
2434
2435 if (bmain->versionfile < 267) {
2436 // if (!DNA_struct_member_exists(fd->filesdna, "Brush", "int", "stencil_pos")) {
2437 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
2438 if (brush->stencil_dimension[0] == 0) {
2439 brush->stencil_dimension[0] = 256;
2440 brush->stencil_dimension[1] = 256;
2441 brush->stencil_pos[0] = 256;
2442 brush->stencil_pos[1] = 256;
2443 }
2444 if (brush->mask_stencil_dimension[0] == 0) {
2445 brush->mask_stencil_dimension[0] = 256;
2446 brush->mask_stencil_dimension[1] = 256;
2447 brush->mask_stencil_pos[0] = 256;
2448 brush->mask_stencil_pos[1] = 256;
2449 }
2450 }
2451
2462 }
2463
2464 /* default values in Freestyle settings */
2465 if (bmain->versionfile < 267) {
2466 LISTBASE_FOREACH (Scene *, sce, &bmain->scenes) {
2467 if (sce->r.line_thickness_mode == 0) {
2468 sce->r.line_thickness_mode = R_LINE_THICKNESS_ABSOLUTE;
2469 sce->r.unit_line_thickness = 1.0f;
2470 }
2471 LISTBASE_FOREACH (SceneRenderLayer *, srl, &sce->r.layers) {
2472 if (srl->freestyleConfig.mode == 0) {
2473 srl->freestyleConfig.mode = FREESTYLE_CONTROL_EDITOR_MODE;
2474 }
2475 if (ELEM(srl->freestyleConfig.raycasting_algorithm,
2478 {
2479 srl->freestyleConfig.raycasting_algorithm = 0; /* deprecated */
2480 srl->freestyleConfig.flags |= FREESTYLE_CULLING;
2481 }
2482 }
2483
2484 /* not freestyle */
2485 {
2486 MeshStatVis *statvis = &sce->toolsettings->statvis;
2487 if (statvis->thickness_samples == 0) {
2488 statvis->overhang_axis = OB_NEGZ;
2489 statvis->overhang_min = 0;
2490 statvis->overhang_max = DEG2RADF(45.0f);
2491
2492 statvis->thickness_max = 0.1f;
2493 statvis->thickness_samples = 1;
2494
2495 statvis->distort_min = DEG2RADF(5.0f);
2496 statvis->distort_max = DEG2RADF(45.0f);
2497
2498 statvis->sharp_min = DEG2RADF(90.0f);
2499 statvis->sharp_max = DEG2RADF(180.0f);
2500 }
2501 }
2502 }
2503 LISTBASE_FOREACH (FreestyleLineStyle *, linestyle, &bmain->linestyles) {
2504#if 1
2505 /* disable the Misc panel for now */
2506 if (linestyle->panel == LS_PANEL_MISC) {
2507 linestyle->panel = LS_PANEL_STROKES;
2508 }
2509#endif
2510 if (linestyle->thickness_position == 0) {
2511 linestyle->thickness_position = LS_THICKNESS_CENTER;
2512 linestyle->thickness_ratio = 0.5f;
2513 }
2514 if (linestyle->chaining == 0) {
2515 linestyle->chaining = LS_CHAINING_PLAIN;
2516 }
2517 if (linestyle->rounds == 0) {
2518 linestyle->rounds = 3;
2519 }
2520 }
2521 }
2522
2523 if (bmain->versionfile < 267) {
2524 /* Initialize the active_viewer_key for compositing */
2525 bNodeInstanceKey active_viewer_key = {0};
2526 /* simply pick the first node space and use that for the active viewer key */
2527 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2528 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2529 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
2530 if (sl->spacetype == SPACE_NODE) {
2531 SpaceNode *snode = (SpaceNode *)sl;
2532 bNodeTreePath *path = static_cast<bNodeTreePath *>(snode->treepath.last);
2533 if (!path) {
2534 continue;
2535 }
2536
2537 active_viewer_key = path->parent_key;
2538 break;
2539 }
2540 }
2541 if (active_viewer_key.value != 0) {
2542 break;
2543 }
2544 }
2545 if (active_viewer_key.value != 0) {
2546 break;
2547 }
2548 }
2549
2550 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2551 /* NOTE: `scene->nodetree` is a local ID block, has been direct_link'ed. */
2552 if (scene->nodetree) {
2553 scene->nodetree->active_viewer_key = active_viewer_key;
2554 }
2555 }
2556 }
2557
2558 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 267, 1)) {
2559 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2560 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
2561 if (md->type == eModifierType_Fluid) {
2563 if ((fmd->type & MOD_FLUID_TYPE_DOMAIN) && fmd->domain) {
2564 if (fmd->domain->flags & FLUID_DOMAIN_USE_HIGH_SMOOTH) {
2566 }
2567 else {
2569 }
2570 }
2571 }
2572 }
2573 }
2574 }
2575
2576 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 268, 1)) {
2577 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
2578 brush->spacing = std::max(1, brush->spacing);
2579 }
2580 }
2581
2582 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 268, 2)) {
2583#define BRUSH_FIXED (1 << 6)
2584 LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
2585 brush->flag &= ~BRUSH_FIXED;
2586
2587 if (brush->cursor_overlay_alpha < 2) {
2588 brush->cursor_overlay_alpha = 33;
2589 }
2590 if (brush->texture_overlay_alpha < 2) {
2591 brush->texture_overlay_alpha = 33;
2592 }
2593 if (brush->mask_overlay_alpha < 2) {
2594 brush->mask_overlay_alpha = 33;
2595 }
2596 }
2597#undef BRUSH_FIXED
2598 }
2599
2600 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 268, 4)) {
2601 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2602 LISTBASE_FOREACH (bConstraint *, con, &ob->constraints) {
2603 if (con->type == CONSTRAINT_TYPE_SHRINKWRAP) {
2604 bShrinkwrapConstraint *data = static_cast<bShrinkwrapConstraint *>(con->data);
2605 if (data->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS) {
2606 data->projAxis = OB_POSX;
2607 }
2608 else if (data->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS) {
2609 data->projAxis = OB_POSY;
2610 }
2611 else {
2612 data->projAxis = OB_POSZ;
2613 }
2614 data->projAxisSpace = CONSTRAINT_SPACE_LOCAL;
2615 }
2616 }
2617 }
2618
2619 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2620 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
2621 if (md->type == eModifierType_Fluid) {
2623 if ((fmd->type & MOD_FLUID_TYPE_FLOW) && fmd->flow) {
2624 if (!fmd->flow->particle_size) {
2625 fmd->flow->particle_size = 1.0f;
2626 }
2627 }
2628 }
2629 }
2630 }
2631
2632 /*
2633 * FIX some files have a zoom level of 0, and was checked during the drawing of the node space
2634 *
2635 * We moved this check to the do versions to be sure the value makes any sense.
2636 */
2637 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2638 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2639 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
2640 if (sl->spacetype == SPACE_NODE) {
2641 SpaceNode *snode = (SpaceNode *)sl;
2642 if (snode->zoom < 0.02f) {
2643 snode->zoom = 1.0;
2644 }
2645 }
2646 }
2647 }
2648 }
2649 }
2650
2651 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 268, 5)) {
2652 /* add missing (+) expander in node editor */
2653 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2654 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2655 if (area->spacetype == SPACE_NODE) {
2657
2658 if (region) {
2659 continue;
2660 }
2661
2662 /* add subdiv level; after header */
2664
2665 /* is error! */
2666 if (region == nullptr) {
2667 continue;
2668 }
2669
2670 ARegion *arnew = BKE_area_region_new();
2671
2672 BLI_insertlinkafter(&area->regionbase, region, arnew);
2673 arnew->regiontype = RGN_TYPE_TOOLS;
2674 arnew->alignment = RGN_ALIGN_LEFT;
2675
2676 arnew->flag = RGN_FLAG_HIDDEN;
2677 }
2678 }
2679 }
2680 }
2681
2682 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 269, 1)) {
2683 /* Removal of Cycles SSS Compatible falloff */
2684 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2685 if (ntree->type == NTREE_SHADER) {
2686 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2687 if (node->type_legacy == SH_NODE_SUBSURFACE_SCATTERING) {
2688 if (node->custom1 == SHD_SUBSURFACE_COMPATIBLE) {
2689 node->custom1 = SHD_SUBSURFACE_CUBIC;
2690 }
2691 }
2692 }
2693 }
2694 }
2696 }
2697
2698 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 269, 2)) {
2699 /* Initialize CDL settings for Color Balance nodes */
2700 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2701 if (ntree->type == NTREE_COMPOSIT) {
2702 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2703 if (node->type_legacy == CMP_NODE_COLORBALANCE) {
2704 NodeColorBalance *n = static_cast<NodeColorBalance *>(node->storage);
2705 if (node->custom1 == 0) {
2706 /* LGG mode stays the same, just init CDL settings */
2708 }
2709 else if (node->custom1 == 1) {
2710 /* CDL previously used same variables as LGG, copy them over
2711 * and then sync LGG for comparable results in both modes.
2712 */
2713 copy_v3_v3(n->offset, n->lift);
2714 copy_v3_v3(n->power, n->gamma);
2715 copy_v3_v3(n->slope, n->gain);
2717 }
2718 }
2719 }
2720 }
2721 }
2723 }
2724
2725 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 269, 3)) {
2726 /* Update files using invalid (outdated) outlinevis Outliner values. */
2727 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2728 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2729 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
2730 if (sl->spacetype == SPACE_OUTLINER) {
2731 SpaceOutliner *space_outliner = (SpaceOutliner *)sl;
2732
2733 if (!ELEM(
2735 {
2736 space_outliner->outlinevis = SO_SCENES;
2737 }
2738 }
2739 }
2740 }
2741 }
2742
2743 if (!DNA_struct_member_exists(fd->filesdna, "MovieTrackingTrack", "float", "weight")) {
2744 LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) {
2745 const MovieTracking *tracking = &clip->tracking;
2746 LISTBASE_FOREACH (MovieTrackingObject *, tracking_object, &tracking->objects) {
2747 const ListBase *tracksbase = (tracking_object->flag & TRACKING_OBJECT_CAMERA) ?
2748 &tracking->tracks_legacy :
2749 &tracking_object->tracks;
2750 LISTBASE_FOREACH (MovieTrackingTrack *, track, tracksbase) {
2751 track->weight = 1.0f;
2752 }
2753 }
2754 }
2755 }
2756
2757 if (!DNA_struct_member_exists(fd->filesdna, "TriangulateModifierData", "int", "quad_method")) {
2758 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2759 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
2760 if (md->type == eModifierType_Triangulate) {
2762 if (tmd->flag & MOD_TRIANGULATE_BEAUTY) {
2765 }
2766 else {
2769 }
2770 }
2771 }
2772 }
2773 }
2774
2775 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2776 /* this can now be turned off */
2777 ToolSettings *ts = scene->toolsettings;
2778 if (ts->sculpt) {
2780 }
2781
2782 /* 'Increment' mode disabled for nodes, use true grid snapping instead */
2783 if (scene->toolsettings->snap_node_mode == 0) { /* SCE_SNAP_TO_INCREMENT */
2784 scene->toolsettings->snap_node_mode = 8; /* SCE_SNAP_TO_GRID */
2785 }
2786
2787 /* Update for removed "sound-only" option in FFMPEG export settings. */
2788 if (scene->r.ffcodecdata.type >= FFMPEG_INVALID) {
2789 scene->r.ffcodecdata.type = FFMPEG_AVI;
2790 }
2791 }
2792 }
2793
2794 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 269, 4)) {
2795 /* Internal degrees to radians conversions... */
2796 {
2797 LISTBASE_FOREACH (Light *, la, &bmain->lights) {
2798 la->spotsize = DEG2RADF(la->spotsize);
2799 }
2800
2801 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2802 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
2803 if (md->type == eModifierType_EdgeSplit) {
2805 emd->split_angle = DEG2RADF(emd->split_angle);
2806 }
2807 else if (md->type == eModifierType_Bevel) {
2809 bmd->bevel_angle = DEG2RADF(bmd->bevel_angle);
2810 }
2811 }
2812 }
2813
2814 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2815 if (scene->ed) {
2816 blender::seq::for_each_callback(&scene->ed->seqbase, strip_set_wipe_angle_cb, nullptr);
2817 }
2818 }
2819
2820 FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
2821 if (ntree->type == NTREE_COMPOSIT) {
2822 LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
2823 if (node->type_legacy == CMP_NODE_BOKEHIMAGE) {
2824 NodeBokehImage *n = static_cast<NodeBokehImage *>(node->storage);
2825 n->angle = DEG2RADF(n->angle);
2826 }
2827 if (node->type_legacy == CMP_NODE_MASK_BOX) {
2828 NodeBoxMask *n = static_cast<NodeBoxMask *>(node->storage);
2829 n->rotation = DEG2RADF(n->rotation);
2830 }
2831 if (node->type_legacy == CMP_NODE_MASK_ELLIPSE) {
2832 NodeEllipseMask *n = static_cast<NodeEllipseMask *>(node->storage);
2833 n->rotation = DEG2RADF(n->rotation);
2834 }
2835 }
2836 }
2837 }
2839 }
2840
2841 if (!DNA_struct_member_exists(
2842 fd->filesdna, "MovieTrackingPlaneTrack", "float", "image_opacity"))
2843 {
2844 LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) {
2846 MovieTrackingPlaneTrack *, plane_track, &clip->tracking.plane_tracks_legacy)
2847 {
2848 plane_track->image_opacity = 1.0f;
2849 }
2850 }
2851 }
2852 }
2853
2854 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 269, 7)) {
2855 LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
2856 Sculpt *sd = scene->toolsettings->sculpt;
2857
2858 if (sd) {
2859 enum {
2860 SCULPT_SYMM_X = (1 << 0),
2861 SCULPT_SYMM_Y = (1 << 1),
2862 SCULPT_SYMM_Z = (1 << 2),
2863 SCULPT_SYMMETRY_FEATHER = (1 << 6),
2864 };
2865 int symmetry_flags = sd->flags & 7;
2866
2867 if (symmetry_flags & SCULPT_SYMM_X) {
2869 }
2870 if (symmetry_flags & SCULPT_SYMM_Y) {
2872 }
2873 if (symmetry_flags & SCULPT_SYMM_Z) {
2875 }
2876 if (symmetry_flags & SCULPT_SYMMETRY_FEATHER) {
2878 }
2879 }
2880 }
2881 }
2882
2883 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 269, 8)) {
2884 LISTBASE_FOREACH (Curve *, cu, &bmain->curves) {
2885 if (cu->str) {
2886 cu->len_char32 = BLI_strlen_utf8(cu->str);
2887 }
2888 }
2889 }
2890
2891 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 269, 9)) {
2892 LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
2893 LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
2894 if (md->type == eModifierType_Build) {
2896 if (bmd->randomize) {
2898 }
2899 }
2900 }
2901 }
2902 }
2903
2904 if (!MAIN_VERSION_FILE_ATLEAST(bmain, 269, 11)) {
2905 LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
2906 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
2907 LISTBASE_FOREACH (SpaceLink *, space_link, &area->spacedata) {
2908 if (space_link->spacetype == SPACE_IMAGE) {
2909 ListBase *lb;
2910
2911 if (space_link == area->spacedata.first) {
2912 lb = &area->regionbase;
2913 }
2914 else {
2915 lb = &space_link->regionbase;
2916 }
2917
2918 LISTBASE_FOREACH (ARegion *, region, lb) {
2919 if (region->regiontype == RGN_TYPE_PREVIEW) {
2920 region->regiontype = RGN_TYPE_TOOLS;
2921 region->alignment = RGN_ALIGN_LEFT;
2922 }
2923 else if (region->regiontype == RGN_TYPE_UI) {
2924 region->alignment = RGN_ALIGN_RIGHT;
2925 }
2926 }
2927 }
2928 }
2929 }
2930 }
2931 }
2932}
2933
void animviz_settings_init(struct bAnimVizSettings *avs)
CustomData interface, see also DNA_customdata_types.h.
void CustomData_free_layers(CustomData *data, eCustomDataType type)
void CustomData_update_typemap(CustomData *data)
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:873
void BKE_image_alpha_mode_from_extension(Image *image)
#define MAIN_VERSION_FILE_ATLEAST(main, ver, subver)
Definition BKE_main.hh:634
#define MAIN_VERSION_FILE_OLDER(main, ver, subver)
Definition BKE_main.hh:638
void BKE_mesh_do_versions_cd_flag_init(Mesh *mesh)
#define NODE_REROUTE
Definition BKE_node.hh:798
#define NODE_GROUP_OUTPUT
Definition BKE_node.hh:800
#define FOREACH_NODETREE_END
Definition BKE_node.hh:866
#define NODE_GROUP
Definition BKE_node.hh:796
#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id)
Definition BKE_node.hh:856
#define NODE_FRAME
Definition BKE_node.hh:797
#define NODE_GROUP_INPUT
Definition BKE_node.hh:799
#define SH_NODE_TEX_NOISE
#define SH_NODE_MIX_SHADER
#define CMP_NODE_PREMULKEY
#define CMP_NODE_VALTORGB
#define CMP_NODE_MASK
#define CMP_NODE_SCALE
#define SH_NODE_HOLDOUT
#define SH_NODE_MIX_RGB_LEGACY
#define TEX_NODE_COORD
#define SH_NODE_TEX_GRADIENT
#define SH_NODE_COMBRGB_LEGACY
#define TEX_NODE_DISTANCE
#define SH_NODE_SQUEEZE
#define CMP_NODE_COMPOSITE
#define CMP_NODE_MIX_RGB
#define CMP_NODE_VECBLUR
#define CMP_NODE_MAP_RANGE
#define CMP_NODE_SEPHSVA_LEGACY
#define CMP_NODE_TIME
#define SH_NODE_HUE_SAT
#define SH_NODE_INVERT
#define CMP_NODE_COLOR_SPILL
#define SH_NODE_TEX_MAGIC
#define SH_NODE_OUTPUT_WORLD
#define SH_NODE_NORMAL
#define SH_NODE_BRIGHTCONTRAST
#define CMP_NODE_DESPECKLE
#define CMP_NODE_VIEWER
#define CMP_NODE_LUMA_MATTE
#define SH_NODE_TEX_WAVE
#define CMP_NODE_KEYINGSCREEN
#define CMP_NODE_MASK_ELLIPSE
#define CMP_NODE_DISPLACE
#define SH_NODE_TEX_IMAGE
#define CMP_NODE_COMBYCCA_LEGACY
#define CMP_NODE_RGBTOBW
#define SH_NODE_EMISSION
#define CMP_NODE_SEPRGBA_LEGACY
#define CMP_NODE_BILATERALBLUR
#define CMP_NODE_MAP_VALUE
#define CMP_NODE_TRANSLATE
#define TEX_NODE_ROTATE
#define CMP_NODE_MOVIEDISTORTION
#define CMP_NODE_TONEMAP
#define SH_NODE_ADD_SHADER
#define SH_NODE_LAYER_WEIGHT
#define SH_NODE_SUBSURFACE_SCATTERING
#define CMP_NODE_INPAINT
#define CMP_NODE_COLORBALANCE
#define TEX_NODE_DECOMPOSE_LEGACY
#define CMP_NODE_HUE_SAT
#define SH_NODE_FRESNEL
#define CMP_NODE_BOKEHIMAGE
#define SH_NODE_TEX_BRICK
#define SH_NODE_SEPRGB_LEGACY
#define CMP_NODE_COMBYUVA_LEGACY
#define SH_NODE_TEX_COORD
#define CMP_NODE_ROTATE
#define SH_NODE_BUMP
#define TEX_NODE_BRICKS
#define CMP_NODE_FILTER
#define CMP_NODE_DIFF_MATTE
#define CMP_NODE_GAMMA
#define SH_NODE_VECTOR_MATH
#define SH_NODE_TEX_ENVIRONMENT
#define SH_NODE_NORMAL_MAP
#define SH_NODE_VALUE
#define SH_NODE_CURVE_VEC
#define CMP_NODE_ALPHAOVER
#define CMP_NODE_TEXTURE
#define TEX_NODE_SCALE
#define TEX_NODE_TRANSLATE
#define CMP_NODE_HUECORRECT
#define TEX_NODE_AT
#define CMP_NODE_SEPYUVA_LEGACY
#define TEX_NODE_VALTONOR
#define SH_NODE_MATH
#define CMP_NODE_COMBHSVA_LEGACY
#define CMP_NODE_CROP
#define TEX_NODE_TEXTURE
#define SH_NODE_TANGENT
#define CMP_NODE_CHROMA_MATTE
#define CMP_NODE_GLARE
#define SH_NODE_BSDF_TRANSPARENT
#define CMP_NODE_MOVIECLIP
#define TEX_NODE_INVERT
#define CMP_NODE_TRANSFORM
#define CMP_NODE_DILATEERODE
#define SH_NODE_BSDF_DIFFUSE
#define SH_NODE_GAMMA
#define SH_NODE_HAIR_INFO
#define SH_NODE_AMBIENT_OCCLUSION
#define CMP_NODE_ID_MASK
#define TEX_NODE_CHECKER
#define CMP_NODE_BOKEHBLUR
#define TEX_NODE_COMPOSE_LEGACY
#define CMP_NODE_LENSDIST
#define TEX_NODE_RGBTOBW
#define CMP_NODE_NORMALIZE
#define CMP_NODE_VALUE
#define CMP_NODE_ZCOMBINE
#define CMP_NODE_MATH
#define CMP_NODE_MAP_UV
#define SH_NODE_TEX_SKY
#define CMP_NODE_TRACKPOS
#define SH_NODE_OUTPUT_MATERIAL
#define TEX_NODE_IMAGE
#define CMP_NODE_OUTPUT_FILE
#define CMP_NODE_COLORCORRECTION
#define SH_NODE_BSDF_TRANSLUCENT
#define CMP_NODE_SETALPHA
#define SH_NODE_BACKGROUND
#define SH_NODE_BSDF_RAY_PORTAL
#define CMP_NODE_CURVE_RGB
#define CMP_NODE_DOUBLEEDGEMASK
#define SH_NODE_TEX_CHECKER
#define SH_NODE_TEX_VORONOI
#define SH_NODE_CAMERA
#define CMP_NODE_STABILIZE2D
#define SH_NODE_OBJECT_INFO
#define SH_NODE_TEX_MUSGRAVE_DEPRECATED
#define CMP_NODE_PIXELATE
#define SH_NODE_RGB
#define SH_NODE_MAPPING
#define SH_NODE_VALTORGB
#define CMP_NODE_SWITCH
#define SH_NODE_CURVE_RGB
#define CMP_NODE_COMBRGBA_LEGACY
#define CMP_NODE_RGB
#define CMP_NODE_MASK_BOX
#define CMP_NODE_SPLITVIEWER__DEPRECATED
#define TEX_NODE_OUTPUT
#define CMP_NODE_DEFOCUS
#define TEX_NODE_CURVE_TIME
#define CMP_NODE_KEYING
#define TEX_NODE_VIEWER
#define SH_NODE_LIGHT_FALLOFF
#define SH_NODE_BSDF_GLASS
#define CMP_NODE_R_LAYERS
#define SH_NODE_NEW_GEOMETRY
#define CMP_NODE_CURVE_VEC
#define CMP_NODE_SEPYCCA_LEGACY
#define CMP_NODE_INVERT
#define SH_NODE_PARTICLE_INFO
#define TEX_NODE_MATH
#define CMP_NODE_COLOR_MATTE
#define CMP_NODE_DIST_MATTE
#define CMP_NODE_OUTPUT_MULTI_FILE__DEPRECATED
#define SH_NODE_BSDF_REFRACTION
#define CMP_NODE_IMAGE
#define TEX_NODE_PROC
#define CMP_NODE_NORMAL
#define CMP_NODE_DBLUR
#define CMP_NODE_VIEW_LEVELS
#define SH_NODE_OUTPUT_LIGHT
#define TEX_NODE_HUE_SAT
#define CMP_NODE_BLUR
#define TEX_NODE_MIX_RGB
#define SH_NODE_RGBTOBW
#define TEX_NODE_VALTORGB
#define SH_NODE_SCRIPT
#define CMP_NODE_BRIGHTCONTRAST
#define CMP_NODE_FLIP
#define TEX_NODE_CURVE_RGB
#define CMP_NODE_CHANNEL_MATTE
#define SH_NODE_ATTRIBUTE
#define SH_NODE_LIGHT_PATH
void BKE_ntree_update_tag_node_new(bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_socket_type(bNodeTree *ntree, bNodeSocket *socket)
void BKE_ntree_update_tag_socket_new(bNodeTree *ntree, bNodeSocket *socket)
void BKE_scene_disable_color_management(Scene *scene)
Definition scene.cc:2876
ARegion * BKE_area_region_new()
Definition screen.cc:381
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
Definition screen.cc:840
int txt_extended_ascii_as_utf8(char **str)
Definition text.cc:293
void BKE_texture_mtex_default(struct MTex *mtex)
Definition texture.cc:385
struct MovieTrackingObject * BKE_tracking_object_add(struct MovieTracking *tracking, const char *name)
Definition tracking.cc:1896
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:534
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:111
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
Definition listbase.cc:332
MINLINE int max_iii(int a, int b, int c)
#define DEG2RADF(_deg)
void unit_m4(float m[4][4])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE bool is_zero_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_v3(float r[3], const float a[3])
void copy_vn_fl(float *array_tar, int size, float val)
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
#define FILE_MAXFILE
#define FILE_MAX
void BLI_path_split_dir_file(const char *filepath, char *dir, size_t dir_maxncpy, char *file, size_t file_maxncpy) ATTR_NONNULL(1
#define FILE_MAXDIR
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:599
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:688
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
size_t BLI_strlen_utf8(const char *strc) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
#define STRNCPY_UTF8(dst, src)
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
#define POINTER_AS_INT(i)
#define ELEM(...)
external readfile function prototypes.
@ SCULPT_BRUSH_TYPE_ROTATE
@ BRUSH_OVERLAY_CURSOR
@ BRUSH_OVERLAY_PRIMARY
#define DEFAULT_SENSOR_HEIGHT
@ CAM_PANO
#define DEFAULT_SENSOR_WIDTH
@ CAM_PANORAMA
@ CONSTRAINT_TYPE_OBJECTSOLVER
@ CONSTRAINT_TYPE_SHRINKWRAP
@ CONSTRAINT_SPACE_LOCAL
@ CU_FRONT
@ CU_BACK
@ CD_PROP_BYTE_COLOR
@ MOD_DPAINT_USE_DRYING
@ SM_HRES_NEAREST
@ SM_HRES_LINEAR
@ FREESTYLE_CONTROL_EDITOR_MODE
@ FREESTYLE_ALGO_CULLED_ADAPTIVE_CUMULATIVE
@ FREESTYLE_ALGO_CULLED_ADAPTIVE_TRADITIONAL
@ FREESTYLE_CULLING
blenloader genfile private function prototypes
@ IMA_SRC_VIEWER
@ IMA_ALPHA_STRAIGHT
@ IMA_VIEW_AS_RENDER
@ LS_THICKNESS_CENTER
@ LS_CHAINING_PLAIN
@ LS_PANEL_STROKES
@ LS_PANEL_MISC
@ MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS
@ MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS
@ MOD_TRIANGULATE_NGON_BEAUTY
@ MOD_TRIANGULATE_NGON_EARCLIP
@ MOD_BUILD_FLAG_RANDOMIZE
@ eModifierType_Fluidsim
@ eModifierType_Lattice
@ eModifierType_Cloth
@ eModifierType_Fluid
@ eModifierType_EdgeSplit
@ eModifierType_Bevel
@ eModifierType_DynamicPaint
@ eModifierType_Build
@ eModifierType_Triangulate
@ MOD_TRIANGULATE_QUAD_FIXED
@ MOD_TRIANGULATE_QUAD_BEAUTY
@ MOD_FLUID_TYPE_DOMAIN
@ MOD_FLUID_TYPE_FLOW
@ CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT
@ NTREE_TEXTURE
@ NTREE_SHADER
@ NTREE_COMPOSIT
eNodeSocketInOut
@ SOCK_OUT
@ SOCK_IN
@ NODE_OPTIONS
@ NODE_INIT
@ NODE_PREVIEW
@ SOCK_IS_LINKED
@ SOCK_COLLAPSED
eNodeSocketDatatype
@ SOCK_INT
@ SOCK_VECTOR
@ SOCK_BOOLEAN
@ SOCK_SHADER
@ SOCK_FLOAT
@ SOCK_STRING
@ SOCK_RGBA
@ OB_MODE_TEXTURE_PAINT
Object is a sort of wrapper for general info.
@ OB_PLAINAXES
@ OB_POSX
@ OB_NEGZ
@ OB_POSY
@ OB_POSZ
@ PART_ROTATIONS
@ PART_DRAW_NO_SCALE_OB
@ PART_DRAW_ROTATE_OB
@ PART_DRAW_GR
@ PART_DRAW_OB
@ PART_ROT_VEL
@ UNIFIED_PAINT_WEIGHT
@ PAINT_SYMM_Y
@ PAINT_SYMMETRY_FEATHER
@ PAINT_SYMM_X
@ PAINT_SYMM_Z
@ R_IMF_JP2_FLAG_CINE_48
@ R_IMF_JP2_FLAG_CINE_PRESET
@ R_IMF_JP2_FLAG_YCC
@ R_COLOR_MANAGEMENT
@ PROP_SMOOTH
@ SCULPT_DYNTOPO_SUBDIVIDE
@ R_IMF_FLAG_PREVIEW_JPG
@ R_IMF_IMTYPE_TIFF
@ R_IMF_IMTYPE_IRIZ
@ R_IMF_IMTYPE_DPX
@ R_IMF_IMTYPE_JP2
@ R_IMF_IMTYPE_OPENEXR
@ R_IMF_IMTYPE_MULTILAYER
@ R_IMF_IMTYPE_CINEON
@ R_LINE_THICKNESS_ABSOLUTE
@ R_IMF_CHAN_DEPTH_8
@ R_IMF_CHAN_DEPTH_16
@ R_IMF_CHAN_DEPTH_12
@ R_IMF_CHAN_DEPTH_32
@ UVCALC_UNWRAP_METHOD_ANGLE
@ R_IMF_CINEON_FLAG_LOG
@ RGN_TYPE_UI
@ RGN_TYPE_PREVIEW
@ RGN_TYPE_HEADER
@ RGN_TYPE_TOOLS
@ RGN_FLAG_HIDDEN
@ RGN_ALIGN_LEFT
@ RGN_ALIGN_RIGHT
@ RGN_ALIGN_NONE
@ STRIP_TYPE_WIPE
@ seqModifierType_ColorBalance
@ SEQ_ALPHA_STRAIGHT
@ SI_SHOW_GPENCIL
@ SNODE_SHOW_GPENCIL
@ SPACE_CLIP
@ SPACE_OUTLINER
@ SPACE_NODE
@ SPACE_SEQ
@ SPACE_IMAGE
@ SPACE_VIEW3D
@ SC_VIEW_CLIP
@ SEQ_PREVIEW_SHOW_GPENCIL
@ SC_SHOW_ANNOTATION
@ SO_SEQUENCE
@ SO_DATA_API
@ SO_LIBRARIES
@ SO_SCENES
@ TXT_ISEXT
@ MTEX_MAP_MODE_TILED
@ TEX_BLEND
@ TEX_MARBLE
@ TEX_NOISE
@ TEX_IMAGE
@ TEX_WOOD
@ TEX_CLOUDS
@ TEX_DISTNOISE
@ TEX_VORONOI
@ TEX_STUCCI
@ TEX_MAGIC
@ TEX_MUSGRAVE
@ TEX_USEALPHA
@ TRACK_MOTION_MODEL_TRANSLATION
@ TRACKING_OBJECT_CAMERA
@ V2D_IS_INIT
@ V3D_SHOW_ANNOTATION
@ V3D_SHOW_RECONSTRUCTION
@ V3D_AROUND_CENTER_MEDIAN
@ IMB_PROXY_25
Read Guarded memory(de)allocation.
@ FFMPEG_INVALID
Definition MOV_enums.hh:23
@ FFMPEG_AVI
Definition MOV_enums.hh:15
@ IMB_TC_RECORD_RUN_NO_GAPS
Definition MOV_enums.hh:61
@ IMB_TC_RECORD_RUN
Definition MOV_enums.hh:54
@ PROP_NONE
Definition RNA_types.hh:221
BMesh const char void * data
#define offsetof(t, d)
#define input
#define output
#define ID_IS_LINKED(_id)
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void * MEM_dupallocN(const void *vmemh)
Definition mallocn.cc:143
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
static ulong * next
void node_remove_socket(bNodeTree &ntree, bNode &node, bNodeSocket &sock)
Definition node.cc:3575
void node_unique_id(bNodeTree &ntree, bNode &node)
Definition node.cc:3770
void node_remove_link(bNodeTree *ntree, bNodeLink &link)
Definition node.cc:4124
std::optional< StringRefNull > node_static_socket_type(int type, int subtype, std::optional< int > dimensions=std::nullopt)
Definition node.cc:3167
void node_unique_name(bNodeTree &ntree, bNode &node)
Definition node.cc:3764
void for_each_callback(ListBase *seqbase, ForEachFunc callback, void *user_data)
Definition iterator.cc:59
StripModifierData * modifier_new(Strip *strip, const char *name, int type)
void alpha_mode_from_file_extension(Strip *strip)
bNodeSocket * node_group_output_find_socket(bNode *node, const StringRef identifier)
bNodeSocket * node_group_input_find_socket(bNode *node, const StringRef identifier)
void ntreeCompositOutputFileUniqueLayer(ListBase *list, bNodeSocket *sock, const char defname[], char delim)
bNodeSocket * ntreeCompositOutputFileAddSocket(bNodeTree *ntree, bNode *node, const char *name, const ImageFormatData *im_format)
void ntreeCompositOutputFileUniquePath(ListBase *list, bNodeSocket *sock, const char defname[], char delim)
void * blo_do_versions_newlibadr(FileData *fd, ID *self_id, const bool is_linked_only, const void *adr)
Definition readfile.cc:1534
void blo_do_versions_key_uidgen(Key *key)
Definition readfile.cc:2405
struct ClothSimSettings * sim_parms
StripColorBalance color_balance
CustomDataLayer * layers
struct DynamicPaintCanvasSettings * canvas
struct DynamicPaintSurface * next
SDNA * filesdna
Definition readfile.hh:103
struct FluidDomainSettings * domain
struct FluidFlowSettings * flow
struct FluidsimSettings * fss
Definition DNA_ID.h:404
char alpha_mode
void * last
void * first
unsigned char b
unsigned char r
ListBase brushes
Definition BKE_main.hh:271
ListBase scenes
Definition BKE_main.hh:245
short subversionfile
Definition BKE_main.hh:156
ListBase textures
Definition BKE_main.hh:252
ListBase texts
Definition BKE_main.hh:263
ListBase meshes
Definition BKE_main.hh:248
ListBase movieclips
Definition BKE_main.hh:280
ListBase lights
Definition BKE_main.hh:255
ListBase nodetrees
Definition BKE_main.hh:270
ListBase particles
Definition BKE_main.hh:272
ListBase materials
Definition BKE_main.hh:251
ListBase linestyles
Definition BKE_main.hh:282
ListBase shapekeys
Definition BKE_main.hh:259
ListBase cameras
Definition BKE_main.hh:256
ListBase curves
Definition BKE_main.hh:249
ListBase worlds
Definition BKE_main.hh:260
ListBase screens
Definition BKE_main.hh:261
short versionfile
Definition BKE_main.hh:156
ListBase images
Definition BKE_main.hh:253
ListBase objects
Definition BKE_main.hh:247
int corners_num
CustomData corner_data
struct MovieTrackingObject * next
MovieTrackingMarker * markers
struct MovieTrackingTrack * next
MovieTrackingSettings settings
struct ImageFormatData im_format
ImageFormatData format
int symmetry_flags
struct ImageFormatData im_format
struct RenderData r
struct MovieClipScopes scopes
char tree_idname[64]
struct ID * from
ListBase treepath
struct bNodeTree * edittree
struct ID * id
struct bNodeTree * nodetree
StripData * data
void * effectdata
struct UnifiedPaintSettings unified_paint_settings
float bundle_size
rctf render_border
char bundle_drawtype
unsigned int value
IDProperty * prop
bNodeSocketRuntimeHandle * runtime
struct bNodeLink * link
void * default_value
char identifier[64]
char idname[64]
bNodeInstanceKey parent_key
char idname[64]
bNodeTreeTypeHandle * typeinfo
ListBase nodes
ListBase links
ListBase inputs
float locx_legacy
int16_t type_legacy
bNodeRuntimeHandle * runtime
float locy_legacy
void * storage
char idname[64]
ListBase outputs
float xmax
float xmin
float ymax
float ymin
i
Definition text_draw.cc:230
static bool strip_set_alpha_mode_cb(Strip *strip, void *)
static bool strip_colorbalance_update_cb(Strip *strip, void *)
#define BRUSH_FIXED
void blo_do_versions_260(FileData *fd, Library *, Main *bmain)
static void do_versions_nodetree_multi_file_output_path_2_63_1(bNodeTree *ntree)
static void do_versions_nodetree_file_output_layers_2_64_5(bNodeTree *ntree)
static void do_versions_nodetree_convert_angle(bNodeTree *ntree)
static bNode * version_add_group_in_out_node(bNodeTree *ntree, const int type)
static blender::StringRefNull node_socket_get_static_idname(bNodeSocket *sock)
static void do_versions_affine_tracker_track(MovieTrackingTrack *track)
static void color_balance_node_lgg_from_cdl(bNode *node)
#define CLANG_FORMAT_NOP_WORKAROUND
void do_versions_after_linking_260(Main *)
static void do_versions_image_settings_2_60(Scene *sce)
static void do_versions_nodetree_socket_use_flags_2_62(bNodeTree *ntree)
static const char * node_get_static_idname(int type, int treetype)
static void do_versions_mesh_mloopcol_swap_2_62_1(Mesh *mesh)
static void color_balance_node_cdl_from_lgg(bNode *node)
static void do_versions_nodetree_image_layer_2_64_5(bNodeTree *ntree)
static void do_versions_nodetree_image_default_alpha_output(bNodeTree *ntree)
static bool strip_set_wipe_angle_cb(Strip *strip, void *)
static void do_versions_nodetree_frame_2_64_6(bNodeTree *ntree)
static void do_versions_nodetree_customnodes(bNodeTree *ntree, int)
static bNodeSocket * version_make_socket_stub(const char *idname, eNodeSocketDatatype type, eNodeSocketInOut in_out, const char *identifier, const char *name, const void *default_value, const IDProperty *prop)
static void do_versions_nodetree_multi_file_output_format_2_62_1(Scene *sce, bNodeTree *ntree)
#define BRUSH_TEXTURE_OVERLAY