diff options
Diffstat (limited to 'source/blender/makesdna/intern/dna_genfile.c')
-rw-r--r-- | source/blender/makesdna/intern/dna_genfile.c | 132 |
1 files changed, 116 insertions, 16 deletions
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c index 477acabf7a0..808bef68d2a 100644 --- a/source/blender/makesdna/intern/dna_genfile.c +++ b/source/blender/makesdna/intern/dna_genfile.c @@ -139,23 +139,39 @@ /* allowed duplicate code from makesdna.c */ /** - * parses the "[n]" on the end of an array name and returns the number of array elements n. + * parses the "[n1][n2]..." on the end of an array name and returns the number of array elements n1*n2*... */ int DNA_elem_array_size(const char *str) { - int a, mul = 1; - const char *cp = NULL; - - for (a = 0; str[a]; a++) { - if (str[a] == '[') { - cp = &(str[a + 1]); - } - else if (str[a] == ']' && cp) { - mul *= atoi(cp); + int result = 1; + int current = 0; + while (true) { + char c = *str++; + switch (c) { + case '\0': + return result; + case '[': + current = 0; + break; + case ']': + result *= current; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + current = current * 10 + (c - '0'); + break; + default: + break; } } - - return mul; } /* ************************* END MAKE DNA ********************** */ @@ -313,10 +329,52 @@ BLI_INLINE const char *pad_up_4(const char *ptr) } /** + * Temporary DNA doversion for files that were created with Blender 2.80 + * between October 2016, and November 2017 (>=280.0 and < 280.2). + * + * /note This would be way more efficient if we can get the version from SDNA + * So we could return true if version == 280 && subversion < 2. + * + * Returns true if we need to do the DNA renaming. + */ +static bool need_doversion_280(SDNA *sdna, int *data, const bool data_alloc) +{ + if (data_alloc == false) { + return false; + } + + bool active_layer = false, render_layers = false; + + const char *cp = (char *)data; + for (int nr = 0; nr < sdna->nr_names; nr++) { + if (strcmp(cp, "active_layer") == 0) { + active_layer = true; + if (active_layer && render_layers) { + return true; + } + } + else if (strcmp(cp, "render_layers") == 0) { + render_layers = true; + if (active_layer && render_layers) { + return true; + } + } + + while (*cp) cp++; + cp++; + } + + /* If someone adds only one of them to the DNA, don't! */ + BLI_assert(!(active_layer || render_layers)); + return false; +} + +/** * In sdna->data the data, now we convert that to something understandable */ static bool init_structDNA( SDNA *sdna, bool do_endian_swap, + bool data_alloc, const char **r_error_message) { int *data, *verg, gravity_fix = -1; @@ -362,6 +420,10 @@ static bool init_structDNA( return false; } + /* Temporary DNA doversion for files that were created with Blender 2.80 + * between 280.0 and 280.2. */ + const bool doversion_280 = need_doversion_280(sdna, data, data_alloc); + cp = (char *)data; for (int nr = 0; nr < sdna->nr_names; nr++) { sdna->names[nr] = cp; @@ -375,6 +437,28 @@ static bool init_structDNA( gravity_fix = nr; } } + else if (doversion_280) { + if (strcmp(cp, "*render_layer") == 0) { + /* WorkSpace. */ + sdna->names[nr] = "*view_layer"; + } + else if (strcmp(cp, "*scene_layer") == 0) { + /* ParticleEditSettings. */ + sdna->names[nr] = "*view_layer"; + } + else if (strcmp(cp, "render_layers") == 0) { + /* Scene. */ + sdna->names[nr] = "view_layers"; + } + else if (strcmp(cp, "active_layer") == 0) { + /* Scene. */ + sdna->names[nr] = "active_view_layer"; + } + else if (strcmp(cp, "*cur_render_layer") == 0) { + /* FileGlobal. */ + sdna->names[nr] = "*cur_view_layer"; + } + } while (*cp) cp++; cp++; @@ -408,9 +492,25 @@ static bool init_structDNA( /* this is a patch, to change struct names without a conflict with SDNA */ /* be careful to use it, in this case for a system-struct (opengl/X) */ - if (*cp == 'b') { - /* struct Screen was already used by X, 'bScreen' replaces the old IrisGL 'Screen' struct */ - if (strcmp("bScreen", cp) == 0) sdna->types[nr] = cp + 1; + /* struct Screen was already used by X, + * 'bScreen' replaces the old IrisGL 'Screen' struct */ + if (strcmp("bScreen", cp) == 0) { + sdna->types[nr] = cp + 1; + } + /* Groups renamed to collections in 2.8 */ + else if (strcmp("Collection", cp) == 0) { + sdna->types[nr] = "Group"; + } + else if (strcmp("CollectionObject", cp) == 0) { + sdna->types[nr] = "GroupObject"; + } + else if (doversion_280) { + if (strcmp(cp, "SceneLayer") == 0) { + sdna->types[nr] = "ViewLayer"; + } + else if (strcmp(cp, "SceneLayerEngineData") == 0) { + sdna->types[nr] = "ViewLayerEngineData"; + } } while (*cp) cp++; @@ -554,7 +654,7 @@ SDNA *DNA_sdna_from_data( sdna->data_alloc = data_alloc; - if (init_structDNA(sdna, do_endian_swap, &error_message)) { + if (init_structDNA(sdna, do_endian_swap, data_alloc, &error_message)) { return sdna; } else { |