Fixes for 8vytes scalar types used in DNA (int64 and double)
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 21 Jun 2012 10:52:23 +0000 (10:52 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 21 Jun 2012 10:52:23 +0000 (10:52 +0000)
- makesdna wasn't checking whether such scalars are aligned to 8 bytes.
  Now it should be handled correct.
- Some scalars in Object structure weren't 8 bytes aligned, which lead
  to some incorrectly loaded files.

  Fixed by adding void *pad. It's a bit tricky part of patch, but can't
  see clearer way to make alignment correct

  Usually ints/chars were used for padding, but in this case there are
  some leading pointer properties before int64 properties and using
  pointer as a padding resolves alignment on both 32 and 64 bit
  platforms.

  Using pointers as padding weren't needed before, because all types
  were correctly aligned independent of whether pointers are 4 or 8
  bytes.

This fixes #31774: Empty offset Y parameter is resetting

source/blender/makesdna/DNA_object_types.h
source/blender/makesdna/intern/makesdna.c

index 83bfec3cc52dbba45937eeefcd2693d4d61d0ff9..2e774e4ea84587c45323e95e08af0193ee9908c2 100644 (file)
@@ -258,6 +258,7 @@ typedef struct Object {
        struct FluidsimSettings *fluidsimSettings; /* if fluidsim enabled, store additional settings */
 
        struct DerivedMesh *derivedDeform, *derivedFinal;
+       int *pad;
        uint64_t lastDataMask;   /* the custom data layer mask that was last used to calculate derivedDeform and derivedFinal */
        uint64_t customdata_mask; /* (extra) custom data layer mask to use for creating derivedmesh, set by depsgraph */
        unsigned int state;                     /* bit masks of game controllers that are active */
index b0f8f02ae9fa5a174d7b0cbdc7333d20a1f5ccb8..09cb22683a7b8ad59ab30c7cbbbc27387bb011e1 100644 (file)
@@ -798,7 +798,11 @@ static int calculate_structlens(int firststruct)
                                                        }
                                                }
                                                
-                                               /* 2-4 aligned/ */
+                                               /* 2-4-8 aligned/ */
+                                               if (type < firststruct && typelens[type] > 4 && (len % 8)) {
+                                                       printf("Align 8 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len % 8);
+                                                       dna_error = 1;
+                                               }
                                                if (typelens[type] > 3 && (len % 4) ) {
                                                        printf("Align 4 error in struct: %s %s (add %d padding bytes)\n", types[structtype], cp, len % 4);
                                                        dna_error = 1;