What's the design rationale of supporting arrays of group properties? Seems supporting arrays of id properties in general would be a cleaner solution, if it's needed. . .<div><br></div><div>Joe<br><br><div class="gmail_quote">
On Fri, Dec 26, 2008 at 1:38 PM, Brecht Van Lommel <span dir="ltr"><<a href="mailto:brecht@blender.org">brecht@blender.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Revision: 18086<br>
<a href="http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18086" target="_blank">http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18086</a><br>
Author: blendix<br>
Date: 2008-12-26 21:38:52 +0100 (Fri, 26 Dec 2008)<br>
<br>
Log Message:<br>
-----------<br>
RNA:<br>
* Added support for using pointers + collections as operator properties,<br>
but with the restriction that they must point to other type derived from<br>
ID property groups. The "add" function for these properties will allocate<br>
a new ID property group and point to that.<br>
* Added support for arrays with type IDP_GROUP in ID properties.<br>
* Fix bug getting/setting float array values.<br>
<br>
Example code for collections, note the "OperatorMousePath" type is defined<br>
in rna_wm.c and has a float[2] property named "loc".<br>
<br>
<br>
Defining the operator property:<br>
<br>
prop= RNA_def_property(ot->srna, "path", PROP_COLLECTION, PROP_NONE);<br>
RNA_def_property_struct_runtime(prop, &RNA_OperatorMousePath);<br>
<br>
<br>
Adding values:<br>
<br>
PointerRNA itemptr;<br>
float loc[2] = {1, 1},<br>
<br>
RNA_collection_add(op->ptr, "path", &itemptr);<br>
RNA_float_set_array(&itemptr, "loc", loc);<br>
<br>
<br>
Iterating:<br>
<br>
RNA_BEGIN(op->ptr, itemptr, "path") {<br>
float loc[2];<br>
<br>
RNA_float_get_array(&itemptr, "loc", loc);<br>
printf("Location: %f %f\n", loc[0], loc[1]);<br>
}<br>
RNA_END;<br>
<br>
Modified Paths:<br>
--------------<br>
branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c<br>
branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c<br>
branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c<br>
branches/blender2.5/blender/source/blender/makesrna/RNA_access.h<br>
branches/blender2.5/blender/source/blender/makesrna/RNA_define.h<br>
branches/blender2.5/blender/source/blender/makesrna/RNA_types.h<br>
branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c<br>
branches/blender2.5/blender/source/blender/makesrna/intern/rna_ID.c<br>
branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c<br>
branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c<br>
branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal.h<br>
branches/blender2.5/blender/source/blender/makesrna/intern/rna_wm.c<br>
<br>
Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c<br>
===================================================================<br>
--- branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c 2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c 2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -61,6 +61,34 @@<br>
<br>
/* ----------- Array Type ----------- */<br>
<br>
+static void idp_resize_group_array(IDProperty *prop, int newlen, void *newarr)<br>
+{<br>
+ if(prop->subtype != IDP_GROUP)<br>
+ return;<br>
+<br>
+ if(newlen >= prop->len) {<br>
+ /* bigger */<br>
+ IDProperty **array= newarr;<br>
+ IDPropertyTemplate val;<br>
+ int a;<br>
+<br>
+ for(a=prop->len; a<newlen; a++) {<br>
+ val.i = 0; /* silence MSVC warning about uninitialized var when debugging */<br>
+ array[a]= IDP_New(IDP_GROUP, val, "IDP_ResizeArray group");<br>
+ }<br>
+ }<br>
+ else {<br>
+ /* smaller */<br>
+ IDProperty **array= prop->data.pointer;<br>
+ int a;<br>
+<br>
+ for(a=newlen; a<prop->len; a++) {<br>
+ IDP_FreeProperty(array[a]);<br>
+ MEM_freeN(array[a]);<br>
+ }<br>
+ }<br>
+}<br>
+<br>
/*this function works for strings too!*/<br>
void IDP_ResizeArray(IDProperty *prop, int newlen)<br>
{<br>
@@ -70,6 +98,7 @@<br>
/*first check if the array buffer size has room*/<br>
/*if newlen is 200 chars less then totallen, reallocate anyway*/<br>
if (newlen <= prop->totallen && prop->totallen - newlen < 200) {<br>
+ idp_resize_group_array(prop, newlen, newarr);<br>
prop->len = newlen;<br>
return;<br>
}<br>
@@ -84,11 +113,17 @@<br>
*/<br>
newsize = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize;<br>
<br>
- newarr = MEM_callocN(idp_size_table[prop->type]*newsize, "idproperty array resized");<br>
- /*newlen is bigger*/<br>
- if (newlen >= prop->len) memcpy(newarr, prop->data.pointer, prop->len*idp_size_table[prop->type]);<br>
- /*newlen is smaller*/<br>
- else memcpy(newarr, prop->data.pointer, newlen*prop->len*idp_size_table[prop->type]);<br>
+ newarr = MEM_callocN(idp_size_table[prop->subtype]*newsize, "idproperty array resized");<br>
+ if (newlen >= prop->len) {<br>
+ /* newlen is bigger*/<br>
+ memcpy(newarr, prop->data.pointer, prop->len*idp_size_table[prop->subtype]);<br>
+ idp_resize_group_array(prop, newlen, newarr);<br>
+ }<br>
+ else {<br>
+ /* newlen is smaller*/<br>
+ idp_resize_group_array(prop, newlen, newarr);<br>
+ memcpy(newarr, prop->data.pointer, newlen*prop->len*idp_size_table[prop->subtype]);<br>
+ }<br>
<br>
MEM_freeN(prop->data.pointer);<br>
prop->data.pointer = newarr;<br>
@@ -96,10 +131,12 @@<br>
prop->totallen = newsize;<br>
}<br>
<br>
- void IDP_FreeArray(IDProperty *prop)<br>
+void IDP_FreeArray(IDProperty *prop)<br>
{<br>
- if (prop->data.pointer)<br>
+ if (prop->data.pointer) {<br>
+ idp_resize_group_array(prop, 0, NULL);<br>
MEM_freeN(prop->data.pointer);<br>
+ }<br>
}<br>
<br>
<br>
@@ -120,7 +157,17 @@<br>
{<br>
IDProperty *newp = idp_generic_copy(prop);<br>
<br>
- if (prop->data.pointer) newp->data.pointer = MEM_dupallocN(prop->data.pointer);<br>
+ if (prop->data.pointer) {<br>
+ newp->data.pointer = MEM_dupallocN(prop->data.pointer);<br>
+<br>
+ if(prop->type == IDP_GROUP) {<br>
+ IDProperty **array= newp->data.pointer;<br>
+ int a;<br>
+<br>
+ for(a=0; a<prop->len; a++)<br>
+ array[a]= IDP_CopyProperty(array[a]);<br>
+ }<br>
+ }<br>
newp->len = prop->len;<br>
newp->subtype = prop->subtype;<br>
newp->totallen = prop->totallen;<br>
@@ -381,11 +428,12 @@<br>
case IDP_ARRAY:<br>
{<br>
/*for now, we only support float and int and double arrays*/<br>
- if (val.array.type == IDP_FLOAT || val.array.type == IDP_INT || val.array.type == IDP_DOUBLE) {<br>
+ if (val.array.type == IDP_FLOAT || val.array.type == IDP_INT || val.array.type == IDP_DOUBLE || val.array.type == IDP_GROUP) {<br>
prop = MEM_callocN(sizeof(IDProperty), "IDProperty array");<br>
- prop->len = prop->totallen = val.array.len;<br>
prop->subtype = val.array.type;<br>
prop->data.pointer = MEM_callocN(idp_size_table[val.array.type]*val.array.len, "id property array");<br>
+ idp_resize_group_array(prop, val.array.len, prop->data.pointer);<br>
+ prop->len = prop->totallen = val.array.len;<br>
break;<br>
} else {<br>
return NULL;<br>
<br>
Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c<br>
===================================================================<br>
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c 2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c 2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -1345,11 +1345,12 @@<br>
<br>
/* ************ READ ID Properties *************** */<br>
<br>
-void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, void *fd);<br>
-void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, void *fd);<br>
+void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);<br>
+void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);<br>
<br>
-static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, void *fd)<br>
+static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, FileData *fd)<br>
{<br>
+ IDProperty **array;<br>
int i;<br>
<br>
/*since we didn't save the extra buffer, set totallen to len.*/<br>
@@ -1357,26 +1358,33 @@<br>
prop->data.pointer = newdataadr(fd, prop->data.pointer);<br>
<br>
if (switch_endian) {<br>
- if (prop->subtype != IDP_DOUBLE) {<br>
+ if(prop->subtype == IDP_GROUP) {<br>
+ test_pointer_array(fd, prop->data.pointer);<br>
+ array= prop->data.pointer;<br>
+<br>
+ for(i=0; i<prop->len; i++)<br>
+ IDP_DirectLinkProperty(array[i], switch_endian, fd);<br>
+ }<br>
+ else if(prop->subtype == IDP_DOUBLE) {<br>
for (i=0; i<prop->len; i++) {<br>
- SWITCH_INT(((int*)prop->data.pointer)[i]);<br>
+ SWITCH_LONGINT(((double*)prop->data.pointer)[i]);<br>
}<br>
} else {<br>
for (i=0; i<prop->len; i++) {<br>
- SWITCH_LONGINT(((double*)prop->data.pointer)[i]);<br>
+ SWITCH_INT(((int*)prop->data.pointer)[i]);<br>
}<br>
}<br>
}<br>
}<br>
<br>
-static void IDP_DirectLinkString(IDProperty *prop, int switch_endian, void *fd)<br>
+static void IDP_DirectLinkString(IDProperty *prop, int switch_endian, FileData *fd)<br>
{<br>
/*since we didn't save the extra string buffer, set totallen to len.*/<br>
prop->totallen = prop->len;<br>
prop->data.pointer = newdataadr(fd, prop->data.pointer);<br>
}<br>
<br>
-static void IDP_DirectLinkGroup(IDProperty *prop, int switch_endian, void *fd)<br>
+static void IDP_DirectLinkGroup(IDProperty *prop, int switch_endian, FileData *fd)<br>
{<br>
ListBase *lb = &prop->data.group;<br>
IDProperty *loop;<br>
@@ -1389,7 +1397,7 @@<br>
}<br>
}<br>
<br>
-void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, void *fd)<br>
+void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)<br>
{<br>
switch (prop->type) {<br>
case IDP_GROUP:<br>
@@ -1423,7 +1431,7 @@<br>
}<br>
<br>
/*stub function*/<br>
-void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, void *fd)<br>
+void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)<br>
{<br>
}<br>
<br>
<br>
Modified: branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c<br>
===================================================================<br>
--- branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c 2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c 2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -390,6 +390,14 @@<br>
/*REMEMBER to set totalen to len in the linking code!!*/<br>
if (prop->data.pointer) {<br>
writedata(wd, DATA, MEM_allocN_len(prop->data.pointer), prop->data.pointer);<br>
+<br>
+ if(prop->type == IDP_GROUP) {<br>
+ IDProperty **array= prop->data.pointer;<br>
+ int a;<br>
+<br>
+ for(a=0; a<prop->len; a++)<br>
+ IDP_WriteProperty(array[a], wd);<br>
+ }<br>
}<br>
}<br>
<br>
<br>
Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_access.h<br>
===================================================================<br>
--- branches/blender2.5/blender/source/blender/makesrna/RNA_access.h 2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_access.h 2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -50,7 +50,6 @@<br>
extern StructRNA RNA_CollisionSensor;<br>
extern StructRNA RNA_ColorSequence;<br>
extern StructRNA RNA_Constraint;<br>
-// ... constraint types...<br>
extern StructRNA RNA_Controller;<br>
extern StructRNA RNA_Curve;<br>
extern StructRNA RNA_CurveMap;<br>
@@ -119,6 +118,7 @@<br>
extern StructRNA RNA_NorController;<br>
extern StructRNA RNA_Object;<br>
extern StructRNA RNA_Operator;<br>
+extern StructRNA RNA_OperatorMousePath;<br>
extern StructRNA RNA_OperatorProperties;<br>
extern StructRNA RNA_OrController;<br>
extern StructRNA RNA_PackedFile;<br>
@@ -266,6 +266,11 @@<br>
int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr);<br>
int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr);<br>
<br>
+/* to create ID property groups */<br>
+void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop);<br>
+void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr);<br>
+void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop);<br>
+<br>
/* Path<br>
*<br>
* Experimental method to refer to structs and properties with a string,<br>
@@ -329,6 +334,25 @@<br>
int RNA_string_length(PointerRNA *ptr, const char *name);<br>
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value);<br>
<br>
+void RNA_pointer_get(PointerRNA *ptr, const char *name, PointerRNA *r_value);<br>
+void RNA_pointer_add(PointerRNA *ptr, const char *name);<br>
+<br>
+void RNA_collection_begin(PointerRNA *ptr, const char *name, CollectionPropertyIterator *iter);<br>
+int RNA_collection_length(PointerRNA *ptr, const char *name);<br>
+void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value);<br>
+void RNA_collection_clear(PointerRNA *ptr, const char *name);<br>
+<br>
+#define RNA_BEGIN(sptr, itemptr, propname) \<br>
+ { \<br>
+ CollectionPropertyIterator rna_macro_iter; \<br>
+ for(RNA_collection_begin(sptr, propname, &rna_macro_iter); rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) { \<br>
+ PointerRNA itemptr= rna_macro_iter.ptr;<br>
+<br>
+#define RNA_END \<br>
+ } \<br>
+ RNA_property_collection_end(&rna_macro_iter); \<br>
+ }<br>
+<br>
/* check if the idproperty exists, for operators */<br>
int RNA_property_is_set(PointerRNA *ptr, const char *name);<br>
<br>
<br>
Modified: branches/blender2.5/blender/source/blender/makesrna/RNA_define.h<br>
===================================================================<br>
--- branches/blender2.5/blender/source/blender/makesrna/RNA_define.h 2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_define.h 2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -69,6 +69,7 @@<br>
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item);<br>
void RNA_def_property_string_maxlength(PropertyRNA *prop, int maxlength);<br>
<br>
@@ Diff output truncated at 10240 characters. @@<br>
<br>
_______________________________________________<br>
Bf-blender-cvs mailing list<br>
<a href="mailto:Bf-blender-cvs@blender.org">Bf-blender-cvs@blender.org</a><br>
<a href="http://lists.blender.org/mailman/listinfo/bf-blender-cvs" target="_blank">http://lists.blender.org/mailman/listinfo/bf-blender-cvs</a><br>
</blockquote></div><br></div>