Commit: 762d93a26b973b61ef52e7326aa8f272ccbe7007 Author: Jacques Lucke Date: Tue Sep 29 12:12:09 2020 +0200 Branches: master https://developer.blender.org/rB762d93a26b973b61ef52e7326aa8f272ccbe7007
DNA: use better type for SDNA->structs The data layout remains exactly the same.. This change just gives all the elements in `SDNA->structs` names, making it more comfortable to work with the data. Reviewers: campbellbarton Differential Revision: https://developer.blender.org/D8926 =================================================================== M source/blender/blenloader/intern/readblenentry.c M source/blender/blenloader/intern/readfile.c M source/blender/blenloader/intern/writefile.c M source/blender/makesdna/DNA_sdna_types.h M source/blender/makesdna/intern/dna_genfile.c M source/blender/makesrna/intern/rna_define.c =================================================================== diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c index 888863dda06..7a527b82e9f 100644 --- a/source/blender/blenloader/intern/readblenentry.c +++ b/source/blender/blenloader/intern/readblenentry.c @@ -103,8 +103,8 @@ void BLO_blendhandle_print_sizes(BlendHandle *bh, void *fp) break; } - const short *sp = fd->filesdna->structs[bhead->SDNAnr]; - const char *name = fd->filesdna->types[sp[0]]; + const SDNA_Struct *struct_info = fd->filesdna->structs[bhead->SDNAnr]; + const char *name = fd->filesdna->types[struct_info->type]; char buf[4]; buf[0] = (bhead->code >> 24) & 0xFF; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 2b68c5ea203..19fab73b259 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2133,7 +2133,7 @@ static void switch_endian_structs(const struct SDNA *filesdna, BHead *bhead) char *data; data = (char *)(bhead + 1); - blocksize = filesdna->types_size[filesdna->structs[bhead->SDNAnr][0]]; + blocksize = filesdna->types_size[filesdna->structs[bhead->SDNAnr]->type]; nblocks = bhead->nr; while (nblocks--) { diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 336276bdd40..74a4ddfd8f3 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -539,7 +539,6 @@ static void writestruct_at_address_nr( WriteData *wd, int filecode, const int struct_nr, int nr, const void *adr, const void *data) { BHead bh; - const short *sp; BLI_assert(struct_nr > 0 && struct_nr < SDNA_TYPE_MAX); @@ -553,9 +552,9 @@ static void writestruct_at_address_nr( bh.nr = nr; bh.SDNAnr = struct_nr; - sp = wd->sdna->structs[bh.SDNAnr]; + const SDNA_Struct *struct_info = wd->sdna->structs[bh.SDNAnr]; - bh.len = nr * wd->sdna->types_size[sp[0]]; + bh.len = nr * wd->sdna->types_size[struct_info->type]; if (bh.len == 0) { return; diff --git a/source/blender/makesdna/DNA_sdna_types.h b/source/blender/makesdna/DNA_sdna_types.h index cfb65860b8e..3af12ae791f 100644 --- a/source/blender/makesdna/DNA_sdna_types.h +++ b/source/blender/makesdna/DNA_sdna_types.h @@ -24,6 +24,30 @@ struct MemArena; +# +# +typedef struct SDNA_StructMember { + /** This struct must not change, it's only a convenience view for raw data stored in SDNA. */ + + /** An index into SDNA->types. */ + short type; + /** An index into SDNA->names. */ + short name; +} SDNA_StructMember; + +# +# +typedef struct SDNA_Struct { + /** This struct must not change, it's only a convenience view for raw data stored in SDNA. */ + + /** An index into SDNA->types. */ + short type; + /** The amount of members in this struct. */ + short members_len; + /** "Flexible array member" that contains information about all members of this struct. */ + SDNA_StructMember members[]; +} SDNA_Struct; + # # typedef struct SDNA { @@ -51,14 +75,8 @@ typedef struct SDNA { /** Type lengths. */ short *types_size; - /** - * sp = structs[a] is the address of a struct definition - * sp[0] is struct type number, sp[1] amount of members - * - * (sp[2], sp[3]), (sp[4], sp[5]), .. are the member - * type and name numbers respectively. - */ - short **structs; + /** Information about structs and their members. */ + SDNA_Struct **structs; /** Number of struct types. */ int structs_len; diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c index 77f27223722..b140a847188 100644 --- a/source/blender/makesdna/intern/dna_genfile.c +++ b/source/blender/makesdna/intern/dna_genfile.c @@ -206,17 +206,15 @@ int DNA_elem_size_nr(const SDNA *sdna, short type, short name) static void printstruct(SDNA *sdna, short strnr) { /* is for debug */ - int b, nr; - short *sp; - - sp = sdna->structs[strnr]; - printf("struct %s\n", sdna->types[sp[0]]); - nr = sp[1]; - sp += 2; + SDNA_Struct *struct_info = sdna->structs[strnr]; + printf("struct %s\n", sdna->types[struct_info->type]); - for (b = 0; b < nr; b++, sp += 2) { - printf(" %s %s\n", sdna->types[sp[0]], sdna->names[sp[1]]); + for (int b = 0; b < struct_info->members_len; b++) { + SDNA_StructMember *struct_member = &struct_info->members[b]; + printf(" %s %s\n", + sdna->types[struct_member->type], + sdna->names[struct_member->name]); } } #endif @@ -228,7 +226,7 @@ static int dna_struct_find_nr_ex_impl( /* From SDNA struct. */ const char **types, const int UNUSED(types_len), - short **const structs, + SDNA_Struct **const structs, const int structs_len, #ifdef WITH_DNA_GHASH GHash *structs_map, @@ -238,8 +236,8 @@ static int dna_struct_find_nr_ex_impl( unsigned int *index_last) { if (*index_last < structs_len) { - const short *sp = structs[*index_last]; - if (STREQ(types[sp[0]], str)) { + const SDNA_Struct *struct_info = structs[*index_last]; + if (STREQ(types[struct_info->type], str)) { return *index_last; } } @@ -256,8 +254,8 @@ static int dna_struct_find_nr_ex_impl( #else { for (int index = 0; index < structs_len; index++) { - const short *sp = structs[index]; - if (STREQ(types[sp[0]], str)) { + const SDNA_Struct *struct_info = structs[index]; + if (STREQ(types[struct_info->type], str)) { *index_last = index; return index; } @@ -461,7 +459,7 @@ static bool init_structDNA(SDNA *sdna, bool do_endian_swap, const char **r_error } data++; - sdna->structs = MEM_callocN(sizeof(void *) * sdna->structs_len, "sdnastrcs"); + sdna->structs = MEM_callocN(sizeof(SDNA_Struct *) * sdna->structs_len, "sdnastrcs"); } else { *r_error_message = "STRC error in SDNA file"; @@ -470,32 +468,27 @@ static bool init_structDNA(SDNA *sdna, bool do_endian_swap, const char **r_error sp = (short *)data; for (int nr = 0; nr < sdna->structs_len; nr++) { - sdna->structs[nr] = sp; + SDNA_Struct *struct_info = (SDNA_Struct *)sp; + sdna->structs[nr] = struct_info; if (do_endian_swap) { - short a; + BLI_endian_switch_int16(&struct_info->type); + BLI_endian_switch_int16(&struct_info->members_len); - BLI_endian_switch_int16(&sp[0]); - BLI_endian_switch_int16(&sp[1]); - - a = sp[1]; - sp += 2; - while (a--) { - BLI_endian_switch_int16(&sp[0]); - BLI_endian_switch_int16(&sp[1]); - sp += 2; + for (short a = 0; a < struct_info->members_len; a++) { + SDNA_StructMember *member = &struct_info->members[a]; + BLI_endian_switch_int16(&member->type); + BLI_endian_switch_int16(&member->name); } } - else { - sp += 2 * sp[1] + 2; - } + sp += 2 + (sizeof(SDNA_StructMember) / sizeof(short)) * struct_info->members_len; } { /* second part of gravity problem, setting "gravity" type to void */ if (gravity_fix > -1) { for (int nr = 0; nr < sdna->structs_len; nr++) { - sp = sdna->structs[nr]; + sp = (short *)sdna->structs[nr]; if (STREQ(sdna->types[sp[0]], "ClothSimSettings")) { sp[10] = SDNA_TYPE_VOID; } @@ -509,8 +502,9 @@ static bool init_structDNA(SDNA *sdna, bool do_endian_swap, const char **r_error sdna->structs_map = BLI_ghash_str_new_ex("init_structDNA gh", sdna->structs_len); for (intptr_t nr = 0; nr < sdna->structs_len; nr++) { - sp = sdna->structs[nr]; - BLI_ghash_insert(sdna->structs_map, (void *)sdna->types[sp[0]], POINTER_FROM_INT(nr)); + SDNA_Struct *struct_info = sdna->structs[nr]; + BLI_ghash_insert( + sdna->structs_map, (void *)sdna->types[struct_info->type], POINTER_FROM_INT(nr)); } } #endif @@ -526,12 +520,12 @@ static bool init_structDNA(SDNA *sdna, bool do_endian_swap, const char **r_error } /* finally pointer_size: use struct ListBase to test it, never change the size of it! */ - sp = sdna->structs[nr]; + SDNA_Struct *struct_info = sdna->structs[nr]; /* weird; i have no memory of that... I think I used sizeof(void *) before... (ton) */ - sdna->pointer_size = sdna->types_size[sp[0]] / 2; + sdna->pointer_size = sdna->types_size[struct_info->type] / 2; - if (sp[1] != 2 || (sdna->pointer_size != 4 && sdna->pointer_size != 8)) { + if (struct_info->members_len != 2 || (sdna->pointer_size != 4 && sdna->pointer_size != 8)) { *r_error_message = "ListBase struct error! Needs it to calculate pointerize."; /* well, at least sizeof(ListBase) is error proof! (ton) */ return false; @@ -623,18 +617,16 @@ void DNA_sdna_current_free(void) static void recurs_test_compflags(const SDNA *sdna, char *compflags, int structnr) { /* check all structs, test if it's inside another struct */ - const short *sp = sdna->structs[structnr]; - const int typenr = sp[0]; + const int typenr = sdna->structs[structnr]->type; for (int a = 0; a < sdna->structs_len; a++) { - if ((a != structnr) && (compflags[a] == SDNA_CMP_EQUAL)) { - sp = sdna->structs[a]; - const int elems = sp[1]; - sp += 2; - for (int b = 0; b < elems; b++, sp += 2) { - if (sp[0] == typenr) { - const char *cp = sdna->names[sp[1]]; - if (!ispointer(cp)) { + if (a != structnr && compflags[a] == SDNA_CMP_EQUAL) { + SDNA_Struct *struct_info = sdna->structs[a]; + for (int b = 0; b < struct_info->members_len; b++) { + SDNA_StructMember *member = &struct_info->members[b]; + if (member->type == typenr) { + const char *member_name = sdna->names[member->name]; + if (!ispointer(member_name)) { compflags[a] = SDNA_CMP_NOT_EQUAL; recurs_test_compflags(sdna, compflags, a); } @@ -663,53 +655,53 @@ const char *DNA_struct_get_compareflags(const SDNA *oldsdna, const SDNA *newsdna unsigned int newsdna_index_last = 0; for (int a = 0; a < oldsdna->structs_len; a++) { - const short *sp_old = oldsdna->structs[a]; @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
