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