What&#39;s the design rationale of supporting arrays of group properties? &nbsp;Seems supporting arrays of id properties in general would be a cleaner solution, if it&#39;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">&lt;<a href="mailto:brecht@blender.org">brecht@blender.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Revision: 18086<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&amp;root=bf-blender&amp;revision=18086" target="_blank">http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&amp;root=bf-blender&amp;revision=18086</a><br>

Author: &nbsp; blendix<br>
Date: &nbsp; &nbsp; 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>
 &nbsp;but with the restriction that they must point to other type derived from<br>
 &nbsp;ID property groups. The &quot;add&quot; function for these properties will allocate<br>
 &nbsp;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 &quot;OperatorMousePath&quot; type is defined<br>
in rna_wm.c and has a float[2] property named &quot;loc&quot;.<br>
<br>
<br>
Defining the operator property:<br>
<br>
prop= RNA_def_property(ot-&gt;srna, &quot;path&quot;, PROP_COLLECTION, PROP_NONE);<br>
RNA_def_property_struct_runtime(prop, &amp;RNA_OperatorMousePath);<br>
<br>
<br>
Adding values:<br>
<br>
PointerRNA itemptr;<br>
float loc[2] = {1, 1},<br>
<br>
RNA_collection_add(op-&gt;ptr, &quot;path&quot;, &amp;itemptr);<br>
RNA_float_set_array(&amp;itemptr, &quot;loc&quot;, loc);<br>
<br>
<br>
Iterating:<br>
<br>
RNA_BEGIN(op-&gt;ptr, itemptr, &quot;path&quot;) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;float loc[2];<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;RNA_float_get_array(&amp;itemptr, &quot;loc&quot;, loc);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;Location: %f %f\n&quot;, loc[0], loc[1]);<br>
}<br>
RNA_END;<br>
<br>
Modified Paths:<br>
--------------<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/makesrna/RNA_access.h<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/makesrna/RNA_define.h<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/makesrna/RNA_types.h<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/makesrna/intern/rna_ID.c<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/makesrna/intern/rna_define.c<br>
 &nbsp; &nbsp;branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal.h<br>
 &nbsp; &nbsp;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 &nbsp; &nbsp; &nbsp; 2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/idprop.c &nbsp; &nbsp; &nbsp; 2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -61,6 +61,34 @@<br>
<br>
&nbsp;/* ----------- Array Type ----------- */<br>
<br>
+static void idp_resize_group_array(IDProperty *prop, int newlen, void *newarr)<br>
+{<br>
+ &nbsp; &nbsp; &nbsp; if(prop-&gt;subtype != IDP_GROUP)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; if(newlen &gt;= prop-&gt;len) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* bigger */<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IDProperty **array= newarr;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IDPropertyTemplate val;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int a;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(a=prop-&gt;len; a&lt;newlen; a++) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val.i = 0; /* silence MSVC warning about uninitialized var when debugging */<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array[a]= IDP_New(IDP_GROUP, val, &quot;IDP_ResizeArray group&quot;);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; else {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* smaller */<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IDProperty **array= prop-&gt;data.pointer;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int a;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(a=newlen; a&lt;prop-&gt;len; a++) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IDP_FreeProperty(array[a]);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MEM_freeN(array[a]);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+}<br>
+<br>
&nbsp;/*this function works for strings too!*/<br>
&nbsp;void IDP_ResizeArray(IDProperty *prop, int newlen)<br>
&nbsp;{<br>
@@ -70,6 +98,7 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/*first check if the array buffer size has room*/<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/*if newlen is 200 chars less then totallen, reallocate anyway*/<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (newlen &lt;= prop-&gt;totallen &amp;&amp; prop-&gt;totallen - newlen &lt; 200) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idp_resize_group_array(prop, newlen, newarr);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prop-&gt;len = newlen;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
@@ -84,11 +113,17 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; */<br>
 &nbsp; &nbsp; &nbsp; &nbsp;newsize = (newsize &gt;&gt; 3) + (newsize &lt; 9 ? 3 : 6) + newsize;<br>
<br>
- &nbsp; &nbsp; &nbsp; newarr = MEM_callocN(idp_size_table[prop-&gt;type]*newsize, &quot;idproperty array resized&quot;);<br>
- &nbsp; &nbsp; &nbsp; /*newlen is bigger*/<br>
- &nbsp; &nbsp; &nbsp; if (newlen &gt;= prop-&gt;len) memcpy(newarr, prop-&gt;data.pointer, prop-&gt;len*idp_size_table[prop-&gt;type]);<br>
- &nbsp; &nbsp; &nbsp; /*newlen is smaller*/<br>
- &nbsp; &nbsp; &nbsp; else memcpy(newarr, prop-&gt;data.pointer, newlen*prop-&gt;len*idp_size_table[prop-&gt;type]);<br>
+ &nbsp; &nbsp; &nbsp; newarr = MEM_callocN(idp_size_table[prop-&gt;subtype]*newsize, &quot;idproperty array resized&quot;);<br>
+ &nbsp; &nbsp; &nbsp; if (newlen &gt;= prop-&gt;len) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* newlen is bigger*/<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; memcpy(newarr, prop-&gt;data.pointer, prop-&gt;len*idp_size_table[prop-&gt;subtype]);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idp_resize_group_array(prop, newlen, newarr);<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; else {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* newlen is smaller*/<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idp_resize_group_array(prop, newlen, newarr);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; memcpy(newarr, prop-&gt;data.pointer, newlen*prop-&gt;len*idp_size_table[prop-&gt;subtype]);<br>
+ &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;MEM_freeN(prop-&gt;data.pointer);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;prop-&gt;data.pointer = newarr;<br>
@@ -96,10 +131,12 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;prop-&gt;totallen = newsize;<br>
&nbsp;}<br>
<br>
- void IDP_FreeArray(IDProperty *prop)<br>
+void IDP_FreeArray(IDProperty *prop)<br>
&nbsp;{<br>
- &nbsp; &nbsp; &nbsp; if (prop-&gt;data.pointer)<br>
+ &nbsp; &nbsp; &nbsp; if (prop-&gt;data.pointer) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idp_resize_group_array(prop, 0, NULL);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MEM_freeN(prop-&gt;data.pointer);<br>
+ &nbsp; &nbsp; &nbsp; }<br>
&nbsp;}<br>
<br>
<br>
@@ -120,7 +157,17 @@<br>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;IDProperty *newp = idp_generic_copy(prop);<br>
<br>
- &nbsp; &nbsp; &nbsp; if (prop-&gt;data.pointer) newp-&gt;data.pointer = MEM_dupallocN(prop-&gt;data.pointer);<br>
+ &nbsp; &nbsp; &nbsp; if (prop-&gt;data.pointer) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newp-&gt;data.pointer = MEM_dupallocN(prop-&gt;data.pointer);<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(prop-&gt;type == IDP_GROUP) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IDProperty **array= newp-&gt;data.pointer;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int a;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(a=0; a&lt;prop-&gt;len; a++)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array[a]= IDP_CopyProperty(array[a]);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; }<br>
 &nbsp; &nbsp; &nbsp; &nbsp;newp-&gt;len = prop-&gt;len;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;newp-&gt;subtype = prop-&gt;subtype;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;newp-&gt;totallen = prop-&gt;totallen;<br>
@@ -381,11 +428,12 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case IDP_ARRAY:<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/*for now, we only support float and int and double arrays*/<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (val.array.type == IDP_FLOAT || val.array.type == IDP_INT || val.array.type == IDP_DOUBLE) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (val.array.type == IDP_FLOAT || val.array.type == IDP_INT || val.array.type == IDP_DOUBLE || val.array.type == IDP_GROUP) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prop = MEM_callocN(sizeof(IDProperty), &quot;IDProperty array&quot;);<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prop-&gt;len = prop-&gt;totallen = val.array.len;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prop-&gt;subtype = val.array.type;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;prop-&gt;data.pointer = MEM_callocN(idp_size_table[val.array.type]*val.array.len, &quot;id property array&quot;);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idp_resize_group_array(prop, val.array.len, prop-&gt;data.pointer);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prop-&gt;len = prop-&gt;totallen = val.array.len;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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 &nbsp; &nbsp; 2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c &nbsp; &nbsp; 2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -1345,11 +1345,12 @@<br>
<br>
&nbsp;/* ************ 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>
&nbsp;{<br>
+ &nbsp; &nbsp; &nbsp; IDProperty **array;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int i;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/*since we didn&#39;t save the extra buffer, set totallen to len.*/<br>
@@ -1357,26 +1358,33 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;prop-&gt;data.pointer = newdataadr(fd, prop-&gt;data.pointer);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (switch_endian) {<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (prop-&gt;subtype != IDP_DOUBLE) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(prop-&gt;subtype == IDP_GROUP) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; test_pointer_array(fd, prop-&gt;data.pointer);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array= prop-&gt;data.pointer;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(i=0; i&lt;prop-&gt;len; i++)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IDP_DirectLinkProperty(array[i], switch_endian, fd);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if(prop-&gt;subtype == IDP_DOUBLE) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (i=0; i&lt;prop-&gt;len; i++) {<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SWITCH_INT(((int*)prop-&gt;data.pointer)[i]);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SWITCH_LONGINT(((double*)prop-&gt;data.pointer)[i]);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (i=0; i&lt;prop-&gt;len; i++) {<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SWITCH_LONGINT(((double*)prop-&gt;data.pointer)[i]);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SWITCH_INT(((int*)prop-&gt;data.pointer)[i]);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
&nbsp;}<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>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/*since we didn&#39;t save the extra string buffer, set totallen to len.*/<br>
 &nbsp; &nbsp; &nbsp; &nbsp;prop-&gt;totallen = prop-&gt;len;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;prop-&gt;data.pointer = newdataadr(fd, prop-&gt;data.pointer);<br>
&nbsp;}<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>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ListBase *lb = &amp;prop-&gt;data.group;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;IDProperty *loop;<br>
@@ -1389,7 +1397,7 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
&nbsp;}<br>
<br>
-void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, void *fd)<br>
+void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)<br>
&nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;switch (prop-&gt;type) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case IDP_GROUP:<br>
@@ -1423,7 +1431,7 @@<br>
&nbsp;}<br>
<br>
&nbsp;/*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>
&nbsp;{<br>
&nbsp;}<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 &nbsp; &nbsp;2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c &nbsp; &nbsp;2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -390,6 +390,14 @@<br>
 &nbsp; &nbsp; &nbsp; &nbsp;/*REMEMBER to set totalen to len in the linking code!!*/<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (prop-&gt;data.pointer) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;writedata(wd, DATA, MEM_allocN_len(prop-&gt;data.pointer), prop-&gt;data.pointer);<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(prop-&gt;type == IDP_GROUP) {<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IDProperty **array= prop-&gt;data.pointer;<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int a;<br>
+<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(a=0; a&lt;prop-&gt;len; a++)<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IDP_WriteProperty(array[a], wd);<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
&nbsp;}<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 &nbsp; &nbsp;2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_access.h &nbsp; &nbsp;2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -50,7 +50,6 @@<br>
&nbsp;extern StructRNA RNA_CollisionSensor;<br>
&nbsp;extern StructRNA RNA_ColorSequence;<br>
&nbsp;extern StructRNA RNA_Constraint;<br>
-// ... constraint types...<br>
&nbsp;extern StructRNA RNA_Controller;<br>
&nbsp;extern StructRNA RNA_Curve;<br>
&nbsp;extern StructRNA RNA_CurveMap;<br>
@@ -119,6 +118,7 @@<br>
&nbsp;extern StructRNA RNA_NorController;<br>
&nbsp;extern StructRNA RNA_Object;<br>
&nbsp;extern StructRNA RNA_Operator;<br>
+extern StructRNA RNA_OperatorMousePath;<br>
&nbsp;extern StructRNA RNA_OperatorProperties;<br>
&nbsp;extern StructRNA RNA_OrController;<br>
&nbsp;extern StructRNA RNA_PackedFile;<br>
@@ -266,6 +266,11 @@<br>
&nbsp;int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr);<br>
&nbsp;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>
&nbsp;/* Path<br>
 &nbsp;*<br>
 &nbsp;* Experimental method to refer to structs and properties with a string,<br>
@@ -329,6 +334,25 @@<br>
&nbsp;int RNA_string_length(PointerRNA *ptr, const char *name);<br>
&nbsp;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>
+ &nbsp; &nbsp; &nbsp; { \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CollectionPropertyIterator rna_macro_iter; \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(RNA_collection_begin(sptr, propname, &amp;rna_macro_iter); rna_macro_iter.valid; RNA_property_collection_next(&amp;rna_macro_iter)) { \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PointerRNA itemptr= rna_macro_iter.ptr;<br>
+<br>
+#define RNA_END \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } \<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RNA_property_collection_end(&amp;rna_macro_iter); \<br>
+ &nbsp; &nbsp; &nbsp; }<br>
+<br>
&nbsp;/* check if the idproperty exists, for operators */<br>
&nbsp;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 &nbsp; &nbsp;2008-12-26 20:25:02 UTC (rev 18085)<br>
+++ branches/blender2.5/blender/source/blender/makesrna/RNA_define.h &nbsp; &nbsp;2008-12-26 20:38:52 UTC (rev 18086)<br>
@@ -69,6 +69,7 @@<br>
&nbsp;void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item);<br>
&nbsp;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>