Revision: 59531
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59531
Author:   mont29
Date:     2013-08-26 16:08:03 +0000 (Mon, 26 Aug 2013)
Log Message:
-----------
RNA fixes regarding dynamic array properties in functions parameters (reviewed 
by Brecht, thanks!):

* It was not clear that RNA_parameter_length_get() & co only affected dynamic 
properties, renamed them to RNA_parameter_dynamic_length_get() and such.

* Fixed RNA_function_find_parameter(), we can't use BLI_findstring() here, need 
to call RNA_property_identifier()!

* Fixed RNA_parameter_get() and RNA_parameter_set(), which were completely 
wrong for dynamic properties.

* Fixed RNA_parameter_dynamic_length_get/set_data(), they did not check the 
property was actually a dynamic one and were using again ugly blackmagic 
casting intead of ParameterDynAlloc structure!

* makesrna was still using an ugly hackish (and perhaps not always working) 
code when handling dynamic parameters, now synchronized with 
RNA_parameter_dynamic_length_get_data and RNA_parameter_get code.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/intern/makesrna.c
    trunk/blender/source/blender/makesrna/intern/rna_access.c

Modified: trunk/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_access.h  2013-08-26 15:43:34 UTC 
(rev 59530)
+++ trunk/blender/source/blender/makesrna/RNA_access.h  2013-08-26 16:08:03 UTC 
(rev 59531)
@@ -1073,10 +1073,11 @@
 void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, 
void **value);
 void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void 
*value);
 void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, 
const void *value);
-int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm);
-int RNA_parameter_length_get_data(ParameterList *parms, PropertyRNA *parm, 
void *data);
-void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int 
length);
-void RNA_parameter_length_set_data(ParameterList *parms, PropertyRNA *parm, 
void *data, int length);
+/* Only for PROP_DYNAMIC properties! */
+int RNA_parameter_dynamic_length_get(ParameterList *parms, PropertyRNA *parm);
+int RNA_parameter_dynamic_length_get_data(ParameterList *parms, PropertyRNA 
*parm, void *data);
+void RNA_parameter_dynamic_length_set(ParameterList *parms, PropertyRNA *parm, 
int length);
+void RNA_parameter_dynamic_length_set_data(ParameterList *parms, PropertyRNA 
*parm, void *data, int length);
 
 int RNA_function_call(struct bContext *C, struct ReportList *reports, 
PointerRNA *ptr,
                       FunctionRNA *func, ParameterList *parms);

Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c     2013-08-26 
15:43:34 UTC (rev 59530)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c     2013-08-26 
16:08:03 UTC (rev 59531)
@@ -2273,11 +2273,12 @@
                                valstr = "*";
                        }
 
-                       /* this must be kept in sync with 
RNA_parameter_length_get_data,
+                       /* this must be kept in sync with 
RNA_parameter_dynamic_length_get_data and RNA_parameter_get,
                         * we could just call the function directly, but this 
is faster */
                        if (flag & PROP_DYNAMIC) {
-                               fprintf(f, "\t%s_len = %s((int *)_data);\n", 
dparm->prop->identifier, pout ? "" : "*");
-                               data_str = "(&(((char *)_data)[sizeof(void 
*)]))";
+                               fprintf(f, "\t%s_len = %s((ParameterDynAlloc 
*)_data)->array_tot;\n", dparm->prop->identifier,
+                                                                               
                      pout ? "(int *)&" : "(int)");
+                               data_str = "(&(((ParameterDynAlloc 
*)_data)->array))";
                        }
                        else {
                                data_str = "_data";

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c   2013-08-26 
15:43:34 UTC (rev 59530)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c   2013-08-26 
16:08:03 UTC (rev 59531)
@@ -5357,7 +5357,14 @@
 
 PropertyRNA *RNA_function_find_parameter(PointerRNA *UNUSED(ptr), FunctionRNA 
*func, const char *identifier)
 {
-       return BLI_findstring(&func->cont.properties, identifier, 
offsetof(PropertyRNA, identifier));
+       PropertyRNA *parm;
+
+       parm = func->cont.properties.first;
+       for (; parm; parm = parm->next)
+               if (strcmp(RNA_property_identifier(parm), identifier) == 0)
+                       break;
+
+       return parm;
 }
 
 const ListBase *RNA_function_defined_parameters(FunctionRNA *func)
@@ -5529,10 +5536,19 @@
                if (iter.parm == parm)
                        break;
 
-       if (iter.valid)
-               *value = iter.data;
-       else
+       if (iter.valid) {
+               if (parm->flag & PROP_DYNAMIC) {
+                       /* for dynamic arrays and strings, data is a pointer to 
an array */
+                       ParameterDynAlloc *data_alloc = iter.data;
+                       *value = data_alloc->array;
+               }
+               else {
+                       *value = iter.data;
+               }
+       }
+       else {
                *value = NULL;
+       }
 
        RNA_parameter_list_end(&iter);
 }
@@ -5560,8 +5576,35 @@
                if (iter.parm == parm)
                        break;
 
-       if (iter.valid)
-               memcpy(iter.data, value, iter.size);
+       if (iter.valid) {
+               if (parm->flag & PROP_DYNAMIC) {
+                       /* for dynamic arrays and strings, data is a pointer to 
an array */
+                       ParameterDynAlloc *data_alloc = iter.data;
+                       size_t size = 0;
+                       switch (parm->type) {
+                               case PROP_STRING:
+                                       size = sizeof(char);
+                                       break;
+                               case PROP_INT:
+                               case PROP_BOOLEAN:
+                                       size = sizeof(int);
+                                       break;
+                               case PROP_FLOAT:
+                                       size = sizeof(float);
+                                       break;
+                               default:
+                                       break;
+                       }
+                       size *= data_alloc->array_tot;
+                       if (data_alloc->array)
+                               MEM_freeN(data_alloc->array);
+                       data_alloc->array = MEM_mallocN(size, AT);
+                       memcpy(data_alloc->array, value, size);
+               }
+               else {
+                       memcpy(iter.data, value, iter.size);
+               }
+       }
 
        RNA_parameter_list_end(&iter);
 }
@@ -5579,7 +5622,7 @@
                RNA_parameter_set(parms, parm, value);
 }
 
-int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm)
+int RNA_parameter_dynamic_length_get(ParameterList *parms, PropertyRNA *parm)
 {
        ParameterIterator iter;
        int len = 0;
@@ -5591,14 +5634,14 @@
                        break;
 
        if (iter.valid)
-               len = RNA_parameter_length_get_data(parms, parm, iter.data);
+               len = RNA_parameter_dynamic_length_get_data(parms, parm, 
iter.data);
 
        RNA_parameter_list_end(&iter);
 
        return len;
 }
 
-void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int 
length)
+void RNA_parameter_dynamic_length_set(ParameterList *parms, PropertyRNA *parm, 
int length)
 {
        ParameterIterator iter;
 
@@ -5609,19 +5652,24 @@
                        break;
 
        if (iter.valid)
-               RNA_parameter_length_set_data(parms, parm, iter.data, length);
+               RNA_parameter_dynamic_length_set_data(parms, parm, iter.data, 
length);
 
        RNA_parameter_list_end(&iter);
 }
 
-int RNA_parameter_length_get_data(ParameterList *UNUSED(parms), PropertyRNA 
*UNUSED(parm), void *data)
+int RNA_parameter_dynamic_length_get_data(ParameterList *UNUSED(parms), 
PropertyRNA *parm, void *data)
 {
-       return *((int *)((char *)data));
+       if (parm->flag & PROP_DYNAMIC) {
+               return (int)((ParameterDynAlloc *)data)->array_tot;
+       }
+       return 0;
 }
 
-void RNA_parameter_length_set_data(ParameterList *UNUSED(parms), PropertyRNA 
*UNUSED(parm), void *data, int length)
+void RNA_parameter_dynamic_length_set_data(ParameterList *UNUSED(parms), 
PropertyRNA *parm, void *data, int length)
 {
-       *((int *)data) = length;
+       if (parm->flag & PROP_DYNAMIC) {
+               ((ParameterDynAlloc *)data)->array_tot = (intptr_t)length;
+       }
 }
 
 int RNA_function_call(bContext *C, ReportList *reports, PointerRNA *ptr, 
FunctionRNA *func, ParameterList *parms)

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

Reply via email to