diff options
-rw-r--r-- | source/blender/makesdna/DNA_cloth_types.h | 6 | ||||
-rw-r--r-- | source/blender/makesdna/intern/dna_genfile.c | 23 | ||||
-rw-r--r-- | source/blender/makesdna/intern/makesdna.c | 6 |
3 files changed, 28 insertions, 7 deletions
diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h index 777c2ec8747..06ace29dbfe 100644 --- a/source/blender/makesdna/DNA_cloth_types.h +++ b/source/blender/makesdna/DNA_cloth_types.h @@ -47,10 +47,7 @@ typedef struct ClothSimSettings float mingoal; /* see SB */ float Cdis; /* Mechanical damping of springs. */ float Cvi; /* Viscous/fluid damping. */ - /* XXX the extra space here results in wrong DNA parsing, - * and reconstruct fails and gives corrupt settings when - * removing it because the old dna is wrong ... */ - float gravity [3]; /* Gravity/external force vector. */ + float gravity[3]; /* Gravity/external force vector. */ float dt; /* This is the duration of our time step, computed. */ float mass; /* The mass of the entire cloth. */ float structural; /* Structural spring stiffness. */ @@ -79,6 +76,7 @@ typedef struct ClothSimSettings short vgroup_struct; /* vertex group for scaling structural stiffness */ short presets; /* used for presets on GUI */ short reset; + int pad; struct EffectorWeights *effector_weights; } ClothSimSettings; diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c index cbc433ed722..89219b114da 100644 --- a/source/blender/makesdna/intern/dna_genfile.c +++ b/source/blender/makesdna/intern/dna_genfile.c @@ -297,7 +297,7 @@ int DNA_struct_find_nr(SDNA *sdna, const char *str) static void init_structDNA(SDNA *sdna, int do_endian_swap) /* in sdna->data the data, now we convert that to something understandable */ { - int *data, *verg; + int *data, *verg, gravity_fix= -1; intptr_t nr; short *sp; char str[8], *cp; @@ -330,6 +330,17 @@ static void init_structDNA(SDNA *sdna, int do_endian_swap) cp= (char *)data; while(nr<sdna->nr_names) { sdna->names[nr]= cp; + + /* "float gravity [3]" was parsed wrong giving both "gravity" and + "[3]" members. we rename "[3]", and later set the type of + "gravity" to "void" so the offsets work out correct */ + if(*cp == '[' && strcmp(cp, "[3]")==0) { + if(nr && strcmp(sdna->names[nr-1], "Cvi") == 0) { + sdna->names[nr]= "gravity[3]"; + gravity_fix= nr; + } + } + while( *cp) cp++; cp++; nr++; @@ -444,7 +455,7 @@ static void init_structDNA(SDNA *sdna, int do_endian_swap) nr++; } - + /* finally pointerlen: use struct ListBase to test it, never change the size of it! */ sp= findstruct_name(sdna, "ListBase"); /* weird; i have no memory of that... I think I used sizeof(void *) before... (ton) */ @@ -457,6 +468,14 @@ static void init_structDNA(SDNA *sdna, int do_endian_swap) /* well, at least sizeof(ListBase) is error proof! (ton) */ } + /* second part of gravity problem, setting "gravity" type to void */ + if(gravity_fix > -1) { + for(nr=0; nr<sdna->nr_structs; nr++) { + sp= sdna->structs[nr]; + if(strcmp(sdna->types[sp[0]], "ClothSimSettings") == 0) + sp[10]= 9; + } + } } } diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c index 4ccabc95a32..2d62b81e81b 100644 --- a/source/blender/makesdna/intern/makesdna.c +++ b/source/blender/makesdna/intern/makesdna.c @@ -699,7 +699,7 @@ static int calculate_structlens(int firststruct) for(b=0; b<structpoin[1]; b++, sp+=2) { type= sp[0]; cp= names[sp[1]]; - + namelen= (int) strlen(cp); /* is it a pointer or function pointer? */ if(cp[0]=='*' || cp[1]=='*') { @@ -729,6 +729,10 @@ static int calculate_structlens(int firststruct) len += sizeof(void *) * mul; alphalen += 8 * mul; + } else if(cp[0]=='[') { + /* parsing can cause names "var" and "[3]" to be found for "float var [3]" ... */ + printf("Parse error in struct, invalid member name: %s %s\n", types[structtype], cp); + dna_error = 1; } else if( typelens[type] ) { /* has the name an extra length? (array) */ mul= 1; |