Commit: 87b77a97b947a3d799fc5aa6ac7d2c5e5606109b Author: Campbell Barton Date: Tue Feb 8 11:50:15 2022 +1100 Branches: blender-v2.93-release https://developer.blender.org/rB87b77a97b947a3d799fc5aa6ac7d2c5e5606109b
Fix dna_genfile error converting signed int types to floating point Regression in 51befa4108128a7bacf7a201046cf7ede999833a caused negative values to overflow into a uint64_t. Resolve by casting to a signed int from originally signed types. This caused D14033 not to work properly. =================================================================== M source/blender/makesdna/intern/dna_genfile.c =================================================================== diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c index f7f3d8e0eb4..c4958f1374c 100644 --- a/source/blender/makesdna/intern/dna_genfile.c +++ b/source/blender/makesdna/intern/dna_genfile.c @@ -752,6 +752,9 @@ static void cast_primitive_type(const eSDNA_Type old_type, const int curlen = DNA_elem_type_size(new_type); double old_value_f = 0.0; + /* Intentionally overflow signed values into an unsigned type. + * Casting back to a signed value preserves the sign (when the new value is signed). + * It's also important to cast to `int64_t` when setting `old_value_f` from a signed value. */ uint64_t old_value_i = 0; for (int a = 0; a < array_len; a++) { @@ -771,7 +774,7 @@ static void cast_primitive_type(const eSDNA_Type old_type, case SDNA_TYPE_SHORT: { const short value = *((short *)old_data); old_value_i = value; - old_value_f = (double)old_value_i; + old_value_f = (double)(int64_t)old_value_i; break; } case SDNA_TYPE_USHORT: { @@ -783,7 +786,7 @@ static void cast_primitive_type(const eSDNA_Type old_type, case SDNA_TYPE_INT: { const int value = *((int *)old_data); old_value_i = value; - old_value_f = (double)old_value_i; + old_value_f = (double)(int64_t)old_value_i; break; } case SDNA_TYPE_FLOAT: { @@ -801,7 +804,7 @@ static void cast_primitive_type(const eSDNA_Type old_type, case SDNA_TYPE_INT64: { const int64_t value = *((int64_t *)old_data); old_value_i = (uint64_t)value; - old_value_f = (double)old_value_i; + old_value_f = (double)(int64_t)old_value_i; break; } case SDNA_TYPE_UINT64: { @@ -813,7 +816,7 @@ static void cast_primitive_type(const eSDNA_Type old_type, case SDNA_TYPE_INT8: { const int8_t value = *((int8_t *)old_data); old_value_i = (uint64_t)value; - old_value_f = (double)old_value_i; + old_value_f = (double)(int64_t)old_value_i; } } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs