Commit: 3d5585fac48ef5ccc7943b05fdb4189fe6e57f0a
Author: Sebastian Parborg
Date:   Thu Feb 21 12:30:47 2019 +1100
Branches: master
https://developer.blender.org/rB3d5585fac48ef5ccc7943b05fdb4189fe6e57f0a

Fix T61563: Info space prints matrices as flat tuple

Add support for printing multi-dimensional arrays.

===================================================================

M       source/blender/makesrna/intern/rna_access.c

===================================================================

diff --git a/source/blender/makesrna/intern/rna_access.c 
b/source/blender/makesrna/intern/rna_access.c
index 3081984a825..0bd6c5352b6 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -6316,6 +6316,92 @@ static const char *bool_as_py_string(const int var)
        return var ? "True" : "False";
 }
 
+static void *rna_array_as_string_alloc(int type, int len, PointerRNA *ptr, 
PropertyRNA *prop)
+{
+       void *buf_ret = NULL;
+       if (type == PROP_BOOLEAN) {
+               bool *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len,  
__func__);
+               RNA_property_boolean_get_array(ptr, prop, buf);
+       }
+       else if (type == PROP_INT) {
+               int *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len,  __func__);
+               RNA_property_int_get_array(ptr, prop, buf);
+       }
+       else if (type == PROP_FLOAT) {
+               float *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len,  
__func__);
+               RNA_property_float_get_array(ptr, prop, buf);
+       }
+       else {
+               BLI_assert(0);
+       }
+       return buf_ret;
+}
+
+static void rna_array_as_string_elem(
+        int type, void **buf_p, int len, DynStr *dynstr)
+{
+       /* This will print a comma seperated string of the array elements from
+        * buf start to len. We will add a comma if len == 1 to preserve 
tuples. */
+       const int end = len - 1;
+       if (type == PROP_BOOLEAN) {
+               bool *buf = *buf_p;
+               for (int i = 0; i < len; i++, buf++) {
+                       BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%s, " : 
"%s", bool_as_py_string(*buf));
+               }
+               *buf_p = buf;
+       }
+       else if (type == PROP_INT) {
+               int *buf = *buf_p;
+               for (int i = 0; i < len; i++, buf++) {
+                       BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%d, " : 
"%d", *buf);
+               }
+               *buf_p = buf;
+       }
+       else if (type == PROP_FLOAT) {
+               float *buf = *buf_p;
+               for (int i = 0; i < len; i++, buf++) {
+                       BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%g, " : 
"%g", *buf);
+               }
+               *buf_p = buf;
+       }
+       else {
+               BLI_assert(0);
+       }
+}
+
+static void rna_array_as_string_recursive(
+        int type, void **buf_p, int totdim, const int *dim_size, DynStr 
*dynstr)
+{
+       BLI_dynstr_append(dynstr, "(");
+       if (totdim > 1) {
+               totdim--;
+               const int end = dim_size[totdim] - 1;
+               for (int i = 0; i <= end; i++){
+                       rna_array_as_string_recursive(type, buf_p, totdim, 
dim_size, dynstr);
+                       if (i < end || !end) {
+                               BLI_dynstr_append(dynstr, ", ");
+                       }
+               }
+       }
+       else {
+               rna_array_as_string_elem(type, buf_p, dim_size[0], dynstr);
+       }
+       BLI_dynstr_append(dynstr, ")");
+}
+
+static void rna_array_as_string(int type, int len, PointerRNA *ptr, 
PropertyRNA *prop, DynStr *dynstr)
+{
+       void *buf = rna_array_as_string_alloc(type, len, ptr, prop);
+       void *temp_buf = buf;
+       int totdim, dim_size[RNA_MAX_ARRAY_DIMENSION];
+
+       totdim = RNA_property_array_dimension(ptr, prop, dim_size);
+
+       rna_array_as_string_recursive(type, &temp_buf, totdim, dim_size, 
dynstr);
+       BLI_assert(temp_buf == (char *)buf + MEM_allocN_len(buf));
+       MEM_freeN(buf);
+}
+
 char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop, 
int index, int max_prop_length)
 {
        int type = RNA_property_type(prop);
@@ -6324,7 +6410,6 @@ char *RNA_property_as_string(bContext *C, PointerRNA 
*ptr, PropertyRNA *prop, in
        DynStr *dynstr = BLI_dynstr_new();
        char *cstring;
 
-
        /* see if we can coerce into a python type - PropertyType */
        switch (type) {
                case PROP_BOOLEAN:
@@ -6336,20 +6421,7 @@ char *RNA_property_as_string(bContext *C, PointerRNA 
*ptr, PropertyRNA *prop, in
                                        BLI_dynstr_append(dynstr, 
bool_as_py_string(RNA_property_boolean_get_index(ptr, prop, index)));
                                }
                                else {
-                                       bool fixedbuf[RNA_MAX_ARRAY_LENGTH];
-                                       bool *buf = ARRAY_SIZE(fixedbuf) >= len 
? fixedbuf : MEM_mallocN(sizeof(*buf) * len,  __func__);
-
-                                       RNA_property_boolean_get_array(ptr, 
prop, buf);
-                                       BLI_dynstr_append(dynstr, "(");
-                                       for (int i = 0; i < len; i++) {
-                                               BLI_dynstr_appendf(dynstr, i ? 
", %s" : "%s", bool_as_py_string(buf[i]));
-                                       }
-                                       if (len == 1)
-                                               BLI_dynstr_append(dynstr, ","); 
 /* otherwise python wont see it as a tuple */
-                                       BLI_dynstr_append(dynstr, ")");
-                                       if (buf != fixedbuf) {
-                                               MEM_freeN(buf);
-                                       }
+                                       rna_array_as_string(type, len, ptr, 
prop, dynstr);
                                }
                        }
                        break;
@@ -6362,20 +6434,7 @@ char *RNA_property_as_string(bContext *C, PointerRNA 
*ptr, PropertyRNA *prop, in
                                        BLI_dynstr_appendf(dynstr, "%d", 
RNA_property_int_get_index(ptr, prop, index));
                                }
                                else {
-                                       int fixedbuf[RNA_MAX_ARRAY_LENGTH];
-                                       int *buf = ARRAY_SIZE(fixedbuf) >= len 
? fixedbuf : MEM_mallocN(sizeof(*buf) * len,  __func__);
-
-                                       RNA_property_int_get_array(ptr, prop, 
buf);
-                                       BLI_dynstr_append(dynstr, "(");
-                                       for (int i = 0; i < len; i++) {
-                                               BLI_dynstr_appendf(dynstr, i ? 
", %d" : "%d", buf[i]);
-                                       }
-                                       if (len == 1)
-                                               BLI_dynstr_append(dynstr, ","); 
 /* otherwise python wont see it as a tuple */
-                                       BLI_dynstr_append(dynstr, ")");
-                                       if (buf != fixedbuf) {
-                                               MEM_freeN(buf);
-                                       }
+                                       rna_array_as_string(type, len, ptr, 
prop, dynstr);
                                }
                        }
                        break;
@@ -6388,20 +6447,7 @@ char *RNA_property_as_string(bContext *C, PointerRNA 
*ptr, PropertyRNA *prop, in
                                        BLI_dynstr_appendf(dynstr, "%g", 
RNA_property_float_get_index(ptr, prop, index));
                                }
                                else {
-                                       float fixedbuf[RNA_MAX_ARRAY_LENGTH];
-                                       float *buf = ARRAY_SIZE(fixedbuf) >= 
len ? fixedbuf : MEM_mallocN(sizeof(*buf) * len,  __func__);
-
-                                       RNA_property_float_get_array(ptr, prop, 
buf);
-                                       BLI_dynstr_append(dynstr, "(");
-                                       for (int i = 0; i < len; i++) {
-                                               BLI_dynstr_appendf(dynstr, i ? 
", %g" : "%g", buf[i]);
-                                       }
-                                       if (len == 1)
-                                               BLI_dynstr_append(dynstr, ","); 
 /* otherwise python wont see it as a tuple */
-                                       BLI_dynstr_append(dynstr, ")");
-                                       if (buf != fixedbuf) {
-                                               MEM_freeN(buf);
-                                       }
+                                       rna_array_as_string(type, len, ptr, 
prop, dynstr);
                                }
                        }
                        break;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to